Преобразование btrfs raid1 на двух дисках в btrfs raid1 на двух дисках с luks-шифрованием

Следующий скрипт bash перебирает все файлы в текущем каталоге, которые соответствуют шаблону (something )подчеркивание (something )тире (something )подчеркивание (something )подчеркивание (что-то ), а затем выбирает соответствующие поля для сравнения. Синтаксис ${field:4:2}означает получение значения $field, начиная с позиции 4, и извлечение двух символов.

Затем различные части сравниваются в соответствии с указанной вами логикой, и присваивается переменная code.

#!/bin/bash

for f in *_*-*_*_*
do
  field=${f#*_}
  field=${field%%-*}

  col23=${field:2:2}
  col45=${field:4:2}
  col678=${field:6:3}

  if [ "$col23" = "yy" ]
  then
    case $col45 in
      (00|01|02)
        if [ "$col678" = "abc" ]
        then
                code=usa
        else
                code=uk
        fi
        ;;
      (*)
        code=Aus
        ;;
    esac
  else
    code=Aus
  fi
  echo "For file $f, code is: $code"
done
0
24.01.2020, 09:12
1 ответ

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

Создание тестовой системы

Сначала нам нужны два раздела для работы, я создал их с помощью fdisk, чтобы получить:

Device     Boot    Start      End  Sectors Size Id Type
/dev/sda1           2048 20973567 20971520  10G 83 Linux
/dev/sda2       20973568 41945087 20971520  10G 83 Linux

Затем я создал незашифрованный btrfs raid1 (вам нужно принудительно -f, если используются разделы, но убедитесь, что вы знаете, что делаете):

> mkfs.btrfs -m raid1 -d raid1 /dev/sda1 /dev/sda2

...

Devices:
   ID        SIZE  PATH
    1    10.00GiB  /dev/sda1
    2    10.00GiB  /dev/sda2

Затем я смонтировал файловую систему для работы с работающей системой и создал тестовый файл:

> mount /dev/sda1 /mnt/tmp
> echo "Hello World" > /mnt/tmp/hello.txt

Выполнение миграции

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

> btrfs fi resize 1:9G /mnt/tmp
> btrfs fi resize 2:9G /mnt/tmp

Затем мы удаляем дублирование в системе (необходимо принудительно, так как это увеличивает риск потери данных ). Это занимает много времени в большой файловой системе, так как перезаписывает все данные. Мы можем проверить прогресс с помощью btrfs balance status /mnt/tmp.

> btrfs balance start -mconvert=single -dconvert=single /mnt/tmp --force
Done, had to relocate 3 out of 3 chunks

Затем мы можем удалить одно из устройств. Если это займет много времени, мы можем проверить статус, используя btrfs device usage /mnt/tmp.

> btrfs device remove 1 /mnt/tmp
> btrfs device usage /mnt/tmp
/dev/sda2, ID: 2
   Device size:            10.00GiB
   Device slack:            1.00GiB
   Data,single:             1.00GiB
   Metadata,single:       256.00MiB
   System,single:          32.00MiB
   Unallocated:             7.72GiB

Затем мы конвертируем его в устройство LUKS

> cryptsetup luksFormat /dev/sda1
> cryptsetup luksOpen /dev/sda1 crypt_1

Добавляем зашифрованное устройство в файловую систему и удаляем другое

> btrfs device add /dev/mapper/crypt_1 /mnt/tmp
> btrfs device remove /dev/sda2 /mnt/tmp

Это снова займет много времени для файловой системы с большим количеством данных, так как все данные должны быть перемещены.

Затем мы конвертируем другое устройство в LUKS, добавляем его обратно в файловую систему и балансируем как Raid1:

> cryptsetup luksFormat /dev/sda2
> cryptsetup luksOpen /dev/sda2 crypt_2
> btrfs device add /dev/mapper/crypt_2 /mnt/tmp
> btrfs balance start -dconvert=raid1 -mconvert=raid1 /mnt/tmp
Done, had to relocate 3 out of 3 chunks

Конечно, последняя команда снова займет много времени, если у нас много данных. Проверим результат:

> btrfs filesystem show /mnt/tmp
Label: none  uuid: e894df1a-b62f-49cb-bcdc-8e6eb25945a4
        Total devices 2 FS bytes used 448.00KiB
        devid    3 size 9.98GiB used 1.28GiB path /dev/mapper/crypt_1
        devid    4 size 9.98GiB used 1.28GiB path /dev/mapper/crypt_2
> btrfs filesystem df /mnt/tmp
Data, RAID1: total=1.00GiB, used=320.00KiB
System, RAID1: total=32.00MiB, used=16.00KiB
Metadata, RAID1: total=256.00MiB, used=112.00KiB
GlobalReserve, single: total=16.00MiB, used=0.00B

Вуаля, у нас есть RAID 1 на двух зашифрованных устройствах, все еще содержащий наши данные!

> cat /mnt/tmp/hello.txt 
Hello World
1
28.01.2020, 02:56

Теги

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