2017/05/01

NTP サーバのアクセス制御設定について

連投になりますが。。。
NTP サーバのアクセス制御設定について、ちょっとハマったので記録など。

FreeBSD 11.0-RELEASE-p1 に、昔 (FreeBSD 8.4) 使用していた ntp.conf をそのまま使ったら、ntpq -p コマンドがタイムアウトしたのでした。。。
さて、なにがいけなかったんでしょうか、と言う話です。

まぁ、結論から言うと、IPv6 の設定をしていなかったから、と言うことだったりします。
普通に rc.conf で ntpd_enable="YES" すると IPv6 でも listen  するようで、自ホストからの ntpq 等は 127.0.0.1 ではなく ::1 から問い合わせているようです。
IPv4 の設定しかされていない ntp.conf では ::1 のアクセス許可が無いためにアクセスできなかった、と、そういうわけだったようで。

そんなわけでちょっと調べると、いろいろと情報がありました。
いつの間にやら、色々と新しい機能が追加されていますね。
問題は、マニュアルページに反映されていない事だったりしますが。。。(´д`;

FreeBSD 特有の話も含めてですが、昔とは変わったところをつらつらと。

・driftfile の指定は必要ない
 /etc/defaults/rc.conf を見れば分かるが、ntpd_flags の指定の中で -f /var/db/ntpd.drift されている

・DNS ラウンドロビン等で複数の IP Address を持つサーバの指定には pool を使う
 server の指定には FQDN を使用しなければならないため、複数のアドレスを持つサーバの指定は難しかった(同じものを3行書くとかの手法があった)が、最近の ntpd は pool 指定に変えれば大丈夫

・同期 NTP サーバの指定には "source" というディレクティブが使える
 昔は、複数のアドレスを持つサーバへのアクセス制御等には、IP Address を全部並べる必要があったが、最近なら "source" と書けば良いため、非常に楽ちん
 (マニュアルにはチラッとしか書かれていない)

・FQDN の記載で IPv6 を指定するには -6 を、IPv4 なら -4 を記述する
 DNS での名前解決で IPv4/IPv6 を強制する必要がある場合に指定する模様
 (昔のマニュアルページ読んだら、8.4-RELEASE でも対応してましたね (^^;)

と言うことで、最近だとこんな ntp.conf を書けば良いらしいです。

---
pool 0.freebsd.pool.ntp.org iburst preempt
pool 1.freebsd.pool.ntp.org iburst preempt
pool 2.freebsd.pool.ntp.org iburst preempt
pool 3.freebsd.pool.ntp.org iburst preempt

restrict default ignore
restrict source nomodify noquery notrap

restrict 127.0.0.1
restrict ::1

restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap
---


昔の人なので、IPv6 は忘れがち (^^;

マシンが遅いと思ったら。。。

未だにお亡くなりになったサーバの再構築が終わりません。。。orz

さておき。
新しい PC を組んでセットアップしているわけですが、何故か死ぬほど遅かったわけです。
具体的には、数秒に1回くらいのプチフリーズ的なものが発生する感じでした。
元のマシンとは比べものにならないくらい遅かったわけですが、元のマシンが Atom 330 で、新しいマシンが Pentium J4205 なので、元より遅いとかそりゃないよ、ってなもんでした。

色々調べた結果分かった事は、UEFI の設定で、省電力機能が有効になっていた事が原因だったと言うことでした。(なんてこったい!)
CPU C States Support と言う項目で C6, C1, Disabled が選べるところ、デフォルトは C6 です。
(この項目が Disabled 以外になっていれば、C1E の有効/無効も別項目で選べます)
この設定が Disabled 以外で有る限り(C1E の有効/無効に関係なく)、激遅になっていたのでした。。。
そうですか、省電力設定はダメですか。。。

そんなわけで、CPU C States Support を Disabled にしたところ、見事にサクサク動くようになったのでした。
それまで起動に数分掛かっていたところが、わずか数秒で起動するスピード差ですよ、奥さん!(違いすぎだろ。。。)

教訓: 意味不明の遅さの時は、(UEFI も含めて)省電力設定を見直せ

2017/04/23

FreeBSD を SSD にインストールする

もう何年も更新をサボっておりました。。。orz
(6年近く経っとるやんけ)

さて、長年使っていた File Server がお亡くなりになりましたので、新しいマシンでも組んでみましょうかねぇ、と思ったのでありました。
そんなわけで、システムドライブを SSD にして FreeBSD 11.0-Release-p1 をインストールしてみました。

システムドライブに SSD を使用する場合、いくつか考慮が必要になります。
それは、以下の点です。

・SSD が TRIM コマンドをサポートしているなら、有効にすべき
・FreeBSD では TRIM コマンドは UFS でしかサポートされていない
・swap で TRIM を有効にしたいなら、UFS 上にファイルで作成すべき
・各パーティションは 1 MB 境界に整列しておいた方が無難
 (128 KB 整列でもいいような気はしないでもない)

他に、現在では UEFI なシステムが普通だったりもするので、ここは素直に GPT (GUID Partition Table) を使用しましょうか、とか色々あるわけです。

実際に、どんな形を目指すのかというと、以下のような形にすることを考えます。

・Partition Scheme には GPT を使用
・BIOS のシステムに繋いでも大丈夫なように boot パーティションを作成
・UEFI のシステムから起動できるように efi (EFI System Partition) パーティションを作成
・swap は UFS 上のファイルとする為、swap パーティションは作成しない
・/tmp には tmpfs を使用する為、tmp パーティションは作成しない
・デバイス番号が変化しても問題ない様、GPT パーティションにはラベルを付加
・boot パーティション (freebsd-boot) は 40 Block (20 KB) から始まり、サイズは 512 KB
・efi パーティションは 1 MB (2048 Block) から始まり、サイズは 200 MB
・他の各パーティションは 1 MB 境界に整列する
・バックアップに dump -L を使用できるよう、Soft-Updates Journaling (SUJ) は使用しない

考慮するポイントが色々ある所為で、インストーラの Auto (UFS) や Manual でパーティショニングするのには無理があったりします。
そのため、Partitioning の項では Shell を選びます。

Shell を選んだ場合は、以下の点に注意が必要です。

・Shell を抜ける前に、作成したパーティションを /mnt 以下にマウントしておくこと
・新システム用の fstab の内容を /tmp/bsdinstall_etc/fstab に記入しておくこと

さて、パーティショニングしてみましょう。
使い回しの SSD を使用する場合は、各パーティションとスキームを削除して下さい。

 認識されているディスクのパーティション情報を表示
 # gpart show
 各パーティションを削除 
 # gpart delete -i {partition#} {device id}
  ex.) gpart delete -i 1 ada0
 スキームを削除
 # gpart destroy {device id}
  ex.) gpart destroy ada0

以下のようにパーティショニングを実行します。

 GPT を Scheme として使用する
 # gpart create -s GPT {device id}
  ex.) gpart create -s GPT ada0

 以下、device id が ada0 だったものとして記述します。

 boot パーティションを作成し、ブートコードを書き込む
 # gpart add -t freebsd-boot -l gpboot -b 40 -s 512k ada0
 # gpart bootcode -b /boot/pmbr -p /boot/gptboot -i 1 ada0
 (gpart add の -l オプションは、パーティションラベルの指定です)
 (gpart bootcode の -b はディスクに書き込まれるブートコードです)
 (gpart bootcode の -p はパーティションに書き込まれるブートコードです)

 efi パーティションを作成し、起動用 EFI Application ファイルを格納する
 # gpart add -t efi -l gpefiboot -b 1m -s 200m ada0
 # newfs_msdos /dev/ada0p2
 # mount -t msdosfs /dev/ada0p2 /mnt
 # mkdir -p /mnt/EFI/BOOT
 # cp -p /boot/boot1.efi /mnt/EFI/BOOT/BOOTx64.EFI
 # umount /mnt
 (efi パーティションは FAT/FAT32 でフォーマットされている必要があります)
 (efi パーティションのサイズは 100MB 以上 1GB 以下である必要があります)
 (起動用 EFI Application のデフォルトは /EFI/BOOT/BOOT{マシンタイプ}.EFI です)
 (amd64 に対応するマシンタイプは x64 です)
 (FreeBSD/i386 は現在非対応です(マシンタイプは IA32 です))

 各パーティションを 1 MB 境界で作成し、Soft-Updates と TRIM を有効にする
 # gpart add -t freebsd-ufs -l gprootfs -a 1m -s 40g ada0
 # gpart add -t freebsd-ufs -l gpvarfs -a 1m -s 20g ada0
 # gpart add -t freebsd-ufs -l gpusrfs -a 1m ada0
 # newfs -U -t /dev/gpt/gprootfs
 # newfs -U -t /dev/gpt/gpvarfs
 # newfs -U -t /dev/gpt/gpusrfs
 (SUJ には snapshot が取れない問題があり dump -L できないため無効とする)
 (dump -L すると Snapshots are not yet supported when running with journaled soft updates: Operation not supported と言われる)

 各パーティションをマウントし、swap ファイルを作成する
 # mount /dev/gpt/gprootfs /mnt
 # mkdir /mnt/swap /mnt/var /mnt/usr
 # mount /dev/gpt/gpvarfs /mnt/var
 # mount /dev/gpt/gpusrfs /mnt/usr
 # dd if=/dev/zero of=/mnt/swap/swapfile bs=128k count=131072
 (swap ファイルのサイズは 16 GB(メモリサイズ以上))

 fstab を作成する
 (echo で追記していますが、vi 等も使用可能です)
 # echo "# Device                Mountpoint      FStype  Options                         Dump    Pass#" > /tmp/bsdinstall_etc/fstab
 # echo "/dev/gpt/gprootfs       /               ufs     rw                              1       1" >> /tmp/bsdinstall_etc/fstab
 # echo "md99                    none            swap    sw,file=/swap/swapfile,late     0       0" >> /tmp/bsdinstall_etc/fstab
 # echo "/dev/gpt/gpvarfs        /var            ufs     rw                              2       2" >> /tmp/bsdinstall_etc/fstab
 # echo "tmpfs                   /tmp            tmpfs   rw,size=8g,mode=01777           0       0" >> /tmp/bsdinstall_etc/fstab
 # echo "/dev/gpt/gpusrfs        /usr            ufs     rw                              2       2" >> /tmp/bsdinstall_etc/fstab


 Shell を終了する
 # exit

こんな感じです。
これで作成したパーティション情報を表示すると、以下のようになります。

# gpart show
=>       40  234441568  ada0  GPT  (112G)
         40       1024     1  freebsd-boot  (512K)
       1064        984        - free -  (492K)
       2048     409600     2  efi  (200M)
     411648   83886080     3  freebsd-ufs  (40G)
   84297728   41943040     4  freebsd-ufs  (20G)
  126240768  108199936     5  freebsd-ufs  (52G)
  234440704        904        - free -  (452K)


# gpart show -l
=>       40  234441568  ada0  GPT  (112G)
         40       1024     1  gpboot  (512K)
       1064        984        - free -  (492K)
       2048     409600     2  gpefiboot  (200M)
     411648   83886080     3  gprootfs  (40G)
   84297728   41943040     4  gpvarfs  (20G)
  126240768  108199936     5  gpusrfs  (52G)
  234440704        904        - free -  (452K)


freebsd-boot パーティションの後に 492 KB の free エリアができてしまいますが、そう言うものだと思って諦めて下さい。
今や最初のパーティションを 1 MB の位置から始めるのは普通になりました。
Windows では freebsd-boot パーティションがない分、1 MB 弱が空きになっていると思えば、まだ諦めが付くでしょうか。。。(^^;

まだ SSD をシステムドライブにするには若干面倒な感じがしますが、そのうちインストーラでも簡単にできるようになるでしょう。
それまでは、パーティショニングは Shell で行う必要がありますね。