最小限のLinuxシステムを使用しています。
initは/bin/bash
であり、/lib/
、/dev/
の最小限のライブラリのみが静的に入力され、デーモンは実行されていません(udevなどはありません)
Bashが起動すると、次のエラーが発生します。
bash: cannot set terminal process group (-1) inappropriate ioctl for device
bash: no job control in this Shell
Straceでbashを開始すると、次の出力が表示されます。
rt_sigprocmask(SIG_BLOCK, NULL, [], 8) = 0
open("/dev/tty", O_RDWR|O_NONBLOCK) = -1 ENXIO (No such device or address)
ioctl(0, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo ...}) = 0
....
readlink("/proc/self/fd/0", "/dev/console"..., 4095) = 12
stat("/dev/console", {st_mode=S_IFCHR|0600, st_rdev=makedev(5, 1), ...}) = 0
open("/dev/console", O_RDWR|O_NONBLOCK) = 3
Bashが/dev/tty
を開けないように見えます。ただし、/dev/tty
は/dev/
に存在し、正しい権限を持っています。
ll /dev/tty*
crw-rw-rwT 1 root root 5, 0 2014-Sep-29 23:39:47 dev/tty
crw------T 1 root root 4, 0 2015-Dec-23 20:10:18 dev/tty0
crw------T 1 root root 4, 1 2015-Dec-23 20:10:18 dev/tty1
bash
を開けないのはなぜですか/dev/tty
?そして、ENXIO
エラーはどういう意味ですか?
initは
/bin/bash
私が https://unix.stackexchange.com/a/197472/5132 で言ったように、init=/bin/sh
は「API」ファイルシステムをマウントせず、1つのタイプがキャッシュフラッシュなしで異常な方法でクラッシュしますexit
( https://unix.stackexchange.com/a/195978/5132 )、そして一般的にはシステムを最低限使用できるようにするアクションを手動で実行する(スーパー)ユーザーに任せます。
それらのアクションの1つ(明らかに、ジョブコントロールシェルを使用したい場合)は、制御端末を取得するです。 /dev/tty
は実際の端末デバイスではありません。これは、開始プロセスの制御端末が何であるかにリダイレクトするデバイスです。それが1つもない場合、プロセス#1は最初から開始されないため(通常、実際のシステムマネージャープログラムが実行されている間は常に)プロセス#1)と同様に、デバイスを開くことができません。
あなたのシステムはtoo最小です。制御端末をセットアップし、適切なセッションを初期化し、おそらく適切かつ完全にシャットダウンするなど、システム管理の最小限の機能を実行するプログラムを実行して、ジョブ制御シェルを実行する必要があります。