FreeBSD in USB memory

FreeBSD in USB memory

前回はOpenBSDでIPv6出来る事を偶然知った。Windows10やDebianにもIPv6のアドレスが来ている事は確認済みだけど、ぐるる様のお墨付けは得ていない。

当然、Windows10の中のvboxに入れてるFreeBSDでも駄目(親HostのWindows10が駄目なんで当然だ)。これ、ちと悲しいぞ。FreeBSDを単独で動かしたらどうなるか確認したい。ひょっとしたらって淡い期待です。

そんなのUSBに焼いて、そこから起動すれば、丸ごとFreeBSDなマシンになるじゃん。ターゲット機はDebian(32Bit)が入っている、SL510にしよう、と言う実験計画を立てた。

問題はどうやってUSBに焼くかだ。過去にはvboxにFreeBSDを入れ、それを丸ごとddを使ってUSBにコピーした。その後fstab関係の面倒臭い調整をした。もっと簡単に出来ないか? 自分ひとりで考えていてもアイデアが浮かばない。みんなに聞いてみたよ。そしたら、

FreeBSD - USB メモリへのインストール なんて事をやってる人が居た。へぇ、こういう事が出来るのね。オイラーも追試してみる。USBは取り敢えず8Mのやつを選んだ。

上記案内の通りにやれば良い。最初にUSBを刺す。Windows10が、フォーマット違う(OpenBSDが入っていたので)けどどうするって聞いて来るけど、そのままでいいよって指定。

VMWAREがファイルを分割しないように、仮想シングルDISKを指定。起動して、installってなったら、VMWAREのメニューから、USBを選ぶ。これでUSBメモリはVMWAREの配下になる。

次にDISKの選定の所で、マニュアル指定。ad0,da0が出てくるけど、USBの方da0を選んでからdを押してパーテションを削除。そしてcreateして、FreeBSD用にする。途中、GUIの画面に割り込んでCUIな警告が出てくるけど、かまわずGUIの指示(Installerのね)に従えば良い。

ネットワークは後でやるので、すっ飛ばして、普通にインストール。USBへ書き出しなんで、結構時間がかかる、けど2度手間にならないので助かる。

インストールが終わってrebootしたら、VMWAREを殺す。これで、USBに焼いたFreeBSDが手に入った。

後はDebian機のThinkPad SL510に挿して起動。有線で接続してDHCPでIPを貰い、最初の儀式を実行。そう、freebsd-update fetch; freebsd-update install 最新にする訳だな。 この状態で、

sakae@fb:~ $ df
Filesystem  1K-blocks    Used   Avail Capacity  Mounted on
/dev/da0s1a   6956060 1147352 5252224    18%    /
devfs               1       1       0   100%    /dev
sakae@fb:~ $ uname -a
FreeBSD fb 13.0-RELEASE-p3 FreeBSD 13.0-RELEASE-p3 #0: Tue Jun 29 19:44:29 UTC 2021   
  root@amd64-builder.daemonology.net:/usr/obj/usr/src/i386.i386/sys/GENERIC  i386

wlan

次は無線LANの設定。素晴らしく分かりやすい説明をされてる方がおられたので、それに従う。

【FreeBSD】無線LAN(Wi-Fi)に接続したい

sakae@fb:~ $ ifconfig wlan0
wlan0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
        ether 00:24:d6:be:fe:ed
        inet aa.bb.cc.5 netmask 0xffffff00 broadcast aa.bb.cc.255
        groups: wlan
        ssid BSD-house channel 36 (5180 MHz 11a ht/40+) bssid de:ad:be:ef:20:07
        regdomain JAPAN country JP authmode WPA2/802.11i privacy ON
        deftxkey UNDEF AES-CCM 2:128-bit txpower 23 bmiss 10 mcastrate 6
        mgmtrate 6 scanvalid 60 ampdulimit 32k ampdudensity 16
        -amsdutx amsdurx shortgi -stbc -ldpc -uapsd wme roaming MANUAL
        parent interface: iwn0
        media: IEEE 802.11 Wireless Ethernet MCS mode 11na
        status: associated
        nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>

心配したスピードなんだけど、Debian並に出てる。

add app

xorg,firefox,emacs,tmux,w3m 適当な日本語フォント あたりを、取り敢えず入れた。windows managerは何にするかな。twmじゃ原始的過ぎる。昔を思い出してicewmにした。

startxするだけーーと言う超やる気無し、もとえシンプル設定です。。なんたって、CUIな仮想端末のフォントはOpenBSDに比べて非常に汚い。見るに耐えないからね(ちゃんとすれば、ちゃんとなるみたいだけど、そんなに凝る必要無し)。

root@fb:~ # df
Filesystem  1K-blocks    Used   Avail Capacity  Mounted on
/dev/da0s1a   6956060 3501864 2897712    55%    /
devfs               1       1       0   100%    /dev
tmpfs         1048576       4 1048572     0%    /tmp

USBへの書き込みが遅いんで、installに膨大な時間がかかる。まあ、スイカでも食べながら、ゆっくりと待つのみ。

IPv6

正式なIPv6クライアントはどう作るのだろう? こういう時は、 FreeBSD Handbook を見るのさ。

To configure a FreeBSD system as an IPv6 client, add these two lines to rc.conf:

ifconfig_rl0_ipv6="inet6 accept_rtadv"
rtsold_enable="YES"

The first line enables the specified interface to receive router advertisement messages. 
The second line enables the router solicitation daemon, rtsol(8).

これを真似して/etc/rc.confを作成。WiFi用も含めた、カスタマイズ例。

wlans_iwn0="wlan0"
ifconfig_wlan0="WPA DHCP"
create_args_wlan0="country JP"

ifconfig_wlan0_ipv6="inet6 accept_rtadv"
rtsold_enable="YES"

起動してしばらく待つとIPv6が降って来る。暫くってのは、すぐの場合もあるし 10分かかる事もある。

root@fb:~ # ifconfig wlan0
wlan0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
        ether 00:24:d6:be:fe:ed
        inet6 fe80::224:d6ff:febe:feed%wlan0 prefixlen 64 scopeid 0x3
        inet6 2400:XXXX:XXXX:XXXX:224:d6ff:febe:feed prefixlen 64 autoconf
        inet aa.bb.cc.6 netmask 0xffffff00 broadcast aa.bb.cc.255
        groups: wlan
        ssid BSD-house channel 36 (5180 MHz 11a ht/40+) bssid de:ad:be:ef:20:07
        regdomain JAPAN country JP authmode WPA2/802.11i privacy ON
        deftxkey UNDEF AES-CCM 2:128-bit txpower 23 bmiss 10 mcastrate 6
        mgmtrate 6 scanvalid 60 ampdulimit 32k ampdudensity 16
        -amsdutx amsdurx shortgi -stbc -ldpc -uapsd wme roaming MANUAL
        parent interface: iwn0
        media: IEEE 802.11 Wireless Ethernet MCS mode 11na
        status: associated
        nd6 options=23<PERFORMNUD,ACCEPT_RTADV,AUTO_LINKLOCAL>

動き出すと、こんなルーチィングテーブルが出来上がった。

root@fb:~ # netstat -nr
Routing tables

Internet:
Destination        Gateway            Flags     Netif Expire
default            aa.bb.cc.1        UGS       wlan0
127.0.0.1          link#2             UH          lo0
aa.bb.cc.0/24     link#3             U         wlan0
aa.bb.cc.6        link#3             UHS         lo0

Internet6:
Destination                       Gateway                       Flags     Netif Expire
::/96                             ::1                           UGRS        lo0
default                           fe80::1eb1:7fff:fe26:14b8%wlan0 UG      wlan0
::1                               link#2                        UHS         lo0
::ffff:0.0.0.0/96                 ::1                           UGRS        lo0
2400:XXXX:XXXX:XXXX::/64          link#3                        U         wlan0
2400:XXXX:XXXX:XXXX:224:d6ff:febe:feed link#3                   UHS         lo0
fe80::/10                         ::1                           UGRS        lo0
fe80::%lo0/64                     link#2                        U           lo0
fe80::1%lo0                       link#2                        UHS         lo0
fe80::%wlan0/64                   link#3                        U         wlan0
fe80::224:d6ff:febe:feed%wlan0    link#3                        UHS         lo0
ff02::/16                         ::1                           UGRS        lo0

これで、ぐぐる様のIPv6テストに合格したよ。OpenBSDと同じ流れだね。USAGIより亀の幸ってもんです。まて、10分問題はどうした? rtsoldの挙動を観測。

[root@fb /tmp]# /usr/sbin/rtsold -a -d -D -f |& tee LOG
rtsold: probing wlan0
rtsold: checking if wlan0 is ready...
rtsold: wlan0 is ready
rtsold: set timer for wlan0 to 0s
rtsold: New timer is 0s
rtsold: timer expiration on wlan0, state = 1
rtsold: set timer for wlan0 to 4s
rtsold: New timer is 4s
rtsold: received RA from fe80::1eb1:7fff:fe26:14b8 on wlan0, state is 2
rtsold: OtherConfigFlag on wlan0 is turned on
rtsold: Processing RA
rtsold: ndo = 0xffbfe530
rtsold: ndo->nd_opt_type = 1
rtsold: ndo->nd_opt_len = 1
rtsold: ndo = 0xffbfe538
rtsold: ndo->nd_opt_type = 3
rtsold: ndo->nd_opt_len = 4
rtsold: rsid = [wlan0:slaac]
rtsold: stop timer for wlan0
rtsold: there is no timer
rtsold: received RA from fe80::1eb1:7fff:fe26:14b8 on wlan0, state is 0
rtsold: Processing RA
  :

ふーむ、rtsoldが起動してから4秒以内にwlan0の用意が出来ていないと、自分が出した要求を受信出来ないのか。起動時は何かと忙しいから、タイミングを逃してしまう事が有るのだろうね。本気出して使う積りは今の所無いので、放置する。

kill -TERM `cat /var/run/rtsold.pid`; /usr/sbin/rtsold -a を、何処かに書いておいて、実行するだけだけど。

sakae@fb:/usr/share/doc $ lv IPv6/IMPLEMENTATION

心配なら、こういう文書が有るので、読んでおけ。

ああ、大事な事を忘れていた。亀さんダンスを何十年ぶりかで堪能したよ。https://www.kame.net へIPv6で接続出来ると、亀が踊るってやつ。

うさぎ美味しじゃなかった、うさぎ追いしの故郷もいいけど、亀さんブレークの方が何十倍も楽しいぞ。お盆は田舎に帰ってこないでね。特に都会のしと!

後は、IPv4 over IPv6かな。それはやらない。ありとキリギリスって馬鹿にされそうだからね。

ip6addrctl show

sakae@fb:~ $ ip6addrctl show
Prefix                          Prec Label      Use
::1/128                           50     0        0
::/0                              40     1      316
::ffff:0.0.0.0/96                 35     4        0
2002::/16                         30     2        0
2001::/32                          5     5        0
fc00::/7                           3    13        0
::/96                              1     3        0
fec0::/10                          1    11        0
3ffe::/16                          1    12        0

亀さん観察の功労者は、このテーブルか。OpenBSDはどうだったかな? IPv6でアクセス出来ると、もれなくポイントが貰えます。頑張ってアクセスしましょう。これって、五月蝿いぐらいに携帯屋から飛んでくる販促メールみたいだな。そんなのスルーしてるけどね。

rtsold

usr.sbin/rtsold/ をざっと見したらdump.cなんて言う、そそられる名前のファイルが置いてあった。何者? manによると、

FILES
     /var/run/rtsold.pid   The PID of the currently running rtsold.
     /var/run/rtsold.dump  Internal state dump file.

動作させる上に必要になる一時ファイル、かな? 詳しい事はソース嫁。

wpa_passphrase

無線LANを設定する時、お世話になった奴。

[sakae@fb /tmp]$ wpa_passphrase aa bb
Passphrase must be 8..63 characters
[sakae@fb /tmp]$ wpa_passphrase aa bbddddddddddd
network={
        ssid="aa"
        #psk="bbddddddddddd"
        psk=1ab2d5152a12d3756fac707753369f82871660e6d5c7757a7e5241117b19c615
}

使い方は、上記のように(悪い例)する。あんまりなのでman

NAME
     wpa_passphrase – utility for generating a 256-bit pre-shared WPA key from
     an ASCII passphrase

小さいプログラムだよって説明だ。多分opensslでも呼ぶshellスクリプトぐらいだろうと思っていたら、binaryになってた。悪戯対策? Makefileを見ると

PACKAGE=        wpa
PROG=   wpa_passphrase
SRCS=   common.c md5-internal.c md5.c os_unix.c sha1-internal.c sha1-pbkdf2.c \
        sha1.c wpa_passphrase.c

mainが有りそうな、 wpa_passphrase.c を探すと、 /usr/src/FreeBSD13.0/contrib/wpa/wpa_supplicant/wpa_passphrase.c に置いてあった。WiFi団体からの販促品?

/*
 * WPA Supplicant - ASCII passphrase to WPA PSK tool
 * Copyright (c) 2003-2005, Jouni Malinen <j@w1.fi>
 *
 * This software may be distributed under the terms of the BSD license.
 * See README for more details.
 */

int main(int argc, char *argv[])
{
    :
        pbkdf2_sha1(passphrase, (u8 *) ssid, os_strlen(ssid), 4096, psk, 32);

        printf("network={\n");
        printf("\tssid=\"%s\"\n", ssid);
        printf("\t#psk=\"%s\"\n", passphrase);
        printf("\tpsk=");
        for (i = 0; i < 32; i++)
                printf("%02x", psk[i]);
        printf("\n");
        printf("}\n");

個人の作品みたいだな。ちゃんと原本を当たれば詳しい事が分かるだろうけど、FreeBSDレベルでは、usr.sbin/wpa/って所に、まとめられているって事で、深入りは止めておこう。それより、OpenBSDはどうしてるかだな。そちらの方が面白そうだ。

mozc

icewmに付属の端末はxtermだ。えっ、日本語大丈夫? ちゃんと扱えた。でも、字が小さくて難儀だ。どこかをいじればフォント・サイズを変更出来るのだろうけど、ざっと見では不明。

ならば、日本語はemacsに限定しちゃえ。日本語入力も出来ると嬉しいな。カタログチェック。ええ、mozcさんね。

sakae@fb:~ $ pkg search mozc
ja-boiled-mozc-emacs27-0.7_8   Wrapper to mozc.el that offers modeless ("boil"ed) input style
ja-boiled-mozc-emacs27_canna-0.7_8 Wrapper to mozc.el that offers modeless ("boil"ed) input style
ja-boiled-mozc-emacs27_nox-0.7_8 Wrapper to mozc.el that offers modeless ("boil"ed) input style
ja-boiled-mozc-emacs28-0.7_8   Wrapper to mozc.el that offers modeless ("boil"ed) input style
ja-boiled-mozc-emacs28_nox-0.7_8 Wrapper to mozc.el that offers modeless ("boil"ed) input style
ja-fcitx-mozc-2.23.2815.102.01_3 Mozc engine for Fcitx
ja-ibus-mozc-2.23.2815.102.01_3 Mozc engine for IBus
ja-mozc-el-emacs27-2.23.2815.102.01_3 Emacs input method for Mozc
ja-mozc-el-emacs27_canna-2.23.2815.102.01_3 Emacs input method for Mozc
ja-mozc-el-emacs27_nox-2.23.2815.102.01_3 Emacs input method for Mozc
ja-mozc-el-emacs28-2.23.2815.102.01_3 Emacs input method for Mozc
ja-mozc-el-emacs28_nox-2.23.2815.102.01_3 Emacs input method for Mozc
ja-mozc-server-2.23.2815.102.01_3 Mozc Japanese Input Method, Server
ja-mozc-tool-2.23.2815.102.01_3 Mozc tool for IBus, SCIM, and others
ja-uim-mozc-2.23.2815.102.01_4 Mozc engine for uim

今入ってるemacsに合わせればいいんだな。それを指定したら、mozcの本体とかも釣られて入ってきた。そして、下記をinit.elに書いておけとな。

(set-language-environment "Japanese")
(setq default-input-method "japanese-mozc")
(global-set-key (kbd "C-o") 'toggle-input-method)

これで動いたよ。取り敢えず楽なものだ。それはいいんだけど、emacsの画面が白地で辛い。何とかせいと、わがままな人が言ってるぞ。こういう時は、白黒反転技だな(オリンピックみたいな大技じゃないけど)。

sakae@fb:~ $ cat .icewm/toolbar
prog "Emacs" emacs emacs -r -g 80x32
prog "Terminal" xterm  xterm -r -fn 8x16 -g 80x44

ついでに、xtermも見やすく調整した。

sakae@fb:~ $ cat .icewm/preferences
# WorkspaceNames=" 1 ", " 2 "
TaskBarAutoHide=1
TaskBarAtTop = 1

ものはついでに、タスクバーの位置を上に配置、普段は隠れるように指定した。

それぞれのアプリのタイトル・バーのアイコンを叩くと、本体部分が隠れて、バーだけの表示になるって言う、素敵な機能が有ったのね。これはなかなか便利だ象。

sakae@fb:~ $ cat .xinitrc
setxkbmap -option ctrl:swapcaps
icewm

それから、emacs使いには、必修のCapslock問題も解決させた。普通はxmodemapを使うらしいけど、用途が限定なので、ファイルを増やさない方向です。

折角入れたw3mは出番が無いな。いや、emacsと組み合わせる手があるよ。設定忘れた。ewwがemacsには備え付けなんで、それを使え。使ってみたら、ドンドン先へ行って、戻って来るにはどうするんだっけ? 調べたら l(小文字のエル)が、戻りに割当られていた。検索はググるじゃないんで、データ奴隷から逃れられる(かも)。


This year's Index

Home