動作しない相対パス(initramfsで実行するとき)

動作しない相対パス(initramfsで実行するとき)

私は組み込みLinuxシステムを作業しており、ramで動作しようとしていますinitramfs。システムはほとんどうまく機能しますが、initスクリプトで問題が発生します。問題の範囲を次に絞り込んだ。

システムは相対パスを認識しません。もう少し説明すると...

相対的に位置するファイルを指すシンボリックリンクが壊れるだけでなく、単に次のような単純なコマンドを実行することは機能しません。

$ pwd
/etc/network
$ cat ../inittab
cat: can't open '../inittab': No such file or directory

しかし、これはうまくいきます。

$ cat /etc/inittab
<inittab output ...>

何を期待すべきか知っていますか?

アップデート1

標準ls ..コマンドが期待どおりに動作しているようです。また、inodeの参照は大丈夫に見えますか?

   $ 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。これはディレクトリを埋め、起動時にramfsに拡張され、ルートファイルシステムになる圧縮cpioアーカイブを作成します。カーネルは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コマンドを実行したときに2つの項目が表示されることを確認しました/

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

問題がなくなります!

おすすめ記事