diff --git a/aif.xsd b/aif.xsd index 9800c84..0dd27d2 100644 --- a/aif.xsd +++ b/aif.xsd @@ -25,79 +25,116 @@ - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -139,7 +176,9 @@ - + + + @@ -149,6 +188,7 @@ + @@ -204,7 +244,9 @@ - + + + @@ -813,4 +855,4 @@ - \ No newline at end of file + diff --git a/aif/constants.py b/aif/constants.py index 5036924..a6a11a7 100644 --- a/aif/constants.py +++ b/aif/constants.py @@ -16,15 +16,6 @@ _BlockDev.ensure_init(_BlockDev.plugin_specs_from_names(('part', ))) # LIBBLOCKDEV FLAG INDEXING / PARTED <=> LIBBLOCKDEV FLAG CONVERSION BD_PART_FLAGS = _BlockDev.PartFlag(-1) BD_PART_FLAGS_FRIENDLY = dict(zip(BD_PART_FLAGS.value_nicks, BD_PART_FLAGS.value_names)) -BD_PARTED_MAP = {'apple_tv_recovery': 'atvrecv', - 'cpalo': 'palo', - 'gpt_hidden': None, # ??? - 'gpt_no_automount': None, # ??? - 'gpt_read_only': None, # ??? - 'gpt_system_part': None, # ??? - 'hpservice': 'hp-service', - 'msft_data': 'msftdata', - 'msft_reserved': 'msftres'} PARTED_BD_MAP = {v: k for k, v in BD_PARTED_MAP.items() if v is not None} BD_PART_FLAGS_IDX_FLAG = {k: v.value_nicks[0] for k, v in BD_PART_FLAGS.__flags_values__.items()} BD_PART_FLAGS_FLAG_IDX = {v: k for k, v in BD_PART_FLAGS_IDX_FLAG.items()} diff --git a/aif/constants_fallback.py b/aif/constants_fallback.py index 11aaf5e..999051f 100644 --- a/aif/constants_fallback.py +++ b/aif/constants_fallback.py @@ -1,8 +1,11 @@ +import uuid +## import parted # https://www.gnu.org/software/parted/api/index.html - +# META ARCH_RELENG_KEY = '4AA4767BBC9C4B1D18AE28B77F2D434B9741E8AC' VERSION = '0.2.0' +# blkinfo, mdstat, and pyparted are only needed for the non-gi fallbacks. EXTERNAL_DEPS = ['blkinfo', 'gpg', 'lxml', @@ -19,3 +22,208 @@ PARTED_FSTYPES = sorted(list(dict(vars(parted.filesystem))['fileSystemType'].key PARTED_FLAGS = sorted(list(parted.partition.partitionFlag.values())) PARTED_IDX_FLAG = dict(parted.partition.partitionFlag) PARTED_FLAG_IDX = {v: k for k, v in PARTED_IDX_FLAG.items()} +# LIBBLOCKDEV BOOTSTRAPPING (ALLOWED VALUES IN CONFIG) +BD_PARTED_MAP = {'apple_tv_recovery': 'atvrecv', + 'cpalo': 'palo', + 'gpt_hidden': None, # No parted equivalent + 'gpt_no_automount': None, # No parted equivalent + 'gpt_read_only': None, # No parted equivalent + 'gpt_system_part': None, # No parted equivalent + 'hpservice': 'hp-service', + 'msft_data': 'msftdata', + 'msft_reserved': 'msftres'} +# GPT FSTYPES GUIDS +# I'm doing this now because if I didn't, I would probably need to do it later eventually. +# https://en.wikipedia.org/wiki/GUID_Partition_Table#Partition_type_GUIDs +GPT_FSTYPE_GUIDS = ((1, 'EFI System', uuid.UUID(hex = 'C12A7328-F81F-11D2-BA4B-00A0C93EC93B')), + (2, 'MBR partition scheme', uuid.UUID(hex = '024DEE41-33E7-11D3-9D69-0008C781F39F')), + (3, 'Intel Fast Flash', uuid.UUID(hex = 'D3BFE2DE-3DAF-11DF-BA40-E3A556D89593')), + (4, 'BIOS boot', uuid.UUID(hex = '21686148-6449-6E6F-744E-656564454649')), + (5, 'Sony boot partition', uuid.UUID(hex = 'F4019732-066E-4E12-8273-346C5641494F')), + (6, 'Lenovo boot partition', uuid.UUID(hex = 'BFBFAFE7-A34F-448A-9A5B-6213EB736C22')), + (7, 'PowerPC PReP boot', uuid.UUID(hex = '9E1A2D38-C612-4316-AA26-8B49521E5A8B')), + (8, 'ONIE boot', uuid.UUID(hex = '7412F7D5-A156-4B13-81DC-867174929325')), + (9, 'ONIE config', uuid.UUID(hex = 'D4E6E2CD-4469-46F3-B5CB-1BFF57AFC149')), + (10, 'Microsoft reserved', uuid.UUID(hex = 'E3C9E316-0B5C-4DB8-817D-F92DF00215AE')), + (11, 'Microsoft basic data', uuid.UUID(hex = 'EBD0A0A2-B9E5-4433-87C0-68B6B72699C7')), + (12, 'Microsoft LDM metadata', uuid.UUID(hex = '5808C8AA-7E8F-42E0-85D2-E1E90434CFB3')), + (13, 'Microsoft LDM data', uuid.UUID(hex = 'AF9B60A0-1431-4F62-BC68-3311714A69AD')), + (14, 'Windows recovery environment', uuid.UUID(hex = 'DE94BBA4-06D1-4D40-A16A-BFD50179D6AC')), + (15, 'IBM General Parallel Fs', uuid.UUID(hex = '37AFFC90-EF7D-4E96-91C3-2D7AE055B174')), + (16, 'Microsoft Storage Spaces', uuid.UUID(hex = 'E75CAF8F-F680-4CEE-AFA3-B001E56EFC2D')), + (17, 'HP-UX data', uuid.UUID(hex = '75894C1E-3AEB-11D3-B7C1-7B03A0000000')), + (18, 'HP-UX service', uuid.UUID(hex = 'E2A1E728-32E3-11D6-A682-7B03A0000000')), + (19, 'Linux swap', uuid.UUID(hex = '0657FD6D-A4AB-43C4-84E5-0933C84B4F4F')), + (20, 'Linux filesystem', uuid.UUID(hex = '0FC63DAF-8483-4772-8E79-3D69D8477DE4')), + (21, 'Linux server data', uuid.UUID(hex = '3B8F8425-20E0-4F3B-907F-1A25A76F98E8')), + (22, 'Linux root (x86)', uuid.UUID(hex = '44479540-F297-41B2-9AF7-D131D5F0458A')), + (23, 'Linux root (ARM)', uuid.UUID(hex = '69DAD710-2CE4-4E3C-B16C-21A1D49ABED3')), + (24, 'Linux root (x86-64)', uuid.UUID(hex = '4F68BCE3-E8CD-4DB1-96E7-FBCAF984B709')), + (25, 'Linux root (ARM-64)', uuid.UUID(hex = 'B921B045-1DF0-41C3-AF44-4C6F280D3FAE')), + (26, 'Linux root (IA-64)', uuid.UUID(hex = '993D8D3D-F80E-4225-855A-9DAF8ED7EA97')), + (27, 'Linux reserved', uuid.UUID(hex = '8DA63339-0007-60C0-C436-083AC8230908')), + (28, 'Linux home', uuid.UUID(hex = '933AC7E1-2EB4-4F13-B844-0E14E2AEF915')), + (29, 'Linux RAID', uuid.UUID(hex = 'A19D880F-05FC-4D3B-A006-743F0F84911E')), + (30, 'Linux extended boot', uuid.UUID(hex = 'BC13C2FF-59E6-4262-A352-B275FD6F7172')), + (31, 'Linux LVM', uuid.UUID(hex = 'E6D6D379-F507-44C2-A23C-238F2A3DF928')), + (32, 'FreeBSD data', uuid.UUID(hex = '516E7CB4-6ECF-11D6-8FF8-00022D09712B')), + (33, 'FreeBSD boot', uuid.UUID(hex = '83BD6B9D-7F41-11DC-BE0B-001560B84F0F')), + (34, 'FreeBSD swap', uuid.UUID(hex = '516E7CB5-6ECF-11D6-8FF8-00022D09712B')), + (35, 'FreeBSD UFS', uuid.UUID(hex = '516E7CB6-6ECF-11D6-8FF8-00022D09712B')), + (36, 'FreeBSD ZFS', uuid.UUID(hex = '516E7CBA-6ECF-11D6-8FF8-00022D09712B')), + (37, 'FreeBSD Vinum', uuid.UUID(hex = '516E7CB8-6ECF-11D6-8FF8-00022D09712B')), + (38, 'Apple HFS/HFS+', uuid.UUID(hex = '48465300-0000-11AA-AA11-00306543ECAC')), + (39, 'Apple UFS', uuid.UUID(hex = '55465300-0000-11AA-AA11-00306543ECAC')), + (40, 'Apple RAID', uuid.UUID(hex = '52414944-0000-11AA-AA11-00306543ECAC')), + (41, 'Apple RAID offline', uuid.UUID(hex = '52414944-5F4F-11AA-AA11-00306543ECAC')), + (42, 'Apple boot', uuid.UUID(hex = '426F6F74-0000-11AA-AA11-00306543ECAC')), + (43, 'Apple label', uuid.UUID(hex = '4C616265-6C00-11AA-AA11-00306543ECAC')), + (44, 'Apple TV recovery', uuid.UUID(hex = '5265636F-7665-11AA-AA11-00306543ECAC')), + (45, 'Apple Core storage', uuid.UUID(hex = '53746F72-6167-11AA-AA11-00306543ECAC')), + (46, 'Solaris boot', uuid.UUID(hex = '6A82CB45-1DD2-11B2-99A6-080020736631')), + (47, 'Solaris root', uuid.UUID(hex = '6A85CF4D-1DD2-11B2-99A6-080020736631')), + (48, 'Solaris /usr & Apple ZFS', uuid.UUID(hex = '6A898CC3-1DD2-11B2-99A6-080020736631')), + (49, 'Solaris swap', uuid.UUID(hex = '6A87C46F-1DD2-11B2-99A6-080020736631')), + (50, 'Solaris backup', uuid.UUID(hex = '6A8B642B-1DD2-11B2-99A6-080020736631')), + (51, 'Solaris /var', uuid.UUID(hex = '6A8EF2E9-1DD2-11B2-99A6-080020736631')), + (52, 'Solaris /home', uuid.UUID(hex = '6A90BA39-1DD2-11B2-99A6-080020736631')), + (53, 'Solaris alternate sector', uuid.UUID(hex = '6A9283A5-1DD2-11B2-99A6-080020736631')), + (54, 'Solaris reserved 1', uuid.UUID(hex = '6A945A3B-1DD2-11B2-99A6-080020736631')), + (55, 'Solaris reserved 2', uuid.UUID(hex = '6A9630D1-1DD2-11B2-99A6-080020736631')), + (56, 'Solaris reserved 3', uuid.UUID(hex = '6A980767-1DD2-11B2-99A6-080020736631')), + (57, 'Solaris reserved 4', uuid.UUID(hex = '6A96237F-1DD2-11B2-99A6-080020736631')), + (58, 'Solaris reserved 5', uuid.UUID(hex = '6A8D2AC7-1DD2-11B2-99A6-080020736631')), + (59, 'NetBSD swap', uuid.UUID(hex = '49F48D32-B10E-11DC-B99B-0019D1879648')), + (60, 'NetBSD FFS', uuid.UUID(hex = '49F48D5A-B10E-11DC-B99B-0019D1879648')), + (61, 'NetBSD LFS', uuid.UUID(hex = '49F48D82-B10E-11DC-B99B-0019D1879648')), + (62, 'NetBSD concatenated', uuid.UUID(hex = '2DB519C4-B10E-11DC-B99B-0019D1879648')), + (63, 'NetBSD encrypted', uuid.UUID(hex = '2DB519EC-B10E-11DC-B99B-0019D1879648')), + (64, 'NetBSD RAID', uuid.UUID(hex = '49F48DAA-B10E-11DC-B99B-0019D1879648')), + (65, 'ChromeOS kernel', uuid.UUID(hex = 'FE3A2A5D-4F32-41A7-B725-ACCC3285A309')), + (66, 'ChromeOS root fs', uuid.UUID(hex = '3CB8E202-3B7E-47DD-8A3C-7FF2A13CFCEC')), + (67, 'ChromeOS reserved', uuid.UUID(hex = '2E0A753D-9E48-43B0-8337-B15192CB1B5E')), + (68, 'MidnightBSD data', uuid.UUID(hex = '85D5E45A-237C-11E1-B4B3-E89A8F7FC3A7')), + (69, 'MidnightBSD boot', uuid.UUID(hex = '85D5E45E-237C-11E1-B4B3-E89A8F7FC3A7')), + (70, 'MidnightBSD swap', uuid.UUID(hex = '85D5E45B-237C-11E1-B4B3-E89A8F7FC3A7')), + (71, 'MidnightBSD UFS', uuid.UUID(hex = '0394EF8B-237E-11E1-B4B3-E89A8F7FC3A7')), + (72, 'MidnightBSD ZFS', uuid.UUID(hex = '85D5E45D-237C-11E1-B4B3-E89A8F7FC3A7')), + (73, 'MidnightBSD Vinum', uuid.UUID(hex = '85D5E45C-237C-11E1-B4B3-E89A8F7FC3A7')), + (74, 'Ceph Journal', uuid.UUID(hex = '45B0969E-9B03-4F30-B4C6-B4B80CEFF106')), + (75, 'Ceph Encrypted Journal', uuid.UUID(hex = '45B0969E-9B03-4F30-B4C6-5EC00CEFF106')), + (76, 'Ceph OSD', uuid.UUID(hex = '4FBD7E29-9D25-41B8-AFD0-062C0CEFF05D')), + (77, 'Ceph crypt OSD', uuid.UUID(hex = '4FBD7E29-9D25-41B8-AFD0-5EC00CEFF05D')), + (78, 'Ceph disk in creation', uuid.UUID(hex = '89C57F98-2FE5-4DC0-89C1-F3AD0CEFF2BE')), + (79, 'Ceph crypt disk in creation', uuid.UUID(hex = '89C57F98-2FE5-4DC0-89C1-5EC00CEFF2BE')), + (80, 'VMware VMFS', uuid.UUID(hex = 'AA31E02A-400F-11DB-9590-000C2911D1B8')), + (81, 'VMware Diagnostic', uuid.UUID(hex = '9D275380-40AD-11DB-BF97-000C2911D1B8')), + (82, 'VMware Virtual SAN', uuid.UUID(hex = '381CFCCC-7288-11E0-92EE-000C2911D0B2')), + (83, 'VMware Virsto', uuid.UUID(hex = '77719A0C-A4A0-11E3-A47E-000C29745A24')), + (84, 'VMware Reserved', uuid.UUID(hex = '9198EFFC-31C0-11DB-8F78-000C2911D1B8')), + (85, 'OpenBSD data', uuid.UUID(hex = '824CC7A0-36A8-11E3-890A-952519AD3F61')), + (86, 'QNX6 file system', uuid.UUID(hex = 'CEF5A9AD-73BC-4601-89F3-CDEEEEE321A1')), + (87, 'Plan 9 partition', uuid.UUID(hex = 'C91818F9-8025-47AF-89D2-F030D7000C2C')), + (88, 'HiFive Unleashed FSBL', uuid.UUID(hex = '5B193300-FC78-40CD-8002-E86C45580B47')), + (89, 'HiFive Unleashed BBL', uuid.UUID(hex = '2E54B353-1271-4842-806F-E436D6AF6985'))) +# MSDOS FSTYPES IDENTIFIERS +# Second verse, same as the first - kind of. The msdos type identifers just use a byte identifier rather than UUID. +# https://git.kernel.org/pub/scm/utils/util-linux/util-linux.git/plain/include/pt-mbr-partnames.h +MSDOS_FSTYPE_IDS = ((1, 'Empty', b'\x00'), + (2, 'FAT12', b'\x01'), + (3, 'XENIX root', b'\x02'), + (4, 'XENIX usr', b'\x03'), + (5, 'FAT16 <32M', b'\x04'), + (6, 'Extended', b'\x05'), + (7, 'FAT16', b'\x06'), + (8, 'HPFS/NTFS/exFAT', b'\x07'), + (9, 'AIX', b'\x08'), + (10, 'AIX bootable', b'\t'), + (11, 'OS/2 Boot Manager', b'\n'), + (12, 'W95 FAT32', b'\x0b'), + (13, 'W95 FAT32 (LBA)', b'\x0c'), + (14, 'W95 FAT16 (LBA)', b'\x0e'), + (15, "W95 Ext'd (LBA)", b'\x0f'), + (16, 'OPUS', b'\x10'), + (17, 'Hidden FAT12', b'\x11'), + (18, 'Compaq diagnostics', b'\x12'), + (19, 'Hidden FAT16 <32M', b'\x14'), + (20, 'Hidden FAT16', b'\x16'), + (21, 'Hidden HPFS/NTFS', b'\x17'), + (22, 'AST SmartSleep', b'\x18'), + (23, 'Hidden W95 FAT32', b'\x1b'), + (24, 'Hidden W95 FAT32 (LBA)', b'\x1c'), + (25, 'Hidden W95 FAT16 (LBA)', b'\x1e'), + (26, 'NEC DOS', b'$'), + (27, 'Hidden NTFS WinRE', b"'"), + (28, 'Plan 9', b'9'), + (29, 'PartitionMagic recovery', b'<'), + (30, 'Venix 80286', b'@'), + (31, 'PPC PReP Boot', b'A'), + (32, 'SFS', b'B'), + (33, 'QNX4.x', b'M'), + (34, 'QNX4.x 2nd part', b'N'), + (35, 'QNX4.x 3rd part', b'O'), + (36, 'OnTrack DM', b'P'), + (37, 'OnTrack DM6 Aux1', b'Q'), + (38, 'CP/M', b'R'), + (39, 'OnTrack DM6 Aux3', b'S'), + (40, 'OnTrackDM6', b'T'), + (41, 'EZ-Drive', b'U'), + (42, 'Golden Bow', b'V'), + (43, 'Priam Edisk', b'\\'), + (44, 'SpeedStor', b'a'), + (45, 'GNU HURD or SysV', b'c'), + (46, 'Novell Netware 286', b'd'), + (47, 'Novell Netware 386', b'e'), + (48, 'DiskSecure Multi-Boot', b'p'), + (49, 'PC/IX', b'u'), + (50, 'Old Minix', b'\x80'), + (51, 'Minix / old Linux', b'\x81'), + (52, 'Linux swap / Solaris', b'\x82'), + (53, 'Linux', b'\x83'), + (54, 'OS/2 hidden or Intel hibernation', b'\x84'), + (55, 'Linux extended', b'\x85'), + (56, 'NTFS volume set', b'\x86'), + (57, 'NTFS volume set', b'\x87'), + (58, 'Linux plaintext', b'\x88'), + (59, 'Linux LVM', b'\x8e'), + (60, 'Amoeba', b'\x93'), + (61, 'Amoeba BBT', b'\x94'), + (62, 'BSD/OS', b'\x9f'), + (63, 'IBM Thinkpad hibernation', b'\xa0'), + (64, 'FreeBSD', b'\xa5'), + (65, 'OpenBSD', b'\xa6'), + (66, 'NeXTSTEP', b'\xa7'), + (67, 'Darwin UFS', b'\xa8'), + (68, 'NetBSD', b'\xa9'), + (69, 'Darwin boot', b'\xab'), + (70, 'HFS / HFS+', b'\xaf'), + (71, 'BSDI fs', b'\xb7'), + (72, 'BSDI swap', b'\xb8'), + (73, 'Boot Wizard hidden', b'\xbb'), + (74, 'Acronis FAT32 LBA', b'\xbc'), + (75, 'Solaris boot', b'\xbe'), + (76, 'Solaris', b'\xbf'), + (77, 'DRDOS/sec (FAT-12)', b'\xc1'), + (78, 'DRDOS/sec (FAT-16 < 32M)', b'\xc4'), + (79, 'DRDOS/sec (FAT-16)', b'\xc6'), + (80, 'Syrinx', b'\xc7'), + (81, 'Non-FS data', b'\xda'), + (82, 'CP/M / CTOS / ...', b'\xdb'), + (83, 'Dell Utility', b'\xde'), + (84, 'BootIt', b'\xdf'), + (85, 'DOS access', b'\xe1'), + (86, 'DOS R/O', b'\xe3'), + (87, 'SpeedStor', b'\xe4'), + (88, 'Rufus alignment', b'\xea'), + (89, 'BeOS fs', b'\xeb'), + (90, 'GPT', b'\xee'), + (91, 'EFI (FAT-12/16/32)', b'\xef'), + (92, 'Linux/PA-RISC boot', b'\xf0'), + (93, 'SpeedStor', b'\xf1'), + (94, 'SpeedStor', b'\xf4'), + (95, 'DOS secondary', b'\xf2'), + (96, 'VMware VMFS', b'\xfb'), + (97, 'VMware VMKCORE', b'\xfc'), + (98, 'Linux raid autodetect', b'\xfd'), + (99, 'LANstep', b'\xfe'), + (100, 'BBT', b'\xff')) diff --git a/aif/disk/block.py b/aif/disk/block.py index 362945d..74335be 100644 --- a/aif/disk/block.py +++ b/aif/disk/block.py @@ -1,7 +1,7 @@ import re ## -import parted # Do I need this if I can have libblockdev's mounts API? Is there a way to get current mounts? -import psutil +import parted +import psutil # Do I need this if I can have libblockdev's mounts API? Is there a way to get current mounts? ## import aif.constants import aif.utils @@ -24,8 +24,8 @@ class Partition(object): self.id = part_xml.attrib['id'] self.table_type = getattr(_BlockDev.PartTableType, tbltype.upper()) if tbltype == 'msdos': - # Could technically be _BlockDev.PartTypeReq.NEXT buuuut that doesn't *quite* work - # with our project's structure. + # Could technically be _BlockDev.PartTypeReq.NEXT BUT that doesn't *quite* work + # with this project's structure. if part_type == 'primary': self.part_type = _BlockDev.PartTypeReq.NORMAL elif part_type == 'extended': @@ -50,7 +50,7 @@ class Partition(object): 'must be one of: {1}').format(self.xml.attrib['fsType'], ', '.join(sorted(aif.constants.PARTED_FSTYPES)))) self.disk = diskobj - self.device = self.disk.device # TODO: how to get this in libblockdev? + self.device = self.disk.path self.devpath = '{0}{1}'.format(self.device.path, partnum) self.is_hiformatted = False sizes = {} diff --git a/docs/reference/fstypes b/docs/reference/fstypes deleted file mode 100644 index 6c75e49..0000000 --- a/docs/reference/fstypes +++ /dev/null @@ -1,118 +0,0 @@ -msdos: - 0 Empty 24 NEC DOS 81 Minix / old Lin bf Solaris - 1 FAT12 27 Hidden NTFS Win 82 Linux swap / So c1 DRDOS/sec (FAT- - 2 XENIX root 39 Plan 9 83 Linux c4 DRDOS/sec (FAT- - 3 XENIX usr 3c PartitionMagic 84 OS/2 hidden or c6 DRDOS/sec (FAT- - 4 FAT16 <32M 40 Venix 80286 85 Linux extended c7 Syrinx - 5 Extended 41 PPC PReP Boot 86 NTFS volume set da Non-FS data - 6 FAT16 42 SFS 87 NTFS volume set db CP/M / CTOS / . - 7 HPFS/NTFS/exFAT 4d QNX4.x 88 Linux plaintext de Dell Utility - 8 AIX 4e QNX4.x 2nd part 8e Linux LVM df BootIt - 9 AIX bootable 4f QNX4.x 3rd part 93 Amoeba e1 DOS access - a OS/2 Boot Manag 50 OnTrack DM 94 Amoeba BBT e3 DOS R/O - b W95 FAT32 51 OnTrack DM6 Aux 9f BSD/OS e4 SpeedStor - c W95 FAT32 (LBA) 52 CP/M a0 IBM Thinkpad hi ea Rufus alignment - e W95 FAT16 (LBA) 53 OnTrack DM6 Aux a5 FreeBSD eb BeOS fs - f W95 Ext'd (LBA) 54 OnTrackDM6 a6 OpenBSD ee GPT -10 OPUS 55 EZ-Drive a7 NeXTSTEP ef EFI (FAT-12/16/ -11 Hidden FAT12 56 Golden Bow a8 Darwin UFS f0 Linux/PA-RISC b -12 Compaq diagnost 5c Priam Edisk a9 NetBSD f1 SpeedStor -14 Hidden FAT16 <3 61 SpeedStor ab Darwin boot f4 SpeedStor -16 Hidden FAT16 63 GNU HURD or Sys af HFS / HFS+ f2 DOS secondary -17 Hidden HPFS/NTF 64 Novell Netware b7 BSDI fs fb VMware VMFS -18 AST SmartSleep 65 Novell Netware b8 BSDI swap fc VMware VMKCORE -1b Hidden W95 FAT3 70 DiskSecure Mult bb Boot Wizard hid fd Linux raid auto -1c Hidden W95 FAT3 75 PC/IX bc Acronis FAT32 L fe LANstep -1e Hidden W95 FAT1 80 Old Minix be Solaris boot ff BBT - -gpt: - 1 EFI System C12A7328-F81F-11D2-BA4B-00A0C93EC93B - 2 MBR partition scheme 024DEE41-33E7-11D3-9D69-0008C781F39F - 3 Intel Fast Flash D3BFE2DE-3DAF-11DF-BA40-E3A556D89593 - 4 BIOS boot 21686148-6449-6E6F-744E-656564454649 - 5 Sony boot partition F4019732-066E-4E12-8273-346C5641494F - 6 Lenovo boot partition BFBFAFE7-A34F-448A-9A5B-6213EB736C22 - 7 PowerPC PReP boot 9E1A2D38-C612-4316-AA26-8B49521E5A8B - 8 ONIE boot 7412F7D5-A156-4B13-81DC-867174929325 - 9 ONIE config D4E6E2CD-4469-46F3-B5CB-1BFF57AFC149 - 10 Microsoft reserved E3C9E316-0B5C-4DB8-817D-F92DF00215AE - 11 Microsoft basic data EBD0A0A2-B9E5-4433-87C0-68B6B72699C7 - 12 Microsoft LDM metadata 5808C8AA-7E8F-42E0-85D2-E1E90434CFB3 - 13 Microsoft LDM data AF9B60A0-1431-4F62-BC68-3311714A69AD - 14 Windows recovery environment DE94BBA4-06D1-4D40-A16A-BFD50179D6AC - 15 IBM General Parallel Fs 37AFFC90-EF7D-4E96-91C3-2D7AE055B174 - 16 Microsoft Storage Spaces E75CAF8F-F680-4CEE-AFA3-B001E56EFC2D - 17 HP-UX data 75894C1E-3AEB-11D3-B7C1-7B03A0000000 - 18 HP-UX service E2A1E728-32E3-11D6-A682-7B03A0000000 - 19 Linux swap 0657FD6D-A4AB-43C4-84E5-0933C84B4F4F - 20 Linux filesystem 0FC63DAF-8483-4772-8E79-3D69D8477DE4 - 21 Linux server data 3B8F8425-20E0-4F3B-907F-1A25A76F98E8 - 22 Linux root (x86) 44479540-F297-41B2-9AF7-D131D5F0458A - 23 Linux root (ARM) 69DAD710-2CE4-4E3C-B16C-21A1D49ABED3 - 24 Linux root (x86-64) 4F68BCE3-E8CD-4DB1-96E7-FBCAF984B709 - 25 Linux root (ARM-64) B921B045-1DF0-41C3-AF44-4C6F280D3FAE - 26 Linux root (IA-64) 993D8D3D-F80E-4225-855A-9DAF8ED7EA97 - 27 Linux reserved 8DA63339-0007-60C0-C436-083AC8230908 - 28 Linux home 933AC7E1-2EB4-4F13-B844-0E14E2AEF915 - 29 Linux RAID A19D880F-05FC-4D3B-A006-743F0F84911E - 30 Linux extended boot BC13C2FF-59E6-4262-A352-B275FD6F7172 - 31 Linux LVM E6D6D379-F507-44C2-A23C-238F2A3DF928 - 32 FreeBSD data 516E7CB4-6ECF-11D6-8FF8-00022D09712B - 33 FreeBSD boot 83BD6B9D-7F41-11DC-BE0B-001560B84F0F - 34 FreeBSD swap 516E7CB5-6ECF-11D6-8FF8-00022D09712B - 35 FreeBSD UFS 516E7CB6-6ECF-11D6-8FF8-00022D09712B - 36 FreeBSD ZFS 516E7CBA-6ECF-11D6-8FF8-00022D09712B - 37 FreeBSD Vinum 516E7CB8-6ECF-11D6-8FF8-00022D09712B - 38 Apple HFS/HFS+ 48465300-0000-11AA-AA11-00306543ECAC - 39 Apple UFS 55465300-0000-11AA-AA11-00306543ECAC - 40 Apple RAID 52414944-0000-11AA-AA11-00306543ECAC - 41 Apple RAID offline 52414944-5F4F-11AA-AA11-00306543ECAC - 42 Apple boot 426F6F74-0000-11AA-AA11-00306543ECAC - 43 Apple label 4C616265-6C00-11AA-AA11-00306543ECAC - 44 Apple TV recovery 5265636F-7665-11AA-AA11-00306543ECAC - 45 Apple Core storage 53746F72-6167-11AA-AA11-00306543ECAC - 46 Solaris boot 6A82CB45-1DD2-11B2-99A6-080020736631 - 47 Solaris root 6A85CF4D-1DD2-11B2-99A6-080020736631 - 48 Solaris /usr & Apple ZFS 6A898CC3-1DD2-11B2-99A6-080020736631 - 49 Solaris swap 6A87C46F-1DD2-11B2-99A6-080020736631 - 50 Solaris backup 6A8B642B-1DD2-11B2-99A6-080020736631 - 51 Solaris /var 6A8EF2E9-1DD2-11B2-99A6-080020736631 - 52 Solaris /home 6A90BA39-1DD2-11B2-99A6-080020736631 - 53 Solaris alternate sector 6A9283A5-1DD2-11B2-99A6-080020736631 - 54 Solaris reserved 1 6A945A3B-1DD2-11B2-99A6-080020736631 - 55 Solaris reserved 2 6A9630D1-1DD2-11B2-99A6-080020736631 - 56 Solaris reserved 3 6A980767-1DD2-11B2-99A6-080020736631 - 57 Solaris reserved 4 6A96237F-1DD2-11B2-99A6-080020736631 - 58 Solaris reserved 5 6A8D2AC7-1DD2-11B2-99A6-080020736631 - 59 NetBSD swap 49F48D32-B10E-11DC-B99B-0019D1879648 - 60 NetBSD FFS 49F48D5A-B10E-11DC-B99B-0019D1879648 - 61 NetBSD LFS 49F48D82-B10E-11DC-B99B-0019D1879648 - 62 NetBSD concatenated 2DB519C4-B10E-11DC-B99B-0019D1879648 - 63 NetBSD encrypted 2DB519EC-B10E-11DC-B99B-0019D1879648 - 64 NetBSD RAID 49F48DAA-B10E-11DC-B99B-0019D1879648 - 65 ChromeOS kernel FE3A2A5D-4F32-41A7-B725-ACCC3285A309 - 66 ChromeOS root fs 3CB8E202-3B7E-47DD-8A3C-7FF2A13CFCEC - 67 ChromeOS reserved 2E0A753D-9E48-43B0-8337-B15192CB1B5E - 68 MidnightBSD data 85D5E45A-237C-11E1-B4B3-E89A8F7FC3A7 - 69 MidnightBSD boot 85D5E45E-237C-11E1-B4B3-E89A8F7FC3A7 - 70 MidnightBSD swap 85D5E45B-237C-11E1-B4B3-E89A8F7FC3A7 - 71 MidnightBSD UFS 0394EF8B-237E-11E1-B4B3-E89A8F7FC3A7 - 72 MidnightBSD ZFS 85D5E45D-237C-11E1-B4B3-E89A8F7FC3A7 - 73 MidnightBSD Vinum 85D5E45C-237C-11E1-B4B3-E89A8F7FC3A7 - 74 Ceph Journal 45B0969E-9B03-4F30-B4C6-B4B80CEFF106 - 75 Ceph Encrypted Journal 45B0969E-9B03-4F30-B4C6-5EC00CEFF106 - 76 Ceph OSD 4FBD7E29-9D25-41B8-AFD0-062C0CEFF05D - 77 Ceph crypt OSD 4FBD7E29-9D25-41B8-AFD0-5EC00CEFF05D - 78 Ceph disk in creation 89C57F98-2FE5-4DC0-89C1-F3AD0CEFF2BE - 79 Ceph crypt disk in creation 89C57F98-2FE5-4DC0-89C1-5EC00CEFF2BE - 80 VMware VMFS AA31E02A-400F-11DB-9590-000C2911D1B8 - 81 VMware Diagnostic 9D275380-40AD-11DB-BF97-000C2911D1B8 - 82 VMware Virtual SAN 381CFCCC-7288-11E0-92EE-000C2911D0B2 - 83 VMware Virsto 77719A0C-A4A0-11E3-A47E-000C29745A24 - 84 VMware Reserved 9198EFFC-31C0-11DB-8F78-000C2911D1B8 - 85 OpenBSD data 824CC7A0-36A8-11E3-890A-952519AD3F61 - 86 QNX6 file system CEF5A9AD-73BC-4601-89F3-CDEEEEE321A1 - 87 Plan 9 partition C91818F9-8025-47AF-89D2-F030D7000C2C - 88 HiFive Unleashed FSBL 5B193300-FC78-40CD-8002-E86C45580B47 - 89 HiFive Unleashed BBL 2E54B353-1271-4842-806F-E436D6AF6985 - diff --git a/docs/reference/generate_gpt_guid.py b/docs/reference/generate_gpt_guid.py new file mode 100755 index 0000000..042c754 --- /dev/null +++ b/docs/reference/generate_gpt_guid.py @@ -0,0 +1,93 @@ +#!/usr/bin/env python3 + +import os +import re +import subprocess +import uuid +## +import requests +from bs4 import BeautifulSoup + +# You, the average user, will probably have absolutely no use for this. + +types = {'gpt': {'local': [], + 'wiki': {}}, + 'msdos': {'local': [], + 'src': []}} + +# GPT +cmd = ['/usr/bin/sfdisk', '--list-types', '--label=gpt'] +url = 'https://en.wikipedia.org/wiki/GUID_Partition_Table' +# First get the local list. +with open(os.devnull, 'wb') as devnull: + cmd_out = subprocess.run(cmd, stdout = subprocess.PIPE, stderr = devnull) +stdout = [i for i in cmd_out.stdout.decode('utf-8').splitlines() if i not in ('Id Name', '')] +for idx, line in enumerate(stdout): + i = idx + 1 + l = line.split() + u = l.pop(0) + desc = ' '.join(l) + types['gpt']['local'].append((i, desc, uuid.UUID(hex = u))) +# Then wikipedia. +req = requests.get(url) +if not req.ok: + raise RuntimeError('Could not access {0}'.format(url)) +soup = BeautifulSoup(req.content, 'lxml') +tbl = soup.find('span', attrs = {'id': 'Partition_type_GUIDs', 'class': 'mw-headline'}).findNext('table').find('tbody') +c = None +t = None +idx = 1 +strip_ref = re.compile(r'(?P[A-Za-z\s()/0-9,.+-]+)\[?.*') +for row in tbl.find_all('tr'): + cols = [e.text.strip() for e in row.find_all('td')] + if not cols: + continue + if len(cols) == 3: + temp_c = strip_ref.search(cols[0].strip()) + if not temp_c: + raise RuntimeError('Error when parsing/regexing: {0}'.format(cols[0].strip())) + c = temp_c.group('name') + cols.pop(0).strip() + if c not in types['gpt']['wiki']: + types['gpt']['wiki'][c] = [] + if len(cols) == 2: + temp_t = strip_ref.search(cols[0].strip()) + if not temp_t: + raise RuntimeError('Error when parsing/regexing: {0}'.format(cols[0].strip())) + t = temp_t.group('name') + cols.pop(0) + u = cols[0] + types['gpt']['wiki'][c].append((idx, t, uuid.UUID(hex = u))) + idx += 1 + +# MSDOS +cmd = ['/usr/bin/sfdisk', '--list-types', '--label=dos'] +url = 'https://git.kernel.org/pub/scm/utils/util-linux/util-linux.git/plain/include/pt-mbr-partnames.h' +with open(os.devnull, 'wb') as devnull: + cmd_out = subprocess.run(cmd, stdout = subprocess.PIPE, stderr = devnull) +stdout = [i for i in cmd_out.stdout.decode('utf-8').splitlines() if i not in ('Id Name', '')] +for idx, line in enumerate(stdout): + i = idx + 1 + l = line.split() + b = '{0:0>2}'.format(l.pop(0).upper()) + desc = ' '.join(l) + types['msdos']['local'].append((i, desc, bytes.fromhex(b))) +# Then the source (master branch's HEAD). It gets messy but whatever. This is actually something unique to fdisk. +req = requests.get(url) +if not req.ok: + raise RuntimeError('Could not access {0}'.format(url)) +line_re = re.compile(r'^\s+{0x') +str_re = re.compile(r'^\s+{0x(?P[A-Fa-f0-9]+),\s*N_\("(?P[^"]+)"\).*') +idx = 1 +for line in req.content.decode('utf-8').splitlines(): + if not line_re.search(line): + continue + s = str_re.search(line) + if not s: + raise RuntimeError('Error when parsing/regexing: {0}'.format(line.strip())) + b = s.group('b').upper() + desc = s.group('desc') + types['msdos']['src'].append((idx, desc, bytes.fromhex(b))) + idx += 1 + +print(types)