Генерация .img от tarball:/dev/loop устройства

Проблемой здесь не является проблема с перенаправлением Linux; скорее это - фундаментальное неверное толкование того, как конвейер работает. Перенаправление здесь не работает, потому что только сокращенный на самом деле печатает к stdout. stdout для команды эха, был передан по каналу к stdin сокращения (который не используется в этом случае, так как файл указан).

echo "header line" > output_file && cut -c 1-5 input_file >> output_file

то, что Вы хотите, и весьма изящный вообще (я заменил Ваш ; с && так, чтобы команда сокращения только выполнилась, если заголовок будет успешно записан; этим путем это не выполнится, если у Вас не будет полномочий создать или записать в output_file).

Вы могли также сделать все это в подоболочке, например.

(echo "header line"; cut -c 1-5 input_file) > output_file

но нет никакой реальной выгоды для выполнения этого, и с более сложными примерами оно может вызвать проблемы, если Вы не знакомы с тем, как подоболочка ограничена по объему.

Если Вы хотите, чтобы сокращение передало stdin до stdout, Вы могли бы попробовать:

echo "header line" | cut -c 1-5 - input_file

(Тире является общим ярлыком для stdin),

Однако это также выполнит операцию сокращения на stdin (приводящий к строке заголовка "заголовка"). Трудно сказать, является ли это тем, что Вы хотите или не от вопроса.

3
28.02.2015, 06:07
2 ответа

В драйвере цикла loop поддержка разделов является необязательной, что определяется аргументом max_part , когда драйвер загружен. Значение по умолчанию - 0, поэтому драйвер цикла даже не будет искать разделы; с ненулевым значением драйвер поддерживает такое количество разделов. В зависимости от параметров сборки ядра драйвер может быть либо включен в ядро, и в этом случае вам нужно передать loop.max_part =… в командной строке ядра во время загрузки, либо он может быть загружен как модуль. , в этом случае вам нужно передать max_part =… , когда модуль загружен.

В Debian wheezy цикл является модулем, и аргумент max_part не передается.Чтобы получить поддержку разделов, выгрузите модуль и загрузите его обратно с аргументом max_part (вам нужно сначала деактивировать любое существующее устройство цикла с помощью losetup -d ):

if lsmod | grep -wq loop; then rmmod loop; fi
modprobe loop max_part=31

Вы это можно сделать по умолчанию, добавив options loop max_part = 31 в /etc/modprobe.conf .

Если вы не можете позволить себе выгрузку модуля (или перезагрузку в дистрибутиве, где цикл встроен в ядро), вы можете вместо этого вычислить смещение раздела вручную и использовать -o параметр для losetup . См. Чтение файловой системы из всего образа диска

В новых дистрибутивах, вы можете использовать losetup -P при настройке устройства петли :

…
losetup -P -f arch-rpi.img
…

, но пакет util-linux в Debian wheezy слишком стар, чтобы иметь эту опцию.

2
27.01.2020, 21:23

Вам нужно использовать losetup -P для создания -P созданное устройство цикла, иначе вам нужно разделить исходное устройство цикла, а затем partx -u pdate таблицу разделов ядра. Устройства / dev / loop0p появятся после того, как ядро ​​распознает, что раздел действительно был разбит на разделы. Вероятно, это отчасти то, что подразумевается за сном 5 - но это почти наверняка должна быть синхронизация - или и то, и другое - вместо этого.

В любом случае, чтобы продемонстрировать:

sudo sh -s <<\IN
    losetup -D                          
    fallocate "-l$((1024*1024*1024))" loop        
    printf %s\\n n '' '' '' ''  w y | gdisk loop
    sync; losetup -f loop
    lsblk /dev/loop*
IN

Таким образом, приведенная выше последовательность сначала -D очищает все текущие устройства контура (если есть) fallocate в tmp-файле размером 1 ГБ, записывает Таблица разделов GPT для него и делает на нем один раздел, затем синхронизирует файловую систему и назначает ее первому доступному устройству цикла -f , прежде чем пытаться внести в список с помощью lsblk все доступные устройства шлейфа. Он напечатает:

NAME  MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
loop0   7:0    0   1G  0 loop 

Но , если я изменю строку losetup на:

losetup -fP loop

... вместо этого он напечатает:

NAME      MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
loop0       7:0    0    1G  0 loop 
├─loop0p1 259:0    0 1023M  0 loop 
└─loop0p2 259:1    0 1007K  0 loop 

... потому что сначала losetup сканирует резервный файл в поисках таблицы разделов.Как видите, он не очень хорош в этом - вместо того, чтобы отмечать лишний 1M (который почти определенно является таблицей разделов последней итерации, на самом деле) как нераспределенное пространство, он интерпретирует его как отдельный раздел, но это вероятно, потому что я пишу в tmpfs (дважды подряд) в верхней части файловой дыры размером 1 ГБ - работа с фактическими данными будет намного точнее (и обнуление файла резервной копии как ваш сценарий делает w / dd все равно справится с этим) . В любом случае - я могу свободно mkfs.whatever на реальном разделе там, а потом смонтировать его. partx -u в / dev / loop0 даст те же результаты.

1
27.01.2020, 21:23

Теги

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