私は最近GRUBntldr
モジュールを偶然見つけました。
明らかに、その用途の1つは、chainloader
次の例に示すように、NT> = 6.0バージョンのWindowsを起動する代わりに使用されることです。 (Windowsパーティションのボリュームブートレコードが破損している場合は非常に便利です。)
menuentry "Windows 7 (bootmgr on /dev/sda1)" --class windows --class os {
insmod part_msdos
insmod ntfs
insmod ntldr
set root='(hd0,msdos1)'
search --no-floppy --fs-uuid --set=root 1EA0019AA0017A13
ntldr ($root)/bootmgr
}
このブートディレクティブを使用する方法の詳細については、どこで学ぶことができますか?確認してみるとリストにありませんでした。HTMLバージョン~のGNU GRUB マニュアル。
ckhanの返信に返信する
とても感謝しています!私はntldr
GRUBコマンド/モジュールの詳細を学ぶためにソースコードを掘り下げる必要があるとほとんど決めました。しかし、あなたは私よりはるかに優れていました。
コードを書いた人がどのようなデザインディスカッションを行ったかを確認するために、電子メールアーカイブを見ることは決して起こりませんでした。この方法は今後とても役に立ちそうです。言及していただきありがとうございます。
ntldr
GRUBサポートの私の考え
- どのように大きな違いがあるかはわかりませんが、
ntldr
コマンドではなくモジュールです。あるいは、必要に応じて動的にロードされたコマンドを使用することもできます。
あなたのソースコードリンクGRUB_MOD_INIT
行152()と行159()を見ると、モジュールをGRUB_MOD_FINI
ロードしてアンロードするコードが表示されます。
GRUBは皆さんが「と考えられる多くの機能を実装したようです。注文する「モジュールです。私が知っている限り、使用方法の唯一の違いは、モジュールを使用する前にコマンドを使用してロードされたことを確認する必要があることですinsmod ntldr
。
横に:私はGRUBがなぜそれをサポートしていないのかを常に疑問に思いましたreboot
。コマンドは存在しますが、モジュールであることがわかりました。reboot
返されると、GRUBunknown command
はコマンドinsmod reboot
を「記憶」することができますreboot
。
横に:GRUBはいつ、なぜ」削除する「モジュール、まだわかりません。おそらく同様の結果かもしれませんね」ゴミ収集モジュールがロードされると、システムの電源を切って再起動した後もモジュールが持続するようです。頼るしかし、それは実際にしばしば働く方法のようです。 - 興味深いのは、彼らが
ntldr
基盤を置いているということです。コードをchainloader
見たことがありません。chainloader.c
Intel 16ビットでロードを再配置することもできるようです。本物モデル?
私はいntldr
そうではなくて幸いですchainloader
。私もVladimirのコメントに同意します。表面的な類似性が何であれ、使用法の構文は非常に異なります。現在のアプローチはあまり厄介ではありません。 - 興味深いことに、このコマンドをGRUBに追加したいという情熱は明らかに欠けていました。明らかに、GRUB開発者はこれがWindowsに害を及ぼすと思いました。パーティションブートレコード(PBR)可能性はほとんどありません。ただし、簡単なインストール中にこれを行う方法を簡単に説明できます。
まず、ユーザーシステムにWindowsがインストールされているとします。これでUbuntu(12.04 LTS)がインストールされます。横に
「Windows. Ubuntuのインストールのある時点で、彼らは明らかにGRUBをインストールする場所を決定します。正常に起動できますが、GRUBメニューから項目を選択してWindowsを起動しようとすると、Windowsは正常に起動しません。いいえスタート。代わりにGRUBを使用してWindowsを起動しようとすると、GRUBメニューが再び表示されます。
なぜ?明らかに、彼らがGRUBをWindowsパーティションにインストールすることを選択したときに実際に起こったことは、GRUBのPBRがWindowsパーティションのPBRを上書きしたことです。したがって、chainloader +1
Windowsブートローダはチェーンロードされませんが、GRUBは再ロードされます。
IMO、最も安全クイックこの場合、ユーザーがWindowsを起動できるようにする1つの方法は、GRUBの新機能を使用することですntldr
。開発者がこれに興味があるかどうかはわかりません。私は彼らがこれを期待していないと思います。
Windows以外に、GRUBコマンドでntldr
ロードできる他のブートローダが何であるかを知りたいです。bootmgr
ntldr
答え1
文書化されていない機能研究
ntldr
コマンド(モジュールではなくコマンド)が文書化されていないことが正しいです。だから冒険を離れることは良い言い訳になります。
コード考古学。
文書化されていない機能を見つけるたびに最初にすることは、ソースを確認することです。
ソースは次の場所にあります。サバンナGitリポジトリ 2010年8月に本選に合併したものとみられる。
ソースブランチはもう存在しないようですが、それでも見えます。その年の初めに設立されました、2010年4月。 「Vladimir 'phcoder' Serbinenko」のチェックインコメントは次のとおりです。
ntldr support. (based on information from nyu but no code from him)
chainloader
ヘッダーコメントのファイル名はまだ更新されていないため、コマンドに非常に密接に基づいています。
これで正確なチェックインと名前が得られたので、メールライブラリを確認できます。開発者が1年前にこの機能の追加について議論したところを見ることができます。 grub-develメーリングリスト:
このスレッドのいくつかの関連抜粋:
ロバート・ミランこのパッチはNTLDRブートセマンティクスを使用してローダを実装します(BootMGRでも同じため、両方がサポートされています)。
ロバート・ミランこの機能が必要な場合は、スタンドアロン命令ではなくチェーンローダのオプションでなければならないと思います。実際にはチェーンローダーとほぼ同じです。唯一の違いは、ntldrがPBR自体ではなくPBRの後にGRUBによってロードされることです。
ウラジミールセルビネンコntldrはこのPBRをパーティションを識別するためのスーパーブロックとしてのみ使用するため、これには問題はありません。だから私はこのロードを$ rootを渡す特別なケースとして扱いたいと思います。ちょうどその形式が少し奇妙だということです。
イブブルソコマンドに関しては、ブートローダの種類を検出しようとするチェーンローダ(grub4dosなど)コマンドが1つしかないと、ユーザーにとって簡単になると思います。これは私の個人的な意見です。
ウラジミールセルビネンコ私はこれに同意しません。 chainloaderとntldrは同じ構文を共有しません。 chainloaderにはブートセクタが必要で、ntldrにはntldrまたはbootmgrファイルが必要です。 GRUB2の目的は、GRUB1の誤った設計決定を破ることであり、その1つは「カーネル」コマンドでした。 GRUB4DOSはこの問題についてGRUB1に従います。
ロバート・ミラン大丈夫。これを別のコマンドで作成しましょう。私はまだchainloader.cとコード(一部のifdefを含む)を共有する必要があると思います。
あなたの質問に答える
これらすべてを見た後、使用方法について何がわかりますか?
チェーンローダーに基づいています。
1つのパラメータ、つまり開くファイルを使用します。
パーティションのブートレコードを防ぐため、パーティションの破損を回避できます。バラよりこの投稿これをテストする方法の詳細です。
それ約160行のコードだけが必要です。、そこにはあまりないことがわかります。
役に立ったことを願っています!