cave_canem_lj (cave_canem0) wrote in ru_mac,
cave_canem_lj
cave_canem0
ru_mac

Редактирование GUID Partition Table

При установке нового SSD (HDD) взамен старого, возникла надобность редактировать GPT, так как в NVRAM в части efi-apple-recovery содержится UUID, не соответсвующий новому  Unique partition GUID, а вносить изменения в NVRAM стрёмно.
Ниже набор комманд позволяющих это сделать:

[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
Tags: *nix, os x (системные вопросы)
Subscribe
  • Post a new comment

    Error

    Comments allowed for members only

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 44 comments