EBUG勉強会/20250531_usbfadm
をテンプレートにして作成
Start:
#topicpath
* usbfadm - 河豚板のUSBメモリ管理ツール [#x7dde876]
RIGHT:EBUG 第93回会合 2025年5月31日 ~
川俣吉広、kaw@on.rim.or.jp
** usbfadmについて [#m98d081f]
usbfadm (USB Flashdrive ADMinistration tool) は、[[河豚板...
このツールは当初、河豚板LiveUSBもまだなかったころ、河豚板...
現在ではUSBメモリへのデータ保存以外にも、LiveUSBメディア...
(なお、このツールには"USB Flashdrive"という名称が使われて...
今回は、このusbfadmについて見ていきます。
----
目次
#contents
** usbfadmの機能 [#cedb79be]
*** 機能一覧 [#se02b3c5]
|CENTER:コマンド名|CENTER:機能|h
|[[sync>fg2:usbfadm_sync]]|メモリ上のファイルシステムの内...
|[[newdrive>fg3:liveusb_remaster]]|USBメモリに河豚板のシ...
|[[expand>fg2:usbfadm_expand]]|LiveUSBのデータ保存領域を...
|[[archive>fg3:archive]]|syncで保存したデータをアーカイブ...
|[[target>fg2:usbfadm_sync]]|sync,archive,expandするデバ...
|[[saveas>fg2:usbfadm_sync]]|USBメモリへの保存データ名を...
|[[info>fg2:usbfadm_sync]]|targetで指定したパーティション...
|>|コマンド名クリックで「河豚板ガイド」の説明箇所へ|
***実行例 [#kafd7951]
以下のように、対話形式での利用が基本となっている。実行に...
demohost$ doas usbfadm
doas (kaw@demohost.honjoji.local) password:
Welcome to usbfadm.
USB flash drive administration tool for FuguIta
Version/Arch: 7.6/amd64 (FuguIta-7.6-amd64-202504091)
Boot mode: usbflash
Target device: /dev/sd2d
Data saved as: demohost
readline capability available
TAB to complete the reserved words
Type ? for help.
sd2d : demohost ->?
Interactive commands are;
target - set the partition for sync, info and ex...
saveas - set the name of the data to be saved
sync - sync the target with the current mfs
archive - archive saved directory to *.cpio.gz
info - show info about the target partition
newdrive - make a new FuguIta LiveUSB
expand - expand the target partition as large as...
bye, exit, quit
- end of this utility
Command line options are;
-r : redo sync non-interactively
(must run 'sync' at interactive mode before doin...
-i : show info about the persistent storage
-q : quiet mode when redo sync
-t : trace output (pass -x to shell)
-d : debug output for newdrive to file 'usbf.debugout'
-h : print this help
sd2d : demohost ->
上の「sd2d : demohost ->」がコマンドプロンプト。この例で...
** 各機能の説明 [#z85a6422]
*** sync [#d5b022f9]
[[メモリ上のファイルシステムの内容をUSBメモリへ保存(同期)...
|CENTER:&ref(usbfadm_sync.png,,50%);|
|CENTER:メモリからストレージへの同期|
-保存対象は/ramにマウントされているMFSのディレクトリやフ...
--/ramのさらに下層にマウントされているファイルシステムは...
--/ram/tmp (= /tmp)も対象外
-初回は[[pax>man:pax]]でフルコピー。2回目以降は[[rsync>h...
-保存したデータは、以降の河豚板起動時に[[起動モード3を指...
-保存先のパーティションはtarget、保存名称はsaveasコマンド...
(syncを既に行っており、再実行する場合や、起動モード3で読...
-2回目以降の保存は、"usbfadm -r"とすることで、コマンドラ...
[[cronなどでバックグラウンド実行を行う>fg2:sync_cron]]こ...
***newdrive [#ga041e54]
[[河豚板LiveUSBを新規作成(リマスタリング)する。>fg3:liveu...
#ref(usbfadm_newdrive.png,,50%)
-河豚板LiveDVD/LiveUSBのどちらからでも実行可能
-単に現在動作しているシステムを複製するだけではなく、以下...
|RIGHT:|CENTER:|CENTER:|c
|カスタマイズ項目|設定内容|amd64でのデフォルト値|h
|生成対象|実デバイス / イメージファイル |なし|
|起動方法|LEFT:Legacy BIOS / UEFI / なし(データ保存専用) ...
|パーティション&br;テーブル|MBR / GPT|MBR|
|/ramの&br;ファイルシステム|MFS / TMPFS|MFS|
|スワップのサイズ|(0で作成しない)|16MB|
|データ保存領域の&br;サイズ|(0で作成しない)|未使用部分全て|
|データ保存領域の&br;暗号化|なし / あり|なし|
|未使用領域を&br;FATにするか|しない / する|しない|
なお、上の図からわかるように、newdriveでは保存データのコ...
***expand [#y93de7af]
[[デバイスに未使用領域がある場合、データ保存用パーティシ...
河豚板LiveUSBのイメージファイルは、現在、2GBのサイズで作...
よって、それ以上のサイズのUSBメモリにイメージを書き込んで...
expandコマンドは、データ保存用パーティションをデバイスの...
#ref(usbfadm_expand.png,,50%)
-データ保存用パーティションの拡張には、2つの方法がある
--growfs - パーティション内のデータを保持したまま、拡張を...
--newfs - パーティションを拡張後、フォーマットを行う。こ...
-データ保存用パーティションの後に別のパーティションが存在...
***archive [#c14beb93]
[[saveasで指定した保存データをアーカイブ化する。>fg3:arch...
saveasコマンドで指定し、syncコマンドで保存したファイルツ...
(パス名の最大長は、[[tar>man:tar]]よりも[[cpio>man:cpio]]...
#ref(usbfadm_archive.png,,50%)
このアーカイブファイルは、syncで保存したデータと同様、河...
-archive機能利用の想定シナリオ
--アーカイブデータを読み込んで起動することで、毎回同じ状...
--アーカイブデータを環境をカスタマイズするためのベースと...
--アーカイブされたデータで、運用環境をやりとりする
-アーカイブ元はMFSではなく、syncで保存済みのデータ
--理由:ファイルツリー全体の整合性を担保するため~
MFS->USBメモリへの保存は、数分~数十分かかる場合があるた...
-アーカイブデータからのモード3起動では、usbfadmを起動し...
--理由:アーカイブデータから復帰したMFSがsaveasで保存され...
test.cpio.gzのsaveasが再起動後、"test"に設定されている...
----->archive---->sync...reboot...-->sync--->
| | ^ |
V V | V
test.cpio.gz test/ | test/ "test"が、...
| | test.cpio.g...
+------------------------+ 上書きされ...
** 実装上のTopics色々
*** スクリプトの概要 [#g016e032]
usbfadmは、ディスクデバイスを管理するコマンドに対するwrap...
usbfadmが提供する機能は、[[fdisk>man:fdisk]], [[disklabel...
usbfadmは、単一の[[ksh>man:ksh]]スクリプトで、概ね以下の...
参考: [[usbfadmのソースコード (GitHub)>https://github.com...
#ユティリティ関数群の定義
echoerr() { ... }
clear_exit() { ...}
...
#各コマンド関数群の定義
cmd_sync() { ... }
cmd_archive() { ... }
...
#ここからメイン処理
#初期化
大域変数の定義
実行環境のチェック
デフォルト値の設定
設定ファイルの読込
コマンドラインオプションの解析
if コマンドラインオプションあり; then
非対話的処理
(usbfadm -rなど)
clear_exit
fi
#対話的処理
while :; do
プロンプトの表示
コマンドの読込
case コマンド in
sync) cmd_sync;;
archive) cmd_archive;;
...
esac
done
clear_exit
- 対話的処理のコマンドループ以外はstraight forwardな処理
- デバイスに改変を加える場面では、敢えてUnixのtoolbox的ア...
- 対象デバイスをマウント/アンマウントは、コマンド単位で行...
- エラー発生時、あるいはキャンセルの指示があった場合はcle...
-- 後片付け
---vnodeデバイスの解除
---対象デバイスのアンマウント
---ロックディレクトリ内の作業ファイル
---及びロックディレクトリの削除
---etc...
''→'' ''ユーザがCtrl-Cなどでusbfadmを強制終了させても、安...
- ディスクデバイスやパーティションなどの操作対象はユティ...
-- ユティリティ関数へのAPI的には、パーティションテーブル...
-- デバイス/パーティションのパラメータなども、なるべく直...
*** readline機能の付加 [#m98eea2b]
コマンドの読込には、[[rlwrap>https://github.com/hanslub42...
-行編集機能(Emacsバインディング)
-コマンド/デバイス/ファイルなどのTABによる補完
-デフォルト値の提示 (ENTERでデフォルト値入力)
-ヒストリ機能
rl_wread関数は、始めにrlwrapコマンドをダミーで起動し、rlw...
#-------------------
# read user's input with readline functionality
# outputs echoed to stdout
#
# usage: rl_wread prompt-str default-str [completion...
#
rl_wread () {
local prompt="$1"; shift
local default="$1"; shift
local retval
# check if rlwrap is available
# When control tty is missing (in /etc/rc.shutdown...
# rlwrap in command substitution "$(rlwrap ...) " ...
if retval=$(rlwrap true) 2>/dev/null 2>&1 ; then
echo "$@" > $lockdir/rl_words
rlwrap -b '' \
-f $lockdir/rl_words \
-P "$default" \
sh -f -c 'echo -n "'"$prompt"'->" >&2 ; r...
else
#-------------------
# fallback to dumb input
#
if [[ -z "$default" ]]; then
echo -n "${prompt}->" >&2
read w
else
echo -n "$prompt [$default] -> " >&2
read w
if [[ -z "$w" ]]; then
w="$default"
fi
fi
echo $w
fi
}
使用法: ユーザの入力値は標準出力に返されるので、シェルの...
end of fileの場合は文字列「EOF」が、エラーが発生した場合...
cmd=$(rl_wread "$d : $u " '' quit bye exit sync archive ...
↑ ↑ ↑
プロンプト ↑ TABで補完する単語群
デフォルト値
*** プラットフォーム依存の処理 [#d2247fb1]
usbfadmは、OSによって抽象化されたデバイスやファイルを扱う...
この処理は、newdrive()関数内で/etc/fuguita/usbfadm_postpr...
arm64アーキテクチャの例:~
河豚板/arm64では、newdrive時に[[ラズパイ3/4用にEFI/U-boot...
#
# post processing for Raspberry Pi 3/4
# This file is included in usbfadm
#
notice "Change partition ID and Boot flag for Raspberry ...
if [ "$instsys" = UEFI ]; then
echo "e 0\n0C\n\n\n\nf 0\nq" | fdisk -e "$scandev" ...
fi
# install Raspberry Pi Firmwares and U-Boot binaries
#
notice "Copying U-BOOT stuffs..."
if mount -t msdos -o-l /dev/${scandev}i /mnt; then
tar -xvz -C /mnt -f /usr/fuguita/mdec/bootstuff.$(un...
umount /mnt ...
fi
*** expand機能の改良: GPTの拡張 [#a98ec6fe]
expand機能は、従来、MBRパーティションにのみ対応していた。...
usbfadmではパーティションの操作を行う際は、行いたい操作に...
コーディング例
fdisk_input="e ${partid_obsd}\nA6\nn\n\n*\nw\nq\n"
...
echo -n "$fdisk_input" | fdisk -e "$scandev" >/dev/null
GPTのパーティション拡張の場合も、概ねこの方針でOKだが、新...
- GPTヘッダと呼ばれる部分には、デバイスのサイズが記録され...
- また、配布イメージをデバイスにベタ書きすると、デバイス...
- パーティション情報の変更を行った場合は、GPTヘッダ中のCR...
#ref(usbfadm_gptexpand.png,,50%)
GPTの再構成方法の概要は以下のとおり
- fdiskコマンドをオプションなしで実行し、現状のパーティシ...
- fdisk -eで、fdiskを編集モードで起動
-- デバイスをGPTで初期化
--- GPTヘッダに実デバイスのディスクサイズが正しく設定される
--- GPTヘッダのCRC値が再計算される
--- バックアップGPTがディスクの最後尾に配置される
- 最初に保存した本来のパーティション情報を元に、そのパー...
-- 各パーティションの情報がGPT初期化前のものに復帰する~
~
実際の動作としては、fdisk -v sd1を実行したときの出力は以...
Primary GPT:
Disk: sd1 Usable LBA: 34 to 16777182 [16777216 Sec...
GUID: c535a72e-969c-4602-b77c-e7a162b549b0
#: type [ start...
guid name
--------------------------------------------------------...
1: EFI Sys [ 64...
3df0b410-40b7-47be-a406-20da01ece8e4 UEFI Boot ...
2: Microsoft basic data [ 12860480...
8b830bfc-2d7f-4f00-9c1f-6c241aba9421 MSDOS FAT
3: OpenBSD [ 1088...
83b8e6d4-e620-47aa-b1fc-04f7f827fa81 OpenBSD Area
Secondary GPT:
Disk: sd1 Usable LBA: 34 to 16777182 [16777216 Sec...
GUID: c535a72e-969c-4602-b77c-e7a162b549b0
#: type [ start...
guid name
--------------------------------------------------------...
1: EFI Sys [ 64...
3df0b410-40b7-47be-a406-20da01ece8e4 UEFI Boot
2: Microsoft basic data [ 12860480...
8b830bfc-2d7f-4f00-9c1f-6c241aba9421 MSDOS FAT
3: OpenBSD [ 1088...
83b8e6d4-e620-47aa-b1fc-04f7f827fa81 OpenBSD Area
MBR:
Disk: sd1 geometry: 1044/255/63 [16777216 Sectors]
Offset: 0 Signature: 0xAA55
Starting Ending LBA Info:
#: id C H S - C H S [ start: ...
--------------------------------------------------------...
0: EE 0 0 2 - 1044 85 1 [ 1: ...
1: 00 0 0 0 - 0 0 0 [ 0: ...
2: 00 0 0 0 - 0 0 0 [ 0: ...
3: 00 0 0 0 - 0 0 0 [ 0: ...
cmd_expand関数内では、この出力を以下のようなfdisk編集モー...
reinit gpt ← GPTで初期化
edit 0 ← 初期化で作成されたパーティションを削除
0
edit 1 ← パーティション1の作成
c12a7328-f81f-11d2-ba4b-00a0c93ec93b ← UUID (パーティシ...
64 ← 開始位置
1024 ← サイズ
UEFI Boot ← コメント
edit 2 ← パーティション2以下、同様
ebd0a0a2-b9e5-4433-87c0-68b6b72699c7
12860480
3916672
MSDOS FAT
edit 3
824cc7a0-36a8-11e3-890a-952519ad3f61
1088
12859392
OpenBSD Area
write
quit
変換されたコマンド列をfdisk -e sd1に入力し、GPTを修正する。
- OpenBSDの領域をバックアップGPTの直前まで拡張
- GPTを実デバイスに書き込んでfdisk終了
なお、この処理はGPTを全面的に書き換えるクリティカルな処理...
- 各処理の要所で実行ステータスをチェックし、実デバイスの...
- 書き込み後、エラーが発生した場合は、処理前のパーティシ...
GPT拡張後、disklabelコマンドを呼び出してデータ保存用パー...
- disklabelコマンドを用いて、[[OpenBSD boundary>EBUG勉強...
- ディスクラベルを実デバイスに書き込んでdisklabelコマンド...
** 今後の開発予定 [#p99a7525]
- 現在、新規の機能追加の要望や、不具合の報告などがないた...
- usbfadmは開発開始から約20年が経過しており、中には、以...
if [ 1 -le $(expr X"$(pwd)" : X$mntdir1) ]; then
echo
echoerr 'You are under $mntdir1. Please move to othe...
exit 1
fi
このような古い形式のコードは、適時、修正してゆく。ただし...
** おまけ [#fa4b0043]
河豚板 7.7の「日本語デスクトップ環境デモ版」を作ってみた...
説明ページ
- [[日本語デスクトップ環境デモ版>FuguIta/BBS#d96a6798]]
- [[FuguIta desktop environment demo version>FuguIta/BBS#...
End:
#topicpath
* usbfadm - 河豚板のUSBメモリ管理ツール [#x7dde876]
RIGHT:EBUG 第93回会合 2025年5月31日 ~
川俣吉広、kaw@on.rim.or.jp
** usbfadmについて [#m98d081f]
usbfadm (USB Flashdrive ADMinistration tool) は、[[河豚板...
このツールは当初、河豚板LiveUSBもまだなかったころ、河豚板...
現在ではUSBメモリへのデータ保存以外にも、LiveUSBメディア...
(なお、このツールには"USB Flashdrive"という名称が使われて...
今回は、このusbfadmについて見ていきます。
----
目次
#contents
** usbfadmの機能 [#cedb79be]
*** 機能一覧 [#se02b3c5]
|CENTER:コマンド名|CENTER:機能|h
|[[sync>fg2:usbfadm_sync]]|メモリ上のファイルシステムの内...
|[[newdrive>fg3:liveusb_remaster]]|USBメモリに河豚板のシ...
|[[expand>fg2:usbfadm_expand]]|LiveUSBのデータ保存領域を...
|[[archive>fg3:archive]]|syncで保存したデータをアーカイブ...
|[[target>fg2:usbfadm_sync]]|sync,archive,expandするデバ...
|[[saveas>fg2:usbfadm_sync]]|USBメモリへの保存データ名を...
|[[info>fg2:usbfadm_sync]]|targetで指定したパーティション...
|>|コマンド名クリックで「河豚板ガイド」の説明箇所へ|
***実行例 [#kafd7951]
以下のように、対話形式での利用が基本となっている。実行に...
demohost$ doas usbfadm
doas (kaw@demohost.honjoji.local) password:
Welcome to usbfadm.
USB flash drive administration tool for FuguIta
Version/Arch: 7.6/amd64 (FuguIta-7.6-amd64-202504091)
Boot mode: usbflash
Target device: /dev/sd2d
Data saved as: demohost
readline capability available
TAB to complete the reserved words
Type ? for help.
sd2d : demohost ->?
Interactive commands are;
target - set the partition for sync, info and ex...
saveas - set the name of the data to be saved
sync - sync the target with the current mfs
archive - archive saved directory to *.cpio.gz
info - show info about the target partition
newdrive - make a new FuguIta LiveUSB
expand - expand the target partition as large as...
bye, exit, quit
- end of this utility
Command line options are;
-r : redo sync non-interactively
(must run 'sync' at interactive mode before doin...
-i : show info about the persistent storage
-q : quiet mode when redo sync
-t : trace output (pass -x to shell)
-d : debug output for newdrive to file 'usbf.debugout'
-h : print this help
sd2d : demohost ->
上の「sd2d : demohost ->」がコマンドプロンプト。この例で...
** 各機能の説明 [#z85a6422]
*** sync [#d5b022f9]
[[メモリ上のファイルシステムの内容をUSBメモリへ保存(同期)...
|CENTER:&ref(usbfadm_sync.png,,50%);|
|CENTER:メモリからストレージへの同期|
-保存対象は/ramにマウントされているMFSのディレクトリやフ...
--/ramのさらに下層にマウントされているファイルシステムは...
--/ram/tmp (= /tmp)も対象外
-初回は[[pax>man:pax]]でフルコピー。2回目以降は[[rsync>h...
-保存したデータは、以降の河豚板起動時に[[起動モード3を指...
-保存先のパーティションはtarget、保存名称はsaveasコマンド...
(syncを既に行っており、再実行する場合や、起動モード3で読...
-2回目以降の保存は、"usbfadm -r"とすることで、コマンドラ...
[[cronなどでバックグラウンド実行を行う>fg2:sync_cron]]こ...
***newdrive [#ga041e54]
[[河豚板LiveUSBを新規作成(リマスタリング)する。>fg3:liveu...
#ref(usbfadm_newdrive.png,,50%)
-河豚板LiveDVD/LiveUSBのどちらからでも実行可能
-単に現在動作しているシステムを複製するだけではなく、以下...
|RIGHT:|CENTER:|CENTER:|c
|カスタマイズ項目|設定内容|amd64でのデフォルト値|h
|生成対象|実デバイス / イメージファイル |なし|
|起動方法|LEFT:Legacy BIOS / UEFI / なし(データ保存専用) ...
|パーティション&br;テーブル|MBR / GPT|MBR|
|/ramの&br;ファイルシステム|MFS / TMPFS|MFS|
|スワップのサイズ|(0で作成しない)|16MB|
|データ保存領域の&br;サイズ|(0で作成しない)|未使用部分全て|
|データ保存領域の&br;暗号化|なし / あり|なし|
|未使用領域を&br;FATにするか|しない / する|しない|
なお、上の図からわかるように、newdriveでは保存データのコ...
***expand [#y93de7af]
[[デバイスに未使用領域がある場合、データ保存用パーティシ...
河豚板LiveUSBのイメージファイルは、現在、2GBのサイズで作...
よって、それ以上のサイズのUSBメモリにイメージを書き込んで...
expandコマンドは、データ保存用パーティションをデバイスの...
#ref(usbfadm_expand.png,,50%)
-データ保存用パーティションの拡張には、2つの方法がある
--growfs - パーティション内のデータを保持したまま、拡張を...
--newfs - パーティションを拡張後、フォーマットを行う。こ...
-データ保存用パーティションの後に別のパーティションが存在...
***archive [#c14beb93]
[[saveasで指定した保存データをアーカイブ化する。>fg3:arch...
saveasコマンドで指定し、syncコマンドで保存したファイルツ...
(パス名の最大長は、[[tar>man:tar]]よりも[[cpio>man:cpio]]...
#ref(usbfadm_archive.png,,50%)
このアーカイブファイルは、syncで保存したデータと同様、河...
-archive機能利用の想定シナリオ
--アーカイブデータを読み込んで起動することで、毎回同じ状...
--アーカイブデータを環境をカスタマイズするためのベースと...
--アーカイブされたデータで、運用環境をやりとりする
-アーカイブ元はMFSではなく、syncで保存済みのデータ
--理由:ファイルツリー全体の整合性を担保するため~
MFS->USBメモリへの保存は、数分~数十分かかる場合があるた...
-アーカイブデータからのモード3起動では、usbfadmを起動し...
--理由:アーカイブデータから復帰したMFSがsaveasで保存され...
test.cpio.gzのsaveasが再起動後、"test"に設定されている...
----->archive---->sync...reboot...-->sync--->
| | ^ |
V V | V
test.cpio.gz test/ | test/ "test"が、...
| | test.cpio.g...
+------------------------+ 上書きされ...
** 実装上のTopics色々
*** スクリプトの概要 [#g016e032]
usbfadmは、ディスクデバイスを管理するコマンドに対するwrap...
usbfadmが提供する機能は、[[fdisk>man:fdisk]], [[disklabel...
usbfadmは、単一の[[ksh>man:ksh]]スクリプトで、概ね以下の...
参考: [[usbfadmのソースコード (GitHub)>https://github.com...
#ユティリティ関数群の定義
echoerr() { ... }
clear_exit() { ...}
...
#各コマンド関数群の定義
cmd_sync() { ... }
cmd_archive() { ... }
...
#ここからメイン処理
#初期化
大域変数の定義
実行環境のチェック
デフォルト値の設定
設定ファイルの読込
コマンドラインオプションの解析
if コマンドラインオプションあり; then
非対話的処理
(usbfadm -rなど)
clear_exit
fi
#対話的処理
while :; do
プロンプトの表示
コマンドの読込
case コマンド in
sync) cmd_sync;;
archive) cmd_archive;;
...
esac
done
clear_exit
- 対話的処理のコマンドループ以外はstraight forwardな処理
- デバイスに改変を加える場面では、敢えてUnixのtoolbox的ア...
- 対象デバイスをマウント/アンマウントは、コマンド単位で行...
- エラー発生時、あるいはキャンセルの指示があった場合はcle...
-- 後片付け
---vnodeデバイスの解除
---対象デバイスのアンマウント
---ロックディレクトリ内の作業ファイル
---及びロックディレクトリの削除
---etc...
''→'' ''ユーザがCtrl-Cなどでusbfadmを強制終了させても、安...
- ディスクデバイスやパーティションなどの操作対象はユティ...
-- ユティリティ関数へのAPI的には、パーティションテーブル...
-- デバイス/パーティションのパラメータなども、なるべく直...
*** readline機能の付加 [#m98eea2b]
コマンドの読込には、[[rlwrap>https://github.com/hanslub42...
-行編集機能(Emacsバインディング)
-コマンド/デバイス/ファイルなどのTABによる補完
-デフォルト値の提示 (ENTERでデフォルト値入力)
-ヒストリ機能
rl_wread関数は、始めにrlwrapコマンドをダミーで起動し、rlw...
#-------------------
# read user's input with readline functionality
# outputs echoed to stdout
#
# usage: rl_wread prompt-str default-str [completion...
#
rl_wread () {
local prompt="$1"; shift
local default="$1"; shift
local retval
# check if rlwrap is available
# When control tty is missing (in /etc/rc.shutdown...
# rlwrap in command substitution "$(rlwrap ...) " ...
if retval=$(rlwrap true) 2>/dev/null 2>&1 ; then
echo "$@" > $lockdir/rl_words
rlwrap -b '' \
-f $lockdir/rl_words \
-P "$default" \
sh -f -c 'echo -n "'"$prompt"'->" >&2 ; r...
else
#-------------------
# fallback to dumb input
#
if [[ -z "$default" ]]; then
echo -n "${prompt}->" >&2
read w
else
echo -n "$prompt [$default] -> " >&2
read w
if [[ -z "$w" ]]; then
w="$default"
fi
fi
echo $w
fi
}
使用法: ユーザの入力値は標準出力に返されるので、シェルの...
end of fileの場合は文字列「EOF」が、エラーが発生した場合...
cmd=$(rl_wread "$d : $u " '' quit bye exit sync archive ...
↑ ↑ ↑
プロンプト ↑ TABで補完する単語群
デフォルト値
*** プラットフォーム依存の処理 [#d2247fb1]
usbfadmは、OSによって抽象化されたデバイスやファイルを扱う...
この処理は、newdrive()関数内で/etc/fuguita/usbfadm_postpr...
arm64アーキテクチャの例:~
河豚板/arm64では、newdrive時に[[ラズパイ3/4用にEFI/U-boot...
#
# post processing for Raspberry Pi 3/4
# This file is included in usbfadm
#
notice "Change partition ID and Boot flag for Raspberry ...
if [ "$instsys" = UEFI ]; then
echo "e 0\n0C\n\n\n\nf 0\nq" | fdisk -e "$scandev" ...
fi
# install Raspberry Pi Firmwares and U-Boot binaries
#
notice "Copying U-BOOT stuffs..."
if mount -t msdos -o-l /dev/${scandev}i /mnt; then
tar -xvz -C /mnt -f /usr/fuguita/mdec/bootstuff.$(un...
umount /mnt ...
fi
*** expand機能の改良: GPTの拡張 [#a98ec6fe]
expand機能は、従来、MBRパーティションにのみ対応していた。...
usbfadmではパーティションの操作を行う際は、行いたい操作に...
コーディング例
fdisk_input="e ${partid_obsd}\nA6\nn\n\n*\nw\nq\n"
...
echo -n "$fdisk_input" | fdisk -e "$scandev" >/dev/null
GPTのパーティション拡張の場合も、概ねこの方針でOKだが、新...
- GPTヘッダと呼ばれる部分には、デバイスのサイズが記録され...
- また、配布イメージをデバイスにベタ書きすると、デバイス...
- パーティション情報の変更を行った場合は、GPTヘッダ中のCR...
#ref(usbfadm_gptexpand.png,,50%)
GPTの再構成方法の概要は以下のとおり
- fdiskコマンドをオプションなしで実行し、現状のパーティシ...
- fdisk -eで、fdiskを編集モードで起動
-- デバイスをGPTで初期化
--- GPTヘッダに実デバイスのディスクサイズが正しく設定される
--- GPTヘッダのCRC値が再計算される
--- バックアップGPTがディスクの最後尾に配置される
- 最初に保存した本来のパーティション情報を元に、そのパー...
-- 各パーティションの情報がGPT初期化前のものに復帰する~
~
実際の動作としては、fdisk -v sd1を実行したときの出力は以...
Primary GPT:
Disk: sd1 Usable LBA: 34 to 16777182 [16777216 Sec...
GUID: c535a72e-969c-4602-b77c-e7a162b549b0
#: type [ start...
guid name
--------------------------------------------------------...
1: EFI Sys [ 64...
3df0b410-40b7-47be-a406-20da01ece8e4 UEFI Boot ...
2: Microsoft basic data [ 12860480...
8b830bfc-2d7f-4f00-9c1f-6c241aba9421 MSDOS FAT
3: OpenBSD [ 1088...
83b8e6d4-e620-47aa-b1fc-04f7f827fa81 OpenBSD Area
Secondary GPT:
Disk: sd1 Usable LBA: 34 to 16777182 [16777216 Sec...
GUID: c535a72e-969c-4602-b77c-e7a162b549b0
#: type [ start...
guid name
--------------------------------------------------------...
1: EFI Sys [ 64...
3df0b410-40b7-47be-a406-20da01ece8e4 UEFI Boot
2: Microsoft basic data [ 12860480...
8b830bfc-2d7f-4f00-9c1f-6c241aba9421 MSDOS FAT
3: OpenBSD [ 1088...
83b8e6d4-e620-47aa-b1fc-04f7f827fa81 OpenBSD Area
MBR:
Disk: sd1 geometry: 1044/255/63 [16777216 Sectors]
Offset: 0 Signature: 0xAA55
Starting Ending LBA Info:
#: id C H S - C H S [ start: ...
--------------------------------------------------------...
0: EE 0 0 2 - 1044 85 1 [ 1: ...
1: 00 0 0 0 - 0 0 0 [ 0: ...
2: 00 0 0 0 - 0 0 0 [ 0: ...
3: 00 0 0 0 - 0 0 0 [ 0: ...
cmd_expand関数内では、この出力を以下のようなfdisk編集モー...
reinit gpt ← GPTで初期化
edit 0 ← 初期化で作成されたパーティションを削除
0
edit 1 ← パーティション1の作成
c12a7328-f81f-11d2-ba4b-00a0c93ec93b ← UUID (パーティシ...
64 ← 開始位置
1024 ← サイズ
UEFI Boot ← コメント
edit 2 ← パーティション2以下、同様
ebd0a0a2-b9e5-4433-87c0-68b6b72699c7
12860480
3916672
MSDOS FAT
edit 3
824cc7a0-36a8-11e3-890a-952519ad3f61
1088
12859392
OpenBSD Area
write
quit
変換されたコマンド列をfdisk -e sd1に入力し、GPTを修正する。
- OpenBSDの領域をバックアップGPTの直前まで拡張
- GPTを実デバイスに書き込んでfdisk終了
なお、この処理はGPTを全面的に書き換えるクリティカルな処理...
- 各処理の要所で実行ステータスをチェックし、実デバイスの...
- 書き込み後、エラーが発生した場合は、処理前のパーティシ...
GPT拡張後、disklabelコマンドを呼び出してデータ保存用パー...
- disklabelコマンドを用いて、[[OpenBSD boundary>EBUG勉強...
- ディスクラベルを実デバイスに書き込んでdisklabelコマンド...
** 今後の開発予定 [#p99a7525]
- 現在、新規の機能追加の要望や、不具合の報告などがないた...
- usbfadmは開発開始から約20年が経過しており、中には、以...
if [ 1 -le $(expr X"$(pwd)" : X$mntdir1) ]; then
echo
echoerr 'You are under $mntdir1. Please move to othe...
exit 1
fi
このような古い形式のコードは、適時、修正してゆく。ただし...
** おまけ [#fa4b0043]
河豚板 7.7の「日本語デスクトップ環境デモ版」を作ってみた...
説明ページ
- [[日本語デスクトップ環境デモ版>FuguIta/BBS#d96a6798]]
- [[FuguIta desktop environment demo version>FuguIta/BBS#...
Page: