FreeBSD ^/stable/12 ブランチが作成された2018年10月19日 21時14分31秒

FreeBSD の SVN に stable/12 が作成された。ここ数日間控えられていたコミットが head に再開されて、ライブラリなどの更新なども既に入っている。

今後 FreeBSD 12.0-RELEASE に成りうるものを追うのであれば、 svn switch ^/stable/12 で追従先を変更。

FreeBSD ^/stable/12 ブランチが作成された2018年10月19日 21時14分31秒

FreeBSD の SVN に stable/12 が作成された。ここ数日間控えられていたコミットが head に再開されて、ライブラリなどの更新なども既に入っている。

今後 FreeBSD 12.0-RELEASE に成りうるものを追うのであれば、 svn switch ^/stable/12 で追従先を変更。

FreeBSD 12 から rsh が消える ので net/bsdrcmds2018年10月01日 12時59分38秒

ほぼ、一年程前に、FreeBSD CURRENT から rsh と rlogin の r コマンドが削除された。これは FreeBSD 12.0-RELEASE になる。

最近は、仮想環境なども利用するので、閉じたネットワークを構築しその間で rsh 系を使って通信することがむしろ増えた。そんなわけで、この r コマンド削除は一手間になる。rsync や zfs send 等で大容量を送るときは ssh の負荷が大きすぎる。

この r コマンド削除を受けて、net/bsdrcmds が ports に作成された。これを入れることで、rsh が使えるようになる。

rshd と rlogind は /usr/local/sbin に入る。inetd を使って起動する場合は、/etc/inetd.conf を書き換える必要がある。

shell   stream  tcp     nowait  root    /usr/libexec/rshd       rshd
login   stream  tcp     nowait  root    /usr/libexec/rlogind    rlogind
とあるのを
shell   stream  tcp     nowait  root    /usr/local/sbin/rshd       rshd
login   stream  tcp     nowait  root    /usr/local/sbin/rlogind    rlogind
と書き換える必要がある。

この ports からの rshd でも pam は有効になっている。/etc/pam.d/rsh で設定を出来る。

FreeBSD の システムコールと IPv6 の EN が二つずつ2018年09月28日 11時53分59秒

FreeBSD-EN-18:09.ip は SA-18:10.ip の修正が未完全だったために引き起こされた問題。断片化された IPv6 のパケットが正しく復元されずに破棄されてしまう問題。sysctl net.inet6.ip6.maxfrags=0 で回避することは出来る。対象は FreeBSD 11 系のみ。

FreeBSD-EN-18:10.syscall は freebsd4_getfsstat システムコール でメモリの割り当てに失敗したときに、未割当のメモリを free してしまう問題。FreeBSD 4.x 時のバイナリを実行したときに露呈するバグなので、よほど古いバイナリを使い回していない限りは影響は無いだろう。対象は FreeBSD 11 系のみ。

FreeBSD-EN-18:11.listen は IPv6 の listen システムの実装に問題があり、各種変数を正しく戻さないために、かーねるをクラッシュさせる可能性がある。回避策は無い。

FreeBSD-EN-18:12.mem は getcontext と swapcontext のシステムコールが、未完全なメモリの初期化の為に、以前に使われた値がユーザ空間に洩れる問題。対象は FreeBSD 10 系と 11 系の両方。回避策は無い。

amd64 の FreeBSD 12.x の kernel は ifunc が必要2018年09月18日 11時39分15秒

FreeBSD 12.0-RELEASE も近付いてきている。ALPHA-6 に入り、既にテストを行なっている人、そこそろ試してみようかという人などがいるとは思う。11 系からの更新は幾つかの注意点がある。

まずは、ifunc。11 系から上げる人は、buildkernel 時に、CURRENT を追っていて、11 系のシステムに上書きインストールする人は installkernel 時に見掛けると思う。私は、NFS mount 越しの installkernel 時に出てきた。

$ uname -r
11.2-RELEASE-p2
$ mount -t nfs amd64-current:/usr/src /usr/src
$ mount -t nfs amd64-current:/usr/obj /usr/obj
$ make installkernel -C /usr/src
make[2]: "/usr/src/sys/conf/kern.pre.mk" line 126: amd64 kernel requires linker ifunc support
さて /usr/src/sys/conf/kern.pre.mk を覗いてみると、
.if (${MACHINE_CPUARCH} == "amd64" || ${MACHINE_CPUARCH} == "i386") && \
    defined(LINKER_FEATURES) && ${LINKER_FEATURES:Mifunc} == ""
.error amd64/i386 kernel requires linker ifunc support
.endif
.if ${MACHINE_CPUARCH} == "amd64"
LDFLAGS+=       -Wl,-z max-page-size=2097152 -Wl,-z common-page-size=4096 -Wl,-z -Wl,ifunc-noplt
.endif
の部分がこれに当たる。

コードを見るより、/usr/src/UPDATING を開く。

20180510:
        The amd64 kernel now requires a ld that supports ifunc to produce a
        working kernel, either lld or a newer binutils. lld is built by default
        on amd64, and the 'buildkernel' target uses it automatically. However,
        it is not the default linker, so building the kernel the traditional
        way requires LD=ld.lld on the command line (or LD=/usr/local/bin/ld for
        binutils port/package). lld will soon be default, and this requirement
        will go away.
該当部分を発見
$ make installkernel LD=ld.lld -C /usr/src
今度は問題なく installkernel が進んだ。

zfs clone と zfs send で非ミラーファイルシステムを分割2018年09月15日 16時48分38秒

ZFS のファイルシステムを分割したかったのだが、zfs 自体には分割の機能は無い。zpool だと、ミラー型のプールは分割出来るが、こちらはプール単位になってしまい、全てのファイルシステムが複製される。

今回、分割したいと思った理由はバックアップ先の zpool の容量が足りなくなったから。バックアップをとらなくても何とかなるファイルを複製するのを止めたかったのだが、ファイルシステムに混ざっていたので単純な削除では無理だからだ。

zfs clone はファイルシステムを複製する機能だ。これは snapshot を作成し、そこからの差分を元にファイルシステムを利用する機能。これを使えば、元のファイルシステムを複数に分割して使うことが出来る。しかし、元のスナップショットがバックアップを止めたいファイルを保持したままになるので今回の意図には沿わない。

そこで、今回 zfs snapshot と zfs clone で一時的にファイルシステムを複製。そこから対象外のファイルを削除した後に、zfs send と zfs receive で全く別のファイルシステムとして作ることにした。

今回の例として、BSD 関連のファイルをダウンロードしてあった download/BSD ファイルシステムを各々に分けて download/FreeBSD と download/NetBSD の zfs ファイルシステムにする。

$ zfs list -t all
NAME           USED  AVAIL  REFER  MOUNTPOINT
download       421M   411M    23K  /mnt/download
download/BSD   421M   411M   421M  /mnt/download/B
$ ls /mnt/download/ZFS/*
BSD:
FreeBSD NetBSD

FreeBSD:
FreeBSD-11.2-RELEASE-i386.vmdk.xz

NetBSD:
netbsd-8.0-i386-boot-com.iso
実験用に小さめのプールを準備して、各々に一つずつファイルを置いた。
$ zfs snapshot download/BSD@today
$ zfs clone download/BSD@today download/freebsd
$ rm -rf /mnt/download/freebsd/NetBSD
$ zfs snapshot download/freebsd@only
$ zfs send download/freebsd@only | zfs receive download/FreeBSD@only
BSD ファイルシステムから snapshot と clone で freebsd とし、そこから NetBSD を削除。zfs send と receive で元の BSD ファイルシステムとの関係を切断する。

zfs send と receive で一つ目のファイルシステムを処理し終えた状態。

$ zfs list -t all
NAME                    USED  AVAIL  REFER  MOUNTPOINT
download                640M   192M    23K  /mnt/download
download/BSD            421M   192M   421M  /mnt/download/BSD
download/freebsd         13K   192M   219M  /mnt/download/freebsd
download/freebsd@only      0      -   219M  -
download/FreeBSD        219M   192M   219M  /mnt/download/FreeBSD
download/FreeBSD@only      0      -   219M  -

NetBSD の方は BSD ファイルシステムの名前の変更した後に、FreeBSD を消す。

$ zfs destroy download/BSD@today
$ zfs rename download/BSD download/NetBSD
$ rm -rf /mnt/download/NetBSD/FreeBSD
$ zfs list -t all
NAME                    USED  AVAIL  REFER  MOUNTPOINT
download                422M   409M    23K  /mnt/download
download/FreeBSD        219M   409M   219M  /mnt/download/FreeBSD
download/FreeBSD@only    13K      -   219M  -
download/NetBSD         202M   409M   202M  /mnt/download/NetBSD
これで download/BSD を download/FreeBSD と download/NetBSD に分割できた。

もっと手間の掛かるファイルの選別が必要なら clone と promote を用いて、もっと安全に操作することも出来る。NetBSD のファイルの選別も独立したファイルシステム上で行なって、最終確認が終った後に。古い BSD ファイルシステムを削除する手順にすれば、間違ってファイルを消してもやり直しが効く。

FreeBSD elf の SA と lazyfpu の EN が出た2018年09月14日 10時42分18秒

セキュリティ勧告が一つと、エラッタが一つ出ている。

FreeBSD-SA-18:12.elfはプログラムを開始する時の問題。

ELF は実行形式ファイルを示すヘッダーで、どのメモリから実行を開始すれば良いなどの多々の情報が入っている。ELF ヘッダーの処理の点検に欠陥があり、本来ならば実行に移すべきではないヘッダーであっても、ファイルの実行を始めてしまい、カーネルをクラッシュさせたり、カーネルメモリを覗くことができてしまう。

対象はサポートされている全てのバージョンで回避策はない。パッチを当てる必要がある。

FreeBSD-EN-18:08.lazyfpu は FreeBSD-EN-18:07.lazyfpu の修正に問題があり、それを修正するため。 今回の修正は、11系向けだが、10。4にも準備される予定。

FreeBSD のセキュリティ勧告が三つ2018年08月16日 13時35分35秒

FreeBSD-SA-18:09.l1tf L1 Terminal Fault (L1TF) Kernel Information Disclosure は 64bit のシステムで他の仮想システムのメモリを読めてしまう問題。amd64 のbhyve が影響を受ける。今回のパッチは FreeBSD 11 系のみ。FreeBSD 10.4-RELEASE への対応は後日する予定だそうだ。回避策はなく、パッチを当てる必要がある。

FreeBSD-SA-18:10.ip は先日の TCP の脆弱性と似たような問題。こちらも今回のパッチは FreeBSD 11 系のみ。FreeBSD 10.4-RELEASE への対応は後日する予定だそうだ。ただ、こちらは上と違い、sysctl で問題を回避することが出来る。

FreeBSD-SA-18:11.hostapd は wpa、 つまり無線関連の問題。WPA2 TKIP に問題があり、情報が洩れる可能性がある。対象は 11 系と 10 系の全て。TKIP 以外のプロトコルを使って回避する選択肢もある。

今回の修正は、広く使われているヘッダファイルも変更されるので、buildworld も buildkernel も大量のファイルが再コンパイルされる。

SQLite 徹底研究 : SQLite を FreeBSD にインストール2018年08月12日 11時19分12秒

SQLite に依存するオープンソースの製品は多い。恐らく、既に依存関係によってインストールされている場合が多いだろう。

pkg データベースを sqlite で探すとあれこれ各種拡張機能が沢山見付かる。

% pkg search sqlite
R-cran-RSQLite-1.0.0_2         Database Interface R driver for SQLite
R-cran-RSQLite.extfuns-0.0.1_9 SQLite extension functions for RSQLite
bogofilter-sqlite-1.2.4_3      Fast, teachable, learning spam detector
exim-sqlite-4.90.1             High performance MTA for Unix systems on the Internet
fpc-sqlite-3.0.4               Free Pascal interface to SQLite
gosqlite3-20120330_2           Go interface for SQLite3
...
その中の sqlite3 を root ユーザでインストールする。古いバージョンが欲しければ sqlite2 を入れる。
$ pkg install sqlite3

SQLite データベース - Top

FreeBSD tcp のセキュリティ勧告2018年08月08日 12時03分22秒

FreeBSD-SA-18:08.tcp が出ている。TCP のセグメントを再構築するアルゴリズムに不備があり、処理を行わなければいけない量に比例して、処理時間が延びてしまう。そのため、分割されてしまった TCP が増えると、処理時間が掛かるようになる。意図的に分割されたセグメントを送られると、処理能力が劣化する。

対象は、公開されている全てのバージョン。十一系の 11.1-RELEASE と 11.2-RELEASE、十系の 10.4-RELEASE。回避策はあるが、パフォーマンスに影響がでるので、注意が必要らしい。