저는 임베디드 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
문제가 사라집니다!