野中です。

On 2016/04/18 0:31, 丸山直昌 wrote:
> 統計数理研究所の丸山です。
> 
> Sun, 17 Apr 2016 19:51:38 +0900
> 岡部 勝幸 <hgc02...@nifty.com> writes:
> 
>>> gpart create -s GPT ada0
>>> gpart add -t freebsd-ufs ada0
>>> gpart add -t freebsd ada0
>>>
>>> と続けてやると、 ada0p1 の次にできるのは ada0s1 ですか ada0s2ですか、は
>>> たまた ada0p2 ですか?
>>
>> 試してみたところ ada0s2 でした。
> 
> 有難うございました。岡部さんから今日私が得た知識は、GPTスキームに対する
> 私の見方まで変えてしまいました。MBRスキーム+BSD labelが持つ色々な問題点
> をGPTは解決したというのが私の解釈で、中でも UFSファイルシステムの中の第1〜
> 15セクタにstage 1 boot code(普通は/boot/bootの第1〜15セクタのコピー)を持っ
> ているという伝統をやめて type freebsd-bootのパーティションとして独立させ
> たのは、時代の要請にも合っているし、仕様としてもすっきりしていると思って
> います。そもそもMBRスキームという用語自体、 gpart の時代になって作られた
> 言葉で、元々は「Microsoft流disk slice」であって、その中にBSD label を入
> れ込むという方法は、Berkeley版 BSDにあったdisklabel をIntel/Windowsマシ
> ンに適合させるための苦肉の策だったと解釈しています。こんな伝統はこの際捨
> てて GPT の freebsd-ufs partitionに統一する方が健全、と思っていたので、
> GPT スキームで ada0s1a などが作れると知って、ある意味「幻滅」すら感じま
> した。
> 
> まあ、私の感想はそのくらいにしておいて、岡部さんがお書きになった
> 
>> 小金丸さんのされたかったことは、おそらく次のような事かと思います(GPTの
>> ブートコードは対応してないでしょうから結局はMBRにする必要あるでしょうけど)。
> 
> について考えてみましょう。問題は GPTスキームで ada0s1a にある
> /boot/loader(stage 2 boot loader)にいかにして辿り着けるか、です。
> 
> MBRスキームではデバイスの先頭セクタは /boot/boot0 で、これがstage 0 boot
> loaderですが、先頭セクタは4つのスライスのアドレス情報も持っているので、
> stage 0 boot loaderは ada0s1a, adas02a などの第1〜15セクタにある stage 1
> boot code を見つけることができます。それはさらに/boot/loader(stage 2
> boot loader) に制御を渡してOSの起動が進みます(/boot.configを参照しますが)。
> 
> さて GPTスキームだとどうでしょう。コードを読んだわけではないので以下に書
> くことには推理が入っていますが、次のような流れだと思います。
> 
> GPTスキームではディスクのレイアウト情報はデバイスのセクタ0ではなく、
> セクタ34以下にあるのでしょう。従って stage 0 boot code(/boot/pmbrのコピー)
> は、単に type freebsd-boot のパーティションにある stage 1 boot
> code(/boot/gptboot)に制御を渡して、これがディスクのレイアウト情報を読ん
> で続く起動シーケンスを決めるのだと思います。そう考えると

GPTスキームは元々(U)EFI規格の一部として作成されたのですが、現状では
Legasy BIOSとGPTの組合せも(の方が?)多用されており、BIOSモードとUEFI
モードではブートシーケンスは大幅に異なります。
以前自分のBlogの記事
http://blog.livedoor.jp/goldfish_and_laser/archives/2714971.html
http://blog.livedoor.jp/goldfish_and_laser/archives/5191810.html
でも書いたのですが、丸山さんの上記推測はBIOSモードで起動したときの
シーケンスに相当します。
ただ、gptbootはUFS Label構造を見ていなかったと記憶しています(要確認)。
なので、

> # gpart create -s GPT ada0
> # gpart add -t freebsd-boot -s 40 ada0
> # gpart bootcode -b /boot/pmbr -p /boot/gptboot -i 1 ada0
> # gpart add -t freebsd -s 260G ada0
> # gpart create -s BSD -n 10 ada0s2
> # gpart add -s 5g -t freebsd-ufs ada0s2
> # gpart add -s 2g -t freebsd-swap ada0s2
> # gpart add -s 50g -t freebsd-ufs ada0s2
> # gpart add -s 2g -t freebsd-ufs ada0s2
> # gpart add -s 50g -t freebsd-ufs ada0s2
> # gpart add -s 41g -t freebsd-ufs ada0s2
> # gpart add -t freebsd -s 260G ada0
> # gpart create -s BSD -n 10 ada0s3
> # gpart add -s 5g -t freebsd-ufs ada0s3
> # gpart add -s 2g -t freebsd-swap ada0s3
> # gpart add -s 50g -t freebsd-ufs ada0s3
> # gpart add -s 2g -t freebsd-ufs ada0s3
> # gpart add -s 50g -t freebsd-ufs ada0s3
> # gpart add -s 41g -t freebsd-ufs ada0s3
> 
> で ada0s2a に freebsd を入れておけば起動しませんかね?

上記構成とした場合、ada0s2aがada0s2の先頭にあればブートする
かもしれませんが、少なくとも想定した使用法ではないと思います。

gptbootは最初に見つかった(一番番号の小さい)freebsd-ufsパーティション
から起動しますが、他のパーティションから起動したい場合は、
    gpart set a bootme -i 3 ada0
のようにgpartコマンドのsetオプションを使ってブートしたいパーティションに
bootme属性を付ける事で、そのパーティションから起動されます。

一方、UEFIモードで起動した場合は上記bootmeに相当する機能は無く、
最初に見つけたパーティションから起動する機能しかなかったので、
以前投稿したように、UEFIブート時に起動パーティションを選べる
パッチを作って、send-prした所です。

野中


> これが小金丸さんのご希望にかなうかどうか知りませんが。
> 
> 自分で実験できなくて済みません。
> 
> --------
> 丸山直昌@統計数理研究所
> _______________________________________________
> freebsd-users-jp@freebsd.org mailing list
> https://lists.freebsd.org/mailman/listinfo/freebsd-users-jp
> To unsubscribe, send any mail to "freebsd-users-jp-unsubscr...@freebsd.org"
> 

_______________________________________________
freebsd-users-jp@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/freebsd-users-jp
To unsubscribe, send any mail to "freebsd-users-jp-unsubscr...@freebsd.org"

メールによる返信