好久没有发帖,记录最近关于debian 恢复的一件事情,分享给大家

系统安装、升级讨论
版面规则
我们都知道新人的确很菜,也喜欢抱怨,并且带有浓厚的Windows习惯,但既然在这里询问,我们就应该有责任帮助他们解决问题,而不是直接泼冷水、简单的否定或发表对解决问题没有任何帮助的帖子。乐于分享,以人为本,这正是Ubuntu的精神所在。
回复
头像
lovelyzlf
帖子: 946
注册时间: 2009-11-04 13:03
联系:

好久没有发帖,记录最近关于debian 恢复的一件事情,分享给大家

#1

帖子 lovelyzlf » 2013-09-12 10:21

前天突然想把系统升级一下,但是发现中途出现了问题,也不知道当时是怎么想的一下子就把进程给ctrl c掉了,于是果断发现好多包都没装上,然后桌面直接进不去了,启动项消失了,就连/boot中的vmlinuz 和initrd.img也没有了,这下悲剧了,于是想办法塞了这两个东西进去,发现还是进不去,肿么办?不会又要重装吧,这可是俺使用了两年的debian系统啊。好吧,想办法吧,突然想起以前有人说过在各种绝望的情况下用chroot可以拯救世界的方法。突然发现,自己被逼上了要学习地步,于是做了一个livecd usb启动盘,进去之后,开始各种查资料,

代码: 全选

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
下面就在livecd中用chroot方法启动了你硬盘上面的操作系统,然后进行各种修复操作,联网,更新,将你破碎的系统恢复如初。
看到这里,想必已经知道了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 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 ###
    这里虽然说是do not edit这个文件,但是也别担心。其中menuentry代表一个启动子项目。

    代码: 全选

    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 和initrd.img这两个文件来启动系统。
vmlinuz是可启动的linux kernel的压缩包,它将被载入到initrd.img initial ram disk 缩写,img是压缩格式,那么,vmlinuz被释放之后,就会进入ramdisk 中,形成一个小的可启动的linux系统,然后继续系统的其他引导。所以,编写了这写启动脚本之后,grub就可以找到linux的启动盘,然后成功的引导linux了。
写了这么多,有一些感慨,自己用linux这么长时间了,恢复系统小问题的方法还是掌握了一些,但是碰到这种变态级别的问题,还是得静下心来,慢慢找方法,才能解决,不然简单的重装了事,但是很多软件,配置又需要重新来一次,这样很划不来。没有不能解决的问题,只有解决的好与不好的问题。
头像
adagio
论坛版主
帖子: 22110
注册时间: 2008-02-17 23:47
来自: 美丽富饶的那啥星球

Re: 好久没有发帖,记录最近关于debian 恢复的一件事情,分享给大家

#2

帖子 adagio » 2013-09-12 12:36

:em04
附件
你妈逼的.gif
你妈逼的.gif (889.98 KiB) 查看 952 次
明天就换大三八!
——8核CPU、8G内存、8T硬盘……
8卡交火,80寸大屏放8个……
IPv8的光纤要8条……

---------------------------------------------------------------------------------
[图片版]新手当自强(续)FAQ
[新手进阶]挂载、fstab、调整linux分区
[图片版]E17桌面环境配置手把手
头像
zhw2101024
帖子: 1849
注册时间: 2009-03-28 16:10
系统: Arch debian win7
联系:

Re: 好久没有发帖,记录最近关于debian 恢复的一件事情,分享给大家

#3

帖子 zhw2101024 » 2013-09-12 14:22

引导那一部分为什么不用

代码: 全选

sudo update-grub呢
jinjiachen
帖子: 2148
注册时间: 2012-12-16 15:43
系统: debian

Re: 好久没有发帖,记录最近关于debian 恢复的一件事情,分享给大家

#4

帖子 jinjiachen » 2013-09-13 11:57

mark
回复