系统管理和内核管理(二)之grub使用、编译安装内核
回顾CentOS 6启动流程:
POST –> Boot Sequence(BIOS) –> Boot Loader –> Kernel(ramdisk) –> rootfs–> switchroot–> /sbin/init–>(/etc/inittab, /etc/init/*.conf) –> 设定默认运行级别–> 系统初始化脚本rc.sysinit–> 关闭或启动对应级别的服务–> 启动终端
一、grub legacy:
1、配置文件:/boot/grub/grub.conf<–/etc/grub.conf
2、启动阶段:stage1: mbr
stage1_5::mbr之后的扇区,让stage1中的bootloader能识别stage2所在的分区上的文件系统
stage2:磁盘分区(/boot/grub/)
注:stage2及内核等通常放置于一个基本磁盘分区
3、grub菜单栏:
(1)提供启动菜单、并提供交互式接口
a:内核参数
e:编辑模式,用于编辑菜单
c:命令模式,交互式接口
(2)加载用户选择的内核或操作系统
允许传递参数给内核
可隐藏启动菜单
(3)为菜单提供了保护机制
为编辑启动菜单进行认证
为启用内核或操作系统进行认证
4、grub的命令行接口:
help: 获取帮助列表
help KEYWORD: 详细帮助信息
find (hd#,#)/PATH/TO/SOMEFILE:
root (hd#,#)
kernel /PATH/TO/KERNEL_FILE: 设定本次启动时用到的内核文件;额外还可添加许多内核支持使用的cmdline参数
例如:max_loop=100 selinux=0init=/path/to/init
initrd/PATH/TO/INITRAMFS_FILE: 设定为选定的内核提供额外文件的ramdisk
boot: 引导启动选定的内核
cat /proc/cmdline 内核参数
内核参数文档:/usr/share/doc/kernel-doc-2.6.32/Documentation/kernel-parameters.txt
5、识别硬盘设备:
(hd#,#)
hd#: 磁盘编号,用数字表示;从0开始编号
#: 分区编号,用数字表示; 从0开始编号
(hd0,0) 第一块硬盘,第一个分区
6、手动在grub命令行接口启动系统:
7、grub legacy配置文件:
default=#:设定默认启动的菜单项;落单项(title)编号从0开始
timeout=#:指定菜单项等待选项选择的时长
splashimage=(hd#,#) /PATH/TO/XPM_FILE:菜单背景图片文件路径
hiddenmenu:隐藏菜单
password [–md5] STRING: 启动菜单编辑认证
title TITLE:定义菜单项“标题”, 可出现多次
root (hd#,#):grub查找stage2及kernel文件所在设备分区;为grub“根”
kernel /PATH/TO/VMLINUZ_FILE [PARAMETERS]:启动的内核
initrd/PATH/TO/INITRAMFS_FILE:内核匹配的ramfs文件
password [–md5] STRING:启动选定的内核或操作系统时进行认证
8、grub的加密:
(1)grub-md5-crypt命令
(2)openssl passwd -1 命令
(3)openssl passwd -salt “XXXX” -1命令(指定掩码)
注:破解root口令,在启动系统时,到达grub界面,选择”a”进入,设置其运行级别1即可
9、进入单用户模式:
(1)编辑grub菜单(选定要编辑的title,而后使用e命令);
(2)在选定的kernel后附加1, s, S或single都可以;
(3)在kernel所在行,键入“b”命令
10、安装grub:
(1)grub-install(救援模式下或者远程登录终端上[前提是破坏掉grub后没将系统重启])
安装grub stage1和stage1_5到/dev/DISK磁盘上,并复制GRUB相关文件到DIR/boot目录下
命令:grub-install –root-directory=DIR /dev/DISK (用于救援模式下,需要指定系统所在的“根”)
注:此修复,在完成修复后需要手动编辑下配置文件grub.conf放到/boot/grub目录下。
(2)grub
grub> root (hd#,#)
grub> setup (hd#)
如下图,使用dd命令破坏mbr里面的bootloader一部分(此修复步骤需要依赖到/boot/grub目录下的文件stage1)
二、自制Linux系统:
(1)创建一级目录
步骤一:切记,新建个挂载目录必须是boot命名,否则到了执行安装grub时出错。
#mkdir /mnt/boot
#mount /dev/sdb1 /mnt/boot
#grub-install –directory=/mnt /dev/sdb 安装grub (安装完成后要记得在/mnt/boot/grub目录下编辑grub.conf配置文件)
步骤二:此处也建议新建的挂载目录以sda2命名,此处为自制Linux的“根”
#mkdir /mnt/sda2
#mount /dev/sdb2 /mnt/sda2
#mkdir-pv /mnt/sda2/{etc,lib,lib64,bin,sbin,tmp,var,usr,sys,proc,opt,home,root,boot,dev,mnt,media}
(2)复制bash和相关库文件
(3)复制相关命令及相关库文件:如:ls,cat,vim,reboot,hostname等
注:复制bash和相关的lib库文件可参照下图的脚本。
三:系统配置文件丢失修复:
系统在引导期间,很重要的一个过程就是init进程读取其配置文件/etc/inittab,启动系统基本服务程序及默认运行级别的服务程序完成系统引导,如果/etc/inittab误删除或修改错误,Linux将无法正常启动。此时,只有通过救援模式才可以解决此类问题。
(1)有备份文件的恢复方法:
进入救援模式,执行chroot命令后,如果有此文件的备份(强烈建议系统中的重要数据目录,如/etc、/boot等要进行备份),直接将备份文件拷贝回去,退出重启即可。如果是配置文件修改错误,如比较典型的/boot/grub/grub.conf及/etc/passwd的文件修改错误,也可以直接修正恢复。假设有备份文件/etc/inittab.bak,则在救援模式下执行:
sh-4.1# chroot /mnt/sysimage
sh-4.1# cp /etc/inittab.bak /etc/inittab
(2)没有备份文件的恢复办法
如果一些配置文件丢失或软件误删除,且无备份,可以通过重新安装软件包来恢复,首先查找到/etc/inittab属于哪一个RPM包
# chroot /mnt/sysimage
# rpm -qf `which mount`
util-linux-ng-2.17.2-12.24.el6.x86_64
退出chroot模式:# exit
挂载存放RPM包的安装光盘(在救援模式下,光盘通常挂载在/mnt/source目录下):# mount /dev/sr0 /mnt/source
CentOS6系统的RPM包存放在光盘Package目录下,要修复的硬盘系统的根目录在/mnt/sysimage下,需要使用–root选项指定其位置(–root=/mnt/sysimage)
然后覆盖安装/etc/inittab文件所在的RPM包:# rpm -ivh /mnt/source/Packages/mount-*.rpm –force|–replacepkgs(
其中的rpm命令选项“–replacepkgs”表示覆盖安装,执行完成后,即已经恢复了此文件)
如果想只提取RPM包中的某个文件进行恢复,可以在进入救援模式后,执行命令:
# rpm2cpio /mnt/source/Packages/ util-linux-ng-2.17.2-12.24.el6.x86_64.rpm| cpio -idv ./usr/bin/mount
# cp ./usr/bin/mount /mnt/sysimage//usr/bin/
注意:此命令执行时不能将文件直接恢复至/usr目录,只能提取到当前目录下,且恢复的文件名称所在路径要写完整的路径。提取文件成功后,将其复制到根分区所在的/mnt/sysimage目录下相应位置即可
四、内核编译:
1、前提:
(1)准备好开发环境,安装Development tools和Server Platform Development包组、ncurses
(2)获取目标主机上硬件设备的相关信息
(3)获取目标主机系统功能的相关信息;例如:需要启用相应的文件系统
(4)获取内核源代码包
www.kernel.org
2、内核组成部分:
Kernel:内核核心,一般为bzImage,通常在/boot目录下,名称为vmlinuz-VERSION-RELEASE;
kernel object(模块):内核对象,一般放置于:/lib/modules/VERSION-RELEASE/
[ ]: N 选择为空,意思是不编译到内核中
[M]: M 选择为M,意思是编译到模块中去
[*]: Y 选择为*,意思是编译到内核中去
注:编译参照当前系统的参数设置,执行命令#cp /boot/config-2.6.32-642.el6.x86_64 .config(变为隐藏文件,放到解压后内核文件的目录下,通过该配置文件来生成菜单让我们选择;建议对解压的内核文件目录做软链接,命令#ln -s linux-#-# linux;解压内核文件,建议解压到/usr/src目录下)
3、辅助文件:ramdisk
initrd
initramfs
ramdisk文件的制作:
(1)mkinitrd命令
为当前正在使用的内核重新制作ramdisk文件
#mkinitrd /boot/initramfs-`uname-r`.img `uname-r`
(2)dracut命令
为当前正在使用的内核重新制作ramdisk文件
#dracut /boot/initramfs-`uname-r`.img `uname-r`
4、编译步骤:
(1)安装开发包组
(2)下载源码文件
(3)执行编译:
.config:准备文本配置文件
make menuconfig:配置内核选项
make [-j #] 以多少线程执行编译(取决于机器的CPU颗数)
make modules_install:安装模块
make install :安装内核相关文件(安装bzImage为/boot/vmlinuz-VERSION-RELEASE;生成initramfs文件;编辑grub的配置文件)
在已经执行过编译操作的内核源码树做重新编译,需要事先清理操作:
# make clean:清理大多数编译生成的文件,但会保留config文件等
# make mrproper: 清理所有编译生成的文件、config及某些备份文件
# make distclean:mrproper、patches以及编辑器备份文件
5、配置内核选项:
(1)支持“更新”模式进行配置:make help
(a) make config:基于命令行以遍历的方式去配置内核中可配置的每个选项
(b) make menuconfig:基于curses的文本窗口界面
(c) make gconfig:基于GTK (GNOME)环境窗口界面
(d) make xconfig:基于QT(KDE)环境的窗口界面
(2)支持“全新配置”模式进行配置
(a) make defconfig:基于内核为目标平台提供的“默认”配置进行配置
(b) make allyesconfig: 所有选项均回答为“yes“
(c) make allnoconfig: 所有选项均回答为"no“
6、编译类别:
(1)全编译:make [-j #]
(2)编译内核的一部分功能:
(a) 只编译某子目录中的相关代码:# cd /usr/src/linux ;# make dir/
(b) 只编译一个特定的模块:# cd /usr/src/linux ;# make dir/file.ko
(3)交叉编译内核:编译的目标平台与当前平台不相同;
# make ARCH=arch_name
要获取特定目标平台的使用帮助:# make ARCH=arch_namehelp ;# make ARCH=arm help
五、内核模块管理:
1、lsmod命令:显示由核心已经装载的内核模块;显示的内容来自于: /proc/modules文件
2、modinfo命令:显示模块的详细描述信息
#modinfo [ -k kernel ] [ modulename|filename… ]
-n: 只显示模块文件路径
-p: 显示模块参数
-a: author
-d: description
-l: license
3、modprobe命令:装载或卸载内核模块
配置文件: /etc/modprobe.d/*.conf
注:如果有需要在系统启动时加载模块指定的参数,可在/etc/modprobe.d/目录下新建一个后缀为.conf的文件,并按照参数的格式填写即可。
4、depmod命令:内核模块依赖关系文件及系统信息映射文件的生成工具(注:该命令一般建议不要使用,会导致正常系统出现一定的故障)
5、insmod命令:指定模块文件,不自动解决依赖模块
6、rmmod命令:卸载指定模块
六、/proc目录:
内核把自己内部状态信息及统计信息,以及可配置参数通过proc伪文件系统加以输出
参数:只读:输出信息
可写:可接受用户指定“新值”来实现对内核某功能或特性的配置
1、/proc/sys
(1)sysctl命令用于查看或设定此目录中诸多参数
#sysctl -w path.to.parameter=VALUE
#sysctl -w kernel.hostname=mail.magedu.com
(2)echo命令通过重定向方式也可以修改大多数参数的值
#echo "VALUE" > /proc/sys/path/to/parameter
#echo “websrv” > /proc/sys/kernel/hostname
2、sysctl命令:
默认配置文件:/etc/sysctl.conf (注:上面两种命令修改参数,只能是临时修改,一旦系统重启就会丢失,如果需要永久生效则需要修改该配置文件)
(1)设置某参数:sysctl -w parameter=VALUE
(2)通过读取配置文件设置参数:sysctl -p [/path/to/conf_file]
(3)内核中的路由转发:/proc/sys/net/ipv4/ip_forward
(4)常用的几个参数:net.ipv4.ip_forward
net.ipv4.icmp_echo_ignore_all 禁止ping
vm.drop_caches 清除缓存
七、/sys目录:
sysfs:为用户使用的伪文件系统,输出内核识别出的各硬件设备的相关属性信息,也有内核对硬件特性的设定信息;有些参数是可以修改的,用于调整硬件工作特性。
udev通过此路径下输出的信息动态为各设备创建所需要设备文件,udev是运行用户空间程序
专用工具:udevadmin, hotplug
udev为设备创建设备文件时,会读取其事先定义好的规则文件,一般在/etc/udev/rules.d及/usr/lib/udev/rules.d目录下
事例演示:
1、破解root口令,并为grub设置保护功能
破解root密码:
(1)开机时,不断按下“↓”键,进入下图的界面:
(2)然后先按“e”键查看kernel和initrd等信息,再按“ESC”返回上一层界面,最后按“e”键进入下图的界面,在红色框位置输入数字1或者s、S、single等(注:输入的值与前面的“quiet”必须要有空格隔开)
(3)到此已经无需密码(以root的身份)进入了系统,使用命令#passwd即可修改密码(密码破解)
Grub设置保护:
(1)编辑/boot/grub/grub.conf配置文件,设置md5加密,格式:password –md5 $1$9wlPy$BqtKwoZjEpvSSn0XJmAHy/,共添加两处,在title前设置的md5加密是对全局的设置(即开机需要需要输入密码方可进入grub的功能菜单处选择);而在initrd后一行添加的md5加密是对对应的kernel启动做加密(需要输入密码方可让对应的系统启动)
(2)重启看设置效果:
测试全局加密:如下图,连续按两次“Enter”键,才进入到grub界面:
对比grub没有加密前,可以发现下图中红色框处的功能选择只剩下了“p”和“Enter”
再次按“Enter”键,到了输入全局grub的密码:
(3)测试对kernel加密的设置:(此处的加密对系统中有多个kernel的效果才明显,单个kernel版本,只有输入密码即刻启动系统)
2、破坏本机grub stage1,而后在救援模式下修复之
3、删除vmlinuz和initramfs文件后无法启动,两种方法恢复之
方法一:
注:initrd的恢复,可以通过命令#mkinitrd /boot/initramfs-`uname -r` `uname -r`生成
方法二:
4、增加新硬盘,在其上制作能单独运行kernel和bash的系统
(1)新添加硬盘做同步:
(2)分区:
(3)格式化分区:
(4)创建空目录挂载分区:
(5)安装grub到新磁盘上:
(6)对照创建“根”下的一级目录:
(7)拷贝bash以及相应的lib库文件(使用脚本实现)
脚本:
(8)拷贝kernel、initrd和编辑grub.conf配置文件:
(9)做sync同步数据到磁盘上:
(10)将机器关机,新建一个虚拟机,指向使用现有的虚拟硬盘(该磁盘为上面新添加的磁盘文件):
(11)启动新建的虚拟机:此时可以看到自命令的title
(12)系统启动完成后,由于grub.config配置文件指定系统其他的第一个进程是bash,如下图,自定制的微小Linux完成:
5、在U盘上定制linux,使其可启动系统和swap分区
(1)对新增的磁盘分区(两个分区作为/和/boot,另外一个分区作为swap分区)
(2)分区结果如下:
(3)格式化分区:
(4)挂载分区,安装grub和kernel、initrd
(5)编辑grub.conf配置文件
(6)脚本拷贝相应需要的二进制文件个lib库文件:ls、blkid、bash、pwd等
(7)新建虚拟机,使用原有的磁盘文件:
(8)启动虚拟机:
(9)查看效果:
6、删除/etc/fstab和/boot目录的所有文件,并恢复之
(1)先破坏相应的文件:
(2)重启后出现如下图的界面,磁盘的分区挂载不了:
(3)修复挂载文件:(注:编辑好了fstab配置文件,切勿使用命令#mount -a来同步挂载,而是将机器重启,实现自动挂载)
#mkdir /mnt/sda2 将/dev/sda2挂载到/mnt/sda2上,进入/mnt/sda2/etc/,新建fstab配置文件,如下图:
注:也可以使用UUID来编辑对应的分区进行挂载
(4)修复挂载后效果:
(5)修复grub和kernel、initrd
(6)新编辑grub.conf配置文件:
(7)全部修复完成:
7、编译安装kernel,启用支持ntfs文件系统功能
准备工作:安装包组“Development tools”、“ncurses*”
(1)先准备好kernel源码包,并且解压到/usr/src目录下:
(2)对解压到当前目录下的内核文件创建个软链接,方便当要编译多个内核时出现混乱:
(3)拷贝当前系统编译产生已有的配置文件(里面全部是系统编译到的功能)到新kernel源码目录下,作为菜单参照选择新增或删除功能:(注:该配置文件需修改为隐藏文件)
(4)#make menuconfig,启动功能选择菜单,如下图:
(5)选择“General setup”进入,可以设置“local version”,选定后“Enter”
(6)设置选择“NTFS”文件系统功能
保存退出:
(7)#make -j 2 使用双线程进行编译(漫长的等待),此处的2取决于机器上的CPU核数
(8)#make modules_install 安装模块
(9)make install 正式安装编译好的内核(完成后启动机器)
(10)编译成功内核:
原创文章,作者:Aaron_wang,如若转载,请注明出处:http://www.178linux.com/46517