Распакуйте, измените и упакуйте initrd как пользователя

Проблема решена!

Включить собственную xterm прокрутку мыши в tmux, много Wiki, сайта Q & A, сообщение в блоге предлагает добавить строку как:

set -g terminal-overrides 'xterm*:smcup@:rmcup@'

кому: ~/.tmux.conf. И это - преступник.

Для разрешения xterm заголовков в окне терминала также необходимо добавить XT флаг, что-то вроде этого:

set -g terminal-overrides "xterm*:XT:smcup@:rmcup@"

Источник: http://opennomad.com/content/goodbye-screen-hello-tmux

5
11.07.2014, 14:15
4 ответа

Благодарю за ответы, они были полезны, но я нашел свое решение.

Воссоздание образа initrd можно выполнить с помощью fakeroot-ng (а также, вероятно, с помощью fakeroot).

Основная идея инструментов заключается в том, чтобы обернуть все системные вызовы, поэтому все программы, выполняемые в среде fakeroot, думают, что они запускаются root.

Я вызываю часть своего скрипта в среде fakeroot - распаковываю initramfs, выполняю все изменения и снова упаковываю.

Все привилегии установлены правильно, root является владельцем всех файлов.

Fakeroot-ng доступен по адресу: http://fakeroot-ng.lingnu.com/index.php/Home_Page

1
27.01.2020, 20:35

Эти ошибки возникают из-за того, что ваш пользователь не имеет права создавать узлы. Только root может создавать узлы, отличные от fifos и сокетов (см. документацию mknod в разделе EPERM)

При повторной упаковке initrd, этого специального файла там не будет. Для переупаковки initrd существует опция с именем --владелец, которая может быть использована для установки владельца для всех файлов. Но , только root может использовать эту опцию.

Единственный способ, который я вижу, это копирование initrd на другую систему, где у вас есть root доступ и выполнение операций там. После этого скопируйте его обратно.

2
27.01.2020, 20:35

Поскольку вы используете cpio, вы фактически создаете initramfs , а не initrd . Initrd будет храниться как образ файловой системы, а не как архив cpio. Initrd и initramfs имеют схожие роли в процессе загрузки Linux, чтобы предоставить некоторые файлы, которые доступны до истинной корневой файловой системы (и которые используются для монтирования настоящей корневой файловой системы); они обрабатываются по-разному под капотом, но здесь это не имеет значения. Initrd старше и несколько устарел в пользу initramfs. Многие системы сборки по-прежнему используют имя файла initrd , даже несмотря на то, что они переключили содержимое на initramfs.

Корневые образы обычно содержат узлы устройств и файлы, которым требуются определенные разрешения. Команда cpio может только сгенерировать архив на основе файлов, которые существуют в вашей файловой системе, и вам нужны права root для создания узлов устройств или файлов, принадлежащих root. Исходный код ядра содержит инструмент usr / gen_init_cpio и сценарий оболочки scripts / gen_initramfs_list.sh , которые предназначены именно для генерации initramfs без необходимости создания всех файлов в файловой системе, и таким образом, чтобы сгенерировать initramfs без каких-либо привилегий. Эти программы задокументированы в дереве исходных текстов ядра в Documentation / filesystems / ramfs-rootfs-initramfs.txt и Documentation / early-userspace / README .

Обычный способ создания initramfs описан в ramfs-rootfs-initramfs.txt в разделе «Заполнение initramfs». Вы пишете текстовый файл, содержащий список путей для создания с их типом (каталог, обычный, узел устройства и т. Д.), Разрешениями и другими атрибутами. Для обычных файлов вы даете имя локальному файлу с содержимым. Затем запустите usr / gen_init_cpio для этого файла. Если при сборке ядра вы установите параметр CONFIG_INITRAMFS_SOURCE для имени файла, initramfs будет сгенерирован путем вызова usr / gen_init_cpio для этого файла.

Если у вас уже есть образ initramfs и вы хотите его изменить, используйте cpio -tv , чтобы перечислить его, и воссоздать файл описания ramfs на его основе. Если возможно, получите файл описания initramfs из исходного кода ядра, чтобы сэкономить время. Извлеките содержимое обычных файлов только в какой-то каталог. Затем измените обычные файлы и файл описания ramfs и, наконец, запустите usr / gen_init_cpio , чтобы сгенерировать новый initramfs.

5
27.01.2020, 20:35

Если вам нужно распаковать initramfs и перепаковать его позже, вы можете использовать параметры -s / -i для сохранения среды fakeroot в файле.

$ mkdir initrd
$ cd initrd
$ zcat ../initrd.gz | fakeroot -s ../initrd.fakeroot cpio -i

Теперь у вас есть файл со средой fakeroot, содержащий что-то вроде этого:


dev = fe05, ino = 20326044, mode = 120777, uid = 0, gid = 0, nlink = 1 , rdev = 0 dev = fe05 , ino = 20326045 , mode = 20664, uid = 0, gid = 0, nlink = 1, rdev = 1281 {{ 1}} dev = fe05, ino = 20326046, mode = 20664, uid = 0, gid = 0, nlink = 1, rdev = 259 dev = fe05, ino = 20326047, mode = 100644, uid = 0 , gid = 0, nlink = 1, rdev = 0

Посмотрите на свои файлы:

$ stat dev/console
   File: 'dev/console'
   Size: 0               Blocks: 0          IO Block: 4096   regular empty file
 Device: fe05h/65029d    Inode: 20326045    Links: 1

Я не копал глубже, но кажется, что вы можете создать необходимые узлы только с помощью

$ touch <file>
$ stat <file>
$ # put info about file into your fakeroot environment with your own params

Для сборки initramfs вы просто запустите

$ find | fakeroot -i ../initrd.fakeroot cpio -o -H newc | gzip -c > ../initrd.gz
1
27.01.2020, 20:35

Теги

Похожие вопросы