install FreeBSD

Table of Contents

FreeBSD in USB Drive

前回は、女房のおかげで、思わぬ掘り出し物が出てきた。そう、昔使ってたバッ ファローの外付けUSB Drive。全面をクリアしたんで、情報漏洩の恐れもない。

最終的に、64Bit版のFreeBSDを入れたい。だって、BSD四方山話を読んでいた ら、amd版なら、bhyveが動くから、qemuの代わりになる。頑張れば、OpenBSD を入れて、そこでvmmを動かせるかも知れない。画餅にならない様に、i386版 のFreeBSDを練習で入れてみる。使うマシンは古いSL510だ。

念の為にハンドブックを参照。 第2章 FreeBSD のインストール

インストール中に、WiFiが設定できるみたい。これはdebianみたいに頑なじゃ なくて、いいな。

インストーラーをメモリースティクに焼いて、そこから起動。ダエモン君が出 てきたら、USB DriveをONにする。こうしないと、Driveの方を先に見てしまい ブートに失敗するからだ。

一番気を使う場面は、どのメディアにインストールするかの指定。da0がスティッ クでda1がドライブだった。

Wifiは、iwn0を検出してくれたので、設定してみたけど、動作しなかった。か の昔、FreeBSDでちゃんと動作してたんだけどな。古いマシンは、ソフトのサ ポートがおざなりになるんかな?

とりあえず起動させるのが先だな。WiFiの設定は、 【FreeBSD】無線LAN(Wi-Fi)に接続したい を見て後からできるからね。

missing /etc/fstab

起動時に、/ がマウント出来なくて中途半端になった。前回qemuでFreeBSDを 入れた時と同様の画面。お勧めに従って、ufs:/dev/d0s1a したら無事に loginまで行けた。

すかさず、/etc/fstabを確認してみたら、/dev/da1s1a になってたぞ。 インストール時は、メモリースティックが、da0を占めていたんで、da1が fstabに記録されたんだな。それが、実使用になると、メモリースティクを抜 いたあるんで、USB driveは、da0に繰り上がたんだな。こういう事が有るんで、 注意しないとな。

sakae@slfb:~ $ cat /etc/fstab
# Device        Mountpoint      FStype  Options Dump    Pass#
/dev/da0s1a     /               ufs     rw      1       1
/dev/da0s1b     none            swap    sw      0       0
tmpfs           /tmp            tmpfs   rw,size=512m,mode=1777    0 0

WiFi

sysctl net.wlan.devices
ifconfig wlan0 create wlandev iwn0 country JP
ifconfig wlan0 up
ifconfig wlan0 scan
wpa_passphrase XXX-B hogehoge > /etc/wpa_supplicant.conf
wpa_supplicant -B -i wlan0 -c /etc/wpa_supplicant.conf
dhclient wlan0  

wpa_supplicant で認識するまで、時間がかかる事があるので注意。そうか、イ ンストール時の失敗は、これが影響していたのか。

rc.conf

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

電波法をきちんと守らないと、最大300万円の罰金です。電波は公共財産です からねぇ。きちんと日本の空へ発射できる範囲に設定しておきましょう。

ifconfig_wlan0="WPA inet xx.xx.xx.xx netmask 255.255.255.0"
defaultrouter="xx.xx.xx.1"

固定IPを設定する場合は、上記の様に。

sakae@slfb:~ $ cat /etc/resolv.conf
nameserver 8.8.8.8

その場合は、この設定も、お忘れなく。

see disk by OpenBSD

伝統的にMBR方式で、区画を作ったんだけど、それがOpenBSDから、どの様に見 えるか確認しておく。

ob# fdisk sd1
Disk: sd1       geometry: 19457/255/63 [312581808 Sectors]
Offset: 0       Signature: 0xAA55
            Starting         Ending         LBA Info:
 #: id      C   H   S -      C   H   S [       start:        size ]
-------------------------------------------------------------------------------
*0: A5      0   1   2 -  19450 181  59 [          64:   312475648 ] FreeBSD
 1: 00      0   0   0 -      0   0   0 [           0:           0 ] Unused
 2: 00      0   0   0 -      0   0   0 [           0:           0 ] Unused
 3: 00      0   0   0 -      0   0   0 [           0:           0 ] Unused

ラベルの方は、OpenBSD専用っぽくて、FreeBSD側の設定は、認識していない。 そんなものなのか。

ob# disklabel sd1
# /dev/rsd1c:
type: SCSI
disk: SCSI disk
label: SAMSUNG SP1604N
duid: 0000000000000000
flags:
bytes/sector: 512
sectors/track: 63
tracks/cylinder: 255
sectors/cylinder: 16065
cylinders: 19457
total sectors: 312581808
boundstart: 0
boundend: 312581808

16 partitions:
#                size           offset  fstype [fsize bsize   cpg]
  c:        312581808                0  unused
  i:        312475648               64 unknown

ports

portsを維持する為のportsnapが無いぞ。昔は有ったんだけどな。 pkgになってたので、取り寄せ。

portsnap fetch extract           ;; 初回のみ
portsnap fetch update
cd /usr/ports; make fetchindex   ;; for make search key=xxx

後で調べたら、gitを使うようだ。何か現代風になったな。 FreeBSD 14.0でportsnapが削除 Portsツリーを更新する方法

更新が速いんで、履歴もどんどん膨れるだろう。爆発しないか心配です。それ に目をつぶれば、gitって楽だわなあ。

gitは嫌だと言う方には、OpenBSDの独自実装である、got ってのも有るようで す。

Game of Trees (Got) is a version control system which prioritizes
ease of use and simplicity over flexibility.

Got is still under development; it is being developed exclusively
on OpenBSD and its target audience are OpenBSD developers. Got is
ISC-licensed and was designed with pledge(2) and unveil(2) in mind.

Got uses Git repositories to store versioned data. At present, Got
supports local version control operations only. Git can be used
for any functionality which has not yet been implemented in Got.
It will always remain possible to work with both Got and Git on
the same repository.

This package includes the got(1) command-line interface and the
tog(1) read-only repository browser. EXAMPLES in the got(1) man
page contains a quick-start guide for OpenBSD developers.

追放された portsnap、変わりに git が入ってくはずだったのに、気がつけば got がいる

vt sc or X

普段はsshしてるんで、コンソールを放置してる。昔はダエモンのスクリーン セーバーを動作させてたんだ。えと、どう設定するんだったかな? Display とか How do you set a screensaver in console mode? あたりかな。 vidcontrol splash なんてmanも参照だな。

man rc.consすると山のようにキーワードが出てくる。これらは、主に /etc/rc.d/にある、スクリプトの変数名になっている。見繕って設定してみた。

/etc/rc.conf

blanktime="123"
saver="beastie"

が、思うように動作しない。

cd /etc/rc.d
sh -x syscons restart >/tmp/LOG 2>&1

ログでも眺めてみれば、何かヒントが得られるかな。これだとメチャ長いログ になっちゃう。rc, rc.subr(8)すると、自分なりのdebug方法が見えてきた。

rc.d/sysconsを/tmpにコピして、いじり倒すのが楽。

# load_rc_config $name
set -xv
blanktime="123"
saver="beastie"
run_rc_command $*

ファイルの最後をちょいと改変。 load_rc_config を無効化する。その代わ りに、次の2行で、rc.confの設定を代行させる。そして、set -xv でログを開 始。このスクリプトの引数によって、実行開始。

sakae@fb:/tmp $ doas ./syscons start >LOG 2>&1

下記はログの一部。冒頭が + になってるのは、実行したコマンド。何も付い ていないのは、これから実行するソース。

blanktime="123"
+ blanktime=123
saver="beastie"
+ saver=beastie
run_rc_command $*
+ run_rc_command start
  :
+ sysctl -n kern.vty
+ [ xvt '=' xvt ]
+ _sc_console=vt
+ _sc_config=vt
+ echo -n 'Configuring vt:'
Configuring vt:+ _sc_initdone=yes
+ echo -n ' blanktime'
 blanktime+ vidcontrol -t 123
+ sc_init
+ [ -z yes ]
+ echo -n ' screensaver'
 screensaver+ kldstat
+ awk '$5 ~ "_saver\.ko$" { print $5 }'
+ load_kld -e _saver beastie_saver

どうも、コンソソールがvtだと、スクリーンセーバーが動作しない様だ。昔の scならちゃんと動作する。まあ、今時、Xを使っておけ。そうすれば、黙って いても、10分で天然のスクリーンセーバー、ブランク版が動く。

それにしてもBSD系は天国だと思うぞ。何が天国なの? 世にはこびっているOS と比べてみんしゃい。あちらは、起動にブラックボックスなsystemdなんての を採用してる。こちらは、公正明大なshell script。ちょいとdebugっぽい事 も簡単にできる。この透明感がすがすがしいんだよな。

OpenBSDだと/etc/rcに、ほとんどの機能が詰め込まれている。FreeBSDだと、 それぞれのjobが、単機能として、/etc/rc.d/* に格納されている。して、そ の数は、173個にのぼる。その中には、必須の物も含まれている。

sakae@f64:~ $ service -e
/etc/rc.d/hostid
 :
/etc/rc.d/utx
/etc/rc.d/sshd
/etc/rc.d/cron
/etc/rc.d/bgfsck
/etc/rc.d/sendmail

で、件のUSB driveに 思い余って、これでもかってぐらい、X関係を入れたよ。そしたらドライブが 思わぬ程に発熱した。秋になるまで、放置ですかね。

それより、こんな警告が気になるぞ。

sakae@slfb:~ $ dmesg|grep WAR
WARNING: 32-bit kernels are deprecated and may be removed in FreeBSD 15.0.
WARNING: Device "agp" is Giant locked and may be deleted before FreeBSD 15.0.
WARNING: Device "psm" is Giant locked and may be deleted before FreeBSD 15.0.
WARNING: 32-bit kernels are deprecated and may be removed in FreeBSD 15.0.

FreeBSD/64Bit on VMWare

KADOKAWAさんの所、身代金を払った、払っていないってんで、色々な噂が飛びかっていま すな。大変だーーー。

ランサムウェア「TargetCompany」のLinux型亜種がVMware ESXiの仮想環境を 攻撃

ユーザー数の多いリナも、悪い人に狙われています。被害に会わないように、 辺境なOSを使いましょう。理想はOpenBSDだと思うんだけど、せめてFreeBSDぐ らいは選択肢に入れておいて下さい。

32Bitは末永く使えないと思うので、FreeBSD 14.1/64Bitを入れてみたよ。 素直なユーザーに徹する事にします。

インストール時、32Bitアプリを動かすために、lib32を入れるか質問あり、 YES。

sakae@f64:~ $ du -sh /lib /usr/lib /usr/lib32
 17M    /lib
267M    /usr/lib
132M    /usr/lib32
sakae@f64:~ $ file /lib/libc.so.7 /usr/lib/libc.so /usr/lib32/libc.so.7
/lib/libc.so.7:       ELF 64-bit LSB shared object, x86-64, version 1 (FreeBSD), dynamically linked, for FreeBSD 14.1, stripped
/usr/lib/libc.so:     ASCII text
/usr/lib32/libc.so.7: ELF 32-bit LSB shared object, Intel 80386, version 1 (FreeBSD), dynamically linked, for FreeBSD 14.1, stripped

ASCII textってのが面白いな。

sakae@f64:~ $ cat /usr/lib/libc.so
GROUP ( /lib/libc.so.7 /usr/lib/libc_nonshared.a )

bhyve

気になったのは、これであります。qemuと同等な機能の実現。何も余計な物を 入れずに、仮想PCが実現できる様です。ゲストはi386でも大丈夫なのかな?

使ってみようハイパーバイザbhyve

OpenBSD 6.2をbhyveにインストール

bhyveでCentOSを使ってみよう!

bhyve の ubuntu で Intel Wi-Fi 6 AX200 を利用する

24.6. FreeBSD as a Host with bhyve (by HandBookなんだけど、本文が読み 難いので、閲覧にはw3mがお勧め)

vmm

そして、FreeBSDに対抗すべく、OpenBSDでも同様な機能が実装されている。ただし、どんなゲストOSでも 実行できる訳ではなく、ホストOSのみを仮想化する機能です。安全重視の砂場 環境です。

OpenBSDハイパーバイザvmm(4)

OpenBSD FAQ - Virtualization

ob$ cd vmd
ob$ ls
Makefile        i8253.c         mmio.c          proc.c          virtio.h
atomicio.c      i8253.h         mmio.h          proc.h          vm.c
atomicio.h      i8259.c         ns8250.c        vioblk.c        vm.conf.5
config.c        i8259.h         ns8250.h        vionet.c        vm_agentx.c
control.c       loadfile.h      packet.c        vioqcow2.c      vmd.8
dhcp.c          loadfile_elf.c  parse.y         vioraw.c        vmd.c
dhcp.h          log.c           pci.c           vioscsi.c       vmd.h
fw_cfg.c        mc146818.c      pci.h           vioscsi.h       vmm.c
fw_cfg.h        mc146818.h      priv.c          virtio.c        vmm.h

Makefileには、.if ${MACHINE} == "amd64" ~ .endif こんな記述があって、 amd64関係者以外は、立ち入り禁止になってる。これを突破したら、どんな報 復が有るのだろう?

ob# make
cc -O2 -pipe  -Wall -I/usr/src/usr.sbin/vmd -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Wshadow -Wpointer
-arith -Wcast-qual -Wsign-compare -Werror-implicit-function-declaration -MD -MP  -c vmd.c
In file included from vmd.c:48:
In file included from /usr/src/usr.sbin/vmd/vmd.h:26:
/usr/include/dev/vmm/vmm.h:40:36: error: use of undeclared identifier 'VMM_MAX_MEM_RANGES'
        struct vm_mem_range     vcp_memranges[VMM_MAX_MEM_RANGES];
                                              ^

規制線を回避する呪文のファイルを探してみる。

ob$ cd /usr/src/
ob$ find . -name '*.[ch]' | xargs grep VMM_MAX_MEM_RANGES
./sys/arch/amd64/include/vmmvar.h:#define VMM_MAX_MEM_RANGES    16

マシン固有の定義が有るとな。vmd.cをちょっと改造。

/* #include <machine/vmmvar.h> */
#include "/sys/arch/amd64/include/vmmvar.h"

これで、vmd.cのコンパイルは成功するけど、他にも12個のファイルを改造し なければならない。もう、これぐらいにしといちゃる。

ChatGPT

Q: C言語のソースコードについて、尋ねます。32Bit用と64Bit用のコードは、ソース上で判別できますか? 出来るなら、どこに注目すれば良いですか? この疑問の背景: FreeBSD/64Bit版のインストール時に、32Bit用のアプリの為に、lib32を 追加インストールできる用になってました。それで、ソース上での違い判別に興味をもった次第です。

A: C言語のソースコードにおいて、32ビット用と64ビット用のコードを判別するためには、いくつかの方法や指標があります。以下に、主なポイントを挙げます。

### 1. プリプロセッサディレクティブ C言語では、プリプロセッサディレクティブを使用して、コンパイル時にコードを切り替えることがよくあります。特にビット数に関する条件分岐には、`_LP64__` や `WIN64`、`_x8664__` といった定義が用いられます。

#ifdef __LP64__
// 64ビット用のコード
#else
// 32ビット用のコード
#endif

例えば、`_LP64__` は主に64ビット環境(特にUNIX系システム)で定義されます。

### 2. 型のサイズ 32ビットと64ビットの環境では、いくつかの基本的なデータ型のサイズが異なります。特に、`long` 型やポインタのサイズが異なることがあります。以下のようなコードで確認することができます。

#include <stdio.h>

int main() {
    printf("Size of long: %zu bytes\n", sizeof(long));
    printf("Size of void*: %zu bytes\n", sizeof(void*));
    return 0;
}

32ビット環境では、`long` とポインタは通常4バイトですが、64ビット環境では8バイトになります。

### 3. プラットフォーム固有のヘッダファイル 特定の環境に依存するヘッダファイルが使用されている場合、それが手がかりになることがあります。例えば、Windowsでは`windows.h`、UNIX系システムでは`unistd.h`などが使われます。

### 4. コンパイル時のフラグ ソースコードには明示的に32ビットや64ビット用のコンパイルフラグが書かれていることがあります。例えば、`-m32` や `-m64` フラグを使用してコンパイルすることができます。

### 5. 条件付きコンパイル ソースコードに条件付きコンパイルの指示が書かれている場合があります。

#if defined(__x86_64__) || defined(_M_X64)
// 64ビットアーキテクチャ用のコード
#elif defined(__i386) || defined(_M_IX86)
// 32ビットアーキテクチャ用のコード
#endif

### まとめ 32ビット用と64ビット用のコードをソース上で判別するためには、上記のようなプリプロセッサディレクティブや型のサイズ、プラットフォーム固有のヘッダファイルなどに注目すると良いでしょう。また、コード内で明示的に条件付きコンパイルの指示が書かれている場合もあります。

FreeBSDの64ビット版で32ビット用のライブラリ(lib32)を追加インストールする理由は、32ビット用にコンパイルされたバイナリが動作するための互換性を提供するためです。これは、古い32ビットアプリケーションを64ビット環境で動作させるための一般的な方法です。


This year's Index

Home