自宅に念願のHome Lab環境を手にすることができたので、これまでISPや公共の DNS へ転送していた名前解決を自前で賄える、自宅用 DNS フルサービスリゾルバ (キャッシュ DNS サーバ)を Alpine Linux 仮想マシンと Unbound で構築します。
Alpine Linuxの選定
Docker環境でよく使われるコンパクトなLinuxディストリビューションのAlpine Linuxに用意されているいくつかの仕様の中から、今回はスタンダード版をベースに仮想環境向けにカーネルをスリムダウンしたとされる、ヴァーチャル版を使ってみることにします。
ダウンロードページから、執筆当時最新の3.17.1イメージをダウンロードするのですが、その小ささにびっくり。
1 2 |
$ ls -l ~/Downloads/*.iso -rw-rw-r-- 1 user user 51380224 Jan 18 08:57 alpine-virt-3.17.1-x86_64.iso |
仮想ハードウェア構成
Celeron J4125 ミニPCで構築したVMware ESXi 8.0ホスト上に、新規Linux仮想マシンを作成します。
仮想ハードウェアは、DNS専用機ということもありできる限りミニマルな構成に。
- CPU : 2 Cores
- RAM : 1 GB
- HDD : 2 GB
仮想マシンオプションでは、UEFIセキュアブートをのチェックを外して無効化します。
仮想ディスクは可変長のシンプロビジョニングに、光学ドライブに先ほどダウンロードしたAlpine LinuxのISOファイルをセットして、仮想マシンの作成を確定します。
Alpine Linuxのインストール
作成した仮想マシンのパワーオンをクリックしてインストールを始めます。
起動後すぐにVMware Host Clientのブラウザコンソールに、次のプロンプトメッセージが現れます(ログインはrootでパスワード無し)。
setup-alpine コマンドでインストーラを開始、まずはキーボードレイアウトとロケールの設定です。
続いてホスト名とネットワークインターフェイスの設定です。インストールに際してインターネットへの疎通が必要になる為、サーバ用途なので静的IPを付与したいところですが、まずは無難にDHCPでセットアップを進めます。
さらにrootパスワードやタイムゾーンをテキストベースで設定した後、ソフトウェアパッケージレポジトリのミラーリストから、使いたいミラーソースを選びます。通常は f で最速ミラーを選んでもらえば良いでしょう。
次に普段使う一般ユーザを作成し、SSHも使えるようにしておきました。
最後にインストール先のストレージを選択するのですが、Alpine Linuxの特徴としてここでインストールタイプを選択することができます。
今回は通常用途なので sys モードを選択して進めると、あっという間にインストーラは終わりました。
仮想マシンを再起動させると、セットアップした仮想ディスクからこれまたあっという間に起動が完了しました。
Alpine Linuxの初期設定
まずはブラウザコンソール上でrootでログインしてシステム基本情報を確認。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
# uname -a Linux resolv9 5.15.88-0-virt #1-Alpine SMP Mon, 16 Jan 2023 08:10:32 +0000 x86_64 Linux # df -h Filesystem Size Used Available Use% Mounted on devtmpfs 10.0M 0 10.0M 0% /dev shm 491.6M 0 491.6M 0% /dev/shm /dev/sda3 1.3G 152.9M 1.1G 12% / tmpfs 196.7M 144.0K 196.5M 0% /run /dev/sda1 157.5M 266.0K 157.3M 0% /boot/efi tmpfs 491.6M 0 491.6M 0% /tmp # free -h total used free shared buff/cache available Mem: 983.2M 150.2M 710.6M 144.0K 122.5M 702.1M Swap: 512.0M 0 512.0M # fdisk -l Found valid GPT with protective MBR; using GPT Disk /dev/sda: 4194304 sectors, 2048M Logical sector size: 512 Disk identifier (GUID): bc9951ab-42e0-5f4a-b3e1-40cecc912bb1 Partition table holds up to 128 entries First usable sector is 2048, last usable sector is 4194270 Number Start (sector) End (sector) Size Name 1 2048 329727 160M 2 329728 1378303 512M 3 1378304 4192255 1374M |
この状態で su コマンドは入っているものの、 sudo が入っていないのでこれをまずインストールしたいのですが、sudoパッケージはデフォルトの main レポジトリにはいないので、まず /etc/apk/repositories の community に掛かっているコメントアウトを外して有効にします。
1 2 3 4 5 6 |
#/media/cdrom/apks http://ftp.udx.icscoe.jp/Linux/alpine/v3.17/main http://ftp.udx.icscoe.jp/Linux/alpine/v3.17/community #http://ftp.udx.icscoe.jp/Linux/alpine/edge/main #http://ftp.udx.icscoe.jp/Linux/alpine/edge/community #http://ftp.udx.icscoe.jp/Linux/alpine/edge/testing |
その上でパッケージリストを再取得して sudo をインストールします。
1 2 |
# apk update # apk add sudo |
インストール時に作成したユーザ user を wheel グループに加え、このグループメンバ全員が sudo を使えるように設定します。
1 2 3 4 5 |
# adduser user wheel # echo '%wheel ALL=(ALL) ALL' > /etc/sudoers.d/wheel # cat /etc/sudoers.d/wheel %wheel ALL=(ALL) ALL |
ここからは一般ユーザでSSHから入り直し、続いてopen-vm-toolsをインストールします。
1 2 3 4 5 6 7 8 9 10 |
$ sudo apk update fetch http://ftp.udx.icscoe.jp/Linux/alpine/v3.17/main/x86_64/APKINDEX.tar.gz fetch http://ftp.udx.icscoe.jp/Linux/alpine/v3.17/community/x86_64/APKINDEX.tar.gz v3.17.1-78-g6f0fc1f0e6 [http://ftp.udx.icscoe.jp/Linux/alpine/v3.17/main] v3.17.1-77-g404be299f8 [http://ftp.udx.icscoe.jp/Linux/alpine/v3.17/community] OK: 17813 distinct packages available $ sudo apk add open-vm-tools $ sudo apk add open-vm-tools-guestinfo $ sudo apk add open-vm-tools-deploypkg |
サービスの開始やステータス表示と、システム起動時に自動開始するよう設定する方法を確認。
1 2 3 4 5 6 7 |
$ sudo rc-service open-vm-tools restart * Stopping open-vm-tools ... [ ok ] * Starting open-vm-tools ... [ ok ] $ rc-service open-vm-tools status * status: started $ sudo rc-update add open-vm-tools boot * service open-vm-tools added to runlevel boot |
これでVMware Host Client上に、ゲストシステムの情報が表示されるようになります。
不要なgetty仮想コンソールの削除
/var/log/messages ログを確認していると、ひっきりなしに挙がる仮想コンソール関連のエントリにびっくり。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
Feb 2 08:22:49 resolv9 daemon.info init: starting pid 2593, tty '/dev/ttyS0': '/sbin/getty -L 0 ttyS0 vt100' Feb 2 08:22:49 resolv9 auth.err getty[2593]: tcgetattr: I/O error^M Feb 2 08:22:59 resolv9 daemon.info init: process '/sbin/getty -L 0 ttyS0 vt100' (pid 2593) exited. Scheduling for restart. Feb 2 08:23:00 resolv9 daemon.info init: starting pid 2594, tty '/dev/ttyS0': '/sbin/getty -L 0 ttyS0 vt100' Feb 2 08:23:00 resolv9 auth.err getty[2594]: tcgetattr: I/O error^M Feb 2 08:23:10 resolv9 daemon.info init: process '/sbin/getty -L 0 ttyS0 vt100' (pid 2594) exited. Scheduling for restart. Feb 2 08:23:11 resolv9 daemon.info init: starting pid 2596, tty '/dev/ttyS0': '/sbin/getty -L 0 ttyS0 vt100' Feb 2 08:23:11 resolv9 auth.err getty[2596]: tcgetattr: I/O error^M Feb 2 08:23:21 resolv9 daemon.info init: process '/sbin/getty -L 0 ttyS0 vt100' (pid 2596) exited. Scheduling for restart. Feb 2 08:23:22 resolv9 daemon.info init: starting pid 2597, tty '/dev/ttyS0': '/sbin/getty -L 0 ttyS0 vt100' Feb 2 08:23:22 resolv9 auth.err getty[2597]: tcgetattr: I/O error^M Feb 2 08:23:32 resolv9 daemon.info init: process '/sbin/getty -L 0 ttyS0 vt100' (pid 2597) exited. Scheduling for restart. Feb 2 08:23:33 resolv9 daemon.info init: starting pid 2598, tty '/dev/ttyS0': '/sbin/getty -L 0 ttyS0 vt100' Feb 2 08:23:33 resolv9 auth.err getty[2598]: tcgetattr: I/O error^M Feb 2 08:23:43 resolv9 daemon.info init: process '/sbin/getty -L 0 ttyS0 vt100' (pid 2598) exited. Scheduling for restart. Feb 2 08:23:44 resolv9 daemon.info init: starting pid 2599, tty '/dev/ttyS0': '/sbin/getty -L 0 ttyS0 vt100' Feb 2 08:23:44 resolv9 auth.err getty[2599]: tcgetattr: I/O error^M Feb 2 08:23:54 resolv9 daemon.info init: process '/sbin/getty -L 0 ttyS0 vt100' (pid 2599) exited. Scheduling for restart. Feb 2 08:23:55 resolv9 daemon.info init: starting pid 2600, tty '/dev/ttyS0': '/sbin/getty -L 0 ttyS0 vt100' Feb 2 08:23:55 resolv9 auth.err getty[2600]: tcgetattr: I/O error^M |
プロセスリストを確認すると、そこには仮想コンソールのプロセスがずらりと並んでいました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
Mem: 293668K used, 713176K free, 144K shrd, 36224K buff, 74776K cached CPU: 0% usr 0% sys 0% nic 99% idle 0% io 0% irq 0% sirq Load average: 0.00 0.00 0.00 2/149 3005 PID PPID USER STAT VSZ %VSZ CPU %CPU COMMAND 29219 1 unbound S 36388 4% 1 0% /usr/sbin/unbound -d 2980 2826 user R 1652 0% 1 0% top 29248 1 chrony S 7176 1% 1 0% /usr/sbin/chronyd -f /etc/chrony/chrony.conf 2825 2823 user S 6336 1% 0 0% sshd: user@pts/0 2823 2571 root S 6096 1% 1 0% sshd: user [priv] 2571 1 root S 6088 1% 0 0% sshd: /usr/sbin/sshd [listener] 0 of 10-100 startups 2260 1 root S 5008 0% 0 0% /usr/bin/vmtoolsd 2826 2825 user S 1704 0% 0 0% -ash 2422 1 root S 1628 0% 1 0% /sbin/syslogd -t 2535 1 root S 1624 0% 1 0% /usr/sbin/crond -c /etc/crontabs 1 0 root S 1608 0% 1 0% /sbin/init 2479 1 root S 1608 0% 0 0% /sbin/acpid 2583 1 root S 1608 0% 0 0% /sbin/getty 38400 tty3 2361 1 root S 1608 0% 1 0% /sbin/udhcpc -b -R -p /var/run/udhcpc.eth0.pid -i eth0 -x hostname:resolv9 2587 1 root S 1608 0% 0 0% /sbin/getty 38400 tty4 2578 1 root S 1608 0% 0 0% /sbin/getty 38400 tty1 2579 1 root S 1608 0% 1 0% /sbin/getty 38400 tty2 3005 1 root S 1608 0% 0 0% /sbin/getty -L 0 ttyS0 vt100 2591 1 root S 1608 0% 1 0% /sbin/getty 38400 tty5 2595 1 root S 1608 0% 0 0% /sbin/getty 38400 tty6 445 2 root IW 0 0% 1 0% [kworker/1:2-eve] 30 2 root SWN 0 0% 0 0% [khugepaged] 14 2 root IW 0 0% 1 0% [rcu_sched] 1847 2 root SW 0 0% 1 0% [irq/16-vmwgfx] 1389 2 root SW 0 0% 1 0% [jbd2/sda3-8] 16 2 root IW 0 0% 0 0% [kworker/0:1-eve] 28 2 root SW 0 0% 0 0% [kcompactd0] 477 2 root IW< 0 0% 0 0% [kworker/0:1H-kb] 61 2 root IW< 0 0% 1 0% [kworker/1:1H-kb] 15 2 root SW 0 0% 0 0% [migration/0] 19 2 root SW 0 0% 1 0% [migration/1] 20 2 root SW 0 0% 1 0% [ksoftirqd/1] 13 2 root SW 0 0% 0 0% [ksoftirqd/0] 2 0 root SW 0 0% 0 0% [kthreadd] 2887 2 root IW 0 0% 0 0% [kworker/u4:1-ev] 369 2 root SW 0 0% 0 0% [scsi_eh_31] 2920 2 root IW 0 0% 0 0% [kworker/u4:2-ev] 380 2 root SW 0 0% 1 0% [scsi_eh_32] 118 2 root IW< 0 0% 1 0% [vmw_pvscsi_wq_0] 101 2 root SW 0 0% 1 0% [scsi_eh_0] |
仮想コンソールを使うつもりはないので、 /etc/inittab にある全ての関連設定をコメントアウトしてしまいます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
# /etc/inittab ::sysinit:/sbin/openrc sysinit ::sysinit:/sbin/openrc boot ::wait:/sbin/openrc default # Set up a couple of getty's #tty1::respawn:/sbin/getty 38400 tty1 #tty2::respawn:/sbin/getty 38400 tty2 #tty3::respawn:/sbin/getty 38400 tty3 #tty4::respawn:/sbin/getty 38400 tty4 #tty5::respawn:/sbin/getty 38400 tty5 #tty6::respawn:/sbin/getty 38400 tty6 # Put a getty on the serial port #ttyS0::respawn:/sbin/getty -L ttyS0 115200 vt100 # Stuff to do for the 3-finger salute ::ctrlaltdel:/sbin/reboot # Stuff to do before rebooting ::shutdown:/sbin/openrc shutdown # enable login on alternative console #ttyS0::respawn:/sbin/getty -L 0 ttyS0 vt100 |
通常はシステム起動時に読み込まれるこの設定を再起動せずに即適用するには、現在走っている init のプロセスを殺します。
1 |
$ sudo kill -HUP 1 |
プロセスリストから仮想コンソールが一掃され、ログも平穏になりました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
Mem: 293892K used, 712952K free, 144K shrd, 36228K buff, 74864K cached CPU: 0% usr 0% sys 0% nic 99% idle 0% io 0% irq 0% sirq Load average: 0.00 0.00 0.00 1/141 3048 PID PPID USER STAT VSZ %VSZ CPU %CPU COMMAND 2825 2823 user S 6336 1% 0 0% sshd: user@pts/0 29219 1 unbound S 36444 4% 0 0% /usr/sbin/unbound -d 29248 1 chrony S 7176 1% 1 0% /usr/sbin/chronyd -f /etc/chrony/chrony.conf 2823 2571 root S 6096 1% 1 0% sshd: user [priv] 2571 1 root S 6088 1% 0 0% sshd: /usr/sbin/sshd [listener] 0 of 10-100 startups 2260 1 root S 5008 0% 1 0% /usr/bin/vmtoolsd 2826 2825 user S 1704 0% 1 0% -ash 3048 2826 user R 1648 0% 1 0% top 2422 1 root S 1628 0% 0 0% /sbin/syslogd -t 2535 1 root S 1624 0% 1 0% /usr/sbin/crond -c /etc/crontabs 1 0 root S 1608 0% 1 0% /sbin/init 2361 1 root S 1608 0% 1 0% /sbin/udhcpc -b -R -p /var/run/udhcpc.eth0.pid -i eth0 -x hostname:resolv9 2479 1 root S 1608 0% 0 0% /sbin/acpid 445 2 root IW 0 0% 1 0% [kworker/1:2-eve] 30 2 root SWN 0 0% 0 0% [khugepaged] 14 2 root IW 0 0% 0 0% [rcu_sched] 1847 2 root SW 0 0% 1 0% [irq/16-vmwgfx] 1389 2 root SW 0 0% 1 0% [jbd2/sda3-8] 16 2 root IW 0 0% 0 0% [kworker/0:1-eve] 28 2 root SW 0 0% 0 0% [kcompactd0] 477 2 root IW< 0 0% 0 0% [kworker/0:1H-kb] 61 2 root IW< 0 0% 1 0% [kworker/1:1H-kb] 15 2 root SW 0 0% 0 0% [migration/0] 19 2 root SW 0 0% 1 0% [migration/1] 20 2 root SW 0 0% 1 0% [ksoftirqd/1] 13 2 root SW 0 0% 0 0% [ksoftirqd/0] 2 0 root SW 0 0% 1 0% [kthreadd] 2920 2 root IW 0 0% 0 0% [kworker/u4:2-ev] 369 2 root SW 0 0% 0 0% [scsi_eh_31] 3011 2 root IW 0 0% 0 0% [kworker/u4:0-ev] 380 2 root SW 0 0% 1 0% [scsi_eh_32] 60 2 root SW 0 0% 0 0% [watchdogd] 59 2 root IW< 0 0% 0 0% [md] 57 2 root IW< 0 0% 0 0% [blkcg_punt_bio] 64 2 root IW< 0 0% 1 0% [kthrotld] 101 2 root SW 0 0% 1 0% [scsi_eh_0] 117 2 root IW< 0 0% 1 0% [scsi_tmf_0] 118 2 root IW< 0 0% 1 0% [vmw_pvscsi_wq_0] 120 2 root SW 0 0% 0 0% [scsi_eh_1] 55 2 root IW< 0 0% 0 0% [kintegrityd] |
以上でOSのセットアップは終わったので、次ページはUnboundの導入へ進みます。