Я на своем ПК под управлением Linux создаю корневую файловую систему для встроенной системы под управлением Linux. Ее архитектура не 386. (Microbalze). Она должна быть в 2-х вариантах: как файл образа(rootfs.img) с файловой системой Ext4, этот файл будет затем записан во flash на целевой встроенной системе, и как каталог, доступный по сети через NFS. Вопрос: как назначить всем файлам этой корневой ФС владелцем root, не получая прав root на моем ПК, на котором я ее собираю? В книге "Linux from scratch" предлагается делать это с помощью chroot, т.е. создать в отдельной папке мини-rootfs со всеми нужными программами(bash, gcc итд), сделать в нее chroot и затем работать в ней с правами суперпользователя. Но у этого варианта очевидные недостатки: 1. У меня уже все программы установлены, зачем их устанавливать по второму разу? 2. Файл rootfs.img принадлежит мне, но для его редактирования я должен зачем-то получать права root. 3. В конце концов, возможна ситуация, когда пользователю не разрешено получение root прав на его ПК. Спасибо всем ответившим.
Ответ
Вопрос: как назначить всем файлам этой корневой ФС владелцем root, не получая прав root на моем ПК, на котором я ее собираю?
обновлённый вариант ответа
в уже собранном образе можно «похозяйничать» с помощью, например, программы guestfish из пакета libguestfs-tools. для ускорения работы требуется, чтобы пользователь входил в группу kvm (это в debian gnu/linux, в других дистрибутивах она, возможно, будет называться иначе).
пример с файлом, содержащим образ файловой системы (знаком > в начале строки отмечены команды, выполняемые «внутри» псевдо-оболочки, которая запускается программой guestfish):
$ guestfish -a образ
> run
смотрим список файловых систем — там присутствует только одна, та, что находится внутри файла с образом, который указан с помощью опции -a):
> list-filesystems
/dev/sda: ext2
монтируем эту файловую систему в качестве корня:
> mount /dev/sda /
можно посмотреть файлы (здесь, для примера, в файловой системе присутствует только один файл):
> ls /
lost+found
файл
изменить принадлежнось можно встроенной командой chown (и пользователя и группу надо указывать в цифровом виде):
> chown 0 0 /файл
как я понял, рекурсивно эта команда, увы, не работает. так что если надо поменять принадлежность большого количества файлов, то придётся автоматизировать процесс. в man guestfish есть примеры, которые помогут в такой автоматизации.
завершить сеанс псевдо-оболочки можно либо командой exit, либо нажатием ctrl+d
про создание образа с помощью virt-make-fs
кстати, в уже упомянутом пакете libguestfs-tools есть программа virt-make-fs, с помощью которой можно создать образ с файловой системой из архива:
$ virt-make-fs архив.tar образ
ну а поместить в архив файлы с нужной принадлежностью можно, как обычно, с помощью fakeroot. например, находясь в каталоге, являющимся «корнем» создаваемой файловой системы:
$ fakeroot bash
$ chown -R пользователь:группа *
$ tar -cf архив.tar *
$ exit
если пользователь и группа — это root, то вызов chown может и не потребоваться, ведь «внутри» окружения, созданного программой fakeroot текущий пользователь выглядит «как бы root-ом», и принадлежащие ему файлы/каталоги выглядят «как бы принадлежащими root-у». см. вывод $ ls -l
старый вариант ответа, про genext2fs
но можно для самой сборки образа воспользоваться, например, программой genext2fs (ext2 filesystem generator for embedded systems) из одноимённого пакета
пример (всё выполняется от имени рядового пользователя):
создаём «корневой» каталог для нашей файловой системы, а в нём файл:
$ mkdir корень; touch корень/файл
создаём образ с файловой системой ext2 размером в 1024 блока, с подменой пользователя (опция -U):
$ genext2fs -U -b 1024 -d корень образ
проверяем. тут уже (для монтирования) потребуются права суперпользователя:
$ mkdir точка.монтирования
$ sudo mount образ точка.монтирования
и видим, что созданный файл принадлежит пользователю root
$ ls -l точка.монтирования
total 52
drwx------ 2 root root 52224 Sep 28 18:26 lost+found
-rw-r--r-- 1 root root 0 Sep 28 18:11 файл
не забываем отмонтировать:
$ sudo umount точка.монтирования
p.s. в принципе, и для монтирования можно, в крайнем случае, обходиться без дополнительных прав, воспользовавшись программой fuse-ext2 из пакета fuseext2
$ fuse-ext2 образ точка.монтирования
программа выдаст много строчек с информацией, из которой в данном случае полезной является только уведомление о том, что файловая система смонтирована в режиме «только для чтения».
не забываем отмонтировать:
$ fusermount -u точка.монтирования
полезная информация:
Creating SD image without root privileges
Mount an image file without root permission?
Комментариев нет:
Отправить комментарий