PS4 :скрипт отладки bash с $LINENO :выполнение по сравнению с исходным кодом

У вас есть RAID1, поэтому, если вы готовы пойти на риск сбоя диска во время преобразования, это можно сделать. Это не полный рецепт, и вы должны понимать, что делаете. Даже в этом случае вполне возможно, что вы потеряете данные, и я бы настоятельно настоятельно рекомендовал вам сделать резервную копию перед началом работы. Действительно. Да, я серьезно.

Общий план

  1. Разбить зеркало RAID
  2. Измените размер теперь -неиспользуемой половины, чтобы она соответствовала новым требованиям
  3. Создайте новое полузеркало RAID с разделами нового размера
  4. Скопируйте все файловые системы из активной половины в новую половину с измененным размером (Прежде чем делать это, остановите как можно больше служб)
  5. Перезагрузка с новой половиной RAID (сложная)
  6. Добавить обратно оставшуюся половину зеркала в RAID
  7. Прибраться

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

Пока он работает, попробуйте этот процесс на паре одноразовых образов петлевых дисков. Вот как их создать:

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в качестве базовых имен для ваших петлевых -устройств с образами дисков.

Вот некоторые детали. Ваше резервное копирование еще не завершено?

  1. Разбить зеркало 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
    
  2. Изменение размера разделов второго диска

    Используйте предпочитаемый инструмент для удаления и воссоздания разделов на втором диске. Например,

    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%
    
  3. Создайте новое полузеркало 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
    
  4. Скопируйте все файловые системы из активной половины в новую половину с измененным размером

    Перед запуском важно остановить как можно больше служб, чтобы файловые системы были максимально стабильными.

    cp -ax /mnt/103 /mnt/203    # cp -ax / /mnt/203
    cp -ax /mnt/104 /mnt/204    # cp -ax /home /mnt/204
    
  5. Перезагрузка с новой половиной RAID

    Необходимо обновить /etc/mdadm/mdadm.confновыми массивами. Используйте эту команду и добавьте все, что еще не указано в списке

    mdadm --examine --scan
    

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

  6. Добавить обратно оставшуюся половину зеркала в 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
    
  7. Прибраться

    Удалите старые устройства из /etc/mdadm/mdadm.conf, grubи initramfsи /etc/fstab. Перезагрузить.

1
25.02.2021, 19:24
2 ответа

Когда вы sourceсоздаете скрипт, он действует так, как будто содержимое скрипта вводится вручную в командной строке. Последующее sourceвыполнение сценария даст более высокие «номера строк», поскольку эта метрика фактически становится индикатором количества команд, выполненных в этом сеансе оболочки. Это можно узнать, просто выполнив printf "%s\n" "$LINENO"в интерактивной подсказке.

0
18.03.2021, 22:28

Изman bash(упор мой):

PS4    The value of this parameter is expanded  as  with  PS1  and  the
value  is  printed  before  each command bash displays during an
execution trace.  The first character of PS4 is replicated  mul‐
tiple  times, as necessary, to indicate multiple levels of indi‐
rection.  The default is ``+ ''.

Вместо этого я бы предложил использовать PS4='+${LINENO}: ', чтобы сохранить значение по умолчанию +, ++... указание косвенности.

3
18.03.2021, 22:28

Теги

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