Как я могу разделить объем в регулярном файле без цикла?

Если Ваш grep поддерживает -o можно сделать это как это:

grep -o '[^:]\+'

Или с awk, устанавливая разделитель записей на ::

awk -v RS=: 1

Или с GNU сократите:

cut -d: --output-delimiter=$'\n' -f1-

Править

Как отмечено Chris ниже, это оставит запаздывающую новую строку, этого можно избежать, если Ваш awk поддерживает определение RS как регулярное выражение (протестированный с GNU awk):

awk -v RS='[:\n]' 1
5
13.04.2017, 15:36
4 ответа

Длинный путь вокруг. Но ради удовольствия:

1. Создайте временное изображение:

    $ truncate -s64MiB tmp.img

2. Создайте два использования разделов fdisk:

Скорее подробный, но хорошо.

$ fdisk tmp.img

Первый раздел:

: n <Enter>
: <Enter> (p)
: <Enter> (1)
: <Enter> (2048)
: +40M <Enter>

Второй раздел:

: n <Enter>
: <Enter> (p)
: <Enter> (2)
: <Enter> (83968)
: <Enter> (131071)

Печать, что мы собираемся записать:

: x
: p
Nr AF  Hd Sec  Cyl  Hd Sec  Cyl     Start      Size ID
 1 00  32  33    0  57  52    5       2048      81920 83
 2 00  57  53    5  40  32    8      83968      47104 83

Запись и выход:

:w (Dont! forget ;-) )

У нас есть два раздела 40 и 23 мебибайт:

81920 * 512 / 1024 / 1024 = 40MiB
47104 * 512 / 1024 / 1024 = 23MiB

3. Создайте две файловых системы:

truncate -s40MiB ext4.img
truncate -s23MiB ext3.img
mke2fs -t ext4 -F -L part_ext4 ext4.img
mke2fs -t ext3 -F -L part_ext3 ext3.img

4. Сшейте все это вместе:

Извлечение сначала 2048*512 байты из временного изображения:

dd if=tmp.img of=disk.img bs=512 count=2048

Объедините их:

cat ext4.img ext3.img >> disk.img

Отлично.

3
27.01.2020, 20:38
  • 1
    я начинаю думать, нет никакого простого способа сделать это иначе. Спасибо за усилие :) –  Rhymoid 08.10.2013, 20:09
  • 2
    @Rhymoid это действительно кажется скорее сверхсложным и подверженным ошибкам. Прочитайте мой ответ и пойдите для опции 4 - наименее болезненное и самое "естественное". –  peterph 09.10.2013, 01:16

Я не действительно уверен я inderstand Ваш вопрос правильно. При попытке разделить образ виртуальной машины, у Вас есть несколько опций:

  1. используйте циклы или картопостроитель устройства в линейном режиме для каждого раздела. Вы не должны иметь, они устанавливают параллельно для форматирования;

  2. partx/kpartx для сообщения ядра, какие разделы это должно рассмотреть на картопостроителе цикла/устройства устройствами или даже регулярным файлом:

    kpartx -av /path/to/file
    

    или

    losetup /dev/loopX /path/to/file
    kpartx -av /dev/loopX
    

    Устройства являются устройствами картопостроителя устройства (т.е. связанный с от /dev/mapper по умолчанию).

  3. использование partprobe

    losetup /dev/loopX /path/to/file
    partprobe /dev/loopX
    

    который даст ядру команду проверять разделение, следовательно создание /dev/loopXpY.

  4. загрузитесь живой CD/образ USB (может быть установщик) в VM, и сделайте разделение из. Это имеет очевидное преимущество способности разделить виртуальный диск даже для образов виртуальной машины, сохраненных в специальных форматах (как qcow2 QEMU, например).

2
27.01.2020, 20:38
  • 1
    Проблема состоит в том, что мой образ диска является регулярным файлом, и не смонтированный как блочное устройство. partx не работает, вероятно, по этой причине (страница справочника говорит, что параметр должен быть блочным устройством, и partx умирает с "неудавшимся для чтения таблицы разделов";). По некоторым причинам я, может казаться, не настраиваю цикл для поддержки разделов, как объяснено. Я мог попробовать третью опцию, но она походит на окольный метод. Я просто хочу выставить промежуток в регулярном файле к mke2fs как будто это был раздел. –  Rhymoid 08.10.2013, 18:30
  • 2
    не поддерживают разделы. Вы должны или создать устройства раздела с (k) partx или вручную. Или загрузите VM и сделайте это с внутренней части. –  peterph 08.10.2013, 19:08
  • 3
    действительно поддерживают разделы, который является почему partx, parted, и partprobe может активировать их. kpartx для активации разделов на устройствах картопостроителя устройства (путем создания другого dm устройства), так как они исходно не поддерживают разделы. –  psusi 08.10.2013, 20:49
  • 4
    @psusi Действительно, Вы правы со способностью ядра обработать разделы на циклических устройствах самой (будучи сказанным partprobe сделать так). Однако kpartx на самом деле работы для циклических устройств также (и на самом деле для регулярных файлов также). –  peterph 09.10.2013, 01:12
  • 5
    @peterph, это работает, но это (немного) менее эффективно, так как это создает линейное устройство картопостроителя устройства, сложенное сверху циклического устройства. Лучше полагаться на собственный компонент ядра, делящий поддержку через partx, partprobe, или partedсобственная обработка. –  psusi 09.10.2013, 07:22

http://blog.lifebloodnetworks.com/?p=934

Кажется, имеет некоторую информацию об этом. Похоже, что можно смонтировать неструктурированный диск как устройство закольцовывания:

Смонтируйте свое изображение неструктурированного диска как устройство закольцовывания: losetup /dev/loop0 [path to image]

Выполненный kpartx и: kpartx -va /dev/loop0

Это добавит Ваши разделы к/dev/mapper/loop0pX, где каждый X является различным разделом

Можно теперь смонтировать каждый раздел: mount /dev/mapper/loop0pX /media/partition

Если Вы хотите удостовериться, что Вы не пишете, что что-либо к Вашему резервному копированию просто монтирует его как только для чтения: mount -o ro /dev/mapper/loop0pX /media/partition

После того как Вы закончены, необходимо будет сделать уборку.

Размонтирование: umount /media/partition Удалите устройства картопостроителя: kpartx -d /dev/loop0 Удалите устройство закольцовывания: losetup -d /dev/loop0

Эти команды, возможно, все должны быть выполнены как корень. Если loop0 сообщает, что это занято, просто выбирают другое циклическое устройство (/dev/loop1, ect).

править: Я вижу, что Вы хотите сделать это некорневое, таким образом, вышеупомянутое не может быть полезно для Вас.

1
27.01.2020, 20:38

Вы не должны смешивать с max_part. Использовать parted создать разделы на циклическом устройстве, или partprobe активировать их, если они уже существуют. Вы, возможно, должны обновить до версии разделенных в тестировании / нестабильный.

0
27.01.2020, 20:38

Теги

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