Редактирование GUID Partition Table
При установке нового SSD (HDD) взамен старого, возникла надобность редактировать GPT, так как в NVRAM в части efi-apple-recovery содержится UUID, не соответсвующий новому Unique partition GUID, а вносить изменения в NVRAM стрёмно.
Ниже набор комманд позволяющих это сделать:
[Spoiler (click to open)]
P.S.
см. https://en.wikipedia.org/wiki/GUID_Partition_Table
Ниже набор комманд позволяющих это сделать:
[Spoiler (click to open)]
#Запись в переменную sec_gpt_table значения начала Sec GPT table:
sec_gpt_table=$(sudo gpt show disk0 | grep "Sec GPT table" | awk '{print $1}')
#Запись в переменную sec_gpt_header значения начала Sec GPT header:
sec_gpt_header=$(sudo gpt show disk0 | grep "Sec GPT header" | awk '{print $1}')
#--------------------------------------- ----------------------------------------
#Сохранение LBA1:
sudo dd bs=1b if=/dev/disk0 of=/TMP/LBA1 skip=1 count=1
#Сохранение значимой для CRC части LBA1
dd bs=1 if=/TMP/LBA1 of=/TMP/LBA1-header count=$((0x5c))
#Сохранение LBA2:
sudo dd if=/dev/disk0 bs=1b skip=2 count=1 of=/TMP/LBA2
#Сохранение старого EFI UUID:
sudo dd if=/dev/disk1 bs=1 skip=$((512+512+16)) count=16 of=/TMP/EFI_UUID
#Запись 16 байт старого UUID по смещению 0x10 в файл LBA2:
dd if=/TMP/EFI_UUID bs=1 seek=16 count=16 conv=notrunc of=/TMP/LBA2
#Запись LBA2 — Pri GPT table:
sudo dd if=/TMP/LBA2 bs=1b seek=2 count=1 /dev/disk0
#Запись LBA2 в Sec GPT table:
sudo dd if=/TMP/LBA2 bs=1b seek=${sec_gpt_table} count=1 /dev/disk0
#Подсчет и запись котрольной суммы изменённого Partition Entry Array, а так же
#преобразование ASCII в binary little-endian
sudo dd if=/dev/disk0 bs=1b skip=2 count=32 of=/TMP/LBA2-32
crc32 /TMP/LBA2-32 | perl -e 'print pack "V", hex()' > /TMP/CRC_LBA2
#Изменение в файле LBA-header по смещению 0x58 (crc):
dd if=/TMP/CRC_LBA2 bs=1 seek=$((0x58)) count=4 conv=notrunc of=/TMP/LBA1-header
#Обнуление crc по смещению 0x10 4 байт в LBA1-header
dd if=/dev/zero of=/TMP/LBA1-header bs=1 count=4 seek=$((0x10)) conv=notrunc
#Подсчёт и запись контрольной суммы измененного Partition table header (LBA1)
#с изменённым CRC (с преобразованием ASCII в binary little-endian):
crc32 /TMP/LBA1-header | perl -e 'print pack "V", hex()' > /TMP/CRC_LBA1-header
dd if=/TMP/CRC_LBA1-header bs=1 seek=$((0x10)) count=4 conv=notrunc of=/TMP/LBA1-header
#Запись в /TMP/LBA1:
dd if=/TMP/LBA1-header conv=osync of=/TMP/LBA1
#Запись в Partition table header (LBA 1) — Pri GPT header
sudo dd if=/TMP/LBA1 bs=1b seek=1 count=1 of=/dev/disk0
#Запись в Sec GPT header
sudo dd if=/TMP/LBA1 bs=1b seek=${sec_gpt_header} count=1 of=/dev/disk0
#--------------------------------------- -------------------------------- P.S.
см. https://en.wikipedia.org/wiki/GUID_Partition_Table
