FreeBSD (14.0) を VirtualBox にインストールする覚書
環境構築編: 前編 (基本設定から統合デスクトップのインストールまで)

「Oracle VM VirtualBox マネージャー」の画面で、「fb140」が選択された状態で『起動』押す!

● FreeBSD を最新に更新

root でログイン。

freebsd-update fetch を実行する。

(なおこれはインストール後も定期的に行った方が良いもの。 後述)


root@fb140:~ # freebsd-update fetch
Looking up update.FreeBSD.org mirrors... 3 mirrors found.
Fetching public key from update2.freebsd.org... done.
Fetching metadata signature for 14.0-RELEASE from update2.freebsd.org... done.
Fetching metadata index... done.
Fetching 2 metadata files... done.
Inspecting system... done.
Preparing to download files... done.
Fetching 294 patches.....10....20....30....40....50....60....70....80....90....100....110....120....〜....290.. done.
Applying patches... done.
Fetching 2 files... . done.
〜
The following files will be added as part of updating to
14.0-RELEASE-p5:
/usr/src/contrib/tzdata/checknow.awk
/usr/src/contrib/tzdata/zonenow.tab
〜
The following files will be updated as part of updating to
14.0-RELEASE-p5:
〜

ちなみに、ここで uname -a を実行した所、以下のようであった。


root@fb140:~ # uname -a
FreeBSD fb140.magic.or 14.0-RELEASE FreeBSD 14.0-RELEASE #0 releng/14.0-n265380-f9716eee8ab4: Fri Nov 10 05:57:23 UTC 
2023     root@releng1.nyi.freebsd.org:/usr/obj/usr/src/amd64.amd64/sys/GENERIC amd64

また、freebsd-version を実行した所、以下のようであった。


root@fb140:~ # freebsd-version
14.0-RELEASE

次に freebsd-update install を実行する。


root@fb140:~ # freebsd-update install
Installing updates...
Restarting sshd after upgrade
Performing sanity check on sshd configuration.
Stopping sshd.
Performing sanity check on sshd configuration.
Starting sshd.
Scanning /usr/share/certs/untrusted for certificates...
Scanning /usr/share/certs/trusted for certificates...
 done.

今回 kernel に関係しそうな更新も見えており、ここで再起動する。 (あるいはひとしきり作業を続けた後に再起動してもいいだろう)


root@fb140:~ # reboot

再び root でログインし、uname -a を実行した所、今度は以下のようであった。


root@fb140:~ # uname -a
FreeBSD fb140.magic.or 14.0-RELEASE-p5 FreeBSD 14.0-RELEASE-p5 #0: Tue Feb 13 23:37:36 UTC 2024     root@amd64-builder
.daemonology.net:/usr/obj/usr/src/amd64.amd64/sys/GENERIC amd64

また、freebsd-version を実行した所、今度は以下のようであった。


root@fb140:~ # freebsd-version
14.0-RELEASE-p5

● ネットワークインターフェイスの残りを設定

/etc/rc.conf ファイルを編集する。


root@fb140:~ # vi /etc/rc.conf

以下を追記。 (同ファイル内の上の方に似たような行があるのでそれをコピーすると入力の手間を省ける)


ifconfig_em1=""
ifconfig_em1_ipv6="inet6 accept_rtadv"
ifconfig_em2="inet 192.168.56.140 netmask 255.255.255.0"
ifconfig_em2_ipv6="inet6 accept_rtadv"

ここで、em2 に与えた 192.168.56.140 などという固定 IPv4 アドレスについては、em2 には VirtualBox の DHCP サーバがいるのだが、そのアドレス範囲と重複しないように、「ツール」→「ネットワーク(マネージャー)」→「ホストオンリーネットワーク」の「DHCP サーバー」の設定を変更してある。 (初期状態では重複していた)

(変更後)

DHCP after

ここで reboot すると、以下のように IP アドレスが割り当たっていた。 (vtnet0 は未割り当て)


root@fb140:~ # ifconfig -a
em0: flags=1008843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST,LOWER_UP> metric 0 mtu 1500
        options=48505bb<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,JUMBO_MTU,VLAN_HWCSUM,TSO4,LRO,VLAN_HWFILTER,VLAN_HWTSO,HWSTATS,MEXTPG>
        ether 08:00:27:2b:f4:f0
        inet 10.0.2.15 netmask 0xffffff00 broadcast 10.0.2.255
        inet6 fe80::a00:27ff:fe2b:f4f0%em0 prefixlen 64 scopeid 0x1
        media: Ethernet autoselect (1000baseT <full-duplex>)
        status: active
        nd6 options=23<PERFORMNUD,ACCEPT_RTADV,AUTO_LINKLOCAL>
em1: flags=1008843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST,LOWER_UP> metric 0 mtu 1500
        options=48505bb<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,JUMBO_MTU,VLAN_HWCSUM,TSO4,LRO,VLAN_HWFILTER,VLAN_HWTSO,HWSTATS,MEXTPG>
        ether 08:00:27:59:d2:50
        inet6 fe80::a00:27ff:fe59:d250%em1 prefixlen 64 scopeid 0x2
        inet6 〜〜:〜〜:〜〜:〜〜:〜〜:〜〜:〜〜:〜〜 prefixlen 64 autoconf pltime 12600 vltime 14400
        media: Ethernet autoselect (1000baseT <full-duplex>)
        status: active
        nd6 options=23<PERFORMNUD,ACCEPT_RTADV,AUTO_LINKLOCAL>
em2: flags=1008843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST,LOWER_UP> metric 0 mtu 1500
        options=48505bb<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,JUMBO_MTU,VLAN_HWCSUM,TSO4,LRO,VLAN_HWFILTER,VLAN_HWTSO,HWSTATS,MEXTPG>
        ether 08:00:27:25:ae:af
        inet 192.168.56.140 netmask 0xffffff00 broadcast 192.168.56.255
        inet6 fe80::a00:27ff:fe25:aeaf%em2 prefixlen 64 scopeid 0x3
        media: Ethernet autoselect (1000baseT <full-duplex>)
        status: active
        nd6 options=23<PERFORMNUD,ACCEPT_RTADV,AUTO_LINKLOCAL>
vtnet0: flags=1008802<BROADCAST,SIMPLEX,MULTICAST,LOWER_UP> metric 0 mtu 1500
        options=4c07bb<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,JUMBO_MTU,VLAN_HWCSUM,TSO4,TSO6,LRO,VLAN_HWTSO,LINKSTATE,TXCSUM_IPV6>
        ether 08:00:27:b5:bf:49
        media: Ethernet autoselect (10Gbase-T <full-duplex>)
        status: active
        nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>
lo0: flags=1008049<UP,LOOPBACK,RUNNING,MULTICAST,LOWER_UP> metric 0 mtu 16384
        options=680003<RXCSUM,TXCSUM,LINKSTATE,RXCSUM_IPV6,TXCSUM_IPV6>
        inet 127.0.0.1 netmask 0xff000000
        inet6 ::1 prefixlen 128
        inet6 fe80::1%lo0 prefixlen 64 scopeid 0x5
        groups: lo
        nd6 options=21<PERFORMNUD,AUTO_LINKLOCAL>

● /tmp を Memory Disk に

これは必須ではないが、高速化を図るため、設定してみる。

まず、/tmp に何か存在していたので、以下のようにして全て削除しておいた。


root@fb140:~ # cd /tmp

root@fb140:/tmp # ls -lA
total 16
drwxrwxrwt  2 root wheel 512 Mar  2 16:36 .ICE-unix
drwxrwxrwt  2 root wheel 512 Mar  2 16:36 .X11-unix
drwxrwxrwt  2 root wheel 512 Mar  2 16:36 .XIM-unix
drwxrwxrwt  2 root wheel 512 Mar  2 16:36 .font-unix

root@fb140:/tmp # rmdir .*-unix

root@fb140:/tmp # ls -lA
total 0

/etc/rc.conf に追記するために、まずは以下のようにする。


root@fb140:/tmp # egrep ^tmp /etc/defaults/rc.conf >> /etc/rc.conf

(「>>」で追記する。 くれぐれも間違って「>」で上書きしないように注意する。)

次に


root@fb140:/tmp # vi /etc/rc.conf

追記した部分が以下などのようになるように編集。


tmpmfs="YES"            # Set to YES to always create an mfs /tmp, NO to never
tmpsize="7g"            # Size of mfs /tmp if created

tmpsize を 7GB (7g) にしているのは、これくらいないと ports のコンパイル (後述) で /tmp が溢れた記憶がある。
(ちなみに NetBSD のインストーラではメモリーサイズの 25% がデフォルトのようだ)

ここで reboot すると、/tmp が正しく Memory Disk になっていた。


root@fb140:~ # df -h
Filesystem     Size    Used   Avail Capacity  Mounted on
/dev/ada0p2    4.8G    3.2G    1.3G    72%    /
devfs          1.0K      0B    1.0K     0%    /dev
/dev/ada0p4    2.9G    553M    2.1G    20%    /var
tmpfs          7.0G    4.0K    7.0G     0%    /tmp

root@fb140:~ # ls -la /tmp
total 4
drwxrwxrwt   6 root wheel  256 Mar  2 16:59 .
drwxr-xr-x  20 root wheel 1024 Mar  2 16:58 ..
drwxrwxrwt   2 root wheel    0 Mar  2 16:59 .ICE-unix
drwxrwxrwt   2 root wheel    0 Mar  2 16:59 .X11-unix
drwxrwxrwt   2 root wheel    0 Mar  2 16:59 .XIM-unix
drwxrwxrwt   2 root wheel    0 Mar  2 16:59 .font-unix

● /etc/hosts の設定

少し筆者の環境に特有の話である。

現在の /etc/hosts の内容を一応バックアップしておき..


root@fb140:~ # cd /etc

root@fb140:/etc # ls -ld hosts*
-rw-r--r--  1 root wheel 1035 Nov 10 16:55 hosts
-rw-r--r--  1 root wheel 3385 Nov 10 17:06 hosts.allow
-rw-r--r--  1 root wheel   41 Nov 10 16:55 hosts.equiv
-rw-r--r--  1 root wheel   31 Nov 10 17:46 hosts.lpd

root@fb140:/etc # cp -ip hosts hosts.ORIG

筆者の旧環境 (fb130 というもの) の /etc/hosts (様々なホストの IP アドレスが書かれている) を scp してきて..


root@fb140:/etc # cd

root@fb140:~ # scp -p nsmrtks@192.168.56.130:/etc/hosts .
〜

root@fb140:~ # ls -ld hosts
-rw-r--r--  1 root wheel 5762 Feb 17 22:36 hosts

fb140 (即ちこの新環境) の /etc/hosts と結合して、重複を調整しつつ..


root@fb140:~ # cat hosts >> /etc/hosts

root@fb140:~ # vi /etc/hosts

fb140 の IPv6 アドレス (リンクローカルアドレス) も以下のように追加しておいた。


fe80::a00:27ff:fe25:aeaf%em2            fb140.magic.or  fb140           fb140c

先ほども scp してみせた通り、同じホスト上の VirtualBox の仮想マシンどうしは、「ホストオンリーアダプター」を通して通信できる。 それは、これまでの経緯により、fb140 においては 仮想マシンの作成 時に「アダプター3」として割り当てており、em2 として見えている。


root@fb140:~ # ifconfig em2
em2: flags=1008843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST,LOWER_UP> metric 0 mtu 1500
        options=48505bb<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,JUMBO_MTU,VLAN_HWCSUM,TSO4,LRO,VLAN_HWFILTER,VLAN_HWTSO,HWSTATS,MEXTPG>
        ether 08:00:27:25:ae:af
        inet 192.168.56.140 netmask 0xffffff00 broadcast 192.168.56.255
        inet6 fe80::a00:27ff:fe25:aeaf%em2 prefixlen 64 scopeid 0x3
        media: Ethernet autoselect (1000baseT <full-duplex>)
        status: active
        nd6 options=23<PERFORMNUD,ACCEPT_RTADV,AUTO_LINKLOCAL>

筆者の旧環境 (fb130) の、(リンクローカル) IPv6 アドレスを /etc/hosts に記述したので、そのホスト名で通信できることを確認。


root@fb140:~ # ping6 fb130c
PING6(56=40+8+8 bytes) fe80::a00:27ff:fe25:aeaf%em2 --> fe80::a00:27ff:fe55:ac0c%em2
16 bytes from fe80::a00:27ff:fe55:ac0c%em2, icmp_seq=0 hlim=64 time=1.053 ms
^C
--- fb130.magic.or ping6 statistics ---
1 packets transmitted, 1 packets received, 0.0% packet loss
round-trip min/avg/max/std-dev = 1.053/1.053/1.053/0.000 ms

● ZFS の設定

/usr/ports と、/usr/local と、/home/nsmrtks というもの (ホームディレクトリ) を、ZFS 上に置くことにする。

ただし、/home/nsmrtks というディレクトリは既に存在しているので、リネームして一応バックアップしておく。


root@fb140:~ # cd /home

root@fb140:/home # ls -lA
total 4
drwxr-xr-x  2 nsmrtks nsmrtks 512 Feb 24 23:21 nsmrtks

root@fb140:/home # mv -i nsmrtks nsmrtks.BACK

そして、


root@fb140:/home # cd

root@fb140:~ # df -h
Filesystem     Size    Used   Avail Capacity  Mounted on
/dev/ada0p2    4.8G    3.2G    1.3G    72%    /
devfs          1.0K      0B    1.0K     0%    /dev
/dev/ada0p4    2.9G    553M    2.1G    20%    /var
tmpfs          7.0G    4.0K    7.0G     0%    /tmp

root@fb140:~ # gpart show
=>      40  83886000  ada0  GPT  (40G)
        40      1024     1  freebsd-boot  (512K)
      1064  10485760     2  freebsd-ufs  (5.0G)
  10486824  16777216     3  freebsd-swap  (8.0G)
  27264040   6291456     4  freebsd-ufs  (3.0G)
  33555496  50330544     5  freebsd-zfs  (24G)

上記に見えるように、ZFS 用に用意したパーティションが ada0p5 であることを確認した。 (gpart show で、freebsd-zfs の行が、ada0 の列が 5 になっており、GPT の場合は「p」が間にはさまるようだ。)

zpool create を実行する。 プール名は「zfs」としておいた


root@fb140:~ # zpool create zfs ada0p5
ZFS filesystem version: 5
ZFS storage pool version: features support (5000)

次に zfs create で、/usr/ports 用と /usr/local 用と /home/nsmrtks 用のファイルシステムを作成する。
mountpoint も同時に設定することにする。 (以前は /usr/local を、mountpoint にする代わりに、シンボリックリンクにしていたが、ports のビルドが正常にいかないことがあることが分かった。)
また zfs set で compression=lz4 (圧縮) を指定しておく。


root@fb140:~ # zfs create -o mountpoint=/usr/ports zfs/ports

root@fb140:~ # zfs set compression=lz4 zfs/ports

root@fb140:~ # zfs create -o mountpoint=/usr/local zfs/local

root@fb140:~ # zfs set compression=lz4 zfs/local

root@fb140:~ # zfs create -o mountpoint=/home/nsmrtks zfs/nsmrtks

root@fb140:~ # zfs set compression=lz4 zfs/nsmrtks

root@fb140:~ # df -h
Filesystem     Size    Used   Avail Capacity  Mounted on
/dev/ada0p2    4.8G    3.2G    1.3G    72%    /
devfs          1.0K      0B    1.0K     0%    /dev
/dev/ada0p4    2.9G    553M    2.1G    20%    /var
tmpfs          7.0G    4.0K    7.0G     0%    /tmp
zfs             23G     24K     23G     0%    /zfs
zfs/ports       23G     24K     23G     0%    /usr/ports
zfs/local       23G     24K     23G     0%    /usr/local
zfs/nsmrtks     23G     24K     23G     0%    /home/nsmrtks

起動時に ZFS が自動的にマウントされるように、/etc/rc.conf に設定しておく。


root@fb140:~ # egrep zfs_enable /etc/defaults/rc.conf >> /etc/rc.conf

root@fb140:~ # vi /etc/rc.conf

/etc/rc.conf の追加行が以下のようになるように編集する。


zfs_enable="YES"        # Set to YES to automatically mount ZFS file systems

/usr/ports のオーナーも設定しておく。


root@fb140:~ # cd /usr

root@fb140:/usr # ls -ld ports
drwxr-xr-x  2 root wheel 2 Mar  2 18:46 ports

root@fb140:/usr # chown nsmrtks ports

root@fb140:/usr # ls -ld ports
drwxr-xr-x  2 nsmrtks wheel 2 Mar  2 18:46 ports

ここで reboot すると、ZFS が自動的にマウントされていた。


root@fb140:~ # df -h
Filesystem     Size    Used   Avail Capacity  Mounted on
/dev/ada0p2    4.8G    3.2G    1.3G    72%    /
devfs          1.0K      0B    1.0K     0%    /dev
/dev/ada0p4    2.9G    553M    2.1G    20%    /var
tmpfs          7.0G    4.0K    7.0G     0%    /tmp
zfs/ports       23G     24K     23G     0%    /usr/ports
zfs/local       23G     24K     23G     0%    /usr/local
zfs/nsmrtks     23G     24K     23G     0%    /home/nsmrtks
zfs             23G     24K     23G     0%    /zfs

/home/nsmrtks のオーナーを設定するのを忘れていた。 設定しておく。


root@fb140:~ # ls -l /home
total 5
drwxr-xr-x  2 root    wheel     2 Mar  2 18:47 nsmrtks
drwxr-xr-x  2 nsmrtks nsmrtks 512 Feb 24 23:21 nsmrtks.BACK

root@fb140:~ # chown nsmrtks:nsmrtks /home/nsmrtks

root@fb140:~ # ls -l /home
total 5
drwxr-xr-x  2 nsmrtks nsmrtks   2 Mar  2 18:47 nsmrtks
drwxr-xr-x  2 nsmrtks nsmrtks 512 Feb 24 23:21 nsmrtks.BACK

● /usr/posts/distfiles のディスクをマウント

これも筆者の環境だけかもしれない。

筆者は、/usr/ports/distfiles (ports でビルドを行う時に取得してきたファイルが置かれる場所) を、VirtualBox の仮想ディスクごと分離している。
そして、旧環境から新環境へ移行する際には、(内容を残したまま) マウントを付け替えてきた。

ただし、最近サイズが手狭になってきたので、今回は付け替えるのではなく、よりサイズが大きなものを新規に作成する。

いったん fb140 仮想マシンを電源 OFF (shutdown -p now) する。

そうしたら、「Oracle VM VirtualBox マネージャー」の画面で「fb140」を選択し『設定』→『ストレージ』へと進む。

storage

下の方の「◆」に「+」のアイコン (「コントローラーを追加」) を押し、「LsiLogic SAS (SAS)」を選択する。 (SAS にしなくてもよいが深い理由はない)

SAS added

「コントローラー: LsiLogic SAS」が追加された。

さらに、「コントローラー: LsiLogic SAS」の右側の方にある「■」に「+」のようなアイコン (「ハードディスクの追加」) を選択し..

attach (create) virtual disk

『作成』を押す。

create virtual disk

「VDI (VirtualBox Disk Image)」が選択されたままにしておき『次へ』押す。

allocate whole size

「全サイズの事前割当て」にチェックを入れてみる。 『次へ』押す。

allocate whole size

ファイルの場所とファイル名について、fb140 のディレクトリの上、「VirtualBox VMs」の直下に、distfiles20.vdi というファイルとして作成するようにする。
サイズを (16.00 GB になっていたが)「20.00 GB」とする。

しばらく時間がかかって、「Not Attached」の所に distfiles20.vdi が付いた。

distfiles20.vdi Not Attached

distfiles20.vdi にカーソルが当たったまま、『選択』押す。

「コントローラー: LsiLogic SAS」配下に distfiles20.vdi が現れた。

virtual disk attached

忘れずに「OK」押す。

さて、fb140 を再び起動する。
追加した仮想ハードディスクは以下のように見えている。 (起動時に表示される他 dmesg コマンドでも後から確認できる)


〜
da0 at mpt0 bus 0 scbus2 target 0 lun 0
da0: <VBOX HARDDISK 1.0> Fixed Direct Access SPC-3 SCSI device
da0: 300.000MB/s transfers
da0: Command Queueing enabled
da0: 20480MB (41943040 512 byte sectors)
〜

これを、/home/distfiles というディレクトリにマウントすることとし、/usr/ports/distfiles からシンボリックリンクを張ることとする。
(なぜ /usr/ports/distfiles に直接マウントしないかというと、/home/ の下の distfiles/ を NFS エクスポートしたいという事情がある。)

ディレクトリの作成を行う。


root@fb140:~ # mkdir /home/distfiles

root@fb140:~ # chown nsmrtks /home/distfiles

root@fb140:~ # ls -l /home
total 9
drwxr-xr-x  2 nsmrtks wheel   512 Mar  2 20:40 distfiles
drwxr-xr-x  2 nsmrtks nsmrtks   2 Mar  2 18:47 nsmrtks
drwxr-xr-x  2 nsmrtks nsmrtks 512 Feb 24 23:21 nsmrtks.BACK
後日気づいたが、上でやっている chown は、mount すると無意味なようだ。 (後述)

今回、まっさらの仮想ディスクなので、GPT の作成からパーティションの作成にファイルシステムの newfs まで必要である。

まず GPT の作成。


root@fb140:~ # gpart show da0
gpart: No such geom: da0.

root@fb140:~ # gpart create -s gpt da0
da0 created

root@fb140:~ # gpart show da0
=>      40  41942960  da0  GPT  (20G)
        40  41942960       - free -  (20G)

root@fb140:~ # gpart show
=>      40  83886000  ada0  GPT  (40G)
        40      1024     1  freebsd-boot  (512K)
      1064  10485760     2  freebsd-ufs  (5.0G)
  10486824  16777216     3  freebsd-swap  (8.0G)
  27264040   6291456     4  freebsd-ufs  (3.0G)
  33555496  50330544     5  freebsd-zfs  (24G)

=>      40  41942960  da0  GPT  (20G)
        40  41942960       - free -  (20G)

パーティション (freebsd-ufs) の作成。


root@fb140:~ # gpart add -t freebsd-ufs da0
da0p1 added

root@fb140:~ # gpart show
=>      40  83886000  ada0  GPT  (40G)
        40      1024     1  freebsd-boot  (512K)
      1064  10485760     2  freebsd-ufs  (5.0G)
  10486824  16777216     3  freebsd-swap  (8.0G)
  27264040   6291456     4  freebsd-ufs  (3.0G)
  33555496  50330544     5  freebsd-zfs  (24G)

=>      40  41942960  da0  GPT  (20G)
        40  41942960    1  freebsd-ufs  (20G)

そして newfs (ファイルシステムの作成)。 (このオプションで合ってるかな..)


root@fb140:~ # newfs -U -j da0p1
/dev/da0p1: 20480.0MB (41942960 sectors) block size 32768, fragment size 4096
        using 33 cylinder groups of 625.22MB, 20007 blks, 80128 inodes.
        with soft updates
super-block backups (for fsck_ffs -b #) at:
 192, 1280640, 2561088, 3841536, 5121984, 6402432, 7682880, 8963328, 10243776,
 11524224, 12804672, 14085120, 15365568, 16646016, 17926464, 19206912,
 20487360, 21767808, 23048256, 24328704, 25609152, 26889600, 28170048,
 29450496, 30730944, 32011392, 33291840, 34572288, 35852736, 37133184,
 38413632, 39694080, 40974528
Using inode 4 in cg 0 for 167772160 byte journal
newfs: soft updates journaling set

vi /etc/fstab で、以下を /etc/fstab に追記した。


/dev/da0p1      /home/distfiles ufs     rw      2       2

シンボリックリンクの作成をここで行った。


root@fb140:~ # cd /usr/ports

root@fb140:/usr/ports # ls -ld distfiles
ls: distfiles: No such file or directory

root@fb140:/usr/ports # ln -s /home/distfiles

root@fb140:/usr/ports # ls -ld distfiles
lrwxr-xr-x  1 root wheel 15 Mar  2 20:52 distfiles -> /home/distfiles
ports の取得時に障害となってしまったので、このシンボリックリンクは後の方で一旦削除して再作成している。(後述)

mount する。 (シンボリックリンクを作成したので /usr/ports/distfiles が見えることも確認している)


root@fb140:/usr/ports # mount /home/distfiles

root@fb140:/usr/ports # ls -a distfiles
.               ..              .snap           .sujournal

root@fb140:/usr/ports # df -h
Filesystem     Size    Used   Avail Capacity  Mounted on
/dev/ada0p2    4.8G    3.2G    1.3G    72%    /
devfs          1.0K      0B    1.0K     0%    /dev
/dev/ada0p4    2.9G    553M    2.1G    20%    /var
tmpfs          7.0G    4.0K    7.0G     0%    /tmp
zfs/nsmrtks     23G     24K     23G     0%    /home/nsmrtks
zfs/ports       23G     24K     23G     0%    /usr/ports
zfs             23G     24K     23G     0%    /zfs
zfs/local       23G     24K     23G     0%    /usr/local
/dev/da0p1      19G    160M     18G     1%    /home/distfiles

root@fb140:/usr/ports # mount
/dev/ada0p2 on / (ufs, local, soft-updates, journaled soft-updates)
devfs on /dev (devfs)
/dev/ada0p4 on /var (ufs, local, soft-updates, journaled soft-updates)
tmpfs on /tmp (tmpfs, local)
zfs/nsmrtks on /home/nsmrtks (zfs, local, nfsv4acls)
zfs/ports on /usr/ports (zfs, local, nfsv4acls)
zfs on /zfs (zfs, local, nfsv4acls)
zfs/local on /usr/local (zfs, local, nfsv4acls)
/dev/da0p1 on /home/distfiles (ufs, local, soft-updates, journaled soft-updates)

後日気づいたが、先ほど /home/distfiles に対して実行した chown は、mount すると無意味なようだ (root:wheel のディレクトリになってしまっていた)。
そこで、mount した後に、あらためて chown nsmrtks:nsmrtks /home/distfiles を実行した。


root@fb140:~ # ls -la /home
total 17
drwxr-xr-x   5 root    wheel    512 Mar  2 20:40 .
drwxr-xr-x  21 root    wheel   1024 Mar 27 19:33 ..
drwxr-xr-x   3 nsmrtks nsmrtks 1024 Mar 27 20:40 distfiles
drwxr-xr-x   2 nsmrtks nsmrtks    2 Mar  2 18:47 nsmrtks
drwxr-xr-x   2 nsmrtks nsmrtks  512 Feb 24 23:21 nsmrtks.BACK

● NFS サーバの設定

これも、必要なのは筆者の環境だけかもしれない。

筆者は、新環境 (すなわち今インストール中のこの環境「fb140」) を立ち上げてからも、引き継ぎのためやバックアップのために、旧環境もしばらく残して運用することにしており、その際、ホームディレクトリや /usr/ports/distfiles (前述) を旧環境から新環境に移動して切り替え、旧環境からは NFS でそのまま参照するようにしている。

NFS というと、どのディレクトリをエクスポートするかという設定が必要だが、/etc/exports ファイルと、ZFS の sharenfs の二段構えで行くことにする。

上の方で、筆者の旧環境 (fb130) の、(リンクローカル) IPv6 アドレスを /etc/hosts に記述しており、FreeBSD の NFS はこれによりホスト名で可能である。

まず /etc/exports に以下のように記述することにする。


# 2019-09-18,20,2020-01-29,2021-05-08,2024-03-02 nsmrtks

V4: /home

/home/distfiles fb130c fb121c

# EoF

先に /home/distfiles の方の行について解説すると、これは /home/distfiles ディレクトリをホスト fb130c と fb121c に NFS export している。

V4: /home という行について、これは NFSv4 を使用している。 /home というディレクトリを NFSv4 tree root にするという指定になっている。
そして /home については、ZFS の sharenfs の指定と組み合わせて設定することにする。

ZFS の sharenfs の設定が未だだが、先に NFS サーバを立ち上げる設定をしてみる。
それには、以下のように実行して.. (繰り返しになるが、「>>」で追記するのであり、 くれぐれも間違って「>」で上書きしないように注意する。)


root@fb140:~ # egrep ^nfs /etc/defaults/rc.conf >> /etc/rc.conf

/etc/rc.conf に以下のように追記されるように編集した。


nfs_server_enable="YES"                 # This host is an NFS server (or NO).
nfsv4_server_enable="YES"               # Enable support for NFSv4
nfsuserd_enable="YES"                   # NFSv4 user/group name mapping daemon
nfsuserd_flags="-domain magic.or"       # Flags for nfsuserd

ここで筆者の環境では nfsuserd_flags に -domain オプションで「magic.or」という名前を設定した。 これはサーバ側(すなわちこのホスト)とクライアント側で合わせる必要がある。

このタイミングで、作業時間の都合で、一旦シャットダウン / 電源 OFF した。

次に電源 ON すると、NFS サーバは自動的に起動していた。


root@fb140:~ # service nfsd status
nfsd is running as pid 1156 1158.

root@fb140:~ # showmount -e
Exports list on localhost:
/home/distfiles                    fb130.magic.or fb121.magic.or 

◎ distfiles

この段階で、ホスト fb130c 及び fb121c から、fb140 の /distfiles が NFS マウントできるようになるだろう..
たとえば fb130 (fb130c) については、fb130 環境にて、fb140c を /etc/hosts に追加、/etc/fstab を以下のように書き換えて (2021-05-03 〜 の下の 1行をコメントアウトし、2024-03-27 〜 と下の 2行を追加した。)、


〜
# 2021-05-03 nsmrtks
#/dev/da0p1     /home/distfiles ufs     rw      2       2
# 2024-03-27 nsmrtks
/dev/da0p1      /distfiles_old  ufs     rw      2       2
fb140c:/distfiles /home/distfiles nfs   rw,nfsv4
〜

fb130 を再起動すると (fb130 を起動したまま既存の /home/distfiles を umount したかったが、使用中と言われどうしても umount 出来なかったので)、以下のように自動的に mount され、アクセスも出来るらしいことを確認した。


% mount
〜
fb140c:/distfiles on /home/distfiles (nfs)

% df -h
Filesystem           Size    Used   Avail Capacity  Mounted on
〜
fb140c:/distfiles     19G    160M     19G     1%    /home/distfiles

% ls -a /home/distfiles/
./          ../         .snap/      .sujournal
なお試しに /etc/fstab を使わずに mount する場合は、mount コマンドに -o nfsv4 を付けないと、エラーになって mount 出来なかったので注意。

% sudo mount -t nfs fb140c:/distfiles /mnt
パスワード: 〜
[tcp6] fb140c:/distfiles: nfsd: RPCPROG_NFS: RPC: Remote system error - No route to host
^C

% sudo mount -t nfs -o nfsv4 fb140c:/distfiles /mnt

% mount
〜
fb140c:/distfiles on /mnt (nfs)

% df -h
Filesystem           Size    Used   Avail Capacity  Mounted on
〜
fb140c:/distfiles     19G    160M     19G     1%    /mnt

% ls -a /mnt
./          ../         .snap/      .sujournal

旧環境 (fb130) から新環境 (fb140) の /home/distfiles が mount 出来たので、旧 distfiles の内容を、新環境 (fb140) の /home/distfiles にコピー (rsync) して、移行した。

◎ ホームディレクトリ

次に、/home/nsmrtks を NFS エクスポートする。
そのやり方だが、/etc/exports はこれ以上触らず、即ち /etc/exports の「V4: /home」と書いた行 (のみ) を利用し、残りを ZFS の機能で行うことにする。

以下のように、zfs set sharenfs= にホストを指定する。 なおこの操作で、mountd に HUP シグナルを送る相当まで自動的に実行してくれるので、直後に shouwmount -e を実行するとちゃんと動作に反映されている。


root@fb140:~ # zfs get sharenfs
NAME         PROPERTY  VALUE     SOURCE
zfs          sharenfs  off       default
zfs/local    sharenfs  off       default
zfs/nsmrtks  sharenfs  off       default
zfs/ports    sharenfs  off       default

root@fb140:~ # zfs set sharenfs='fb130c fb121c fb093c fbak fbak14' zfs/nsmrtks

root@fb140:~ # zfs get sharenfs
NAME         PROPERTY  VALUE                             SOURCE
zfs          sharenfs  off                               default
zfs/local    sharenfs  off                               default
zfs/nsmrtks  sharenfs  fb130c fb121c fb093c fbak fbak14  local
zfs/ports    sharenfs  off                               default

root@fb140:~ # showmount -e
Exports list on localhost:
/home/distfiles                    fb130.magic.or fb121.magic.or 
/home/nsmrtks                      fb130.magic.or fb121.magic.or fb093.magic.or fbak.magic.or fbak14.magic.or 

ここで早速マウントできるか確かめたい所だが..
筆者は未だここまで、旧環境 (fb130) で仕事をしながら、新環境の準備を整えていた。
そこで、ホームディレクトリの、旧環境 (fb130) から新環境 (fb140) への移行も、ここで実行してしまうことにする。

またも筆者の旧環境 (fb130) の話になってしまうが、/home/nsmrtks は ZFS の mountpoint になっていたので、まずはそれを解除した。


root@fb130:~ # zfs get mountpoint
NAME         PROPERTY    VALUE          SOURCE
〜
zfs/nsmrtks  mountpoint  /home/nsmrtks  local
〜

root@fb130:~ # df -h
Filesystem           Size    Used   Avail Capacity  Mounted on
〜
zfs/nsmrtks           14G    3.1G     11G    22%    /home/nsmrtks
〜

root@fb130:~ # zfs set mountpoint=/zfs/nsmrtks zfs/nsmrtks

root@fb130:~ # df -h
Filesystem           Size    Used   Avail Capacity  Mounted on
〜
zfs/nsmrtks           14G    3.1G     11G    22%    /zfs/nsmrtks

root@fb130:~ # ls -l /zfs
total 463
drwxr-xr-x  57 nsmrtks  nsmrtks  131 Mar 27 22:49 nsmrtks
〜

その上で、旧環境 (fb130) の /etc/fstab にて、新環境 (fb140) のホームディレクトリを /home/nsmrtks として NFS マウントできるように設定した。


root@fb130:~ # df -h
Filesystem           Size    Used   Avail Capacity  Mounted on
〜
zfs/nsmrtks           14G    3.1G     11G    22%    /zfs/nsmrtks
fb140c:/nsmrtks       23G     24K     23G     0%    /home/nsmrtks

root@fb130:~ # ls -a /home/nsmrtks
.       ..

旧環境 (fb130) から新環境 (fb140) の /home/nsmrtks も mount 出来たので、旧環境 (fb130) にあるホームディレクトリ (/zfs/nsmrtks となっている) の内容を、新環境にコピーした。
それには、旧環境 (fb130) にて、以下のように実行した。


root@fb130:~ # date ; sudo -u nsmrtks rsync -az --del /zfs/nsmrtks/ /home/nsmrtk s/ ; date
Wed Mar 27 23:38:49 JST 2024
Thu Mar 28 00:23:07 JST 2024

root@fb130:~ # date ; sudo -u nsmrtks rsync -nv -a --del /zfs/nsmrtks/ /home/nsmr tks/ ; date
Thu Mar 28 00:33:30 JST 2024
sending incremental file list

sent 6,091,162 bytes  received 16,770 bytes  118,600.62 bytes/sec
total size is 6,092,733,429  speedup is 997.51 (DRY RUN)
Thu Mar 28 00:34:21 JST 2024
後から気づいたが、rsync に -z を付けていたのは、この場合、時間がかかるだけで意味なかったかも。

その他のホスト fb121 / fb093 / fbak / fbak14 からも、ホームディレクトリを NFS マウントでき、ファイルを書き込めて共有できることを確かめた。

これでホームディレクトリが旧環境 (fb130) から新環境 (fb140)へ移行できた。

これにて、NFS サーバの設定としても完了したことになる。

● ハードウェア設定を本番仕様に

ここで一旦シャットダウン・電源 OFF した。

さて、『仮想マシンの作成編』の『ハードウェア』の所では、移行前の仮想マシンとのメモリの食い合いなどを考え、メインメモリーとプロセッサー数を少なめにしていた。
それをここで、「本番仕様」とし、大きく取ることにする。 逆に旧環境の方を減らす。

「Oracle VM VirtualBox マネージャー」で「fb140」が選択された状態で『設定』→『システム』と進む。

『マザーボード』の『メインメモリー』が、「8000 MB」だったのを、「12000 MB」に増やした。

main memory

『プロセッサー』の『プロセッサー数』が「1」だったのを、筆者の環境で設定できる最大値である「8」まで増やした。 (ハードウェアは 8コア 16スレッドなのだが VirtualBox では 8までしか使わせてくれない..)

processor

忘れずに『OK』押す。

summary

逆に、筆者の旧環境 (fb130) の『メインメモリー』と『プロセッサー数』は、この時点で減らした。 (特に『メインメモリー』は大きく取りすぎると新環境と両立できないので)

● teetime!

ここで、以降で使う、筆者の環境でいつも用いている「teetime」スクリプトを紹介する。
これは、「コマンド |& tee ログ.txt」 (csh 系) あるいは「コマンド 2>&1 | tee ログ.txt」 (sh 系) に毛の生えたようなコマンドで、コマンドを何回かやり直しても、ログのファイル名を、既に存在するファイル名とぶつからないように、日付時刻のファイル名を自動的に付けてくれるものである。
(コマンドにあまり複雑なものを指定するとうまくいかない制限事項がある)

「teetime [-t タグ] コマンド..」のように用いる。

● ports を導入

ports で長時間かけてコンパイルでなく pkg コマンドでバイナリパッケージのインストールでもいいのだが (というより今どき普通はそうするかもしれないが)、後述するが、VirtualBox 上で X11 を動かすには、どうやらコンパイルのオプションを変える必要があり、バイナリパッケージだとそれが出来ないのである。

もっとも、それ以外のソフトは ports でなく pkg でもいいかもしれない。 (後述のように git は pkg でインストールしている)

あるいは、読者が VirtualBox でなく、ホストに直接インストールする場合も、pkg でいいかもしれない。

であるが、ここでは基本的に (一部を除き) 全て ports でいくこととし、pkg コマンドの詳細はここでは触れない。 あしからず。

それでも簡単にいうと、pkg search 〜 でパッケージ名を探し、(sudo) pkg install 〜 でパッケージをインストールする感じ。
なお最初に「pkg」コマンドを実行すると、(本当の) pkg コマンド自体のインストールを最初に尋ねられるので、y を押してインストールする。 (これも後の方で示す)

さて今まで (FreeBSD 13.X) なら、ここでまず portsnap fetch を実行する.. のだが、なんと今回 portsnap が入っていなかった。


root@fb140:~ # portsnap fetch
/bin/sh: portsnap: not found

root@fb140:~ # man portsnap
No manual entry for portsnap

root@fb140:~ # whereis portsnap
portsnap:

どうやら、git を使うように変更されたようなのである。 以下を参考にさせていただく。

FreeBSD 14.0でportsnapが削除 Portsツリーを更新する方法
それにしても ports を更新するのに ports のソフトが必要 (ベースシステムだけでは ports が更新できない) とは.. やはり一般人は pkg を使い ports は使わないということかもしれない。

git をインストールするために、まずおもむろに pkg コマンドを実行する。


root@fb140:~ # pkg
The package management tool is not yet installed on your system.
Do you want to fetch and install it now? [y/N]: y
Bootstrapping pkg from pkg+http://pkg.FreeBSD.org/FreeBSD:14:amd64/quarterly, please wait...
Verifying signature with trusted certificate pkg.freebsd.org.2013102301... done
Installing pkg-1.20.9...
Extracting pkg-1.20.9: 100%
pkg: not enough arguments
Usage: pkg [-v] [-d] [-l] [-N] [-j <jail name or id>|-c <chroot path>|-r <rootdir>] [-C <configuration file>] [-R <repo config dir>] [-o var=value] [-4|-6] <command> [<args>]

For more information on available commands and options see 'pkg help'.

(not enough arguments と言われ Usage まで出てしまったが) ここで pkg info を実行すると、未だ pkg コマンドしか入っていない。


root@fb140:~ # pkg info
pkg-1.20.9                     Package manager

さて筆者は、何かインストールする時に、必ずたいてい、ログを残すようにしている。
そのインストールログは、/var/tmp の下に log というディレクトリを作成することにし、さらにその下に Install というディレクトリを作成して、その下に保存している。
ここでそのディレクトリを作成する。


root@fb140:~ # cd /var/tmp

root@fb140:/var/tmp # ls
vi.recover

root@fb140:/var/tmp # mkdir log

root@fb140:/var/tmp # chown nsmrtks log

root@fb140:/var/tmp # ls -l
total 8
drwxr-xr-x  2 nsmrtks wheel 512 Mar 28 14:40 log
drwxrwxrwt  2 root    wheel 512 Mar 24 01:41 vi.recover

root@fb140:/var/tmp # cd log

root@fb140:/var/tmp/log # mkdir Install

root@fb140:/var/tmp/log # chown nsmrtks Install

root@fb140:/var/tmp/log # ls -l
total 4
drwxr-xr-x  2 nsmrtks wheel 512 Mar 28 14:40 Install

(なかなか ports の導入に辿り着かないが) pkg install git する。
ここで前述の teetime コマンド (筆者の /home/nsmrtks/bin に入っている) を併用してログを残す。 (今回は /var/tmp/log/Install/git20240328.log というファイルにログが残された)


root@fb140:/var/tmp/log # cd Install

root@fb140:/var/tmp/log/Install # nice ~nsmrtks/bin/teetime -t git pkg install git
logging (from the next line till the end) to git20240328.log
teetime! Thu Mar 28 14:45:09 JST 2024
teetime! working directory is /var/tmp/log/Install
teetime> pkg install git
Updating FreeBSD repository catalogue...
Fetching meta.conf: . done
Fetching packagesite.pkg: .......... done
Processing entries: .......... done
FreeBSD repository update completed. 33715 packages processed.
All repositories are up to date.
Updating database digests format: . done
The following 35 package(s) will be affected (of 0 checked):

New packages to be INSTALLED:
        curl: 8.6.0
        expat: 2.5.0
        gettext-runtime: 0.22.3
        git: 2.43.0
        indexinfo: 0.3.1
        libffi: 3.4.4
        libidn2: 2.3.4
        libnghttp2: 1.58.0
        libpsl: 0.21.2_4
        libssh2: 1.11.0,3
        libunistring: 1.1
        mpdecimal: 2.5.1
        p5-Authen-SASL: 2.17
        p5-CGI: 4.60
        p5-Clone: 0.46
        p5-Digest-HMAC: 1.04
        p5-Encode-Locale: 1.05
        p5-Error: 0.17029
        p5-GSSAPI: 0.28_2
        p5-HTML-Parser: 3.81
        p5-HTML-Tagset: 3.20_1
        p5-HTTP-Date: 6.06
        p5-HTTP-Message: 6.45
        p5-IO-HTML: 1.004
        p5-IO-Socket-IP: 0.42
        p5-IO-Socket-SSL: 2.084
        p5-LWP-MediaTypes: 6.04
        p5-Mozilla-CA: 20231213
        p5-Net-SSLeay: 1.92
        p5-TimeDate: 2.33,1
        p5-URI: 5.21
        pcre2: 10.42
        perl5: 5.36.3_1
        python39: 3.9.18
        readline: 8.2.7

Number of packages to be installed: 35

The process will require 241 MiB more space.
47 MiB to be downloaded.

Proceed with this action? [y/N]: y
〜
[35/35] Installing git-2.43.0...
===> Creating groups.
Creating group 'git_daemon' with gid '964'.
===> Creating users
Creating user 'git_daemon' with uid '964'.
[35/35] Extracting git-2.43.0: .......... done
=====
〜
teetime! Thu Mar 28 14:46:21 JST 2024

git コマンドが /usr/local/bin/git としてインストールされた。


root@fb140:~ # type git
git is /usr/local/bin/git

root@fb140:~ # whereis git
git: /usr/local/bin/git /usr/local/man/man1/git.1.gz

前置きが長くなったが、これでやっと ports が取得できそうだ。 それには git clone を用いるらしい。 (最初の 1回だけ)
ところが..


root@fb140:~ # su nsmrtks
2024年 3月28日 木曜日 14時58分14秒 JST
/root
root has logged on ttyv0 from local.

% ls -al /usr/ports
total 5
drwxr-xr-x   2 nsmrtks wheel   3  3月  2 20:52 ./
drwxr-xr-x  15 root    wheel 512  3月  2 18:46 ../
lrwxr-xr-x   1 root    wheel  15  3月  2 20:52 distfiles@ -> /home/distfiles

% git clone https://git.freebsd.org/ports.git /usr/ports
fatal: destination path '/usr/ports' already exists and is not an empty directory.
128で終了しました

/usr/ports/distfiles を事前に作成していたのが仇となった。 二度手間になるが、一旦削除する。 そして git clone を再実行。


% rm -i /usr/ports/distfiles
remove /usr/ports/distfiles? y

% git clone https://git.freebsd.org/ports.git /usr/ports
Cloning into '/usr/ports'...
〜

/usr/ports/distfiles のシンボリックリンクを再作成する。


% cd /usr/ports

% ls -ld distfiles
ls: distfiles: そのようなファイルまたはディレクトリはありません
1で終了しました
1で終了しました

% ln -s /home/distfiles

% ls -ld distfiles
lrwxr-xr-x  1 nsmrtks wheel 15  3月 28 15:13 distfiles@ -> /home/distfiles

% ls distfiles/
distfiles:
〜(先ほど旧環境の distfiles からファイルを rsync したのでたくさん見える)

インデックスの取得というのも今やっておいた方がいいのだろうか?


% make fetchindex
/usr/bin/env  fetch -am -o /usr/ports/INDEX-14.xz  https://download.FreeBSD.org/ports/index/INDEX-14.xz
/usr/ports/INDEX-14.xz                                1797 kB   10 MBps    01s

% ls -lt | head
total 9790
-rw-r--r--     1 nsmrtks wheel 47234522  3月 28 15:43 INDEX-14
〜

ところで、先に zfs set したとおり、ファイルシステムは圧縮されており、


root@fb140:~ # zfs get compression
NAME         PROPERTY     VALUE           SOURCE
zfs          compression  on              default
zfs/local    compression  lz4             local
zfs/nsmrtks  compression  lz4             local
zfs/ports    compression  lz4             local

以下のように圧縮率が得られた。


root@fb140:~ # zfs get compressratio
NAME         PROPERTY       VALUE  SOURCE
zfs          compressratio  1.72x  -
zfs/local    compressratio  2.01x  -
zfs/nsmrtks  compressratio  1.94x  -
zfs/ports    compressratio  1.27x  -

● sudo をインストールする

先ほどの手順で ports をインストールしたので、とりあえず普通にコンパイル・インストールする。


root@fb140:~ # cd /usr/ports/security/sudo

root@fb140:/usr/ports/security/sudo # ls
Makefile        distinfo        files           pkg-descr       pkg-plist

root@fb140:/usr/ports/security/sudo # nice ~nsmrtks/bin/teetime -t install make install
logging (from the next line till the end) to install20240328.log
teetime! Thu Mar 28 16:01:40 JST 2024
teetime! working directory is /usr/ports/security/sudo
teetime> make install
〜
teetime! Thu Mar 28 16:04:09 JST 2024

root@fb140:/usr/ports/security/sudo # ls -l
total 264
-rw-r--r--  1 nsmrtks wheel    4933 Mar 28 15:04 Makefile
-rw-r--r--  1 nsmrtks wheel     158 Mar 28 15:04 distinfo
drwxr-xr-x  2 nsmrtks wheel       5 Mar 28 15:04 files
-rw-r--r--  1 root    wheel 2436645 Mar 28 16:04 install20240328.log
-rw-r--r--  1 nsmrtks wheel     254 Mar 28 15:04 pkg-descr
-rw-r--r--  1 nsmrtks wheel    5754 Mar 28 15:04 pkg-plist
drwxr-xr-x  4 root    wheel      19 Mar 28 16:04 work

root@fb140:/usr/ports/security/sudo # nice ~nsmrtks/bin/teetime -t clean make clean
logging (from the next line till the end) to clean20240328.log
teetime! Thu Mar 28 16:06:10 JST 2024
teetime! working directory is /usr/ports/security/sudo
teetime> make clean
===>  Cleaning for pkgconf-2.1.1,1
===>  Cleaning for gettext-tools-0.22.5
===>  Cleaning for libtextstyle-0.22.5
===>  Cleaning for sudo-1.9.15p5_4
teetime! Thu Mar 28 16:06:11 JST 2024

結果、無事ビルド・インストール出来たようだ。

次に sudoers ファイル (実体は /usr/local/etc/sudoers にある) を visudo で編集する。


root@fb140:~ # ls -ld /usr/local/etc/sudoers*
-r--r-----  1 root wheel 4749 Mar 28 16:04 /usr/local/etc/sudoers
drwxr-x---  2 root wheel    2 Mar 28 16:04 /usr/local/etc/sudoers.d
-r--r-----  1 root wheel 4749 Mar 28 16:04 /usr/local/etc/sudoers.dist

root@fb140:~ # md5 /usr/local/etc/sudoers*
MD5 (/usr/local/etc/sudoers) = 8f71c94aa410e6e891c8b03645daba95
md5: /usr/local/etc/sudoers.d: Is a directory
MD5 (/usr/local/etc/sudoers.dist) = 8f71c94aa410e6e891c8b03645daba95

root@fb140:~ # visudo

このとき、オリジナルと同一の /usr/local/etc/sudoers.dist というファイルも元から横に置かれているので、わざわざ自分でコピーを取っておかなくても変更点を比較できる。

筆者の環境では以下のように変更を行った。

diff -u /usr/local/etc/sudoers.dist /usr/local/etc/sudoers を示すと以下のようである。


--- /usr/local/etc/sudoers.dist	2024-03-28 16:04:08.724771000 +0900
+++ /usr/local/etc/sudoers	2024-03-28 16:17:35.355104000 +0900
@@ -58,7 +58,8 @@
 ## Run X applications through sudo; HOME is used to find the
 ## .Xauthority file.  Note that other programs use HOME to find   
 ## configuration files and this may lead to privilege escalation!
-# Defaults env_keep += "HOME"
+Defaults env_keep += "HOME"
+# 2024-03-28 nsmrtks
 ##
 ## X11 resource path settings
 # Defaults env_keep += "XAPPLRESDIR XFILESEARCHPATH XUSERFILESEARCHPATH"
@@ -103,6 +104,9 @@
 ## slower by these options and also can clutter up the logs.
 # Defaults!PKGMAN !intercept, !log_subcmds
 
+# 2024-03-28 nsmrtks
+Defaults env_keep += "http_proxy https_proxy"
+
 ##
 ## Runas alias specification
 ##
@@ -113,7 +117,8 @@
 root ALL=(ALL:ALL) ALL
 
 ## Uncomment to allow members of group wheel to execute any command
-# %wheel ALL=(ALL:ALL) ALL
+%wheel ALL=(ALL:ALL) ALL
+# 2024-03-28 nsmrtks
 
 ## Same thing without a password
 # %wheel ALL=(ALL:ALL) NOPASSWD: ALL

これで、wheel グループに所属している一般ユーザ nsmrtks は、sudo が実行できるようになった。


% sudo pwd

あなたはシステム管理者から通常の講習を受けたはずです。
これは通常、以下の3点に要約されます:

    #1) 他人のプライバシーを尊重すること。
    #2) タイプする前に考えること。
    #3) 大いなる力には大いなる責任が伴うこと。

セキュリティー上の理由で、あなたがタイプしたパスワードは表示しません。
パスワード: 〜
/home/nsmrtks

● /etc/make.conf を設定する

主に ports のための設定である。

/etc/make.conf ファイルを新規作成して、以下の内容にした。 (旧環境から持ってきて一部編集した)


# 2024- nsmrtks
# 2023-04-19,27,29?,05-03,07-20,10-27 nsmrtks
# 2017-09-27,2020-12-15 - 2021-09-24 nsmrtks

# see /usr/ports/Mk/bsd.command.mk
SU_CMD?=/usr/local/bin/sudo -E sh -c

#DISABLE_VULNERABILITIES=yes

# EoF

この SU_CMD は、ports でビルドするときに、たまに出て来る su を代わりに sudo を用いるように設定している。

● portupgrade をインストールする

ports のためのツール群である。


% cd /usr/ports/ports-mgmt/portupgrade

% pwd
/usr/ports/ports-mgmt/portupgrade

% nice teetime -t install make install
logging (from the next line till the end) to install20240328.log
teetime! 2024年 3月28日 木曜日 16時39分15秒 JST
teetime! working directory is /usr/ports/ports-mgmt/portupgrade
teetime> make install
〜
teetime! 2024年 3月28日 木曜日 16時45分33秒 JST

無事ビルド・インストール出来たようだ。

● virtualbox-ose-additions をインストールする

virtualbox-ose-additions をインストールしていないと、MS-Windows 側とクリップボードが共有できなかったり、もしかすると時計がずれていったり、いろいろ不都合が発生する。

MS-Windows や Linux では、Guest Additions CD を挿入して.. などというのがあった気がするが、FreeBSD では ports や pkg からインストールできる。

ここからは、先ほどインストールした portupgrade に付属の portinstall コマンドを用いて ports のソフトをインストールしていく。

virtualbox-ose-additions の ports の名前がうろ覚えだったので、先に pkg search コマンドで探している。


% pkg search virtualbox
phpvirtualbox-6.1_3            AJAX Web Interface for VirtualBox
phpvirtualbox-legacy-5.2.1_4   AJAX Web Interface for VirtualBox
virtualbox-ose-6.1.50          General-purpose full virtualizer for x86 hardware
virtualbox-ose-additions-6.1.50 VirtualBox additions for FreeBSD guests
virtualbox-ose-additions-nox11-6.1.50 VirtualBox additions for FreeBSD guests
virtualbox-ose-kmod-6.1.50     VirtualBox kernel module for FreeBSD
virtualbox-ose-kmod-legacy-5.2.44_7 VirtualBox kernel module for FreeBSD
virtualbox-ose-legacy-5.2.44_16 General-purpose full virtualizer for x86 hardware
virtualbox-ose-nox11-6.1.50    General-purpose full virtualizer for x86 hardware
virtualbox-ose-nox11-legacy-5.2.44_16 General-purpose full virtualizer for x86 hardware

コンパイル開始。


% cd /var/tmp/log/Install

% nice teetime -t virtualbox-ose-additions_ portinstall -s virtualbox-ose-additions
logging (from the next line till the end) to virtualbox-ose-additions_20240328.log
teetime! 2024年 3月28日 木曜日 17時06分19秒 JST
teetime! working directory is /var/tmp/log/Install
teetime> portinstall -s virtualbox-ose-additions
〜
Stop.
make: stopped in /usr/ports/emulators/virtualbox-ose-additions
--->  [Executing a command as root: sudo /usr/local/sbin/pkgdb -aFOQ]
** Listing the failed packages (-:ignored / *:skipped / !:failed)
	! emulators/virtualbox-ose-additions	(dependent ports)
teetime! 2024年 3月28日 木曜日 17時11分18秒 JST

筆者の環境の都合で、コンパイルが途中で止まってしまった。
原因を解消して、コンパイル再開。 このとき、portinstall のオプションに -w も付けると、make clean せずに、前回の続きから再開できる。


% nice teetime -t virtualbox-ose-additions_ portinstall -sw virtualbox-ose-additions
conflicting virtualbox-ose-additions_20240328.log
logging (from the next line till the end) to virtualbox-ose-additions_2024032817.log
teetime! 2024年 3月28日 木曜日 17時12分16秒 JST
teetime! working directory is /var/tmp/log/Install
teetime> portinstall -sw virtualbox-ose-additions
〜

たまにダイアログが出てきて、オプションを選べるので、もしデフォルトから変えたければ設定する。 (ただし経験上、あまりデフォルトから変えると、ビルドに失敗することもあった。)

gmp のオプション 『CPU_OPTS』「Enable assembly optimizations for your CPU」 というのをチェックを付けてみた (スペースキーを押す)。

gmp


〜
teetime! 2024年 3月28日 木曜日 19時56分10秒 JST

無事にコンパイル・インストールが終わった。

さて、ビルド・インストール中のメッセージが、teetime コマンドにより /var/tmp/log/Install/ 以下のログファイルに残っているので、それを見てみる。 (今回は 2回目の virtualbox-ose-additions_2024032817.log を参照する)


〜
Installing virtualbox-ose-additions-6.1.50...
VirtualBox Guest Additions are installed.

To enable and start the required services:

# sysrc vboxguest_enable="YES"
# sysrc vboxservice_enable="YES"

To start the services, restart the system.

In some situations, a panic will occur when the kernel module loads.
Having no more than one virtual CPU might mitigate the issue.

For features such as window scaling and clipboard sharing, membership of
the wheel group is required. With username "jerry" as an example:

# pw groupmod wheel -m jerry

The settings dialogue for FreeBSD guests encourages use of the VMSVGA
graphics controller. Whilst this might suit installations of FreeBSD
without a desktop environment (a common use case), it is not appropriate
where Guest Additions are installed.

Where Guest Additions are installed:

1. prefer VBoxSVGA

2. do not enable 3D acceleration (doing so will invisibly
   lose the preference for VBoxSVGA)

You may ignore the yellow alert that encourages use of VMSVGA.
〜

これと、/usr/local/etc/rc.d/ 以下にインストールされた dbus を参考にして..


% ls /usr/local/etc/rc.d/
/usr/local/etc/rc.d:
dbus*        git_daemon*  vboxguest*   vboxservice* 

/usr/local/etc/rc.d/dbus の冒頭:


#!/bin/sh

# PROVIDE: dbus
# REQUIRE: DAEMON ldconfig
#
# Add the following lines to /etc/rc.conf to enable the D-BUS messaging system:
#
# dbus_enable="YES"
#
〜

以下を実行。


% sudo sysrc dbus="YES"
dbus:  -> YES

% sudo sysrc vboxguest_enable="YES"
vboxguest_enable:  -> YES

% sudo sysrc vboxservice_enable="YES"
vboxservice_enable:  -> YES

reboot したら、「vboxguest: loaded successfully」や、VBoxService が起動したようなメッセージが出ていた。

kldstat で見ると vboxguest.ko がロードされていた。


% kldstat
Id Refs Address                Size Name
 1   16 0xffffffff80200000  1d345b0 kernel
 2    1 0xffffffff82800000   3e5de0 zfs.ko
 3    1 0xffffffff82618000     3220 intpm.ko
 4    1 0xffffffff8261c000     2178 smbus.ko
 5    1 0xffffffff8261f000    35b40 vboxguest.ko

また、VBoxService が起動していた。 (以前、起動していなかったことがあった。)


% ps ax | egrep -i box
1091  -  Is    0:00.01 /usr/local/sbin/VBoxService
1250  0  S+    0:00.00 egrep -i box

● X11 (xorg) をインストール

virtualbox-ose-additions をインストールしたことによって、X11 サーバ (xorg-server) もインストールされていた。


% pkg info | egrep X
〜
xorg-server-21.1.11_1,1        X.Org X server and related programs
〜

しかし、startx コマンドが入っていない。


% where startx
1で終了しました

そこで、xorg をちゃんとインストールしてみる..


% cd /var/tmp/log/Install/

% nice teetime -t xorg portinstall -s xorg
logging (from the next line till the end) to xorg20240328.log
teetime! 2024年 3月28日 木曜日 20時54分45秒 JST
teetime! working directory is /var/tmp/log/Install
teetime> portinstall -s xorg
〜
Stop.
make: stopped in /usr/ports/x11/xorg
** Command failed [exit code 1]: /usr/bin/script -qa /tmp/portinstall20240328-1335-8fx4ru env make FETCH_BEFORE_ARGS=-q
** Fix the problem and try again.
--->  [Executing a command as root: sudo /usr/local/sbin/pkgdb -aFOQ]
パスワード: 
** Listing the failed packages (-:ignored / *:skipped / !:failed)
	! x11/xorg	(fetch error)
teetime! 2024年 3月28日 木曜日 21時08分00秒 JST

またも筆者の環境の都合で、コンパイルが途中で止まってしまった。 原因を解消して、コンパイル再開。


% nice teetime -t xorg portinstall -sw xorg
conflicting xorg20240328.log
logging (from the next line till the end) to xorg2024032821.log
teetime! 2024年 3月28日 木曜日 21時08分17秒 JST
teetime! working directory is /var/tmp/log/Install
teetime> portinstall -sw xorg
〜
teetime! 2024年 3月28日 木曜日 21時15分28秒 JST

この時、途中に出て来る xorg-drivers の選択メニューで、VMMOUSE と VMWARE のチェックを付ける必要がある。
これが、VirtualBox で X11 (xorg) を使うためには pkg でなく ports でコンパイルしないといけない理由である。
何故 VMMOUSE と VMWARE が必要なのかというと、VirtualBox のディスプレイを VMSVGA で使うためである (後述する)。

VMMOUSE and VMWARE

無事にコンパイル・インストールが終わった。

さて、VirtualBox の画面をフルスクリーンモードに切り替えてから、startx を実行し、X11 サーバを起動してみる。

startx を実行すると、~/.xinitrc が存在すれば実行されるが、筆者の ~/.xinitrc は、twm が存在すれば実行するようになっている。 よって以下のスクリーンショットでも twm が起動している。

800x600

xdpyinfo でも確かめた所、SVGA (800x600) で起動したようだ。 ここで筆者の PC の画面からフルスクリーンモードは 1920x1080 のはずなのだが。

そこで xrandr -s 1920x1080 を実行してみた所、画面をいっぱいに広げることが出来た。

xrandr -s 1920x1080

● VMSVGA にする

少し話が前後するが、この次で Xfce をインストールし使い始めた辺りで、Xfce を起動すると (startx で)、数秒で真っ黒の画面となり、全く使えなくなるという現象が発生し始めた。

このようなことは今まで発生したことがなかった。

Xfce のせいかと思って KDE5 にしたりしてみたが、同じ現象だった。

非常に悩んだのだが、最終的な解決法としては、最初の方で VirtualBox のディスプレイの設定を「VBoxSVGA」に変えていたが、それを「VMSVGA」に戻すと、正常に作動するようになった。

display
このスクリーンショットは fb140 が起動中 (正確には保存状態) のものなので「VMSVGA」等の所がグレーアウトされている (起動中や保存状態では変更できないので)

virtualbox-ose-additions のコンパイルメッセージ (上の方を参照) が VBoxSVGA を使えと言っているのは何なのか..

また、「VMSVGA」を使うためには、前述したが xorg を VMMOUSE と VMWARE 付きでコンパイルしている必要がある。

● 統合デスクトップ (ウィンドウマネージャ / Xfce) をインストールする

筆者は、ウィンドウマネージャというか統合デスクトップとして、ここ数年は Xfce を使っている。

昔は mwm (Motif Window Manager) を長らく使っていたり、また WindowMaker も少し使っていたのだが、どうも古くて動作に支障が出ていると思うようになった。 twm も昔は使っていた。

Xfce のことは以下などで知った。

FreeBSD ハンドブック → パート I. 導入 → 第5章 X Window System → 5.7. デスクトップ環境

% pkg search xfce
〜
xfce-4.18_1                    Meta-port for the Xfce Desktop Environment
〜

% cd /var/tmp/log/Install

% nice teetime -t xfce portinstall -s xfce
logging (from the next line till the end) to xfce20240328.log
teetime! 2024年 3月28日 木曜日 21時42分41秒 JST
teetime! working directory is /var/tmp/log/Install
teetime> portinstall -s xfce
[Reading data from pkg(8) ... - 331 packages found - done]
〜
===>  Checking if webkit2-gtk3 is already installed
===>  Switching to root credentials for 'install' target
Password:
sudo: timed out reading password
sudo: a password is required
*** Error code 1

Stop.
make[10]: stopped in /usr/ports/www/webkit2-gtk3
*** Error code 1

Stop.
make[9]: stopped in /usr/ports/www/webkit2-gtk3
*** Error code 1

Stop.
make[8]: stopped in /usr/ports/textproc/libgepub
*** Error code 1

Stop.
make[7]: stopped in /usr/ports/deskutils/xfce4-tumbler
*** Error code 1

Stop.
make[6]: stopped in /usr/ports/deskutils/xfce4-tumbler
*** Error code 1

Stop.
make[5]: stopped in /usr/ports/x11-fm/thunar
*** Error code 1

Stop.
make[4]: stopped in /usr/ports/x11-fm/thunar
*** Error code 1

Stop.
make[3]: stopped in /usr/ports/x11-wm/xfce4-desktop
*** Error code 1

Stop.
make[2]: stopped in /usr/ports/x11-wm/xfce4-desktop
*** Error code 1

Stop.
make[1]: stopped in /usr/ports/x11-wm/xfce4
*** Error code 1

Stop.
make: stopped in /usr/ports/x11-wm/xfce4
** Command failed [exit code 1]: /usr/bin/script -qa /tmp/portinstall20240328-2857-if3z5b env make FETCH_BEFORE_ARGS=-q
** Fix the problem and try again.
--->  [Executing a command as root: sudo /usr/local/sbin/pkgdb -aFOQ]
パスワード: 
sudo: パスワードの読み込みがタイムしました
sudo: パスワードが必要です
/usr/local/lib/ruby/site_ruby/3.2/pkgtools/pkgtools.rb:487:in `__system': Command failed [exit code 1]: sudo /usr/local/sbin/pkgdb -aFOQ (CommandFailedError)
	from /usr/local/lib/ruby/site_ruby/3.2/pkgtools/pkgtools.rb:510:in `__sudo'
	from /usr/local/lib/ruby/site_ruby/3.2/pkgtools/pkgtools.rb:516:in `xsudo'
	from /usr/local/lib/ruby/site_ruby/3.2/pkgtools/pkgdb.rb:1062:in `autofix!'
	from /usr/local/lib/ruby/site_ruby/3.2/pkgtools/pkgdb.rb:1058:in `autofix'
	from /usr/local/sbin/portinstall:1139:in `do_install'
	from /usr/local/sbin/portinstall:842:in `block (2 levels) in main'
	from /usr/local/sbin/portinstall:838:in `each'
	from /usr/local/sbin/portinstall:838:in `block in main'
	from /usr/local/lib/ruby/3.2/optparse.rb:1153:in `initialize'
	from /usr/local/sbin/portinstall:238:in `new'
	from /usr/local/sbin/portinstall:238:in `main'
	from /usr/local/sbin/portinstall:2380:in `<main>'
teetime! 2024年 3月29日 金曜日 02時12分05秒 JST

コンパイルが長時間に渡ったので、sudo のパスワードを入力しそこねて、エラーで終了してしまった。
portinstall に -w も付けて、再開させる。


% sudo pwd
パスワード: 〜
/var/tmp/log/Install

% nice teetime -t xfce portinstall -sw xfce
logging (from the next line till the end) to xfce20240329.log
teetime! 2024年 3月29日 金曜日 04時23分23秒 JST
teetime! working directory is /var/tmp/log/Install
teetime> portinstall -sw xfce
[Reading data from pkg(8) ... - 513 packages found - done]
〜
install: /usr/ports/x11-themes/gtk-murrine-engine/work/stage/usr/local/share/gtk-engines/murrine.xml: No space left on device
gmake[2]: *** [Makefile:279: install-xmlDATA] Error 71
gmake[2]: Leaving directory '/usr/ports/x11-themes/gtk-murrine-engine/work/murrine-0.98.2/schema'
gmake[1]: *** [Makefile:346: install-am] Error 2
gmake[1]: Leaving directory '/usr/ports/x11-themes/gtk-murrine-engine/work/murrine-0.98.2/schema'
gmake: *** [Makefile:599: install-recursive] Error 1
*** Error code 2

Stop.
make[5]: stopped in /usr/ports/x11-themes/gtk-murrine-engine
*** Error code 1

Stop.
make[4]: stopped in /usr/ports/x11-themes/gtk-murrine-engine
*** Error code 1

Stop.
make[3]: stopped in /usr/ports/x11-themes/greybird-theme
*** Error code 1

Stop.
make[2]: stopped in /usr/ports/x11-themes/greybird-theme
*** Error code 1

Stop.
make[1]: stopped in /usr/ports/x11-wm/xfce4
*** Error code 1

Stop.
make: stopped in /usr/ports/x11-wm/xfce4
egrep: empty (sub)expression
** Command failed [exit code 1]: /usr/bin/script -qa /tmp/portinstall20240329-94038-xzldp8 env make FETCH_BEFORE_ARGS=-q
** Fix the problem and try again.
--->  [Executing a command as root: sudo /usr/local/sbin/pkgdb -aFOQ]
パスワード: 
** Listing the failed packages (-:ignored / *:skipped / !:failed)
	! x11-wm/xfce4	(new compiler error)
teetime! 2024年 3月29日 金曜日 04時54分49秒 JST

なんと No space left on device で止まってしまった。


% df -h
Filesystem     Size    Used   Avail Capacity  Mounted on
/dev/ada0p2    4.8G    3.2G    1.3G    72%    /
devfs          1.0K      0B    1.0K     0%    /dev
/dev/ada0p4    2.9G    2.1G    579M    79%    /var
/dev/da0p1      19G     14G    3.5G    81%    /home/distfiles
tmpfs          7.0G     12K    7.0G     0%    /tmp
zfs/local      2.0G    2.0G      0B   100%    /usr/local
zfs/ports       18G     18G      0B   100%    /usr/ports
zfs             24K     24K      0B   100%    /zfs
zfs/nsmrtks    3.1G    3.1G      0B   100%    /home/nsmrtks

xfce をコンパイルするために、依存関係で一度に多くの ports のコンパイルが必要になり、それらが clean されないまま続行しているのが要因と思われる。
そこで、ここでは portsclean -C というコマンドを実行し (portsclean も portupgrade に付属のコマンド)、容量を空ける。 (直前までコンパイルしていた ports も clean されてしまいある程度コンパイルのやり直しになるが..)


% portsclean -C
Cleaning out /usr/ports/*/*/work...
Delete /usr/ports/accessibility/at-spi2-core/work
Delete /usr/ports/archivers/libarchive/work
Delete /usr/ports/archivers/libdeflate/work
〜
done.

以下のように大幅に空いた。


% df -h
Filesystem     Size    Used   Avail Capacity  Mounted on
/dev/ada0p2    4.8G    3.2G    1.3G    72%    /
devfs          1.0K      0B    1.0K     0%    /dev
/dev/ada0p4    2.9G    2.1G    579M    79%    /var
/dev/da0p1      19G     14G    3.5G    81%    /home/distfiles
tmpfs          7.0G     12K    7.0G     0%    /tmp
zfs/local       18G    2.0G     16G    12%    /usr/local
zfs/ports       18G    2.0G     16G    11%    /usr/ports
zfs             16G     24K     16G     0%    /zfs
zfs/nsmrtks     19G    3.1G     16G    17%    /home/nsmrtks

みたび、再開。


% sudo pwd
パスワード: 〜
/var/tmp/log/Install

% nice teetime -t xfce portinstall -sw xfce
conflicting xfce20240329.log
logging (from the next line till the end) to xfce2024032921.log
teetime! 2024年 3月29日 金曜日 21時41分40秒 JST
teetime! working directory is /var/tmp/log/Install
teetime> portinstall -sw xfce
[Reading data from pkg(8) ... - 535 packages found - done]
〜
teetime! 2024年 3月29日 金曜日 22時18分01秒 JST

今度こそ最後まで進み成功したようだ。

Xfce は startxfce4 コマンドで起動できる。
ここで、筆者の ~/.xinitrc は、startxfce4 コマンドが存在していれば自動的に実行するようになっている。 (さもなくば twm が起動するようになっていたりする)

先ほどの X11 を終了し、あらためて startx し直すと、Xfce が起動した。 (未だフォントが足りていないので少し表示がおかしいが)

また、旧環境から引き継いだ設定により、自動的に 1920x1080 になるのと、Xfce の上下のバーは自動的に隠すようになっており見えていない。

startxfce4

以上


FreeBSD (14.0) を VirtualBox にインストールする覚書
index