web-dev-qa-db-ja.com

ドライブ/パーティション番号がまだ使用されているのはなぜですか?

多くの場合、特にブートローダーをいじくり回しているとき、ドライブとパーティションの数値が使用されているのがわかります。たとえば、私の/boot/grub/grub.cfg そうですか set root='hd0,gpt2'、私のUEFIブートエントリはドライブ/パーティション番号を参照することが多く、ブートローダーが関係するほとんどすべてのコンテキストで発生するようです。

UUIDとPARTUUIDを取得したので、この方法でのパーティションのアドレス指定は信じられないほど不安定に思われます(afaik、ドライブが常に同じ順序でマウントされるとは限りません。ユーザーは、moboに接続されているドライブの順序を移動できます)。

したがって、私の質問は2つあります。

  1. このアドレス指定スキームは、上記で概説したのと同じくらい不安定ですか?このスキームが予想よりもはるかに信頼できることを意味する標準に何か欠けているのですか、またはこのアドレッシングスキームは、ドライブが単に認識された結果として、本当に(少なくともブートエントリを修正するまで)システムをブート不可能にしますか?別の順序またはマザーボード上の別のスロットにそれらを差し込みますか?

  2. 上記の質問に対する答えが「はい」の場合、なぜこのアドレス指定スキームが引き続き使用されるのですか?すべてにUUIDまたはPARTUUIDを使用すると、はるかに安定していて、一貫性がないでしょうか?

14
quixotrykd

プレーンな番号付けスキームは、最近のシステムでは実際に使用されていません(「最近」はUbuntu 9以降なので、他のディストリビューションもその時代に適応している可能性があります)。
ルートパーティションがプレーンな番号付けスキームで設定されていることを確認するのは正しいことです。ただし、これはデフォルトまたはフォールバック設定であり、通常は次のコマンドで次のようにオーバーライドされます。

search --no-floppy --fs-uuid --set=root 74686973-6973-616e-6578-616d706c650a

これにより、ファイルシステムのUUIDに基づいてルートパーティションが選択されます。

実際には、プレーンな番号付けスキームは通常は安定しています(ハードウェアの変更がない限り)。予測できない番号付けを確認した唯一の例は、先着順のサーブパターンに基づいて列挙され、IDEドライブとしてエミュレートされました。これらのプロセスはどれもありません。本質的に無秩序なので、その特定のシステムBIOS実装に問題があると思います。

注:このコンテキストでの「ルートパーティション」は、起動元のパーティションを意味します。「ルートaka。/ファイルシステム」を含むパーティションとは異なる場合があります。

13
Hermann

厳密に言えば、UUIDはまったくアドレス指定していません

アドレス指定は非常に簡単です。ドライブXセクターYを読み取ります。メモリアドレスZを読み取ります。アドレッシングはシンプルで高速で、解釈の余地はほとんどありません。どこにでもあります。

UUIDがアドレス指定していません。代わりに、検索、検索、デバイスが表示されるのを待機すること、およびファイルシステムを理解する(★)です。デバイスの数によっては、非常に長い時間がかかる場合があります。そして、見つかったら、通常のアドレス指定に戻ります。

GRUBでは、これはsearch(★★)と呼ばれ、GRUBがすでに翼を成長させている場合にのみ使用できます(検索はモジュールであり、サポートするすべてのファイルシステムと同様に、したがってコアのロード後に利用可能)。Linuxでは、(たとえば)findfsと呼ばれます。findfsは、システム内のブロックデバイスを検索して、ファイルシステムまたはパーティションを検索します

すべてのブロックデバイスを通過し、スタンバイからウェイクアップし、データを読み取ります。UUIDが一意ではない場合(dd事故などの後)、または、 UUIDが変更された場合の結果-UUIDも構成エラーが発生しやすい。

一般に、UUIDは素晴らしいものです。もちろん、特にLinuxではドライブの順序がランダムであるため、従来のアドレス指定が失敗することが多い場合は、可能な限りどこでも使用する必要があります。ただし、その複雑さは、単純なアドレッシングが意図するものを超えていることを理解してください。そして、特にブートローダーのごく初期の段階では、それはまだ選択肢にはならないかもしれません。対処が最初に来て、成長する翼は後で来ます。

ブートローダーの場合、努力する必要はないかもしれません(すべてのブートローダーがGRUBのような幅広いファイルシステムをサポートしているわけではありません)。 hd0は、状況に応じて「BIOSが起動したディスク」であることが保証されているため(BIOSが提供)、ランダムなドライブ順序の問題を除外できる場合は、他のパーティションの膨大なリストを調べる必要がない場合があります。 UUIDを検索します。

あなたの設定でそれを言うのに十分自信があるならhd0,gpt2はあなたが望むものであり、そうでなければならず、そうでなければなり得ないので、そのようにそれを使うことには何の問題もありません。時々、単純で単純なアドレス指定がうまく機能することがあります。


(★)以前にこれを説明しました ここのラベルの場合 ...

ラベルの一般的な標準はありません。すべて手編みです。たとえば til-linuxのスーパーブロック形式のこの実装 を参照してください。明日新しいファイルシステムを発明する場合、たとえラベルがあっても、サポートが追加されるまで表示されません。

...そしてそれはUUIDの場合もほとんど同じです。


(★★)実際、GRUBのsearchには--hintオプション、そして...今はソースコードをチェックしていないので、マニュアルにも記載されていませんが、このようなオプションは両方の長所を提供するのに意味があります。ヒントはsearch to最初にそのパーティションをチェックします。UUIDが期待どおりに一致する場合、minimalでデバイスを識別します努力、そしてそれが一致しない場合でも、何らかの方法で機能を維持するために、本格的な検索にフォールバックします。

それに加えて、以前に見つかったUUIDはキャッシュされる傾向があるため、すべてのデバイスを何度も何度も繰り返す必要はありません。探しているUUIDが実際にどこかに存在する場合、これもうまく機能します最初にそれをキャッシュに入れます。

20
frostschutz

また、ラベルを忘れないでください。それらはUUIDほどユニークではありませんが、はるかに有益であり、fstabを人間が読めるようにします。デスクトップまたは小さな会社の場合、つまり、数台から数十台のドライブを管理している場合は、UUIDよりもラベルを優先することができます。

@frostschutzの 優れた回答 について質問を熟考します。「クラシック」デバイスリンクのアドレス指定を好む可能性が高いシナリオの1つは、VM設定、特にVM-for-hireです。 (略して、紛らわしいことに、「IaaS」)クラウド。 bunzima 04.18画像をカスタマイズしたいとします。 2つのディスクを持つ(使い捨て)VMを作成します。1つは(使い捨て)システムドライブで、もう1つはマウントしてカスタマイズするものです。新しいディスクに新しいGRUBを作成したい場合は、おそらくUEFIブートパーティションもマウントします。 /mntの下のターゲットパーティションのマウントポイントを選択したとすると、目的のマウントテーブルは次のようになります。

/dev/sda1    /
/dev/sda9    /boot/efi
/dev/sdb1    /mnt/root
/dev/sdb9    /mnt/efi

そのため、既存のプロバイダー提供のクラウド対応イメージから2つの同一のドライブを作成し、それらを新しいVMに接続して起動します。当然、

  • 現代のすべてのOSディストリビューション、架空のbunzima 04.18は例外ではなく、UUID名のマウントに依存しています。
  • 同じイメージからロールアウトされたすべてのハードドライブは、同じUUIDを持っています。 UUIDは一意であるため、何が問題になるのでしょうか?

これがすべてうまくいくかどうかはすでにわかります。

このfrankencontraptionが初めて起動したとき、EFIブートパーティションとしてsda9を選択しましたが、Linuxはsdb1をルートFSとして再マウントすることを決定しました。

/dev/sda1    /mnt/root
/dev/sdb1    /
/dev/sda9    /boot/efi
/dev/sdb9    /mnt/efi

そして、私のロールアウトスクリプトはその準備ができていなかったので、frankenbuild中にログで単一のツールが文句を言うことなく、最後に起動できないdudイメージを取得しました。

もちろんマウントテーブルをログに出力しました。そしてもちろんマウントとランダムにデバイスがマウントされたマウントの中間の順序でマウントを印刷するため、混乱を見つけるのは非常に困難です。すぐにそれを見つけます。また、同じスクリプト(ただし、異なるイメージのディスクを使用)は、15歳のGlenfiddichと同じくらいスムーズに機能していました。問題を解明するために、丸太の上で髪を引っ張るのに何時間かかったと思いますか?


デスクトップPCからルーターに埋め込まれたLinux、Androidスマートフォン、クラウドデータセンターまで、どのような状況にも適した厳格なルールはありません。 SOの回答は客観的であることが想定されており、もちろん私の経験や好みはそうではありません。したがって、パーティションを識別するさまざまな方法の中から選択する場合は、論理的な推論の例を示します。

  • 理由がなければ、そのままにしておきます。最近のほとんどのディストリビューションでは、UUIDがデフォルトです。 2台目のドライブを追加する場合は、それを試して決定します。おそらく知る必要すらありません。システムがまだ起動していて、新しいデバイスを確認してパーティション分割できる場合は、それをフォーマットしてfstabに追加します(UUID、LABEL、または/devリンクによって、同じ考慮事項が適用されます)。それは、追加のドライブを接続した後にシステムが起動を拒否した場合にのみ発生し、問題が発生します(UEFI BIOSで起動順序を変更するのが最も簡単な方法です)。

    実用的には、システムの起動方法を変更し、起こりそうな起動障害からの回復は間違いなく最悪の問題ですが、どのSATAコネクタが自分のデスクトップのどのドライブに接続されているかをラベル付けするのが最も速く簡単な解決策です。しかし、追加のドライブを投入することは問題を起こす価値のある問題ではないと考える50人のプログラマのためにそれを管理する場合、少なくとも運の限界をテストせず、最初のブートドライブがすべてhd0としてgrubに認識されることを確認してください。そしてシステムはsdaとして。

  • Labels自分のドライブとパーティションをデスクトップまたは3つで管理するか、小さな環境(家のリビングルームに、おかしな電話をかけるソフトウェアエンジニアが集まっています)彼らの「スタートアップオフィス」の場所)。誰かのマシンから物理ドライブを引き出す場合、ラベルを一貫して使用すれば、それがどこから来たかがわかります。

    Lsblk(8)がLABEL=bubba-bootを示している場合、それはbubbaと呼ばれるマシンからプルされたことがわかります。さらに、bubba-boot6864c4ea-f9b9-46db-b875-4d7fc2981007よりもはるかに簡単に舌の上を転がします。これは、私の甘やかされた趣味にとって、実にジョーブレーカーです。ラベルが一意であることを保証することはあなたに移りますが、あなたが見返りに得るのはラベルの意味です。

  • /dev- link based同じイメージのスポーンである、比較的短命でメンテナンスの少ないVMの大隊を指揮するときの命名すべてのUUIDがUUの約束を遵守していることを毎週の賃金に賭ける。任意のsane VMサービス、それはVyper-H独自の物理サーバー上、またはKugel Cloudまたは何か、決してブートドライブをsdeと呼び、2番目のドライブと他の1つだけをsdc²と呼びます。一方、物理マシンでは、SATAケーブルを独創的に接続することで、同じ配置を簡単に得ることができます。

    私はここから抜けますが、このシナリオでは、いわゆる「一貫した」イーサネットインターフェイスの命名を使用して同じルートに進みます。VMでそれを無効にします。誤解しないでください。PCIスロット4に入れたNICが、見ていなくても(または、あなたがいる間でも、NICには恥はありません)。残念ながら、「VMの大隊」環境では、実際にそうしています。この場合、直感に反して、eth0は_enp0s4f6よりも一貫していますmore。 VMプロバイダーは、仮想バスNIC番号1を常にPCIバス0のスロット4に配置することを約束していませんでした(そして、言及された3つのエンティティはいずれも物理的に実在していません)。それは常に関数6になります。しかし、通常はvirtioファミリーからの同じドライバーモジュールを通常持っていることを考慮して、最初のインターフェイスが2番目のインターフェイスの前に依存することができます(最初のNICが常にeth0とは限りません。同じノート²が引き続き適用されます)。


¹もちろん、比喩的に。私は、このビジネスがあまりにも長い間放置されていないとしていました。
²もしそうなら、私は真剣に検討します 彼らから叫んで逃げる プロバイダーまたはVMハイパーバイザーソフトウェアの変更。

5
kkm

両方のスキームを混合して、ほとんどのLinuxディストリビューションと一致させることができます。

結果は、ユースケースに応じて望ましい場合と望ましくない場合があります。たとえば、構成ファイルを変更せずに(仮想ハードウェアまたは実際のハードウェア)ドライブをホット交換する場合は、古いスキーム(さらにはudevスタイルの永続性ハックを無効にすること)を選択できます。欲しかった。

3
rackandboneman

2番目の質問(「なぜこのアドレス指定スキームが引き続き使用されているのですか?」)に対する答えは、おそらく慣性です。はい、GPTパーティションディスクではUUIDのみを使用できます。 /dev/xxxでは、/etc/fstab名の代わりにUUIDを使用できます。 Discoverable Partitions Specification が作成されたので、多くの場合、UUIDを指定する必要はなく、パーティションタイプでディスクをパーティション化するだけで、パーティションが自動的に取得されます。私のマシンでは、カーネルコマンドラインからroot=エントリがまったくありません。

ブートローダーと言えば、GRUBは、マシンのブートストラップとはほとんど関係がないという意味で、最近のUEFI PCではほとんど不要です。最近ではGRUBカーネルチューザープログラムとして機能するだけで、systemd-bootのように、よりシンプルで優れた代替手段があります。

2
Johan Myréen