日期:2014-05-16  浏览次数:20733 次

linux 下制作可启动 img/iso 文件
来源:http://hi.baidu.com/sxpspace/blog/item/840bbd0eda465ecd7bcbe183.html

总的来说,制作镜像文件有三种方法,cp, cat, dd 和其它专用工具。cp ,cat 和 dd都可以从设备复制文件来创建镜像。而 dd 命令更为强大,可以通过指定块大小,块多少来直接创建镜像。

IMG 文件:

因为cp, cat 只能从设备来制作镜像,但又没有专用工具来做 IMG 文件,故这里用 dd 命令来制作 IMG 文件。
1,制作
dd if=/dev/zero of=fdimage.img count=2880
or
dd if=/dev/zero of=fdimage.img bs=1024 count=1440

2,格式化
mkfs.msdos fdimage.img

3,修改
可以用下面的命令 mount 后,可直接修改
mount -o loop *.img /mnt

4,可启动
因为制作可启动镜像一定会用到虚拟机,推荐用 Virtualbox,先到网上下个 DOS 启动盘来引导。用 DOS 的 sys 命令传递系统。推荐使用 FreeDOS,属自由软件。也可用 dd 命令 来传递引导引导信息,并复制启动启动时所需文件来做启动盘。以 FreeDOS 为例,传递启动信息用以下命令,其中下载的启动盘为 balder10.img 文件

dd if=balder10.img of=fdimage.img bs=512 count=1 conv=notrunc

多系统用 grub4dos,

1),用 grub.exe 引导多系统

2),安装 grub 到MBR,用 grldr 来引导多系统。当然也可用同上面一样的办法用 dd 直接写入引导信息。

bootlace.com --floppy --chs 0x00

注:才发现用 dd 命令只能从逻辑扇区开始 copy,先前我想可否用 dd 来将 grldr.mbr 写入 u 盘,我用自己的 U 盘试了,结果不能打开了。因为我的 U 盘为 fat16 格式,逻辑扇区开始是OBR,接着是FAT表,结果把 FAT1 表给盖了,那时还没有想到还有 FAT2 呢,就格了,现在想起来郁闷啊,好多东西都没有了。

为什么软盘可以呢,因为它就没有前面的63个扇区,直接从逻辑0扇区开始的。

ISO 文件:

因为文件系统的关系,就不能用 dd 来直接做 ISO 镜像了(当然,它还是可以从设备制作 ISO 镜像)。 ISO 文件的制作有专用工具,

1,制作
mkisofs -r -o cdimage.iso /home/XXX/cddir

2,格式化
用mkiso制作的 iso 已有文件系统 iso9660

3,可启动
无论是引导单系统还是引导多系统都还是用 mkisofs 这个工具,只是加载到光盘的 boot loader 不一样而已。当然也可以将 DOS 的引导器 (也就是它的引导扇区) 或 windows 的引导器 ( XP 系统的是 ntldr ) 放入让光盘引导。下面只讨论 grub4dos 的使用

1),用 grub.exe 引导多系统
用 DOS 加载 grub.exe 引导多系统

2),将 grub 安装到光盘 MBR
在制作时可用下面的命令直接生成可启动镜像,其中 grldr, menu.lst 要放在 cddir 目录下,也就是在 cd 根目录。
mkisofs -R -b grldr -no-emul-boot -boot-load-seg 0x1000 -o cdimage.iso cddir
mkisofs -R -b grldr -no-emul-boot -boot-load-size 4 -o cdimage.iso cddir


PS,下面给出 dd 命令和 mkisofs 参数说明

dd (convert and copy files)

dd 是 Linux/UNIX 下的一个非常有用的命令,作用是用指定大小的块拷贝一个文件,并在拷贝的同时进行指定的转换。

dd 的主要选项:
指定数字的地方若以下列字符结尾乘以相应的数字:
b=512, c=1, k=1024, w=2, xm=number m

if=file
输入文件名,缺省为标准输入。

of=file
输出文件名,缺省为标准输出。

ibs=bytes
一次读入 bytes 个字节(即一个块大小为 bytes 个字节)。

obs=bytes
一次写 bytes 个字节(即一个块大小为 bytes 个字节)。

bs=bytes
同时设置读写块的大小为 bytes ,可代替 ibs 和 obs 。

cbs=bytes
一次转换 bytes 个字节,即转换缓冲区大小。

skip=blocks
从输入文件开头跳过 blocks 个块后再开始复制。

seek=blocks
从输出文件开头跳过 blocks 个块后再开始复制。(通常只有当输出文件是磁盘或磁带时才有效)

count=blocks
仅拷贝 blocks 个块,块大小等于 ibs 指定的字节数。

conv=conversion[,conversion...]
用指定的参数转换文件。

转换参数:

ascii 转换 EBCDIC 为 ASCII。

ebcdic 转换 ASCII 为 EBCDIC。

ibm 转换 ASCII 为 alternate EBCDIC.

block 把每一行转换为长度为 cbs 的记录,不足部分用空格填充。

unblock
使每一行的长度都为 cbs ,不足部分用空格填充。

lcase 把大写字符转换为小写字符。

ucase 把小写字符转换为大写字符。

swab 交换输入的每对字节。 Unlike the
Unix dd, this works when an odd number of
bytes are read. If the input file contains
an odd number of bytes, the last byte is
simply copied (since there is nothing to
swap it with).

noerror
出错时不停止。

notrunc
不截短输出文件。

sync 把每个输入块填充到ibs个字节,不足部分用空(NUL)字符补齐。

由于 dd 命令允许二进制方式读写,所以特别适合在原始物理设备上进行输入/输出。例如可以用下面的命令为软盘建立镜像文件:
dd if=/dev/fd0 of=disk.img bs=1440k
有趣的是,这个镜像文件能被 HD-Copy ,Winimage 等工具软件读出。再如把第一个硬盘的前 512 个字节存为一个文件:
dd if=/dev/hda of=disk.mbr bs=512 count=1


mkisofs (make iso file system)

功能说明:建立ISO 9660映像文件。

语  法:mkisofs [-adDfhJlLNrRTvz][-print-size][-quiet][-A<应用程序ID>][-abstract <摘要文件>][-b <开机映像文件>][-biblio ][-c<开机文件名称>][-C <盘区编号,磁区编号>][-copyright <版权信息文件>][-hide<目录或文件名>][-hide-joliet <文件或目录名>][-log-file <记录文件>][-m<目录或文件名>][-M <开