如何使用lvm更换软件raid中的故障磁盘

如何使用lvm更换软件raid中的故障磁盘

SuSE 12 LinuxServer 之一报告磁盘故障。幸运的是,数据库服务器具有软件 Raid,因此系统仍然正常运行。但按照建议,我们希望用新磁盘替换出现故障的磁盘,并在其上重建软件 raid。

系统信息是:

总共 4 个内部磁盘。 sda、sdb、sdc 和 sdd

fdisk 分区是:

fdisk -l 
Disk /dev/sdb: 931.5 GiB, 1000204886016 bytes, 1953525168 sectors 
Units: sectors of 1 * 512 = 512 bytes 
Sector size (logical/physical): 512 bytes / 4096 bytes 
I/O size (minimum/optimal): 4096 bytes / 4096 bytes 
Disklabel type: dos 
Disk identifier: 0x0007d757

Device    Boot   Start           End    Sectors   Size Id Type 
/dev/sdb1 *          2048    2105343    2103296     1G fd Linux raid autodetect 
/dev/sdb2         2105344   39858175   37752832    18G fd Linux raid autodetect 
/dev/sdb3        39858176 1953523711 1913665536 912.5G fd Linux raid autodetect

Disk /dev/sdc: 931.5 GiB, 1000204886016 bytes, 1953525168 sectors
Units: sectors of 1 * 512 = 512 bytes 
Sector size (logical/physical): 512 bytes / 4096 bytes 
I/O size (minimum/optimal): 4096 bytes / 4096 bytes 
Disklabel type: dos 
Disk identifier: 0x000a0e8a

Device    Boot Start        End Sectors      Size Id Type 
/dev/sdc1       2048 1953523711 1953521664 931.5G fd Linux raid autodetect

Disk /dev/sdd: 931.5 GiB, 1000204886016 bytes, 1953525168 sectors
Units: sectors of 1 * 512 = 512 bytes 
Sector size (logical/physical): 512 bytes / 4096 bytes 
I/O size (minimum/optimal): 4096 bytes / 4096 bytes 
Disklabel type: dos 
Disk identifier: 0x000caaad

Device    Boot Start        End    Sectors Size   Id Type 
/dev/sdd1       2048 1953523711 1953521664 931.5G fd Linux raid autodetect

软件 RAID --> sda + sdb(sda 是故障磁盘) 软件 RAID --> sdb + sdc

DBServer# cat /proc/mdstat 
Personalities : [raid1] 

md3 : active raid1 sdc1[0] sdd1[1] 976760640 blocks super 1.0 [2/2] [UU] bitmap: 2/8 pages [8KB], 65536KB chunk

md0 : active raid1 sdb1[1] sda10 1051584 blocks super 1.0 [2/1] [_U] bitmap: 1/1 pages [4KB], 65536KB chunk

md2 : active raid1 sdb3[1] sda30 956832576 blocks super 1.0 [2/1] [_U] bitmap: 2/8 pages [8KB], 65536KB chunk

md1 : active raid1 sdb2[1] sda20 18876288 blocks super 1.0 [2/1] [_U]  bitmap: 0/1 pages [0KB], 65536KB chunk 

unused devices:

所以 md0、md1 和 md2 发生故障的设备即 sda1、sda2 和 sda3

请注意,它还定义了 2 个 VG,如下所示,

1 VG - 系统 (/dev/md2) 2 VG - ora_db (/dev/md3)

pvdisplay
--- Physical volume --- 
PV Name /dev/md3 
VG Name ora_db 
PV Size 931.51 GiB / not usable 3.81 MiB 
Allocatable yes 
PE Size 4.00 MiB 
Total PE 238466 
Free PE 84866 
Allocated PE 153600 
PV UUID vgPdWQ-x6CW-vvdF-moxh-FKyb-wpSU-NdJqSm

--- Physical volume --- 
PV Name /dev/md2 
VG Name system 
PV Size 912.51 GiB / not usable 2.81 MiB 
Allocatable yes 
PE Size 4.00 MiB 
Total PE 233601 
Free PE 182401 
Allocated PE 51200 
PV UUID rdff2n-ztxd-lcBY-nAqk-8O9u-fnFG-BVI91v

grub.conf 显示:(相关部分)

if [ x$feature_default_font_path = xy ] ; then
  font=unicode 
else
  insmod part_msdos msdos 
  insmod diskfilter mdraid1x lvm 
  insmod ext2 
  set root='lvmid/m7AEp0-79EG-D2Vi-ELzE-BTzh-C8mN-CLxrpz/S0eZEl-PlBX-E1ZL-oCwL-SmUx-4Qe4-Mz9NHX'
  if [ x$feature_platform_search_hint = xy ]; then 
    search --no-floppy --fs-uuid --set=root --hint='lvmid/m7AEp0-79EG-D2Vi-ELzE-BTzh-C8mN-CLxrpz/S0eZEl-PlBX-E1ZL-oCwL-SmUx-4Qe4-Mz9NHX' 7c2e3a9c-5f5b-47e3-8a0a-d1e66f12747c 
  else 
    search --no-floppy --fs-uuid --set=root 7c2e3a9c-5f5b-47e3-8a0a-d1e66f12747c 
  fi 
  font="/share/grub2/unicode.pf2" 
fi

if loadfont $font ; then 
  set gfxmode=auto 
  load_video 
  insmod gfxterm
  set locale_dir=$prefix/locale 
  set lang=POSIX 
  insmod gettext 
fi
terminal_output gfxterm 
insmod part_msdos msdos 
insmod diskfilter mdraid1x 
insmod ext2 
set root='mduuid/531cd341e2c7d5a71c542ad04d9ea589' 
if [ x$feature_platform_search_hint = xy ]; then 
  search --no-floppy --fs-uuid --set=root --hint='mduuid/531cd341e2c7d5a71c542ad04d9ea589' 96c11697-c3b7-4f11-90fc-3aef207db526 
else 
  search --no-floppy --fs-uuid --set=root 96c11697-c3b7-4f11-90fc-3aef207db526 
fi

Quote: 遵循的程序应该是这样的,

首先我们将 /dev/sda1 标记为失败:

mdadm --manage /dev/md0 --fail /dev/sda1

然后我们从 /dev/md0 中删除 /dev/sda1:

mdadm --manage /dev/md0 --remove /dev/sda1

现在我们对 /dev/sda2 和 sda3 再次执行相同的步骤(它是 /dev/md1 和 /dev/md2 的一部分)

然后关闭系统电源:

shutdown -h now 

并将旧的 /dev/sdb 硬盘更换为新硬盘

插入新的 SATA 磁盘 /dev/sda 后,启动系统。

然后我们创建与 /dev/sda 完全相同的分区。我们可以通过一个简单的命令来做到这一点:

sfdisk -d /dev/sdb | sfdisk /dev/sda

检查两个磁盘是否具有相同的分区 (fdisk -l) 8.接下来,我们将 /dev/sda1 添加到 /dev/md0,将 /dev/sda2 添加到 /dev/md1,将 /dev/sda3 添加到 /dev/md3:

mdadm --manage /dev/md0 --add /dev/sda1 mdadm --manage /dev/md1 --add /dev/sda2 mdadm --manage /dev/md2 --add /dev/sda3

确认同步正在进行中

cat /proc/mdstat

如果我错过了什么,请告诉我。我想有两个要点是,在这种情况下我应该如何处理lvm和grub。

我是否需要做一些额外的事情来处理它,或者命令sfdisk -d /dev/sdb | sfdisk /dev/sda也应该处理 LVM。

在这种情况下我应该如何处理grub? grun.conf 显示了与 LVM 和 MDADM 相关的条目。在关闭系统之前我需要在这里更改任何内容吗?

我知道系统有 2 个指针来处理 mdadm+lvm。其中有复杂的事情。否则设置全新的系统会更容易吗?

还没有尝试过任何东西。仅收集信息。

grub配置文件

### BEGIN /etc/grub.d/00_header ###
if [ -f ${config_directory}/grubenv ]; then
  load_env -f ${config_directory}/grubenv
elif [ -s $prefix/grubenv ]; then
  load_env
fi

if [ "${env_block}" ] ; then
  load_env -f "${env_block}"
fi

if [ "${next_entry}" ] ; then
   set default="${next_entry}"
   set next_entry=
   save_env next_entry
   if [ "${env_block}" ] ; then
     save_env -f "${env_block}" next_entry
   fi
   set boot_once=true
else
   set default="${saved_entry}"
fi

if [ x"${feature_menuentry_id}" = xy ]; then
  menuentry_id_option="--id"
else
  menuentry_id_option=""
fi

export menuentry_id_option

if [ "${prev_saved_entry}" ]; then
  set saved_entry="${prev_saved_entry}"
  save_env saved_entry
  set prev_saved_entry=
  save_env prev_saved_entry
  set boot_once=true
fi

function savedefault {
  if [ -z "${boot_once}" ]; then
    saved_entry="${chosen}"
    save_env saved_entry
  fi
}

function load_video {
  if [ x$feature_all_video_module = xy ]; then
    insmod all_video
  else
    insmod efi_gop
    insmod efi_uga
    insmod ieee1275_fb
    insmod vbe
    insmod vga
    insmod video_bochs
    insmod video_cirrus
  fi
}

if [ x$feature_default_font_path = xy ] ; then
   font=unicode
else
insmod part_msdos msdos
insmod diskfilter mdraid1x lvm
insmod ext2
set root='lvmid/m7AEp0-79EG-D2Vi-ELzE-BTzh-C8mN-CLxrpz/S0eZEl-PlBX-E1ZL-oCwL-SmUx-4Qe4-Mz9NHX'
if [ x$feature_platform_search_hint = xy ]; then
  search --no-floppy --fs-uuid --set=root --hint='lvmid/m7AEp0-79EG-D2Vi-ELzE-BTzh-C8mN-CLxrpz/S0eZEl-PlBX-E1ZL-oCwL-SmUx-4Qe4-Mz9NHX'  7c2e3a9c-5f5b-47e3-8a0a-d1e66f12747c
else
  search --no-floppy --fs-uuid --set=root 7c2e3a9c-5f5b-47e3-8a0a-d1e66f12747c
fi
    font="/share/grub2/unicode.pf2"
fi

if loadfont $font ; then
  set gfxmode=auto
  load_video
  insmod gfxterm
  set locale_dir=$prefix/locale
  set lang=POSIX
  insmod gettext
fi
terminal_output gfxterm
insmod part_msdos msdos
insmod diskfilter mdraid1x
insmod ext2
set root='mduuid/531cd341e2c7d5a71c542ad04d9ea589'
if [ x$feature_platform_search_hint = xy ]; then
  search --no-floppy --fs-uuid --set=root --hint='mduuid/531cd341e2c7d5a71c542ad04d9ea589'  96c11697-c3b7-4f11-90fc-3aef207db526
else
  search --no-floppy --fs-uuid --set=root 96c11697-c3b7-4f11-90fc-3aef207db526
fi
insmod gfxmenu
loadfont ($root)/grub2/themes/SLE/DejaVuSans-Bold14.pf2
loadfont ($root)/grub2/themes/SLE/DejaVuSans10.pf2
loadfont ($root)/grub2/themes/SLE/DejaVuSans12.pf2
loadfont ($root)/grub2/themes/SLE/ascii.pf2
insmod png
set theme=($root)/grub2/themes/SLE/theme.txt
export theme
if [ x${boot_once} = xtrue ]; then
  set timeout=0
elif [ x$feature_timeout_style = xy ] ; then
  set timeout_style=menu
  set timeout=8
# Fallback normal timeout code in case the timeout_style feature is
# unavailable.
else
  set timeout=8
fi
### END /etc/grub.d/00_header ###

### BEGIN /etc/grub.d/10_linux ###
menuentry 'SLES12'  --class sles12 --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-690785da-f0f0-4250-b693-5a008acbba10' {
        load_video
        set gfxpayload=keep
        insmod gzio
        insmod part_msdos msdos
        insmod diskfilter mdraid1x
        insmod ext2
        set root='mduuid/531cd341e2c7d5a71c542ad04d9ea589'
        if [ x$feature_platform_search_hint = xy ]; then
          search --no-floppy --fs-uuid --set=root --hint='mduuid/531cd341e2c7d5a71c542ad04d9ea589'  96c11697-c3b7-4f11-90fc-3aef207db526
        else
          search --no-floppy --fs-uuid --set=root 96c11697-c3b7-4f11-90fc-3aef207db526
        fi
        echo    'Loading Linux 3.12.28-4-default ...'
        linux   /vmlinuz-3.12.28-4-default root=UUID=690785da-f0f0-4250-b693-5a008acbba10   resume=/dev/md1 splash=silent quiet crashkernel=232M-:116M  showopts
        echo    'Loading initial ramdisk ...'
        initrd  /initrd-3.12.28-4-default
}
submenu 'Advanced options for SLES12' --hotkey=1 $menuentry_id_option 'gnulinux-advanced-690785da-f0f0-4250-b693-5a008acbba10' {
        menuentry 'SLES12, with Linux 3.12.28-4-default' --hotkey=2 --class sles12 --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-3.12.28-4-default-advanced-690785da-f0f0-4250-b693-

5a008acbba10' {
                load_video
                set gfxpayload=keep
                insmod gzio
                insmod part_msdos msdos
                insmod diskfilter mdraid1x
                insmod ext2
                set root='mduuid/531cd341e2c7d5a71c542ad04d9ea589'
                if [ x$feature_platform_search_hint = xy ]; then
                  search --no-floppy --fs-uuid --set=root --hint='mduuid/531cd341e2c7d5a71c542ad04d9ea589'  96c11697-c3b7-4f11-90fc-3aef207db526
                else
                  search --no-floppy --fs-uuid --set=root 96c11697-c3b7-4f11-90fc-3aef207db526
                fi
                echo    'Loading Linux 3.12.28-4-default ...'
                linux   /vmlinuz-3.12.28-4-default root=UUID=690785da-f0f0-4250-b693-5a008acbba10   resume=/dev/md1 splash=silent quiet crashkernel=232M-:116M  showopts
                echo    'Loading initial ramdisk ...'
                initrd  /initrd-3.12.28-4-default
        }
        menuentry 'SLES12, with Linux 3.12.28-4-default (recovery mode)' --hotkey=3 --class sles12 --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-3.12.28-4-default-recovery-

690785da-f0f0-4250-b693-5a008acbba10' {
                load_video
                set gfxpayload=keep
                insmod gzio
                insmod part_msdos msdos
                insmod diskfilter mdraid1x
                insmod ext2
                set root='mduuid/531cd341e2c7d5a71c542ad04d9ea589'
                if [ x$feature_platform_search_hint = xy ]; then
                  search --no-floppy --fs-uuid --set=root --hint='mduuid/531cd341e2c7d5a71c542ad04d9ea589'  96c11697-c3b7-4f11-90fc-3aef207db526
                else
                  search --no-floppy --fs-uuid --set=root 96c11697-c3b7-4f11-90fc-3aef207db526
                fi
                echo    'Loading Linux 3.12.28-4-default ...'
                linux   /vmlinuz-3.12.28-4-default root=UUID=690785da-f0f0-4250-b693-5a008acbba10  showopts apm=off noresume edd=off powersaved=off nohz=off highres=off processor.max_cstate=1 nomodeset 

x11failsafe crashkernel=232M-:116M
                echo    'Loading initial ramdisk ...'
                initrd  /initrd-3.12.28-4-default
        }
}

### END /etc/grub.d/10_linux ###

### BEGIN /etc/grub.d/20_linux_xen ###
### END /etc/grub.d/20_linux_xen ###

### BEGIN /etc/grub.d/20_memtest86+ ###
### END /etc/grub.d/20_memtest86+ ###

### BEGIN /etc/grub.d/30_os-prober ###
### END /etc/grub.d/30_os-prober ###

### BEGIN /etc/grub.d/40_custom ###
# This file provides an easy way to add custom menu entries.  Simply type the
# menu entries you want to add after this comment.  Be careful not to change
# the 'exec tail' line above.
### END /etc/grub.d/40_custom ###

### BEGIN /etc/grub.d/41_custom ###
if [ -f  ${config_directory}/custom.cfg ]; then
  source ${config_directory}/custom.cfg
elif [ -z "${config_directory}" -a -f  $prefix/custom.cfg ]; then
  source $prefix/custom.cfg;
fi
### END /etc/grub.d/41_custom ###

### BEGIN /etc/grub.d/80_suse_btrfs_snapshot ###
### END /etc/grub.d/80_suse_btrfs_snapshot ###

### BEGIN /etc/grub.d/90_persistent ###
### END /etc/grub.d/90_persistent ###

我确实在 /dev/sdb 上安装了 grub。请找到输出。

# grub2-install /dev/sdb
Installing for i386-pc platform.
error: cannot read `/dev/sda': Input/output error.
error: cannot read `/dev/sda': Input/output error.
error: cannot read `/dev/sda': Input/output error.
error: cannot read `/dev/sda': Input/output error.
error: cannot read `/dev/sda': Input/output error.
grub2-install: warning: Couldn't find physical volume `(null)'. Some modules may be missing from core image..
error: cannot read `/dev/sda': Input/output error.
error: cannot read `/dev/sda': Input/output error.
error: cannot read `/dev/sda': Input/output error.
error: cannot read `/dev/sda': Input/output error.
error: cannot read `/dev/sda': Input/output error.
grub2-install: warning: Couldn't find physical volume `(null)'. Some modules may be missing from core image..
Installation finished. No error reported.

但不知道为什么会出现 sda 错误。

然后再次使用以下命令进行交叉检查。

  # dd bs=512 count=1 if=/dev/sdb 2>/dev/null| strings
    ZRr=
    `|f
    \|f1
    GRUB
    Geom
    Hard Disk
    Read
     Error

答案1

LVM使用/dev/md*设备,各个/dev/sd*设备被软件RAID锁定以进行独占访问。当 RAID 运行时,LVM 不关心/dev/sd*属于软件 RAID 阵列的设备。

因此,只要任何 RAID 阵列的两半不会同时发生故障,您无需为 LVM 执行任何操作。

另一方面,GRUB 则是另一回事。由于软件 RAID 仅镜像 RAID 组件分区内的内容,因此 RAID 不会复制主引导记录以及嵌入 MBR 和第一个分区开头之间的 GRUB 部分。不过,这很容易解决:只需运行grub-install /dev/sdagrub-install /dev/sdb确保系统磁盘的两个副本都有有效的引导加载程序。

您的grub.conf代码片段包含对lvmid和 的引用mduuid,因此看起来它已经适合 RAID 使用。

这个问题了解更多信息。这是您在设置软件镜像系统磁盘时应该已经完成​​的步骤。

但是,如果您最初错过了此步骤,或者您甚至有点不确定,grub-install /dev/sdb那么在重新启动系统之前立即运行可能是明智的选择,以确保系统磁盘的辅助副本(现在是唯一剩余的良好副本) )实际上上面有一个引导加载程序。

要测试 GRUB 是否安装在您的 上/dev/sdb,您可以运行以下命令:

dd if=/dev/sdb bs=512 count=1 2>/dev/null | od -t x1z -A x

如果响应表明 MBR 开头到字节 0x1c0 之间的字节为零,则 GRUB 肯定没有安装在 /dev/sdb 上。

没有 GRUB 的输出示例:

000000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  >................<
*
0001c0 02 00 ee fe bf 66 01 00 00 00 ff ff ff ff 00 00  >.....f..........<
0001d0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  >................<
*
0001f0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 aa  >..............U.<
000200

请注意,第一行全为零,并且直到 0001c0 的其他行都被省略od(用星号标记),因为它们也全为零。

如果安装了 GRUB,您应该在 0001c0 之前看不到全零行,并且GRUB在右侧的文本模式表示中的某处应该有一个可见的字符串。

安装 GRUB 后的输出示例:

000000 eb 63 90 10 8e d0 bc 00 b0 b8 00 00 8e d8 8e c0  >.c..............<
000010 fb be 00 7c bf 00 06 b9 00 02 f3 a4 ea 21 06 00  >...|.........!..<
000020 00 be be 07 38 04 75 0b 83 c6 10 81 fe fe 07 75  >....8.u........u<
000030 f3 eb 16 b4 02 b0 01 bb 00 7c b2 80 8a 74 01 8b  >.........|...t..<
000040 4c 02 cd 13 ea 00 7c 00 00 eb fe 00 00 00 00 00  >L.....|.........<
000050 00 00 00 00 00 00 00 00 00 00 00 80 01 00 00 00  >................<
000060 00 00 00 00 ff fa 90 90 f6 c2 80 74 05 f6 c2 70  >...........t...p<
000070 74 02 b2 80 ea 79 7c 00 00 31 c0 8e d8 8e d0 bc  >t....y|..1......<
000080 00 20 fb a0 64 7c 3c ff 74 02 88 c2 52 be 80 7d  >. ..d|<.t...R..}<
000090 e8 17 01 be 05 7c b4 41 bb aa 55 cd 13 5a 52 72  >.....|.A..U..ZRr<
0000a0 3d 81 fb 55 aa 75 37 83 e1 01 74 32 31 c0 89 44  >=..U.u7...t21..D<
0000b0 04 40 88 44 ff 89 44 02 c7 04 10 00 66 8b 1e 5c  >[email protected]..\<
0000c0 7c 66 89 5c 08 66 8b 1e 60 7c 66 89 5c 0c c7 44  >|f.\.f..`|f.\..D<
0000d0 06 00 70 b4 42 cd 13 72 05 bb 00 70 eb 76 b4 08  >..p.B..r...p.v..<
0000e0 cd 13 73 0d 5a 84 d2 0f 83 d8 00 be 8b 7d e9 82  >..s.Z........}..<
0000f0 00 66 0f b6 c6 88 64 ff 40 66 89 44 04 0f b6 d1  >[email protected]....<
000100 c1 e2 02 88 e8 88 f4 40 89 44 08 0f b6 c2 c0 e8  >[email protected]......<
000110 02 66 89 04 66 a1 60 7c 66 09 c0 75 4e 66 a1 5c  >.f..f.`|f..uNf.\<
000120 7c 66 31 d2 66 f7 34 88 d1 31 d2 66 f7 74 04 3b  >|f1.f.4..1.f.t.;<
000130 44 08 7d 37 fe c1 88 c5 30 c0 c1 e8 02 08 c1 88  >D.}7....0.......<
000140 d0 5a 88 c6 bb 00 70 8e c3 31 db b8 01 02 cd 13  >.Z....p..1......<
000150 72 1e 8c c3 60 1e b9 00 01 8e db 31 f6 bf 00 80  >r...`......1....<
000160 8e c6 fc f3 a5 1f 61 ff 26 5a 7c be 86 7d eb 03  >......a.&Z|..}..<
000170 be 95 7d e8 34 00 be 9a 7d e8 2e 00 cd 18 eb fe  >..}.4...}.......<
000180 47 52 55 42 20 00 47 65 6f 6d 00 48 61 72 64 20  >GRUB .Geom.Hard <
000190 44 69 73 6b 00 52 65 61 64 00 20 45 72 72 6f 72  >Disk.Read. Error<
0001a0 0d 0a 00 bb 01 00 b4 0e cd 10 ac 3c 00 75 f4 c3  >...........<.u..<
0001b0 00 00 00 00 00 00 00 00 23 c1 00 00 00 00 80 20  >........#...... <
0001c0 21 00 8e fe ff ff 00 08 00 00 00 f8 ff 00 00 00  >!...............<
0001d0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  >................<
*
0001f0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 aa  >..............U.<
000200

在软件 RAID 系统磁盘上安装引导加载程序总是很棘手,因此我建议软件 RAID 系统的管理员了解如何使用安装介质的救援引导选项。以下是 SuSE 11 和 12 上救援启动的官方说明

在这种情况下,如果系统在移除故障磁盘后无法启动,则需要先执行该文档中的步骤,然后运行(因为在故障磁盘被移除后,grub-install /dev/sda可能会检测到 RAID 集的剩余一半)/dev/sda已删除)。

相关内容