13 KiB
linx6.0.42镜像文件介绍
1. 概述
本文档通过介绍rocky6.0.42.41-x86_64-security-20150911.iso镜像文件中所包含的内容,介绍linx6.0.42的镜像文件。该文档通过阅读自动出盘工具中的mk_iso脚本文件编写而成,这里先假设已经搭建好了自动出盘工具运行所需的环境,然后把自动出盘工具运行所需要的环境(主要是提前创建的各个目录和mk_iso运行过程中创建的目录)通过目录树的形式展现出来,这样可以对自动出盘工具的工作过程更加直观地进行跟踪,在阅读mk_iso脚本时能够知道每个步骤在哪个目录下做什么工作,从而弄清楚光盘环境下的各个目录是什么时候、由谁创建的。
2. 相关概念
2.1 什么是镜像文件
将多种数据或文件以特定的方式存储在同一个文件中,该文件内部一般具有文件系统的特征,这样的文件可被称为镜像文件。
在liunx系统中“一切皆文件”,包括磁盘和磁盘分区都是以文件方式处理的。通过对磁盘分区建立文件系统,分区可被挂载到目录上使用,挂载的对象就是磁盘分区所对应的设备文件;同样,也可以对一个普通文件按照磁盘分区的方式创建文件系统,然后进行挂载。“镜像文件(Image)“就是这类文件的代称。
这里介绍的镜像文件是常见镜像文件中的一种,它使用的文件系统是ISO9660格式,这种文件系统通常用在光盘上,所以这种镜像文件就是光盘的镜像文件,常以“.iso“作为后缀名。
2.2 回环设备(Loop Device)
回环设备是一种将文件模拟成块设备来使用的驱动,通过该驱动的支持,可以将光盘、磁盘中的数据以普通文件的形式存放,并被模拟成光盘或者磁盘来使用。
回环设备也要通过mount命令来挂载。挂载镜像文件时,通过“-o loop“指定文件用回环设备模拟磁盘设备来挂载。
2.3 怎么查看一个镜像文件的内容
要查看镜像文件的内容,首先要将该镜像文件以回环设备的形式进行挂载,以将rocky6.0.42.41-x86_64-security-20150911.iso挂载到/mnt目录为例:
yczhu@Linx:~$ sudo mount -o loop Download/rocky6.0.42.41-x86_64-security-20150911.iso /mnt/
挂载完成之后,以查看目录内容的方式即可浏览该镜像文件中的内容:
yczhu@Linx:~$ ls /mnt/
bin dev hdautoconf lib64 newvar ramdisk root.bak sys usr
boot etc home mnt opt Rocky sbin tag var
cdrom floppy lib newetc proc root share tmp
⚡ 注意:光盘镜像文件(.iso文件)的内容是只读的,不要试图去修改它。
2.4 镜像文件是怎么来的
制作镜像文件可以使用dd命令,使用方法为:
dd if=<输入文件名> of=<输出文件名> bs=<每次读取的大小> count=<读取次数>
其中,if指定的是文件数据的来源,该文件必须是真实存在的;of指定生成的文件名。下面,建立一个全新的文件,用于建立镜像文件,使用命令:
linx:~ # dd if=/dev/zero of=new.img bs=10M count=10
记录了10+0 的读入
记录了10+0 的写出
104857600字节(105 MB)已复制,0.0992505 秒,1.1 GB/秒
该文件将生成一个100M大小的名为new.img的文件,然后可以对该文件建立ext3类型的文件系统,命令为:
linx:~ # mkfs.ext3 new.img
mke2fs 1.41.12 (17-May-2010)
new.img is not a block special device.
无论如何也要继续? (y,n) y
文件系统标签=
操作系统:Linux
块大小=1024 (log=0)
分块大小=1024 (log=0)
Stride=0 blocks, Stripe width=0 blocks
25688 inodes, 102400 blocks
5120 blocks (5.00%) reserved for the super user
第一个数据块=1
Maximum filesystem blocks=67371008
13 block groups
8192 blocks per group, 8192 fragments per group
1976 inodes per group
Superblock backups stored on blocks:
8193, 24577, 40961, 57345, 73729
正在写入inode表: 完成
Creating journal (4096 blocks): 完成
Writing superblocks and filesystem accounting information: 完成
This filesystem will be automatically checked every 36 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.
将生成的镜像文件可以挂载到/mnt目录下,查看其中的内容,命令为:
linx:~ # mount -o loop new.img /mnt/
linx:~ # ls /mnt/
lost+found
使用dd新建镜像文件并不适合所有类型的文件系统,只有块设备的磁盘文件系统才适合使用dd命令。对于光盘的ISO9660的文件系统需要使用专用的命令mkisofs命令。下面创建一个简单的.iso类型的文件。我这里有个名为sg3_utils的目录,把它做成一个.iso文件,可以使用命令:
linx:~ # mkisofs -R -o mylivecd.iso sg3_utils
该命令执行完成,生成一个名为mylivecd.iso的镜像文件,其内部文件系统类型为ISO9660,可通过如下命令查看:
linx:~ # file mylivecd.iso
mylivecd.iso: ISO 9660 CD-ROM filesystem data 'CDROM
以挂载回环设备的方法将其挂载到/mnt目录下,并查看其中的内容:
linx:~ # mount -o loop mylivecd.iso /mnt/
linx:~ # ls /mnt/
Pkgfile sg3_utils-1.41.tar.xz work
Pkgfile~ sg3_utils#1.41-x86_64-linx-Rocky4.2.pkg.tar.gz
⚡ 注意:这里制作镜像文件是在rocky6.0.42.41(2015-09-11)系统上完成的。
2.5 光盘系统的启动过程
为了使光盘可以启动系统,需要在光盘的特定位置上放入启动器(如GRUB)代码。将计算机的BIOS设置为从光驱设备启动,BIOS的装载程序将会把光盘特定位置的信息载入内存并执行,而这个特定位置中存放了启动器程序。启动器获得计算机的控制权后根据配置或用户的选择将光盘上的Linux内核装载到内存中,再载入辅助系统。
启动镜像文件采用Initramfs时,直接把文件内容还原到内核的根文件系统中。内核在自身启动完成后运行辅助系统中的/init程序文件,内核启动结束。/init要完成以下几项功能:
- 测试当前计算机的配置,主要是光驱设备,对光驱进行驱动;
- 查找当前启动光盘所在光驱设备文件并进行挂载;
- 将光盘中的最终系统挂载到内存中,一般是挂载到辅助系统的某个目录;
- 对最终系统进行使用前的处理,如创建必要的文件和目录;
- 将光盘的最终系统切换到根文件系统上,并执行根文件系统中的/sbin/init文件。
/sbin/init将根据/etc/inittab文件的配置来完成系统的启动过程,系统启动完成后进入用户操作模式。
3. 自动出盘工具运行环境的目录树
这里画出了mk_iso脚本运行时需要的环境(主要是一些目录)和该脚本运行过程中会创建出的目录,主要目的是在阅读mk_iso脚本的过程中,随时跟此目录树进行对比,以便理清脚本工作的过程。通过阅读脚本,可以了解镜像文件中的各个目录的都是怎么得来的。

4. 各目录的生成
在阅读mk_iso脚本过程中会注意到,在制作光盘环境时该脚本会通过函数deal_isodate()“按照既定规则从软件包池中获取软件包”,拷贝到.../iso_env/x86_64/packages目录下:
cp $src_dir/$pkg $dest_dir/packages
然后,函数install_envpkgs()中会把该目录下的软件包都解压缩:
for pkg in $iso_env_pkglist
do
tar -C $ISO_DIR -zxf ${ISOENV_WORKDIR}/${ARCH}/packages/$pkg
done
完成这一步后,会在iso_dir目录下创建出软件包解压后会生成的各种目录(比如usr目录),目的是把为下一步“安装光盘环境软件包”作准备:
for pkg in $iso_env_pkglist
do
pkgadd -f ${ISOENV_WORKDIR}/${ARCH}/packages/$pkg --root $ISO_DIR
done
pkgadd -u -f ${ISOENV_WORKDIR}/${ARCH}/packages/glibc#*.pkg.tar.gz --root $ISO_DIR
将软件包以root身份安装到iso_dir目录下,就会生成/bin、/sbin、/dev、/lib、/lib64、/opt和/var等跟通常在磁盘系统的根目录中可见的目录下一样的目录。这是因为,当光盘系统运行起来之后,光盘目录就是运行系统的根目录,所以在镜像文件中见到的这些目录作用与磁盘系统中的目录一样。
光盘镜像文件的作用是启动系统用的,之所以能启动系统是因为有/boot目录,在mk_iso脚本中可见,该目录是从.../iso_env/x86_64/cfg/boot拷贝来的
cp -ar ${ISO_ENV_PATH}/${ARCH}/cfg/boot ${ISO_DIR}/
然后往其中添加额外的.ko文件。该目录中存放了与关盘引导系统相关的所有文件,包括引导器GRUB的配置文件和辅助系统initrd.img等。 系统启动过程中的配置文件存放目录/etc是从.../iso_env/x86/cfg/etc拷贝来的,脚本mk_iso中完成该工作的函数为process_init()其中的代码为:
cp -ar ${ISO_ENV_PATH}/${ARCH}/cfg/etc ${ISO_DIR}/
光盘系统以initrd.img方式提供辅助系统时,会用到内核中的内存磁盘系统,即ramdiskfs,镜像文件中可以看到有一个名为ramdisk的目录,该目录是由mk_iso脚本中的process_ramdisk()函数创建的:
process_ramdisk() {
echo "info: 配置Process ramdisk文件"
pushd .
cd $ISO_DIR
mkdir -vp $ISO_DIR/ramdisk
mkdir -vp $ISO_DIR/newetc
mkdir -vp $ISO_DIR/newvar
... ...
}
可见,该函数同时还创建了newetc目录和newvar目录。
5. 目录的介绍
将镜像文件rocky6.0.42.41-x86_64-security-20150911.iso以块设备的方式挂载到一个目录下,列出其中的内容:
yczhu@Linx:~$ ls rocky/
bin dev hdautoconf lib64 newvar ramdisk root.bak sys usr
boot etc home mnt opt Rocky sbin tag var
cdrom floppy lib newetc proc root share tmp
可以看到,其中的大多数目录与我们硬盘上的系统根目录下的目录相同,我们称之为“常见的目录”;有一部分是我们硬盘上的系统根目录下所没有的,我们称之为”不常见的目录“。下面分成这两类进行介绍:
5.1 常见的目录
bin: 该目录包含二进制文件的可执行程序,许多Linux命令就是放在该目录下的可执行程序,如ls、mkdir、tar等命令;
boot: 该目录存放系统启动时所需的各种文件,如内核的镜像文件,引导加载器使用的文件等;
cdroom: 用来挂载光驱的目录,光盘系统启动后,光驱文件系统将挂载在该目录下;
dev: 该目录下是一些称为设备文件的特殊文件,用于访问系统资源或设备,如软盘、硬盘、系统内存等;
etc: Linux系统的很多配置文件就在该目录下,Linux系统正是靠这些文件才得以正常地运行;
floppy: 用于挂载软盘的目录,现在已经不常用了;
home: 用户主目录的默认位置,系统的所有用户的数据保存在其主目录下;
lib: 标准程序设计库,又称为动态链接共享库;
lib64: 作用与lib一样,不过该目录下是基于64位系统的;
mnt: 该目录用来为其他文件系统提供安装点;
opt: 用于存放一些比较大,也比较独立的软件;
proc: 用于存放Linux内核的PROC文件系统,这个目录是固定的,许多程序会使用该目录中的文件来查询内核的一些状态,需要注意的是,PROC文件系统并不保存在系统的硬盘中,操作系统在内核中创建这一文件系统目录,是虚拟的目录,即系统内存的映射;
root: root用户的主目录;
sbin: 与bin目录类似,存放系统编译后的可执行文件、命令,如常用到的fsck、lsusb等,通常只有root用户才有运行的权限;
sys: 用于存放Linux内核的SYS文件系统,这个目录名是固定的,许多程序会使用该目录中的文件来查询内核的一些状态;
tmp: 用于存放临时文件,该目录可以被任何用户使用;
usr: usr是最庞大的目录,该目录中包含一般不需要修改的命令程序文件、程序库、手册和其他文档等。Linux内核的源代码就放在/usr/src/linux中;
var: 该目录中包含一些经常变化的文件,如,打印机、邮件、新闻等的脱机目录、日志文件,以及临时文件等。
5.2 不常见的目录
hdautoconf: 该目录是由mk_iso中的install_envpkgs()函数创建的,是用于磁盘自动安装的目录;
newetc: 该目录由mk_iso脚本中的process_ramdisk()函数创建,与内存磁盘相关;
newvar: 同上;
ramdisk: 同newvar;
Rocky: 由mk_iso脚本中的preppare_env_dir()函数创建,安装系统时所有用到的软件包都存放在该目录下;
tag: 是一个ASCII文件,记录了光盘的版本号。
6. 参考资料
《手把手教你构建自己的Linux系统》孙海勇 编著
《从实践中学嵌入式Linux操作系统》华清远见嵌入式学院 曹忠明 程姚根 编著