작동하지 않는 상대 경로(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명령을 실행할 때 두 개의 항목이 나타나는 것을 확인했습니다 /.

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

문제가 사라집니다!

관련 정보