- RAID1 is read-only after upgrade to Ubuntu 17.10
- New md array is auto-read-only and has resync=PENDING
- mdadm
- Примеры использования mdadm
- Отсканировать устройства и собрать массивы (после взлета с live CD)
- Переименовать /dev/md127 в /dev/md0
- Собрать массив вручную
- Остановить массив
- Заменить диск в массиве
- Собрать raid1 с одним диском
- Потом добавим второй диск
- Массив в режиме auto-read-only
- Изменение hostname
RAID1 is read-only after upgrade to Ubuntu 17.10
I’m stumped. I had a perfectly functioning RAID1 setup on 16.10. After upgrading to 17.10, it auto-magically detected the array and re-created md0. All my files are fine, but when I mount md0, it says that the array is read-only:
cat /proc/mdstat Personalities : [raid1] md0 : active (read-only) raid1 dm-0[0] dm-1[1] 5860390464 blocks super 1.2 [2/2] [UU] bitmap: 0/44 pages [0KB], 65536KB chunk unused devices: sudo mdadm --detail /dev/md0 /dev/md0: Version : 1.2 Creation Time : Sat Jul 9 23:54:40 2016 Raid Level : raid1 Array Size : 5860390464 (5588.90 GiB 6001.04 GB) Used Dev Size : 5860390464 (5588.90 GiB 6001.04 GB) Raid Devices : 2 Total Devices : 2 Persistence : Superblock is persistent Intent Bitmap : Internal Update Time : Sat Nov 4 23:16:18 2017 State : clean Active Devices : 2 Working Devices : 2 Failed Devices : 0 Spare Devices : 0 Name : x6:0 (local to host x6) UUID : baaccfeb:860781dd:eda253ba:6a08916f Events : 11596 Number Major Minor RaidDevice State 0 253 0 0 active sync /dev/dm-0 1 253 1 1 active sync /dev/dm-1
sudo mdadm --stop /dev/md0 sudo mdadm --assemble --scan
I do not understand why it worked perfectly before, but now the array is read-only for no reason I can detect. And this is the same array that auto-magically re-assembled when I upgraded from 16.04 to 16.10. Researching the problem, I found a post about the problem being /sys mounted read-only, which mine indeed is:
ls -ld /sys dr-xr-xr-x 13 root root 0 Nov 5 22:28 /sys
sudo mount -o remount,rw /sys sudo mount -o remount,rw -t sysfs sysfs /sys ls -ld /sys dr-xr-xr-x 13 root root 0 Nov 5 22:29 /sys
# mdadm.conf # # !NB! Run update-initramfs -u after updating this file. # !NB! This will ensure that initramfs has an uptodate copy. # # 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 # automatically tag new arrays as belonging to the local system HOMEHOST # instruct the monitoring daemon where to send mail alerts MAILADDR root # definitions of existing MD arrays ARRAY /dev/md/0 metadata=1.2 UUID=baaccfeb:860781dd:eda253ba:6a08916f name=x6:0 # This configuration was auto-generated on Sun, 05 Nov 2017 15:37:16 -0800 by mkconf
ls -l /dev/dm-* brw-rw---- 1 root disk 253, 0 Nov 5 16:28 /dev/dm-0 brw-rw---- 1 root disk 253, 1 Nov 5 16:28 /dev/dm-1
And something else that Ubuntu or Debian has changed; I have no idea what these osprober files are doing here. I thought they were only used at installation time:
ls -l /dev/mapper/ total 0 crw------- 1 root root 10, 236 Nov 5 15:34 control lrwxrwxrwx 1 root root 7 Nov 5 16:28 osprober-linux-sdb1 -> ../dm-0 lrwxrwxrwx 1 root root 7 Nov 5 16:28 osprober-linux-sdc1 -> ../dm-1
sudo parted -l Model: ATA SanDisk Ultra II (scsi) Disk /dev/sda: 960GB Sector size (logical/physical): 512B/512B Partition Table: gpt Disk Flags: Number Start End Size File system Name Flags 1 1049kB 81.9GB 81.9GB ext4 2 81.9GB 131GB 49.2GB linux-swap(v1) 3 131GB 131GB 99.6MB fat32 boot, esp 4 131GB 960GB 829GB ext4 Model: ATA WDC WD60EZRZ-00R (scsi) Disk /dev/sdb: 6001GB Sector size (logical/physical): 512B/4096B Partition Table: gpt Disk Flags: Number Start End Size File system Name Flags 1 1049kB 6001GB 6001GB raid Model: ATA WDC WD60EZRZ-00R (scsi) Disk /dev/sdc: 6001GB Sector size (logical/physical): 512B/4096B Partition Table: gpt Disk Flags: Number Start End Size File system Name Flags 1 1049kB 6001GB 6001GB raid Error: /dev/mapper/osprober-linux-sdc1: unrecognised disk label Model: Linux device-mapper (linear) (dm) Disk /dev/mapper/osprober-linux-sdc1: 6001GB Sector size (logical/physical): 512B/4096B Partition Table: unknown Disk Flags: Error: /dev/mapper/osprober-linux-sdb1: unrecognised disk label Model: Linux device-mapper (linear) (dm) Disk /dev/mapper/osprober-linux-sdb1: 6001GB Sector size (logical/physical): 512B/4096B Partition Table: unknown Disk Flags: Model: Linux Software RAID Array (md) Disk /dev/md0: 6001GB Sector size (logical/physical): 512B/4096B Partition Table: loop Disk Flags: Number Start End Size File system Flags 1 0.00B 6001GB 6001GB ext4
$ sudo dmsetup table osprober-linux-sdc1: 0 11721043087 linear 8:33 0 osprober-linux-sdb1: 0 11721043087 linear 8:17 0 $ sudo dmsetup info Name: osprober-linux-sdc1 State: ACTIVE (READ-ONLY) Read Ahead: 256 Tables present: LIVE Open count: 1 Event number: 0 Major, minor: 253, 1 Number of targets: 1 Name: osprober-linux-sdb1 State: ACTIVE (READ-ONLY) Read Ahead: 256 Tables present: LIVE Open count: 1 Event number: 0 Major, minor: 253, 0 Number of targets: 1
openat(AT_FDCWD, "/dev/md0", O_RDONLY) = 3 fstat(3, ) = 0 ioctl(3, RAID_VERSION, 0x7fffb3813574) = 0 fstat(3, ) = 0 ioctl(3, RAID_VERSION, 0x7fffb38134c4) = 0 ioctl(3, RAID_VERSION, 0x7fffb38114bc) = 0 fstat(3, ) = 0 readlink("/sys/dev/block/9:0", "../../devices/virtual/block/md0", 199) = 31 openat(AT_FDCWD, "/sys/block/md0/md/metadata_version", O_RDONLY) = 4 read(4, "1.2\n", 4096) = 4 close(4) = 0 openat(AT_FDCWD, "/sys/block/md0/md/level", O_RDONLY) = 4 read(4, "raid1\n", 4096) = 6 close(4) = 0 ioctl(3, GET_ARRAY_INFO, 0x7fffb3813580) = 0 ioctl(3, RESTART_ARRAY_RW, 0) = -1 EROFS (Read-only file system) write(2, "mdadm: failed to set writable fo". 66mdadm: failed to set writable for /dev/md0: Read-only file system ) = 66
New md array is auto-read-only and has resync=PENDING
~ # cat /proc/mdstat Personalities : [raid1] md1 : active (auto-read-only) raid1 sde1[1] sdd1[0] 976630336 blocks super 1.2 [2/2] [UU] resync=PENDING md0 : active raid1 sdb1[0] sdc1[1] 1953511936 blocks [2/2] [UU] unused devices:
~ # mdadm --readwrite /dev/md1 ~ # cat /proc/mdstat Personalities : [raid1] md1 : active raid1 sde1[1] sdd1[0] 976630336 blocks super 1.2 [2/2] [UU] [>. ] resync = 0.0% (54400/976630336) finish=598.2min speed=27200K/sec md0 : active raid1 sdb1[0] sdc1[1] 1953511936 blocks [2/2] [UU] unused devices:
But I still would like to know what is going on here, and I can’t find any real information about that. Does anyone know why the array defaults to this state? EDIT: added dmesg output:
~ # grep kernel /var/log/syslog.1 Nov 13 10:03:44 iserv kernel: [160446.860113] e1000: eth1 NIC Link is Down Nov 13 10:04:48 iserv kernel: [160511.017666] e1000: eth1 NIC Link is Up 1000 Mbps Full Duplex, Flow Control: RX/TX Nov 13 20:12:40 iserv kernel: [196982.775186] sda: sda1 Nov 13 20:12:59 iserv kernel: [197001.598187] sdd: sdd1 Nov 13 20:13:13 iserv kernel: [197016.344939] sde: sde1 Nov 13 20:14:05 iserv kernel: [197067.520825] md: bind Nov 13 20:14:05 iserv kernel: [197067.521263] md: bind Nov 13 20:14:05 iserv kernel: [197067.670215] md/raid1:md1: not clean -- starting background reconstruction Nov 13 20:14:05 iserv kernel: [197067.670219] md/raid1:md1: active with 2 out of 2 mirrors Nov 13 20:14:05 iserv kernel: [197067.670246] md1: detected capacity change from 0 to 1000069464064 Nov 13 20:14:05 iserv kernel: [197067.675101] md1: unknown partition table Nov 13 20:24:10 iserv kernel: [197672.572128] md: md1 switched to read-write mode. Nov 13 20:24:10 iserv kernel: [197672.572269] md: resync of RAID array md1 Nov 13 20:24:10 iserv kernel: [197672.572273] md: minimum _guaranteed_ speed: 1000 KB/sec/disk. Nov 13 20:24:10 iserv kernel: [197672.572275] md: using maximum available idle IO bandwidth (but not more than 200000 KB/sec) for resync. Nov 13 20:24:10 iserv kernel: [197672.572280] md: using 128k window, over a total of 976630336k.
mdadm
mdadm — утилита для управления программными RAID-массивами в Linux.
Примеры использования mdadm
Описаны также особенности работы с массивами.
Отсканировать устройства и собрать массивы (после взлета с live CD)
Переименовать /dev/md127 в /dev/md0
Отредактируйте /etc/mdadm.conf, затем остановите массив и соберите его заново.
mdadm -A /dev/md0 --update=super-minor /dev/sda1 /dev/sdb1
Учтите, что в образе initrd остался прежний /etc/mdadm.conf, поэтому нужно пересобрать initrd:
Собрать массив вручную
Остановить массив
Заменить диск в массиве
mdadm /dev/md0 --fail /dev/sda1 mdadm /dev/md0 --remove /dev/sda1 mdadm /dev/md0 --add /dev/sda1
Собрать raid1 с одним диском
Иногда при миграции на raid1 бывает нужно.
mdadm -C --level=1 -e0.9 --raid-devices=2 /dev/sdb1 missing
Можно сделать и массив с числом дисков «1»:
mdadm -C --raid-devices=1 -e0.9 --level=1 --force /dev/md/space1000 /dev/sdc1
Внимание. Если массив будет содержать /boot (в виде отдельной файловой системы, или в составе /), то версия метаданных должна быть 0.9 (в GRUB второй версии это требование снято, но лучше не рисковать).
Потом добавим второй диск
Если массив был создан с числом дисков 2 и вторым «missing», второй диск добавляем одной командой:
Массив в режиме auto-read-only
Если после перезагрузки какой-то массив оказался в режиме read-only, причём /proc/mdstat содержит строки вида:
md126 : active (auto-read-only) raid1 sdb6[0] sda6[1] 458209216 blocks [2/2] [UU]
Это означает, что вы забыли:
Изменение hostname
Грузимся с Live CD в режиме восстановления (например с Server Light) Массивы RAID соберутся с именами md127, md126 и т. д., т. к. hostname = localhost and != старое_имя
Останавливаем все массивы:
for m in /dev/md1[12][0-7]; do mdadm -S $m done
Cобираем массивы со старым именем:
mdadm -A --homehost=старое_имя --scan
Cмотрим, что все собралось:
Подготавливаемся к переименованию. Добавляем информацию в /etc/mdadm.conf
echo "HOMEHOST новое_имя" >> /etc/mdadm.conf mdadm -D --scan >> /etc/mdadm.conf cat /etc/mdadm.conf MAILADDR root@localhost PROGRAM /sbin/mdadm-syslog-events DEVICE partitions HOMEHOST новое_имя ARRAY /dev/md/0 metadata=0.90 UUID=edd10aa9:b2be5d13:bfe78010:bc810f04 ARRAY /dev/md/1 metadata=1.2 name=:1 UUID=137c3ff2:9aefae7b:ee71cb74:442e0b4e
В метаданных версии 0.9 информация о homehost хранится в UUID рэйда. Необходимо из /etc/mdadm.conf удалить параметр UUID и добавить информацию о всех устройствах, которые используются в массивах.
В метаданных версии 1.2 информация о homehost храниться в поле name. Необходимо просто удалить параметр name. После изменений должно выглядеть примерно так:
cat /etc/mdadm.conf MAILADDR root@localhost PROGRAM /sbin/mdadm-syslog-events DEVICE partitions HOMEHOST новое_имя ARRAY /dev/md0 metadata=0.90 devices=/dev/sdb ARRAY /dev/md1 metadata=1.2 UUID=137c3ff2:9aefae7b:ee71cb74:442e0b4e
Cобираем массивы версии 0.9 под новое имя:
mdadm -S /dev/md0 mdadm --verbose -A /dev/md0 --update=uuid --scan
Cобираем рэйды версии 1.2 под новое имя:
mdadm -S /dev/md1 mdadm --verbose -A /dev/md1 --update=name --scan
mdadm -D /dev/md0 | grep UUID
UUID : f09038d2:80fbe89e:e76927ce:3fd4fe03 (local to host новое_имя)
mdadm -D /dev/md1 | grep UUID
Name : новое_имя:1 (local to host новое_имя)
Если всё так, то mdadm уже по суперблокам сможет определить, какое устройство в каком массиве.
mdadm -S /dev/md0 mdadm -S /dev/md1 mdadm -A --homehost=новое_имя --scan cat /proc/mdstat Personalities : [raid1] md0 : active raid1 sdb2[0] 194496 blocks [2/1] [U_] md1 : active raid1 sdb3[0] 34147200 blocks super 1.2 [2/1] [U_]
Если hostname будет новое_имя, т.е. уже на реальной машине, определение будет проходить полностью автоматически
Но при загрузке будет смотреть на HOMEHOST в /etc/mdadm.conf т.к. homehost ему ещё не известен.
Если в реальном рабочем mdadm.conf были данные об этих массивах, но со старым именем, то его необходимо изменить. Внести в него данные из вывода:
который уже будет содержать новые данные.
Монтируем систему и вносим изменения в initrd
mount-system chroot /mnt/system1
Изменяем в /etc/sysconfig/network переменную HOSTNAME=
echo "homehost " >> /etc/mdadm.conf mdadm -D --scan >> /etc/mdadm.conf (и в нем удаляем старые ARRAY) make-initrd -k (смотрим в ls -1 /lib/modules)
P.S. если корень на raid v1.2 то
apt-get install make-initrd-mdadm echo " FEATURES += mdadm" >> /etc/initrd.mk make-initrd