私は組み込み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
問題がなくなります!