1. 程式人生 > >修復/boot及/etc/fstab、自制linux、編譯安裝內核

修復/boot及/etc/fstab、自制linux、編譯安裝內核

修復/boot、/etc/fstab、自制linux、編譯內核

修復/boot及/etc/fstab、自制linux、編譯安裝內核

技術分享實驗一、破壞dev/sda 的MBR的446字節:

破壞: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

w技術分享

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:

準備工作:添加一塊新硬盤,將來將自制的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系統硬盤啟動

技術分享實驗七、內核編譯(編譯之前改一下cpu數量可以使速度快點)

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包,不過在上面已經安裝過了。

技術分享 3)執行.config腳本,改配置使系統支持ntfs分區

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、編譯安裝內核