Debian Jessie initramfs-tools 이상한 동작

Debian Jessie initramfs-tools 이상한 동작

내 현재 시스템은 다음과 같습니다

$ lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description:    Debian GNU/Linux 8.1 (jessie)
Release:    8.1
Codename:   jessie

커널 포함:

$ uname -a
Linux debian 3.2.0-4-amd64 #1 SMP Debian 3.2.65-1+deb7u2 x86_64 GNU/Linux

새 커널로 업데이트했습니다.

$ sudo apt-get install linux-image-3.16.0-4-amd64
....
Setting up linux-image-3.16.0-4-amd64 (3.16.7-ckt11-1+deb8u2) ...
/etc/kernel/postinst.d/initramfs-tools:
update-initramfs: Generating /boot/initrd.img-3.16.0-4-amd64
/usr/share/initramfs-tools/hooks/fsck: syntax error at line 60: `MNT_FSNAME=$' unexpected
/usr/share/initramfs-tools/hooks/keymap: syntax error at line 57: `value=$' unexpected
/usr/share/initramfs-tools/hooks/resume: syntax error at line 44: `RESUME=$' unexpected
/usr/share/initramfs-tools/hooks/zz-busybox: syntax error at line 33: `$' unexpected
/usr/share/initramfs-tools/scripts/init-premount/plymouth: syntax error at line 19: `$' unexpected
/usr/share/initramfs-tools/scripts/init-top/all_generic_ide: syntax error at line 16: `$' unexpected
....

스크립트에 오류가 있는 것을 확인했습니다 /usr/share/initramfs-tools/hooks/fsck. 확인해보니 #!/bin/sh60행부터 시작하는 것으로 나타났습니다.

MNT_FSNAME=$(resolve_device "$MNT_FSNAME")

글쎄요, 명령 대체 구문에서 오류가 발생했다는 것을 알았습니다. 내 /bin/sh심볼릭 링크는 dash확실히 dash해당 구문을 지원합니다.

내 시스템에도 그런 기능이 있습니다sh 가보 도구 상자에서에 설치되어 /usr/5bin/sh있으며 쉘이 $(...)구문을 지원하지 않습니다. 따라서 스크립트는 /bin/shShebang이 아닌 해당 쉘을 사용하여 실행되는 것으로 보입니다.

이 이상한 동작의 원인은 무엇이며 해결 방법은 무엇입니까?

고쳐 쓰다

/sbin/sh이라는 심볼릭 링크 도 있습니다 /usr/5bin/sh. 이 링크를 삭제한 후 문제가 해결되었습니다. 그래서 initramfs를 업데이트하는 과정에서 /bin/sh.

답변1

그 이유는 initramfs 후크를 실행하는 스크립트 /sbin/sh/bin/sh.

A는 strace다음을 확인할 수 있습니다.

$ strace -fe execve apt-get install linux-image-3.16.0-4-amd64
...
22900 --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=22918, si_status=0, si_utime=0, si_stime=0} ---
22919 execve("/sbin/sh", ["sh", "-n", "/usr/share/initramfs-tools/hooks"...], [/* 40 vars */]) = 0
...

답변2

Linux의 문제는 많은 스크립트에 이식 불가능한 bash 기능이 필요하지만 이를 #! 철사.

"gawk" 대신 "awk"를 호출하지만 gawk 기능에 의존하는 스크립트와 같은 다른 유사한 문제도 있습니다.

일부 스크립트는 GNUism을 사용하여 이식 불가능한 긴 옵션과 같은 유틸리티를 호출합니다.

어떤 사람들은 이것을 Linux의 공급업체 종속이라고 부릅니다. 이런 일이 발생하는 이유는 Linux 설명서 때문일 가능성이 높습니다. Linux 매뉴얼 페이지는 이식 불가능한 "기능"에 대해 언급하지 않으며 사람들에게 이식 가능한 옵션만 사용하도록 권장하지도 않습니다.

쉘로 돌아갑니다. 가보 케이스를 사용하는 것은 실제로 휴대성이 좋지 않기 때문에 전혀 좋은 생각이 아닙니다. 메모리를 할당하기 위해 여전히 malloc() 대신 sbrk()를 사용한다는 사실은 다양한 플랫폼에서 다양한 문제를 야기합니다. 일부 Linux 배포판에는 이와 관련된 숨겨진 문제가 있을 수 있습니다. 예를 들어, 이런 이유로 Cygwin에서는 전혀 작동하지 않습니다. Heirloom 쉘은 SVr4 쉘에서 잘 알려진 버그를 수정하지 않았는데, 이는 반년 만에 개발이 중단되었기 때문인 것으로 보입니다.

가보 쉘이 이식 가능하다면 수동 스크립트 검사(어디서나 실행해야 하는 스크립트)를 위한 테스트 도구로 사용할 수 있습니다. 일상적인 사용을 위해 가보 커버는 올바른 선택이 아닙니다.

참고: 테스트 목적으로 Svr4 Bourne 셸의 휴대용 버전을 선호한다면 Schily 도구 세트에서 "osh"로 컴파일된 Bourne Shell을 권장합니다. Bourne Shell을 매일 사용해보고 싶다면 Schily 도구 세트에서 Bourne Shell "bosh"를 확인해 보시기 바랍니다. 여기에는 첫 번째 기록 편집기가 포함되어 있으므로 사용하려고 할 때마다 비명을 지르지 않을 것입니다.

관련 정보