diff --git a/intro-4.2-iso/intro-iso.md b/intro-4.2-iso/intro-iso.md new file mode 100644 index 0000000..767dfef --- /dev/null +++ b/intro-4.2-iso/intro-iso.md @@ -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操作系统》华清远见嵌入式学院 曹忠明 程姚根 编著 diff --git a/intro-4.2-iso/tool-tree.png b/intro-4.2-iso/tool-tree.png new file mode 100644 index 0000000..3019527 Binary files /dev/null and b/intro-4.2-iso/tool-tree.png differ