FreeBSD in USB memory (2)
xtermで日本語表示
前回はIPv6の検証の為に、FreeBSDをUSB memoryに焼いた。それをdebianなマシンに挿して、にわかなFreeBSD機にした。IPv6でアクセスするとポイントが付いたり亀さんダンスを堪能して、目的達成。このままUSBメモリーをうっちゃってもいいんだけど、それじゃ ちと もったいない。少し遊んでみる。
xtermで日本語表示出来ないのではw3mと言う宝のブラウザーの持ち腐れ。なんとかxtermで使ってみたい。で、いきあたりばったりに、xtermの長ったらしいmanを斜め読み。
utf-8をサポートしてるらしい。って事は日本語表示に脈が有るって事ですかね。適当に xterm -r -wc しておいて、小さいフォントを大きくしてみる。そう、端末内で、Ctl + right mouse する。出てくるメニューから、Largeフォントを選んだら、偶然にも日本語が表示された。それ以外のフォントサイズでは、日本語文字が、冷や奴な豆腐文字になる。こんな事って有り?
後は、これを恒久的になるようにすればいいな。ぐぐったら、
sakae@fb:~ $ cat .Xresources xterm*font: *-fixed-*-*-*-18-*
こんなリソースファイルを作って、.xinitrcで、xrdb ~/.Xresources しろとな。マージしてしまう方法もあるらしいけど、きちんと記録しておく事にした。
アルファベットと日本語の文字バランスに難が有るけど、まあ許せる範囲かな。これで勝手知ったるw3mが使えるようになった。
mlterm
ふと昔の事を思い出してしまった。mltermと言う強力な端末アプリが有る事を。今も有ったので入れてみた。xtermを無理して使う事無いよと、CJKの人たちは思っているんだな。そう、東南アジア向けのありがたーい端末なのさ。
firefox向けにさざなみフォントを入れてるけど、何か一つ、きちんとした日本語フォントを入れておいた方が、設定が楽かな。
mltermを起動したら、すかさず w3m https://www.google.co.jp して、日本語を表示させる。場合によっては豆腐文字になってるかも知れないけど、焦る事は無い。表示画面にカーソルを置いて、Ctl + mouse right するんだ。そうすると、設定画面が出てくる。文字コードはUTF8を指定。フォント類は、積極的に選んでもよい。
フォントの見本が出てくるけど、残念な事にアルファベット文字だけ。そこで、役に立つのが、先程起動したぐぐる様からの日本語。applayボタンを押すと、そのフォントが適用されるんで、佳きフォントを見つけるのさ。Xftとかを選んだり、フォントサイズを変更したりで、豆腐が消えて綺麗な日本語が表示されたりする。これでよしとなったら、その設定をsaveすればよい。
設定には個人差が有るので、何とも言えないけど、一例を挙げておく(vbox上の例)
[sakae@fb ~]$ cat .mlterm/main fg_color = #fc7bf2fff2ff bg_color = #0bd004b404b4 use_auto_detect = false auto_detect_encodings = UTF-8,EUC-JP,SJIS fontsize = 18 type_engine = xcore geometry = 80x36 bel_mode = visual scrollbar_mode = right
フォントは難し過ぎて、よくわからんってのが本音です。
with Linux
つらつらと HandBookを見ていたら 21.2. Linux® File Systems こんなのに出会った。これが出来れば、DebianのHDDにたっぷり入れてるファイルを参照出来るぞ。200GのHDDを満たすべく、せっせとソース・ファイルを溜め込んでいますからねぇ。まあ、ファイルサーバーって所かな。
丸ごとDebianなHDDは、FreeBSDからどんな風に認識されているのだろう? ハードに愛を注ぐFreeBSDのdmesgを確認してみる(リナのそれは糞dmsgですよ)。
ada0 at ahcich0 bus 0 scbus0 target 0 lun 0 ada0: <HITACHI HTS545025B9A300 PB2ZC61H> ATA8-ACS SATA 2.x device ada0: Serial Number 091026PB42041SGY80YB ada0: 300.000MB/s transfers (SATA 2.x, UDMA5, PIO 8192bytes) ada0: Command Queueing enabled ada0: 238475MB (488397168 512 byte sectors)
ちゃんとプロービングしてるね。リナだと、特製何とかコマンドとか言うのを使う必要が有るらしいけど、そんなの無駄の極みと思うぞ(まあ、リナも使ってるんだから、悪口は控え目にね)。これが分かれば、後は簡単。
root@fb:~ # kldload ext2fs root@fb:~ # mount -t ext2fs /dev/ada0s1 /mnt
よく使うなら、モジュールを起動時にロードしておけ( ext2fs_load=
"YES" into /boot/loader.conf)。それから、マウントの方は、/etc/fstabに記入だな。
FreeBSD側からdebianなHDDの自Home内にファイルをcpしようとしたら、パーミションエラー。そりゃそうだわな。uidが違うからね。強引にroot権限でcpしたら、通り道のdirの持ち主まで書き換わってしまった。
debianでオペレーションすると、自Home内にて書き込み不可になったぞ。元に戻すの面倒くさかった。debian側にFreeBSDと同一のuidを持ったアカウントを作っておくべきだな。そしてcpは、そのアカウントだけに対して行う。通常は参照だけにしておけば、まあ安心かな。
wlan
もう一発、dmesgのネタ
iwn0: <Intel WiFi Link 5100> mem 0xf2200000-0xf2201fff irq 19 at device 0.0 on pci2 wlan0: Ethernet address: 00:24:d6:be:fe:ed iwn0: iwn_read_firmware: ucode rev=0x08530501 wlan0: link state changed to UP
こんな記録が出てる。 iwn_read_firmware
って何よ? /boot/firmwareってdirが有るので、その中に詰まってるかと思ったけど、dir内は空。もうひとつの疑問は、Debian同様のスピードが出てる事。OpenBSDとは雲泥の差だ。何か秘密が有るの?
[sakae@fb /boot/kernel]$ ls -l if_iw* -r-xr-xr-x 2 root wheel 114016 Apr 29 06:48 if_iwi.ko* -r-xr-xr-x 2 root wheel 226864 Apr 29 06:48 if_iwm.ko* -r-xr-xr-x 2 root wheel 167416 Apr 29 06:48 if_iwn.ko*
無線LAN用のカーネルモジュールが堂々と存在してる。FreeBSD軍団がソースから作り上げたものだな。
sys/dev/iwn/if_iwn.c
iwn_read_firmware(struct iwn_softc *sc) { /* Read firmware image from filesystem. */ sc->fw_fp = firmware_get(sc->fwname); if (sc->fw_fp == NULL) { device_printf(sc->sc_dev, "%s: could not read firmware %s\n", __func__, sc->fwname); IWN_LOCK(sc); return EINVAL; } : device_printf(sc->sc_dev, "%s: ucode rev=0x%08x\n", __func__, sc->ucode_rev);
冒頭のクレジット。インテルさんの協力が有ったのが明確だ。
/*- * Copyright (c) 2007-2009 Damien Bergamini <damien.bergamini@free.fr> * Copyright (c) 2008 Benjamin Close <benjsc@FreeBSD.org> * Copyright (c) 2008 Sam Leffler, Errno Consulting * Copyright (c) 2011 Intel Corporation * Copyright (c) 2013 Cedric GROSS <c.gross@kreiz-it.fr> * Copyright (c) 2013 Adrian Chadd <adrian@FreeBSD.org>
方や、OpenBSDの同名ファイルではどうなっているか?
sys/dev/pci/if_iwn.c
/* $OpenBSD: if_iwn.c,v 1.219 2019/10/09 09:21:45 tobhe Exp $ */ /*- * Copyright (c) 2007-2010 Damien Bergamini <damien.bergamini@free.fr>
原本は同じものを使用してるけど、独自に開発してるんですなあ。あくまでも、メーカーの制約を受けたく無いって言う、意地が伺える。自分達だけで開発したものだから、色々なシガラミから逃れられる。これを優先したのでしょう。
pkg on FreeBSD
インストール時にお世話になったpkgってコマンド、でびあん風だと、apt installね。FreeBSDではどうなってるか当たってみるか。昔は、確かperlで書かれていて、非常に遅かったけど、今はストレスなく使える(USB相手を除く)。
そして、どんなパッケージがインストールされてるかって情報が、/var/db/pkg/ にテキストで保持されてたんだけど、それも様変わりしてる。今は、
sakae@debian:~/FB/pkg$ ls -l total 82836 -rw-r--r-- 1 sakae sakae 158 Aug 9 05:56 FreeBSD.meta -rw-r--r-- 1 sakae sakae 26861568 Aug 9 05:56 local.sqlite -rw-r--r-- 1 sakae sakae 51548160 Aug 9 05:56 repo-FreeBSD.sqlite -r--r--r-- 1 sakae sakae 6407727 Aug 9 05:56 vuln.xml
こんな具合だ。えっ、FreeBSDのはずなのに、何でリナの所に有る? USBから上のmount問題を抱えつつcpしてきたからだ。悔しいので、以後これを肴にする。
sakae@debian:~/FB/pkg$ cat FreeBSD.meta | tr ',' '\n' {"version":2 "packing_format":"txz" "manifests":"packagesite.yaml" "filesite":"filesite.yaml" "manifests_archive":"packagesite" "filesite_archive":"filesite"}
メタ情報と言うから、さぞ色々と書かれているかと思ったら、あっさりしてるね。
何だかオイラーの嫌いな太っちょカッコ風で書かれたファイルが有るな。何だろう?
sakae@debian:~/FB/pkg$ lv vuln.xml $FreeBSD: head/security/vuxml/vuln.xml 554018 2020-11-03 19:50:03Z rene $ <vuxml xmlns="http://www.vuxml.org/apps/vuxml-1"> <vuln vid="3ec6ab59-1e0c-11eb-a428-3065ec8fd3ec"> <topic>chromium -- multiple vulnerabilities</topic> <affects> <package> <name>chromium</name> <range><lt>86.0.4240.183</lt></range> </package> </affects> <description> <body xmlns="http://www.w3.org/1999/xhtml"> <p>Chrome Releases reports:</p> <blockquote cite="https://chromereleases.googleblog.com/2020/11/stable-c hannel-update-for-desktop.html"> <p>This release contains 10 security fixes, including:</p> <ul> <li>[1138911] High CVE-2020-16004: Use after free in user interface. Reported by Leecraso and Guang Gong of 360 Alpha Lab working with 360 BugCloud on 2020-10-15</li> <li>[1139398] High CVE-2020-16005: Insufficient policy enforcement in ANGLE. Reported by Jaehun Jeong (@n3sk) of Theori on 2020-10-16</li> :
セキュリティの勧告書なんだな。追加で入れたアプリだからFreeBSD団は、そんなのユーザーの勝手でしょって訳にはいかない。ちゃんとこういう文書を用意して、穴は直ぐに塞ぐように推奨してる訳だな。
次はお待ちかねのsqlファイル。テキスト処理は限界って事で、DBにやむなく移行したんだな。
sakae@debian:~/FB/pkg$ sqlite3 repo-FreeBSD.sqlite SQLite version 3.27.2 2019-02-25 16:06:06 Enter ".help" for usage hints. sqlite> .tables annotation pkg_categories pkg_shlibs_provided categories pkg_conflicts pkg_shlibs_required deps pkg_licenses provides licenses pkg_option repodata option pkg_option_default requires option_desc pkg_option_desc shlibs packages pkg_provides pkg_annotation pkg_requires
まずは、どんなテーブルが有るか確認。
sqlite> .schema CREATE TABLE packages (id INTEGER PRIMARY KEY,origin TEXT,name TEXT NOT NULL,version TEXT NOT NULL,comment TEXT NOT NULL,desc TEXT NOT NULL,osversion TEXT,arch TEXT NOT NULL,maintainer TEXT NOT NULL,www TEXT,prefix TEXT NOT NULL,pkgsize INTEGER NOT NULL,flatsize INTEGER NOT NULL,licenselogic INTEGER NOT NULL,cksum TEXT NOT NULL,path TEXT NOT NULL,pkg_format_version INTEGER,manifestdigest TEXT NULL,olddigest TEXT NULL,dep_formula TEXT NULL,vital INTEGER NOT NULL DEFAULT 0); CREATE TABLE deps (origin TEXT,name TEXT,version TEXT,package_id INTEGER REFERENCES packages(id) ON DELETE CASCADE ON UPDATE CASCADE,UNIQUE(package_id, name)); CREATE TABLE categories (id INTEGER PRIMARY KEY, name TEXT NOT NULL UNIQUE ); :
そして、各テーブルの作成仕様を確認。もうこういうのを見ると目眩がしますよ。
sqlite> select * from packages where id = 200; 200|textproc/php-mecab|php73-mecab|0.6.0_1|PHP bindings of the MeCab|MeCab: Yet Another Part-of-Speech and Morphological Analyzer WWW: https://github.com/rsky/php-mecab||FreeBSD:13:amd64|gasol.wu@gmail.com|https://github.com/rsky/php-mecab|/usr/local|16212|57521|1|394e460bc4e79d429c16ed7cff65e932de5a3fa069f3a6ec1b6c3e58563af902|All/php73-mecab-0.6.0_1.txz||2$2$3xqwynnk3hk5gyt3sfxp5xbg81sitncasoxmne78iyi8wiicjufhnhcdaxxa6z733d4zqc1gpkuwokd7836h4r6aqmfw5euzt7fyd1d|||140733193388032
適当に登録情報を出してみた。 まあ、内容を見れば大体想像が付くけど、正確を期してみる。上の仕様書を分かり易いように分解。ここで使ったLOGは、 sqlite3 cliの .logコマンドを使えれば良かったんだけど、無視されていたんで、次のようにして採取したたものだ。
sakae@debian:~/FB/pkg$ sqlite3 local.sqlite | tee LOG :
scriptコマンドも使えると思うけど、それだと画面制御文字列もしっかりログされてしまうので、teeの方がお手軽だ。
sakae@debian:~/FB/pkg$ cat LOG | tr ',' '\n' CREATE TABLE packages (id INTEGER PRIMARY KEY origin TEXT name TEXT NOT NULL version TEXT NOT NULL comment TEXT NOT NULL desc TEXT NOT NULL osversion TEXT arch TEXT NOT NULL maintainer TEXT NOT NULL www TEXT prefix TEXT NOT NULL pkgsize INTEGER NOT NULL flatsize INTEGER NOT NULL licenselogic INTEGER NOT NULL cksum TEXT NOT NULL path TEXT NOT NULL pkg_format_version INTEGER manifestdigest TEXT NULL olddigest TEXT NULL dep_formula TEXT NULL vital INTEGER NOT NULL DEFAULT 0);
もう一つ例。
sqlite> SELECT * from categories where id < 10; 1|sysutils 2|perl5 3|databases 4|python 5|security 6|pear 7|textproc 8|devel 9|graphics
こちらはカテゴリーの種類表。portsのdir分類に一致するんだな。
pkg audit -F
次に進む前にちょっと心配なので、セキュリティ監査を受けてみる。-Fのオプションを付けると、最新の情報で監査してくれるよ。
[sakae@fb ~]$ pkg audit curl-7.77.0 is vulnerable: cURL -- Multiple vulnerabilities CVE: CVE-2021-22926 CVE: CVE-2021-22925 CVE: CVE-2021-22924 CVE: CVE-2021-22923 CVE: CVE-2021-22922 WWW: https://vuxml.FreeBSD.org/freebsd/aa646c01-ea0d-11eb-9b84-d4c9ef517024.html 1 problem(s) in 1 installed package(s) found.
ふむ、ヤバイよやばいよなパッケージが炙り出されましたな。どうしても使いたかったら、自前でportsにパッチ当てしてコンパイルだな。あるいは、上記のCVEに抵触しないような使い方をするかだ(推奨はされません)。一番良い方法は、パッチを作って、それをメンテナーさんに提供する事。助け合い精神の発揮です。> お前やれよ。
pkg in pkg
次は、pkgってコマンドがどうなっているかだな。/usr/sbin/pkgにあるやつは、pkgコマンドが使うデータベース類を初回にインストールするやつだ。それが実行されると、pkgと言うパッケージがインストールされる。以後お世話になるやつは、そちらになる。
[sakae@fb ~]$ pkg info pkg pkg-1.16.3 Name : pkg Version : 1.16.3 Installed on : Thu Apr 29 07:05:04 2021 JST Origin : ports-mgmt/pkg Architecture : FreeBSD:13:amd64 Prefix : /usr/local Categories : ports-mgmt Licenses : BSD2CLAUSE Maintainer : pkg@FreeBSD.org WWW : https://github.com/freebsd/pkg Comment : Package manager Options : DOCS : on Shared Libs provided: libpkg.so.4 Annotations : FreeBSD_version: 1300139 repo_type : binary repository : FreeBSD Flat size : 34.3MiB Description : Package management tool WWW: https://github.com/freebsd/pkg
自分自身の説明書だ(都合で、amd64版を参照しています)。ここまで来たら、pkgなソースを読む鹿。apt source風はどうするか?
/usr/ports/ports-mgmt/pkg に移動しておいて、make fetchすれば、ソースが/usr/ports/distfilesの中にダウンロードされる。README.mdに
Known to fully work on (official package manager): - FreeBSD - DragonflyBSD Known to work on (has been ported to): - Linux - NetBSD/EdgeBSD - OSX
何? リナでも一応動くってさ。誰も使っていないだろうけど。それは兎も角として、何か適当なコマンドを引っ張り出して調べてみる。
[sakae@fb ~]$ pkg stat Local package database: Installed packages: 415 Disk space occupied: 4 GiB Remote package database(s): Number of repositories: 1 Packages available: 30736 Unique packages: 30736 Total size of packages: 92 GiB
ローカルな方は自ホストにインストールしたpkgの状態だな。リモートの方は提供者側の状態か。リモートの数って項目が有るって事は、オレオレpkg供給者になって、ウィルスのスプリッターに成れるって事です。リナにも有るね。撲滅大変そう。WHOの活躍が期待されます。
で、ソース鑑賞の前に予備知識を仕入れておく。
An Introduction To The SQLite C/C++ Interface (本家)
一番簡単そうなやつって事で、 src/stats.c を選んでみた。
exec_stats(int argc, char **argv) { : if (pkgdb_open(&db, PKGDB_REMOTE) != EPKG_OK) { return (EXIT_FAILURE); }
この他にも pkgdb_stats
みたいなのが出てくる。野生の勘として、これらの関数は生のsqlit3 APIを隠蔽してるのではなかろうかと推測。探してみるか。
[sakae@fb /tmp/pkg-1.17.1]$ grep pkgdb_stats -rIl . ./libpkg/pkg.h.in ./libpkg/libpkg.ver ./libpkg/pkgdb.c ./src/stats.c
libpkg/pkgdb.c が、強烈な匂いを放っているぞ。
pkgdb_init(sqlite3 *sdb) { : const char sql[] = "" "BEGIN;" "CREATE TABLE packages (" "id INTEGER PRIMARY KEY," "origin TEXT NOT NULL," "name TEXT NOT NULL," "version TEXT NOT NULL," "comment TEXT NOT NULL," : "CREATE UNIQUE INDEX packages_unique ON packages(name);" "CREATE TABLE mtree (" "id INTEGER PRIMARY KEY," "content TEXT NOT NULL UNIQUE" ");" "CREATE VIEW pkg_shlibs AS SELECT * FROM pkg_shlibs_required;" "CREATE TRIGGER pkg_shlibs_update " "INSTEAD OF UPDATE ON pkg_shlibs " "FOR EACH ROW BEGIN " "UPDATE pkg_shlibs_required " "SET package_id = new.package_id, " " shlib_id = new.shlib_id " "WHERE shlib_id = old.shlib_id " "AND package_id = old.package_id; " "END;"
先にプチ苦労して整理したテーブル作成仕様書も見やすい形で提示されてた。それにsqlの勉強に最適そうな機能も出てきてる。
static sql_prstmt sql_prepared_statements[PRSTMT_LAST] = { [MTREE] = { NULL, "INSERT OR IGNORE INTO mtree(content) VALUES(?1)", "T", }, [PKG] = { NULL, "INSERT OR REPLACE INTO packages( " "origin, name, version, comment, desc, message, arch, " "maintainer, www, prefix, flatsize, automatic, " "licenselogic, mtree_id, time, manifestdigest, dep_formula, vital)" "VALUES( ?1, ?2, ?3, ?4, ?5, ?6, ?7, ?8, ?9, ?10, ?11, ?12, " "?13, (SELECT id FROM mtree WHERE content = ?14), NOW(), ?15, ?16, ?17 )", "TTTTTTTTTTIIITTTI", }, :
今度は、穴埋め式の定義が出てきた。こういうの昔rubyからMySQLを操る時に使ったな。今だとRailsになるのか。当初はRailsの簡単さに憧れて色々やったけど、最後は黒魔術過ぎて挫折した苦い思い出があるぞ。
余計な事に目移りしてないで、本筋も見ておけ。
pkgdb_stats(struct pkgdb *db, pkg_stats_t type) { switch(type) { case PKG_STATS_LOCAL_COUNT: sql = "SELECT COUNT(id) FROM main.packages;"; break; case PKG_STATS_LOCAL_SIZE: sql = "SELECT SUM(flatsize) FROM main.packages;"; break; : stmt = prepare_sql(db->sqlite, sql); if (stmt == NULL) return (-1); while (sqlite3_step(stmt) != SQLITE_DONE) { stats = sqlite3_column_int64(stmt, 0); } sqlite3_finalize(stmt); return (stats);
上記のテンプレート(穴埋め式)から外れるやつは、生sqlをその場で定義して、コンパイルしてから実行って流れになってるね。システム自体は巨大だけど、個別に見ていけば、理解が進むな。恐れるに足りず、かな。
pkg-add on OpenBSD
ハイブリッドなOSユーザーとしては、他がどうなっているか見て億必要が有るな。
OpenBSDで色々パッケージを入れてから、メンテナンスしてなかった。更新しとくか。
vbox$ doas pkg_add -u quirks-3.633 signed on 2021-08-02T12:40:37Z : emacs-27.2-no_x11:gnutls-3.6.15p0->3.6.16: ok erlang-wx-21.2p3v0:flac-1.3.3->1.3.3p0: ok Running tags: ok Read shared items: ok --- -libxml-2.9.10p2 ------------------- Remember to update /var/db/xmlcatalog
最後の一文が気になる。世界に質問をブロードキャストしたよ。そしたら、リナの質問箱から返事が有った。 Three confusing messages after a big OpenBSD package update なかなか、緩やかで宜しい。
OpenBSDのパッケージシステムはperl語で書かれている。上の質問箱にも書かれていたけど、もうperlなんて読めない人が大半だろう。でも、文字の文化だから、使う方は嬉しい。 例えば、今どんなパッケージを入れてるか、確認。確かhexeditを入れてたよな。
vbox$ cd /var/db/pkg/hexedit-1.5p0/ vbox$ ls -l total 8 -rw-r--r-- 1 root wheel 647 Jun 10 08:25 +CONTENTS -rw-r--r-- 1 root wheel 311 Jun 10 08:25 +DESC vbox$ less +DESC Missing filename ("less --help" for help) vbox$ less '+DESC' Missing filename ("less --help" for help) vbox$ less -- '+DESC' view and edit files in hexadecimal or ASCII hexedit shows a file both in ASCII and in hexadecimal. The file can be a device as the file is read a piece at a time. You can modify the file and search through it. Maintainer: The OpenBSD ports mailing-list <ports@openbsd.org> WWW: http://rigaux.org/hexedit.html
ちょっと知らない人が扱いに困るようなファイル名になってるけど、中身は普通だ。
apt on Debian
man apt は不親切過ぎるので man apt-getすると
/var/cache/apt/archives/ Storage area for retrieved package files. Configuration Item: Dir::Cache::Archives. /var/cache/apt/archives/partial/ Storage area for package files in transit. Configuration Item: Dir::Cache::Archives (partial will be implicitly appended) /var/lib/apt/lists/ Storage area for state information for each package resource specified in sources.list(5) Configuration Item: Dir::State::Lists. /var/lib/apt/lists/partial/ Storage area for state information in transit. Configuration Item: Dir::State::Lists (partial will be implicitly appended)
ちとファイルの素性を調べてみる。
root@pen:/var/lib/apt# file listchanges.db listchanges.db: Berkeley DB (Hash, version 9, native byte-order) pkgcache.bin: APT cache data, version 13.0, little-endian, 80779 packages, 80974 versions
もう、取り付く島も無い。バイナリーな文化なのね。まるでWindowsみたい!! 大体、リナはどう頑張ってもWindowsには勝てませんよ。でも、Windowsがリナにすり寄って来てるってのは、面白い世の中だ脳。