修复/boot及/etc/fstab自制linux编译安装内核
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了修复/boot及/etc/fstab自制linux编译安装内核相关的知识,希望对你有一定的参考价值。
修复/boot及/etc/fstab、自制linux、编译安装内核
破坏:dd if=/dev/zero of=/dev/sda bs=1 count=446
查看:hexdump -C -n 512 /dev/sda
发现前面的字节都为0
状况一、刚破坏未重启的时候修复:
可以利用grub重新生成:
grub
grub> root (hd0,0)
grub> setup (hd0)
quit退出
修复完之后使用hexdump -C -n 512 /dev/sda查看发现已经修复成功
状况二、破坏之后重启了,但是有MBR备份时的修复:
备份:dd if=/dev/sda of=/app/mbr bs=1 count=512
破坏:dd if=/dev/zero of=/dev/sda bs=1 count=446
修复:
1、进入救援模式
1)在系统启动显示进度条的时候,按一下esc键
2)在弹出的页面中选择第三项Rescue
3)选择语言的都按默认的来,直接按回车,直到出现Setup Networking,可以根据自己的选择,是利用网络接口还是不用。在这里就不用,选择no
4)接下来就按默认的来,一步步回车就行,就进入shell了。默认硬盘的根被挂载到/mnt/sysimage/
2、利用备份的mbr恢复
dd if=/mnt/sysimage/app/mbr of=/dev/sda bs=1 count=446
3、保险起见,恢复完之后使用sync同步
4、reboot重启即可
状况三、破坏之后重启,但是没有MBR备份时的修复:
1、进入救援模式
2、切换根,使根/表现为硬盘的根
chroot /mnt/sysimage
3、重新生成mbr
grub-install /dev/sda
当然也可以使用状况一中的grub的方式生成mbr
4、sync同步
5、reboot重启
实验二、删除/boot下所有文件(rm -rf /boot)
恢复:
1、进入救援模式
2、切换根
chroot /mnt/sysimage
3、在/boot下生成initramfs文件
mkinitrd /boot/initramfs-`uname -r`.img `uname -r`
4、挂载光盘,将光盘的内核文件拷贝到/boot下
mount /dev/sr0 /mnt
cp /mnt/isolinux/vmlinuz /boot/
5、安装grub,生成grub文件
grub-install /dev/sda
6、创建并编辑grub.conf文件
vim /boot/grub/grub.conf
default=0
timeout=5
title centos6.9
kernel /vmlinuz root=/dev/sda2
initrd /initramfs-2.6.32-696.el6.x86_64.img
7、sync同步
8、退出切换的根,并且重启即可
exit;reboot
如果不退出,那么reboot无法使用
实验三、在分区情况下,删除/boot下所有文件,删除/etc/fstab
1、进入救援模式,但是由于没有/etc/fstab文件所以根无法自动挂载到/mnt/sysimage
2、找到根在哪个分区
建一个临时目录作为挂载点:mkdir /mnt/tmp
尝试所有sda挂载:mount /dev/sda{1,2,...} /mnt/tmp
ls /mnt/tmp 查看文件,判断哪个是根
3、挂载根
mount /dev/sda2 /mnt/tmp
4、创建fstab文件并写内容
cat > /mnt/tmp/etc/fstab
/dev/sda1 /boot ext4 defaults 0 0
/dev/sda2 / ext4 defaults 0 0
/dev/sda3 /app ext4 defaults 0 0
/dev/sda5 swap swap defaults 0 0
使用Ctrl+d 结束输入。不能使用Ctrl+c退出,否则会删除最后一条记录。
5、写完重启再进救援模式,就会自动挂载根到/mnt/sysimage了
6、修复/boot如实验二,或者使用如下方法
1)进去救援模式后挂载光盘
mkdir /mnt/cdrom 创建临时目录作为挂载点
mount /dev/sr0 /mnt/cdrom 挂载光盘
2)安装内核包
如果在安装内核包之前没有切换根,那么使用下面的命令来安装
rpm -ivh /mnt/cdrom/Packages/kernel-2.6.32-696.el6.x86_64.rpm --root=/mnt/sysimage --force
如果已经切换根,那么使用下面的命令来安装
rpm -ivh /mnt/cdrom/Packages/kernel-2.6.32-696.el6.x86_64.rpm --force
3)在已经切换根(chroot /mnt/sysimage)的情况下,安装grub
grub-install /dev/sda 安装grub
sync 同步
4)编辑/boot/grub/grub.conf文件
vim /boot/grub/grub.conf
default=0
timeout=5
title linux
kernel /vmlinuz-2.6.32-696.el6.x86_64 root=UUID=6da11b60-dd80-460a-a00f-beb8b3373b5c
initrd /initramfs-2.6.32-696.el6.x86_64.img
说明:①UUID可以通过r!blkid /dev/sda2导入
②/vmlinuz-2.6.32-696.el6.x86_64和initrd /initramfs-2.6.32-696.el6.x86_64.img的文件名都可以通过r!ls /boot/导入 。
③不写grub.conf文件就没有菜单,会出错,不过可以在出错界面直接写kernel /vmlinuz-2.6.32-696.el6.x86_64以及initrd /initramfs-2.6.32-696.el6.x86_64.img 。临时启动了系统之后再写去编辑grub.conf文件
5)退出切换的根并且重启系统
exit;reboot
实验四、在逻辑卷环境下删除/boot下所有文件,删除/etc/fstab:
修复:
1、进入救援模式
2、激活卷组
vgchange -ay
使用lvscan查看逻辑卷状态此时是active了
3、挂载逻辑卷
blkid 查看逻辑卷名,为下面的挂载做准备
mkdir /mnt/tmp 创建目录作为挂载点
mount /dev/UolGroup/lv_root /mnt/tmp 挂载逻辑卷
4、编辑fstab文件
cat > /mnt/tmp/etc/fstab
/dev/sda1 /boot ext4 defaults 0 0
/dev/UolGroup/lv_root / ext4 defaults 0 0
/dev/UolGroup/lv_home /home ext4 defaults 0 0
/dev/UolGroup/lv_swap swap swap defaults 0 0
5、重启之后再进入救援模式来修复/boot,此后的步骤完全同实验三的修复/boot
实验五、/sbin/init故障(被移走mv /sbin/init /app):
修复:
1、在选择内核的界面按a,在UUID后面加一个参数init=/bin/bash
/bin/bash是系统自带的程序,可以使用这个先启动系统(不过起来后仅能使用部分命令)
2、系统启动后重新挂载根/为可写(启动后是只读的,不能写文件,不能挂载/app)
mount -o remount,rw /
3、挂载/app
mount /dev/sda3 /app 挂载/app对应的分区
4、将init文件移回来
mv /app/init /sbin/
如果是删除了init文件,那么可以利用光盘重装init:
1)挂载光盘
mount /dev/sr0 /mnt/
2) 重装init:
rpm -ivh /mnt/Packages/upstart-0.6.5-16.e16.x86_64.rpm --force
5、重启
准备工作:添加一块新硬盘,将来将自制的Linux系统放在这里
使硬盘生效: echo ‘- - -‘>/sys/class/scsi_host/host2/scan 或者
echo ‘- - -‘>/sys/class/scsi_host/host0/scan
步骤:
1、分区并创建文件系统
分两个必要的分区(第一个100M即可;余下所有空间给第二个分区)
fdisk /dev/sdb (/dev/sdb1对应/boot /dev/sdb2对应根 /)
mkfs.ext4 /dev/sdb1 将/dev/sdb1格式化为ext4文件系统
mkfs.ext4 /dev/sdb2 将/dev/sdb2格式化为ext4文件系统
2、创建一级目录并且挂载/dev/sdb1
mkdir /mnt/boot 子目录必须为boot,因为安装grub的时候,自己指定的根如果是/mnt,它会自动找/mnt/下的boot
mount /dev/sdb1 /mnt/boot 挂载boot
3、安装grub
grub-install --root-directory=/mnt /dev/sdb
装完之后确认一下/mnt/boot/grub/下有好几个文件,并且使用命令hexdump -C -n 512 /dev/sdb 查看有正确的MBR数据
4、拷贝内核文件和initramfs文件
cp /boot/vmlinuz-2.6.32-642.el6.x86_64 /mnt/boot/
cp /boot/initramfs-2.6.32-642.el6.x86_64.img /mnt/boot/
5、建立grub.conf:
vim /mnt/boot/grub.conf
default=0
timeout=3
title chenlinux
kernel /vmlinuz-2.6.32-642.el6.x86_64 root=/dev/sdb2 selinux=0 init=/bin/bash
initrd /initramfs-2.6.32-642.el6.x86_64.img
6、创建一级目录,并挂载/dev/sdb2
mkdir /mnt/sysroot
mount /dev/sdb2 /mnt/sysroot
7、复制相关命令及库文件到/mnt/sysroot(复制ls,cat,vim,reboot,hostname,ping,bash,insmod,ip,ifconfig等)
可以利用脚本实现拷贝,脚本内容如下:
#!/bin/bash
. /etc/init.d/functions
echo "目标目录是:/mnt/sysroot"
[ -d /mnt/sysroot ]||mkdir /mnt/sysroot
cpcmd(){
if which $needcmd &>/dev/null;then
local cmd=`which --skip-alias $needcmd`
local dir=`dirname $cmd`
[ -d /mnt/sysroot$dir ]||mkdir -p /mnt/sysroot$dir
if [ -f /mnt/sysroot$cmd ];then
echo "$cmd 已存在"
else
cp $cmd /mnt/sysroot$dir&&echo `action "$cmd" true`
fi
elif [ "$needcmd" == "quit" ];then
exit
else
echo "命令不存在或者该命令是内部命令或者该命令是别名"
fi
}
cpso(){
if which $needcmd &>/dev/null;then
local so=`ldd $(which --skip-alias $needcmd)|egrep -o "/.* "`
for i in $so ;do
local sodir=`dirname $i`
[ -d /mnt/sysroot$sodir ]||mkdir -p /mnt/sysroot$sodir
if [ -f /mnt/sysroot$i ];then
echo "$i 已存在"
else
cp $i /mnt/sysroot$sodir&&echo `action "$cmd" true`
fi
done
fi
}
until [[ "$needcmd" == "quit" ]];do
read -p "请输入需要复制的命令(quit退出): " needcmd
cpcmd
cpso
done
8、 拷贝网卡驱动,使其可以配置ip
cp /lib/modules/2.6.32-696.el6.x86_64/kernel/drivers/net/e1000/e1000.ko
/mnt/sysroot/lib64/
9、创建必须的子目录
mkdir /mnt/sysroot/{etc,lib,lib64,bin,sbin,tmp,var,usr,sys,proc,opt,home,root,boot,dev,mnt,media}
10、sync同步
验证:创建新的虚拟机,选择现有磁盘,使用自己做的linux系统硬盘启动
1、rz 导入源码包,比如导入/neihe/下
cd /neihe/
rz linux-4.13.2.tar.xz
2、解包到当前目录下
tar -xvf linux-4.13.2.tar.xz
3、安装包组及必要的包
yum groupinstall "development tools"
yum install ncurses-devel
yum install openssl-devel
4、从现有系统拷贝config文件
cp /boot/config-2.6.32-696.el6.x86_64 /neihe/linux-4.13.2/.config
5、执行config脚本
1)cd /neihe/linux-4.13.2/
2)make menuconfig
①使用此命令必须进入解压后的文件夹才能使用,否则不能使用,会出现如下错误:
make: ***No rule to make target “menuconfig”.stop
②有时候还会出现下面的错误:
your display is too small to run menuconfig!
那么把窗口调大点就好了。
③由下图可看出运行.config脚本需要ncurses-devel包,不过在上面已经安装过了。
file systems -->DOS/FAT/NT -->设置NTFS file为M-->设置write为*-->退出
Networking Support-->设置network physical为M-->exit-->yes保存
6、编译
make -j 4
4表示利用4个CPU来编译。如果想要看看编译过程耗时多少,并且编译完成之后发警报提醒自己,那么可以使用下面的命令来编译
date >> /app/date.log ; make -j 4 ;date >> /app/date.log; for i in {1..5};do echo -e "\a";sleep 0.5;done
编译如果出现如下错误:
make: Warning: File `/usr/src/linux-2.6.35.7-nanosg20/arch/arm/Makefile‘ has modification time 3.4e+08 s in the future
make[1]: Warning: File `scripts/Makefile.host‘ has modification time 3.4e+08 s in the future HOSTCC scripts/basic/fixdep scripts/basic/fixdep.c:398: fatal error: opening dependency file scripts/basic/.fixdep.d: Permission denied compilation terminated.
这个错误提示信息我们,Makefile的修改时间点是Linux当前的一个未来时间点。说明当前时间有问题,可以修改为正确的当前时间来解决这个问题
date -s “xxxx-xx-xx hh:mm:ss”
7、安装模块,这一步就会生成/lib/modules模块文件了
make modules_install
8、安装内核相关文件,这一步会生成/boot/vmlinuz-...文件了
make install
附:卸载内核:
删除/lib/modules/目录下不需要的内核库文件
删除不需要的内核源码
删除/boot目录下启动的内核和内核映像文件
更改grub的配置文件,删除不需要的内核启动列表
以上是关于修复/boot及/etc/fstab自制linux编译安装内核的主要内容,如果未能解决你的问题,请参考以下文章
纯手工修复fstab文件以及boot目录(Centos6.8)