代码: 全选
sudo apt-get install binutils debootstrap
#这样就可以用chroot了
#那么下一步就是建立chroot环境,现在livecd的目录下建立一个空目录
mkdir /mnt/debian
#作为chroot环境的根目录使用
sudo mount /dev/sda7 /mnt/debian/
#然后将livecd的相应的目录挂载到chroot 的根目录下,/proc /sys /dev /dev/pts ....
sudo mount -t ext4 /dev/sda7 /mnt/debian/dev
sudo mount -o bind /dev/ /mnt/debian/dev
sudo mount -o bind /proc/ /mnt/debian/proc
sudo mount -o bind /sys/ /mnt/debian/sys
sudo mount -o bind /dev/pts /mnt/debian/dev/pts
#然后就可以
sudo chroot /mnt/debian
看到这里,想必已经知道了chroot的厉害了,之所以可以这样操作,是必须有一个目前适合你的机器硬件的并且在运行的linux,你才能这样做,通过可以运行的linux,不管是什么版本,硬盘上的还是livecd,都可以,这样一个合体版的系统,就出现了。当然chroot还可以做很多事情,当初70年代开发这个程序就是为了追求一些及其危险的行为的影响最小化。
同时解决另外一个问题,就是在更新的时候发生E:sub process ...的错误。这时可以将
mv /var/lib/dpkg/info info.bak
是info中的记录是的dpkg运行错误,这样就可以继续更新,更新完之后可以将info.bak恢复回去,如果不恢复回去会造成你每次安装软件,一大堆的警告。当然原理上来将,在你把系统的所有包都安装一遍之后,dpkg发现info里面有信息之后,警告应该会消除。
这下好了,系统完整性好了,但是无法引导,这个涉及到grub这个多功能引导程序。
以前对grub只是初略的了解一点,至于它是怎么引导多系统的,这个就不是太清楚了。为了实现成功的引导,必须得知道grub的引导过程以及语法。
grub的引导过程在我的机器上面大致是这样的:首先还是我的grub装在了MBR(master boot record) 里面,所以他先引导位于linux/boot/grub下的配置文件grub.cfg,然后依据次配置文件再去搜索硬盘上的其它启动项,在屏幕上显示出来就是不同的启动选项,然后你选择,就会启动不同的操作系统。
主要说一下grub.cfg的写法我的grub.cfg 如下:
- 这里虽然说是do not edit这个文件,但是也别担心。其中menuentry代表一个启动子项目。
代码: 全选
# # DO NOT EDIT THIS FILE # # It is automatically generated by grub-mkconfig using templates # from /etc/grub.d and settings from /etc/default/grub # ### BEGIN /etc/grub.d/00_header ### if [ -s $prefix/grubenv ]; then load_env fi set default="0" if [ "${prev_saved_entry}" ]; then set saved_entry="${prev_saved_entry}" save_env saved_entry set prev_saved_entry= save_env prev_saved_entry set boot_once=true fi function savedefault { if [ -z "${boot_once}" ]; then saved_entry="${chosen}" save_env saved_entry fi } function load_video { insmod vbe insmod vga insmod video_bochs insmod video_cirrus } insmod part_msdos insmod ext2 set root='(hd0,msdos7)' search --no-floppy --fs-uuid --set=root 342c1494-86c8-4af2-bcf0-5b7d990dd5e5 if loadfont /usr/share/grub/unicode.pf2 ; then set gfxmode=640x480 load_video insmod gfxterm insmod part_msdos insmod ext2 set root='(hd0,msdos7)' search --no-floppy --fs-uuid --set=root 342c1494-86c8-4af2-bcf0-5b7d990dd5e5 set locale_dir=($root)/boot/grub/locale set lang=zh_CN insmod gettext fi terminal_output gfxterm set timeout=5 ### END /etc/grub.d/00_header ### ### BEGIN /etc/grub.d/05_debian_theme ### set menu_color_normal=cyan/blue set menu_color_highlight=white/blue ### END /etc/grub.d/05_debian_theme ### ### BEGIN /etc/grub.d/10_linux ### ### END /etc/grub.d/10_linux ### ### BEGIN /etc/grub.d/20_linux_xen ### ### END /etc/grub.d/20_linux_xen ### ### BEGIN /etc/grub.d/20_memtest86+ ### menuentry "Memory test (memtest86+)" { insmod part_msdos insmod ext2 set root='(hd0,msdos7)' search --no-floppy --fs-uuid --set=root 342c1494-86c8-4af2-bcf0-5b7d990dd5e5 linux16 /boot/memtest86+.bin } menuentry "Memory test (memtest86+, serial console 115200)" { insmod part_msdos insmod ext2 set root='(hd0,msdos7)' search --no-floppy --fs-uuid --set=root 342c1494-86c8-4af2-bcf0-5b7d990dd5e5 linux16 /boot/memtest86+.bin console=ttyS0,115200n8 } menuentry "Memory test (memtest86+, experimental multiboot)" { insmod part_msdos insmod ext2 set root='(hd0,msdos7)' search --no-floppy --fs-uuid --set=root 342c1494-86c8-4af2-bcf0-5b7d990dd5e5 multiboot /boot/memtest86+_multiboot.bin } menuentry "Memory test (memtest86+, serial console 115200, experimental multiboot)" { insmod part_msdos insmod ext2 set root='(hd0,msdos7)' search --no-floppy --fs-uuid --set=root 342c1494-86c8-4af2-bcf0-5b7d990dd5e5 multiboot /boot/memtest86+_multiboot.bin console=ttyS0,115200n8 } menuentry "Linux Debian" { insmod part_msdos insmod ext2 set root='(hd0,msdos7)' set prefix=(hd0,msdos7)/boot/grub search --no-floppy --fs-uuid --set=root 342c1494-86c8-4af2-bcf0-5b7d990dd5e5 linux16 /vmlinuz root=/dev/sda7 initrd16 /initrd.img boot } ### END /etc/grub.d/20_memtest86+ ### ### BEGIN /etc/grub.d/30_os-prober ### menuentry "Windows7" --class windows --class os { insmod part_msdos insmod ntfs set root='(hd0,msdos1)' search --no-floppy --fs-uuid --set=root 13A02C341B25E791 chainloader +1 } ### END /etc/grub.d/30_os-prober ### ### BEGIN /etc/grub.d/40_custom ### # This file provides an easy way to add custom menu entries. Simply type the # menu entries you want to add after this comment. Be careful not to change # the 'exec tail' line above. ### END /etc/grub.d/40_custom ### ### BEGIN /etc/grub.d/41_custom ### if [ -f $prefix/custom.cfg ]; then source $prefix/custom.cfg; fi ### END /etc/grub.d/41_custom ###
代码: 全选
menuentry "Linux Debian" { insmod part_msdos insmod ext2 set root='(hd0,msdos7)' set prefix=(hd0,msdos7)/boot/grub search --no-floppy --fs-uuid --set=root 342c1494-86c8-4af2-bcf0-5b7d990dd5e5 linux16 /vmlinuz root=/dev/sda7 initrd16 /initrd.img boot }
vmlinuz是可启动的linux kernel的压缩包,它将被载入到initrd.img initial ram disk 缩写,img是压缩格式,那么,vmlinuz被释放之后,就会进入ramdisk 中,形成一个小的可启动的linux系统,然后继续系统的其他引导。所以,编写了这写启动脚本之后,grub就可以找到linux的启动盘,然后成功的引导linux了。
写了这么多,有一些感慨,自己用linux这么长时间了,恢复系统小问题的方法还是掌握了一些,但是碰到这种变态级别的问题,还是得静下心来,慢慢找方法,才能解决,不然简单的重装了事,但是很多软件,配置又需要重新来一次,这样很划不来。没有不能解决的问题,只有解决的好与不好的问题。