码迷,mamicode.com
首页 > 系统相关 > 详细

2018-04-24 《鸟哥的Linux私房菜 基础学习篇(第四版)》 第19章 开机流程、模块管理与Loader_2 笔记

时间:2018-05-09 19:33:32      阅读:325      评论:0      收藏:0      [点我收藏+]

标签:ash   etc   代码执行   磁盘   数据   file   参数   shell   ota   

第二节开始
核心 (kernel)。是压缩文件,在使用核心之前,就得要将他解压缩后,才能加载主存储器当中。

核心与核心模块所处的目录:
? 核心: /boot/vmlinuz 或 /boot/vmlinuz-version。
? 核心解压缩所需 RAM Disk: /boot/initramfs (/boot/initramfs-version)。
? 核心模块: /lib/modules/version/kernel 或 /lib/modules/$(uname -r)/kernel。
/lib/modules/$(uname -r)/modules.dep文件记录了在核心支持的模块的各项相依性,modules.dep文件会检查kernel目录中包含以下文件夹的相依性:
    arch :与硬件平台有关的项目,例如 CPU 的等级等等;
    crypto :核心所支持的加密的技术,例如 md5 或者是 des 等等;
    drivers :一些硬件的驱动程序,例如显示适配器、网络卡、PCI 相关硬件等等;
    fs :核心所支持的 filesystems ,例如 vfat, reiserfs, nfs 等等;
    lib :一些函式库;
    net :与网络有关的各项协议数据,还有防火墙模块 (net/ipv4/netfilter/*) 等等;
    sound :与音效有关的各项模块;
? 核心原始码: /usr/src/linux 或 /usr/src/kernels/ (要安装才会有,预设不安装)
? 核心模块的额外参数设定:/etc/modprobe.d/*conf

如果该核心被顺利的加载系统当中了,那么就会有几个信息纪录下来:
? 核心版本: /proc/version
? 系统核心功能: /proc/sys/kernel/



命令
#depmod [-Ane]    建立/lib/modules/$(uname -r)/modules.dep文件
选项与参数:
不加任何参数时, depmod 会主动的去分析目前核心的模块,并且重新写入/lib/modules/$(uname -r)/modules.dep 当中。
-A:若加入 -A 参数时,则 depmod会去搜寻比 modules.dep 内还要新的模块,如果真找到新模块,才会更新。
-n :不写入 modules.dep ,而是将结果输出到屏幕上(standard out);
-e :显示出目前已加载的不可执行的模块名称

#lsmod    展示linux核心的模块状态。
数据格式为:模块名称(Module)        模块的大小(size)    此模块是否被其他模块所使用 (Used by)

#modinfo [-adln] [module_name|filename]    查阅在核心内的模块,检查“某个模块文件”
选项与参数:
-a :仅列出作者名称;
-d :仅列出该 modules 的说明 (description);
-l :仅列出授权 (license);
-n :仅列出该模块的详细路径。

#insmod [/full/path/module_name] [parameters]    由使用者自行加载一个完整文件名的模块, 并不会主动的分析模块相依性。要自行找到模块的完整文件名
[root@study ~]# insmod /lib/modules/$(uname -r)/kernel/fs/fat/fat.ko    #载入 cifs.ko 这个『文件系统』模块

#rmmod [-fw] module_name        移除模块。要自行找到模块的完整文件名
选项与参数:
-f:强制将该模块移除掉,不论是否正被使用;

#modprobe [-cfr] module_name    加载模块。不需要知道完整的模块文件名,也克服了模块的相依性问题
选项与参数:
-c :列出目前系统所有的模块!(更详细的代号对应表)
-f :强制加载该模块;
-r :类似 rmmod ,就是移除某个模块



boot loader 的程序代码执行与设定值加载分成两个阶段 (stage)来执行:
?Stage 1:执行 boot loader 主程序。主程序必须要被安装在开机区,亦即是 MBR 或者是 boot sector 。由于MBR 是整个硬盘的第一个 sector 内的一个区块,充其量整个大小也才 446 bytes 而已,因为MBR 或 boot sector 通常仅安装 boot loader 的最小主程序, 并没有安装 loader 的相关配置文件;
?Stage 2:主程序加载配置文件:
透过 boot loader 加载所有配置文件与相关的环境参数文件 (包括文件系统定义与主要配置文件grub.cfg), 一般来说,配置文件都在 /boot 下面。
    与 grub2 有关的配置文件都放置到/boot/grub2/ 目录下,boot/grub2/ 目录下最重要的就是配置文件 (grub2.cfg) 以及各种文件系统的定义! loader 读取了这种文件系统定义数据后,就能够认识文件系统并读取(加载)在该文件系统内的核心文件。
    grub2 的优点:
        ? 认识与支持较多的文件系统,并且可以使用 grub2 的主程序直接在文件系统中搜寻核心档名;
        ? 开机的时候,可以『自行编辑与修改开机设定项目』,类似 bash 的指令模式;
        ? 可以动态搜寻配置文件,而不需要在修改配置文件后重新安装 grub2 。亦即是我们只要修改完/boot/grub2/grub.cfg 里头的设定后,下次开机就生效了!
    grub2 对硬盘的识别:(hd0,1)
        ? 硬盘代号以小括号 ( ) 包起来;
        ? 硬盘以 hd 表示,后面会接一组数字;
        ? 以『搜寻顺序』做为硬盘的编号!(这个重要!)
        ? 第一个搜寻到的硬盘为 0 号,第二个为 1 号,以此类推。由于BIOS 可以调整磁盘的开机顺序,因此磁盘对应的 (hdN) 那个号码 N 是可能会变动的
        ? 每颗硬盘的第一个 partition 代号为 1 ,依序类推。
        所以说,整个硬盘代号为:
        硬盘搜寻顺序        在 Grub2 当中的代号
        第一颗(MBR)        (hd0) (hd0,msdos1) (hd0,msdos2) (hd0,msdos3)....
        第二颗(GPT)        (hd1) (hd1,gpt1) (hd1,gpt2) (hd1,gpt3)....
        第三颗            (hd2) (hd2,1) (hd2,2) (hd2,3)....
    /boot/grub2/grub.cfg文件实操不存在
        grub.cfg文件内容太过复杂,数据量非常庞大,grub2 官方说明不建议我们手动修改。我们可以通过以下文件、目录进行修改:
        /etc/default/grub 主要环境配置文件。
            文件中的内容:
            GRUB_TIMEOUT=5 # 指定预设倒数读秒的秒数
            GRUB_DEFAULT=saved # 指定预设由哪一个选单来开机,预设开机选单之意
            GRUB_DISABLE_SUBMENU=true # 是否要隐藏次选单,通常是藏起来的好!
            GRUB_TERMINAL_OUTPUT="console" # 指定数据输出的终端机格式,默认是透过文字终端机
            GRUB_CMDLINE_LINUX="rd.lvm.lv=centos/root rd.lvm.lv=centos/swap crashkernel=auto rhgb quiet" # 就是在 menuentry 括号内的 linux16 项目后续的核心参数
            GRUB_DISABLE_RECOVERY="true" # 取消救援选单的制作
        /etc/grub.d/ 目录内的相关配置文件。选单建置的脚本。目录下必有文件说明:
            ?00_header:主要在建立初始的显示项目,包括需要加载的模块分析、屏幕终端机的格式、倒数秒数、选单是否需要隐藏等等,大部分在 /etc/default/grub 里面所设定的变量,大概都会在这个脚本当中被利用来重建grub.cfg 。
            ?10_linux:根据分析 /boot 底下的文件,尝试找到正确的 linux 核心与读取这个核心需要的文件系统模块与参数等,都在这个脚本运作后找到并设定到 grub.cfg 当中。 因为这个脚本会将所有在 /boot 底下的每一个核心文件都对应到一个选单,因此核心文件数量越多,你的开机选单项目就越多了。 如果未来你不想要旧的核心出现在选单上,那可以透过移除旧核心来处理即可。
            ?30_os-prober:这个脚本默认会到系统上找其他的 partition 里面可能含有的操作系统,然后将该操作系统做成选单来处理就是了。 如果你不想要让其他的操作系统被侦测到并拿来开机,那可以在 /etc/default/grub 里面加上『 GRUB_DISABLE_OS_PROBER=true 』取消这个文件的运作。
            ?40_custom:如果你还有其他想要自己手动加上去的选单项目,或者是其他的需求,那么建议在这里补充即可!
                o直接指定核心开机
                o透过 chainloader 的方式移交 loader 控制权


initramfs
一般来说,各 distribution 提供的核心都会附上 initramfs 文件。
需要initramfs 的原因:核心模块放置于 /lib/modules/$(uname -r)/kernel/ 目录下, 但是这些核心模块要根目录 (/) 被挂载时才能够被读取。在核心本身不具备磁盘的驱动程序时,根目录是无法挂载的,驱动程序也就没有办法取得。造成两相矛盾的情况。未能明白整个流程???

initramfs工作原理:
    1、将 /lib/modules/目录下的“开机过程中一定需要的模块”包成一个文件名为initramfs的文件。
    2、在开机时,通过主机的 INT 13 硬件功能将该文件读出来和解压缩。
    3、initramfs文件在内存内仿真成为根目录,此时仿真的虚拟文件系统 (Initial RAM Disk) 包含硬盘模块 (如 usb, SCSI 等)与文件系统,因此核心kernel就能够认识实际的磁盘, 就能够进行实际根目录的挂载。

需要 initramfs 的时刻为:
    ? 根目录所在磁盘为 SATA、USB 或 SCSI 等连接接口;
    ? 根目录所在文件系统为 LVM, RAID 等特殊格式;
    ? 根目录所在文件系统为非传统 Linux 认识的文件系统时;
    ? 其他必须要在核心加载时提供的模块。


忘记 root 密码的解决之道
(1)按下 systemctl reboot 来重新启动
(2)进入到开机画面,在可以开机的选单上按下 e 来进入编辑模式, 然后就在 linux16 的那个核心项目上面加上rd.break参数来处理
3、按下 [crtl]+x 开始开机
4、开机完成后屏幕会出现如下的类似画面,此时请注意,你应该是在RAM Disk 的环境,并不是原本的环境, 因此根目录底下的东西跟你原本的系统无关喔!而且,你的系统应该会被挂载到 /sysroot 目录下,因此,你得要这样作:
Generating "/run/initramfs/rdsosreport.txt"
Enter emergency mode. Exit the shell to continue.
Type "journalctl" to view system logs.
You might want to save "/run/initramfs/rdsosreport.txt" to a USB stick or /boot
after mounting them and attach it to a bug report.
switch_root:/#                            # 无须输入密码即可取得 root 权限!
switch_root:/# mount                        # 检查一下挂载点!一定会发现 /sysroot 才是对的!
.....(前面省略).....
/dev/mapper/centos-root on /sysroot type xfs (ro,relatime,attr,inode64,noquota)
switch_root:/# mount -o remount,rw /sysroot        # mount为挂载命令,-o后接用“,”分隔开来的参数,remount:重新挂载,rw:可擦写,/sysroot为挂载点
switch_root:/# chroot /sysroot                    # 代表将根目录『暂时』切换到 chroot 之后所接的目录。因此,/sysroot将会被暂时作为根目录
sh-4.2# echo "your_root_new_pw" | passwd --stdin root    # 设置root帐号新密码为your_root_new_pw
sh-4.2# touch /.autorelabel                    # 让系统在开机的时候自动的使用默认的 SELinux type 重新写入 SELinux 安全本文到每个文件去。
sh-4.2# exit
switch_root:/# reboot

因文件系统错误而无法开机
最容易出错的设定而导致无法顺利开机的步骤,通常就是 /etc/fstab 这个文件,尤其是使用者在实作 Quota/LVM/RAID 时,最容易写错参数, 又没有经过 mount -a 来测试挂载,就立刻直接重新启动。
1、输入root密码进行救援
2、mount -o remount,rw / #输入命令将根目录挂载成可擦写
3、如果是扇区错乱的情况,输入fsck.ext3 或者xfs_repair 命令检查/dev/md0等分区。
3.1、出现『clear [Y/N]』时,输入『 y 』


命令
grub2-mkconfig -o /boot/grub2/grub.cfg    产生新的 grub.cfg 文件

dracut [-fv] [--add-drivers 列表] initramfs 檔名 核心版本        重制initramfs 文件
选项与参数:
-f :强迫编译出 initramfs ,如果 initramfs 文件已经存在,则覆盖掉旧文件
-v :显示 dracut 的运作过程
--add-drivers 列表:在原本的默认核心模块中,增加某些你想要的模块!模块位于核心所在目录/lib/modules/$(uname -r)/kernel/*
initramfs 檔名 :就是你需要的檔名!开头最好就是 initramfs,后面接版本与功能
核心版本 :预设当然是目前运作中的核心版本,不过你也可以手动输入其他不同版本!
其实 dracut 还有很多功能,例如底下的几个参数也可以参考看看:
--modules:将 dracut 所提供的开机所需模块 (核心核模块) 加载,可用模块/usr/lib/dracut/modules.d/目录内
--gzip|--bzip2|--xz:尝试使用哪一种压缩方式来进行 initramfs 压缩。预设使用 gzip!
--filesystems :加入某些额外的文件系统支持!

grub2-install [--boot-directory=DIR] INSTALL_DEVICE        安装 grub2
选项与参数:
--boot-directory=DIR 那个 DIR 为实际的目录,使用 grub2-install 预设会将grub2 所有的文件都复制到 /boot/grub2/* ,如果想要复制到其他目录与装置去,就得要用这个参数。
INSTALL_DEVICE 安装的装置代号啦!
实操报错:grub2-install:错误: /usr/lib/grub/x86_64-efi/modinfo.sh doesn‘t exist. Please specify --target or --directory.
19.3.5 测试与安装 grub2--没看懂

2018-04-24 《鸟哥的Linux私房菜 基础学习篇(第四版)》 第19章 开机流程、模块管理与Loader_2 笔记

标签:ash   etc   代码执行   磁盘   数据   file   参数   shell   ota   

原文地址:https://www.cnblogs.com/shoubituling/p/9015808.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!