[Bug #2480] 4.2的光盘镜像文件介绍

new file:   intro-4.2-iso/intro-iso.md
	new file:   intro-4.2-iso/tool-tree.png

Signed-off-by: Yingchun Zhu <yczhu@linx-info.com>
This commit is contained in:
Yingchun Zhu
2015-10-21 16:17:38 +08:00
parent c3e31db04c
commit ee72f8f19b
2 changed files with 186 additions and 0 deletions

186
intro-4.2-iso/intro-iso.md Normal file
View File

@@ -0,0 +1,186 @@
# linx-6.0.42镜像文件介绍
## 1. 概述
本文档通过介绍rocky6.0.42.41-x86_64-security-20150911.iso镜像文件中所包含的内容介绍linx6.0.42的镜像文件。该文档通过阅读自动出盘工具中的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
```
:zap: 注意:光盘镜像文件(.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的镜像文件以挂载回环设备的方法将其挂载到/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
```
:zap: 注意这里制作镜像文件是在rocky6.0.42.41系统上完成的。
### 2.5 光盘系统的启动过程
为了使光盘可以启动系统,需要在光盘的特定位置上放入启动器(如GRUB)代码。将计算机的BIOS设置为从光驱设备启动BIOS的装载程序将会把光盘特定位置的信息载入内存并执行而这个特定位置中存放了启动器程序。启动器获得计算机的控制权后根据配置或用户的选择将光盘上的Linux内核装载到内存中再载入辅助系统。
启动镜像文件采用Initramfs时直接把文件内容还原到内核的根文件系统中。内核在自身启动完成后运行辅助系统中的/init程序文件内核启动结束。/init要完成以下几项功能
* 测试当前计算机的配置,主要是光驱设备,对光驱进行驱动;
* 查找当前启动光盘所在光驱设备文件并进行挂载;
* 将光盘中的最终系统挂载到内存中,一般是挂载到辅助系统的某个目录;
* 对最终系统进行使用前的处理,如创建必要的文件和目录;
* 将光盘的最终系统切换到根文件系统上,并执行根文件系统中的/sbin/init文件。
/sbin/init将根据/etc/inittab文件的配置来完成系统的启动过程系统启动完成后进入用户操作模式。
## 3. 自动出盘工具运行环境的目录树
这里画出了mk_iso脚本运行时需要的环境(主要是一些目录)和该脚本运行过程中会创建出的目录主要目的是在阅读mk_iso脚本的过程中随时跟此目录树进行对比以便理清脚本工作的过程。通过阅读脚本可以了解镜像文件中的各个目录的都是怎么得来的。
![tool-tree](tool-tree.png)
## 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操作系统》华清远见嵌入式学院 曹忠明 程姚根 编著

BIN
intro-4.2-iso/tool-tree.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 MiB