Страницы

Поиск по вопросам

четверг, 29 ноября 2018 г.

BASH mkntfs со своим UUID

При форматировании раздела этой командой, UUID раздела сохраняется и /etc/fstab не приходится исправлять лишний раз.
sudo mkfs.ext4 -L "/label" -U "$(sudo blkid -o value -s UUID /dev/sda1)" /dev/sda1
Вопрос в том, есть ли что - то подобное для формата .ntfs ?
Пробовал mkntfs, mkfs.ntfs но они не понимают команду которую перечислил выше, вроде бы в мануале написано -U опция у mkntfs присутствует, но не разобрался полностью как реализовать, а просто для проверки неправильно форматировать раздел не хочется.


Ответ

«нативных» средств, увы, нет.
но uuid довольно несложно поменять и «руками».
согласно информации с сайта ntfs.com, uuid (aka volume serial number) записан в нулевом секторе раздела со смещением 0x48 от его начала, занимает восемь байт, и байты расположены в «обратном» порядке (сначала последний, потом предпоследний и т.д.).
проверим.
создадим пустой файл размером 100 мегабайт:
$ truncate -s 100M /tmp/img подключим его как loop-устройство (иначе mkntfs отказывается создавать в нём файловую систему). опция --show позволяет сразу увидеть, под каким именем файл подключился:
$ sudo losetup --show -f /tmp/img /dev/loop0
если опцию --show забыли, то можно посмотреть отдельно:
$ sudo losetup -l -a NAME SIZELIMIT OFFSET AUTOCLEAR RO BACK-FILE /dev/loop0 0 0 0 0 /tmp/img создадим теперь файловую систему:
$ sudo mkntfs /dev/loop0 ... и посмотрим, какой uuid у неё:
$ sudo blkid | grep loop /dev/loop0: UUID="6E596895539DB263" TYPE="ntfs"
весьма похоже на восемь байт. теперь сверим с содержимым файла с образом:
$ hd /tmp/img | head -n 5 | tail -n 1 00000040 f6 00 00 00 01 00 00 00 63 b2 9d 53 95 68 59 6e |........c..S.hYn|
так и есть! восемь байт в «обратной» последовательности, начиная со смещения 0x48 не забываем отключить loop-устройство:
$ sudo losetup -d /dev/loop0

осталось только переписать эти восемь байт своими данными (72 — это 0x48 в десятичной системе счисления):
$ echo -ne '\x00\x01\x02\x03\x04\x05\x06\x07' | dd of=/tmp/img seek=72 bs=1 conv=notrunc 8+0 records in 8+0 records out 8 bytes copied, 0.00015337 s, 52.2 kB/s
проверяем:
$ sudo losetup --show -f /tmp/img /dev/loop0 $ sudo blkid | grep loop /dev/loop0: UUID="0706050403020100" TYPE="ntfs"
всё верно!
не забываем отключить loop-устройство:
$ sudo losetup -d /dev/loop0

для изменения байтов в реальном разделе, естестенно, программу dd надо будет запускать с полномочиями супер-пользователя (например, с помощью sudo), и указать в параметре of= не файл /tmp/img, а нужный раздел, где у вас находится файловая система (что-то вроде /dev/sdb1 и т.п.).
возможно, чтобы новое значение отобразилось в выводе программы blkid, потребуется сообщить программе linux, чтобы она перечитала информацию о разделах устройства (что-то вроде sudo partx /dev/sdb).

да, чтобы вручную не переписывать байты в обратном порядке, дополняя их символами \x, можно воспользоваться такой примерно конструкцией:
$ echo 0001020304050607 | sed 's/../\\x&
/g' | tac | tr -d '
' \x07\x06\x05\x04\x03\x02\x01\x00
и подставить её сразу в вышеупомянутую команду:
$ echo -ne "$(echo 0001020304050607 | sed 's/../\\x&
/g' | tac | tr -d '
')" | dd ...

Комментариев нет:

Отправить комментарий