BSD

freebsd-update で出るエラーメッセージ

FreeBSDを13.3にupdateしようと思ったら以下のようなメッセージが出ました。

Installing updates...install: ///usr/include/c++/v1/__string exists but is not a directory
install: ///usr/include/c++/v1/__tuple exists but is not a directory
install: ///usr/include/c++/v1/__string/char_traits.h: Not a directory
install: ///usr/include/c++/v1/__string/constexpr_c_functions.h: Not a directory
install: ///usr/include/c++/v1/__string/extern_template_lists.h: Not a directory
install: ///usr/include/c++/v1/__tuple/make_tuple_types.h: Not a directory
install: ///usr/include/c++/v1/__tuple/pair_like.h: Not a directory
install: ///usr/include/c++/v1/__tuple/sfinae_helpers.h: Not a directory
install: ///usr/include/c++/v1/__tuple/tuple_element.h: Not a directory
install: ///usr/include/c++/v1/__tuple/tuple_indices.h: Not a directory
install: ///usr/include/c++/v1/__tuple/tuple_like.h: Not a directory
install: ///usr/include/c++/v1/__tuple/tuple_like_ext.h: Not a directory
install: ///usr/include/c++/v1/__tuple/tuple_size.h: Not a directory
install: ///usr/include/c++/v1/__tuple/tuple_types.h: Not a directory
install: ///var/db/etcupdate/current/etc/rc.d/growfs_fstab: No such file or directory
install: ///var/db/etcupdate/current/etc/rc.d/var_run: No such file or directory
install: ///var/db/etcupdate/current/etc/rc.d/zpoolreguid: No such file or directory

秘伝のたれみたいに古いバージョンから延々updatedしているシステムでよく出るやつです。まぁupdateは終わってるから良いよね・・と思って適当に流してたんですが何かのソフトをビルドするときに上記ファイルがなくて非常に困ったということもあり解決方法をちゃんと調べてみました。

エラーの原因ですが Not a direcotryのほうについてはメッセージからするに /usr/include/c++/v1/__stringは存在するかディレクトリではない(故にその先のファイルを作ることができない)ということだと思います。

-r--r--r--  0 root   wheel   47182  4月  7  2023 ./usr/include/c++/v1/__string

のようなファイルであり 13.3から

drwxr-xr-x  0 root   wheel       0  3月  2 11:52 ./usr/include/c++/v1/__string/
-r--r--r--  0 root   wheel   30793  3月  2 11:52 ./usr/include/c++/v1/__string/char_traits.h
-r--r--r--  0 root   wheel   13439  3月  2 11:52 ./usr/include/c++/v1/__string/extern_template_lists.h
-r--r--r--  0 root   wheel    8995  3月  2 11:52 ./usr/include/c++/v1/__string/constexpr_c_functions.h

となっています。どうもこのようなケースではfreebsd-updateでアップグレードできないようです。

No such file or directoryのほうについては確かにこのシステム上にそのファイルやディレクトリは存在しません。/var/db/etcupdate/current/etc/rc.dというディレクトリは10.0のときは存在せず10.1からあるようです。

13.2で/var/db/etcupdate/current/etc/rc.d/growfs_fstabが追加されたようですが
なのでこの頃からエラーが発生してたのかなぁという気はします。

これについてはエラーメッセージでググるとわかるのですが

https://cgit.freebsd.org/src/commit/?id=cfb624d7e2507c81441bb01e0078abad25ef235d

にて修正されているようです。つまり最新版の13.2にしてから13.3にすれば多分エラーなくupdateされたものと思われます。

問題はすでにやらかしてしまった場合の修正方法です。

今回の例で言えば/usr/include/c++/v1/__stringは今回のアップデートで発生したファイル(またはディレクトリ)であると思われるのでなんとかしてインストールしなおせば解決すると思うのですが/var/db/etcupdate/current/etc/rc.dにはもっと多数のファイルが存在してて相当前のバージョンからエラーになっていて欠落しています。

そこでこれはもう直で欠けているファイルを展開してしまうのが早いという結論に至りました。

fetch http://ftp.freebsd.org/pub/FreeBSD/releases/amd64/13.3-RELEASE/base.txz

でbase.txzファイルをもってきて

tar xvfp base.txz -C / usr/include/c++/v1/__string usr/include/c++/v1/__tuple var/db/etcupdate/current/etc/rc.d/

多分これでokと思います
Posted by issei

カテゴリ: BSD

FreeBSDのswapファイルがうまく作成できなかったので調べてみた

FreeBSDにてswapファイルを作成する場合

/etc/rc.confに以下のような行を記述するという手法がググると多数ヒットしますがこの手法はobsoluteです。最新(現時点で14.0)のFreeBSDでは使えません。

swapfile="/swapfile"

いつから使えないかよくわかりませんが2013/6/27のコミットで単純にwarningを出すようになったと書いてますので相当前から使えなかったのではないかと思います。
そこで man fstabを参考に以下のような記述をfstabに追加しました。

md90 none swap sw,file=/swapfile 0 0

この状態で swapon -a をすると確かにswapが作成されます。しかし再起動をしてみるとswapinfoで見ても作成されていません。再起動した状態でswaponをしようとすると

swapon: md90 on /swap90: Device already in use 

のようなエラーが発生して止まってしまいます。この原因を調べたところエラーになる原因が判明しました。

上記のようにfstabを記述し起動をすると早い段階で /etc/rc.d/swapが実行されます。このときにmdが作成されるのですがこの時点では/swapfileはリードオンリーです。このためデバイスが作成されどもswapができなくなりエラーなっているようでした。これを解決するには

md90 none swap sw,file=/swapfile,late 0 0

とmount optionにlateをつけることで解決できます。lateをつけることにより後から遅れてこの部分の処理が /etc/rc.d/swaplateでされるからです。このときにはボリュームはRWでマウントされているでしょうから正常にswapをすることができるというわけです。
Posted by issei

カテゴリ: BSD

FreeBSDをネットワークからUEFIでブートする

以前書いたブログで「ここに書いてありました」とリンクだけを置いておいたのですがそのリンク先が死亡したようなので、あらためてそのやり方を書きます。parallelsを使ってMacで実験をしました。 この実験では以下の4つのサーバを想定していますが実際には2つだけです。また、実験に用いたFreeBSDのバージョンは12.2-RELEASEです

  1. dhcpdが動くFreeBSD(でなくても良いと思うが多分それが楽)。ネットワーク上に1つだけ。10.1.1.1とする
  2. tftpが動くFreeBSD(でなくても良いと思うが多分それが楽)。 とりあえず1と同じマシンで動かす。
  3. nfsが動いていてFreeBSDのツリーが普通に存在しているFreeBSD(でなくても良いと思うが多分それが楽)。1, 2と同じマシンで動かす
  4. ネットワークブートをさせたい機器(mac addressを 00:1c:42:af:07:57とする)今回はUEFIでの実験ですのでParallelsの仮想マシンを作るときにbootのオプションでUEFIの指定をする必要があります。完全ネットワークブートですからHDDは不要です。

dhcpd.confは以下のように記述をしておきます。 

host test {
hardware ethernet 00:1c:42:af:07:57;
fixed-address 10.1.1.100;
next-server 10.1.1.1;
filename "loader.efi";
option root-path "10.1.1.1:/FreeBSD/";
}

意味ですが、00:1c:42:af:07:57のmac アドレスを持つ機器に 10.1.1.100のIPアドレスを振る。次のサーバは10.1.1.1で(1と同じ)そこからtftpを使ってloader.efiというファイルを読み込み、起動できたらrootのツリーは10.1.1.1:/FreeBSD(1と同じ)だよという意味です。

2のサーバは以下の/etc/inetd.confのコメントを外しtftpbootを使えるようにしておきます。

tftp    dgram   udp     wait    root    /usr/libexec/tftpd      tftpd -l -s /tftpboot
tftp    dgram   udp6    wait    root    /usr/libexec/tftpd      tftpd -l -s /tftpboot

 

そして、/etc/rc.confにinetd_enable="YES"を追加しinetdが起動するようにします。

次に mkdir /tfpbootでtftpbootのディレクトリを作成しその下にloader.efiを/boot/loader.efiからコピーして置いておきます。これで2のサーバはokです。

3のサーバは mkdir /FreeBSDとして /etc/exportsに以下のような行を追加して/etc/rc.confにnfs_server_enable="YES"を追加しておきます。

/FreeBSD -maproot=root -alldirs -network 10.1.1.0/24 -ro

/FreeBSDにて kernel.txzとbase.txzを展開しておいておきましょう。

この状態で4のサーバを起動させるとloader.efiを2のサーバより読みこみ10.1.1.1:/FreeBSDをマウントして、起動すると思います。

 

20210902133456png

Posted by issei

カテゴリ: BSD

FreeBSDでbashをアプデートしたら起動しなくなった

FreeBSD12.1でpkg upgrade bashでbashを5.0.16から5.1.4に更新をしたらエラーが出て起動しなくなりました。


# pkg upgrade bash Updating FreeBSD repository catalogue... FreeBSD repository is up to date. All repositories are up to date. The following 2 package(s) will be affected (of 0 checked): Installed packages to be UPGRADED: bash: 5.0.16 -> 5.1.4 gettext-runtime: 0.20.1 -> 0.21 Number of packages to be upgraded: 2 2 MiB to be downloaded. Proceed with this action? [y/N]: y [1/2] Fetching bash-5.1.4.txz: 100% 1 MiB 1.5MB/s 00:01 [2/2] Fetching gettext-runtime-0.21.txz: 100% 165 KiB 168.9kB/s 00:01 Checking integrity... done (0 conflicting) [1/2] Upgrading gettext-runtime from 0.20.1 to 0.21... [1/2] Extracting gettext-runtime-0.21: 100% [2/2] Upgrading bash from 5.0.16 to 5.1.4... [2/2] Extracting bash-5.1.4: 100% root@berry:/home/issei # bash ld-elf.so.1: Undefined symbol "rl_filename_rewrite_hook" referenced from COPY relocation in /usr/local/bin/bash

悩みましたが原因は/libに残っていたこれ

-r--r--r--  1 root  wheel  273064 Sep 18  2018 /lib/libreadline.so.8

2018年のタイムスタンプ。これを削除したら動くようになりました。古いバージョンから何年もバージョンアップしながら運用していたので昔のファイルが残っていたんでしょうね。

Posted by issei

カテゴリ: BSD

UEFIでpxebootでFreeBSDを起動する

dhcpサーバを用意するとか、tftpのサーバを用意するとかnfsのサーバを用意するとか、そのあたりのレガシーな情報は沢山出てくるんですが、その手順通りにbootさせようとしても、エラーで終了しちゃいます。以下のページに答えが書いていました。

Netbooting FreeBSD with PXE/UEFI | FreeBSD developer's notebook

pxebootを指定するのではなくloader.efiを指定するのがポイントのようです。これで難なくbootできました。
(参考までにbootできたのはIntelのNUC7CJYHというNUCです)

 

Posted by issei

カテゴリ: BSD

FreeBSD ラズパイ用 pkg baseの作り方

Raspberry PIのFreeBSD では freebsd-upgradeが使えません。(2018年12月25日現在)

そこでソースからパッチが配布されたときなど、自分でビルドをしないといけません。当然 Raspberry PI上でのビルドは遅すぎて鼻血が出そうになるので別マシン(母艦)でビルドするのが常套手段ではないかと思います。

FreeBSDでのクロスコンパイルは簡単で makeのパラメータとして、 TARGET, TARGET_ARCH, KERNCONFなどの パラメータをソースツリーで適切に指定してやるだけです。例えば以下のリンクにはSDを母艦でmountして インストール(またはアプデート)するやり方が書いてあります。

Installing and updating FreeBSD 11.0 release on a Raspberry Pi – solence

このようなやりかたでもよいのですが、本ブログでは別のやり方を紹介します。 それは、FreeBSDに標準であるパッケージの管理を利用する方法です。

FreeBSDの pkgは実はシステムのbaseでも使えるようになっています。 そこで、母艦でクロスビルドしbaseのパッケージを作成し、Web上に配置し、 Raspberry PIで pkgコマンドでアップデートをするという作戦です。

作りかた

ソースのチェックアウト

とりあえずチェックアウト先のディレクトリは /home/hogehoge/releng/12.0としておきます

# svn checkout http://svn.freebsd.org/base/releng/12.0 /home/hogehoge/releng/12.0

違うバージョンをビルドしたいときは 12.0を適切なものに置き換えてください。

パッケージの作成

以下のコマンドで行います。

# cd /home/hogehoge/releng/12.0 
# make TARGET=arm TARGET_ARCH=armv6 KERNCONF=RPI2 buildworld 
# make TARGET=arm TARGET_ARCH=armv6 KERNCONF=RPI2 buildkernel
# make TARGET=arm TARGET_ARCH=armv6 KERNCONF=RPI2 packages

各コマンドの意味は説明するまでもないので省略します。母艦のSPECにもよりますが、問題がなければ数時間後に/usr/obj/home/hogehoge/releng/12.0/repo/FreeBSD:12:armv6 以下にbaseのパッケージのレポジトリが作成されます。

このbaseのパッケージレポジトリにあるファイルやリンク(latestというシンボリックリンクがあると思います)をhttpでアクセス可能な場所にコピーします。ここでは

https://pkgbase.guru.gr.jp/FreeBSD-base/FreeBSD:12:armv6

でアクセスできる場所に置いてみました。

Raspberry PIの設定

以下の設定ファイルをラズパイ側で作成します。

/usr/local/etc/pkg/repos/FreeBSD-base.conf:

FreeBSD-base: {
  url: "https://pkgbase.guru.gr.jp/FreeBSD-base/${ABI}/latest",
  enabled: yes
}

updateの実行

Raspberry PI側で

# pkg update -r FreBSD-base 
# pkg upgrade

をするとビルドしたものが(必要なら)インストールされます。 なお、以下のページを参考にしました

PkgBase - FreeBSD Wiki

面倒な点としてfreebsd-updateと違って設定ファイルがマージされないことがあること。 pkgのソースをみると pkg add で設定ファイルをmergeをする仕組みは入っているようですが、 うまい感じにマージをしてくれないファイルが多々ありました。3way mergeが必要なので、1つ前の設定ファイルがなんであるかわからないといけないので、それが分からない以上やむを得ないのかな?という気もします。実際上記wikiでは mergemasterまたは etcupdateを使えとあります。ただどちらの場合であっても /usr/srcが必須でしょう(未検証)

ただ実際は/etc以下でいじくるファイルはごく一部です。単純に上書きできない場合は当該ファイルが pkgnewという拡張子が付加されて保存されるようなので、私はfindでさがして手動で修正するということにしました。

またbaseに追加された/削除されたというのが判断できないので上記wikiに記述してあるコマンド

$ diff <(pkg rquery -r FreeBSD-base %n) <(pkg query -e '%o = base' %n) | grep "^[<>]"

で判断して手動で追加/削除をする必要もあります。

なお、上記URLは暫く残しておきます。興味がある方は自己責任でどうぞ。

Posted by issei

カテゴリ: BSD

FreeBSD 11.2で make packagesがエラーになる

# make TARGET=arm TARGET_ARCH=armv6 DESTDIR=/FreeBSD/rpi2 KERNCONF=RPI2 packages
make[1]: "/FreeBSD/releng/11.2/Makefile.inc1" line 1517: Unassociated shell command "@cd ${KSTAGEDIR}/${DISTDIR} ;  awk -f ${SRCDIR}/release/scripts/mtree-to-plist.awk  -v kernel=yes -v _kernconf=${INSTALLKERNEL}  ${KSTAGEDIR}/kernel.meta ;  cap_arg=`cd ${SRCDIR}/etc ; ${MAKE} -VCAP_MKDB_ENDIAN` ;  pwd_arg=`cd ${SRCDIR}/etc ; ${MAKE} -VPWD_MKDB_ENDIAN` ;  sed -e "s/%VERSION%/${PKG_VERSION}/"  -e "s/%PKGNAME%/kernel-${INSTALLKERNEL:tl}${:U""}/"  -e "s/%KERNELDIR%/kernel/"  -e "s/%COMMENT%/FreeBSD ${INSTALLKERNEL} kernel ${:U""}/"  -e "s/%DESC%/FreeBSD ${INSTALLKERNEL} kernel ${:U""}/"  -e "s/%CAP_MKDB_ENDIAN%/$${cap_arg}/g"  -e "s/%PWD_MKDB_ENDIAN%/$${pwd_arg}/g"  ${SRCDIR}/release/packages/kernel.ucl  > ${KSTAGEDIR}/${DISTDIR}/kernel.${INSTALLKERNEL}${:U""}.ucl ;  awk -F\" '  /name/ { printf("===> Creating %s-", $$2); next }  /version/ {print $$2; next } '  ${KSTAGEDIR}/${DISTDIR}/kernel.${INSTALLKERNEL}${:U""}.ucl ;  ${PKG_CMD} -o ABI_FILE=${WSTAGEDIR}/bin/sh -o ALLOW_BASE_SHLIBS=yes  create -M ${KSTAGEDIR}/${DISTDIR}/kernel.${INSTALLKERNEL}${:U""}.ucl  -p ${KSTAGEDIR}/${DISTDIR}/kernel.${INSTALLKERNEL}${:U""}.plist  -r ${KSTAGEDIR}/${DISTDIR}  -o ${REPODIR}/$$(${PKG_CMD} -o ABI_FILE=${WSTAGEDIR}/bin/sh config ABI)/${PKG_VERSION}"
make[1]: "/FreeBSD/releng/11.2/Makefile.inc1" line 1517: Unassociated shell command "@cd ${KSTAGEDIR}/${DISTDIR} ;  awk -f ${SRCDIR}/release/scripts/mtree-to-plist.awk  -v kernel=yes -v _kernconf=${INSTALLKERNEL}  ${KSTAGEDIR}/kernel.meta ;  cap_arg=`cd ${SRCDIR}/etc ; ${MAKE} -VCAP_MKDB_ENDIAN` ;  pwd_arg=`cd ${SRCDIR}/etc ; ${MAKE} -VPWD_MKDB_ENDIAN` ;  sed -e "s/%VERSION%/${PKG_VERSION}/"  -e "s/%PKGNAME%/kernel-${INSTALLKERNEL:tl}${:U-debug}/"  -e "s/%KERNELDIR%/kernel/"  -e "s/%COMMENT%/FreeBSD ${INSTALLKERNEL} kernel ${:U-debug}/"  -e "s/%DESC%/FreeBSD ${INSTALLKERNEL} kernel ${:U-debug}/"  -e "s/%CAP_MKDB_ENDIAN%/$${cap_arg}/g"  -e "s/%PWD_MKDB_ENDIAN%/$${pwd_arg}/g"  ${SRCDIR}/release/packages/kernel.ucl  > ${KSTAGEDIR}/${DISTDIR}/kernel.${INSTALLKERNEL}${:U-debug}.ucl ;  awk -F\" '  /name/ { printf("===> Creating %s-", $$2); next }  /version/ {print $$2; next } '  ${KSTAGEDIR}/${DISTDIR}/kernel.${INSTALLKERNEL}${:U-debug}.ucl ;  ${PKG_CMD} -o ABI_FILE=${WSTAGEDIR}/bin/sh -o ALLOW_BASE_SHLIBS=yes  create -M ${KSTAGEDIR}/${DISTDIR}/kernel.${INSTALLKERNEL}${:U-debug}.ucl  -p ${KSTAGEDIR}/${DISTDIR}/kernel.${INSTALLKERNEL}${:U-debug}.plist  -r ${KSTAGEDIR}/${DISTDIR}  -o ${REPODIR}/$$(${PKG_CMD} -o ABI_FILE=${WSTAGEDIR}/bin/sh config ABI)/${PKG_VERSION}"
make[1]: Fatal errors encountered -- cannot continue
make[1]: stopped in /FreeBSD/releng/11.2
*** Error code 1

Stop.
make: stopped in /FreeBSD/releng/11.2
原因
create-kernel-packages: _pkgbootstrap .PHONY
.if exists(${KSTAGEDIR}/kernel.meta)
.if ${MK_DEBUG_FILES} != "no"
_debug=-debug
.endif
.for flavor in "" ${_debug}
Makefileのtargetの後に代入文を書けない(この場合は _debug=-debug)。 よって MK_DEBUG_FILES=noをつけてmakeをするか以下のようにMakefileを修正する。
Index: Makefile.inc1
===================================================================
--- Makefile.inc1       (revision 338621)
+++ Makefile.inc1       (working copy)
@@ -1485,11 +1485,11 @@
                        -o ${REPODIR}/$$(${PKG_CMD} -o ABI_FILE=${WSTAGEDIR}/bin/sh config ABI)/${PKG_VERSION} ; \
        done

-create-kernel-packages:        _pkgbootstrap .PHONY
-.if exists(${KSTAGEDIR}/kernel.meta)
 .if ${MK_DEBUG_FILES} != "no"
 _debug=-debug
 .endif
+create-kernel-packages:        _pkgbootstrap .PHONY
+.if exists(${KSTAGEDIR}/kernel.meta)
 .for flavor in "" ${_debug}
        @cd ${KSTAGEDIR}/${DISTDIR} ; \
        awk -f ${SRCDIR}/release/scripts/mtree-to-plist.awk \
Posted by issei

カテゴリ: BSD

FreeBSDで Bluetooth Low Energy (BLE)を使う

いろいろと案件がありまして、LinuxやらほげほげやらいろんなものでBLEを使って調べ物をしていたのですが、これがなかなか期待通り動いてくれないんですよねぇ・・・いつものようにソースやらBluetooth4.0の仕様書(2000頁以上ある)などをいろいろ読み始めたのですが linuxの bleno -> Bluezという流れが複雑で実験環境すらままならないので使い慣れたFreeBSDで動かんものかとtwitterでつぶやいてみました。すると・・・

以外と近いところに解はあるんだなー。まさかフォロワーさんがCURRENTにコミットしてたとわ。 ということで手持ちのPCに最新のCURRENTをいれてセコセコ調査を始めた次第。

ちなみにドングルはこれ アイ・オー・データ機器 I-O DATA USB-BT40LE [Bluetooth4.0+EDR/LE準拠 USBアダプター]

ぱっと調べたところBroadcomの BCM20702を使ってるドングルはアイオーのこれしかないようなので無難に。あきばお~とかで安売りしているやつは地雷の可能性が大そうなのでやめました。

これをBSDに差してみるとこういうメッセージが出ます

Sep 10 10:45:01  kernel: WARNING: attempt to domain_add(netgraph) after domainfinalize()
Sep 10 10:45:06  kernel: ugen0.3: <Broadcom Corp> at usbus0
Sep 10 10:45:06  kernel: ubt0: <Broadcom Corp BCM20702A0, rev 2.00/1.12, addr 3> on usbus0
Sep 10 10:45:06  kernel: WARNING: attempt to domain_add(bluetooth) after domainfinalize()

何やらwarningは出ますがとりあえず使えそう…… ngctl listで見ると

 # ngctl list
There are 8 total nodes:
  Name: ubt0            Type: ubt             ID: 00000002   Num hooks: 1
  Name: btsock_hci_raw  Type: btsock_hci_raw  ID: 00000003   Num hooks: 1
  Name: btsock_l2c_raw  Type: btsock_l2c_raw  ID: 00000004   Num hooks: 1
  Name: btsock_l2c      Type: btsock_l2c      ID: 00000005   Num hooks: 1
  Name: btsock_sco      Type: btsock_sco      ID: 00000006   Num hooks: 0
  Name: ubt0hci         Type: hci             ID: 00000008   Num hooks: 3
  Name: ubt0l2cap       Type: l2cap           ID: 0000000c   Num hooks: 3
  Name: ngctl714        Type: socket          ID: 00000012   Num hooks: 0

hccontrolでスキャンをしてみます。BLE対応の接続先が必要ですが、iOSでlightBlueをつかって立てました

# hccontrol le_enable enable
# hccontrol le_set_scan_param passive 10 10 public all
# hccontrol le_set_scan_enable enable

結果は近傍キャッシュから読めました

# hccontrol read_neighbor_cache
BD_ADDR           Features                Clock offset Page scan Rep. scan
XX:XX:XX:XX:XX:XX 00 00 00 00 00 00 00 00            0         0         0

今回はここまで

Posted by issei

カテゴリ: BSD

FreeBSDのオリジナルのpkgサイトを作る

標準のオプションでコンパイルしていないportsを利用しているときとか自分専用のpkgサイトがあると便利ですよね。例えば弊社ではDOVECOT2のオプションをONにしてpostfixをビルドしています。その作り方をかなり前に社内の掲示板に書いたのですが、それをブログに転載します。

STEP1

普通にportsからpostfixをコンパイル、インストールする。

STEP2

pkgコマンドでpackageにする。

pkg -vv で ABIを確認しておくとVersion毎にディレクトリをわけなくてよいので楽。

とりあえず

/usr/ports/packages/FreeBSD:10:amd64

をパッケージの保存先とする。dovecot2,cyrus-sasl,pcreも依存しているのでいれておく

# pkg create -o /usr/ports/packages/FreeBSD:10:amd64 postfix

STEP3

レポジトリを作る

# pkg repo /usr/ports/packages/FreeBSD:10:amd64/

STEP4

ローカルファイルから持ってくるだけならこれで完成である

/usr/local/etc/pkg/repos/test.conf

というファイルに

test: {
  url: file:/usr/ports/packages/${ABI}
  enable: yes
  priority: 1
}

と書いておけばよい。pkg -vvで確認できる。その後

# pkg install -r test postfix

でインストールできることを確認できる。

# pkg install -rtest postfix
Updating test repository catalogue...
test repository is up-to-date.
All repositories are up-to-date.
The following 2 packages will be affected (of 0 checked):

New packages to be INSTALLED:
        postfix: 2.11.3_3,1 [test]
        dovecot2: 2.2.15_2 [test]

The process will require 27 MB more space.
5 MB to be downloaded.

Proceed with this action? [y/N]:

ネットワーク経由で持ってくる

man pkg.confによると URLは

http://, https://, ftp://, file://, ssh://

が使えるようである。SSHは

ssh: {
  url: ssh://user@ssh.example.com/usr/ports/packages/${ABI}
  enable: yes
  priority: 1
}

と書いておけばよい。httpもftpも同様。

ftp: {
  url: ftp://ftp.example.com/pub/packages/${ABI}
  enable: yes
  priority: 1
}

当然 sshや ftpのサーバをセットアップしておかないといけない

pkg+httpとは何ぞや?

デフォルトの設定 /etc/pkg/FreeBSD.conf
を覗くと、

url: "pkg+http://pkg.FreeBSD.org/${ABI}/latest",

と書いてある。これはDNSのSRVレコードを使って効率よく
ミラー等を利用するための記法である。drillや digコマンドを使って

# drill _http._tcp.pkg.freebsd.org. srv

と調べてみるとよいであろう。

署名を付ける

ここまでの手順で作成したものには署名がない。個人的に使う分にはこれでよいだろうが、
一般公開をするためには署名があったほうがよいであろう。
(もちろん署名があるだけでは不十分で通信そのものがSSLなどで保護されているべきである)
署名の方法は公開鍵とフィンガープリントの二種類用意されている。

opensslで公開鍵のペアを作り公開鍵を提示する手法。

% man pkg-repo

に詳しく書いてある。まず鍵を作成する

       % openssl genrsa -out repo.key 2048
       % chmod 0400 repo.key
       % openssl rsa -in repo.key -out repo.pub -pubout

repo.keyが秘密鍵で、repo.pubが公開鍵である。公開鍵はなんらか方法でクライアント(pkgを利用するサイト)に送っておく

次にその秘密鍵で署名をしてレポジトリを作成する

# pkg repo /usr/ports/packages/FreeBSD:10:amd64/ repo.key

クライアント側では設定ファイルに公開鍵のパスを指定する

test: {
  url: http://www.example.com/pub/packages/${ABI}
  enable: yes
  priority: 1
  signature_type: pubkey
  pubkey: /usr/local/etc/pkg/repos/repo.pub
}

FingerPrint

man pkg-repoを参考に署名をするためのscriptを作成する。
sign.shとでもして作成をしておく

       #!/bin/sh
       read -t 2 sum
       [ -z "$sum" ] && exit 1
       echo SIGNATURE
       echo -n $sum | /usr/bin/openssl dgst -sign repo.key -sha256 -binary
       echo
       echo CERT
       cat repo.pub
       echo END

その後

# pkg repo /usr/ports/packages/FreeBSD:10:amd64/ signing_command: ./sign.sh

を実行する。

インストールする側に署名ファイルを置いておく必要がある。ここでは

/usr/local/etc/pkg/repos

とし、その下に revokedと trustedというディレクトリを用意する。
fingerprintを

# sha256 -q repo.pub

で求めておき、truestedの下に適当なファイル名で

function: sha256
fingerprint: ae9f016190512cc2107f2555c070c5ab2bad1ef73a370edc96f1b1b18022cdc1

のように置いておく。

クライアント側の設定は以下のようにする。

test: {
  url: http://www.example.com/pub/packages/${ABI}
  enable: yes
  priority: 1
  signature_type: fingerprints
  pubkey: /usr/local/etc/pkg/repos
}
Posted by issei

カテゴリ: BSD

再起動するとさくらのVPSの時刻が9時間ずれる

いつからか分からないけれど(いや最初からかもしれませんが)、さくらのVPSはCMOSがJSTに合わせられているようで再起動すると9時間ずれてしまうことに気がつきました。 というわけで、

# touch /etc/wall_cmos_clock 

で解決。

Posted by issei

カテゴリ: BSD