揭阳网站建设托管好视通视频会议app下载安装
创建根文件系统涉及选择系统运行所需的文件。在本节中,我们将介绍如何构建压缩的根文件系统。不太常见的选择是在直接作为 root 挂载的本地驱动器上构建未压缩的文件系统。
转载请注明来源,谢谢。构建嵌入式Linux rootfs根文件系统-CSDN博客创建根文件系统涉及选择系统运行所需的文件。在本节中,我们将介绍如何构建压缩的根文件系统。不太常见的选择是在直接作为 root 挂载的本地驱动器上构建未压缩的文件系统。概述根文件系统必须包含支持完整 Linux 系统所需的一切。我们描述了如何构建一个压缩文件系统,之所以这样称呼,是因为它是在磁盘上压缩的,并且在引导时被解压缩到虚拟硬盘上。使用压缩文件系统,您可以将许多文件(大约 6 兆字节)放入标准 RAW 文件上。由于文件系统比FLASH大得多,因此无法在FLASH上构建。https://blog.csdn.net/caoshiying/article/details/133918481
概述
根文件系统必须包含支持完整 Linux 系统所需的一切。为了能够执行此操作,磁盘必须包含 Linux 系统的最低要求:
- 基本文件系统结构
- 最小目录集: /dev 、 /proc 、 /bin /etc /lib /usr /tmp
- 基本的实用程序集: sh 、 ls cp mv 、等
- 最小配置文件集: rc, inittab, fstab 等
- 设备: /dev/hd*, /dev/tty*, /dev/fd0 等
- 运行时库,用于提供实用程序使用的基本功能。
当然,任何系统只有在您可以在其上运行某些内容时才有用,而根ROM通常只有在您可以执行以下操作时才有用:
- 检查另一个驱动器上的文件系统,例如,要检查硬盘驱动器上的根文件系统,您需要能够从另一个驱动器启动 Linux,就像使用根FLASH系统一样。然后,您可以在未挂载的原始根驱动器上运行fsck。
- 使用归档和压缩实用程序(如 cpio 、 tar gzip 和 ftape )从备份恢复全部或部分原始根驱动器。
我们描述了如何构建一个压缩文件系统,之所以这样称呼,是因为它是在磁盘上压缩的,并且在引导时被解压缩到虚拟硬盘上。使用压缩文件系统,您可以将许多文件(大约 6 兆字节)放入标准 RAW 文件上。由于文件系统比FLASH大得多,因此无法在FLASH上构建。我们必须在其他地方构建它,压缩它,然后将其复制到驱动器上。
创建文件系统
为了构建这样的根文件系统,您需要一个足够大的备用设备(硬盘不报警一般都可以),以便在压缩之前容纳所有文件。您将需要一个能够容纳大约4MB的设备。有几种选择:
- 使用虚拟硬盘 (设备 = /dev/ram0 )。在这种情况下,内存用于模拟磁盘驱动器。虚拟硬盘必须足够大,以容纳适当大小的文件系统。如果您使用 LILO,请检查配置文件 ( /etc/lilo.conf ) 中的一行, RAMDISK = nnn 该行决定了可以分配给虚拟硬盘的最大 RAM。默认值为 4096K,这应该足够了。您可能不应该尝试在 RAM 小于 8MB 的机器上使用这样的虚拟硬盘。检查以确保您拥有类似 /dev/ram0, /dev/ram 或 /dev/ramdisk 的设备。如果没有,请使用 mknod(大号 1,小号 0)创建 /dev/ram0 。
- 如果您有足够大(几兆字节)的未使用硬盘分区,这是可以接受的。
- 使用环回设备,它允许将磁盘文件视为设备。使用环回设备,您可以在硬盘上创建一个三兆字节的文件,并在其上构建文件系统。
- 键入 man losetup 以获取有关使用环回设备的说明。如果您没有 losetup,则可以将其与兼容版本的挂载一起获取,并从目录中 ftp://ftp.win.tue.nl/pub/linux/utils/util-linux/ 的 util-linux 包中卸载。
- 如果您的系统上没有循环设备( /dev/loop0 , /dev/loop1 等),则必须使用 ''mknod /dev/loop0 b 7 0'' 创建一个。安装这些特殊的挂载和卸载二进制文件后,在具有足够容量的硬盘上创建一个临时文件(例如, /tmp/fsfile )。您可以使用如下命令:dd if=/dev/zero of=/tmp/fsfile bs=1k count=nnn。以创建 nnn -block 文件。
- 使用文件名代替下面的设备。发出挂载命令时,必须包括指示挂载使用环回设备的选项 -o loop 。
选择这些选项之一后,使用以下命令准备设备:
dd if=/dev/zero of=DEVICE bs=1k count=4096
此命令将设备清零。将设备归零至关重要,因为文件系统稍后将被压缩,因此所有未使用的部分都应用零填充以实现最大压缩。每当移动或删除文件系统上的文件时,请记住这一点。文件系统将正确地取消分配块,但它不会再次将它们清零。如果您执行大量删除和复制操作,则压缩的文件系统最终可能会比必要的大得多。
接下来,创建文件系统。Linux 内核可识别两种文件系统类型,以便根磁盘自动复制到虚拟硬盘。这些是minix和ext2,其中ext2是首选。如果使用 ext2,您可能会发现使用该 -N 选项指定比默认值更多的索引节点很有用; -N 2000 建议这样做,这样您就不会用完索引节点。或者,您可以通过删除大量不必要的 /dev 文件来节省索引节点。默认情况下,mke2fs 将在 16Mb FLASH上创建 360 个索引节点。我发现 120 个 inode 在我当前的救援根ROM上就足够了,但如果将所有设备都包括在内 /dev ,则很容易超过 360 个。使用压缩的根文件系统允许更大的文件系统,因此默认情况下允许更多的索引节点,但您可能仍然需要减少文件数或增加索引节点数。因此,您使用的命令将如下所示:
mke2fs -m 0 -N 2000 DEVICE
如果您使用的是环回设备,则应提供您正在使用的磁盘文件来代替此设备。mke2fs 命令将自动检测可用空间并相应地进行配置。“-m 0” 参数可防止它为 root 保留空间,从而在磁盘上提供更多可用空间。接下来,挂载设备:
mount -t ext2 DEVICE /mnt
如果挂载点尚不存在,则必须创建挂载点 /mnt 。在其余部分中,假定所有目标目录名称都相对于 /mnt 。
填充文件系统文件到ROM
以下是根文件系统 [1] 的一组合理的最小目录集:
- /dev -- 执行 I/O 所需的设备文件
- /proc -- proc 文件系统所需的目录存根
- /etc -- 系统配置文件
- /sbin -- 关键系统二进制文件
- /bin -- 基本二进制文件被视为系统的一部分
- /mnt -- 用于在其他磁盘上进行维护的挂载点
- /usr -- 其他实用程序和应用程序
其中三个目录在根文件系统上为空,因此只需要使用 mkdir 创建它们。该 /proc 目录基本上是一个存根,将 proc 文件系统放置在该存根下。目录 /mnt 和 /usr 只是在引导/根系统运行后使用的挂载点。因此,只需要创建这些目录。
以下各节将介绍其余四个目录。
/dev
对于任何 Linux 系统,都必须有一个目录,其中包含 /dev 系统要使用的所有设备的特殊文件。目录本身是一个普通目录,可以用正常方式创建 mkdir 。但是,必须使用 mknod 命令以特殊方式创建设备特殊文件。
不过,有一个快捷方式 - 从现有硬盘 /dev 目录中复制设备文件。唯一的要求是使用选项复制 -R 设备特殊文件。这将复制目录而不尝试复制文件的内容。请务必使用大写 R 字母。例如:
cp -dpR /dev/fd[01]* /mnt/dev
cp -dpR /dev/tty[0-6] /mnt/dev
假定FLASH安装在 /mnt 上。这些 dp 开关确保将符号链接复制为链接,而不是使用目标文件,并保留原始文件属性,从而保留所有权信息。
如果要以困难的方式执行此操作,请使用 显示 ls -l 所需设备的主要和次要设备编号,并使用 在 mknod FLASH上创建它们。
无论创建设备文件如何,请检查所需的任何特殊设备是否已放置在修复盘上。例如, 使用磁带设备, ftape 因此如果您打算从启动盘访问FLASH磁带机,则需要复制所有这些设备。
请注意,每个设备特殊文件都需要一个索引节点,并且索引节点有时可能是一种稀缺资源,尤其是在FLASH文件系统上。您需要对包含的设备文件进行选择性选择。例如,如果您没有 SCSI 磁盘,则可以安全地忽略 /dev/sd* ;如果您不打算使用串行端口,则可以忽略 /dev/ttyS* 。
如果在构建根文件系统时收到错误 No space left on device ,但 df 命令显示空间仍然可用,则可能已用完索引节点。A df -i 将显示索引节点使用情况。
请确保包含此目录中的以下文件: console 、、 null 、 ram0 kmem mem 和 tty1 。
/etc
/etc 目录包含配置文件。它应该包含的内容取决于您打算运行的程序。在大多数系统上,这些可以分为三组:
- 始终需要,例如、 rc fstab passwd 。
- 可能需要,但没有人太确定。
- 垃圾等无用配置。
非必需的文件通常可以使用以下命令进行识别:
ls -ltru
这将按上次访问日期的相反顺序列出文件,因此,如果未访问任何文件,则可以从根FLASH中省略这些文件。
在我的根FLASH上,我的配置文件数量减少到 15 个。这将我的工作减少到处理三组文件:
- 我必须为引导/根系统配置的那些:
- rc.d/* -- 系统启动和运行级更改脚本
- fstab -- 要挂载的文件系统列表
- inittab -- 初始化进程的参数,第一个进程在引导时启动。
- gettydefs -- 初始化进程的参数,第一个进程在引导时启动。
- 我应该为引导/根系统整理的那些:
- passwd -- 用户、主目录等的关键列表
- group -- 用户组。
- shadow -- 用户密码。你可能没有这个。
- termcap ——终端能力数据库。
如果安全性很重要, passwd shadow 则应进行修剪以避免将用户密码从系统中复制,以便在从FLASH引导时拒绝不需要的登录。
请确保至少 passwd root 包含 .如果您打算其他用户登录,请确保他们的主目录和 shell 存在。
termcap ,即终端数据库,通常为几百 KB。引导/根EEPROM上的版本应向下修剪,以仅包含您使用的终端,通常只是 linux or linux-console 条目。
其余的。他们目前在工作,所以我不理会他们。除此之外,我只需要配置两个文件,它们应该包含的内容非常小。
- rc 应包含:
#!/bin/sh /bin/mount -av /bin/hostname Kangaroo
确保它是可执行的,确保它在顶部有一个“#!”行,并确保任何绝对文件名都是正确的。你真的不需要运行主机名——如果你这样做,它看起来更好。
-
fstab 应至少包含:
/dev/ram0 / ext2 defaults /dev/fd0 / ext2 defaults /proc /proc proc defaults
您可以从现有的 fstab 中复制条目,但不应自动挂载任何硬盘分区;将 noauto 关键字与它们一起使用。使用启动盘时,您的硬盘可能已损坏或损坏。
您应该更改它 inittab ,以便其 sysinit 行运行 rc 或使用任何基本引导脚本。此外,如果要确保串行端口上的用户无法登录,请注释掉行尾包含 ttys or ttyS 设备的所有条目 getty 。保留 tty 端口,以便您可以在控制台登录。
最小 inittab 文件如下所示:
id:2:initdefault:
si::sysinit:/etc/rc
1:2345:respawn:/sbin/getty 9600 tty1
2:23:respawn:/sbin/getty 9600 tty2
该文件 inittab 定义了系统将在各种状态下运行的内容,包括启动、移动到多用户模式等。仔细检查 中 inittab 提到的文件名;如果 init 找不到提到的程序,启动盘将挂起,您甚至可能不会收到错误消息。
请注意,某些程序无法移动到其他位置,因为其他程序已对其位置进行硬编码。例如,在我的系统上, /etc/shutdown 已经硬编码 /etc/reboot 了.如果我移动到 reboot /bin/reboot ,然后发出 shutdown 命令,它将失败,因为它找不到 reboot 该文件。
对于其余部分,只需复制目录中的所有文本文件,以及 /etc /etc 目录中无法确定不需要的所有可执行文件。作为指导,请参阅附录 C 中的示例列表。可能只复制这些文件就足够了,但系统差异很大,因此您无法确定系统上的同一组文件是否等效于列表中的文件。唯一确定的方法是从开始 inittab 并计算出所需的内容。
大多数系统现在使用包含 /etc/rc.d/ 不同运行级别的 shell 脚本的目录。最小值是单个 rc 脚本,但从现有系统中复制 inittab 和 /etc/rc.d 目录可能更简单,并修剪 rc.d 目录中的 shell 脚本以删除EEPROM系统环境无关的处理。
/bin 和 /sbin
该 /bin 目录是一个方便的地方,用于执行基本操作所需的额外实用程序,例如 ls、mv、cat 和 dd。有关 /bin 和 /sbin 目录中的文件的示例列表,请参阅附录 C。它不包括从备份还原所需的任何实用程序,例如cpio,tar和gzip。这是因为我将它们放在单独的实用程序FLASH上,以节省引导/根EEPROM上的空间。引导/根ROM引导后,将其复制到虚拟硬盘,使驱动器空闲以挂载另一张FLASH,即实用程序EEPROM。我通常将其安装为 /usr .
实用程序EEPROM的创建以后写文章描述。可能需要维护用于写入备份的相同版本的备份实用程序的副本,这样您就不会浪费时间尝试安装无法读取备份磁带的版本。
请务必包含以下程序: init 、或等效程序、、、一些能够运行 rc 脚本的 shell、 getty login mount 指向 sh shell 的链接。
/lib
在 /lib 你放置必要的共享库和加载器。如果在 /lib 目录中找不到必要的库,则系统将无法启动。如果幸运的话,您可能会看到一条错误消息,告诉您原因。
几乎每个程序至少都需要 libc 库 libc.so. N,其中 N 是当前版本号。检查您的 /lib 目录。该文件 libc.so.N 通常是指向具有完整版本号的文件名的符号链接:
在这种情况下,您需要 libc-2.1.1.so .要查找其他库,您应该浏览您计划包含的所有二进制文件,并使用 ldd 检查它们的依赖关系。例如:
% ldd /sbin/mke2fs
libext2fs.so.2 => /lib/libext2fs.so.2 (0x40014000)
libcom_err.so.2 => /lib/libcom_err.so.2 (0x40026000)
libuuid.so.1 => /lib/libuuid.so.1 (0x40028000)
libc.so.6 => /lib/libc.so.6 (0x4002c000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
右侧的每个文件都是必需的。该文件可能是符号链接。请注意,有些库非常大,不容易适应您的根文件系统。例如,上面 libc.so 列出的大约是 4 meg。在将库复制到根文件系统时,您可能需要剥离库。
在 中 /lib ,还必须包含库的加载器。加载器将是 ld.so (对于不再常见的 A.OUT 库)或 ld-linux.so (对于 ELF 库)。较新版本的 ldd 会准确地告诉您需要哪个加载器,如上例所示,但旧版本可能不需要。如果不确定需要哪个,请在库上运行 file 命令。例如:
% file /lib/libc.so.4.7.2 /lib/libc.so.5.4.33 /lib/libc-2.1.1.so
/lib/libc.so.4.7.2: Linux/i386 demand-paged executable (QMAGIC), stripped
/lib/libc.so.5.4.33: ELF 32-bit LSB shared object, Intel 80386, version 1, stripped
/lib/libc-2.1.1.so: ELF 32-bit LSB shared object, Intel 80386, version 1, not stripped
指示 QMAGIC 用于 4.7.2 A.OUT 库,指示 ELF 5.4.33 和 2.1.1 用于 ELF。
将所需的特定加载程序复制到要构建的根文件系统。应根据包含的二进制文件仔细检查库和加载程序。如果内核无法加载必要的库,内核可能会挂起并显示没有错误消息。
提供 PAM 和 NSS
您的系统可能需要动态加载的库,而这些库对 不 ldd 可见。如果未提供这些设置,则可能无法登录或使用启动磁盘。
PAM(Pluggable Authentication Modules)(可插拔身份验证模块)
如果您的系统使用 PAM(可插拔身份验证模块),则必须在引导盘上为其进行一些配置。简而言之,PAM 是一种复杂的模块化方法,用于验证用户身份并控制他们对服务的访问。确定系统是否使用 PAM 的一种简单方法是在 login 可执行文件上运行 ldd ;如果输出包括 libpam.so ,则需要 PAM。
幸运的是,启动盘通常与安全性无关,因为任何对计算机具有物理访问权限的人通常都可以做任何他们想做的事情。因此,您可以通过在根文件系统中创建如下所示的简单 /etc/pam.conf 文件来有效地禁用 PAM:
OTHER auth optional /lib/security/pam_permit.so
OTHER account optional /lib/security/pam_permit.so
OTHER password optional /lib/security/pam_permit.so
OTHER session optional /lib/security/pam_permit.so
同时将文件 /lib/security/pam_permit.so 复制到根文件系统。这个库只有大约 8K,所以它施加的开销最小。
此配置允许任何人完全访问您计算机上的文件和服务。如果您出于某种原因关心启动盘的安全性,则必须将部分或全部硬盘的 PAM 设置复制到根文件系统。请务必仔细阅读 PAM 文档,并将所需的 /lib/security 任何库复制到根文件系统中。
您还必须包含在 /lib/libpam.so 启动磁盘上。但是自从您运行 /bin/login ldd 以来,您已经知道这一点,这表明了这种依赖关系。
NSS(Name Service Switch)(名称服务交换机)
如果您使用的是glibc(又名libc6),则必须为名称服务进行配置,否则您将无法登录。该文件 /etc/nsswitch.conf 控制各种服务的数据库查找。如果您不打算从网络访问服务(例如,DNS或NIS查找),则只需准备一个简单的 nsswitch.conf 文件,如下所示:
passwd: files shadow: files group: files hosts: filesservices: filesnetworks: filesprotocols: filesrpc: filesethers: filesnetmasks: files bootparams: filesautomount: files aliases: filesnetgroup: filespublickey: files
这指定每个服务仅由本地文件提供。您还需要包含 /lib/libnss_files.so. X,其中 X 对于 glibc 2.0 为 1,对于 glibc 2.1,为 2。此库将动态加载以处理文件查找。
如果您计划从启动盘访问网络,则可能需要创建一个更详细的 nsswitch.conf 文件。有关详细信息,请参见 nsswitch 手册页。必须为指定的每个服务包含一个文件 /lib/libnss_ 服务 .so.1 。
系统引导模块
如果您有模块化内核,则必须考虑在引导后可能要从引导盘加载哪些模块。如果您的驱动器位于EEPROM上,则可能需要包括 ftape 和 zftape 模块;如果有 SCSI 设备的模块;如果要在紧急情况下访问网络,则可能需要包括用于 PPP 或 SLIP 支持的模块。
这些模块可以放置在 /lib/modules 中。您还应该包括insmod,rmmod和lsmod。根据您是否要自动加载模块,您可能还包括modprobe,depmod和swapout。如果使用内核,请将其与 /etc/conf.modules 一起包含在 中。
但是,使用模块的主要优点是您可以将非关键模块移动到实用程序磁盘并在需要时加载它们,从而使用更少的根磁盘空间。如果您可能需要处理许多不同的设备,这种方法比构建一个内置了许多驱动程序的巨大内核更可取。
为了引导压缩的 ext2 文件系统,您必须内置虚拟硬盘和 ext2 支持。它们不能作为模块提供。
一些最终细节
某些系统程序(如登录)会因为某些文件 /var/run/utmp 和目录 /var/log 不存在出错。所以:
mkdir -p /mnt/var/{log,run}
touch /mnt/var/run/utmp
最后,在设置完所需的所有库后,运行 ldconfig 以在根文件系统上重新制作 /etc/ld.so.cache 。缓存告诉加载程序在哪里可以找到库。您可以使用以下方法执行此操作:
ldconfig -r /mnt
打包发布
构建完根文件系统后,将其卸载,将其复制到文件中并压缩:
umount /mnt
dd if=DEVICE bs=1k | gzip -v9 > rootfs.gz
完成此操作后,您将拥有一个文件 rootfs.gz 。这是您的压缩根文件系统。您应该检查其大小以确保它适合EEPROM;如果没有,您将不得不返回并删除一些文件。减少根文件系统大小的一些建议不是本文重点。
此处提供的目录结构仅供根EEPROM使用。真正的 Linux 系统有一组更复杂、更规范的策略,称为文件系统层次结构标准,用于确定文件应该去哪里。