0
0

UEFI事始め

Posted at

最近Windows 11のOne DriveであれだけやらかしているMSが、性懲りもなくWindows 10で11への有料アップグレードを促すウザい表示を連発させています。これを機に所有PCのうち何台かはWindowsから足を洗わせようとする諸兄も多いことと思います。

移行先として多いのは、Linuxかなと思います。ただ仮想化技術の発展により、Linux自体は広まりつつも現在ではnativeなLinuxはそれほど使われていないと思います。実際私も普段はVMだし、せいぜいwubiでインストールしたLinuxを使用するくらいで、ISOを焼いてみたいなことは最近ほとんどしていませんでした。私の知識はMBR時代で止まっていました。

しかし時代はもう随分前からUEFI(下記リンク参照)であり、原始的なBIOS呼び出しはなくなっていました。今日は移行などの選択肢を増やすため、概要のみですが、その辺にキャッチアップしていきたいと思います。

https://ja.wikipedia.org/wiki/Unified_Extensible_Firmware_Interface
https://www.itmedia.co.jp/news/articles/2202/24/news067.html

Legacy BIOSからUEFI BIOSへ

Legacy BIOSでは起動ディスクのMBRを読んで、そこに含まれるgrubなどのブートストラップローダへそのまま制御を渡していました。以降BIOS側のROMがソフトウェア割り込みにより呼び出されることはあっても、能動的に何かをしたりしませんでした。

https://en.wikipedia.org/wiki/Master_boot_record#System_bootstrapping
https://en.wikipedia.org/wiki/GNU_GRUB#Version_2_(GRUB_2)
https://en.wikipedia.org/wiki/BIOS_interrupt_call

UEFI BIOSではちょっと複雑です。

UEFI BIOSでは(Net起動の場合は違いますが、メディアから起動する場合は)まず、EFI System Partitionを探します。これはMBRの中に入っている場合もあるし、GPTで記述されている場合もあります。EFI System Partitionには複数(リムーバブルメディアは1つ)のUEFIアプリケーションイメージが入っており、それをロードしてOSを起動することになります。

複数のイメージがある場合は、BIOS上に登録され、優先順位をつけられたイメージから選択することになります。

なおEFI System Partitionは、Linuxだと/boot/efiにマウントされています。

MBR?GPT?

MBRは昔のディスクパーティションを管理するテーブルで、ディスクの先頭512バイトの中に入っています。

GPTはその後継とも言うべきテーブルで、典型的にはMBRの後ろくらいにおよそ20KBくらいのサイズで入っています。

別にパーティションのテーブルというだけなので、構造は至って単純です。ディスクのどこからどこまでがどのタイプのパーティションかを書いているだけのものです。おまけにこれらの構造を解析するスクリプトを載せたので参考にしてください(fdiskのような内容です)。

EFI System Partition?

昔懐かしいfat/vfatなファイルシステムです。構造は典型的には

EFI/ベンダ名/xxxxx.efi

のような形で、実際には被らなければなんでもいいよ的な構造です。ベンダ名以下の構造が自由ということです。デフォルトのイメージは

EFI/Boot/boot[アーキテクチャ].efi

になります。HDD/SSDなどでは典型的にはこれではないでしょう。

BIOS上に登録されたイメージ?

イメージの位置はシンボリックリンクのごとくに、典型的にはBIOS上の不揮発ROMに焼かれるようです。仕様的にはUEFI変数というものに格納され、実体は不揮発ROMということになります。変数名はBOOT####という形で、#は数字(0〜9)です。

(3章Boot Manager辺り。斜め読みしかしてません。)

Linuxからこの変数にアクセスするには専用のライブラリ(libefivar1/libefivar-dev)を使用して、参照・変更することになります。幸いにもefibootmgrというコマンドがあるので、それを使えばアクセスできます。

$ efibootmgr -v
BootCurrent: 0004
Timeout: 0 seconds
BootOrder: 0004,0000,0001,0002,0003
Boot0000* UiApp	FvVol(7cb8bdc9-f8eb-4f34-aaea-3ee4af6516a1)/FvFile(462caa21-7614-4503-836e-8ab6f4662331)
      dp: 04 07 14 00 c9 bd b8 7c eb f8 34 4f aa ea 3e e4 af 65 16 a1 / 04 06 14 00 21 aa 2c 46 14 76 03 45 83 6e 8a b6 f4 66 23 31 / 7f ff 04 00
Boot0001* UEFI VBOX CD-ROM VB2-01700376 	PciRoot(0x0)/Pci(0x1,0x1)/Ata(1,0,0){auto_created_boot_option}
      dp: 02 01 0c 00 d0 41 03 0a 00 00 00 00 / 01 01 06 00 01 01 / 03 01 08 00 01 00 00 00 / 7f ff 04 00
    data: 4e ac 08 81 11 9f 59 4d 85 0e e2 1a 52 2c 59 b2
Boot0002* UEFI VBOX HARDDISK VB87af7969-5e21c68e 	PciRoot(0x0)/Pci(0xd,0x0)/Sata(0,65535,0){auto_created_boot_option}
      dp: 02 01 0c 00 d0 41 03 0a 00 00 00 00 / 01 01 06 00 00 0d / 03 12 0a 00 00 00 ff ff 00 00 / 7f ff 04 00
    data: 4e ac 08 81 11 9f 59 4d 85 0e e2 1a 52 2c 59 b2
Boot0003* EFI Internal Shell	FvVol(7cb8bdc9-f8eb-4f34-aaea-3ee4af6516a1)/FvFile(7c04a583-9e3e-4f1c-ad65-e05268d0b4d1)
      dp: 04 07 14 00 c9 bd b8 7c eb f8 34 4f aa ea 3e e4 af 65 16 a1 / 04 06 14 00 83 a5 04 7c 3e 9e 1c 4f ad 65 e0 52 68 d0 b4 d1 / 7f ff 04 00
Boot0004* Ubuntu	HD(1,GPT,d5380019-3c44-4659-a18b-997812a00c08,0x800,0x219800)/File(\EFI\ubuntu\shimx64.efi)
      dp: 04 01 2a 00 01 00 00 00 00 08 00 00 00 00 00 00 00 98 21 00 00 00 00 00 19 00 38 d5 44 3c 59 46 a1 8b 99 78 12 a0 0c 08 02 02 / 04 04 34 00 5c 00 45 00 46 00 49 00 5c 00 75 00 62 00 75 00 6e 00 74 00 75 00 5c 00 73 00 68 00 69 00 6d 00 78 00 36 00 34 00 2e 00 65 00 66 00 69 00 00 00 / 7f ff 04 00

また、sysfsの/sys/firmware/efi/efivarsでも同様な情報にアクセスできます。

まとめ

  • 時代はMBR→GPT
  • 時代はLegacy BIOS→UEFI BIOS
  • UEFI BIOSにはEFI System Partitionが必要
  • UEFIのブートイメージは原則登録制

おまけ

/dev/sdaのMBRとGPTの中身を確認するpythonスクリプトです。間違いが実害のあるところに伝染しないようにGPLv2/v3のデュアルライセンスとします。

from typing import Generator

partition_type_guids = {
    '00000000-0000-0000-0000-000000000000': 'Unused entry',
    '024DEE41-33E7-11D3-9D69-0008C781F39F': 'MBR partition scheme',
    'C12A7328-F81F-11D2-BA4B-00A0C93EC93B': 'EFI System partition',
    '21686148-6449-6E6F-744E-656564454649': 'BIOS boot partition',
    'D3BFE2DE-3DAF-11DF-BA40-E3A556D89593': 'Intel Fast Flash (iFFS) partition (for Intel Rapid Start techn',
    'F4019732-066E-4E12-8273-346C5641494F': 'Sony boot partition',
    'BFBFAFE7-A34F-448A-9A5B-6213EB736C22': 'Lenovo boot partition',
    'E3C9E316-0B5C-4DB8-817D-F92DF00215AE': 'Microsoft Reserved Partition (MSR)',
    'EBD0A0A2-B9E5-4433-87C0-68B6B72699C7': 'Basic data partition',
    '5808C8AA-7E8F-42E0-85D2-E1E90434CFB3': 'Logical Disk Manager (LDM) metadata partition',
    'AF9B60A0-1431-4F62-BC68-3311714A69AD': 'Logical Disk Manager data partition',
    'DE94BBA4-06D1-4D40-A16A-BFD50179D6AC': 'Windows Recovery Environment',
    '37AFFC90-EF7D-4E96-91C3-2D7AE055B174': 'IBM General Parallel File System (GPFS) partition',
    'E75CAF8F-F680-4CEE-AFA3-B001E56EFC2D': 'Storage Spaces partition',
    '558D43C5-A1AC-43C0-AAC8-D1472B2923D1': 'Storage Replica partition',
    '824CC7A0-36A8-11E3-890A-952519AD3F61': 'Data partition',
    'E2A1E728-32E3-11D6-A682-7B03A0000000': 'Service partition',
    '0FC63DAF-8483-4772-8E79-3D69D8477DE4': 'Linux filesystem data',
    '49F48DAA-B10E-11DC-B99B-0019D1879648': 'RAID partition',
    '6523F8AE-3EB1-4E2A-A05A-18B695AE656F': 'Root partition ',
    'D27F46ED-2919-4CB8-BD25-9531F3C16534': 'Root partition (ARC)',
    '69DAD710-2CE4-4E3C-B16C-21A1D49ABED3': 'Root partition (ARM 32-bit)',
    'B921B045-1DF0-41C3-AF44-4C6F280D3FAE': 'Root partition (AArch64)',
    '993D8D3D-F80E-4225-855A-9DAF8ED7EA97': 'Root partition (IA-64)',
    '77055800-792C-4F94-B39A-98C91B762BB6': 'Root partition (LoongArch 64-bit)',
    'E9434544-6E2C-47CC-BAE2-12D6DEAFB44C': 'Root partition (mips: 32-bit MIPS big-endian)',
    'D113AF76-80EF-41B4-BDB6-0CFF4D3D4A25': 'Root partition (mips64: 64-bit MIPS big-endian)',
    '37C58C8A-D913-4156-A25F-48B1B64E07F0': 'Root partition (mipsel: 32-bit MIPS little-endian)',
    '700BDA43-7A34-4507-B179-EEB93D7A7CA3': 'Root partition (mips64el: 64-bit MIPS little-endian)',
    '1AACDB3B-5444-4138-BD9E-E5C2239B2346': 'Root partition (PA-RISC)',
    '1DE3F1EF-FA98-47B5-8DCD-4A860A654D78': 'Root partition (32-bit PowerPC)',
    '912ADE1D-A839-4913-8964-A10EEE08FBD2': 'Root partition (64-bit PowerPC big-endian)',
    'C31C45E6-3F39-412E-80FB-4809C4980599': 'Root partition (64-bit PowerPC little-endian)',
    '60D5A7FE-8E7D-435C-B714-3DD8162144E1': 'Root partition (RISC-V 32-bit)',
    '72EC70A6-CF74-40E6-BD49-4BDA08E8F224': 'Root partition (RISC-V 64-bit)',
    '08A7ACEA-624C-4A20-91E8-6E0FA67D23F9': 'Root partition (s390)',
    '5EEAD9A9-FE09-4A1E-A1D7-520D00531306': 'Root partition (s390x)',
    'C50CDD70-3862-4CC3-90E1-809A8C93EE2C': 'Root partition (TILE-Gx)',
    '44479540-F297-41B2-9AF7-D131D5F0458A': 'Root partition (x86)',
    '4F68BCE3-E8CD-4DB1-96E7-FBCAF984B709': 'Root partition (x86-64)',
    'E18CF08C-33EC-4C0D-8246-C6C6FB3DA024': '/usr partition (Alpha)',
    '7978A683-6316-4922-BBEE-38BFF5A2FECC': '/usr partition (ARC)',
    '7D0359A3-02B3-4F0A-865C-654403E70625': '/usr partition (ARM 32-bit)',
    'B0E01050-EE5F-4390-949A-9101B17104E9': '/usr partition (AArch64)',
    '4301D2A6-4E3B-4B2A-BB94-9E0B2C4225EA': '/usr partition (IA-64)',
    'E611C702-575C-4CBE-9A46-434FA0BF7E3F': '/usr partition (LoongArch 64-bit)',
    '773B2ABC-2A99-4398-8BF5-03BAAC40D02B': '/usr partition (mips: 32-bit MIPS big-endian)',
    '57E13958-7331-4365-8E6E-35EEEE17C61B': '/usr partition (mips64: 64-bit MIPS big-endian)',
    '0F4868E9-9952-4706-979F-3ED3A473E947': '/usr partition (mipsel: 32-bit MIPS little-endian)',
    'C97C1F32-BA06-40B4-9F22-236061B08AA8': '/usr partition (mips64el: 64-bit MIPS little-endian)',
    'DC4A4480-6917-4262-A4EC-DB9384949F25': '/usr partition (PA-RISC)',
    '7D14FEC5-CC71-415D-9D6C-06BF0B3C3EAF': '/usr partition (32-bit PowerPC)',
    '2C9739E2-F068-46B3-9FD0-01C5A9AFBCCA': '/usr partition (64-bit PowerPC big-endian)',
    '15BB03AF-77E7-4D4A-B12B-C0D084F7491C': '/usr partition (64-bit PowerPC little-endian)',
    'B933FB22-5C3F-4F91-AF90-E2BB0FA50702': '/usr partition (RISC-V 32-bit)',
    'BEAEC34B-8442-439B-A40B-984381ED097D': '/usr partition (RISC-V 64-bit)',
    'CD0F869B-D0FB-4CA0-B141-9EA87CC78D66': '/usr partition (s390)',
    '8A4F5770-50AA-4ED3-874A-99B710DB6FEA': '/usr partition (s390x)',
    '55497029-C7C1-44CC-AA39-815ED1558630': '/usr partition (TILE-Gx)',
    '75250D76-8CC6-458E-BD66-BD47CC81A812': '/usr partition (x86)',
    '8484680C-9521-48C6-9C11-B0720656F69E': '/usr partition (x86-64)',
    'FC56D9E9-E6E5-4C06-BE32-E74407CE09A5': 'Root verity partition for dm-verity (Alpha)',
    '24B2D975-0F97-4521-AFA1-CD531E421B8D': 'Root verity partition for dm-verity (ARC) ',
    '7386CDF2-203C-47A9-A498-F2ECCE45A2D6': 'Root verity partition for dm-verity (ARM 32-bit) ',
    'DF3300CE-D69F-4C92-978C-9BFB0F38D820': 'Root verity partition for dm-verity (AArch64) ',
    '86ED10D5-B607-45BB-8957-D350F23D0571': 'Root verity partition for dm-verity (IA-64) ',
    'F3393B22-E9AF-4613-A948-9D3BFBD0C535': 'Root verity partition for dm-verity (LoongArch 64-bit) ',
    '7A430799-F711-4C7E-8E5B-1D685BD48607': 'Root verity partition for dm-verity (mips: 32-bit MIPS big-endian) ',
    '579536F8-6A33-4055-A95A-DF2D5E2C42A8': 'Root verity partition for dm-verity (mips64: 64-bit MIPS big-endian) ',
    'D7D150D2-2A04-4A33-8F12-16651205FF7B': 'Root verity partition for dm-verity (mipsel: 32-bit MIPS little-endian) ',
    '16B417F8-3E06-4F57-8DD2-9B5232F41AA6': 'Root verity partition for dm-verity (mips64el: 64-bit MIPS little-endian) ',
    'D212A430-FBC5-49F9-A983-A7FEEF2B8D0E': 'Root verity partition for dm-verity (PA-RISC) ',
    '906BD944-4589-4AAE-A4E4-DD983917446A': 'Root verity partition for dm-verity (64-bit PowerPC little-endian) ',
    '9225A9A3-3C19-4D89-B4F6-EEFF88F17631': 'Root verity partition for dm-verity (64-bit PowerPC big-endian) ',
    '98CFE649-1588-46DC-B2F0-ADD147424925': 'Root verity partition for dm-verity (32-bit PowerPC) ',
    'AE0253BE-1167-4007-AC68-43926C14C5DE': 'Root verity partition for dm-verity (RISC-V 32-bit) ',
    'B6ED5582-440B-4209-B8DA-5FF7C419EA3D': 'Root verity partition for dm-verity (RISC-V 64-bit) ',
    '7AC63B47-B25C-463B-8DF8-B4A94E6C90E1': 'Root verity partition for dm-verity (s390) ',
    'B325BFBE-C7BE-4AB8-8357-139E652D2F6B': 'Root verity partition for dm-verity (s390x) ',
    '966061EC-28E4-4B2E-B4A5-1F0A825A1D84': 'Root verity partition for dm-verity (TILE-Gx) ',
    '2C7357ED-EBD2-46D9-AEC1-23D437EC2BF5': 'Root verity partition for dm-verity (x86-64) ',
    'D13C5D3B-B5D1-422A-B29F-9454FDC89D76': 'Root verity partition for dm-verity (x86) ',
    '8CCE0D25-C0D0-4A44-BD87-46331BF1DF67': '/usr verity partition for dm-verity (Alpha) ',
    'FCA0598C-D880-4591-8C16-4EDA05C7347C': '/usr verity partition for dm-verity (ARC) ',
    'C215D751-7BCD-4649-BE90-6627490A4C05': '/usr verity partition for dm-verity (ARM 32-bit) ',
    '6E11A4E7-FBCA-4DED-B9E9-E1A512BB664E': '/usr verity partition for dm-verity (AArch64) ',
    '6A491E03-3BE7-4545-8E38-83320E0EA880': '/usr verity partition for dm-verity (IA-64) ',
    'F46B2C26-59AE-48F0-9106-C50ED47F673D': '/usr verity partition for dm-verity (LoongArch 64-bit) ',
    '6E5A1BC8-D223-49B7-BCA8-37A5FCCEB996': '/usr verity partition for dm-verity (mips: 32-bit MIPS big-endian) ',
    '81CF9D90-7458-4DF4-8DCF-C8A3A404F09B': '/usr verity partition for dm-verity (mips64: 64-bit MIPS big-endian) ',
    '46B98D8D-B55C-4E8F-AAB3-37FCA7F80752': '/usr verity partition for dm-verity (mipsel: 32-bit MIPS little-endian) ',
    '3C3D61FE-B5F3-414D-BB71-8739A694A4EF': '/usr verity partition for dm-verity (mips64el: 64-bit MIPS little-endian) ',
    '5843D618-EC37-48D7-9F12-CEA8E08768B2': '/usr verity partition for dm-verity (PA-RISC) ',
    'EE2B9983-21E8-4153-86D9-B6901A54D1CE': '/usr verity partition for dm-verity (64-bit PowerPC little-endian) ',
    'BDB528A5-A259-475F-A87D-DA53FA736A07': '/usr verity partition for dm-verity (64-bit PowerPC big-endian) ',
    'DF765D00-270E-49E5-BC75-F47BB2118B09': '/usr verity partition for dm-verity (32-bit PowerPC) ',
    'CB1EE4E3-8CD0-4136-A0A4-AA61A32E8730': '/usr verity partition for dm-verity (RISC-V 32-bit) ',
    '8F1056BE-9B05-47C4-81D6-BE53128E5B54': '/usr verity partition for dm-verity (RISC-V 64-bit) ',
    'B663C618-E7BC-4D6D-90AA-11B756BB1797': '/usr verity partition for dm-verity (s390) ',
    '31741CC4-1A2A-4111-A581-E00B447D2D06': '/usr verity partition for dm-verity (s390x) ',
    '2FB4BF56-07FA-42DA-8132-6B139F2026AE': '/usr verity partition for dm-verity (TILE-Gx) ',
    '77FF5F63-E7B6-4633-ACF4-1565B864C0E6': '/usr verity partition for dm-verity (x86-64) ',
    '8F461B0D-14EE-4E81-9AA9-049B6FB97ABD': '/usr verity partition for dm-verity (x86) ',
    'D46495B7-A053-414F-80F7-700C99921EF8': 'Root verity signature partition for dm-verity (Alpha)',
    '143A70BA-CBD3-4F06-919F-6C05683A78BC': 'Root verity signature partition for dm-verity (ARC)}',
    '42B0455F-EB11-491D-98D3-56145BA9D037': 'Root verity signature partition for dm-verity (ARM 32-bit)',
    '6DB69DE6-29F4-4758-A7A5-962190F00CE3': 'Root verity signature partition for dm-verity (AArch64)',
    'E98B36EE-32BA-4882-9B12-0CE14655F46A': 'Root verity signature partition for dm-verity (IA-64)',
    '5AFB67EB-ECC8-4F85-AE8E-AC1E7C50E7D0': 'Root verity signature partition for dm-verity (LoongArch 64-bit)',
    'BBA210A2-9C5D-45EE-9E87-FF2CCBD002D0': 'Root verity signature partition for dm-verity (mips: 32-bit MIPS big-endian)',
    '43CE94D4-0F3D-4999-8250-B9DEAFD98E6E': 'Root verity signature partition for dm-verity (mips64: 64-bit MIPS big-endian)',
    'C919CC1F-4456-4EFF-918C-F75E94525CA5': 'Root verity signature partition for dm-verity (mipsel: 32-bit MIPS little-endian)',
    '904E58EF-5C65-4A31-9C57-6AF5FC7C5DE7': 'Root verity signature partition for dm-verity (mips64el: 64-bit MIPS little-endian)',
    '15DE6170-65D3-431C-916E-B0DCD8393F25': 'Root verity signature partition for dm-verity (PA-RISC)',
    'D4A236E7-E873-4C07-BF1D-BF6CF7F1C3C6': 'Root verity signature partition for dm-verity (64-bit PowerPC little-endian)',
    'F5E2C20C-45B2-4FFA-BCE9-2A60737E1AAF': 'Root verity signature partition for dm-verity (64-bit PowerPC big-endian)',
    '1B31B5AA-ADD9-463A-B2ED-BD467FC857E7': 'Root verity signature partition for dm-verity (32-bit PowerPC)',
    '3A112A75-8729-4380-B4CF-764D79934448': 'Root verity signature partition for dm-verity (RISC-V 32-bit)',
    'EFE0F087-EA8D-4469-821A-4C2A96A8386A': 'Root verity signature partition for dm-verity (RISC-V 64-bit)',
    '3482388E-4254-435A-A241-766A065F9960': 'Root verity signature partition for dm-verity (s390)',
    'C80187A5-73A3-491A-901A-017C3FA953E9': 'Root verity signature partition for dm-verity (s390x)',
    'B3671439-97B0-4A53-90F7-2D5A8F3AD47B': 'Root verity signature partition for dm-verity (TILE-Gx)',
    '41092B05-9FC8-4523-994F-2DEF0408B176': 'Root verity signature partition for dm-verity (x86-64)',
    '5996FC05-109C-48DE-808B-23FA0830B676': 'Root verity signature partition for dm-verity (x86)',
    '5C6E1C76-076A-457A-A0FE-F3B4CD21CE6E': '/usr verity signature partition for dm-verity (Alpha)',
    '94F9A9A1-9971-427A-A400-50CB297F0F35': '/usr verity signature partition for dm-verity (ARC)',
    'D7FF812F-37D1-4902-A810-D76BA57B975A': '/usr verity signature partition for dm-verity (ARM 32-bit)',
    'C23CE4FF-44BD-4B00-B2D4-B41B3419E02A': '/usr verity signature partition for dm-verity (AArch64)',
    '8DE58BC2-2A43-460D-B14E-A76E4A17B47F': '/usr verity signature partition for dm-verity (IA-64)',
    'B024F315-D330-444C-8461-44BBDE524E99': '/usr verity signature partition for dm-verity (LoongArch 64-bit)',
    '97AE158D-F216-497B-8057-F7F905770F54': '/usr verity signature partition for dm-verity (mips: 32-bit MIPS big-endian)',
    '05816CE2-DD40-4AC6-A61D-37D32DC1BA7D': '/usr verity signature partition for dm-verity (mips64: 64-bit MIPS big-endian)',
    '3E23CA0B-A4BC-4B4E-8087-5AB6A26AA8A9': '/usr verity signature partition for dm-verity (mipsel: 32-bit MIPS little-endian)',
    'F2C2C7EE-ADCC-4351-B5C6-EE9816B66E16': '/usr verity signature partition for dm-verity (mips64el: 64-bit MIPS little-endian)',
    '450DD7D1-3224-45EC-9CF2-A43A346D71EE': '/usr verity signature partition for dm-verity (PA-RISC)',
    'C8BFBD1E-268E-4521-8BBA-BF314C399557': '/usr verity signature partition for dm-verity (64-bit PowerPC little-endian)',
    '0B888863-D7F8-4D9E-9766-239FCE4D58AF': '/usr verity signature partition for dm-verity (64-bit PowerPC big-endian)',
    '7007891D-D371-4A80-86A4-5CB875B9302E': '/usr verity signature partition for dm-verity (32-bit PowerPC)',
    'C3836A13-3137-45BA-B583-B16C50FE5EB4': '/usr verity signature partition for dm-verity (RISC-V 32-bit)',
    'D2F9000A-7A18-453F-B5CD-4D32F77A7B32': '/usr verity signature partition for dm-verity (RISC-V 64-bit)',
    '17440E4F-A8D0-467F-A46E-3912AE6EF2C5': '/usr verity signature partition for dm-verity (s390)',
    '3F324816-667B-46AE-86EE-9B0C0C6C11B4': '/usr verity signature partition for dm-verity (s390x)',
    '4EDE75E2-6CCC-4CC8-B9C7-70334B087510': '/usr verity signature partition for dm-verity (TILE-Gx)',
    'E7BB33FB-06CF-4E81-8273-E543B413E2E2': '/usr verity signature partition for dm-verity (x86-64)',
    '974A71C0-DE41-43C3-BE5D-5C5CCD1AD2C0': '/usr verity signature partition for dm-verity (x86)',
    'BC13C2FF-59E6-4262-A352-B275FD6F7172': '/boot, as an Extended Boot Loader (XBOOTLDR) partition',
    '85D5E45B-237C-11E1-B4B3-E89A8F7FC3A7': 'Swap partition',
    'E6D6D379-F507-44C2-A23C-238F2A3DF928': 'Logical Volume Manager (LVM) partition',
    '6A90BA39-1DD2-11B2-99A6-080020736631': '/home partition',
    '3B8F8425-20E0-4F3B-907F-1A25A76F98E8': '/srv (server data) partition',
    '773F91EF-66D4-49B5-BD83-D683BF40AD16': 'Per-user home partition',
    '7FFEC5C9-2D00-49B7-8941-3EA10A5586B7': 'Plain dm-crypt partition',
    'CA7D7CCB-63ED-4C53-861C-1742536059CC': 'LUKS partition',
    '8DA63339-0007-60C0-C436-083AC8230908': 'Reserved',
    '0657FD6D-A4AB-43C4-84E5-0933C84B4F4F': 'Linux Swap partition',
    '85D5E45E-237C-11E1-B4B3-E89A8F7FC3A7': 'Boot partition',
    '516E7CB4-6ECF-11D6-8FF8-00022D09712B': 'BSD disklabel partition',
    '0394EF8B-237E-11E1-B4B3-E89A8F7FC3A7': 'Unix File System (UFS) partition',
    '85D5E45C-237C-11E1-B4B3-E89A8F7FC3A7': 'Vinum volume manager partition',
    '85D5E45D-237C-11E1-B4B3-E89A8F7FC3A7': 'ZFS partition',
    '74BA7DD9-A689-11E1-BD04-00E081286ACF': 'nandfs partition',
    '48465300-0000-11AA-AA11-00306543ECAC': 'Hierarchical File System Plus (HFS+) partition',
    '7C3457EF-0000-11AA-AA11-00306543ECAC': 'Apple APFS container APFS FileVault volume container',
    '55465300-0000-11AA-AA11-00306543ECAC': 'Apple UFS container',
    '6A898CC3-1DD2-11B2-99A6-080020736631': 'ZFS',
    '52414944-0000-11AA-AA11-00306543ECAC': 'Apple RAID partition',
    '52414944-5F4F-11AA-AA11-00306543ECAC': 'Apple RAID partition, offline',
    '426F6F74-0000-11AA-AA11-00306543ECAC': 'Apple Boot partition (Recovery HD)',
    '4C616265-6C00-11AA-AA11-00306543ECAC': 'Apple Label',
    '5265636F-7665-11AA-AA11-00306543ECAC': 'Apple TV Recovery partition',
    '53746F72-6167-11AA-AA11-00306543ECAC': 'Apple Core Storage Container HFS+ FileVault volume container',
    '69646961-6700-11AA-AA11-00306543ECAC': 'Apple APFS Preboot partition',
    '52637672-7900-11AA-AA11-00306543ECAC': 'Apple APFS Recovery partition',
    '6A85CF4D-1DD2-11B2-99A6-080020736631': 'Root partition',
    '6A8B642B-1DD2-11B2-99A6-080020736631': 'Backup partition',
    '6A8EF2E9-1DD2-11B2-99A6-080020736631': '/var partition',
    '6A9283A5-1DD2-11B2-99A6-080020736631': 'Alternate sector',
    '6A8D2AC7-1DD2-11B2-99A6-080020736631': 'Reserved partition',
    '49F48D5A-B10E-11DC-B99B-0019D1879648': 'FFS partition',
    '49F48D82-B10E-11DC-B99B-0019D1879648': 'LFS partition',
    '2DB519C4-B10F-11DC-B99B-0019D1879648': 'Concatenated partition',
    '2DB519EC-B10F-11DC-B99B-0019D1879648': 'Encrypted partition',
    'FE3A2A5D-4F32-41A7-B725-ACCC3285A309': 'ChromeOS kernel',
    '3CB8E202-3B7E-47DD-8A3C-7FF2A13CFCEC': 'ChromeOS rootfs',
    'CAB6E88E-ABF3-4102-A07A-D4BB9BE3C1D3': 'ChromeOS firmware',
    '2E0A753D-9E48-43B0-8337-B15192CB1B5E': 'ChromeOS future use',
    '09845860-705F-4BB5-B16C-8A8A099CAF52': 'ChromeOS miniOS',
    '3F0F8318-F146-4E6B-8222-C28C8F02E0D5': 'ChromeOS hibernate',
    '5DFBF5F4-2848-4BAC-AA5E-0D9A20B745A6': '/usr partition (coreos-usr)',
    '3884DD41-8582-4404-B9A8-E9B84F2DF50E': 'Resizable rootfs (coreos-resize)',
    'C95DC21A-DF0E-4340-8D7B-26CBFA9A03E0': 'OEM customizations (coreos-reserved)',
    'BE9067B9-EA49-4F15-B4F6-F36F8C9E1818': 'Root filesystem on RAID (coreos-root-raid)',
    '42465331-3BA3-10F1-802A-4861696B7521': 'Haiku BFS',
    '45B0969E-9B03-4F30-B4C6-B4B80CEFF106': 'Journal',
    '45B0969E-9B03-4F30-B4C6-5EC00CEFF106': 'dm-crypt journal',
    '4FBD7E29-9D25-41B8-AFD0-062C0CEFF05D': 'OSD',
    '4FBD7E29-9D25-41B8-AFD0-5EC00CEFF05D': 'dm-crypt OSD',
    '89C57F98-2FE5-4DC0-89C1-F3AD0CEFF2BE': 'Disk in creation',
    '89C57F98-2FE5-4DC0-89C1-5EC00CEFF2BE': 'dm-crypt disk in creation',
    'CAFECAFE-9B03-4F30-B4C6-B4B80CEFF106': 'Block',
    '30CD0809-C2B2-499C-8879-2D6B78529876': 'Block DB',
    '5CE17FCE-4087-4169-B7FF-056CC58473F9': 'Block write-ahead log',
    'FB3AABF9-D25F-47CC-BF5E-721D1816496B': 'Lockbox for dm-crypt keys',
    '4FBD7E29-8AE0-4982-BF9D-5A8D867AF560': 'Multipath OSD',
    '45B0969E-8AE0-4982-BF9D-5A8D867AF560': 'Multipath journal',
    '7F4A666A-16F3-47A2-8445-152EF4D03F6C': 'Multipath block',
    'EC6D6385-E346-45DC-BE91-DA2A7C8B3261': 'Multipath block DB',
    '01B41E1B-002A-453C-9F17-88793989FF8F': 'Multipath block write-ahead log',
    'CAFECAFE-9B03-4F30-B4C6-5EC00CEFF106': 'dm-crypt block',
    '93B0052D-02D9-4D8A-A43B-33A3EE4DFBC3': 'dm-crypt block DB',
    '306E8683-4FE2-4330-B7C0-00A917C16966': 'dm-crypt block write-ahead log',
    '45B0969E-9B03-4F30-B4C6-35865CEFF106': 'dm-crypt LUKS journal',
    'CAFECAFE-9B03-4F30-B4C6-35865CEFF106': 'dm-crypt LUKS block',
    '166418DA-C469-4022-ADF4-B30AFD37F176': 'dm-crypt LUKS block DB',
    '86A32090-3647-40B9-BBBD-38D8C573AA86': 'dm-crypt LUKS block write-ahead log',
    '4FBD7E29-9D25-41B8-AFD0-35865CEFF05D': 'dm-crypt LUKS OSD',
    'CEF5A9AD-73BC-4601-89F3-CDEEEEE321A1': 'Power-safe (QNX6) file system',
    'C91818F9-8025-47AF-89D2-F030D7000C2C': 'Plan 9 partition',
    '9D275380-40AD-11DB-BF97-000C2911D1B8': 'vmkcore (coredump partition)',
    'AA31E02A-400F-11DB-9590-000C2911D1B8': 'VMFS filesystem partition',
    '9198EFFC-31C0-11DB-8F78-000C2911D1B8': 'VMware Reserved',
    '2568845D-2332-4675-BC39-8FA5A4748D15': 'Bootloader',
    '114EAFFE-1552-4022-B26E-9B053604CF84': 'Bootloader2',
    '7412F7D5-A156-4B13-81DC-867174929325': 'Boot',
    '4177C722-9E92-4AAB-8644-43502BFD5506': 'Recovery',
    'EF32A33B-A409-486C-9141-9FFB711F6266': 'Misc',
    '20AC26BE-20B7-11E3-84C5-6CFDB94711E9': 'Metadata',
    '38F428E6-D326-425D-9140-6E0EA133647C': 'System',
    'A893EF21-E428-470A-9E55-0668FD91A2D9': 'Cache',
    'DC76DDA9-5AC1-491C-AF42-A82591580C0D': 'Data',
    'EBC597D0-2053-4B15-8B64-E0AAC75F4DB1': 'Persistent',
    'C5A0AEEC-13EA-11E5-A1B1-001E67CA0C3C': 'Vendor',
    'D4E6E2CD-4469-46F3-B5CB-1BFF57AFC149': 'Config',
    '8F68CC74-C5E5-48DA-BE91-A0C8C15E9C80': 'Factory',
    '9FDAA6EF-4B3F-40D2-BA8D-BFF16BFB887B': 'Factory (alt)',
    '767941D0-2085-11E3-AD3B-6CFDB94711E9': 'Fastboot / Tertiary',
    'AC6D7924-EB71-4DF8-B48D-E267B27148FF': 'OEM',
    '19A710A2-B3CA-11E4-B026-10604B889DCF': 'Android Meta',
    '193D1EA4-B3CA-11E4-B075-10604B889DCF': 'Android EXT',
    '9E1A2D38-C612-4316-AA26-8B49521E5A8B': 'PReP boot',
    '734E5AFE-F61A-11E6-BC64-92361F002671': 'Basic data partition (GEM, BGM, F32)',
    '8C8F8EFF-AC95-4770-814A-21994F2DBC8F': 'Encrypted data partition',
    '90B6FF38-B98F-4358-A21F-48F35B4A8AD3': 'ArcaOS Type 1',
    '7C5222BD-8F5D-4087-9C00-BF9843C7B58C': 'SPDK block device',
    '4778ED65-BF42-45FA-9C5B-287A1DC4AAB1': 'barebox-state',
    '3DE21764-95BD-54BD-A5C3-4ABE786F38A8': 'U-Boot environment',
    'B6FA30DA-92D2-4A9A-96F1-871EC6486200': 'SoftRAID_Status',
    '2E313465-19B9-463F-8126-8A7993773801': 'SoftRAID_Scratch',
    'FA709C7E-65B1-4593-BFD5-E71D61DE9B02': 'SoftRAID_Volume',
    'BBBA6DF5-F46F-4A89-8F59-8765B2727503': 'SoftRAID_Cache',
    'FE8A2634-5E2E-46BA-99E3-3A192091A350': 'Bootloader (slot A/B/R)',
    'D9FD4535-106C-4CEC-8D37-DFC020CA87CB': 'Durable mutable encrypted system data',
    'A409E16B-78AA-4ACC-995C-302352621A41': 'Durable mutable bootloader data (including A/B/R metadata)',
    'F95D940E-CABA-4578-9B93-BB6C90F29D3E': 'Factory-provisioned read-only system data',
    '10B8DBAA-D2BF-42A9-98C6-A7C5DB3701E7': 'Factory-provisioned read-only bootloader data',
    '49FD7CB8-DF15-4E73-B9D9-992070127F0F': 'Fuchsia Volume Manager',
    '421A8BFC-85D9-4D85-ACDA-B64EEC0133E9': 'Verified boot metadata (slot A/B/R)',
    '9B37FFF6-2E58-466A-983A-F7926D0B04E0': 'Zircon boot image (slot A/B/R)',
    '606B000B-B7C7-4653-A7D5-B737332C899D': 'fuchsia-system',
    '08185F0C-892D-428A-A789-DBEEC8F55E6A': 'fuchsia-data',
    '48435546-4953-2041-494E-5354414C4C52': 'fuchsia-install',
    '2967380E-134C-4CBB-B6DA-17E7CE1CA45D': 'fuchsia-blob',
    '41D0E340-57E3-954E-8C1E-17ECAC44CFF5': 'fuchsia-fvm',
    'DE30CC86-1F4A-4A31-93C4-66F147D33E05': 'Zircon boot image (slot A)',
    '23CC04DF-C278-4CE7-8471-897D1A4BCDF7': 'Zircon boot image (slot B)',
    'A0E5CF57-2DEF-46BE-A80C-A2067C37CD49': 'Zircon boot image (slot R)',
    '4E5E989E-4C86-11E8-A15B-480FCF35F8E6': 'sys-config',
    '5A3A90BE-4C86-11E8-A15B-480FCF35F8E6': 'factory-config',
    '5ECE94FE-4C86-11E8-A15B-480FCF35F8E6': 'bootloader',
    '8B94D043-30BE-4871-9DFA-D69556E8C1F3': 'guid-test',
    'A13B4D9A-EC5F-11E8-97D8-6C3BE52705BF': 'Verified boot metadata (slot A)',
    'A288ABF2-EC5F-11E8-97D8-6C3BE52705BF': 'Verified boot metadata (slot B)',
    '6A2460C3-CD11-4E8B-80A8-12CCE268ED0A': 'Verified boot metadata (slot R)',
    '1D75395D-F2C6-476B-A8B7-45CC1C97B476': 'misc',
    '900B0FC5-90CD-4D4F-84F9-9F8ED579DB88': 'emmc-boot1',
    'B2B2E8D1-7C10-4EBC-A2D0-4614568260AD': 'emmc-boot2',
}

def logint(x: int, base: int)->int:
    if x < 1:
        raise Exception('NAN')
    if x == 1:
        return 0
    logi = 1
    y = base
    while x >= y:
        y *= base
        logi += 1
    return logi

def hexdump(binary: bytes, start_address: int)->Generator[str, None, None]:
    addrlen = logint(start_address + len(binary), 256)
    def gen(N: int)->Generator[str, None, None]:
        for i in range(0, len(binary), N):
            address = (start_address + i).to_bytes(addrlen, 'big').hex() + ": "
            yield address + ' '.join(b.to_bytes(1, 'big').hex() for b in binary[i:i+N])
    return gen(16)

def get_guid(binary: bytes)->str:
    return '-'.join([
        binary[3::-1].hex(),
        binary[5:3:-1].hex(),
        binary[7:5:-1].hex(),
        binary[8:10].hex(),
        binary[10:16].hex()])

def analyze_mbr(mbr: bytes)->Generator[dict, None, None]:
    partitions = mbr[0x01be:0x01be + 64]
    for i in range(4):
        partition = partitions[16*i:16*(i+1)]
        o = {}
        o['boot_flag'] = int.from_bytes(partition[0:1], 'little')
        o['first_sector_chs'] = [x for x in partition[1:4]]
        o['partition_type'] = int.from_bytes(partition[4:5], 'little')
        o['last_sector_chs'] = [x for x in partition[5:8]]
        o['first_sector_lba'] = int.from_bytes(partition[8:12], 'little')
        o['number_of_sectors'] = int.from_bytes(partition[12:16], 'little')
        yield o

def analyze_lba1(lba1: bytes)->dict:
    l1 = {}
    l1['signature'] = lba1[0:8].decode()
    l1['revision'] = [x for x in lba1[8:12]]
    l1['header_size'] = int.from_bytes(lba1[12:16], 'little')
    l1['header_size'] = int.from_bytes(lba1[12:16], 'little')
    l1['crc'] = ' '.join(x.to_bytes(1, 'big').hex() for x in lba1[16:20])
    l1['current_lba'] = int.from_bytes(lba1[24:32], 'little')
    l1['backup_lba'] = int.from_bytes(lba1[32:40], 'little')
    l1['first_usable_lba'] = int.from_bytes(lba1[40:48], 'little')
    l1['last_usable_lba'] = int.from_bytes(lba1[48:56], 'little')
    l1['disk_guid'] = get_guid(lba1[56:72])
    l1['starting_lba'] = int.from_bytes(lba1[72:80], 'little')
    l1['num_of_partitions'] = int.from_bytes(lba1[80:84], 'little')
    l1['size_of_partition'] = int.from_bytes(lba1[84:88], 'little')
    l1['crc32'] = lba1[91:87:-1].hex()
    return l1

def analyze_part(part: bytes)->dict:
    entry = {}
    entry['type(GUID)'] = get_guid(part[0:16])
    entry['type'] = partition_type_guids[(entry['type(GUID)'].upper())]
    entry['guid'] = get_guid(part[16:32])
    entry['first_lba'] = int.from_bytes(part[32:40], 'little')
    entry['last_lba'] = int.from_bytes(part[40:48], 'little')
    entry['size'] = (entry['last_lba'] - entry['first_lba'] + 1) * 512
    entry['attribute_flags'] = part[48:56].hex()
    entry['name'] = part[56:128].decode("utf-16le")
    return entry

def main()->None:
    with open('/dev/sda', 'rb') as f:
        print('[MBR/LBA0]')
        mbr = f.read(512)
        for line in hexdump(mbr, 0):
            print(line)
        has_gpt = False
        for o in analyze_mbr(mbr):
            print(o)
            if o['partition_type'] == 0xee:
                has_gpt = True
        if has_gpt:
            print('[LBA1]')
            lba1 = f.read(512)
            for line in hexdump(lba1, 0x200):
                print(line)
            l1 = analyze_lba1(lba1)
            print(l1)
            print('[LBA2-]')
            lbas = f.read(l1['num_of_partitions'] * l1['size_of_partition'])
            for i in range(l1['num_of_partitions']):
                part = lbas[i*l1['size_of_partition']:(i+1)*l1['size_of_partition']]
                entry = analyze_part(part)
                if entry['type'] != 'Unused entry':
                    for line in hexdump(part, 0x400 + i*l1['size_of_partition']):
                        print(line)
                    print(entry)

if __name__ == '__main__':
    main()
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0