RAID массив не перекомпоновывается после перезагрузки

Массив RAID не собирается после перезагрузки.

У меня есть один SSD, с которого загружается система, и три HDD, которые являются частью массива. Система Ubuntu 16.04.

Шаги, которые я выполнил, основаны главным образом на этом руководстве:

https://www.digitalocean.com/community/tutorials/how-to-create-raid-arrays-with-mdadm-on-ubuntu-16-04

  1. Проверка, если я в порядке.

    lsblk -o NAME,SIZE,FSTYPE,TYPE,MOUNTPOINT
    

Выходные данные показывают устройства sda, sdb и sdc, кроме разделов SSD. Я проверил, действительно ли они представляют собой жесткие диски, посмотрев на результат этого:

hwinfo --disk

Все совпадает.

  1. Сборка массива.

    sudo mdadm --create --verbose /dev/md0 --level=5 --raid-devices=3 /dev/sda /dev/sdb /dev/sdc
    

Я проверяю, выглядит ли он нормально, введя: cat / proc / mdstat

Вывод выглядит примерно так:

Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md0 : active raid5 sdc[3] sdb[1] sda[0]
      7813774336 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/2] [UU_]
      [=======>.............]  recovery = 37.1% (1449842680/3906887168) finish=273.8min speed=149549K/sec
      bitmap: 0/30 pages [0KB], 65536KB chunk

unused devices: <none>

Я жду, пока процесс не закончится.

Personalities : [raid1] [linear] [multipath] [raid0] [raid6] [raid5] [raid4] [raid10] 
md0 : active raid5 sdc[3] sdb[1] sda[0]
      209584128 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/3] [UUU]

unused devices: <none>
  1. Создание и монтирование файловой системы.

    sudo mkfs.ext4 -F /dev/md0
    
    sudo mkdir -p /mnt/md0
    
    sudo mount /dev/md0 /mnt/md0
    
    df -h -x devtmpfs -x tmpfs
    

Я положил некоторые данные, и результат выглядит так:

Filesystem      Size  Used Avail Use% Mounted on
/dev/nvme0n1p2  406G  191G  196G  50% /
/dev/nvme0n1p1  511M  3.6M  508M   1% /boot/efi
/dev/md0        7.3T  904G  6.0T  13% /mnt/md0
  1. Сохранение макета массива.

    sudo mdadm --detail --scan | sudo tee -a /etc/mdadm/mdadm.conf
    
    sudo update-initramfs -u
    
    echo '/dev/md0 /mnt/md0 ext4 defaults,nofail,discard 0 0' | sudo tee -a /etc/fstab
    
  2. Перезагрузка и проверка, если все работает правильно.

После перезагрузки я пытаюсь: cat / proc / mdstat
Это не показывает никаких активных устройств рейда.

ls /mnt/md0 

пустой.

Следующая команда ничего не печатает и тоже не работает:

mdadm --assemble --scan -v

Только следующее восстанавливает массив с данными на нем:

sudo mdadm --create --verbose /dev/md0 --level=5 --raid-devices=3 /dev/sda /dev/sdb /dev/sdc

Что нужно сделать по-другому?

Дополнительная, возможно, полезная информация:

sudo dpkg-reconfigure mdadm

Вывод показывает:

update-initramfs: deferring update (trigger activated)
Generating grub configuration file ...
Warning: Setting GRUB_TIMEOUT to a non-zero value when GRUB_HIDDEN_TIMEOUT is set is no longer supported.
Found linux image: /boot/vmlinuz-4.4.0-51-generic
Found initrd image: /boot/initrd.img-4.4.0-51-generic
Found linux image: /boot/vmlinuz-4.4.0-31-generic
Found initrd image: /boot/initrd.img-4.4.0-31-generic
Adding boot menu entry for EFI firmware configuration
done
update-rc.d: warning: start and stop actions are no longer supported; falling back to defaults
Processing triggers for initramfs-tools (0.122ubuntu8.5) ...
update-initramfs: Generating /boot/initrd.img-4.4.0-51-generic

Для меня интригующей частью является то, что "запуск и остановка больше не поддерживаются; возврат к значениям по умолчанию"

Также вывод / usr / share / mdadm / mkconf не печатает никаких массивов в конце.

# mdadm.conf
#
# Please refer to mdadm.conf(5) for information about this file.
#

# by default (built-in), scan all partitions (/proc/partitions) and all
# containers for MD superblocks. alternatively, specify devices to scan, using
# wildcards if desired.
#DEVICE partitions containers

# auto-create devices with Debian standard permissions
CREATE owner=root group=disk mode=0660 auto=yes

# automatically tag new arrays as belonging to the local system
HOMEHOST <system>

# instruct the monitoring daemon where to send mail alerts
MAILADDR [email protected]

# definitions of existing MD arrays

тогда как вывод cat /etc/mdadm/mdadm.conf делает.

# mdadm.conf
#
# Please refer to mdadm.conf(5) for information about this file.
#

# by default (built-in), scan all partitions (/proc/partitions) and all
# containers for MD superblocks. alternatively, specify devices to scan, using
# wildcards if desired.
#DEVICE partitions containers

# DEVICE /dev/sda /dev/sdb /dev/sdc

# auto-create devices with Debian standard permissions
CREATE owner=root group=disk mode=0660 auto=yes

# automatically tag new arrays as belonging to the local system
HOMEHOST <system>

# instruct the monitoring daemon where to send mail alerts
MAILADDR [email protected]

# definitions of existing MD arrays

# This file was auto-generated on Sun, 04 Dec 2016 18:56:42 +0100
# by mkconf $Id$

ARRAY /dev/md0 metadata=1.2 spares=1 name=hinton:0 UUID=616991f1:dc03795b:8d09b1d4:8393060a

Какое решение? Я просмотрел половину интернета, и никто, похоже, не имеет такой же проблемы.

Я также добавил тот же вопрос о сбое сервера пару дней назад (без ответа). Я извиняюсь, если этим нарушил правила сообщества обмена стека.

5 ответов

У меня была та же проблема, я не уверен, но я нашел обходной путь, заключающийся в создании новых разделов на членах raid типа LINUX Raid, а затем при создании массива я использовал раздел, а не устройство.

Кажется, это довольно распространенная проблема при использовании целых дисков в массиве.

В этом посте дается последняя сводка проблемы и как я ее решил: RAID-массив mdadm, лежащий в основе LVM после перезагрузки

Этот пост помог мне понять и решить мою проблему: в чем разница между созданием массива mdadm с использованием разделов или целых дисков напрямую

Я не смог воспроизвести вашу точную проблему, но я думаю, что нашел возможную причину поведения вашей системы:

При создании 3-х дискового массива RAID5 с помощью команды:

sudo mdadm --create --verbose /dev/md0 --level=5 --raid-devices=3 /dev/sda /dev/sdb /dev/sdc

Пока устройство RAID находится в восстановлении, команда mdadm scan показывает:

sudo mdadm --detail --scan
ARRAY /dev/md0 metadata=1.2 spares=1 name=desktop:0 UUID=da60c69a:1cbe4f2e:e83d0971:0520ac89

После завершения процесса восстановления spares=1 параметр пропал:

sudo mdadm --detail --scan
ARRAY /dev/md0 metadata=1.2 name=desktop:0 UUID=da60c69a:1cbe4f2e:e83d0971:0520ac89

Я предполагаю, что повторная сборка диска 3 читать с spares=1 Параметр потерпит неудачу на полностью восстановленном программном RAID5, так как у вас больше нет резервных дисков. Если вы попытаетесь собрать RAID с помощью следующей команды, произойдет сбой:

sudo mdadm --create --verbose /dev/md0 --level=5 --raid-devices=3 --spare-devices=1 /dev/sda /dev/sdb /dev/sdc

и следующая команда создаст другую структуру RAID:

sudo mdadm --create --verbose /dev/md0 --level=5 --raid-devices=2 --spare-devices=1 /dev/sda /dev/sdb /dev/sdc

С другой стороны: если вам не нужно загружаться с RAID5, нет необходимости добавлять конфигурацию в /etc/mdadm/mdadm.conf файл. Ubuntu автоматически запустит RAID, так как конфигурация доступна в суперблоке RAID.

Решение следующее: Вы сканируете все диски, на которых не установлена ​​ваша ОС. Затем вы выбираете из тех, какие диски вы хотите выбрать. Перед созданием любого RAID вам необходимо отформатировать диски в совместимый формат, например, ext4. Посмотрите мой пример bash-кода, чтобы выбрать все диски с арендованного компьютера, кроме диска ОС, и построить RAID0 для максимальной скорости, чтобы позже сформировать быстрый узел базы данных.

      {
  #database here
  cd "/home/$1/UltiHash/"
  cwd=$(pwd)
  sudo systemctl start postgresql.service
  sudo service postgresql restart
  if ! [[ $(sudo -u postgres psql --command='SHOW data_directory') == *"/mnt/md0/postgresql/13/main"* ]]; then
    sudo chown -R ${mainuser} /home/${mainuser}/
    echo "${passwd}\n${passwd}\n" | sudo passwd postgres
    echo "postgres password set!"
    sudo usermod -aG sudo postgres
    echo "Configured postgres as a root user"
    sudo postgres -D /usr/local/pgsql/data > logfile 2>&1 &
    version=$(psql --version)
    cutter="$(cut -d ' ' -f 3- <<< "$version" )" && tmpcut="${cutter%% *}"
    folver="${tmpcut%%.*}"
    cd /etc/postgresql/${folver}/main
    sudo -u postgres psql --command="ALTER USER postgres WITH PASSWORD '${passwd}';"
    sudo -u postgres psql --command="CREATE USER admin WITH PASSWORD '${passwd}';"
    sudo -u postgres psql --command="ALTER USER admin WITH SUPERUSER;"
    sudo -u postgres psql --command="ALTER USER admin CREATEDB;"
    sudo service postgresql restart
    sudo systemctl stop postgresql
    cd ~/

    #unmask cinnamon
    if [[ $(file /lib/systemd/system/x11-common.service) == "/lib/systemd/system/x11-common.service: symbolic link to /dev/null" ]]; then
      sudo rm /lib/systemd/system/x11-common.service
      sudo apt-get install --reinstall x11-common
      sudo systemctl daemon-reload
      #systemctl status x11-common
    fi

    #scan drives except OS drive
    drivelist=""
    count=0
    os_drive_path="$(df -hT | grep /$ | awk -F " " '{print $1}')"
    os_drive=${os_drive_path%p*}
    no_dev=${os_drive#*/dev/}
    NL=$'\n'
    while read line; do
      if [[ ($line == *nvme* || $line == sd*) && ! ( $line == *"${no_dev}"* ) ]]; then
        drivelist="${drivelist}/dev/${line}${NL}"
        count=$((count+1))
      fi
    done <<< "$(lsblk -f)"

    #create partitions on the free drives directly in ext4 format
    drivelist_overrideable=""
    while read line; do
      drivename=$(echo "$line" | awk -F " " '{print $1}')
      drivelist_overrideable="${drivelist_overrideable}${drivename}${NL}"
      if [[ $drivename == *nvme* ]]; then
        sudo mkfs.ext4 -b 1024 -m 0 -F "$drivename"
      else
        sudo mkfs.ext4 -m 0 -F "$drivename"
      fi
    done <<< "${drivelist}"

    #now we know what has been formatted, so we know the hardware name, now we must scan again and mount the partition to the files created
    #create RAID0
    printf "Y\n" | sudo mdadm --create --verbose /dev/md0 --level=0 --raid-devices="${count}" ${drivelist_overrideable}
    cat /proc/mdstat
    sudo mkfs.ext4 -b 1024 -m 0 -F /dev/md0
    sudo mkdir -p /mnt/md0
    sudo chown -R benjamin-elias /mnt/md0
    sudo chmod -R 777 /mnt/md0
    sudo mount /dev/md0 /mnt/md0
    df -h -x devtmpfs -x tmpfs
    hardware_uid_string=$(sudo mdadm --detail --scan | sudo tee -a /etc/mdadm/mdadm.conf)
    sudo update-initramfs -u
    echo "$(echo "${hardware_uid_string}" | awk -F " " '{print $5}') /mnt/md0 ext4 defaults,nofail,discard 0 0" | sudo tee -a /etc/fstab
    sudo update-initramfs -u

    #safely move database
    sudo rsync -av /var/lib/postgresql /mnt/md0
    sudo mv /var/lib/postgresql/${folver}/main /var/lib/postgresql/${folver}/main.bak
    sudo chown -R postgres /mnt/md0/

    postgresconf="/etc/postgresql/${folver}/main/postgresql.conf"
    sudo cp -f ${postgresconf} ${postgresconf}.bak

    while read line; do
        if [[ $line == data_directory* ]]; then
          echo "data_directory = '/mnt/md0/postgresql/${folver}/main'" | sudo tee -a "${postgresconf}"
        else
          echo "${line}" | sudo tee -a "${postgresconf}"
        fi
    done <<< $(cat ${postgresconf}.bak)

    #setup ports
    sudo sed -i "s/#listen_addresses = 'localhost'/listen_addresses = '*'/" ${postgresconf}

    postgresconf="/etc/postgresql/${folver}/main/pg_hba.conf"

    while read line; do
      echo "${line}" | sudo tee -a "${postgresconf}"
      ipadress=$(echo "${line}" | awk -F " " '{print $4}')
      echo $ipadress
      ipfilter=${ipadress%%/*}
      echo $ipfilter
      sudo iptables -A INPUT -p tcp -s 0/0 --sport 1024:65535 -d ${ipfilter} --dport 5432 -m state --state NEW,ESTABLISHED -j ACCEPT
      sudo iptables -A OUTPUT -p tcp -s ${ipfilter} --sport 5432 -d 0/0 --dport 1024:65535 -m state --state ESTABLISHED -j ACCEPT
    done <<< $(cat /home/${mainuser}/UltiHash/trust_host.txt)
    #restart to load changes
    sudo systemctl start postgresql
    sudo systemctl status postgresql
    #setup firewall
    echo "$(sudo -u postgres psql --command="SHOW data_directory;")"
    sudo rm -Rf /var/lib/postgresql/${folver}/main.bak
    sudo ufw allow 5432/tcp
    sudo systemctl restart postgresql
    sudo systemctl status postgresql
  fi
}||{
  echo "Could not configure database!"
}

У меня была точно такая же проблема. Решено:

      $ sudo update-initramfs -u

с последующей перезагрузкой

Другие вопросы по тегам