2018-04-24 《鸟哥的Linux私房菜 基础学习篇(第四版)》 第19章 开机流程模块管理与Loader_2 笔记
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2018-04-24 《鸟哥的Linux私房菜 基础学习篇(第四版)》 第19章 开机流程模块管理与Loader_2 笔记相关的知识,希望对你有一定的参考价值。
第二节开始
核心 (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] 由使用者自行加载一个完整文件名的模块, 并不会主动的分析模块相依性。要自行找到模块的完整文件名
[[email protected] ~]# 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 笔记的主要内容,如果未能解决你的问题,请参考以下文章