我正在一个嵌入式 Linux 系统中工作,试图让它在 ram 中使用initramfs
.系统大部分都能正常运行,但随后初始化脚本出现问题。我已将问题范围缩小到以下范围。
系统无法识别任何相对路径。让我解释更多...
不仅指向相对位置的文件的符号链接被破坏,而且简单地运行这样的简单命令也不起作用:
$ pwd
/etc/network
$ cat ../inittab
cat: can't open '../inittab': No such file or directory
但这工作正常:
$ cat /etc/inittab
<inittab output ...>
知道会发生什么吗?
更新1
标准ls ..
命令似乎按预期运行。另外,我相信索引节点引用看起来还可以吗?
$ ls ..
default/ inputrc moduli random-seed ssh_config sshd_config
dhcp/ issue mtab@ resolv.conf@ ssh_host_dsa_key ssl/
fstab ld.so.conf network/ rsyslog.conf ssh_host_dsa_key.pub sysconfig/
fstab.bak ld.so.conf.d/ nsswitch.conf rsyslog.d/ ssh_host_ecdsa_key ts.conf
group logrotate.conf os-release screenrc* ssh_host_ecdsa_key.pub udev/
hostname logrotate.d/ passwd securetty ssh_host_key
hosts ltrace.conf passwd- services ssh_host_key.pub
init.d/ memstat.conf profile shadow ssh_host_rsa_key
inittab mke2fs.conf protocols shadow- ssh_host_rsa_key.pub
$ cd / ; ls -lid /etc
1547 drwxr-xr-x 12 root root 0 Jan 1 00:49 /etc/
$ cd /etc ; ls -lid .
1547 drwxr-xr-x 12 root root 0 Jan 1 00:49 ./
$ cd /etc/network ; ls -lid ..
1547 drwxr-xr-x 12 root root 0 Jan 1 00:49 ../
经过更多挖掘,我发现只要不跨越文件系统根的“边界”,相对路径就可以工作:
$ cd usr/
$ ls ../etc
ls: ../etc: No such file or directory
$ cd ../etc
$ cd network/
$ ls ..
default/ inputrc moduli random-seed ssh_config sshd_config
dhcp/ issue mtab@ resolv.conf@ ssh_host_dsa_key ssl/
fstab ld.so.conf network/ rsyslog.conf ssh_host_dsa_key.pub sysconfig/
fstab.bak ld.so.conf.d/ nsswitch.conf rsyslog.d/ ssh_host_ecdsa_key ts.conf
group logrotate.conf os-release screenrc* ssh_host_ecdsa_key.pub udev/
hostname logrotate.d/ passwd securetty ssh_host_key
hosts ltrace.conf passwd- services ssh_host_key.pub
init.d/ memstat.conf profile shadow ssh_host_rsa_key
inittab mke2fs.conf protocols shadow- ssh_host_rsa_key.pub
$ ls ../../usr
ls: ../../usr: No such file or directory
这让我相信我没有正确安装根文件系统。也许这个输出是最能说明问题的?
$ df
Filesystem Size Used Available Use% Mounted on
devtmpfs 204.2M 0 204.2M 0% /dev
tmpfs 251.7M 0 251.7M 0% /dev/shm
tmpfs 251.7M 76.0K 251.6M 0% /tmp
更新2
经过额外的搜索,我相信下列最能描述我的情况:
2) 较新的初始 ramfs 映像 initramfs。这里填充一个目录,然后创建一个压缩的 cpio 存档,该存档在启动时扩展到 ramfs 并成为根文件系统。内核必须配置 CONFIG_BLK_DEV_INITRD=y,但不需要设置 CONFIG_BLK_DEV_RAM_SIZE,也不需要设置 CONFIG_TMPFS=y。当系统启动时,“df”不会报告根文件系统,并且无法通过执行“mount --bind / dir”等操作与其进行交互。此外,为文件系统预留的 RAM 和用于进程的 RAM 之间的区别也很模糊。 “df”不报告任何内容,而“free”则不加区别地报告总使用量,即。已用 RAM = 用于文件的 RAM(由“du”报告)加上用于进程的 RAM。
不过,我对此感到有点惊讶。这是否意味着在使用 initramfs 时我将无法与文件系统的根目录进行交互?
更新3
这个帖子表明我想要完成的事情并非不合理:
现在,通常 initramfs 是临时的,仅用于在启动过程的早期运行某些程序。这些程序运行后,控制权将移交给物理磁盘上运行的真实文件系统。但是您不必这样做。没有什么可以阻止您无限期地耗尽 initramfs
如何无限期地用完 initramfs 但又能够“遍历”文件系统的根目录?
答案1
看完之后这个帖子, 问题已经解决了!
我注意到在运行mount
命令时出现了两个条目/
:
rootfs on / type rootfs (rw,relatime)
devtmpfs on /dev type devtmpfs (rw,relatime,size=209064k,nr_inodes=52266,mode=755)
proc on /proc type proc (rw,relatime)
devpts on /dev/pts type devpts (rw,relatime,gid=5,mode=620)
tmpfs on /dev/shm type tmpfs (rw,relatime,mode=777)
tmpfs on /tmp type tmpfs (rw,relatime)
sysfs on /sys type sysfs (rw,relatime)
none on / type tmpfs (rw,relatime)
我在 fstab 中添加了一个需要删除的条目:
# /etc/fstab: static file system information.
#
# <file system> <mount pt> <type> <options> <dump> <pass>
none / tmpfs defaults 0 0
proc /proc proc defaults 0 0
devpts /dev/pts devpts defaults,gid=5,mode=620 0 0
tmpfs /dev/shm tmpfs mode=0777 0 0
tmpfs /tmp tmpfs defaults 0 0
sysfs /sys sysfs defaults 0 0
删除该条目后(并执行重新启动):
none / tmpfs defaults 0 0
问题就消失了!