如何在Linux系统中制作可启动img/iso镜像文件
制作镜像文件有三种方法,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 个块后再开始复制。
linux内核镜像格式一、Linux内核镜像格式
Linux内核有多种格式的镜像,包括vmlinux、Image、zImage、bzImage、uImage、xipImage、bootpImage等.
(1)kernel镜像格式:vmlinux
vmlinuz是可引导的、可压缩的内核镜像,vm代表Virtual Memory.Linux支持虚拟内存,因此得名vm.它是由用户对内核源码编译得到,实质是elf格式的文件.也就是说,vmlinux是编译出来的最原始的内核文件,未压缩.这种格式的镜像文件多存放在PC机上.
【 attention】elf格式文件
ELF,Executable and Linkable Format,可执行可链接格式,是UNIX实验室作为应用程序二进制接口而发布的,扩展名为elf.可以简单的认为,在elf格式的文件中,除二进制代 码外,还包括该可执行文件的某些信息,比如符号表等.
(2)kernel镜像格式:Image
Image是经过objcopy处理的只包含二进制数据的内核代码,它已经不是elf格式了,但这种格式的内核镜像还没有经过压缩.
【 attention】objcopy
GNU使用工具程序objcopy作用是拷贝一个目标文件的内容到另一个目标文件中,也就是说,可以将一种格式的目标文件转换成另一种格式的目标文件. 通过使用binary作为输出目标(-o binary),可产生一个原始的二进制文件,实质上是将所有的符号和重定位信息都将被抛弃,只剩下二进制数据.
(3)kernel镜像格式:zImage
zImage是ARM linux常用的一种压缩镜像文件,它是由vmlinux加上解压代码经gzip压缩而成,命令格式是#make zImage.这种格式的Linux镜像文件多存放在NAND上.
(4)kernel镜像格式:bzImage
bz表示big zImage,其格式与zImage类似,但采用了不同的压缩算法,注意,bzImage的压缩率更高.
(5)kernel镜像格式:uImage
uImage是uboot专用的镜像文件,它是在zImage之前加上一个长度为0x40的头信息(tag),在头信息内说明了该镜像文件的类型、加载 位置、生成时间、大小等信息.换句话说,若直接从uImage的0x40位置开始执行,则zImage和uImage没有任何区别.命令格式是#make uImage.这种格式的Linux镜像文件多存放在NAND上.
(6)kernel镜像格式:xipImage
这种格式的Linux镜像文件多存放在NorFlash上,且运行时不需要拷贝到内存SDRAM中,可以直接在NorFlash中运行.
二、Linux内核镜像的产生过程
在嵌入式Linux中,内核的启动过程分为两个阶段.其中,第一阶段启动代码放在arch/arm/kernel/head.S文件中,该文件与体系 结果相关,与用户的开发板无关,主要是初始化ARM内核等.第二阶段启动代码是init目录下的main.c.现以执行命令#make zImage为例来说明,arm-linux内核镜像的产生过程.
(1)当用户对Linux内核源码进行编译时,kernel的第1/2阶段代码会生成可执行文件vmlinux,该文件是未被压缩的镜像文件,非常大,不能直接下载到NAND中,通常放在PC机上,这也是最原始的Linux镜像文件.试验时该文件约50M.
(2)镜像文件vmlinux由于很大,肯定不能直接烧入NAND中,因此需要进行二进制化,即经过objcopy处理,使之只包含二进制数据的内核代 码,去除不需要的文件信息等,这样就制作成了image镜像文件.该镜像文件也是未压缩,只是经过了二进制化而变小.试验时该文件约5M.
(3) 一般来说,内存SDRAM中的内核镜像是经过压缩的,只是在运行时再将其解压.所以,编译时会先使用gzip将镜像文件image进行压缩(压缩比约为 2:1),再将压缩后的镜像文件和源码中的两个文件arch/arm/boot/compressed/head.S、arch/arm/boot /compressed/misc.c一起链接生成压缩后的镜像文件compress/vmlinux.试验时该文件约为2.5M.注意,这两个源码文件 是解压程序,用于将内存SDRAM中的压缩镜像zImage进行解压.
(4)压缩后的镜像文件compress/vmlinux经过二进制化,最终生成镜像文件zImage,试验时该文件约为2.5M.当然,在内存 SDRAM中运行压缩镜像文件zImage时,会首先调用两个解压程序arch/arm /boot/compressed/head.S、arch/arm/boot/compressed/misc.c将自身解压,然后再执行kernel 的第一阶段启动代码arch/arm/kernel/head.S.简而言之,在内存中运行内核时,kernel先自身解压,再执行第一阶段启动代码.试 验时运行在内存中的镜像文件约为5M,与image镜像文件大小相同.
(
1、将镜像文件拷贝到linux系统上。
2、执行命令:mount -t iso9660 -o loop /root/xxx.iso /mnt
3、查看/mnt文件夹,即可查看到镜像的文件。
4、卸载:umount /mnt
1. 首先检查当前系统的kernel对NBD模块的支持(NBD:network block device),加载nbd这个module
2. 将qcow2镜像映射为网络块设备(nbd),命令如下:
3. 像普通block设备那样使用刚才映射好的网络块设备的分区即可,命令行如下:
4. 使用完这个qcow2镜像后,卸载已挂载的nbd设备,解除qcow2镜像与nbd设备的关联。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)