Есть много способов заставить printf делать это за вас, но вот лишь пара:
printf ' ./prog %d0\n' 1 2 3 | sh
Или, может быть, вы хотите, чтобы программа действительно запускалась 30 раз. seq
uence и printf
очень хорошо подходят для этой цели:
printf ' ./prog %d\n' `seq 1 30` | sh
Или, может быть, результаты вашей команды включают какое-то значение переменной, которым вы не хотите жертвовать. дальняя сторона трубы. Хорошо.: [
. <<CMD /dev/fd/0
$(printf './prog %d0\n' 1 2 3 )
CMD
] Возможно, вам не нужны числа, но вам нужно столько копий строки, или, может быть, нужно повторить только часть команды, но другие части статичны:
. <<CMD /dev/fd/0
$( { printf 'echo "this is part 1" >&2| ' ;\
printf 'echo "these are parts %d" >&2 | ' `seq 1 5` ; })
CMD
printf 'this string is repeated for each of printfs args,
but the args are not included%.0b\n' `seq 1 5`
У вас есть RAID1, поэтому, если вы готовы пойти на риск сбоя диска во время преобразования, это можно сделать. Это не полный рецепт, и вы должны понимать, что делаете. Даже в этом случае вполне возможно, что вы потеряете данные, и я бы настоятельно настоятельно рекомендовал вам сделать резервную копию перед началом работы. Действительно. Да, я серьезно.
Общий план
Теперь, прежде чем вы даже подумаете о том, чтобы применить это к вашей действующей системе, сделайте резервную копию.
Пока он работает, попробуйте этот процесс на паре одноразовых образов петлевых дисков. Вот как их создать:
dd if=/dev/zero bs=1M count=200 > disk1.dat # Create a 200MB "disk"
cp -p disk1.dat disk2.dat # And another
parted disk1.dat --align optimal unit MiB --script mklabel gpt # First disk label
parted disk1.dat --align optimal unit MiB mkpart primary 1 2 # Dummy partition
parted disk1.dat --align optimal unit MiB mkpart primary 2 3
parted disk1.dat --align optimal unit MiB mkpart primary 3 150 # First useful partition
parted disk1.dat --align optimal unit MiB mkpart primary 150 100% # Second
parted disk2.dat --align optimal unit MiB --script mklabel gpt # Second disk
parted disk2.dat --align optimal unit MiB mkpart primary 1 2
parted disk2.dat --align optimal unit MiB mkpart primary 2 3
parted disk2.dat --align optimal unit MiB mkpart primary 3 150
parted disk2.dat --align optimal unit MiB mkpart primary 150 100%
d1=$(losetup --show --find --partscan disk1.dat); echo $d1 # Loop device
d2=$(losetup --show --find --partscan disk2.dat); echo $d2
mdadm --create /dev/md103 --metadata default --level=1 --raid-devices=2 ${d1}p3 ${d2}p3
mdadm --create /dev/md104 --metadata default --level=1 --raid-devices=2 ${d1}p4 ${d2}p4
mkfs -t ext4 -L 103 /dev/md103
mkfs -t ext4 -L 104 /dev/md104
mkdir /mnt/103 /mnt/104 # Mountpoints for our test filesystems
mount /dev/md103 /mnt/103
mount /dev/md104 /mnt/104
Теперь у вас есть две файловые системы RAID1 на /dev/md103
и /dev/md104
, на которые вы можете скопировать некоторые данные и опробовать процесс. У вас есть $d1
и $d2
в качестве базовых имен для ваших петлевых -устройств с образами дисков.
Вот некоторые детали. Ваше резервное копирование еще не завершено?
Разбить зеркало RAID
Вы можете сделать половину из двух разделов RAID неисправными с помощью таких команд, как
mdadm /dev/md103 --set-faulty ${d2}p3 --remove ${d2}p3 # sdb3
mdadm --zero-superblock ${d2}p3
mdadm /dev/md104 --set-faulty ${d2}p4 --remove ${d2}p4 # sdb4
mdadm --zero-superblock ${d2}p4
Изменение размера разделов второго диска
Используйте предпочитаемый инструмент для удаления и воссоздания разделов на втором диске. Например,
parted $d2 --align optimal unit MiB rm 3
parted $d2 --align optimal unit MiB rm 4
В этот момент вам может понадобиться перезагрузить систему. (В качестве альтернативы возможно, что partprobe
может удовлетворить требование.)Не забудьте заново создать устройства петли и назначить $d1
и $d2
, когда вы это сделаете.
parted $d2 --align optimal unit MiB mkpart primary 3 50
parted $d2 --align optimal unit MiB mkpart primary 50 100%
Создайте новое полузеркало RAID с разделами нового размера
Создайте устройства RAID и файловые системы. Не беспокойтесь, что первый предупредит вас, что он уже был частью массива -, но сейчас это не так.
mdadm --create /dev/md203 --metadata default --level=1 --raid-devices=2 missing ${d2}p3
mdadm --create /dev/md204 --metadata default --level=1 --raid-devices=2 missing ${d2}p4
mkfs -t ext4 -L 203 /dev/md203
mkfs -t ext4 -L 204 /dev/md204
mkdir /mnt/203 /mnt/204
mount /dev/md203 /mnt/203
mount /dev/md204 /mnt/204
Скопируйте все файловые системы из активной половины в новую половину с измененным размером
Перед запуском важно остановить как можно больше служб, чтобы файловые системы были максимально стабильными.
cp -ax /mnt/103 /mnt/203 # cp -ax / /mnt/203
cp -ax /mnt/104 /mnt/204 # cp -ax /home /mnt/204
Перезагрузка с новой половиной RAID
Необходимо обновить /etc/mdadm/mdadm.conf
новыми массивами. Используйте эту команду и добавьте все, что еще не указано в списке
mdadm --examine --scan
Вам также потребуется обновить grub
и, возможно, ваш initramfs
, чтобы он мог найти новую корневую файловую систему. Вы не предоставили подробную информацию об этом в своей настройке, поэтому я не могу дать вам инструкции.
Добавить обратно оставшуюся половину зеркала в RAID
Если вы абсолютно уверены, что успешно работаете с новой половиной -зеркального RAID, вы можете уничтожить исходную половину и добавить ее обратно в новую половину -зеркал. Эти команды завершатся ошибкой, если у вас все еще смонтированы файловые системы. (На данном этапе их быть не должно.)
mdadm --stop /dev/md103
mdadm --zero-superblock ${d1}p3
mdadm --stop /dev/md104
mdadm --zero-superblock ${d1}p4
Теперь измените размер оставшихся разделов диска с помощью команд, подобных приведенным выше parted
.
Добавить разделы с измененным размером в новую половину -зеркального RAID1
mdadm /dev/md203 --add ${d1}p3
mdadm /dev/md204 --add ${d1}p4
Прибраться
Удалите старые устройства из /etc/mdadm/mdadm.conf
, grub
и initramfs
и /etc/fstab
. Перезагрузить.