【问题标题】:/bin/sh: can't access tty; job control turned off/bin/sh: 无法访问 tty;作业控制已关闭
【发布时间】:2021-06-25 04:17:09
【问题描述】:

我一直在遵循 Chris Simmonds 的“掌握嵌入式 linux 编程”一书中的命令。我已经创建了工具链、内核 zImage 和 busybox 文件系统。当我将这些组合在一起在 QEMU 上运行时,它应该显示一个 root shell 提示符。

当我运行命令时,我得到以下信息。

/bin/sh: can't access tty; job control turned off 
input: ImExPS/2 Generic Explorer Mouse as /devices/platform/amba/amba:fpga/10007000.kmi/serio1/input/input2 

当我按下回车键时,我可以看到 root shell 提示,并且可以执行简单的 shell 命令。

但是,当我按下退出时,我收到以下错误。

Kernel panic - not syncing: Attempted to kill init! exitcode=0x00000000

CPU: 0 PID: 1 Comm: sh Not tainted 4.9.13 #1
Hardware name: ARM-Versatile (Device Tree Support)
[<c001b5a4>] (unwind_backtrace) from [<c0018860>] (show_stack+0x10/0x14)
[<c0018860>] (show_stack) from [<c00737f4>] (panic+0xb8/0x230)
[<c00737f4>] (panic) from [<c0024e24>] (do_exit+0x8e8/0x938)
[<c0024e24>] (do_exit) from [<c0025cf8>] (do_group_exit+0x38/0xb4)
[<c0025cf8>] (do_group_exit) from [<c0025d84>] (__wake_up_parent+0x0/0x18)
---[ end Kernel panic - not syncing: Attempted to kill init! exitcode=0x00000000

我该如何解决这个问题

编辑:

以下是我运行的QEMU命令

QEMU_AUDIO_DRV=none \qemu-system-arm 
-m 256M -nographic 
-M versatilepb 
-kernel ~/linux-4.9.13/arch/arm/boot/zImage 
\-append "console=ttyAMA0,115200 rdinit=/bin/sh" 
-dtb ~/linux-4.9.13/arch/arm/boot/dts/versatile-pb.dtb 
-initrd ~/busybox/initramfs.cpio.gz

【问题讨论】:

  • 改用 Buildroot 发行版。您所做的是实现相同目标的艰难方法,并且据您所知,容易出错。在上面你有两个问题,在某处你禁用了tty,最重要的是你的busybox包含不正确的/etc/inittab。等等,等等……
  • 我正在做一个项目,该项目需要从头开始,而不是使用任何发行版。

标签: linux embedded-linux qemu


【解决方案1】:

(你没有说你的 QEMU 命令行是什么。)

如果您告诉内核直接将 /bin/sh 作为其进程 1 运行(例如,在内核命令行上使用“init=/bin/sh”),这些错误消息通常是您应该预料到的。首先,shell 抱怨它没有 tty,但它仍然可以在禁用某些设施的情况下继续运行。然后,当你最终告诉 shell 退出时,因为 shell 本身是进程 1,内核会抱怨。 (通常进程 1 应该是一个“init”程序,它永远运行并处理启动系统中的其他进程。如果“init”死了,内核就无能为力了。)

如果您打算将 /bin/sh 作为进程 1 运行,那么这一切都很正常。如果您不想这样做,那么您的根文件系统或命令行有问题,这意味着它没有在客户机中正确启动 /sbin/init,您应该看看原因。

【讨论】:

  • 是的,我正在尝试运行 /bin/sh 本身。但是,当我删除 -nographic 参数时,根 shell 不会显示在 qemu 中。 qemu 只显示一个空白屏幕。如何检查 /sbin/init 未在来宾中启动的原因。我对此很陌生,而且很无知
  • 您需要告诉客户内核将其控制台发送到哪里,您还需要告诉 QEMU 将该设备发送到您想读取的任何位置。 “console=ttyAMA0”表示“将控制台发送到串口。”-nographic”告诉 QEMU(除其他外)将串口发送到您的主机终端窗口。根据您在来宾内核中内置的设备,您可以告诉它将控制台输出发送到其他地方,QEMU 有很多命令行选项,可以让你如何引导各种设备输出。但你需要使两者匹配,否则你将看不到任何输出。
  • 对不起,哪两个需要匹配?如果我添加“terminal=ttS0”并删除 -nographic,我可以在 QEMU 窗口中看到引导命令,但看不到 root shell 提示符。
  • 如果你有内核启动日志但没有 root shell 提示,你可能需要修复你的 init 配置文件以在正确的终端上启动一个 tty。我认为在 /etc/inittab 的 sysvinit 和busybox init 中。
猜你喜欢
  • 1970-01-01
  • 2017-05-17
  • 1970-01-01
  • 2011-01-20
  • 2016-03-22
  • 1970-01-01
  • 2011-12-27
  • 2012-06-11
  • 2021-12-21
相关资源
最近更新 更多