LINUX.ORG.RU

dd / cp - как создать раздел из файла, размером идентиченым размеру файла?

 


0

1

есть файл data.img
есть диск /dev/sda

на диске один раздел /dev/sda1 и не размеченное место до и после раздела:


--------------------------------------
| | | |
| unl. | sda1 | unl. |
| | | |
--------------------------------------

мне нужно записать на этот диск файл data.img как раздел /dev/sda2 - но сам раздел должен быть байт в байт размера самого файла data.img

--------------------------------------
| | | | |
| unl. | sda1 | sda2 | unl. |
| | | | |
--------------------------------------

как это сделать с помощью cp/dd?
измерить побайтово размер файла, забить нулями (создать) раздел такого размера и только потом писать туда файл?
Или можно быстрее как?

★★☆

Последнее исправление: science (всего исправлений: 3)
Ответ на: комментарий от beastie

хотелось бы автоматизировать и исключить человеческий фактор.

Т.е. чтобы то, что создает/копирует раздел - само определяло размер.

science ★★☆
() автор топика
Ответ на: комментарий от science

Больше чем партиция и dd не запишешь (если писать конечно не на raw-диск, а на «sda2»). А меньше — тоже не проблема. Ну останутся в конце пару нулей.

beastie ★★★★★
()

Рекомендую сначала создать партицию того размера, которого считаешь нужно, отформатировать ее в ту ФС, которая в файле, потом скопировать эту партицию с помощью dd чтобы а) проверить правильность размера, б) сверить заголовки. Думаю, это минимизирует риск ошибки. Минус - нужно чуть больше свободного места на диске. Но я бы сделал именно так.

Kroz ★★★★★
()
Ответ на: комментарий от Kroz

как-то это всё сложно, долго и не юникс-вейно :)

я хотет вот так: ~ # tool data.img /dev/sda2

если /dev/sda2 нет, то создать размером входного файла.

science ★★☆
() автор топика
Ответ на: комментарий от science

Вот тебе tool:

#!/bin/sh

if [[ "$#" != "2" ]]; then
        echo "Usage:"
        echo "$0 <image file> </dev/device file>"
        exit
fi

if [[ "$UID" != "0" ]]; then
        echo "ERROR: you chould run it as root"
        exit
fi

IMG="$1"
DST="$2"

if [[ ! -r "$1" ]]; then
        echo "ERROR: image file '$IMG' does not exist or is nor readable"
        exit
fi
if [[ ! -b "$DST" ]]; then
        echo "ERROR: incorrect destination partition: '$DST'"
        exit
fi

DISK="${DST:0:8}"
LINE=`fdisk -l $DISK | grep $DST`
DST=`echo "$LINE"|awk '{print $1}'`
START=`echo "$LINE"|awk '{print $2}'`
DST_LENGTH=`echo "$LINE"|awk '{print $4}'`
BLOCK=`fdisk -l $DISK | grep "^Units"| awk '{print $9}'`

echo

if [[ -z "$DST" ]] ; then
        echo "ERROR: Destination does not exist"
else
        echo "dd if=$IMG of=$DST bs=$BLOCK seek=$START count=$DST_LENGTH"
fi

Результат работы на сейчас - вывод команды. Но я тебе очень не рекомендую запускать ту команду (или убрать последнее echo), так как я этот скрипт не дебажил, а последствия могут быть катастрофическими.

Но принцип, думаю, ты поймешь из этого скрипта.

Еще раз рекомендую то, что я предложил в предыдущем посте.

Kroz ★★★★★
()
Ответ на: комментарий от science

как-то это всё сложно, долго и не юникс-вейно :)
я хотет вот так: ~ # tool

Как раз юникс-вей - это когда одна программа делает что-то одно.

TheAnonymous ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.