lxcでchrootを使用して開発しようとしています。 lxcコンテナ構成で「nested」オプションを有効にし、chrootが通常のLinuxシステムにあるかのようにインストールされたprocとdevptsをchrootにバインドしました。
残念ながら、chrootでptysを必要とするエントリ(「script」コマンドなど)を使用しようとすると、次のエラーが発生します。
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でテスト済み)。
答え1
この問題に対する解決策(トレーニングされた推測によって発見された)は、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は、他のdevptインスタンスのptyから独立しています。シングルインスタンスモードと同様に、/dev/pts/ptmx ノードも存在します。マルチインスタンスモードを効果的に使用するには、シンボリックリンクまたはバインドマウントを使用して/dev/ptmxのオープンを「/dev/pts/ptmx」にリダイレクトする必要があります。
このファイルの更新されたバージョンを見ると、最新のカーネルにはこの機能は必要ないようです。
答え2
擬似端末を管理するdevptsファイルシステムをインストールする必要があります。
魔法命令は次のとおりです。
(root)# mount -t devpts devpts /dev/pts
以下は、疑似端末システムが正常に動作していることを確認するセッションです。
root@e7440:/me/media/20230104a# mount |grep pts # Check, yup no devpts mounted
root@e7440:/me/media/20230104a# ls -lai /dev/pt* # /dev/ptmx exists, but /dev/pts is empty
233300 crw-rw-rw- 1 root root 5, 2 Jan 4 23:07 /dev/ptmx
/dev/pts:
total 8
237675 drwxr-xr-x 2 root root 4096 Jan 4 23:04 .
229757 drwxr-xr-x 4 root root 4096 Jan 3 14:31 ..
root@e7440:/me/media/20230104a# mount -t devpts devpts /dev/pts
root@e7440:/me/media/20230104a# mount |grep pts
devpts on /dev/pts type devpts (rw)
root@e7440:/me/media/20230104a# # Let's test the pty system using the script command.
root@e7440:/me/media/20230104a# # the script command will log the shell to its_alive.txt
root@e7440:/me/media/20230104a# script its_alive.txt
Script started, file is its_alive.txt
root@e7440:/me/media/20230104a# ls -lai /dev/pt* # Now after the mount, things have changed!
233300 crw-rw-rw- 1 root root 5, 2 Jan 4 23:08 /dev/ptmx
/dev/pts:
total 4
1 drwxr-xr-x 2 root root 0 Jan 4 23:08 .
229757 drwxr-xr-x 4 root root 4096 Jan 3 14:31 ..
3 crw------- 1 root root 136, 0 Jan 4 23:08 0
2 c--------- 1 root root 5, 2 Jan 4 23:08 ptmx
root@e7440:/me/media/20230104a# # Note the 0 entry! That's the pty we are using to log this with the script command!
root@e7440:/me/media/20230104a# # Also note it is using inode 3 on the devpts file system instance
root@e7440:/me/media/20230104a# # And that it is a 'c' a character device node.
root@e7440:/me/media/20230104a# mount |grep pts
devpts on /dev/pts type devpts (rw)
root@e7440:/me/media/20230104a# umount /dev/pts # Let's go back to no ptys, but wait ...
umount: /dev/pts: target is busy
(In some cases useful info about processes that
use the device is found by lsof(8) or fuser(1).)
root@e7440:/me/media/20230104a# # Naughty! We're using a pty, so we can't get rid of ptys
root@e7440:/me/media/20230104a# exit # We are leaving the script session so its_alive.txt will get closed.
exit
Script done, file is its_alive.txt
root@e7440:/me/media/20230104a# #### Now we can get rid of ptys entirely as no ptys are in use
root@e7440:/me/media/20230104a# ls -lai /dev/pt*
233300 crw-rw-rw- 1 root root 5, 2 Jan 4 23:09 /dev/ptmx
/dev/pts:
total 4
1 drwxr-xr-x 2 root root 0 Jan 4 23:08 .
229757 drwxr-xr-x 4 root root 4096 Jan 3 14:31 ..
2 c--------- 1 root root 5, 2 Jan 4 23:08 ptmx
root@e7440:/me/media/20230104a# ### See no 0 entry (but the /dev/pts/ptmx is there because devpts is mounted)
root@e7440:/me/media/20230104a# mount |grep pts
devpts on /dev/pts type devpts (rw)
root@e7440:/me/media/20230104a# umount /dev/pts
root@e7440:/me/media/20230104a# mount |grep pts
root@e7440:/me/media/20230104a# ls -lai /dev/pt*
233300 crw-rw-rw- 1 root root 5, 2 Jan 4 23:09 /dev/ptmx
/dev/pts:
total 8
237675 drwxr-xr-x 2 root root 4096 Jan 4 23:04 .
229757 drwxr-xr-x 4 root root 4096 Jan 3 14:31 ..
root@e7440:/me/media/20230104a# # Let's see that our session log exists
root@e7440:/me/media/20230104a# ls -l its*
-rwxr-xr-x 1 root root 1025 Jan 4 23:09 its_alive.txt
root@e7440:/me/media/20230104a# # Let's see the session log contents
root@e7440:/me/media/20230104a# grep -n "^" its_alive.txt #Line numbers, please!
1:Script started on Wed Jan 4 23:08:47 2023
2:root@e7440:/me/media/20230104a# ls -lai /dev/pt*
3:233300 crw-rw-rw- 1 root root 5, 2 Jan 4 23:08 /dev/ptmx
4:
5:/dev/pts:
6:total 4
7: 1 drwxr-xr-x 2 root root 0 Jan 4 23:08 .
8:229757 drwxr-xr-x 4 root root 4096 Jan 3 14:31 ..
9: 3 crw------- 1 root root 136, 0 Jan 4 23:08 0
10: 2 c--------- 1 root root 5, 2 Jan 4 23:08 ptmx
11:root@e7440:/me/media/20230104a# # Note the 0 entry! That's the pty we are using to log this with the script command!
12:root@e7440:/me/media/20230104a# mount |grep pts
13:devpts on /dev/pts type devpts (rw)
14:root@e7440:/me/media/20230104a# umount /dev/pts
15:umount: /dev/pts: target is busy
16: (In some cases useful info about processes that
17: use the device is found by lsof(8) or fuser(1).)
18:root@e7440:/me/media/20230104a# # Naughty! We're using a pty
19:root@e7440:/me/media/20230104a# exit
20:exit
21:
22:Script done on Wed Jan 4 23:09:46 2023
root@e7440:/me/media/20230104a# # Yup, life is good!
源泉:
- https://www.cyberciti.biz/faq/linux-mount-devpts/#:~:text=mount%20-t%20devpts%20devpts%20/dev/pts
- https://en.wikipedia.org/wiki/Devpts
- https://web.archive.org/web/20230105042607/http://faculty.cooper.edu/lent/random/GNU_screen_command.html
- 論文: 仮想端末サービス, 1987, Christopher Lent, Cooper Alliance for the Advancement of Science and the Arts: Albert Nerken School of Engineering