系统管理和内核管理(二)之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及内核等通常放置于一个基本磁盘分区

3grub菜单栏:

blob.png

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

a:内核参数

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

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

blob.png

blob.png

blob.png

2)加载用户选择的内核或操作系统

允许传递参数给内核

可隐藏启动菜单

3)为菜单提供了保护机制

为编辑启动菜单进行认证

为启用内核或操作系统进行认证

4grub的命令行接口:

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

7grub legacy配置文件:

blob.png

   default=#:设定默认启动的菜单项;落单项(title)编号从0开始

   timeout=#:指定菜单项等待选项选择的时长

   splashimage=(hd#,#) /PATH/TO/XPM_FILE:菜单背景图片文件路径

   hiddenmenu:隐藏菜单

   password [–md5] STRING: 启动菜单编辑认证

   title TITLE:定义菜单项“标题”, 可出现多次

   root (hd#,#)grub查找stage2kernel文件所在设备分区;为grub“根”

   kernel /PATH/TO/VMLINUZ_FILE [PARAMETERS]:启动的内核

   initrd/PATH/TO/INITRAMFS_FILE:内核匹配的ramfs文件

   password [–md5] STRING:启动选定的内核或操作系统时进行认证

blob.png

8grub的加密:

1grub-md5-crypt命令

2openssl passwd -1 命令

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

blob.png

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

9、进入单用户模式:

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

2)在选定的kernel后附加1, s, Ssingle都可以;

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

10、安装grub

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

   blob.png

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

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

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

blob.png

blob.png

2grub

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 toolsServer 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文件的制作:

1mkinitrd命令

为当前正在使用的内核重新制作ramdisk文件

#mkinitrd /boot/initramfs-`uname-r`.img `uname-r`

2dracut命令

为当前正在使用的内核重新制作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 distcleanmrproperpatches以及编辑器备份文件

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

五、内核模块管理:

1lsmod命令:显示由核心已经装载的内核模块;显示的内容来自于: /proc/modules文件

blob.png

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

blob.png

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

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

-p: 显示模块参数

-a: author

-d: description

-l: license

blob.png

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

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

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

blob.png

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

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

6rmmod命令:卸载指定模块

六、/proc目录:

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

参数:只读:输出信息

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

1/proc/sys

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

#sysctl -w path.to.parameter=VALUE

blob.png

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

blob.png

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

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

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

blob.png

2sysctl命令:

默认配置文件:/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”键查看kernelinitrd等信息,再按“ESC”返回上一层界面,最后按“e”键进入下图的界面,在红色框位置输入数字1或者sSsingle等(注:输入的值与前面的“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、删除vmlinuzinitramfs文件后无法启动,两种方法恢复之

blob.png

blob.png

方法一:

blob.png

blob.png

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

blob.png

blob.png

方法二:

blob.png

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

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)拷贝kernelinitrd和编辑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)挂载分区,安装grubkernelinitrd

blob.png

5)编辑grub.conf配置文件

blob.png

6)脚本拷贝相应需要的二进制文件个lib库文件:lsblkidbashpwd

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)修复grubkernelinitrd

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 安装模块

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

blob.png

10)编译成功内核:

blob.png

 

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

(0)
Aaron_wangAaron_wang
上一篇 2016-09-15
下一篇 2016-09-15

相关推荐

  • 开源跳板机Jumpserver v2.0.0 Beta版发布

    demo页面: http://demo.jumpserver.org admin admin 一. 更新Log — 登录脚本 — 1.1 使用paramiko原生ssh协议登录后端主机(原来版本使用pexpect模拟登录) 1.2 新增使用别名或备注登录 1.3 新增主机分组查看,使用更方便 1.4 多线…

    Linux干货 2015-04-20
  • Redis集群明细文档

    Redis目前版本是没有提供集群功能的,如果要实现多台Redis同时提供服务只能通过客户端自身去实现(Memchached也是客户端实现分布式)。目前根据文档已经看到Redis正在开发集群功能,其中一部分已经开发完成,但是具体什么时候可以用上,还不得而知。文档来源:http://redis.io/topics/cluster-spec 一、介绍   该文档是…

    Linux干货 2015-04-04
  • 帮助和文件管理信息

    history命令: -c 清空命令历史 -d offset 删除历史中指定的第offset个命令 n 显示最近的n条历史 -a 追加本次会话新执行的命令历史列表至历史文件 -n 读历史文件中未读过的行到历史列表 -r 读历史文件附加到历史列表 -w 保存历史列表到指定的历史文件 -p 展开历史参数成多行,但不存在历史列表中 -s 展开历史参数马一行。附加在…

    Linux干货 2017-04-11
  • 互联网安全之sudo使用指南

    一、前言 sudo是什么? sudo是系统管理指令;由于root用户权限过大,在实际生产过程中很少使用root用户直接登录系统,而是使用普通用户登录系统;但是如果普通用户要对系统进行日常维护操作时需要su到root用户,为了提高安全性,可以使用sudo授权某一用户在某一主机以某一用户身份运行某些命令;从而减少root用户密码知晓人,提高系统安全性。 &nbs…

    2015-06-23
  • linux同时创建多个目录

    mkdir -p a_{c,d} b_{c,d} mkdir 同时创建多个文件夹 mkdir -p  mylinux/{bin,boot/grub,dev,etc/{rc.d/init.d,sysconfig/network-scripts},lib/modules,lib64,proc,sbin,sys,tmp,usr/local/{bin,sb…

    2017-08-28
  • 马哥教育网络班21期-第九周课程练习

    第九周作业 1、写一个脚本,判断当前系统上所有用户的shell是否为可登录shell(即用户的shell不是/sbin/nologin);分别这两类用户的个数;通过字符串比较来实现; #!/bin/bash # declare -i nologin=0 declare -i other=0   &n…

    Linux干货 2016-09-19