замена диска при использовании FreeBSD ZFS ZROOT (ZFS на раздел)?

Заявление Тердона «Это очень далеко от« простого » if ». это преуменьшение. Как указал Джон Кугельман, , && и || имеют равный приоритет и обрабатываются слева направо. BinaryZebra предложила идею преобразования логических выражений в каскадные операторы if . Моя лучшая попытка «упростить»

if A && B || C && D
then
        result=0
else
        result=1
fi

if A
then
        if B
        then
                if D                                        
                then
                        result=0
                else
                        result=1
                fi
        else
                if C
                then
                        if D
                        then
                                result=0
                        else
                                result=1
                        fi
                else
                        result=1
                fi
        fi
else
        if C
        then
                if D
                then
                        result=0
                else
                        result=1
                fi
        else
                result=1
        fi
fi

очень далека от простого. Как вы можете видеть из вышеизложенного, причина, по которой это не работает, заключается в том, что (в отмеченной строке), если A и B оба истинны , он все еще проходит проверку D ( [["$ 1" == "Зашифровать"]] ).

Как показывает BinaryZebra без упоминания, вы можете использовать некоторые математические обозначения в сценариях sh / bash; например, вы можете сказать

if (A && B) || (C && D)
then
  ︙ 

или, в несколько упрощенной версии вашего кода,

if ( [["$2" == "load" ]] && [[ "$1" == "Decrypt" ]] )  ||  ( [[ "$2" == "load" ]] && [[ "$1" == "Encrypt" ]] )
then
  ︙ 

Особенностью этого является то, что код в круглых скобках запускается в подоболочке. Если это проблема, вы можете вместо этого использовать фигурные скобки:

if { [["$2" == "load" ]] && [[ "$1" == "Decrypt" ]] ; }  ||  { [[ "$2" == "load" ]] && [[ "$1" == "Encrypt" ]] ; }
then
  ︙ 

Обратите внимание, что перед } должны быть ; перед } (необязательно разделенные пробел), и должны быть пробелы до и после { и после } .

Конечно, вы должны использовать методы, представленные в других ответах, для упрощения вашего теста, например , а не выполнение одного и того же теста на $ 2 дважды.

Связано: Приоритет привязки каналов и перенаправления с дизъюнктами, конъюнктами и т. Д.? и Когда «если» не требуется?

4
29.09.2018, 00:43
1 ответ

Сначала :не забудьте перевести новый диск в автономный режим и убедиться, что он не подключен и не используется каким-либо образом.

Скопировать таблицы разделов со старого диска ada0на новый дискada3:

% doas gpart backup ada0 | doas gpart restore -F ada3

Теперь ada3имеет те же три раздела, что иada0:

% doas gpart show ada3
=>        40  3907029088  ada3  GPT  (1.8T)
          40        1024     1  freebsd-boot  (512K)
        1064         984        - free -  (492K)
        2048     4194304     2  freebsd-swap  (2.0G)
     4196352  3902832640     3  freebsd-zfs  (1.8T)
  3907028992         136        - free -  (68K)

Удалить старые метаданные ZFS (раздел уведомления p3):

% doas dd if=/dev/zero of=/dev/ada3p3

Заменить диск (уведомление о разделе p3):

% doas zpool replace -f zroot 15120424524672854601 /dev/ada3p3
Make sure to wait until resilver is done before rebooting.

If you boot from pool 'zroot', you may need to update
boot code on newly attached disk '/dev/ada3p3'.

Assuming you use GPT partitioning and 'da0' is your new boot disk
you may use the following command:

        gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 da0

Запустите указанную команду, чтобы обновить загрузочную информацию на новом диске:

% doas gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada3
partcode written to ada3p1
bootcode written to ada3

UUID теперь другие:

% gpart list ada0 | grep uuid | sort
   rawuuid: 7f842536-bcd0-11e8-b271-00259014958c
   rawuuid: 7fbe27a9-bcd0-11e8-b271-00259014958c
   rawuuid: 7fe24f3e-bcd0-11e8-b271-00259014958c
% gpart list ada3 | grep uuid | sort
   rawuuid: 9c629875-c369-11e8-a2b0-00259014958c
   rawuuid: 9c63d063-c369-11e8-a2b0-00259014958c
   rawuuid: 9c66f76e-c369-11e8-a2b0-00259014958c
% gpart list ada0 | grep efimedia | sort
   efimedia: HD(1,GPT,7f842536-bcd0-11e8-b271-00259014958c,0x28,0x400)
   efimedia: HD(2,GPT,7fbe27a9-bcd0-11e8-b271-00259014958c,0x800,0x400000)
   efimedia: HD(3,GPT,7fe24f3e-bcd0-11e8-b271-00259014958c,0x400800,0xe8a08000)
% gpart list ada3 | grep efimedia | sort
   efimedia: HD(1,GPT,9c629875-c369-11e8-a2b0-00259014958c,0x28,0x400)
   efimedia: HD(2,GPT,9c63d063-c369-11e8-a2b0-00259014958c,0x800,0x400000)
   efimedia: HD(3,GPT,9c66f76e-c369-11e8-a2b0-00259014958c,0x400800,0xe8a08000)

Теперь выполняется повторное серебрение диска:

% zpool status zroot
  pool: zroot
 state: DEGRADED
status: One or more devices is currently being resilvered.  The pool will
        continue to function, possibly in a degraded state.
action: Wait for the resilver to complete.
  scan: resilver in progress since Sat Sep 29 01:01:24 2018
        64.7G scanned out of 76.8G at 162M/s, 0h1m to go
        15.7G resilvered, 84.22% done
config:

        NAME                        STATE     READ WRITE CKSUM
        zroot                       DEGRADED     0     0     0
          raidz2-0                  DEGRADED     0     0     0
            ada0p3                  ONLINE       0     0     0
            ada1p3                  ONLINE       0     0     0
            ada2p3                  ONLINE       0     0     0
            replacing-3             OFFLINE      0     0     0
              15120424524672854601  OFFLINE      0     0     0  was /dev/ada3p3/old
              ada3p3                ONLINE       0     0     0

После восстановления серебра:

% zpool status zroot
  pool: zroot
 state: ONLINE
  scan: resilvered 18.6G in 0h7m with 0 errors on Sat Sep 29 01:09:22 2018
config:

        NAME        STATE     READ WRITE CKSUM
        zroot       ONLINE       0     0     0
          raidz2-0  ONLINE       0     0     0
            ada0p3  ONLINE       0     0     0
            ada1p3  ONLINE       0     0     0
            ada2p3  ONLINE       0     0     0
            ada3p3  ONLINE       0     0     0

errors: No known data errors
6
27.01.2020, 20:53

Теги

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