文書化されていない機能研究

文書化されていない機能研究

私は最近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の返信に返信する

とても感謝しています!私はntldrGRUBコマンド/モジュールの詳細を学ぶためにソースコードを掘り下げる必要があるとほとんど決めました。しかし、あなたは私よりはるかに優れていました。

コードを書いた人がどのようなデザインディスカッションを行ったかを確認するために、電子メールアーカイブを見ることは決して起こりませんでした。この方法は今後とても役に立ちそうです。言及していただきありがとうございます。

ntldrGRUBサポートの私の考え

  1. どのように大きな違いがあるかはわかりませんが、ntldrコマンドではなくモジュールです。あるいは、必要に応じて動的にロードされたコマンドを使用することもできます。

    あなたのソースコードリンクGRUB_MOD_INIT行152()と行159()を見ると、モジュールをGRUB_MOD_FINIロードしてアンロードするコードが表示されます。

    GRUBは皆さんが「と考えられる多くの機能を実装したようです。注文する「モジュールです。私が知っている限り、使用方法の唯一の違いは、モジュールを使用する前にコマンドを使用してロードされたことを確認する必要があることですinsmod ntldr

    横に:私はGRUBがなぜそれをサポートしていないのかを常に疑問に思いましたreboot。コマンドは存在しますが、モジュールであることがわかりました。reboot返されると、GRUBunknown commandはコマンドinsmod rebootを「記憶」することができますreboot

    横に:GRUBはいつ、なぜ」削除する「モジュール、まだわかりません。おそらく同様の結果かもしれませんね」ゴミ収集モジュールがロードされると、システムの電源を切って再起動した後もモジュールが持続するようです。頼るしかし、それは実際にしばしば働く方法のようです。
  2. 興味深いのは、彼らがntldr基盤を置いているということです。コードをchainloader見たことがありません。chainloader.cIntel 16ビットでロードを再配置することもできるようです。本物モデル?

    はいntldrそうではなくて幸いですchainloader。私もVladimirのコメントに同意します。表面的な類似性が何であれ、使用法の構文は非常に異なります。現在のアプローチはあまり厄介ではありません。
  3. 興味深いことに、このコマンドを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 +1Windowsブートローダはチェーンロードされませんが、GRUBは再ロードされます。

    IMO、最も安全クイックこの場合、ユーザーがWindowsを起動できるようにする1つの方法は、GRUBの新機能を使用することですntldr。開発者がこれに興味があるかどうかはわかりません。私は彼らがこれを期待していないと思います。

Windows以外に、GRUBコマンドでntldrロードできる他のブートローダが何であるかを知りたいです。bootmgrntldr

ベストアンサー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行のコードだけが必要です。、そこにはあまりないことがわかります。

役に立ったことを願っています!

おすすめ記事