系统管理和内核管理(二)之grub使用、编译安装内核

系统管理和内核管理(二)之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菜单栏:

blob.png

(1)提供启动菜单、并提供交互式接口

a:内核参数

e:编辑模式,用于编辑菜单

c:命令模式,交互式接口

blob.png

blob.png

blob.png

(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命令行接口启动系统:

blob.png

7、grub legacy配置文件:

blob.png

   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:启动选定的内核或操作系统时进行认证

blob.png

8、grub的加密:

(1)grub-md5-crypt命令

(2)openssl passwd -1 命令

(3)openssl passwd -salt “XXXX” -1命令(指定掩码)

blob.png

注:破解root口令,在启动系统时,到达grub界面,选择”a”进入,设置其运行级别1即可

9、进入单用户模式:

(1)编辑grub菜单(选定要编辑的title,而后使用e命令);

(2)在选定的kernel后附加1, s, S或single都可以;

(3)在kernel所在行,键入“b”命令

10、安装grub:

(1)grub-install(救援模式下或者远程登录终端上[前提是破坏掉grub后没将系统重启])

   blob.png

安装grub stage1和stage1_5到/dev/DISK磁盘上,并复制GRUB相关文件到DIR/boot目录下

命令:grub-install –root-directory=DIR /dev/DISK (用于救援模式下,需要指定系统所在的“根”)

注:此修复,在完成修复后需要手动编辑下配置文件grub.conf放到/boot/grub目录下。

blob.png

blob.png

(2)grub

grub> root (hd#,#)

grub> setup (hd#)

如下图,使用dd命令破坏mbr里面的bootloader一部分(此修复步骤需要依赖到/boot/grub目录下的文件stage1)

 blob.png

二、自制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库文件可参照下图的脚本。

blob.png

三:系统配置文件丢失修复:

系统在引导期间,很重要的一个过程就是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

blob.png

退出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   选择为*,意思是编译到内核中去

blob.png

注:编译参照当前系统的参数设置,执行命令#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“

blob.png

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文件

blob.png

2、modinfo命令:显示模块的详细描述信息

blob.png

#modinfo [ -k kernel ] [ modulename|filename… ]

-n: 只显示模块文件路径

-p: 显示模块参数

-a: author

-d: description

-l: license

blob.png

3、modprobe命令:装载或卸载内核模块

   配置文件: /etc/modprobe.d/*.conf

注:如果有需要在系统启动时加载模块指定的参数,可在/etc/modprobe.d/目录下新建一个后缀为.conf的文件,并按照参数的格式填写即可。

blob.png

4、depmod命令:内核模块依赖关系文件及系统信息映射文件的生成工具(注:该命令一般建议不要使用,会导致正常系统出现一定的故障)

5、insmod命令:指定模块文件,不自动解决依赖模块

6、rmmod命令:卸载指定模块

六、/proc目录:

  内核把自己内部状态信息及统计信息,以及可配置参数通过proc伪文件系统加以输出

参数:只读:输出信息

可写:可接受用户指定“新值”来实现对内核某功能或特性的配置

1、/proc/sys

(1)sysctl命令用于查看或设定此目录中诸多参数

#sysctl -w path.to.parameter=VALUE

blob.png

#sysctl -w kernel.hostname=mail.magedu.com

blob.png

(2)echo命令通过重定向方式也可以修改大多数参数的值

#echo "VALUE" > /proc/sys/path/to/parameter

#echo “websrv” > /proc/sys/kernel/hostname

blob.png

2、sysctl命令:

默认配置文件:/etc/sysctl.conf  (注:上面两种命令修改参数,只能是临时修改,一旦系统重启就会丢失,如果需要永久生效则需要修改该配置文件)

blob.png

(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 清除缓存

blob.png

七、/sys目录:

sysfs:为用户使用的伪文件系统,输出内核识别出的各硬件设备的相关属性信息,也有内核对硬件特性的设定信息;有些参数是可以修改的,用于调整硬件工作特性。

udev通过此路径下输出的信息动态为各设备创建所需要设备文件,udev是运行用户空间程序

专用工具:udevadmin, hotplug

udev为设备创建设备文件时,会读取其事先定义好的规则文件,一般在/etc/udev/rules.d及/usr/lib/udev/rules.d目录下

 

事例演示: 

1、破解root口令,并为grub设置保护功能

破解root密码:

(1)开机时,不断按下“↓”键,进入下图的界面:

blob.png

(2)然后先按“e”键查看kernel和initrd等信息,再按“ESC”返回上一层界面,最后按“e”键进入下图的界面,在红色框位置输入数字1或者s、S、single等(注:输入的值与前面的“quiet”必须要有空格隔开)

blob.png

(3)到此已经无需密码(以root的身份)进入了系统,使用命令#passwd即可修改密码(密码破解)

blob.png

Grub设置保护:

(1)编辑/boot/grub/grub.conf配置文件,设置md5加密,格式:password –md5 $1$9wlPy$BqtKwoZjEpvSSn0XJmAHy/,共添加两处,在title前设置的md5加密是对全局的设置(即开机需要需要输入密码方可进入grub的功能菜单处选择);而在initrd后一行添加的md5加密是对对应的kernel启动做加密(需要输入密码方可让对应的系统启动)

blob.png

(2)重启看设置效果:

测试全局加密:如下图,连续按两次“Enter”键,才进入到grub界面:

blob.png

对比grub没有加密前,可以发现下图中红色框处的功能选择只剩下了“p”和“Enter”

blob.png

再次按“Enter”键,到了输入全局grub的密码:

blob.png

(3)测试对kernel加密的设置:(此处的加密对系统中有多个kernel的效果才明显,单个kernel版本,只有输入密码即刻启动系统)

blob.png

2、破坏本机grub stage1,而后在救援模式下修复之

blob.png

blob.png

3、删除vmlinuz和initramfs文件后无法启动,两种方法恢复之

blob.png

blob.png

方法一:

blob.png

blob.png

注:initrd的恢复,可以通过命令#mkinitrd /boot/initramfs-`uname -r` `uname -r`生成

blob.png

blob.png

方法二:

blob.png

4、增加新硬盘,在其上制作能单独运行kernel和bash的系统

(1)新添加硬盘做同步:

blob.png

(2)分区:

blob.png

(3)格式化分区:

blob.png

blob.png

(4)创建空目录挂载分区:

blob.png

 

(5)安装grub到新磁盘上:

blob.png

blob.png

(6)对照创建“根”下的一级目录:

blob.png

blob.png

(7)拷贝bash以及相应的lib库文件(使用脚本实现)

blob.png

脚本:

blob.png

(8)拷贝kernel、initrd和编辑grub.conf配置文件:

blob.png

blob.png

(9)做sync同步数据到磁盘上:

blob.png

(10)将机器关机,新建一个虚拟机,指向使用现有的虚拟硬盘(该磁盘为上面新添加的磁盘文件):

blob.png

blob.png

(11)启动新建的虚拟机:此时可以看到自命令的title

blob.png

(12)系统启动完成后,由于grub.config配置文件指定系统其他的第一个进程是bash,如下图,自定制的微小Linux完成:

blob.png

5、在U盘上定制linux,使其可启动系统和swap分区

(1)对新增的磁盘分区(两个分区作为/和/boot,另外一个分区作为swap分区)

blob.png

(2)分区结果如下:

blob.png

(3)格式化分区:

blob.png

(4)挂载分区,安装grub和kernel、initrd

blob.png

(5)编辑grub.conf配置文件

blob.png

(6)脚本拷贝相应需要的二进制文件个lib库文件:ls、blkid、bash、pwd等

blob.png

blob.png

(7)新建虚拟机,使用原有的磁盘文件:

blob.png

blob.png

(8)启动虚拟机:

blob.png

(9)查看效果:

blob.png

6、删除/etc/fstab和/boot目录的所有文件,并恢复之

(1)先破坏相应的文件:

blob.png

(2)重启后出现如下图的界面,磁盘的分区挂载不了:

blob.png

blob.png

blob.png

(3)修复挂载文件:(注:编辑好了fstab配置文件,切勿使用命令#mount -a来同步挂载,而是将机器重启,实现自动挂载)

#mkdir /mnt/sda2 将/dev/sda2挂载到/mnt/sda2上,进入/mnt/sda2/etc/,新建fstab配置文件,如下图:

blob.png

注:也可以使用UUID来编辑对应的分区进行挂载

(4)修复挂载后效果:

blob.png

blob.png

(5)修复grub和kernel、initrd

blob.png

(6)新编辑grub.conf配置文件:

blob.png

(7)全部修复完成:

blob.png

7、编译安装kernel,启用支持ntfs文件系统功能

准备工作:安装包组“Development tools”、“ncurses*”

(1)先准备好kernel源码包,并且解压到/usr/src目录下:

blob.png

(2)对解压到当前目录下的内核文件创建个软链接,方便当要编译多个内核时出现混乱:

blob.png

(3)拷贝当前系统编译产生已有的配置文件(里面全部是系统编译到的功能)到新kernel源码目录下,作为菜单参照选择新增或删除功能:(注:该配置文件需修改为隐藏文件)

blob.png

(4)#make menuconfig,启动功能选择菜单,如下图:

blob.png

(5)选择“General setup”进入,可以设置“local version”,选定后“Enter”

blob.png

(6)设置选择“NTFS”文件系统功能

blob.png

blob.png

blob.png

保存退出:

blob.png

(7)#make -j 2 使用双线程进行编译(漫长的等待),此处的2取决于机器上的CPU核数

(8)#make modules_install 安装模块

(9)make install 正式安装编译好的内核(完成后启动机器)

blob.png

(10)编译成功内核:

blob.png

 

原创文章,作者:Aaron_wang,如若转载,请注明出处:http://www.178linux.com/46517

赞 (0)
Aaron_wangAaron_wang
上一篇 2016-09-15 22:22
下一篇 2016-09-15 22:23

相关推荐

  • 马哥教育网络班22期+第13周作业

    week13 1、建立samba共享,共享目录为/data,要求:(描述完整的过程)   1)共享名为shared,工作组为magedu;   2)添加组develop,添加用户gentoo,centos和ubuntu,其中gentoo和centos以develop为附加组,ubuntu不属于develop组;密码均为…

    Linux干货 2016-11-21
  • RAID5的组建

        RAID5在实际场景中应用最多,RAID5最少使用3块硬盘,3块硬盘中允许1块硬盘损坏,RAID5它的最大特点是可以有一块硬盘做冗余,其使用率是 N-1存储空间(N表示硬盘数量)     首先创建分区,然后转换分区类型,最后保存退出。 注解:虚拟机总共有6块硬盘,我是从第3块硬盘开始做rai…

    Linux干货 2016-02-14
  • 对虚拟机键入Ctrl+Alt+Delete的详细说明

            日常中我们用Windows系统时经常使用Ctrl+Alt+Delete来换出任务管理的菜单,进行任务管理,linux中也有这样的键入命令,但不是管理任务,而是重启系统!!!那么我们就应该注意了,不要误操作重启服务器。       &n…

    2017-03-28
  • 硬链接与软链接

    1、关于硬链接和软链接是什么   硬链接与软链接是 Linux 文件系统中的一个重要概念,其涉及文件系统中的索引节点 (index node 又称 inode),而索引节点对象是 Linux 虚拟文件系统 (VFS) 的四个基本概念之一。通过剖析硬链接与软链接的联系与区别,我们可更好的了解 Linux 中 VFS 这一通用文件模型。 (1…

    Linux干货 2016-10-20
  • 设计模式(四)原型模式Prototype(创建型)

    1.   概述 我们都知道,创建型模式一般是用来创建一个新的对象,然后我们使用这个对象完成一些对象的操作,我们通过原型模式可以快速的创建一个对象而不需要提供专门的new()操作就可以快速完成对象的创建,这无疑是一种非常有效的方式,快速的创建一个新的对象。 例子1:孙悟空拔下一嘬猴毛,轻轻一吹就会变出好多的孙悟空来。 例子2:寄个快递下面是一个邮寄快…

    Linux干货 2015-06-25
  • N26-第一周作业

    1、描述计算机的组成及其功能;  计算机组成部分分为硬件及软件。  硬件:  计算机硬件主要有五大部分组成:运算器、控制器、存储器、输入设备、输出设备;  1)运算器、控制器,统称为处理器,也就是CPU:    主要功能是对各种数据进行运算,包括加、减、乘、除的算术运算,还包括进行逻辑判断的能力,如…

    Linux干货 2016-12-31