2016年12月21日水曜日

メモ: perlをソースコードからコンパイルし、特定のディレクトリにインストールする

perlをソースコードからコンパイルし、特定のディレクトリにインストールする手順は、ソースコードに含まれるREADMEファイルでは次のように書かれています。
INSTALLATION
============

If you're using a relatively modern operating system and want to
install this version of Perl locally, run the following commands:

  ./Configure -des -Dprefix=$HOME/localperl
  make test
  make install
一度、Configureをしてからprefixなどを指定を変更したいときには、おなじディレクトリにある
config.sh
ファイルを削除してから行うほうが無難です。というのは、以前のConfigureの実行結果がconfig.shに残っているためです。

私は、FreeBSD11でprefixを指定せずConfigureを行い、その後、改めて-Dprefix=/DIRとしてConfigure、make installをしたところ、/usr/local/bin/にこのソースコードからコンパイルperlを入れてしまい、既存のperl環境を壊してしまったことがあります。

FreeBSD 11でpkgからsamba44のインストールがうまくできない

FreeBSD 11でpkgからsamba44のインストールがうまくできませんでした。状況は、以下のWWWページと同じように「size mismatch」と出てしまいます。
size mismatch で pkg upgrade や pkg install が失敗する
http://blog.livedoor.jp/denpa_yunyun/archives/52581360.html Fetching xproto-7.0.27.txz: 100%   58 KiB  59.7kB/s    00:01
pkg: cached package xproto-7.0.27: size mismatch, fetching from remote
Fetching xproto-7.0.27.txz: 100%   58 KiB  59.7kB/s    00:01
pkg: cached package xproto-7.0.27: size mismatch, cannot continue
そこで、ここに書いてあるようにリモートリポジトリを強制的に更新(update -f)し、pkgをupgradeしました。
# pkg update -f

# pkg upgrade 

#
書いてあるようなpkgのバージョンの変更はありませんでしたが、「pkg install samba44」でインストールをふたたび試みるとうまくできました。

samba44などのパッケージをインストールすると最後に以下のようなメッセージが出ることがあります。
How to start: http://wiki.samba.org/index.php/Samba4/HOWTO

* Your configuration is: /usr/local/etc/smb4.conf

* All the relevant databases are under: /var/db/samba4

* All the logs are under: /var/log/samba4

* Provisioning script is: /usr/local/bin/samba-tool

For additional documentation check: http://wiki.samba.org/index.php/Samba4

Bug reports should go to the: https://bugzilla.samba.org/
いくつかまとめてパッケージをインストールしていると、このメッセージを見逃してしまうことがあります。このメッセージは以下のようにすれば再表示できます。
FreeBSDでpkgでのインストール時に最後に表示されるメッセージを再び確認する
http://www.sakashita-net.jp/2017/07/freebsdpkg.html

HPE ProLiant ML30 Gen9のファームウェアのアップデート

最近のHPE ProLiantサーバー(使っているのはML30 Gen9)のEFI/BIOSのファームウェアをアップデートしようとしました。すると、
  • アカウントが必要なようだ
  • アカウントを作成するのはいいが、作成したら本当にファームウェアが手に入るのか
などがよくわからず、困っていました。そこで検索エンジンで調べてみると、手順が紹介されているWWWページを見つけました。
HPE ProLiant サーバーのBIOSアップデータがダウンロードできない
https://www.ipentec.com/document/document.aspx?page=hpe-proliant-download-bios-updater
まとめると以下のようです。
  1. HPパスポートのアカウントを作成する
  2. このアカウントに持っているハードウェアを結びつける(ハードウェアのシリアル番号を入力する)。
  3. 各種ドライバやファームウェアのダウンロードページからHPパスポートでログインして、あらためてダウンロードする
ファームウェアのダウンロードにアカウントが不要だった時しか知らなかったので、非常に戸惑いました。

次にファームウェアのアップデート方法です。ML30 Gen9にはiLO4が載っているので、iLO4の管理画面からアップデートが可能です。
  1. ML30 Gen9のサポートページを検索エンジンなどで探す。
  2. オペレーティングシステムを「OS Independent」とすると、ファームウェアだけが出てくる* 「RECOMMENDED * システムROMフラッシュバイナリ」を選んでダウンロード
  3. iLO4のAdmiministration/Firmware画面からファイルの選択で、 先ほどのファームウェアファイルを指定して、「Upload」をクリック
  4. アップデート後終わったと確認できたら再起動し、「Information」画面でバージョンを確認
iLO4のファームウェアもアップデートが可能です。
  1. 「HPE Integrated Lights-Out 4 (iLO 4)  ファームウェア」などのキーワードで検索して、ダウンローロベージを見つける
  2. 「日本語のオペレーティングシステム」で「Microsoft Windows Server 2016」などインストールを想定されているWindowsサーバーを選ぶ
  3. cp027909.exeなどのWindowsの実行形式がダウンロードできる。
  4. これはzipの自己解凍形式なので、ファイルの拡張子を.exeから.zipに変更する
  5. このファイルの中身をWindowsのエクスプローラーで見る、もしくは展開すると、ilo4_250.binといった名前のファイルがあるので、これを取り出しておく
  6. iLO4のAdministration/Fireware画面から指定してUploadする
.exeを.zipに変更して中身を取り出して、iLO4の画面からアップデートすれば、特定のOS環境を用意する必要はありません。

2016年12月13日火曜日

FreeBSD 11でネットワークインターフェイスに複数のIPアドレスを設定する

FreeBSD 11でネットワークインターフェイスに複数のIPアドレスを設定するにはrc.confで以下のように書きます。
ifconfig_bge0="inet 172.25.30.1 netmask 255.255.0.0"
defaultrouter="172.27.0.2"
ifconfig_bge1_aliases="\
        inet 172.25.30.2 netmask 255.255.0.0 \
        inet 172.25.30.3 netmask 255.255.0.0 \
        inet 172.25.30.4 netmask 255.255.0.0"
172.25.30.1の他に30.2、30.3、30.4を設定しています。

FreeBSD 11でrc.confに設定できる値の一覧はman rc.confでわかります。また、
/etc/defaults/rc.conf
にも記述があります。たとえばNFSサーバーについては

### Network daemon (NFS): All need rpcbind_enable="YES" ###
amd_enable="NO"             # Run amd service with $amd_flags (or NO).
amd_program="/usr/sbin/amd" # path to amd, if you want a different one.
amd_flags="-a /.amd_mnt -l syslog /host /etc/amd.map /net /etc/amd.map"
amd_map_program="NO"        # Can be set to "ypcat -k amd.master"
autofs_enable="NO"          # Run autofs daemons.
などと記述されてます。必要に応じて/etc/rc.confに書き写してから設定します。

ntpd.confのpool指示子

NTPの設定について
FreeBSD 11でntpdを設定する 
http://www.sakashita-net.jp/2016/12/freebsd-11ntpd.html
でNICTのntpサーバーについては
pool ntp.nict.jp
と書くことにしたのですが、翌日になっても同期がされないようです。
# ntpq -p
     remote           refid st t when poll reach delay   offset  jitter
=======================================================================
 LOCAL(0)        .LOCL.     10 l    3   64    1  0.000    0.000   0.000
 ntp.nict.jp     .POOL.     16 p    -   64    0  0.000    0.000   0.000
これについて調べてみると、以下の記述を見つけました。
NTPの問い合わせ先をpool1箇所だけにするsedワンライナー
http://qiita.com/yunano/items/24e062987964023bc522


poolディレクティブを使うとそのFQDNに対してDNSラウンドロビンされたIPアドレス群を取得し、それぞれを問い合わせ先として使ってくれる。

$ ntpq -p
     remote           refid st t when poll reach delay   offset  jitter
=======================================================================
 ntp.nict.jp     .POOL.     16 p    -   64    0  0.000    0.000   0.000
+ntp-b2.nict.go. .NICT.      1 u   48   64    7  5.821  -69.727  62.623
*ntp-b3.nict.go. .NICT.      1 u   59   64    3  7.504  -64.560  30.538
+ntp-a2.nict.go. .NICT.      1 u   49   64    7  10.237  -71.578  65.055
+ntp-a3.nict.go. .NICT.      1 u   55   64    7  8.362  -66.616  60.709
上記のようにpoolに書いたサーバーの一覧が出るようなのですが、私の環境でではうまくいかないようです。同期の状態を見てもreach noneになっています。
# ntpq -c assoc

ind assid status  conf reach auth condition  last_event cnt
===========================================================
  1 45322  963a   yes   yes  none  sys.peer    sys_peer  3
  2 45323  8811   yes  none  none    reject    mobilize  1
#
なので、ntp.nict.go.jpで帰ってくるすべてのIPアドレスについて、server指示子で名前を使って指定することにしました。
# drill ntp.nict.go.jp

;; ANSWER SECTION:
ntp.nict.go.jp. 20172 IN A 133.243.238.243
ntp.nict.go.jp. 20172 IN A 133.243.238.244
ntp.nict.go.jp. 20172 IN A 133.243.238.163
ntp.nict.go.jp. 20172 IN A 133.243.238.164

# drill -x 133.243.238.243

;; ANSWER SECTION:
243.238.243.133.in-addr.arpa. 18853 IN PTR ntp-a2.nict.go.jp.

# cat /etc/ntp.conf

server ntp-a2.nict.go.jp
server ntp-a3.nict.go.jp
server ntp-b2.nict.go.jp
server ntp-b3.nict.go.jp
#
server ntp1.jst.mfeed.ad.jp
server ntp2.jst.mfeed.ad.jp
server ntp3.jst.mfeed.ad.jp
#
server 0.jp.pool.ntp.org
server 1.jp.pool.ntp.org
server 2.jp.pool.ntp.org
ついでにntp.orgの日本でのサーバーも追加しました。

2016年12月12日月曜日

FreeBSD 11でntpdを設定する

FreeBSD 11でntpdを設定するには以下のようにします。/etc/ntp/confに以下のような記述があります。
# cat /etc/ntp.conf

#
# If a server loses sync with all upstream servers, NTP clients
# no longer follow that server. The local clock can be configured
# to provide a time source when this happens, but it should usually
# be configured on just one server on a network. For more details see
# http://support.ntp.org/bin/view/Support/UndisciplinedLocalClock
# The use of Orphan Mode may be preferable.
#
#server 127.127.1.0
#fudge 127.127.1.0 stratum 10
これに従って、末尾に以下の設定を加えます。
server 127.127.1.0
fudge 127.127.1.0 stratum 10
次に、参照するNTPサーバーを設定します。
デフォルトでは、
server 0.freebsd.pool.ntp.org iburst
server 1.freebsd.pool.ntp.org iburst
server 2.freebsd.pool.ntp.org iburst
#server 3.freebsd.pool.ntp.org iburst
とあり、FreeBSD用のNTPサーバーがあるようです。ただ、これらは海外にあるものもあるようなので、ネットワーク的に近いサーバーを利用するようにします。

まずNICTのNTPサーバーの設定を確認します。
[Q.1-1]     設定方法を教えてください。
http://jjy.nict.go.jp/tsp/PubNtp/qa.html#q1-1

ntpd の場合 (Linux や FreeBSD など)
/etc/ntp.conf に次の1行を加えてください。
pool ntp.nict.jp

バージョン 4.2.6 以降をご利用ください。
これに従って設定をします。
次にインターネットマルチフィードの利用法を確認します。
NTPの使い方
http://www.jst.mfeed.ad.jp/about/04.html
UNIX (Linuxなど) の場合

www.ntp.org で配布されているntpdが利用出来ます。ntp.confに以下のようにご記述ください。
server ntp1.jst.mfeed.ad.jp
server ntp2.jst.mfeed.ad.jp
server ntp3.jst.mfeed.ad.jp
指定方法にpoolとserverの違いがあります。man ntp.confで調べてみました。
Configuration Commands
     The various modes are determined by the command keyword and the type of
     the required IP address.  Addresses are classed by type as (s) a remote
     server or peer (IPv4 class A, B and C), (b) the broadcast address of a
     local interface, (m) a multicast address (IPv4 class D), or (r) a
     reference clock address (127.127.x.x).  
     …
     pool    For type s addresses, this command mobilizes a persistent client
             mode association with a number of remote servers.  In this mode
             the local clock can synchronized to the remote server, but the
             remote server can never be synchronized to the local clock.

     server  For type s and r addresses, this command mobilizes a persistent
             client mode association with the specified remote server or local
             radio clock.  In this mode the local clock can synchronized to
             the remote server, but the remote server can never be
             synchronized to the local clock.  This command should not be used
             for type b or m addresses.
poolだとそのアドレスで指定した複数のサーバー、serverは指定した1つのサーバーを参照するようです。調べてみると、以下のような説明を見つけました。
NTPサーバの設定
http://vogel.at.webry.info/201501/article_5.html

インターネットマルチフィード (MFEED)の NTPサーバ ntp.jst.mfeed.ad.jp を指定する場合、

server ntp.jst.mfeed.ad.jp

とすると、ntp.jst.mfeed.ad.jp はDNSラウンドロビンによって以下のいずれかが選択されます。
このように、上位NTPサーバ側では、複数台のNTPサーバに負荷分散をさせることが出来ます。

ntp1.jst.mfeed.ad.jp
ntp2.jst.mfeed.ad.jp
ntp3.jst.mfeed.ad.jp

一方、server行では無く、pool行でも上位NTPサーバを指定できます。

pool ホスト名

pool行に指定した場合は、DNSラウンドロビンの全てのサーバを指定したことと同等になります。
例えば、独立行政法人情報通信研究機構 (NICT)のNTPサーバ ntp.nict.jp を指定します。

pool ntp.nict.jp

これは、下記と同等の設定になります。
server ntp-b3.nict.go.jp
server ntp-a2.nict.go.jp
server ntp-a3.nict.go.jp
server ntp-b2.nict.go.jp

同様に、

pool ntp.jst.mfeed.ad.jp

とすると、下記と同等になります。

server ntp1.jst.mfeed.ad.jp
server ntp2.jst.mfeed.ad.jp
server ntp3.jst.mfeed.ad.jp
今回の設定では、それぞれのサイトの説明の通りに記述することにします。

FreeBSD 11で/tmpをtmpfsにする

FreeBSD 11で/tmpをtmpfsで構成するには/etc/fstabに次のように記述します。
# cat /etc/fstab
# Device Mountpoint FStype  Options               Dump Pass#

tmpfs    /tmp       tmpfs   rw,mode=1777,size=16G 0    0
#
ただし、zfs rootで構成した場合には/tmpはzfsで提供されているので、zfsの設定を変える必要があります。
# df -h
Filesystem              Size    Used   Avail Capacity  Mounted on
zkona00/ROOT/default    3.5T    498M    3.5T     0%    /

zkona00/tmp             3.5T    532K    3.5T     0%    /tmp

#
 zkona00/tmpのマウントポイントを変更します。
# zfs list zkona00/tmp
NAME                   USED  AVAIL  REFER  MOUNTPOINT
zkona00/tmp            532K  3.48T   532K  /tmp
# zfs set mountpoint=/tmp.ORG zkona00/tmp
# zfs list zkona00/tmp
NAME          USED  AVAIL  REFER  MOUNTPOINT
zkona00/tmp   532K  3.48T   532K  /tmp.ORG
# df -h /tmp
Filesystem              Size    Used   Avail Capacity  Mounted on
zkona00/ROOT/default    3.5T    498M    3.5T     0%    /
#
ここで/tmpをマウントします。
# mount /tmp
# df -h /tmp
Filesystem    Size    Used   Avail Capacity  Mounted on
tmpfs          16G    4.0K     16G     0%    /tmp
#
/etc/fstabの記述にあるように/tmpがtmpfsで提供されています。この後、再起動して、動作を確認しましょう。

zfsでファイルシステムの利用できる容量を指定する

zfsでファイルシステムの利用できる容量を指定するにはquotaを使います。
# zfs list        
NAME                   USED  AVAIL  REFER  MOUNTPOINT
zkona00               34.7G  3.48T    96K  /disk/kona/zkona00

zkona00/var           33.0G  3.48T    96K  /var
zkona00/var/audit       96K  3.48T    96K  /var/audit
zkona00/var/crash       96K  3.48T    96K  /var/crash
zkona00/var/log        336K  3.48T   336K  /var/log
zkona00/var/mail       144K  3.48T   144K  /var/mail
zkona00/var/swap      33.0G  3.51T    64K  -
zkona00/var/tmp         96K  3.48T    96K  /var/tmp

# zfs set quota=500G zkona00/var
# zfs list
NAME                   USED  AVAIL  REFER  MOUNTPOINT
zkona00               34.7G  3.48T    96K  /disk/kona/zkona00

zkona00/var           33.0G   467G    96K  /var
zkona00/var/audit       96K   467G    96K  /var/audit
zkona00/var/crash       96K   467G    96K  /var/crash
zkona00/var/log        336K   467G   336K  /var/log
zkona00/var/mail       144K   467G   144K  /var/mail
zkona00/var/swap      33.0G   500G    64K  -
zkona00/var/tmp         96K   467G    96K  /var/tmp

#
/varに対してset quota=500Gで500GBの上限を設定したところ、AVAILの値が3.48TBから467GBに減っていることがわかります。また/varに設定したので、その下にある/var/logなども467GBに減っています。

設定を解除するにはquota=noneとします。
# zfs set quota=none zkona00/var
# zfs list
NAME                   USED  AVAIL  REFER  MOUNTPOINT
zkona00               34.7G  3.48T    96K  /disk/kona/zkona00

zkona00/var           33.0G  3.48T    96K  /var
zkona00/var/audit       96K  3.48T    96K  /var/audit
zkona00/var/crash       96K  3.48T    96K  /var/crash
zkona00/var/log        336K  3.48T   336K  /var/log
zkona00/var/mail       144K  3.48T   144K  /var/mail
zkona00/var/swap      33.0G  3.51T    64K  -
zkona00/var/tmp         96K  3.48T    96K  /var/tmp

#

2016年12月9日金曜日

FreeBSD 11のインストール(zfs root/mirrorの場合) - 6

追加したディスクのパーティションも、起動ディスクと同じようなパーティション構成にしてみたので、ブートコードの書き込みの練習をしてみます。

まずブートコードを書き込みます。
# gpart show ada1 ada2
=>        40  7814037088  ada1  GPT  (3.6T)
          40        1600     1  efi  (800K)
        1640        1024     2  freebsd-boot  (512K)
        2664        1432        - free -  (716K)
        4096  7814031360     3  freebsd-zfs  (3.6T)
  7814035456        1672        - free -  (836K)

=>        40  3907029088  ada2  GPT  (1.8T)
          40        1600     1  efi  (800K)
        1640        1024     2  freebsd-boot  (512K)
        2664        1432        - free -  (716K)
        4096  3907025024     3  freebsd-zfs  (1.8T)
  3907029120           8        - free -  (4.0K)
 

# gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 2 ada2
partcode written to ada2p2
bootcode written to ada2
#
-i 2 ada2でディスクada2の2番目のパーティション、freebsd-bootにブートコードを書き込みます。

次にEFIブートコードです。
# dd if=/boot/boot1.efifat of=/dev/ada2p1
1600+0 records in
1600+0 records out
819200 bytes transferred in 0.991747 secs (826017 bytes/sec)
 ada2の1番目のパーティションに書き込みました。中身を確かめてみましょう。
# mount -t msdosfs /dev/ada2p1 /mnt
[root@kona /usr/home/ss]# ls /mnt
efi
# ls -R /mnt
efi

/mnt/efi:
boot

/mnt/efi/boot:
bootx64.efi    startup.nsh

#
それらしいものが入っています。

実際、EFIからada2を指定して起動してみると、正しく起動します。他のブートコードをインストールしていないディスクada3〜ada5を指定すると起動しません。なので、ブートコードの冗長化の役には立つかもしれません

FreeBSD 11のインストール(zfs root/mirrorの場合) - 5

新しく接続したディスクのパーティションを、既存のディスクと同じようにしたい場合には、gpart backup/restoreを使います。
# gpart show
=>        40  7814037088  ada0  GPT  (3.6T)
          40        1600     1  efi  (800K)
        1640        1024     2  freebsd-boot  (512K)
        2664        1432        - free -  (716K)
        4096  7814031360     3  freebsd-zfs  (3.6T)
  7814035456        1672        - free -  (836K)

=>        40  7814037088  ada1  GPT  (3.6T)
          40        1600     1  efi  (800K)
        1640        1024     2  freebsd-boot  (512K)
        2664        1432        - free -  (716K)
        4096  7814031360     3  freebsd-zfs  (3.6T)
  7814035456        1672        - free -  (836K)

=>        40  3907029088  ada2  GPT  (1.8T)
          40  3907029088        - free -  (1.8T)

=>        40  3907029088  ada3  GPT  (1.8T)
          40  3907029088        - free -  (1.8T)

=>        40  3907029088  ada4  GPT  (1.8T)
          40  3907029088        - free -  (1.8T)

=>        40  3907029088  ada5  GPT  (1.8T)
          40  3907029088        - free -  (1.8T)

#
ada0とada1は4TB、ada2〜ada5は2TBのHDDです。単純にada1のパーティション情報をada2に書き込んでみるとエラーになります。
# gpart backup ada1 | gpart restore -F ada2
gpart: size '7814031360': Invalid argument
# gpart backup ada1
GPT 152
1            efi         40       1600 efiboot1
2   freebsd-boot       1640       1024 gptboot1
3    freebsd-zfs       4096 7814031360 disk1
#
3つ目のパーティションはこのディスクには大きすぎるので、3つ目のパーティション情報以外を書き込むことにします。
# gpart backup ada1 | head -3
GPT 152
1            efi         40       1600 efiboot1
2   freebsd-boot       1640       1024 gptboot1
# gpart backup ada1 | head -3 | gpart restore -F ada2
# gpart show ada1 ada2
=>        40  7814037088  ada1  GPT  (3.6T)
          40        1600     1  efi  (800K)
        1640        1024     2  freebsd-boot  (512K)
        2664        1432        - free -  (716K)
        4096  7814031360     3  freebsd-zfs  (3.6T)
  7814035456        1672        - free -  (836K)

=>        40  3907029088  ada2  GPT  (1.8T)
          40        1600     1  efi  (800K)
        1640        1024     2  freebsd-boot  (512K)
        2664  3907026464        - free -  (1.8T)

#
そして3つ目のパーティションはコマンドで陽にして指定して作ります。
# gpart add -t freebsd-zfs -b 4096 ada2
ada2p3 added
# gpart show ada1 ada2
=>        40  7814037088  ada1  GPT  (3.6T)
          40        1600     1  efi  (800K)
        1640        1024     2  freebsd-boot  (512K)
        2664        1432        - free -  (716K)
        4096  7814031360     3  freebsd-zfs  (3.6T)
  7814035456        1672        - free -  (836K)

=>        40  3907029088  ada2  GPT  (1.8T)
          40        1600     1  efi  (800K)
        1640        1024     2  freebsd-boot  (512K)
        2664        1432        - free -  (716K)
        4096  3907025024     3  freebsd-zfs  (1.8T)
  3907029120           8        - free -  (4.0K)

#
ラベルはないので、これも指定します。
# gpart show -l ada1 ada2
=>        40  7814037088  ada1  GPT  (3.6T)
          40        1600     1  efiboot1  (800K)
        1640        1024     2  gptboot1  (512K)
        2664        1432        - free -  (716K)
        4096  7814031360     3  disk1  (3.6T)
  7814035456        1672        - free -  (836K)

=>        40  3907029088  ada2  GPT  (1.8T)
          40        1600     1  (null)  (800K)
        1640        1024     2  (null)  (512K)
        2664        1432        - free -  (716K)
        4096  3907025024     3  (null)  (1.8T)
  3907029120           8        - free -  (4.0K)

# gpart modify -i 1 -l efiboot2 ada2
ada2p1 modified
# gpart modify -i 2 -l gptboot2 ada2
ada2p2 modified
# gpart modify -i 3 -l disk2 ada2
ada2p3 modified
# gpart show -l ada1 ada2
=>        40  7814037088  ada1  GPT  (3.6T)
          40        1600     1  efiboot1  (800K)
        1640        1024     2  gptboot1  (512K)
        2664        1432        - free -  (716K)
        4096  7814031360     3  disk1  (3.6T)
  7814035456        1672        - free -  (836K)

=>        40  3907029088  ada2  GPT  (1.8T)
          40        1600     1  efiboot2  (800K)
        1640        1024     2  gptboot2  (512K)
        2664        1432        - free -  (716K)
        4096  3907025024     3  disk2  (1.8T)
  3907029120           8        - free -  (4.0K)

#
gpart backup/retoreを使うと、/dev/gptにディスクが現れないので、再起動します
# ls /dev/gpt
disk0        efiboot0    gptboot0
disk1        efiboot1    gptboot1
# reboot

# ls /dev/gpt
disk0        efiboot0    gptboot0
disk1        efiboot1    gptboot1
#

FreeBSD 11のインストール(zfs root/mirrorの場合) - 4

このサーバーには以下のように6台のHDDがあり、ada0とada1はルートファイルシステムとして使っています。
# camcontrol devlist
<ST4000DM000-2AE166 0001>          at scbus0 target 0 lun 0 (pass0,ada0)
<ST4000DM000-2AE166 0001>          at scbus1 target 0 lun 0 (pass1,ada1)
<ST2000DM001-9YN164 CC4C>          at scbus2 target 0 lun 0 (pass2,ada2)
<ST2000DM001-9YN164 CC4C>          at scbus3 target 0 lun 0 (pass3,ada3)
<WDC WD20EZRX-00DC0B0 80.00A80>    at scbus4 target 0 lun 0 (pass4,ada4)
<WDC WD20EZRX-00DC0B0 80.00A80>    at scbus5 target 0 lun 0 (pass5,ada5)
#
パーティション情報はada0とada1だけに設定されています。
# gpart show
=>        40  7814037088  ada0  GPT  (3.6T)
          40        1600     1  efi  (800K)
        1640        1024     2  freebsd-boot  (512K)
        2664        1432        - free -  (716K)
        4096  7814031360     3  freebsd-zfs  (3.6T)
  7814035456        1672        - free -  (836K)

=>        40  7814037088  ada1  GPT  (3.6T)
          40        1600     1  efi  (800K)
        1640        1024     2  freebsd-boot  (512K)
        2664        1432        - free -  (716K)
        4096  7814031360     3  freebsd-zfs  (3.6T)
  7814035456        1672        - free -  (836K)
#
残りの4台をZFSで利用するには以下にようにします。

まず最初はパーティションタイプを設定します。
# gpart create -s gpt ada2
ada2 created
# gpart create -s gpt ada3
ada3 created
# gpart create -s gpt ada4 

ada4 created
# gpart create -s gpt ada5

ada5 created
# gpart show
=>        40  7814037088  ada0  GPT  (3.6T)
          40        1600     1  efi  (800K)
        1640        1024     2  freebsd-boot  (512K)
        2664        1432        - free -  (716K)
        4096  7814031360     3  freebsd-zfs  (3.6T)
  7814035456        1672        - free -  (836K)

=>        40  7814037088  ada1  GPT  (3.6T)
          40        1600     1  efi  (800K)
        1640        1024     2  freebsd-boot  (512K)
        2664        1432        - free -  (716K)
        4096  7814031360     3  freebsd-zfs  (3.6T)
  7814035456        1672        - free -  (836K)

=>        40  3907029088  ada2  GPT  (1.8T)
          40  3907029088        - free -  (1.8T)

=>        40  3907029088  ada3  GPT  (1.8T)
          40  3907029088        - free -  (1.8T)

=>        40  3907029088  ada4  GPT  (1.8T)
          40  3907029088        - free -  (1.8T)

=>        40  3907029088  ada5  GPT  (1.8T)
          40  3907029088        - free -  (1.8T)

#
次にパーティションを設定します。このとき-lでラベル名disk2、-tでパーティションタイプfreebsd-zfs、-a 4kで4k境界での割り当てを指定しています。
# ls /dev/gpt
disk0        efiboot0    gptboot0
disk1        efiboot1    gptboot1
# gpart add -t freebsd-zfs -l disk2 -a 4k ada2
ada2p1 added
# gpart show
=>        40  7814037088  ada0  GPT  (3.6T)
          40        1600     1  efi  (800K)
        1640        1024     2  freebsd-boot  (512K)
        2664        1432        - free -  (716K)
        4096  7814031360     3  freebsd-zfs  (3.6T)
  7814035456        1672        - free -  (836K)

=>        40  7814037088  ada1  GPT  (3.6T)
          40        1600     1  efi  (800K)
        1640        1024     2  freebsd-boot  (512K)
        2664        1432        - free -  (716K)
        4096  7814031360     3  freebsd-zfs  (3.6T)
  7814035456        1672        - free -  (836K)

=>        40  3907029088  ada2  GPT  (1.8T)
          40  3907029080     1  freebsd-zfs  (1.8T)
  3907029120           8        - free -  (4.0K)

=>        40  3907029088  ada3  GPT  (1.8T)
          40  3907029080        - free -  (4.0K)

=>        40  3907029088  ada4  GPT  (1.8T)
          40  3907029088        - free -  (1.8T)

=>        40  3907029088  ada5  GPT  (1.8T)
          40  3907029088        - free -  (1.8T)

# ls /dev/gpt
disk0        disk2        efiboot1    gptboot1
disk1        efiboot0     gptboot0
#
次にZFSプールを作ります。
# zpool create -m /disk/kona/zkona10 zkona10 gpt/disk2
# zpool status zkona10
  pool: zkona10
 state: ONLINE
  scan: none requested
config:

    NAME         STATE     READ WRITE CKSUM
    zkona10      ONLINE       0     0     0
      gpt/disk2  ONLINE       0     0     0

errors: No known data errors
#
-mでマウントポイントを、gpt/disk2でラベル名を使ってデバイスを指定しています。

ルートファイルシステムと同じようにミラー構成にするには以下のようにします。
まずada3をada2と同じパーティションにします。
# gpart show ada2 ada3
=>        40  3907029088  ada2  GPT  (1.8T)
          40  3907029080     1  freebsd-zfs  (1.8T)
  3907029120           8        - free -  (4.0K)

=>        40  3907029088  ada3  GPT  (1.8T)
          40  3907029088        - free -  (1.8T)

# gpart add -t freebsd-zfs -l disk3 -a 4k ada3
ada3p1 added
# gpart show ada2 ada3
=>        40  3907029088  ada2  GPT  (1.8T)
          40  3907029080     1  freebsd-zfs  (1.8T)

  3907029120           8        - free -  (4.0K)

=>        40  3907029088  ada3  GPT  (1.8T)
          40  3907029080     1  freebsd-zfs  (1.8T)
  3907029120           8        - free -  (4.0K)

# ls /dev/gpt
disk0        disk2        efiboot0    gptboot0
disk1        disk3        efiboot1    gptboot1
次にzkona10のgpt/disk3をattachします。
# zpool attach zkona10 gpt/disk2 gpt/disk3
# zpool status zkona10
  pool: zkona10
 state: ONLINE
  scan: resilvered 324K in 0h0m with 0 errors on Fri Dec  9 14:57:41 2016
config:

    NAME           STATE     READ WRITE CKSUM
    zkona10        ONLINE       0     0     0
      mirror-0     ONLINE       0     0     0
        gpt/disk2  ONLINE       0     0     0
        gpt/disk3  ONLINE       0     0     0

errors: No known data errors
#
ada4、ada5についても同じように作業します。

2016年12月8日木曜日

FreeBSD 11のインストール(zfs root/mirrorの場合) - 3

FreeBSD 11のインストールの続きです。

swapを設定する

CDからのインストール時にはswapは0にしたので、現在はswapの設定がありません。
# swapinfo
Device          512-blocks     Used    Avail Capacity
[root@kona /usr/home/ss]# gpart show
=>        40  7814037088  ada0  GPT  (3.6T)
          40        1600     1  efi  (800K)
        1640        1024     2  freebsd-boot  (512K)
        2664        1432        - free -  (716K)
        4096  7814031360     3  freebsd-zfs  (3.6T)
  7814035456        1672        - free -  (836K)

=>        40  7814037088  ada1  GPT  (3.6T)
          40        1600     1  efi  (800K)
        1640        1024     2  freebsd-boot  (512K)
        2664        1432        - free -  (716K)
        4096  7814031360     3  freebsd-zfs  (3.6T)
  7814035456        1672        - free -  (836K)


#
zfs上にswapファイルを置くので、zfsコマンドで32GBのswap用のファイルを作ります。
# zfs list
NAME                   USED  AVAIL  REFER  MOUNTPOINT
zkona00               1.60G  3.51T    96K  /zkona00
zkona00/ROOT           387M  3.51T    96K  none
zkona00/ROOT/default   387M  3.51T   387M  /
zkona00/tmp            484K  3.51T   484K  /tmp
zkona00/usr           1.22G  3.51T    96K  /usr
zkona00/usr/home       136K  3.51T   136K  /usr/home
zkona00/usr/ports      640M  3.51T   640M  /usr/ports
zkona00/usr/src        608M  3.51T   608M  /usr/src
zkona00/var            648K  3.51T    96K  /var
zkona00/var/audit       96K  3.51T    96K  /var/audit
zkona00/var/crash       96K  3.51T    96K  /var/crash
zkona00/var/log        168K  3.51T   168K  /var/log
zkona00/var/mail        96K  3.51T    96K  /var/mail
zkona00/var/tmp         96K  3.51T    96K  /var/tmp
# zfs create -V 32gb zkona00/var/swap
# zfs list
NAME                   USED  AVAIL  REFER  MOUNTPOINT
zkona00               34.6G  3.48T    96K  /zkona00

zkona00/var/swap      33.0G  3.51T    64K  -

zkona00/var/tmp         96K  3.48T    96K  /var/tmp
#
次にzkona00/var/swapをスワップ領域として設定します。
# zfs set org.freebsd:swap=on zkona00/var/swap
# zfs get org.freebsd:swap zkona00/var/swap
NAME              PROPERTY          VALUE             SOURCE
zkona00/var/swap  org.freebsd:swap  on                local
# reboot

$ swapinfo -g
Device          1G-blocks     Used    Avail Capacity
/dev/zvol/zkona00/var/swap        32        0       32     0%
$

zfsで使用するパーティションをラベルで参照する

先日、以下のようなことを書きました。
追記: ZFSに使うパーティションをラベルで参照する
http://www.sakashita-net.jp/2016/11/freebsd-11zfs-rootmirror.html

bsd-installだとzfsに使うパーティションの参照が物理デバイス名になっています。
物理デバイス名は、接続されているディスク数によって変わってしまうので、故障のときにうまくありません。
以下に変更の手順を示します。

まず現状を確認します。
$ zpool status
  pool: zkona00
 state: ONLINE
  scan: none requested
config:

    NAME        STATE     READ WRITE CKSUM
    zkona00     ONLINE       0     0     0
      mirror-0  ONLINE       0     0     0
        ada0p3  ONLINE       0     0     0
        ada1p3  ONLINE       0     0     0

errors: No known data errors
$ gpart show
=>        40  7814037088  ada0  GPT  (3.6T)
          40        1600     1  efi  (800K)
        1640        1024     2  freebsd-boot  (512K)
        2664        1432        - free -  (716K)
        4096  7814031360     3  freebsd-zfs  (3.6T)
  7814035456        1672        - free -  (836K)

=>        40  7814037088  ada1  GPT  (3.6T)
          40        1600     1  efi  (800K)
        1640        1024     2  freebsd-boot  (512K)
        2664        1432        - free -  (716K)
        4096  7814031360     3  freebsd-zfs  (3.6T)
  7814035456        1672        - free -  (836K)
$
zfsのプールはada0p3とada1p3のようにデバイス名で参照されています。これをパーティションテーブルに設定したラベルを参照するに変更します。

まずラベルが/dev/gptの下に見えるように設定を変更します。
# vi /boot/loader.conf

kern.geom.label.gptid.enable="1"

# reboot
現在のラベルを確認すると、まだ設定していないことがわかります。
# gpart show ada0 ada1
=>        40  7814037088  ada0  GPT  (3.6T)
          40        1600     1  efi  (800K)
        1640        1024     2  freebsd-boot  (512K)
        2664        1432        - free -  (716K)
        4096  7814031360     3  freebsd-zfs  (3.6T)
  7814035456        1672        - free -  (836K)

=>        40  7814037088  ada1  GPT  (3.6T)
          40        1600     1  efi  (800K)
        1640        1024     2  freebsd-boot  (512K)
        2664        1432        - free -  (716K)
        4096  7814031360     3  freebsd-zfs  (3.6T)
  7814035456        1672        - free -  (836K)

# gpart show -l ada0 ada1
=>        40  7814037088  ada0  GPT  (3.6T)
          40        1600     1  efiboot0  (800K)
        1640        1024     2  gptboot0  (512K)
        2664        1432        - free -  (716K)
        4096  7814031360     3  (null)  (3.6T)
  7814035456        1672        - free -  (836K)

=>        40  7814037088  ada1  GPT  (3.6T)
          40        1600     1  efiboot1  (800K)
        1640        1024     2  gptboot1  (512K)
        2664        1432        - free -  (716K)
        4096  7814031360     3  (null)  (3.6T)
  7814035456        1672        - free -  (836K)

#
3番目のパーティション、パーティションタイプがfreebsd-zfsとなっているところにラベル、disk0とdisk1を設定します。
# gpart modify -i 3 -l disk0 ada0
ada0p3 modified
# gpart modify -i 3 -l disk0 ada1
ada1p3 modified
# gpart show -l ada0 ada1
=>        40  7814037088  ada0  GPT  (3.6T)
          40        1600     1  efiboot0  (800K)
        1640        1024     2  gptboot0  (512K)
        2664        1432        - free -  (716K)
        4096  7814031360     3  disk0  (3.6T)
  7814035456        1672        - free -  (836K)

=>        40  7814037088  ada1  GPT  (3.6T)
          40        1600     1  efiboot1  (800K)
        1640        1024     2  gptboot1  (512K)
        2664        1432        - free -  (716K)
        4096  7814031360     3  disk0  (3.6T)
  7814035456        1672        - free -  (836K)

#
次にミラー構成のディスクの片側を外して(detach)、ふたたびラベル参照で取り付けます(attach)。最初にada0p3を外します。
# zpool status
  pool: zkona00
 state: ONLINE
  scan: none requested
config:

    NAME        STATE     READ WRITE CKSUM
    zkona00     ONLINE       0     0     0
      mirror-0  ONLINE       0     0     0
        ada0p3  ONLINE       0     0     0
        ada1p3  ONLINE       0     0     0

errors: No known data errors
# zpool detach zkona00 ada0p3
# zpool status
  pool: zkona00
 state: ONLINE
  scan: none requested
config:

    NAME        STATE     READ WRITE CKSUM
    zkona00     ONLINE       0     0     0
      ada1p3    ONLINE       0     0     0

errors: No known data errors
 ada0p3の代わりにgpt/disk0というラベル名で取り付けます。
# ls /dev/gpt
disk0        efiboot1    gptboot1    swap1
efiboot0    gptboot0    swap0
# zpool attach zkona00 ada1p3 gpt/disk0
Make sure to wait until resilver is done before rebooting.

If you boot from pool 'zkona00', you may need to update
boot code on newly attached disk 'gpt/disk0'.

Assuming you use GPT partitioning and 'da0' is your new boot disk
you may use the following command:

    gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 da0

# zpool status
  pool: zkona00
 state: ONLINE
status: One or more devices is currently being resilvered.  The pool will
    continue to function, possibly in a degraded state.
action: Wait for the resilver to complete.
  scan: resilver in progress since Thu Dec  8 07:24:58 2016
        236M scanned out of 1.60G at 26.2M/s, 0h0m to go
        236M resilvered, 14.41% done
config:

    NAME           STATE     READ WRITE CKSUM
    zkona00        ONLINE       0     0     0
      mirror-0     ONLINE       0     0     0
        ada1p3     ONLINE       0     0     0
        gpt/disk0  ONLINE       0     0     0  (resilvering)

errors: No known data errors# zpool status
  pool: zkona00
 state: ONLINE
  scan: resilvered 1.60G in 0h0m with 0 errors on Thu Dec  8 07:25:39 2016
config:

    NAME           STATE     READ WRITE CKSUM
    zkona00        ONLINE       0     0     0
      mirror-0     ONLINE       0     0     0
        ada1p3     ONLINE       0     0     0
        gpt/disk0  ONLINE       0     0     0

errors: No known data errors
次にada1p3を外します。
# zpool detach zkona00 ada1p3
# zpool status
  pool: zkona00
 state: ONLINE
  scan: resilvered 1.60G in 0h0m with 0 errors on Thu Dec  8 07:25:39 2016
config:

    NAME         STATE     READ WRITE CKSUM
    zkona00      ONLINE       0     0     0
      gpt/disk0  ONLINE       0     0     0

errors: No known data errors
# ls /dev/gpt
disk0        efiboot0    gptboot0    swap0
disk1        efiboot1    gptboot1    swap1
ada1p3の代わりにgpt/disk1というラベル名で取り付けます。
# zpool attach zkona00 gpt/disk0  gpt/disk1
Make sure to wait until resilver is done before rebooting.

If you boot from pool 'zkona00', you may need to update
boot code on newly attached disk 'gpt/disk1'.

Assuming you use GPT partitioning and 'da0' is your new boot disk
you may use the following command:

    gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 da0

# zpool status
  pool: zkona00
 state: ONLINE
status: One or more devices is currently being resilvered.  The pool will
    continue to function, possibly in a degraded state.
action: Wait for the resilver to complete.
  scan: resilver in progress since Thu Dec  8 07:30:53 2016
        360M scanned out of 1.60G at 32.7M/s, 0h0m to go
        359M resilvered, 21.96% done
config:

    NAME           STATE     READ WRITE CKSUM
    zkona00        ONLINE       0     0     0
      mirror-0     ONLINE       0     0     0
        gpt/disk0  ONLINE       0     0     0
        gpt/disk1  ONLINE       0     0     0  (resilvering)

errors: No known data errors
#
これでzfsのプールに使うパーティションをラベルで参照するように変更できました。

FreeBSD 11ではインストール時にZFSで構成すると圧縮が有効になっているので、ついでに、ここで解除します。理由は性能とファイルシステムの空き容量の推測が難しくなるためです。
# zfs get compression      
NAME                  PROPERTY     VALUE     SOURCE
zkona00               compression  lz4       local
zkona00/ROOT          compression  lz4       inherited from zkona00
zkona00/ROOT/default  compression  lz4       inherited from zkona00
zkona00/tmp           compression  lz4       inherited from zkona00

# zfs set compression=off zkona00
# zfs get compression 
NAME                  PROPERTY     VALUE     SOURCE
zkona00               compression  off       local
zkona00/ROOT          compression  off       inherited from zkona00
zkona00/ROOT/default  compression  off       inherited from zkona00
zkona00/tmp           compression  off       inherited from zkona00
#

FreeBSD 11のインストール(zfs root/mirrorの場合) - 2

FreeBSD 11でミラー構成のZFSから起動する設定でのインストール方法の続きです。
  1. コンソールからrootでログインし、sudoをインストール
    # pkg install sudo
    The packet management tool is no yes intalled on your system.

    Proceed with this action? [y/N]: y
    Fetching sudo-1.8.18p1.txz: …

  2. /usr/local/etc/sudoersに以下を追加
    Defaults        timestamp_timeout = 0
    Defaults        !set_logname

    User_Alias      ADMIN = admin, user1, user2
    ADMIN           ALL = (ALL) ALL
  3. /etc/ssh/sshd_configに以下を追加
    PermitRootLogin         yes
    PasswordAuthentication  yes
    PermitEmptyPasswords    no
  4. sshdを再起動
    # /etc/rc.d/sshd restart
    #
  5. 作業用ユーザーでログインしてログイン後のメッセージを抑止
    %touch .hushlogin
    %
  6. 必要に応じて作業用ユーザーのシェルを変更
    % sudo -s
    Password:
    # pkg install bash

    New packages to be INSTALLED:
        bash: 4.4

    Proceed with this action? [y/N]: y

    # chsh user1

    #
これで、一般ユーザーで sshを使ってログインし、sudoでルート権限を得て作業できるようになります。

FreeBSD 11のインストール(zfs root/mirrorの場合) - 1

FreeBSD 11でミラー構成のZFSから起動する設定でのインストール方法をまとめます。
  1. FreeBSD 11のインストールCDで起動
  2. 「Install」を選択
  3. 「Keymap Selection」で適切なものを選択(たとえば英語キーボードを使用している場合は「United States of America ISO-8859-1」)
  4. キーマップをテスト(「Test us.iso.kbd keymap」を選択)
  5. テスト後、Continue(「Continue with us.iso.kbd keymap」を選択)
  6. 「Set Hostname」でホスト名を設定
  7. 「Distribution Select」でインストールするコンポーネントを選択(必要に応じてdocやsrcを追加)
  8. 「Partitioning」で「Auto(ZFS)」を選択
  9. 「ZFS Configuration」で設定
    Pool Type/Disksでmirror
    Pool Nameでzhost00(他のホストに転送することを考えて、z+ホスト名+番号にしています)
    Force 4K Sectors?はYES
    Encrypt Disks?はNO
    Partition SchemeはGPT(BIOS+UEFI)
    Swap Sizeは0g(スワップはZFS上に設定)
    Mirror Swap?はNo
    Encrypt Swap?はNo
  10. 「>>Install 」を選択「Last Chance!」で「YES」を選択
  11. 「Changing local password for root」でrootのパスワードを設定
  12. 「Network Configuration」でネットワークインターフェイスにIPアドレスやDNSなどを設定
  13. 「Select local or UTC clock」で時計情報を設定(「No」を選択することが多いと思います)
  14. 「Time Zone Selection」で「Asia/Japan」を選択
  15. 「Time & Date」で時刻を設定
  16. 「System Configuration」で起動するデーモンを指定(必要に応じてntpdを追加、zfs上にswapを置とdumpdevは設定できないため、これは外す必要があります)
  17. 「System Hardening」では必要に応じて機能を選択(私は何も選択しませんでした)
  18. Add User Accountsではユーザーを追加(常にrootで作業すると間違ったときに被害が大きくなるため、この時点でインストール作業用のユーザーを追加)
  19. 「Final Configuration」で 「Exit」を選択
  20. 「Manual Configuration」では、今回はインストーラーでの作業は不要なので「NO」
  21. 「Complete」で「Reboot」(事前にインストールCDを外しておきます)
この後は、18で作成したユーザーからroot権限が使えるように設定します。

2016年11月1日火曜日

ZFS root+mirror構成でのディスク障害からからの回復

FreeBSD 11でbsd-installを使って以下のような構成でインストールしている場合の、ディスク障害からからの回復方法のメモです。
  • パーティションはGPT
  • 起動はEFI
  • rootはZFS(ZFS root)
  • 起動パーティションをZFSでミラー 
  • swapもミラー(ただしgmirrorを利用)

 

ディスクを交換する


ディスクada0とada1でZFSを使いミラー構成にしており、ada1が壊れ、これを入れ替えたとします。

 

パーティションを回復する 

backup a partition table with gpart(8)
https://lists.freebsd.org/pipermail/freebsd-geom/2010-November/004489.html 
gpart backup/restoreを使います。
動作しているディスクada0のパーティション情報を、交換したディスクada1に書き込むには以下のようにします。
# gpart backup ada0 | gpart restore -F ada1
#
このあと、gpart show -lでada0のラベルを参照しながら、gpart modifyでada1にラベルを書き込みます。たとえば以下のようにします。
# gpart modify -i 2 -l zfs0 ada0
#

bootコードを回復する

EFI ZFS loader success story
https://lists.freebsd.org/pipermail/freebsd-hackers/2015-August/048141.html
ブートコードを以下のようにして書き込ます。
# gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 2 ada1
#
-iで指定するインデックスに注意します。freebsd-bootパーティションを指定しなければなりません。

 

EFIブートコードを回復する

UEFI
https://wiki.freebsd.org/UEFI
EFIから起動するためのブートコードも書き込まなくてはなりません。
# dd if=/boot/boot1.efifat of=/dev/ada0p1
ada0p1はefiタイプになっているパーティションです。このパーティションは実はFATになっていてマウントすることができます。
Disk Setup On FreeBSD
http://www.wonkity.com/~wblock/docs/html/disksetup.html
そのため、上記のWWWページでも書かれているようにFATイメージ(boot1.efifat)を書き込むのではなく、手動でEFI用のブートコードを設定することもできます。
Create and format a partition to hold the the small MS-DOS filesystem for UEFI bootcode.
# gpart add -t efi -l gpefiboot -a4k -s492k da0
da0p2 added
# newfs_msdos /dev/da0p2


Copy the FreeBSD /boot/boot1.efi bootcode file into the efi filesystem.
# mount -t msdosfs /dev/da0p2 /mnt
# mkdir -p /mnt/EFI/BOOT
# cp /boot/boot1.efi /mnt/EFI/BOOT/
# umount /mnt
こちらでは実際のブートコードであるboot1.efiをコピーしています。ただ.efifatをみると、ブートコードのファイル名はBOOTx64.efiになっているので、もう少し情報を集める必要があります。

 

swapの回復


swapもgmirrorなのでこれからも回復する必要があります。
FreeBSDのgmirrorでのHDD故障対応
http://uls.self.jp/wordpress/freebsd/?p=64
# gmirror forget swap
Name Status Components gmirror/swap COMPLETE ada0
# gmirror insert swap ada1
swap:rebuilding provider ada1.
#

追記: ZFSに使うパーティションをラベルで参照する

bsd-installだとzfsに使うパーティションの参照が物理デバイス名になっています。
物理デバイス名は、接続されているディスク数によって変わってしまうので、故障のときにうまくありません。
zpoolをdisk labelで組み直す
https://blog.bixr.com/2014/03/734/
交換後再起動したら問題発生。
実はda4に割り当てられていたHDDが故障したのでHDDを抜き取り、送付、交換用HDDが届くまで1週間位かかっているのだが、その間、故障してからずっとPCは動作させっぱなしだったので新しくHDDを挿した時にも空いていたda4が再度割り当てられていた。ここで再起動すると認識の順番が変わりda4->da6, da5->da4, da6->da5にずれてしまった。
このため、ラベルを参照するように変更したいのですが、上記のWWWページの手法はルートファイルシステムには適用できません。というのは、zfs exportとするとファイルシステムはアンマウントされますが、ルートファイルシステムはアンマウントできないので、うまくいきません。

このシステムでは、ルートファイルシステムはミラーになっているのでこれをうまく使います。
  1. 片側のディスクを外す(detach)
  2. ラベル参照で追加(attach)して同期
  3. 同期後、残りのディスクを外して、またラベル参照で追加、同期
このとき、事前に/boo/loader.confで
kern.geom.label.gptid.enable=1
としてから起動し直しておく必要があります。