schroot を使った軽量な隔離環境の構築(2)

前回に続き、今回は schroot を使って、ssh server や cron service を動かしていきます。
ssh でログインすることで、隔離されたサーバ環境で作業しているような状況をつくれます。

前回の記事:

schroot 環境構築(前回と同じ)

インストール

# apt install schroot debootstrap

Debian bullseye の root filesystem を取得

# mkdir -p /srv/chroot/bullseye
# debootstrap bullseye /srv/chroot/bullseye

schroot 設定ファイルの編集

filename: /etc/schroot/schroot.conf

[bullseye]
type=directory
description=Debian bullseye
directory=/srv/chroot/bullseye

ホスト側に ssh server インストール

openssh-server をインストールすると sshd ユーザが追加されますが、session をつくりなおすたびに、ホストの /etc/passwd が上書きコピーされて sshd ユーザが消えてしまうため、ホスト側にも openssh-server をインストールしておきます。

# apt install openssh-server

なお、/etc/schroot/default/nssdatabases を修正すれば、/etc/passwd がコピーされないようにすることもできます。

schroot 側に ssh server をインストールして動作確認

schroot 側にも ssh server をインストールして、動作確認を行っていきます。

# schroot -c bullseye
(bullseye)root@ubuntu:~# apt update
(bullseye)root@ubuntu:~# apt install -y openssh-server

port はホスト側とかぶらないように、10022 に変更します。

filename: /etc/ssh/sshd_config

(bullseye)root@ubuntu:/etc/ssh# diff -u sshd_config.orig sshd_config
--- sshd_config.orig	2024-12-31 08:17:43.630675897 +0000
+++ sshd_config	2024-12-31 08:17:53.690792311 +0000
@@ -12,7 +12,7 @@
 
 Include /etc/ssh/sshd_config.d/*.conf
 
-#Port 22
+Port 10022
 #AddressFamily any
 #ListenAddress 0.0.0.0
 #ListenAddress ::

ssh ログイン用のユーザを追加します。(optional)

# adduser test1

ホストの /etc/passwd が schroot 環境側にコピーされるため、ホスト側にユーザを追加しています。


ssh server を起動します。
このとき、schroot のコンソールを抜けないようにします。
background session 化していないため、コンソールを抜けると ssh server のプロセスが終了しまうため。

# schroot -c bullseye
(bullseye)root@ubuntu:~# /etc/init.d/ssh start
Starting OpenBSD Secure Shell server: sshd.

10022 番ポートが開いていれば、サービス起動成功です。

# ss -natpu | grep 10022
tcp   LISTEN 0      128                 0.0.0.0:10022      0.0.0.0:*    users:(("sshd",pid=141367,fd=3))         
tcp   LISTEN 0      128                    [::]:10022         [::]:*    users:(("sshd",pid=141367,fd=4))          

ホスト側から ssh でログインします。

$ ssh localhost -p 10022 -l test1
test1@localhost's password: 
Linux ubuntu 6.8.0-49-generic #49~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Wed Nov  6 17:42:15 UTC 2 x86_64

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Wed Jan  1 14:10:56 2025 from 127.0.0.1
(bullseye)test1@ubuntu:~$ 

これで、automatic session で ssh server 起動の確認ができました。

schroot の backgroud session 構築

続いて、ssh server を background session として動作させていきます。
(ここでは automatic session ではないものを、便宜的に background session と呼んでいます。)

最初に bullseye-session という名前で session を開始します。
-b で session 開始を指示し、-n で session name を指定します。

# schroot -c bullseye -b -n bullseye-session

session を作成した後は、-c で session name を指定し、-r で ssh server を起動します。

# schroot -c bullseye-session -r -- /etc/init.d/ssh start
Starting OpenBSD Secure Shell server: sshd.

これで、ssh server の backgroud session 起動完了です。


再起動後も bullseye-session は残り、startup 時に session の bind mount や file copy が行われます。
一方で、ssh server プロセスは、自動では開始されないため、ここは systemd に startup 登録するなど、ひと工夫必要です。

session を破棄する場合は、-e で終了します。

# schroot -c bullseye-session -e

cron の開始

bullseye-session で cron service を開始します。

# schroot -c bullseye-session -r -- /etc/init.d/cron start

pstree -aps で確認すると、ホスト側の systemd –user 配下にぶらさがる形でプロセスが作成されていました。

# cat /run/schroot/mount/bullseye-session/run/crond.pid
4352
# pstree -aps 4352
systemd,1 splash
  └─systemd,1490 --user
      └─cron,4352
動作確認

1分間隔で適当なテキストを書き込むタスクを登録して動作確認します。

# schroot -c bullseye
# crontab -e
*/1 * * * * date >> /root/log.txt

少しして、ログが書き込まれていたら、cron 動作確認完了です。

(bullseye)root@ubuntu:~# cat log.txt 
Thu Jan  2 05:34:01 UTC 2025
Thu Jan  2 05:35:01 UTC 2025
Thu Jan  2 05:36:01 UTC 2025