2014年5月2日星期五

用 Ubuntu LiveCD 做系统急救盘

硬盘里有 Ubuntu LiveCD 的镜像,可否让 GRUB 2 从镜像启动,以备不时之需呢?
和 GRUB Legacy 以及 GRUB4DOS 不同,GRUB 2 不需要镜像文件在硬盘上连续存放。(难免有磁盘碎片的对吧)
但是 GRUB 2 不可以从镜像文件 chainloader。
选了很多发行版,Ubunbu 的 LiveCD 是最合适的。
下面在 /etc/grub.d/40_custom 末尾加上以下内容。(40_custom 自带两行文字,开头两行不要改)
menuentry 'Ubuntu 14.04 LiveCD' {
  insmod part_gpt
  insmod ext2
  insmod iso9660
  set iso_path=/boot/ubuntu-14.04-desktop-amd64.iso
  echo 'Finding LiveCD...'
  search --set=root --file ${iso_path}
  echo 'Mounting LiveCD...'
  loopback loop ${iso_path}
  set root=loop
  set iso_path="${iso_path} locale=zh_CN"
  export iso_path
  configfile /boot/grub/loopback.cfg
}
再随便找一个磁盘卷宗,把 ubuntu-14.04-desktop-amd64.iso 扔到 /boot 里。
如果不是 ext2 ext3 ext4 的卷,把 insmod ext2 换成对应的模块名。
set iso_path="${iso_path} locale=zh_CN" 这里是一个小 hack,借着 (loop)/boot/grub/loopback.cfg 没有做好转义,把语言参数注入进去了。
完成之后,Debian 等执行 sudo update-grub,ArchLinux 等执行 sudo grub-mkconfig -o /boot/grub/grub.cfg