Intereting Posts
Каков процесс `sendmail`? создать LVM VG для корня / dev / sda2 Есть ли общий инструмент помимо gpg для шифрования файлов в AES? ядро марсианского источника и от одного и того же IP-адреса Как скопировать файл и переместить его в местоположение с помощью unix Как я могу изменить действие по умолчанию на экране Ca на просто обратную сторону `? Что вы подразумеваете под командами низкого уровня и командами высокого уровня? Что такое ANALYZE / CATALOG для каталога бинарных сообщений Linux msginit? Можно ли перечислить только определенные подкаталоги? Установите дату создания файла в дату его изменения на OSX fstrim cronjob не работает на Linux Mint 17.2 Grub терпит неудачу, не может установить lubuntu Linux не смонтирует устройство Android в режиме USB MSC USB-порты, не работающие с Ubuntu Linux 14 Как реализовать подстановку процесса (используя скрипт bash) в оболочке, которая не имеет этого?

Предельные данные по трубе в байтах

Я пытаюсь сделать «расширенный случай» клонирования.

На блочном устройстве написана труба, в конце которой есть раздел, который нельзя трогать. Я знаю, где начинается этот раздел. В этом случае я хочу переопределить таблицу разделов.

Для симпликации труба начинается с dd if=myfile .

 dd if=myfile > /dev/sda 

Я мог бы сделать что-то вроде

 dd if=myfile | dd bs=1B count=startofmypartition-~1000000 > /dev/sda 

Но есть ли лучшие способы сделать это и есть ли какие-либо недостатки этого метода?

pv имеет параметр размера, но он утверждает, что он используется только для вычисления ETA, поэтому я не уверен, что это будет работать: (из manpage 🙂

 -s SIZE, --size SIZE Assume the total amount of data to be transferred is SIZE bytes when calculating percentages and ETAs. The same suffixes of "k", "m" etc can be used as with -L. 

Я знаю, что будет больше операций записи, но они должны оказаться теми же данными на диске, используя одно и то же пространство – пока это не ленточный накопитель.

dd bs=1 очень неэффективен, так как он выполняет один read() и один системный вызов write() на каждый байт. Не имеет смысла использовать dd любом случае на блочном устройстве (если вы не хотите использовать специальные флаги, такие как conv=noerror,sync... для обработки ошибок или смещений)

Здесь вы можете сделать:

 offset=$(($(cat /sys/class/block/sda3/start) * 512)) && pv -trabSs "$offset" < myfile > /dev/sda 

(или используйте head -c "$offset" если вам не нужна информация о ходе).

pv и head будут выбирать необходимый размер буфера для оптимизации производительности.

(обратите внимание, что, поскольку вы записываете данные в начале диска, вы будете эффективно перезаписывать таблицу разделов!).

Другой альтернативой может быть создание нового блочного устройства, которое отображает только разделы /dev/sda которые вы хотите перезаписать

Подобно:

 echo "0 $(cat /sys/class/block/sda3/start) linear /dev/sda 0" | dmsetup create writable_sda && cp myfile /dev/mapper/writable_sda