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

Я не знаю, какой текст Ваше книжное использование, но руководство удара является четким (если Вы уже немного знакомы с перенаправлениями):

Если |& используется, стандартная погрешность command1, в дополнение к ее стандартному выводу, подключена к стандартному входу command2 через канал; это - сокращение от 2>&1 |. Это неявное перенаправление стандартной погрешности к стандартному выводу выполняется после любых перенаправлений, указанных командой.

Таким образом, если Вы не хотите смешивать стандартный вывод и стандартную погрешность, необходимо будет перенаправить стандартный вывод где-то в другом месте. Видеть Как к grep потоку стандартной погрешности (stderr)?

{ ./script.sh 2>&1 >&3 | sed 's:^:\t:'; } 3>&1

И fd 1 и 3 из script.sh и sed укажет исходному stdout месту назначения как бы то ни было. Если Вы хотите быть добропорядочным гражданином, можно закрыть их fd 3, в котором не нуждаются те команды:

{ ./script.sh 2>&1 >&3 3>&- | sed 's:^:\t:' 3>&-; } 3>&1

bash и ksh93 может уплотнить >&3 3>&- кому: >&3- (fd перемещение).

6
05.06.2018, 15:13
2 ответа

Ваше изображение является образом диска, не изображением файловой системы. Файловая система находится на разделе в том изображении (если Вы не сделали что-то действительно необычное). Можно подтвердить это путем выполнения file Debian.raw и fdisk -l Debian.raw.

Самый легкий способ получить доступ к этому разделу состоит в том, чтобы связать его с циклическим устройством. Если Вы можете, удостовериться Ваш loop поддержки драйвера и загружаются max_parts опция; Вы, возможно, должны работать rmmod loop; modprobe loop max_part=63. Затем свяжите образ диска с циклическим устройством и voilà:

losetup -fs Debian.raw     # prints /dev/loop0 (or some other number)
mount /dev/loop0p1 /mnt    # 0 as above, 1 is the partition number

Если Вы не можете заставить драйвер цикла использовать разделы, необходимо узнать смещение раздела в образе диска. Выполненный fdisk -lu Debian.raw перечислить разделы и узнать его стартовый сектор S (сектор составляет 512 байтов). Затем скажите losetup Вы хотите, чтобы циклическое устройство запустилось при этом смещении:

fdisk -lu Debian.raw  # note starting sector $S
losetup -fs -o $(($S * 512)) Debian.raw
mount /dev/loop0 /mnt  # /dev/loop0 or whatever losetup prints

Если Вы хотите скопировать раздел от образа виртуальной машины до Вашей системы, определите ее запуск ($S) и окончание ($E) смещения с fdisk -lu как выше. Затем скопируйте просто раздел:

<Debian.raw tail -c +$((512*$S)) | dd of=/dev/sda5 bs=4M

(Если источник и место назначения не находятся на том же диске, не беспокойтесь dd, просто перенаправление tailвывод к /dev/sda5. Если они находятся на том же диске, dd с большим bs параметр намного быстрее.)

7
27.01.2020, 20:27
  • 1
    я делаю попытку этой точной процедуры, и я добрался, цикл монтируются для работы, но после использования хвоста и dd, для монтирования все еще не может найти файловую систему на неструктурированном устройстве. какие-либо идеи? –  TREE 01.05.2011, 16:34
  • 2
    @TREE: Вы использовали поддержку раздела драйвера цикла (/dev/loop0p1), или указанное пользователями смещение (losetup -o)? Из чего вывод <Debian.raw file -, из <Debian.raw tail -c +$((512*s)) | file -, или file - на какой-либо соответствующей промежуточной стадии? –  Gilles 'SO- stop being evil' 01.05.2011, 16:48
  • 3
    На Ubuntu 14.04, proc встроенный модуль, таким образом, rmmod сбои.Редактирование GRUB_CMDLINE_LINUX на /etc/default/grub работы: unix.stackexchange.com/a/87189/32558 –  Ciro Santilli 新疆改造中心法轮功六四事件 12.09.2015, 13:49
  • 4
    Превосходный ответ, помог мне смонтировать пи малины raspberrypi.org/downloads/raspbian –  aseq 19.11.2015, 03:23

losetup 2.21 -P option

losetup -P -f --show my.img

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

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

Недостаток: довольно новая опция, отсутствует в 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

Источник:

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

Выход:

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

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

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

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

1
27.01.2020, 20:27

Теги

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