【问题标题】:QEMU: /bin/sh: can't access tty; job control turned offQEMU: /bin/sh: 无法访问 tty;作业控制已关闭
【发布时间】:2016-04-10 12:43:32
【问题描述】:

作为 linux 内核的开发环境,我使用 qemu 设置 initramfs 与显示的 here 类似,几乎没有额外的可执行文件。基本上,它使用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

使用以下命令启动虚拟机:

qemu-system-x86_64 -kernel bzImage -initrd initramfs -append "console=ttyS0" -nographic

它会抛出以下错误:

/bin/sh: can't access tty; job control turned off

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

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

所有问题的根源似乎是无法访问tty。我该如何解决这个问题?

编辑:除了已接受的答案外,可以使用忙箱的 cttyhack

$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

【问题讨论】:

    标签: linux kernel qemu tty


    【解决方案1】:

    来自Linux From Scratch Chapter 6.8. Populating /dev

    6.8.1。创建初始设备节点

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

    mknod -m 600 /dev/console c 5 1
    mknod -m 666 /dev/null c 1 3
    

    然后您应该继续执行“6.8.2. 挂载 tmpfs 并填充 /dev”中的步骤。注意下面的<--,我建议你阅读整个free 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}
    

    【讨论】:

    • 感谢您的回复。我一定会读 LFS。在这里,我使用了busybox ctttyhack 可执行文件作为解决方法。
    猜你喜欢
    • 2021-06-25
    • 2017-05-17
    • 1970-01-01
    • 2011-01-20
    • 2016-03-22
    • 1970-01-01
    • 2011-12-27
    • 2012-06-11
    • 2021-12-21
    相关资源
    最近更新 更多