文書の過去の版を表示しています。
FreeBSD に関するメモ
ZFS
Root deviceにzfs を利用している場合、/boot/loader.confでzfs_load=“YES”
が必須になる。間違えてこれを削除してしまった場合、復旧が面倒になるので注意。
- FreeBSDのInstaller USB Memory を作成し、そこからboot
- Installer画面が出たら、shellを起動
zpool import -R /mnt zroot
とzfs mount
を実行する- viで /mnt/boot/loader.confを修正する
WiFi
MS-01に載っている Mediatek MT7922 を Intel AX210NGW に換装したので、その設定を。
- WiFi Deviceを確認する
sysctl net.wlan.devices
を実行- 今回は、
net.wlan.devices: iwlwifi0
が返ってきたので、WiFi Deviceは iwlwifi0
- Network I/F を作成し、起動
ifconfig wlan0 create wlandev iwlwifi0 wlanmode sta country JP
iwlwifi0: WRT: Invalid buffer destination iwlwifi0: WFPM_UMAC_PD_NOTIFICATION: 0x20 iwlwifi0: WFPM_LMAC2_PD_NOTIFICATION: 0x1f iwlwifi0: WFPM_AUTH_KEY_0: 0x90 iwlwifi0: CNVI_SCU_SEQ_DATA_DW9: 0x0 wlan0: Ethernet address: XX:XX:XX:XX:XX:XX
ifconfig wlan0 up
- WEP関係の設定を作成
wpa_passphrase SSID PASS > /etc/wpa_supplicant.conf
chmod 600 /etc/wpa_supplicant.conf; chown root:wheel /etc/wpa_supplicant.conf
- Access Pointに接続
wpa_supplicant -B -i wlan0 -c /etc/wpa_supplicant.conf
- DHCPで IP Addressを取得する
dhclient wlan0
- これで問題がなければ、以下永続化
- /etc/rc.confに以下を追加
wlans_iwm0="wlan0" ifconfig_wlan0="WPA DHCP" create_args_wlan0="country JP regdomain ETSI"
DC-TCP
FreeBSD 11.0以降では、TCPのCongestion Control機構としてDC-TCPが利用できる。 これを利用する設定をいかに記載しておく。
なお、Install時の標準は、NewReno。
- 手動での切り替え
- 以下を実行する
# kldload cc_dctcp # sysctl -w net.inet.tcp.cc.algorithm=dctcp # sysctl -w net.inet.tcp.ecn.enable=1
- ECNの確認(1 or 2であること)
# sysctl net.inet.tcp.ecn.enable 1
- 0: ECNを利用しない
- 1: ECNを利用。送受信
- 2: ECNを利用。受診時のみ
- 永続化
/boot/loader.conf
cc_dctcp_load="YES"
/etc/sysctl.conf
net.inet.tcp.cc.algorithm=dctcp net.inet.tcp.ecn.enable=1
JournalしているUFSでfsckに失敗する
起動時にこんなエラーがでた。
# fsck -y /dev/ada0p1 ** /dev/ada0p1 USE JOURNAL? yes ** SU+J Recovering /dev/ada0p1 ** Reading 33554432 byte journal from inode 5 RECOVER? yes ** Building recovery table. ** Resolving unreferenced inode list. ** Processing journal entries fsck_ufs: Directory 43643675 name not found #
これが出ると、fsckで復旧できない。
このada0p1はJournalをenableにしており、/にmountしてあった。
対処は
- Single Userで起動
- tunefs -j disable /dev/ada0p1
- fsck -y /dev/ada0p1
- mount / ; rm /.sujournal
- RebootしてSingle Userで起動する
- tunefs -j enable /dev/ada0p1
- 再度reboot
これで問題が解決した。
FreeBSDにDiskを追加
作成したFreeBSD 11.0にHDDを追加した時に行う作業。
さすがに bsdlabel/disklabel の時代でもあるまいということで、GEOM を使ってみる。
- まずは、 Disk をつなぐ
- (必要に応じて
reboot
するなどして) 接続した Disk を認識させる- 今回は、仮に
/dev/ada1
としよう。
gpart show
を実行し、ada1
が見えているかを確認# gpart show => 34 41942973 ada0 GPT (20G) 34 1024 1 freebsd-boot (512K) 1058 39844864 2 freebsd-ufs (19G) 39845922 2097084 3 freebsd-swap (1.0G) 41943006 1 - free - (512B)
- この時、まっさらであれば、 GEOM が Disk を認識していない。上記例でも、ada1は見えていない
- XenServer で Disk を追加した時などでは、当然
ada1
は見えない
- Disk Partition を作成する
gpart create -s GPT ada1
を実行。ada1 created
などと出力されればOK# gpart show => 34 41942973 ada0 GPT (20G) 34 1024 1 freebsd-boot (512K) 1058 39844864 2 freebsd-ufs (19G) 39845922 2097084 3 freebsd-swap (1.0G) 41943006 1 - free - (512B) => 40 209715120 ada1 GPT (100G) 40 209715120 - free - (100G)
- 削除したい時には、
gpart destroy ada1
などとすればよい- なお、 destroy する場合、 partition が存在して はいけない。事前に削除しておくこと
- Partition を作成
gpart add -t freebsd-ufs ada1
を実行すると、 Partition を確保する。- 上記のような指定をした場合、空き領域のうち、取得可能な最大領域を確保する。
# gpart show ada1 => 40 209715120 ada1 GPT (100G) 40 209715120 1 freebsd-ufs (100G)
- 領域を指定したい場合、 -b で開始位置、 -s で領域のサイズが指定できる。
- -l を利用してlabelをつけることもできる。labelは便利なので、付けておくことをお勧めする。
- add する際に -l を指定しても良いが、後から追加する場合
gpart modify -i 1 -l update-data ada1
などとする- この -i はindexであり、
gpart show
した時の 左から3番目のフィールド(通常は1〜3程度だろう)の値を指定する - このindexの値が、すなわち Partition 番号であり ada0p2 である場合、p2 が Partition index 2 を示す
- labelを見たい場合、
gpart show -l
などとする # gpart show -l => 34 41942973 ada0 GPT (20G) 34 1024 1 (null) (512K) 1058 39844864 2 (null) (19G) 39845922 2097084 3 (null) (1.0G) 41943006 1 - free - (512B) => 40 209715120 ada1 GPT (100G) 40 209715120 1 update-data (100G)
- Partition を削除したい場合、
gpart delete -i 1 ada1
などとする
- これで、Partition が作成できたので、newfsする
newfs -J -U /dev/ada1p1
で、gjournal + soft-update を On にする- gjournal(-J) の代わりに soft-update journal(-j) を利用することもできるが、 GEOM を利用しているのだから gjournalを利用する
- これで GEOM - UFS な Filesystem が出来上がったので、確認する。
tunefs -p /dev/ada1p1
などとする# tunefs -p /dev/ada1p1 tunefs: POSIX.1e ACLs: (-a) disabled tunefs: NFSv4 ACLs: (-N) disabled tunefs: MAC multilabel: (-l) disabled tunefs: soft updates: (-n) enabled tunefs: soft update journaling: (-j) disabled tunefs: gjournal: (-J) enabled tunefs: trim: (-t) disabled tunefs: maximum blocks per file in a cylinder group: (-e) 4096 tunefs: average file size: (-f) 16384 tunefs: average number of files in a directory: (-s) 64 tunefs: minimum percentage of free space: (-m) 8% tunefs: space to hold for metadata blocks: (-k) 6408 tunefs: optimization preference: (-o) time tunefs: volume label: (-L)
- 最後に、Filesystemをmountし、fstabに記載する。
OSの更新(Update/UpGrade)
freebsd-update fetch
を実行してfreebsd-update install
するのが基本- 何か問題が出たら、
freebsd-update rollback
する
rc関連の挙動
FreeBSDの起動時処理を大雑把に言うと以下のとおり
- initが上がる
- rcが実行される
- まず、rc.confに記載されている設定を基準に各種daemonを起動する
- 次に、rc.conf.localに記載されている設定を基準に各種daemonを起動する
各種daemonの起動には、/etc/rc.d 及び /usr/local/etc/rc.d に格納されている各種起動scriptを利用する。 最近のFreeBSD (おそらくFreeBSD 9.0以降) では、このscriptを呼び出すために、service コマンドが実装されている。起動時のscriptの実行順序を確認するには、service -eを実行すると良い
このscriptは、自身が実行されるタイミングを記載することが可能。
# REQUIRE: foo bar
このScriptはfoo,barが実行されたことを要求する# BEFORE: foo bar
このScriptはfoo,barが実行される前に実行されなければならない
従って、起動順序などを細かく考慮したい場合には、
- とにかく早めに起動したい場合は/etc/rc.confに記載する
- 後の方で起動したい場合には、/etc/rc.conf.localに記載する
- 起動順序はScript内のREQUIRE/BEFOREを利用して制御する
必要がある。