ほぼ雑記的メモ
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
Not a direcotry
-r--r--r-- 0 root wheel 47182 4月 7 2023 ./usr/include/c++/v1/__string
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
No such file or directory
/var/db/etcupdate/current/etc/rc.d
/var/db/etcupdate/current/etc/rc.d/growfs_fstab
/usr/include/c++/v1/__string
fetch http://ftp.freebsd.org/pub/FreeBSD/releases/amd64/13.3-RELEASE/base.txz
tar xvfp base.txz -C / usr/include/c++/v1/__string usr/include/c++/v1/__tuple var/db/etcupdate/current/etc/rc.d/
swapfile="/swapfile"
md90 none swap sw,file=/swapfile 0 0
swapon: md90 on /swap90: Device already in use
md90 none swap sw,file=/swapfile,late 0 0
以前書いたブログで「ここに書いてありました」とリンクだけを置いておいたのですがそのリンク先が死亡したようなので、あらためてそのやり方を書きます。parallelsを使ってMacで実験をしました。 この実験では以下の4つのサーバを想定していますが実際には2つだけです。また、実験に用いたFreeBSDのバージョンは12.2-RELEASEです
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 /tftpboottftp 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をマウントして、起動すると思います。
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年のタイムスタンプ。これを削除したら動くようになりました。古いバージョンから何年もバージョンアップしながら運用していたので昔のファイルが残っていたんでしょうね。
dhcpサーバを用意するとか、tftpのサーバを用意するとかnfsのサーバを用意するとか、そのあたりのレガシーな情報は沢山出てくるんですが、その手順通りにbootさせようとしても、エラーで終了しちゃいます。以下のページに答えが書いていました。
Netbooting FreeBSD with PXE/UEFI | FreeBSD developer's notebook
pxebootを指定するのではなくloader.efiを指定するのがポイントのようです。これで難なくbootできました。(参考までにbootできたのはIntelのNUC7CJYHというNUCです)
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
でアクセスできる場所に置いてみました。
以下の設定ファイルをラズパイ側で作成します。
/usr/local/etc/pkg/repos/FreeBSD-base.conf:
FreeBSD-base: { url: "https://pkgbase.guru.gr.jp/FreeBSD-base/${ABI}/latest", enabled: yes }
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は暫く残しておきます。興味がある方は自己責任でどうぞ。
# 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}
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 \
いろいろと案件がありまして、LinuxやらほげほげやらいろんなものでBLEを使って調べ物をしていたのですが、これがなかなか期待通り動いてくれないんですよねぇ・・・いつものようにソースやらBluetooth4.0の仕様書(2000頁以上ある)などをいろいろ読み始めたのですが linuxの bleno -> Bluezという流れが複雑で実験環境すらままならないので使い慣れたFreeBSDで動かんものかとtwitterでつぶやいてみました。すると・・・
@issei10193 ん呼んだ? CURRENTに一応突っ込んであるよ。— Takanori Watanabe (@takawata19) 2015, 9月 7
@issei10193 ん呼んだ? CURRENTに一応突っ込んであるよ。
以外と近いところに解はあるんだなー。まさかフォロワーさんが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
今回はここまで
標準のオプションでコンパイルしていないportsを利用しているときとか自分専用のpkgサイトがあると便利ですよね。例えば弊社ではDOVECOT2のオプションをONにしてpostfixをビルドしています。その作り方をかなり前に社内の掲示板に書いたのですが、それをブログに転載します。
普通にportsからpostfixをコンパイル、インストールする。
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
レポジトリを作る
# pkg repo /usr/ports/packages/FreeBSD:10:amd64/
ローカルファイルから持ってくるだけならこれで完成である
/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のサーバをセットアップしておかないといけない
デフォルトの設定 /etc/pkg/FreeBSD.conf を覗くと、
/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 }
man pkg-repoを参考に署名をするためのscriptを作成する。 sign.shとでもして作成をしておく
man pkg-repo
#!/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 }
いつからか分からないけれど(いや最初からかもしれませんが)、さくらのVPSはCMOSがJSTに合わせられているようで再起動すると9時間ずれてしまうことに気がつきました。 というわけで、
# touch /etc/wall_cmos_clock
で解決。
Powered by Red Leaf ( Rev. c78c769f2 ), © Issei Numata, 2007-2021