XXinstall

買い物に出た帰り、家まであと一歩という所で、渋滞にはまった。おかしいなあ、こんな所で渋滞なんて。事故でも有ったのか? のろのろと進んで行くと、先にクレーン車が見えてきた。ゴンドラを付けたやつ。電気工事か?それとも、誰かが光を頼んで、その工事か?

数日して、自宅の前にもゴンドラを付けたクレーン車が止まっていた。交通整理をしてた赤銅色に焼けたおじさん(松崎しげるのおとーさんか?)がいたので、話相手になってあがたよ。だって、車なんて滅多に通らない所ですから。

地元のケーブルテレビが、メタルから光にするそうな。何でも2020年に開催されるオリンピックに備えているとか。みんなNHKに騙されて、4Kとか8KのTVを見るでしょ。そうなったら回線がパンクするのは目に見えているんで、先行投資なんだそうだ。

こんな田舎にもオリンピックの波及効果が出てるんか。世界最大の見世物。儲かるのはIOCとそれに群がる連中ばかり。ああNHKも世界に向けて技術自慢が出来るな。高い視聴税を取って開発したものだからね。世界の標準になりました(なったらいいな)と、みんなを説得する材料にしたい訳だ。後は、電気メーカーの尻を叩いて(広告会社と協力して)8KTVの普及に勤めれば、後は安泰。利権の巣が補強されます。

利権と言えば、eスポーツとかもオリンピックに食い込みたくてうずうずしてる様子。額に汗しないで、指先だけでごにょごにょしてるだけのものが果たしてスポーツと言えるかどうか、はなはだ疑問。

どうせこういう不純物が入ってくるなら、思い切った手はどうだ。今オリンピックは、ドーピングでいたちごっこをやってるよね。ドーピング大いに結構、どんどんやれ部門を新設したらどうよ。場合によっては、改造人間ベムみたいのも可能とする。こちらの方が、よっぼど世の中に受けると思うんだけど、どうよ。

ボルトが引退しちゃったんで、代わりにドーピングで、どこまで記録を残せるか?9秒なんてのはざらに出て、8.0秒出せるかどうかが勝負の分かれ目になる、、、、なんて事になったら、面白いだろうね。あるいは、ブルトーザーおじさんが出て来て、500kgのバーベルを軽々と持ち上げてみせるとか。見世物だから、刺激が有った方が好ましいと思うぞ。

ああ、話が逸れた。 で、そのおじさんに質問。ケーブルは石英じゃなくて、安いプラスティックでも使えるようになったの? 相変わらず石英ですよ。石英を接続する時に使う装置は、石英を溶融して行うとか。その装置があるメーカーしか作れず、言い値で高級車が余裕で買えるとか。

ケーブルはどこ製?ひょっとして藤倉電線?(昔住んでいたアパートの隣の人が、藤倉電線の営業マンをやってて、そのせいか藤倉が強くINPUTされてる)返ってきた答えは住友電工でしたよ。髪の毛みたいなケーブルを作るのも大変な技術が必要なんだろうなと思いを馳せる。

で、少し光について調べてみた。

ハードウェアから見たイーサネット

上記に連なって

イーサネット内蔵PIC18とTCP/IPスタックの使い方

も見た。そして、OpenBSDに飛び火して、

MII(4)                       Device Drivers Manual                      MII(4)

NAME
     mii - IEEE 802.3 Media Independent Interface

SYNOPSIS
     acphy* at mii?
     amphy* at mii?
      :

をみた。phy繋がりで、昔懐かしい蟹さんチップもみた。

NE(4)                        Device Drivers Manual                       NE(4)

NAME
     ne - NE2000 and compatible 10/100 Ethernet device

SYNOPSIS
     ne0 at isa? port 0x240 irq 9
     ne1 at isa? port 0x300 irq 10
     ne2 at isa? port 0x280 irq 9
     ne* at isapnp?
     ne* at pci?
     ne* at pcmcia?
     acphy* at mii?
     bmtphy* at mii?
     lxtphy* at mii?
     nsphyter* at mii?
      :

さすがに、庶民に愛されたチップだわい。ISAバスにもPICバスにもPCMCIAにも対応した全方位デバイス。MAC側とトランシーバー側(PHY)を結ぶインターフェースはMII。それを介して、色々なトランシーバーに対応してんのね。

これらをFreeBSDのmanで調べてみると、余り充実していない。Linuxのやつは全くやる気の無い manでした。ドキュメントはOpenBSDが一番しっかりしてると再確認しましたよ。

ああ、FreeBSDの名誉のために記しておくと、何故かfeなデバイスの記述が充実してたなあ。なんでもこのデバイスは、FreeBSD2.0.5の時代に登場したとか。オイラーもこのPCMCIAをWindows屋さんから分捕って、よく使ったものだ。懐かしいな。

pc-sysinstall

FreeBSDの/usr/share/examplesにお宝発見。まずは、pc-sysinstallなんてのが面白そう。 インストールの自動化機構のようだ。

FreeBSDもインストールで躓いてしまう人が多いそうだ。そこで、インストーラーをLinux並みにGUIにしたらどうだって意見が噴出してたらしい。でも、伝統を重んじる勢力が勝って、GUI化は見送られた。

その代わり、有志達が、PC-BSDって言う流派を立ち上げ、GUIを使ってインストール出来る。インストールの果ては、Windowsと見まがうばかりのDeskTop環境が出現する事になった。オイラーも昔試した事が有ったけど、結局使う事なく、CUI生活者を長く続けているよ。

時代の変化により、巨大なDISKが出現してきたとか、zfsを思う存分使ってみたいという差し迫った状況に追い込まれた挙句、新しいインストーラー bsdinstall が開発された。PC-BSDの流派は、ユーザーと直接対話する、 フロントエンドと、その裏で動くバックエンドと言う、何処かで聞いたような構成のインストーラを作った。そのうちのバックエンド側は pc-sysinstall って名前で、本家に献上(?)された。

バックエンドは、スクリプトなんで、そいつに食わせるパラメータをファイルにしておけば、自動でインストールが出来る。例で示されているのは、目的に合わせたインストールのconfigファイルだ。

いまいちピンとこない場合は、下記を参照。雰囲気が分かるだろう。

PXEブートによるFreeBSDの 全自動インストールサーバー構築手順

一方、こちらの方は、PC-BSDに喧嘩売る(?)って方針で、各種のDeskTopを実現出来るように、 ごりごりとスクリプトを書かれている。まさに労作。

FreeBSDデスクトップ環境自動構築スクリプトを再度作成してみた

で、オイラーも自動化やってみたいな。目標は、黙ってUSBを刺して、コマンドを叩いたら、勝手にUSBにFreeBSDをインストールしてくれる奴。そろそろ、新しいFreeBSDが出るはずだから、それに合わせて挑戦してみよう。

ちょいと、pc-sysinstall の予習をしておく。

$ pc-sysinstall list-mirrors
Main Site: ftp.freebsd.org
IPv6 Main Site: ftp.freebsd.org
IPv6 Ireland: ftp3.ie.freebsd.org
IPv6 Israel: ftp.il.freebsd.org
IPv6 Japan: ftp2.jp.freebsd.org
IPv6 Sweden: ftp4.se.freebsd.org
IPv6 USA: ftp4.us.freebsd.org
IPv6 Turkey: ftp2.tr.freebsd.org
  :
Japan: ftp.jp.freebsd.org
Japan #2: ftp2.jp.freebsd.org
Japan #3: ftp3.jp.freebsd.org
Japan #4: ftp4.jp.freebsd.org
Japan #5: ftp5.jp.freebsd.org
Japan #6: ftp6.jp.freebsd.org
Japan #7: ftp7.jp.freebsd.org
Japan #8: ftp8.jp.freebsd.org
Japan #9: ftp9.jp.freebsd.org

netinstallを狙っているので、どんなサイトが有るか確認してみた。ググルに尻を叩かれたかは知らんけど、IPv6でもサービスを受け付けてくれるのね。亀とうさぎのリナ陣営はどうかは、知らないけど、面目を保ってますなあ。

大体、Windowsもググル製ブラウザーもIPv6が優先されるようになったけど、まだまだ世の中は遅れているよ。IPv6で問い合わせして、サービスしてない事を知り、やおらv4でリクエストするものだから、遅くてかなわん。

$ pc-sysinstall disk-list
ada0:VBOX HARDDISK
da0:BUFFALO USB Flash Disk

今vboxで動いているFreeBSD11.1なマシンに、前回作ったUSBなFreeBSDを刺して、ちゃんと認識してくれているか、確認。

PC-BSDから、TrueOSに名前が変わったのね。 開発リソースが少ないので、i386は切り捨てられている。時代の趨勢かな。 TrueOS Picoで、armな石に挑戦する人達も居るのか。確かに、i386なんて言う過去の石よりみんな喜びそうだわな。

dialog

上で出て来た、bsdinstallのソースを見てる。/usr/src/usr.sbin/bsdinstall/ その中にscriptsって言うdirが掘ってあって、スクリプトっぽい言語が頻出してる。たとえば、こんなの。(mirrorselect)

exec 3>&1
MIRROR=`dialog --backtitle "FreeBSD Installer" \
    --title "Mirror Selection" --extra-button --extra-label "Other" \
    --menu "Please select the site closest to you or \"other\" if you'd like to\
 specify a different choice.  Also note that not every site listed here carries\
 more than the base distribution kits. Only Primary sites are guaranteed to car\
ry the full range of possible distributions. Select a site that's close!" \
    0 0 0 \
        ftp://ftp.freebsd.org   "Main Site"\
        ftp://ftp.freebsd.org   "IPv6 Main Site"\
        ftp://ftp3.ie.freebsd.org       "IPv6 Ireland"\
        ftp://ftp2.jp.freebsd.org       "IPv6 Japan"\
         :
        ftp://ftp15.us.freebsd.org      "USA #15"\
    2>&1 1>&3`
MIRROR_BUTTON=$?
exec 3>&-

ミラーリストを提示して、ユーザーに選んでもらうんだな。dialogってのは、その為のユーザーインターフェースを担ってるのか。

NAME
       dialog - display dialog boxes from shell scripts

SYNOPSIS
       dialog --clear
       dialog --create-rc file
       dialog --print-maxsize
       dialog common-options box-options

DESCRIPTION
       Dialog is a program that will let you to present a variety of questions
       or display messages using dialog boxes from a shell script.  These
       types of dialog boxes are implemented (though not all are necessarily
       compiled into dialog):

              buildlist,  calendar,  checklist,  dselect,  editbox,  form,
              fselect,  gauge,  infobox,  inputbox,  inputmenu,  menu,
              mixedform,  mixedgauge,  msgbox (message),  passwordbox,
              passwordform,  pause,  prgbox,  programbox,  progressbox,
              radiolist,  rangebox,  tailbox,  tailboxbg,  textbox,  timebox,
              treeview, and  yesno (yes/no).

ちょいとmanを引いてみた。例がsrcの中に有るんで、見ておくといいよとの事。 どこに有るかと思ったら、 /usr/src/contrib/dialog/ 。どうやら寄贈品のようだ。 READMEに、

-(1999-12-25)------------------------------------------------------------------\
-
This version of dialog, formerly known as cdialog is based on the Debian
package for dialog 0.9a (see CHANGES for recent modifications)
- T.Dickey <dickey@invisible-island.net>

元はDebianさんですか。それを発展させたものとな。 そう言えば、debianもCUIインストーラーって言うか、テキストモードのインストーラーが最初使われていたな。GUIがだめでも、テキストモードは必ず使えますから。

これ、一番簡単そうなの。

. ./setup-vars

DIALOG_ERROR=254
export DIALOG_ERROR

$DIALOG --title "YES/NO BOX" --clear "$@" \
        --yesno "Hi, this is a yes/no dialog box. You can use this to ask \
                 questions that have an answer of either yes or no. \
                 BTW, do you notice that long lines will be automatically \
                 wrapped around so that they can fit in the box? You can \
                 also control line breaking explicitly by inserting \
                 'backslash n' at any place you like, but in this case, \
                 auto wrap around will be disabled and you will have to \
                 control line breaking yourself." 15 61

retval=$?

. ./report-yesno

dialogコマンドの結果を、$?で受け取って、それをreport-yesnoで解釈して表示してるんだな。setup-varsの方は、dialogが使う環境変数を定義してる。

$ sh yesno
NO

poってdirの中には、各国語の翻訳結果が入っていて、LANGを元に適切に返答するしかけが用意されてた。

$ sh radiolist
Result: Dog
$ sh checklist
Result: Dog Orange Cat Fish Lemon

複数の値から一つを選ぶやつとか、複数選ぶやつとか、テキストモードでGUIっぽい事をするには十分な仕様だな。

pc-sysinstallのsource

が、どうなってるか、調べてみる。場所は、/usr/src/usr.sbin/pc-sysinstall

幾つかにdirが整理してあった。

[fb11: pc-sysinstall]$ ls
Makefile                backend-partmanager/    doc/
Makefile.inc            backend-query/          examples/
backend/                conf/                   pc-sysinstall/

examplesは、/usr/shareの中に置かれていた物と同じ。/usr/srcを入れてない人にも例だけは、見られるようにと言う気遣いがあるな。backend-queryの中にpc-sysinstallのサブコマンドが置いてある。全てがshell scriptで書かれている。

例えば、上でちょいと実行してみた、disk-listは、disk-list.shって名前で、置いてある。 メモリーDISKかRAIDかCDか確認した後、それにも引っかからないやつは、

  # Try and get some identification information from GEOM
  NEWLINE=$(geom disk list $DEV 2>/dev/null | sed -ne 's/^   descr: *//p')

こんな事をやって、情報を引っ張り出している。んで、もって、この断片を断片的に実行してみる。

[fb11: sakae]$ geom disk list
Geom name: cd0
Providers:
1. Name: cd0
   Mediasize: 0 (0B)
   Sectorsize: 2048
   Mode: r0w0e0
   descr: NECVMWar VMware IDE CDR10
   ident: (null)
   rotationrate: unknown
   fwsectors: 0
   fwheads: 0

Geom name: da0
Providers:
1. Name: da0
   Mediasize: 32212254720 (30G)
   Sectorsize: 512
   Mode: r1w1e3
   descr: VMware, VMware Virtual S
   ident: (null)
   rotationrate: 0
   fwsectors: 63
   fwheads: 255

VMWAREに入っているFreeBSDで実行したんで、先の結果と少々異なるけど、ちゃんと説明を引っ張り出している事が分かる。

[fb11: sakae]$ pc-sysinstall detect-laptop
laptop: YES

laptopいわゆるノーパソか調べるサブコマンドも有った。ノーパソなら、どないするねん?って、俄かに思っちゃったぞ。インストール中に、こんなの判定する必要有るんかなあ? 答えが書いてないか、サブコマンドを探索。

if devinfo | grep -q acpi_acad0; then
  echo "laptop: YES"
else
  echo "laptop: NO"
fi

これも、断片を実行してみる。

[fb11: sakae]$ devinfo | grep acpi
  acpi0
    acpi_sysresource0
    acpi_syscontainer0
    acpi_sysresource1
    acpi_acad0
    acpi_timer0

Advanced Configuration and Power Interfaceが実装されてるか調べてるんか。YESなら、ノーパソの蓋を閉めるとシステムがお休みモードになったりする、ノーパソ独自の機構を設定するとな。

VMWARE環境のFreeBSDでも、VMWAREが気を利かせて、親のWindowsがノーパソ上で動いている事を察知して、仮想マシンに伝えているんだな。 色々分かって、面白い。

何処かで、お目にかかったぞ

先にリンクしておいた『PXEブートによるFreeBSDの 全自動インストールサーバー構築手順』の、10頁目に、赤字での表記が有った。ちょっとその近辺を啓示する。

NFSサーバー上の/var/nfsroot/bootディレクトリに移動し、FreeBSDのインストーラーDVD
isoイメージからコピーされたloader.confファイルを編集します。 
# cd /var/nfsroot/boot/ 
# vi loader.conf 
   :
vfs.root.mountfrom="ufs:/dev/md0" 

ここに出て来る、vfs.root.mountfromって言う変数なんだけど、ポータブルFreeBSDを作る時に、/etc/fstabの編集を忘れていて、怒られた時で出て来た。そして、助言を貰ったって言う痛い思い出が有るんだ。一体どういう風に使われてる?

[fb11: ~]$ find /usr/src/sys | xargs grep -l vfs.root.mountfrom
/usr/src/sys/nfs/bootp_subr.c
/usr/src/sys/boot/common/zfsloader.8
/usr/src/sys/boot/common/install.c
/usr/src/sys/boot/common/boot.c
/usr/src/sys/boot/forth/loader.conf
/usr/src/sys/boot/forth/loader.conf.5
/usr/src/sys/boot/forth/menu-commands.4th
/usr/src/sys/kern/vfs_mountroot.c
/usr/src/sys/ufs/ffs/ffs_vfsops.c

大雑把に、/sys/boot/commonの中で設定して(forthは、ユーザーインタラクティブのbootアプリケーションだから、bootと同類と見做せるか)、それをカーネル中で消費するって塩梅かな。

/sys/boot/common/boot.c

/*
 * Try to find the /etc/fstab file on the filesystem (rootdev),
 * which should be be the root filesystem, and parse it to find
 * out what the kernel ought to think the root filesystem is.
 *
 * If we're successful, set vfs.root.mountfrom to <vfstype>:<path>
 * so that the kernel can tell both which VFS and which node to use
 * to mount the device.  If this variable's already set, don't
 * overwrite it.
 */
int
getrootmount(char *rootdev)
{
    char        lbuf[128], *cp, *ep, *dev, *fstyp, *options;
    int         fd, error;

    if (getenv("vfs.root.mountfrom") != NULL)
        return(0);

    error = 1;
    sprintf(lbuf, "%s/etc/fstab", rootdev);
     :

環境変数優先、設定されてなかったら/etc/fstabから探すとな。

そして、/sys/kern/vfs_mountroot.c を見ると、いつかお目にかかった、お助けメッセージに遭遇したぞ。こんな所に潜んでいたんか。

parse_dir_ask(char **conf)
{
        char name[80];
        char *mnt;
        int error;

        vfs_mountroot_wait();

        printf("\nLoader variables:\n");
        parse_dir_ask_printenv("vfs.root.mountfrom");
        parse_dir_ask_printenv("vfs.root.mountfrom.options");

        printf("\nManual root filesystem specification:\n");
        printf("  <fstype>:<device> [options]\n");
        printf("      Mount <device> using filesystem <fstype>\n");
        printf("      and with the specified (optional) option list.\n");
        printf("\n");
        printf("    eg. ufs:/dev/da0s1a\n");
        printf("        zfs:tank\n");
        printf("        cd9660:/dev/cd0 ro\n");
        printf("          (which is equivalent to: ");
        printf("mount -t cd9660 -o ro /dev/cd0 /)\n");
        printf("\n");
        printf("  ?               List valid disk boot devices\n");
        printf("  .               Yield 1 second (for background tasks)\n");
        printf("  <empty line>    Abort manual input\n");

/sys/boot/forth/loader.conf にも、コメントされてるけど、面白いオプションが列挙されてるなあ。ここをいじるとkernelの性格が変わるぞ。