Chroot

ptys 在 lxc 下不能在 chroot 中工作

  • September 7, 2017

我正在嘗試在 lxc 下使用 chroots 進行開發。我在 lxc 容器配置中啟用了“嵌套”選項,並將掛載的 proc 和 devpts 綁定到我的 chroot 中,就像 chroot 位於普通 Linux 機器上一樣。

不幸的是,當我嘗試在 chroot 中使用需要 ptys 的東西(例如“腳本”命令)時,我得到了類似的錯誤

root@manualdev:~# chroot /chroots/jessie-staging/
root@manualdev:/# script
script: openpty failed: No such file or directory
Terminated
root@manualdev:/#

系統資訊:

  • 主機核心是 4.4.0-79-generic
  • 主機發行版是 Ubuntu xenial
  • 主機架構是arm64
  • 容器發行版是 Debian stretch
  • 容器和 chroot 架構是 armhf
  • Chroot 發行版是 Raspbian(經過 jessie、stretch 和 buster 測試)

解決這個問題(通過有根據的猜測發現)是在 chroot 中執行以下命令。

rm /dev/ptmx
ln -s /dev/pts/ptmx /dev/ptmx

我不是 100% 確定,但我相信需要這樣做的原因是 lxc 正在為 /dev/pts 使用“多實例模式”。根據https://github.com/torvalds/linux/blob/v4.4/Documentation/filesystems/devpts.txt上的文件

如果 CONFIG_DEVPTS_MULTIPLE_INSTANCES=y 並指定了 ’newinstance’ 選項,則認為掛載處於多實例模式並創建 devpts fs 的新實例。在此實例中創建的任何 pty 都獨立於 devpts 的其他實例中的 pty。與單實例模式一樣,存在 /dev/pts/ptmx 節點。為了有效地使用多實例模式,必須使用符號連結或綁定掛載將 /dev/ptmx 的打開重定向到“/dev/pts/ptmx”。

查看該文件的更新版本,似乎更新的核心可能不需要這樣做。

引用自:https://unix.stackexchange.com/questions/390997