任何不工作的相对路径(从 initramfs 运行时)

任何不工作的相对路径(从 initramfs 运行时)

我正在一个嵌入式 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

问题就消失了!

相关内容