QEMU:/ bin / sh:无法访问tty;作业控制已关闭

use*_*865 6 linux kernel qemu tty

作为Linux内核的开发环境,我正在使用qemu进行设置,其设置initramfs类似于此处所示,几乎没有其他可执行文件。基本上,它使用busybox创建最小的环境并使用cpio打包。的内容init如下所示。

$ cat init
mount -t proc none /proc
mount -t sysfs none /sys

echo -e "\nBoot took $(cut -d' ' -f1 /proc/uptime) seconds\n"
exec /bin/sh
Run Code Online (Sandbox Code Playgroud)

使用以下命令启动VM:

qemu-system-x86_64 -kernel bzImage -initrd initramfs -append "console=ttyS0" -nographic
Run Code Online (Sandbox Code Playgroud)

它引发以下错误:

/bin/sh: can't access tty; job control turned off
Run Code Online (Sandbox Code Playgroud)

虽然,在大多数情况下,系统功能正常。但是,我无法创建后台进程:

$ prog &
/bin/sh: can't open '/dev/null'
$ fg
/bin/sh: fg: job (null) not created under job control
Run Code Online (Sandbox Code Playgroud)

所有问题的根源似乎都无法获得tty。我怎样才能解决这个问题?

编辑:除了可以接受的答案,cttyhack还可以使用busybox。

$cat init
#!/bin/sh

mount -t proc none /proc
mount -t sysfs none /sys
mknod -m 666 /dev/ttyS0 c 4 64

echo -e "\nBoot took $(cut -d' ' -f1 /proc/uptime) seconds\n"
setsid  cttyhack sh
exec /bin/sh
Run Code Online (Sandbox Code Playgroud)

Ell*_*sch 2

Linux 从头开始​​第 6.8 章。填充 /dev

6.8.1. 创建初始设备节点

当内核引导系统时,它需要存在一些设备节点,特别是控制台和空设备。通过运行以下命令来创建它们:

mknod -m 600 /dev/console c 5 1
mknod -m 666 /dev/null c 1 3
Run Code Online (Sandbox Code Playgroud)

然后,您应该继续执行“6.8.2. 安装 tmpfs 并填充 /dev”中的步骤。请注意<--以下内容,我建议您阅读整个免费的LFS

mount -n -t tmpfs none /dev
mknod -m 622 /dev/console c 5 1
mknod -m 666 /dev/null c 1 3
mknod -m 666 /dev/zero c 1 5
mknod -m 666 /dev/ptmx c 5 2
mknod -m 666 /dev/tty c 5 0 # <--
mknod -m 444 /dev/random c 1 8
mknod -m 444 /dev/urandom c 1 9
chown root:tty /dev/{console,ptmx,tty}
Run Code Online (Sandbox Code Playgroud)

  • 谢谢回复。我一定会读LFS。在这里,我使用 busybox `ctttyhack` 可执行文件作为解决方案。 (2认同)