$30 off During Our Annual Pro Sale. View Details »

NetBSDておくれLive Image UEFI対応 設計仕様検討メモ / NetBSD UEFI Live Image

NetBSDておくれLive Image UEFI対応 設計仕様検討メモ / NetBSD UEFI Live Image

NetBSD ておくれ Live Image の UEFI 対応に向けての検討メモです。プレゼン発表した資料ではありませんが、 OSC2014北海道のプレゼン資料を流用して作ったので、とりあえずこちらにアップ。
※2019/2/26 修正版に差し替えました
訂正1: Secondary GPT は Header が末尾に置かれて Table がその前に配置される
訂正2: GPT 時の NetBSD デバイス名は dk1 からではなく dk0 から振られる
他 いくつか記載修正

Izumi Tsutsui

February 24, 2019
Tweet

More Decks by Izumi Tsutsui

Other Decks in Programming

Transcript

  1. NetBSDておくれLive Image
    UEFI対応 設計仕様検討メモ
    OSC2014北海道スライド流用適当メモ
    Izumi Tsutsui
    [email protected]
    twitter: @tsutsuii
    mastodon: @[email protected]
    2019/2/25版

    View Slide

  2. 関連資料
    NetBSDておくれ Live Image
    http://www.ceres.dti.ne.jp/tsutsui/netbsd/liveimage/
    https://github.com/tsutsui/netbsd-teokureliveimage
    github netbsd-teokureliveimage issue #12
    https://github.com/tsutsui/netbsd-teokureliveimage/issues/12
    OSC2014北海道セミナー
    NetBSDておくれ Live Imageの紹介と解説
    https://speakerdeck.com/tsutsui/osc2014do-netbsd-teokure-liveimage
    NetBSD Wiki / Installation on UEFI systems
    https://wiki.netbsd.org/Installation_on_UEFI_systems/

    View Slide

  3. USE_MBR=no, USE_GPT=no の場合
    swap
    パーティション
    NetBSD
    root
    パーティション
    (FFS)
    disklabel
    bootloader
    ディスク全体を
    NetBSDで使用する
    FFS の先頭 8KB (ffsv1) or
    32KB (ffsv2) は空き領域なので
    そこに disklabel と bootloader が入る
    pmax, sparc, sun3, vax 等
    BSD系UNIXはこの構成

    View Slide

  4. ffsパーティション作成
    ・makefs(8)
    ファイル一式とパーミッション設定
    ・disklabel(8)
    ・installboot(8)
    それぞれイメージ先頭に書き込み
    NetBSD
    root
    パーティション
    (FFS)
    disklabel
    bootloader

    View Slide

  5. swapパーティション作成
    swap
    パーティション
    ・dd(1) で作成
    % dd if=/dev/zero \
    of=image.swap \
    count=1048576

    View Slide

  6. イメージ合成
    ・cat(1) で合体
    % cat \
    image.root \
    image.swap \
    > liveimage.fs
    NetBSD
    root
    パーティション
    (FFS)
    swap
    パーティション
    disklabel
    bootloader

    View Slide

  7. USE_MBR=YES の場合
    MBR
    空き
    NetBSD
    root
    パーティション
    (FFS)
    swap
    パーティション
    disklabel
    bootloader
    fdiskパーティションテーブル
    MBR は先頭1セクタのみ
    残りは歴史的シリンダ境界 (63セクタ or 1MB) 確保用
    NetBSDパーティション
     いわゆる ID 169 (0xf9)
    ディスク全体に対して
    NetBSDが使用する領域を指定
    NetBSD領域内のパーティションは
    disklabel で指定
    FFS の先頭 8KB (ffsv1) or
    32KB (ffsv2) は空き領域なので
    そこに disklabel と bootloader が入る

    View Slide

  8. fdiskパーティションテーブル作成
    MBR
    空き ・fdisk(8) コマンド
    % fdisk -f -u \
    -b 487/255/63 -0 -a \
    -s 169/2048/7821312 \
    -i -c usr/mdec/mbr \
    -F image.mbr
    後ろのいらない部分は dd(1) で削除

    View Slide

  9. ffsパーティション作成
    NetBSD
    root
    パーティション
    (FFS)
    disklabel
    bootloader
    ・makefs(8)
    ファイル一式とパーミッション設定
    ・disklabel(8)
    ・installboot(8)
    それぞれイメージ先頭に書き込み

    View Slide

  10. swapパーティション作成
    swap
    パーティション
    ・dd(1) で作成
    % dd if=/dev/zero \
    of=image.swap \
    count=1048576

    View Slide

  11. イメージ合成
    ・cat(1) で合体
    % cat \
    image.mbr \
    image.root \
    image.swap \
    > liveimage.fs
    MBR
    空き
    NetBSD
    root
    パーティション
    (FFS)
    swap
    パーティション
    disklabel
    bootloader

    View Slide

  12. USE_GPT=YES の場合
    MBR (PBR)
    空き
    EFI system
    パーティション
    (FAT16 or FAT32)
    NetBSD
    root
    パーティション
    (FFS)
    swap
    パーティション
    MBR 先頭1セクタは互換用
    NetBSDパーティションには
    bootloader も disklabel もなし
    カーネルが GPT を解釈してパーティション毎に
    dk0 dk1 dk2 dk3 dk4 ... とデバイス名割り当て
    bootloader (file)
    空き
    Primary GPT Header
    Primary GPT Table
    Secondary GPT Header
    Secondary GPT Table
    Primary GPT Header: 1セクタ
    Primary GPT Table: 32セクタ
    ファイルシステム境界確保 (1MB区切り等)
    Secondary GPT Table: 32セクタ
    Secondary GPT Header: 1セクタ
    /EFI/{vendor}/ 以下にブートファイルを配置
    UEFI の NVRAM に起動ファイルを登録
    /EFI/boot/bootx64.efi はフォールバック用
    ファイルシステム境界確保 (1MB区切り等)

    View Slide

  13. GPT 作成
    MBR (PBR)
    空き
    Primary GPT Header
    Primary GPT Table
    ・gpt(8) コマンド
    % gpt image.gpt create
    % gpt image.gpt add -a 1m \
    -s 65536 -t efi \
    -l "EFI system"
    % gpt image.gpt add -a 1m \
    -s 1769472 -t ffs
    % gpt image.gpt add -a 1m \
    -s 262144 -t swap
    イメージ先頭に Primary
    イメージ末尾に Secondary
    が作られる(らしい)
    https://ja.wikipedia.org/wiki/GUIDパーティションテーブル
    Secondary GPT Header
    Secondary GPT Table

    View Slide

  14. UEFI FATパーティション作成
    ・makefs(8)
    makefs -t msdos -o F=32
    等で作成
    用意するファイルはブートローダーのみ
    ブートローダーは通常ファイルとして配置
    /EFI/{vendor}/foobootx64.efi
    /EFI/boot/bootx64.efi

    EFI system
    パーティション
    (FAT16 or FAT32)
    bootloader (file)

    View Slide

  15. ffsパーティション作成
    ・makefs(8)
    ファイル一式とパーミッション設定
    ・disklabel(8) は不要
    ・installboot(8) も不要
    NetBSD
    root
    パーティション
    (FFS)

    View Slide

  16. swapパーティション作成
    ・dd(1) で作成
    % dd if=/dev/zero \
    of=image.swap \
    count=1048576
    swap
    パーティション

    View Slide

  17. イメージ合成
    ・dd(1) と cat(1) で切り貼り
    % dd if=image.gpt skip=xxxx \
    count=2048 of=image.secgpt
    % dd if=image.gpt count=xxx | \
    cat - image.efi \
    image.root image.swap \
    image.secgpt
    > liveimage.fs
    以下も必要? (要確認)
    % gpt liveimage.fs biosboot -i 2 \
    -c /usr/mdec/gptmbr.bin
    % gpt liveimage.fs set -a bootme -i 2
    MBR (PBR)
    空き
    EFI system
    パーティション
    (FAT16 or FAT32)
    NetBSD
    root
    パーティション
    (FFS)
    swap
    パーティション
    bootloader (file)
    空き
    Primary GPT Header
    Primary GPT Table
    Secondary GPT Header
    Secondary GPT Table

    View Slide

  18. おまけ: hpcmips, RPI 等
    MBR
    空き
    NetBSD
    root
    パーティション
    (FFS)
    FDISKパーティションテーブル (ローダーは無い)
    NetBSDパーティション いわゆる ID 169 (0xf9)
    ディスク全体に対してNetBSDが使用する領域を指定
    NetBSD領域内のパーティションは disklabel で指定
    FFS の先頭 8KB (ffsv1) or 32KB (ffsv2) は空き領域
    なのでそこに disklabel が入る (bootloader は無い)
    ファイルシステム境界確保 (1MB区切り)
    hpcmips, hpcsh, hpcarm:
    hpcboot.exe のブートローダー
    netbsd カーネル
    RaspberryPi:
    kernel.img, kernel7.img 等のカーネル
    config.txt, cmdline.txt 等の設定ファイル
    https://ch.nicovideo.jp/tsutsui/blomaga/ar1514448 参照
    起動用
    FATパーティション
    bootloader (file)
    起動用カーネル (file)
    swap
    パーティション
    disklabel

    View Slide