Как создать отформатированный файл изображения раздела с нуля?

Можно использовать жемчуг Cygwin вместо этого. Типичные команды sed отображаются легко на Perl. Обратите внимание, что regex синтаксис отличается (расширенные регулярные выражения в Perl, основные регулярные выражения в sed).

perl -i -pe 's/AAA/BBB/g' $(grep -rl AAA /cygdrive/c/project_path)

Обратите внимание, что, анализируя результат замены команды, поскольку список файлов является хрупким. Это повредится, если будут пробелы или обратные косые черты в именах файлов; оба довольно распространены в соответствии с Windows (Вы получаете обратные косые черты, когда путь не был переведен от собственного компонента cygwin, например, когда он прибывает из переменной среды). Использовать xargs -d '\n' вместо этого (нет никаких новых строк в именах файлов Windows).

grep -rl AAA /cygdrive/c/project_path | xargs -d '\n' perl -i -pe 's/AAA/BBB/g'
16
22.11.2018, 00:06
3 ответа

Если на Linux, при загрузке loop модуль, удостоверьтесь, что Вы передаете a max_part опция к модулю так, чтобы циклические устройства были partitionable.

Проверьте текущее значение:

cat /sys/module/loop/parameters/max_part

Если это 0:

modprobe -r loop # unload the module
modprobe loop max_part=31

Для установки этой персистентной настройки добавьте следующую строку к /etc/modprobe.conf или в файл в /etc/modprobe.d если тот каталог существует в Вашей системе:

options loop max_part=31

Если modprobe -r loop сбои, потому что “Цикл модуля встроен”, необходимо будет добавить loop.max_part=31 к Вашей командной строке ядра и перезагрузке. Если Ваш загрузчик является Grub2, добавьте к нему к значению GRUB_CMDLINE_LINUX в etc/default/grub.

Теперь, можно создать partitionable циклическое устройство:

truncate -s64M file # no need to fill it with zeros, just make it sparse
fdisk file # create partitions
losetup /dev/loop0 file
mkfs.vfat /dev/loop0p1 # for the first partition.
mount /dev/loop0p1 /mnt/

(обратите внимание необходимость в относительно последней версии Linux).

20
27.01.2020, 19:48
  • 1
    ФАТАЛЬНЫЙ: цикл Модуля встроен, это может быть решено, установив lastest версию человечности (я имею 12.04)? –  user35443 18.08.2013, 12:17
  • 2
    Если встроено просто не необходимый к modprobe, передача loop.max_part=31 к командной строке ядра А-ч –  Alex 18.08.2013, 12:26
  • 3
    я вижу, если у Вас есть недавнее ядро, и Вы передаете max_part, смещение и sizelimit не необходимы вообще –  Alex 18.08.2013, 12:32
  • 4
    Хм, командная строка ядра, слишком трудная для меня. Все еще спасибо, принять. –  user35443 18.08.2013, 13:01
  • 5
    Это loop.maxpart=31 или loop.max_part=31 на командной строке ядра? –  Cristian Ciupitu 04.10.2014, 19:49

losetup /dev/loop0 file -o 1048576 --sizelimit limit

Указанное смещение должно быть в байтах (1048576 = 2 048 секторов * 512 байтов за сектор).

mount -o loop,offset=1048576,sizelimit=limit

Для получения дополнительной информации см. losetup и смонтироваться.

4
27.01.2020, 19:48
  • 1
    Хм, смещение, это должно работать. И что, если у меня было больше разделов на нем? –  user35443 18.08.2013, 11:58
  • 2
    я предполагаю один цикл = один раздел = одно смещение. –  Alex 18.08.2013, 12:02
  • 3
    uhm, и является там опцией указать также размер, таким образом, я мог ограничить его и поместить туда больше разделов? –  user35443 18.08.2013, 12:04
  • 4
    Извините мой отказ для создания нового ответа с частичным решением правильный ответ от "Stephane Chazelas", он может просто добавить смещение и sizelimit опции (затем, я удалю мой) –  Alex 18.08.2013, 12:20
  • 5
    Нет позвольте ему быть здесь, или мой +1 никуда не пойдет. –  user35443 18.08.2013, 12:23

Это можно сделать с помощью параметра bash:

## Make ** match all files and 0 or more dirs and subdirs
shopt globstar
## Iterate over all files and directories
for f in **; do 
    ## Get the name of the parent directory of the 
    ## current file/directory
    dir=$(dirname "$f"); 
    ## If this file/dir ends with 3 digits and is a file
    if [[ $f =~ [0-9]{3} ]] && [ -f "$f" ]; then 
        ## Create the target directory
        mkdir -p targetdir1/"$dir"
        ## Move the file
        mv "$f" targetdir1/"$f" 
    else 
        ## If this is a file but doesn't end with 3 digits
        [ -f "$f" ] && 
        ## Make the target dir
        mkdir -p targetdir2/"$dir" &&
        ## Move the file
        mv "$f" targetdir2/"$f" 
    fi 
done
-121--205218-

losetup 2,21 -P

losetup -P -f --show my.img

Создает один /dev/loopXpY на раздел.

Преимущество: исполняемый файл, предварительно установленный во многих distros (util-linux package).

Недостаток: совсем недавний вариант, отсутствует в Ubuntu 14.04.

losetup -P automation

Использование:

$ los my.img
/dev/loop0
/mnt/loop0p1
/mnt/loop0p2

$ ls /mnt/loop0p1
/whatever
/files
/youhave
/there

$ sudo losetup -l
NAME       SIZELIMIT OFFSET AUTOCLEAR RO BACK-FILE                                                                                      DIO
/dev/loop1         0      0         0  0 /full/path/to/my.img

$ # Cleanup.
$ losd 0
$ ls /mnt/loop0p1
$ ls /dev | grep loop0
loop0

Source:

los() (
  img="$1"
  dev="$(sudo losetup --show -f -P "$img")"
  echo "$dev"
  for part in "$dev"?*; do
    if [ "$part" = "${dev}p*" ]; then
      part="${dev}"
    fi
    dst="/mnt/$(basename "$part")"
    echo "$dst"
    sudo mkdir -p "$dst"
    sudo mount "$part" "$dst"
  done
)
losd() (
  dev="/dev/loop$1"
  for part in "$dev"?*; do
    if [ "$part" = "${dev}p*" ]; then
      part="${dev}"
    fi
    dst="/mnt/$(basename "$part")"
    sudo umount "$dst"
  done
  sudo losetup -d "$dev"
)

kpartx

sudo apt-get install kpartx
losetup -fs my.raw
sudo kpartx -a my.img
ls /dev/mapper

Output:

/dev/mapper/loop0
/dev/mapper/loop0p1

где loop0p1 является первым разделом, поэтому мы можем сделать:

mkdir -p d
sudo mount /dev/mapper/loop0p1 d

Преимущество этого метода: работает на Ubuntu 14,04 без перезагрузки.

-121--62237-

Следующие процедуры позволяют монтировать разделы изображения для их изменения.

losetup 2,21 -P option

losetup -P -f --show my.img

Создание одного /dev/loopXpY на раздел.

Преимущество: исполняемый файл, предварительно установленный во многих distros (util-linux package).

Недостаток: совсем недавний вариант, отсутствует в Ubuntu 14.04.

losetup -P automation

Использование:

$ los my.img
/dev/loop0
/mnt/loop0p1
/mnt/loop0p2

$ ls /mnt/loop0p1
/whatever
/files
/youhave
/there

$ sudo losetup -l
NAME       SIZELIMIT OFFSET AUTOCLEAR RO BACK-FILE                                                                                      DIO
/dev/loop1         0      0         0  0 /full/path/to/my.img

$ # Cleanup.
$ losd 0
$ ls /mnt/loop0p1
$ ls /dev | grep loop0
loop0

Source:

los() (
  img="$1"
  dev="$(sudo losetup --show -f -P "$img")"
  echo "$dev"
  for part in "$dev"?*; do
    if [ "$part" = "${dev}p*" ]; then
      part="${dev}"
    fi
    dst="/mnt/$(basename "$part")"
    echo "$dst"
    sudo mkdir -p "$dst"
    sudo mount "$part" "$dst"
  done
)
losd() (
  dev="/dev/loop$1"
  for part in "$dev"?*; do
    if [ "$part" = "${dev}p*" ]; then
      part="${dev}"
    fi
    dst="/mnt/$(basename "$part")"
    sudo umount "$dst"
  done
  sudo losetup -d "$dev"
)

kpartx

sudo apt-get install kpartx
losetup -fs my.raw
sudo kpartx -a my.img
ls /dev/mapper

Output:

/dev/mapper/loop0
/dev/mapper/loop0p1

где loop0p1 является первым разделом, поэтому мы можем сделать:

mkdir -p d
sudo mount /dev/mapper/loop0p1 d

Преимущество этого метода: работает на Ubuntu 14,04 без перезагрузки.

2
27.01.2020, 19:48

Теги

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