开机破坏并且修复之
自制linux系统
CentOS 6启动流程:
POST --> Boot Sequence(BIOS) --> Boot Loader -->
Kernel(ramdisk) --> rootfs --> switchroot --> /sbin/init --
>(/etc/inittab, /etc/init/*.conf) --> 设定默认运行级别--> 系统
初始化脚本rc.sysinit --> 关闭或启动对应级别的服务--> 启动终端
grub: GRand Unified Bootloader
grub 0.x: grub legacy
grub 1.x: grub2
grub legacy:
stage1: mbr
stage1_5: mbr之后的扇区,让stage1中的bootloader
能识别stage2所在的分区上的文件系统
stage2:磁盘分区(/boot/grub/)
=================================================================
开机加密口令 防止单用户恶意破解口令
生成加密口令
第一步:
[[email protected] ~]# grub-md5-crypt
Password: 输入口令时不显示
Retype password: 输入口令时不显示
$1$6lDgy$WpWXTfAKA/mcC6goW90If. 这个就是加密过后的口令
下面命令也是可以生成加密口令的
openssl passwd -1
xxxxxx
xxxxxx
第二步:
在配置文件中 :vim /boot/grub/grub.conf
添加 :第一个title开的的字符上方 添加加上 password --md5 加密过的口令
例如:
password --md5 $1$6lDgy$WpWXTfAKA/mcC6goW90If
title CentOS 6 (2.6.32-642.el6.x86_64)
root (hd0,0)
然后保存重启
第三步:
开机开始的时候任意键进入菜单界面:这是单用户的ace等口令是无效的,提示输入p 会让输入passwd:也就是刚才上面保存过的加密口令;输入成功则显示出来ace等口令,输入就可以进入单用户修改口令,当然如果在不知道加密口令的用户直接敲回车会正常启动,防止了恶意破解口令
也可以将加密的口令放在配置文件的前后,放在前面是防止进入单用户界
password --md5 $1$6lDgy$WpWXTfAKA/mcC6goW90If
title CentOS 6 (2.6.32-642.el6.x86_64)
root (hd0,0)
kernel /vmlinuz-2.6.32-642.el6.x86_64 ro root=/dev/mapper/vg_compro-lv_root rd_NO_LUKS rd_NO_MD rd_LVM_LV=vg_compro/lv_swap crashkernel=auto LANG=zh_CN.UTF-8 KEYBOARDTYPE=pc KEYTABLE=us rd_LVM_LV=vg_compro/lv_root rd_NO_DM rhgb quiet
initrd /initramfs-2.6.32-642.el6.x86_64.img
password 口令
在末尾添加加密口令是 启动开始的大概几秒钟,直接弹出来passwd:输入加密的口令登录启动系统
================================================================
开机任意键进入菜单界面的一个背景图片
在配置文件中找到以下字符
splashimage=(hd0,0)/grub/splash.xpm.gz
修改背景
1 先做一张分辨率640*480的图 命名为bjtp 上传系统家目录中
2 安装一个linux的修图工具
[[email protected] ~]# yum -y install ImageMagick
3 转换图片格式
[[email protected] ~]# convert -resize 640x480 -colors 14 bjtp.png bjtp.xpm
查看格式
[[email protected] ~]# more bjtp.xpm
压缩
[[email protected] ~]# gzip bjtp.xpm
拷贝到grub
[[email protected] ~]# cp bjtp.xpm.gz /boot/grub/
修改配置文件
[[email protected] ~]# vim /boot/grub/grub.conf
splashimage=(hd0,0)/grub/bjtp.xpm.gz 将文件名称修改一下就可以了
重启reboot开机过程中按下任意键进入菜单的界面,这是还就可以看到刚刚修改的图片了
==================================================================
破坏第1阶段并且修复
[[email protected] ~]# dd if=/dev/zero of=/dev/sda bs=1 count=446
然后查看一下
[[email protected] ~]# hexdump -C -v /dev/sda -n 512
重启reboot 这时候会无法启动 启动的时候自动进入光盘引导界面,这时候选择第三项救援模式
修复:
进入救援模式下的shell界面切根
bash-4.1# chroot /mnt/sysimage/
bash-4.1# grub-install /dev/sda
bash-4.1# exit
bash-4.1# exit
reboot重启就好了
================================================================
破坏第1.5阶段并且修复
[[email protected] ~]# dd if=/dev/zero of=/dev/sda bs=512 count=2 seek=1
[[email protected] ~]# hexdump -C -v /dev/sda -n 1024
重启后手动光盘引导进入救援模式shell界面
输入命令grub
bash-4.1# grub> root (hd0,0)
grup> setup (hd0)
grup> quit
bash-4.1# exit
reboot重启就好了
=================================================================
删除/grub目录所有内容
[[email protected] ~]# rm -rf /boot/grub/
[[email protected] ~]# reboot 重启
开机手动光盘引导进入救援模式
bash-4.1# chroot /mnt/sysimage
bash-4.1# cd /boot
bash-4.1# grub-install /dev/sda
bash-4.1# cd /boot/grub/ 这时候没有grub.conf配置文件需要手写一份
bash-4.1# exit
bash-4.1# exit
reboot 重启
启动界面会提示grub> 输入内容
grub> kernel (hd0,0)/vmlinuz..... root=/dev/sda2
grub> initrd (hd0,0)/initramfs....
grub> boot
修过过程中再次提示输入上面的命令不过在之前开头加上grub> root (hd0,0)就ok了
创建vim /boot/grub/grub.conf
default=0
timeout=5
title Compro
root(hd0,0)
kernel /vmlinuz-2.6... root=/dev/sda2
initrd /inirtamfs....
==========================================================
删除boot目录并且恢复之 (大招,一招致命,解决 以上所有破坏)
[[email protected] ~]# umount /boot
[[email protected] ~]# rm -rf /boot
[[email protected] ~]# reboot
直接进入救援模式
bash-4.1# mkdir /mnt/cdrom
bash-4.1# mount /dev/cdrom /mnt/cdrom
bash-4.1# rpm -ivh /mnt/cdrom/Pachages/kernel-2* --root=/mnt/sysimage --replacepkgs 或者 force
bash-4.1# chroot /mnt/sysimage/
bash-4.1# grub-install /dev/ada
bash-4.1# vim /boot/grub/grub.conf
default=0
timeout=3
title Compro
root (hd0,0)
kernel /vmlinuz... root=/dev/sda2
initrd /initagfs ....
==================================================================
自制Linux系统:
添加新的硬盘,用 [[email protected] ~]# echo ‘- - -‘ > /sys/class/scsi_host/host2/scan 加载
1分区并创建文件系统
[[email protected] ~]# fdisk /dev/sdb
分两个必要的分区
/dev/sdb1对应/boot /dev/sdb2对应根/
[[email protected] ~]# mkfs.ext4 /dev/sdb2
[[email protected] ~]# mkfs.ext4 /dev/sdb2
2挂载boot
[[email protected] ~]# mkdir /mnt/boot
[[email protected] ~]# mount /dev/sdb1 /mnt/boot/
[[email protected] ~]# cd /mnt/boot/
[[email protected] boot]# cp /boot/vmlinuz-2.6.32-642.el6.x86_64 /boot/initramfs-2.6.32-642.el6.x86_64.img .
3安装grub
[[email protected] boot]# grub-install /dev/sdb --root-directory=/mnt
4、建立grub.conf:
[[email protected] boot]# cd grub/
[[email protected] grub]# vim grub.conf
default=0
default=0
timeout=3
title Compro
root (hd0,0)
kernel /vmlinuz-2.6.32-642.el6.x86_64 root=/dev/sda2 selinux=0 init=/bin/bash
initrd /initramfs-2.6.32-642.el6.x86_64.img
5、创建一级目录
[[email protected] ~]# mkdir /mnt/sysroot
[[email protected] ~]# mount /dev/sdb2 /mnt/sysroot/
[[email protected] ~]# cd /mnt/sysroot/
[[email protected] sysroot]# mkdir -pv {etc,lib,lib64,bin,sbin,tmp,var,usr,sys,proc,opt,home,root,boot,dev,mnt,media}
6、[[email protected] sysroot]# vim etc/fstab
/dev/sda1 /boot ext4 defaults 1 1
/dev/sda2 / ext4 defaults 1 2
8、复制bash和相关库文件 复制相关命令及相关库文件
如:ls,cat,vim,reboot,hostname等
这里使用的是脚本
[[email protected] sysroot]# /root/copycmd.sh
Please input a command: bash
Please input a command or quit: vim
Please input a command or quit: cat
Please input a command or quit: ls
Please input a command or quit: ifconfig
Please input a command or quit: df
Please input a command or quit: mount
Please input a command or quit: umount
Please input a command or quit: rpm
Please input a command or quit: reboot
Please input a command or quit: hostname
Please input a command or quit: halt
Please input a command or quit: quit
这里已经完成了,下面看脚本内容
#!/bin/bash
ch_root="/mnt/sysroot"
[ ! -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: " command
while [ "$command" != "quit" ];do
if bincopy $command ;then
libcopy $command
fi
read -p "Please input a command or quit: " command
done
=====================================================================