目次

FreeBSD に関するメモ

DC-TCP

FreeBSD 11.0以降では、TCPのCongestion Control機構としてDC-TCPが利用できる。 これを利用する設定をいかに記載しておく。

なお、Install時の標準は、NewReno。

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してあった。

対処は

  1. Single Userで起動
  2. tunefs -j disable /dev/ada0p1
  3. fsck -y /dev/ada0p1
  4. mount / ; rm /.sujournal
  5. RebootしてSingle Userで起動する
  6. tunefs -j enable /dev/ada0p1
  7. 再度reboot

これで問題が解決した。

FreeBSDにDiskを追加

作成したFreeBSD 11.0にHDDを追加した時に行う作業。

さすがに bsdlabel/disklabel の時代でもあるまいということで、GEOM を使ってみる。

  1. まずは、 Disk をつなぐ
  2. (必要に応じて reboot するなどして) 接続した Disk を認識させる
    • 今回は、仮に /dev/ada1 としよう。
  3. 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は見えない
  4. 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 が存在して はいけない。事前に削除しておくこと
  5. Partition を作成
    1. 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 などとする
  6. これで、Partition が作成できたので、newfsする
    • newfs -J -U /dev/ada1p1 で、gjournal + soft-update を On にする
    • gjournal(-J) の代わりに soft-update journal(-j) を利用することもできるが、 GEOM を利用しているのだから gjournalを利用する
  7. これで 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)
  8. 最後に、Filesystemをmountし、fstabに記載する。

OSの更新(Update/UpGrade)

rc関連の挙動

FreeBSDの起動時処理を大雑把に言うと以下のとおり

  1. initが上がる
  2. rcが実行される
  3. まず、rc.confに記載されている設定を基準に各種daemonを起動する
  4. 次に、rc.conf.localに記載されている設定を基準に各種daemonを起動する

各種daemonの起動には、/etc/rc.d 及び /usr/local/etc/rc.d に格納されている各種起動scriptを利用する。 最近のFreeBSD (おそらくFreeBSD 9.0以降) では、このscriptを呼び出すために、service コマンドが実装されている。起動時のscriptの実行順序を確認するには、service -eを実行すると良い

このscriptは、自身が実行されるタイミングを記載することが可能。

従って、起動順序などを細かく考慮したい場合には、

  1. とにかく早めに起動したい場合は/etc/rc.confに記載する
  2. 後の方で起動したい場合には、/etc/rc.conf.localに記載する
  3. 起動順序はScript内のREQUIRE/BEFOREを利用して制御する

必要がある。