Монтирование Windows-реестра в Linux (http://www.opennet.ru/tips/2735_windows_registry_mount_fuse.shtml)
© Сергей Трубин (http://www.opennet.ru/~%F3%C5%D2%C7%C5%CA%20%F4%D2%D5%C2%C9%CE)
В рамках проекта HIVEXFS (https://github.com/strubin/hivexfs) подготовлен FUSE-модуль для монтирования реестра Windows к любому каталогу и дальнейшей работы с реестром как с древовидной ФС. На данный момент HIVEXFS уже используется в Dr.Web LiveCD (http://www.freedrweb.com/livecd), на котором найденные реестры монтируются посредством autofs в каталог /reg.
Каталоги соответствуют разделам реестра, файлы — параметрам, содержимое файла — значению соответствующего параметра. Параметр по умолчанию обозначается файлом "@", тип параметра определяется через расширенные атрибуты файла (http://linux.die.net/man/5/attr). Значения параметров, имеющие типы REG_SZ, REG_EXPAND_SZ, REG_LINK REG_DWORD или REG_QWORD, автоматически конвертируется в текст (UTF-8) и обратно.
Для монтирования реестра используется утилита hivexfs. В качестве первого аргумента указывается точка монтирования windows-диска, второй аргумент — пустой каталог:
sudo hivexfs /mnt/windows /mnt/registry
Создадим параметр NEW_VALUE типа REG_SZ:
echo qwerty > NEW_VALUE
Посмотрим реальное содержимое:
attr -qg value NEW_VALUE |hexdump -C
00000000 71 00 77 00 65 00 72 00 74 00 79 00 0a 00 00 00 |q.w.e.r.t.y.....|
Как видим это строка в кодировке UTF-16LE, в конце завершается двумя нулями.
Преобразуем в тип REG_DWORD:
attr -s type -V reg_dword NEW_VALUE
attr_set: Недопустимый аргумент
Could not set "type" for NEW_VALUE
Выдана ошибка, так как строка в число не переводится, попробуем снова:
echo 12345 > NEW_VALUE
Attribute "type" set to a 9 byte value for NEW_VALUE : reg_dword
attr -g type NEW_VALUE
Attribute "type" had a 9 byte value for NEW_VALUE : REG_DWORD
attr -g size NEW_VALUE
Attribute "size" had a 1 byte value for NEW_VALUE : 4
cat NEW_VALUE
12345
Посмотреть доступный список типов параметра:
attr -l [value]
Посмотреть тип параметра можно командой:
getfattr -n user.type [value]
или
attr -g type [value]
Реальный размер параметра:
getfattr -n user.size [value]
или
attr -g size [value]
Реальное побайтное содержимое параметра:
getfattr --only-values -n user.value [value]
или
attr -qg value [value]
Копировать лучше командой ln (link), тогда копируются все атрибуты параметра.
Команда cp использует вызовы read и write, которые строковые и числовые ключи перекодируют на лету, в UTF-8 и обратно. Так что cp — это весьма накладно + он ничего не знает о типе параметра. Рекурсивно скопировать раздел можно командой
cp -Rl [path1] [path2]
По умолчанию создаётся тип REG_SZ, если параметр модифицируется, то его тип не меняется. Сменить тип параметра можно командой:
setfattr -n user.type -v [new_type] [value]
или
attr -s type -V [new_type] [value]
Модификация типа возможна для параметров: REG_SZ, REG_EXPAND_SZ, REG_LINK, REG_BINARY, REG_DWORD, REG_QWORD. В случае невозможности модификации типа — возвращается ошибка.
Если что-то сделали не так, то отменить изменения можно убив процесс hivexfs, тогда демонтирования не будет и изменения в силу не вступят.
Есть ограничение: невозможно создать раздел или параметр с именем, содержащим национальные символы.