使用GRUB2引导ISO镜像

首先来说下什么是 GRUB,熟悉 Linux 的同学都应该知道的说.它是一个多重操作系统启动管理器。用来引导不同系统,如 windows,linux。 GRUB2 就是 GRUB 的下一个版本.首先说下 GRUB 的作用吧,当你按下电脑上的电源按钮的时候,这时候电脑会开始加载 BIOS,BIOS 首先检查计算机硬件 能否满足运行的基本条件,这叫做"硬件自检"(Power-On Self-Test).自检完成之后,BIOS 就会把系统控制权转交给下一阶段的启动程序,一般情况下 都会是硬盘,由硬盘启动时,BIOS 通常是转向第一块硬盘的第一个扇区,即主引导记录(MBR).

装载 GRUB 和操作系统的过程,包括以下几个操作步骤:

  1. 装载记录 基本引导装载程序所做的唯一的事情就是装载第二引导装载程序。
  2. 装载 Grub 这第二引导装载程序实际上是引出更高级的功能,以允许用户装载一个特定的操作系统。
  3. 装载系统 如 linux 内核。GRUB 把机器的控制权移交给操作系统。不同的是,微软操作系统都是使用一种称为链式装载的引导方法来启动的,主引导记录仅仅是简单地指向操作系统所在分区的第一个扇区。

这时候就发挥 GRUB2 的作用了,根据不同的选项可以加载不同的操作系统,甚至可以加载 ISO 镜像.我此次折腾 GRUB2 就是为了免去每次安装系统的时候都去使用 DD 刻录镜像的麻烦.然后写下来记录自己的一点成果. 下面就来讲解下如何使用 GRUB2 去引导 ISO 镜像

# 安装 GRUB2 到 U 盘上

准备好一个 U 盘,在 Linux 的操作环境下进行安装,确保自己的系统上已经安装过 GRUB2,如果没安装的话,请自行安装,Arch 下安装 pacman -S grub-bios

  1. 在终端下输入 lsblk 查看你自己的 U 盘是哪个设备,例如我的是 sdc1
  2. 在/mnt 下新建一个文件夹 并挂载上 U 盘 mkdir /mnt/USB && mount /dev/sdc1 /mnt/USB
  3. 安装 GRUB2 到 U 盘上 grub-install --force --no-floppy --root-directory=/mnt/USB /dev/sdc
  4. 这是 GRUB2 应该安装到 U 盘上了,如果 U 盘里没有 boot 文件夹可以直接 copy 系统的 boot 文件夹放进里面即可

# 配置 GRUB2

GRUB2 的配置文件就是 boot/grub/grub.cfg 文件 ##从 Archlinux-x86_64 启动

menuentry "Archlinux-x86_64.iso" --class iso {
  set isofile="/archlinux-2013.04.01-dual.iso"
  loopback loop (hd0,1)$isofile
  linux (loop)/arch/boot/x86_64/vmlinuz archisolabel=ARCH_201304 img_dev=/dev/disk/by-uuid/DB7B-2C3D img_loop=$isofile earlymodules=loop
  initrd (loop)/arch/boot/x86_64/archiso.img
}
1
2
3
4
5
6

添加上面这段代码即可,首先要把 Archlinux 的安装镜像拷贝到 U 盘里面,第二行代码的意思就是设置 isofile 所在的位置,第二行是挂载 iso 镜像 hd(0,1) 的意思是 IDE 硬盘用 hd 表示,这里也可以表示 U 盘,0 表示第一块磁盘,从 0 开始计数.1 代表的是第一块分区,这里是从 1 开始计数.因为 U 盘引导的话第一块磁盘肯定是 U 盘,所以前面的肯定是 0,后面的 1 代表的是分区,如果你的分区是从其它数字开始的就做相应修改.第四行是加载内核,也就是 ios 里面的内核所在路径,archisolabel 代表的 是虚拟挂载的时候的卷标,注意这个一定不能和你现有的硬盘或者 U 盘的卷标重复,否则会出现错误的.img_dev 表示的是镜像所在的设备位置,这里使用 uuid 来表示,因为 uuid 是 U 盘的固有属性,一般不会发生变化(除非你格式化 U 盘),所以保证一定能找到设备.

查看 uuid 的命令是 ls /dev/disk/by-uuid/ -al 查看卷标的命令是 ls /dev/disk/by-label -al initrd 是使用户能够指定一个在引导时可用的初始 RAM 盘。当内核为了完全引导而需要某些模块时,这是必需的。 还有另外一种启动方法

menuentry "Archlinux-x86_64.iso" --class iso {
  set isofile="/archlinux-2013.04.01-dual.iso"
  search -s -f -n /archlinux-2013.04.01-dual.iso
  probe --set=DB7B-2C3D -u $root
  loopback loop /archlinux-2013.04.01-dual.iso
  linux (loop)/arch/boot/x86_64/vmlinuz archisolabel=ARCH_201304 img_dev=/dev/disk/by-uuid/DB7B-2C3D  img_loop=$isofile earlymodules=loop
  initrd (loop)/arch/boot/x86_64/archiso.img
}
1
2
3
4
5
6
7
8

# 从 Archlinux-i686 启动

和上面同理可得

menuentry "Archlinux-i686.iso" --class iso {
  set isofile="/archlinux-2013.04.01-dual.iso"
  loopback loop (hd0,1)$isofile
  linux (loop)/arch/boot/i686/vmlinuz archisolabel=ARCH_201304 img_dev=/dev/disk/by-uuid/DB7B-2C3D img_loop=$isofile earlymodules=loop
  initrd (loop)/arch/boot/i686/archiso.img
}
1
2
3
4
5
6

# 用 GRUB2 启动其它 ISO 镜像

其它 ISO 启动链接 (opens new window)

有关启动 Win 系列的镜像可以参考这个链接启动 win 镜像 (opens new window) 上面链接说明了 GRUB2 使用 ISO 直接启动的原理,GRUB2 只能读取 ISO9660 格式的镜像,只不过 GRUB2 是把 ISO 当作一个虚拟的 CD 罢了. 但是 win7 的安装镜像是 ISO-13346 "UDF"格式的,也就是说 GRUB2 无法读取 Win7 镜像,所以使用 ISO 直接启动 win7 是不可能的事情了.

安徽师范大学校园视频下载器2.0版本发布

安师大的校园视频网是个资源不错但软件坑爹的东西. 当然这个服务不是安师大自己研发的,是由沈阳光音网视科技有限公司开发的,应该是学校出钱购买的吧.不过那个坑爹的客户端只给在线观看不给下载, 网页也是完美的兼容 IE6,Javascript 里面也调用了好多微软自己的 ActiveX 控件,所以只能用学校提供的自带的那个客户端浏览和观看视频.

对于这种反人类的做法我当然是很不爽了,客户端的网址栏虽然是不变的,不过是通过重定向的方式访问学校的服务器了吧,通过修改 hosts 我也可以直接在 IE 浏览器中查看,然后查看源代码进行了分析工作.原理其实很简单,就是通过解析服务器上的 XML 文件进行网页的渲染,XML 文件里面记录了服务器上所有的 视频资源和视频的 ID,然后通过一步步的研究直接找到了资源的下载地址.详细的原理请看我 github 上公开的VideoSeach (opens new window) 里面的 Function.cs 记录了具体解析过程.

通过研究知道了原理便和同学商量这开发个下载器方便大家使用,Win 版本是由同学基于.Net Framework 2.0 开发的,由于我的特殊需求变移植了 web 版本,1.0 版本是在上学期开发并发布的.现在软件使用的用户大概有一万人左右,因为很多学校也用的这个视频服务提供商,我们变提供了配置按钮可以满足 各个学校的需求.不过寒假回来发现下载器不能再下载视频了,我便抽出一晚上时间研究了原因,发现是学校的服务器屏蔽了下载器的功能.手法也很简单使用 User-Agent: Novasoft NetPlayer/4.0 进行屏蔽非官方客户端,知道原因事情就很简单了,伪造 UA 嘛,之前下载器是调用迅雷下载的,现在在里面内置了下载功能.

软件官网: www.icehoney.me (opens new window)

百度云盘下载:Download (opens new window)

关于CSS解决高度自适应和宽度自适应的问题

今天在做一个地图的 web 应用,这是个大坑...首先开始设计首页,于是开始山寨谷歌地图了 =.= 设计出来基本的 div 框架之后,想做到地图界面宽度和高度自动适应浏览器.之前做网站的需求都是固定宽度和高度的.于是我变开始折腾了.

# 自适应宽度

自适应宽度的难处在于网页里有超过两个并列的 div,如果两列都是变宽的话就直接按比例设置就好了,关键在于 1 列需要固定宽度另外一列需要自适应.我遇到的就是后者,具体情况是第一列需 要固定宽度 350px,第二列的宽度是 100%-350px,最简单的方法是设置第二列的宽度是 width: -webkit-calc(100% - 350px);. 但是这个方法的适用性不太好,由于我用的 Archlinux,也不好测试 IE 是否支持,估计是不可能支持的吧. 另外一个方法是设置第一个 div 的属性为 float:left;这样第一列的 div 就脱离整个文档流,第二个 div 直接设置 margin-left: 350px; 即可.

# 自适应高度

自适应高度遇到的问题也是上面有一个固定高度为 142px 的 div,下面的 div 的高度为 100%-142px. 同样可以设置高度为 height: -webkit-calc(100% - 142px);. 另外一种方法是把 div 设置成 position: absolute; 脱离文档流,然后设置 top:142px; bottom:0px; 即可.