mat*_*att 12 linux raid-5 mdadm
我有/dev/md127
一个由四个驱动器组成的 RAID5 阵列。我设法将它们从阵列中热移除,目前/dev/md127
没有任何驱动器:
cat /proc/mdstat Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10] md0 : active raid1 sdd1[0] sda1[1]
304052032 blocks super 1.2 [2/2] [UU]
md1 : active raid0 sda5[1] sdd5[0]
16770048 blocks super 1.2 512k chunks
md127 : active raid5 super 1.2 level 5, 512k chunk, algorithm 2 [4/0] [____]
unused devices: <none>
Run Code Online (Sandbox Code Playgroud)
和
mdadm --detail /dev/md127
/dev/md127:
Version : 1.2
Creation Time : Thu Sep 6 10:39:57 2012
Raid Level : raid5
Array Size : 8790402048 (8383.18 GiB 9001.37 GB)
Used Dev Size : 2930134016 (2794.39 GiB 3000.46 GB)
Raid Devices : 4
Total Devices : 0
Persistence : Superblock is persistent
Update Time : Fri Sep 7 17:19:47 2012
State : clean, FAILED
Active Devices : 0
Working Devices : 0
Failed Devices : 0
Spare Devices : 0
Layout : left-symmetric
Chunk Size : 512K
Number Major Minor RaidDevice State
0 0 0 0 removed
1 0 0 1 removed
2 0 0 2 removed
3 0 0 3 removed
Run Code Online (Sandbox Code Playgroud)
我试过做,mdadm --stop /dev/md127
但是:
mdadm --stop /dev/md127
mdadm: Cannot get exclusive access to /dev/md127:Perhaps a running process, mounted filesystem or active volume group?
Run Code Online (Sandbox Code Playgroud)
我确保它已卸载,umount -l /dev/md127
并确认它确实已卸载:
umount /dev/md127
umount: /dev/md127: not mounted
Run Code Online (Sandbox Code Playgroud)
我试图将每个驱动器的超级块归零,我得到(对于每个驱动器):
mdadm --zero-superblock /dev/sde1
mdadm: Unrecognised md component device - /dev/sde1
Run Code Online (Sandbox Code Playgroud)
这是输出lsof | grep md127
:
lsof|grep md127
md127_rai 276 root cwd DIR 9,0 4096 2 /
md127_rai 276 root rtd DIR 9,0 4096 2 /
md127_rai 276 root txt unknown /proc/276/exe
Run Code Online (Sandbox Code Playgroud)
我还可以做些什么?LVM 甚至没有安装,所以它不是一个因素。
经过多次摸索,我终于找到了阻止我停止阵列的原因。这是SAMBA过程。在 service smbd stop 之后,我能够停止阵列。不过这很奇怪,因为尽管该阵列是在某个时间点通过 SAMBA 挂载和共享的,但当我试图阻止它时,它已经被卸载了。
小智 7
我意识到这是一个老问题,原始海报认为是 SAMBA 是问题,但我遇到了完全相同的问题,并认为问题很可能不是 SAMBA(我实际上甚至没有 SAMBA),因为它没有'不会出现在lsof
输出中,而是当用户切换到 root 或执行 sudo 时,用户已经在 RAID 挂载点目录中。
就我而言,问题是当我的普通用户位于该安装/dev/md127
驱动器上的目录中时,我启动了我的 root shell 。
user1@comp1:/mnt/md127_content/something$ su -
root@comp1:~# umount /dev/md127
umount: /dev/md127: target is busy
Run Code Online (Sandbox Code Playgroud)
这是lsof
在我的情况下的输出:
root@comp1:root@comp1:~# lsof | grep /dev/md127
md127_rai 145 root cwd DIR 253,0 4096 2 /
md127_rai 145 root rtd DIR 253,0 4096 2 /
md127_rai 145 root txt unknown /proc/145/exe
Run Code Online (Sandbox Code Playgroud)
尽管lsof | grep md125
没有显示任何进程,但[md127_raid1]
我无法卸载/dev/md127
。虽然umount -l /dev/md127
确实隐藏/dev/md127
了 的输出mount
,但驱动器显然仍然很忙,并且在mdadm --stop /dev/md127
尝试时,会显示相同的错误:
mdadm: Cannot get exclusive access to /dev/md127:Perhaps a running process, mounted filesystem or active volume group?
Run Code Online (Sandbox Code Playgroud)
解决方案很简单:检查是否有任何登录用户仍在该驱动器上的目录中。特别是,当您的普通用户的当前目录在该驱动器上时,检查您正在使用的 root shell 是否已启动。切换到该用户 shell(也许只是exit
你的 root 应该),移动到其他地方,umount
并且mdadm --stop
将工作:
root@comp1:~# exit
user1@comp1:/mnt/md127_content/something$ cd /
user1@comp1:/$ su -
root@comp1:~# umount /dev/md127
root@comp1:~# mdadm --stop /dev/md127
mdadm: stopped /dev/md127
Run Code Online (Sandbox Code Playgroud)
如果您在 mdadm 之上使用 LVM,有时在停用卷组时 LVM 不会删除设备映射器设备。您可以手动删除它。
sudo vgdisplay
./dev/mapper/
。除了该control
文件之外,还应该有一个以您的卷组命名的 Device Mapper 设备,例如VolGroupArray-name
.sudo dmsetup remove VolGroupArray-name
(替换VolGroupArray-name
为 Device Mapper 设备的名称)。sudo mdadm --stop /dev/md0
(或设备的任何名称mdadm
)。