系统启动方面实验及感想

下面我来讲下grub,grub在编辑的时候可以进入一种模式就是单用户模式,就是当grub.conf文件未写入密码时,普通用户将直接忽略系统密码进入系统,所以这可以称为一个捷径,也可以成为一个漏洞,当然linux的前辈们不可能连这个都想不到,他们也有自己的办法,这就是我们grub的两层加密机制,在选定登陆界面之前可以设置一次,启动内核时也可以设置一次,密码也可以采取加密算法,这样就可以为我们系统提供双层保险。好了说了那么多,让我么你做一个简单的练习。

  • 破解root口令,并为grub设置保护功能
这个问题再简单不过了,在登陆选定内核界面按e进入grub的编辑界面,然后按‘b’登陆即‘boot’之意,这样就破解了root的密码了。

  • 破坏本机grub stage1,而后在救援模式下修复之
下面我来讲下stage1这个步骤是存在MBR前512字节里的,将之破坏的方式可以是这样:dd if=/dev/zero of=/dev/sd# ,#表示grub所在磁盘,这里假设我们已经将MBR进行破坏,我们只需在进入RESCUE模式时重新安装grub即可。grub-install --root-directory /dev/sd# 当然我这是切根后的安装,不然救援模式下是没有grub-install这个命令的。

  • 删除vmlinuz和initramfs文件,无法启动,恢复之
下面我来讲下这两个文件一个是内核文件,一个是虚拟文件系统文件,都是grub的核心文件,我们在编写grub.conf这个配置文件的时候其他的都可以不写,但是这两个文件却不能省略。initramfs 文件可以在救援模式使用
mkinitrd命令进行生成,mkinitrd initramfs-`uname -r`.img `uname -r`
下面我来讲下几种解决上述问题的方法。
1、有网络时,因为一般公司里的主机里的内核文件及文件系统文件的版本都是同一种,所以我们可以联通上特定的主机,使用scp这个命令将缺失的文件拷贝过来,前提是得有这个主机的密码。
2、当没有网络时我们可以进入救援模式,安装内核文件中的/boot目录,当然如果不嫌麻烦可以将内核全部重新安装一遍,不过命令是这样的
rpm -ivh ~kernel.... +路径 --force,内核会自己判断哪些缺失文件,这样也节省了不少时间。
3.这种方法就是挂载光盘文件找到 isolinux目录找到vmlinuz、initramfs文件进行复制到、boot目录即可。

好的如果你觉得这些还不够,后面还有猛料哦

  • 删除/etc/fstab和/boot 目录的所有文件,并恢复之
其实这个也不复杂,就是进入救援模式重新安装内核,前提是得先挂载光盘
chroot=/mnt/sysimage
rpm -ivh  ~Packages/kernel~  --force| replacepkgs
然后进而重新安装grub文件。
grub-install  --root-directory=/ /dev/sd#
安装完成后重新编辑grub.conf文件。
启动后对/etc/fstab文件进行修复。
  • 增加新硬盘,在其上制作能单独运行kernel和bash的系统
这里假设我们原来的硬盘在/dev/sda上面,我们这里新加一块/dev/sdb
接下来我们对其进行分区及格式化、fdisk /dev/sdb 分出200M大的一块/dev/sdb1磁盘  然后在对其进行格式化,mkfs.ext3 /dev/sdb1
完成后我们在/mnt目录里新建/sysroot 来模拟一个根文件系统,
我们在/sysroot里新建根目录的那些文件夹,这里使用如下脚本调入我们需要引入的命令,在执行的时候我们将根写为/mnt/sysroot即可。
``` shell
#!/bin/bash
Read -p ‘   Please input your root dirname’ rootdir
 ch_root="$rootdir"
[ ! -d $ch_root ] && mkdir $ch_root
bincopy() {
if which $1 &>/dev/null; then
        local cmd_path=`which --skip-alias $1`
        local bin_dir=`dirname $cmd_path`
        [ -d ${ch_root}${bin_dir} ] || mkdir -p ${ch_root}${bin_dir}
        [ -f ${ch_root}${cmd_path} ] || cp $cmd_path ${ch_root}${bin_dir}
        return 0
    else
        echo "Command not found."
        return 1
    fi
}
libcopy() {
    local lib_list=$(ldd `which --skip-alias $1` | grep -Eo '/[^[:space:]]+')
    for loop in $lib_list;do
         local lib_dir=`dirname $loop`
        [ -d ${ch_root}${lib_dir} ] || mkdir -p  ${ch_root}${lib_dir}

        [ -f ${ch_root}${loop} ] || cp $loop ${ch_root}${lib_dir}
    done
}  
read -p "Please input a command or quit: " command 
while [ "$command" != "quit" ];do
    if bincopy $command ;then
        libcopy $command
    fi
    read -p "Please input a command or quit: " command
done
执行完成后我们将/bin/bash 拷贝到/mnt/sysroot/bin目录中作为我们系统启动后的第一个初始化程序运行,然后我们将/boot目录整个复制到/mnt/sysroot目录中,这里我们重新编写一下/mnt/sysroot/boot/grub/grub.conf文件,我们注意更改一些grub的根和文件系统的根即可。好了,小伙伴们准备好了吗,赶紧去试一试吧,这里我就不贴图了。
  • 6、 下面我这里对上述问题再深化了一下,因为就是喜欢折腾,根本停不下来,原来我们的boot目录是在根文件系统下面,我们这里新加一块硬盘,读入
    echo '----' /sys/class/scic_host/host2/scan 将它进行重新分区,假设我们这边的根文件系统的磁盘是/dev/sda,我们这里新加的磁盘是/dev/sdb,我们将之新加一个分区/dev/sdb1,格式化为ext3,,这里我们将/boot文件目录下的文件先已到/tmp目录下,然后将它解挂载到/dev/sdb1,这里我们进入救援模式,在输入chroot =/mnt/sysimage后,我们输入


    捕获1.PNG

    注意这里的安装目录写原来的根文件系统所在目录,这里我们容易混淆,接下来我们重启进入硬件启动,我们输入


    捕获2.PNG

    然后我们继续输入
    捕获3.PNG

    然后输入
    捕获4.PNG

    进入文件系统后重新编写/boot/grub/grub.conf文件即可。


当然我这里还有很多不足,我这里未涉及逻辑卷系统和U盘/光盘启动的制作,将来有机会会在这些案例中进行展示

推荐阅读更多精彩内容