从容器里umount 一个/dev/rbd设备

本文探讨了Docker默认挂载方式MountFlags=slave导致的Kubernetes状态集迁移失败问题,特别是在从一个节点迁移到另一个节点时,由于节点监控工具Node-Exporter无法同步主机上的挂载信息变化,导致StatefulSet迁移失败。
部署运行你感兴趣的模型镜像

背景:

  (1) 我们的平台docker默认的挂载方式是MountFlags=slave, 该挂载方式的一个特性是:一旦某个container的以这种方式挂载后启动后,则host节点的信息变动,不会再同步到container里

        (2) 因为节点监控数据采集工具node-exporter, 需要挂载host节点的根目录,若以MountFlags=slave的方式挂载,会导致节点上的mount信息变动,不会同步到node-exporter.

  (3) 其中一个影响是一个statefulset若从节点node-1迁移到node-2,会先umount 该statefulset在node-1上的rbd设备,并mount到node-2上.但结果会报错:

  Warning  FailedMount            25m (x34 over 1h)  kubelet, node-2  Unable to mount volumes for pod "fluentd-0_openstack(b4179bc4-3776-11ea-862b-246e965469a8)": timeout expired waiting for volumes to attach/mount for pod "openstack"/"fluentd-0". list of unattached/unmounted volumes=[storage]

  初步判断是MountFlags=slave的挂载方式问题,即host节点上umount了该rbd设备,但node-exporter的container里的mount信息还在.所以,只需要在该container里umount掉该rbd设备,若该statefulset能够起来,这说明需要修docker默认的挂载方式.

方法:

以下例子中,我们把根目录挂载prometheus-polling-exporter中,statefulset的pod是fluentd, 从节点node-1迁移到node-2

(1) 查看node-1节点没有被mount的rbd设备,即rbd14在host上已经处于umount状态

[root@node-1 ~]# lsblk | grep rbd14
rbd14                                                                                        237:0    0   500G  0 disk 

(2) 进入prometheus-polling-exporter的pod中,查看rbd14状态,还处于mount状态,即host和container不同步

()[root@node-1 /]# mount | grep rbd14
/dev/rbd14 on /host/var/lib/kubelet/plugins/kubernetes.io/rbd/rbd/rbd-image-kubernetes-dynamic-pvc-144d567d-1aaa-11ea-a40d-0a580ae80250 type ext4 (rw,relatime,stripe=1024,data=ordered)

(3) node-1的message信息里报错

Jan 15 17:13:05 node-1 kubelet: E0115 17:13:05.330855   18003 nestedpendingoperations.go:263] Operation for "\"kubernetes.io/rbd/rbd:kubernetes-dynamic-pvc-144d567d-1aaa-11ea-a40d-0a580ae80250\"" failed. No retries permitted until 2020-01-15 17:15:07.330793288 +0800 CST m=+196440.172890846 (durationBeforeRetry 2m2s). Error: "UnmountDevice failed for volume \"pvc-b54ea292-1aa5-11ea-ae82-246e96549cb8\" (UniqueName: \"kubernetes.io/rbd/rbd:kubernetes-dynamic-pvc-144d567d-1aaa-11ea-a40d-0a580ae80250\") on node \"node-1\" : rbd: failed to unmap device /dev/rbd14, error exit status 16, rbd output: rbd: sysfs write failed\nrbd: unmap failed: (16) Device or resource busy\n"

(4) 查看node-1节点上prometheus-polling-exporter的进程号,进程号是40567

[root@node-1 ~]# ps -ef | grep prometheus-polling-exporter
root     40567 40485  0 17:04 ?        00:00:01 prometheus-polling-exporter
root     46498  8212  0 18:28 pts/44   00:00:00 grep --color=auto prometheus-polling-exporter

(5) 通过nsenter命令进入该进程

[root@node-1 ~]# nsenter -t 40567 -m -p
()[root@node-1 /]# 

(6) 查看rbd14的mount信息,并umount,然后t退出

()[root@node-1 /]# mount | grep rbd14
/dev/rbd14 on /host/var/lib/kubelet/plugins/kubernetes.io/rbd/rbd/rbd-image-kubernetes-dynamic-pvc-144d567d-1aaa-11ea-a40d-0a580ae80250 type ext4 (rw,relatime,stripe=1024,data=ordered)
()[root@node-1 /]# umount /host/var/lib/kubelet/plugins/kubernetes.io/rbd/rbd/rbd-image-kubernetes-dynamic-pvc-144d567d-1aaa-11ea-a40d-0a580ae80250
()[root@node-1 /]# exit
logout

(7) 在node-1节点上执行rbd unmap操作

[root@node-1 ~]# rbd unmap /dev/rbd14

flunentd即可正常umount/mount pvc并起来.

您可能感兴趣的与本文相关的镜像

Linly-Talker

Linly-Talker

AI应用

Linly-Talker是一款创新的数字人对话系统,它融合了最新的人工智能技术,包括大型语言模型(LLM)、自动语音识别(ASR)、文本到语音转换(TTS)和语音克隆技术

<think>我们正在解析两个卸载命令:`umount /mnt/hda` 和 `umount /dev/vda` 根据引用[1][2][3]中的信息,umount命令可以通过挂载点或设备名来卸载文件系统。 1. `umount /mnt/hda` - 这使用的是挂载点(mount point)进行卸载。 - 系统会尝试卸载位于`/mnt/hda`目录的文件系统。 - 注意:卸载前必须确保该目录没有正在被使用的文件或进程,否则会失败(可以使用`fuser`或`lsof`查看占用进程)。 2. `umount /dev/vda` - 这使用的是设备名(device)进行卸载。 - 系统会尝试卸载设备`/dev/vda`(通常是一个虚拟磁盘设备,常见于虚拟化环境)上挂载的文件系统。 - 同样,需要确保该设备上的文件系统没有被使用。 注意:如果卸载时设备繁忙,可以尝试使用强制卸载(如`umount -f`)或延迟卸载(`umount -l`),但有一定风险。 另外,引用[4]中提到:当设备繁忙时,可以使用`fuser -km`命令杀死占用进程后再卸载。 下面分别解析两个命令: ### 命令解析:`umount /mnt/hda` 1. **操作对象**:挂载点`/mnt/hda` 2. **执行过程**: - 系统在挂载表`/etc/mtab`(或由`/proc/mounts`提供)中查找该挂载点对应的条目。 - 如果找到,则尝试卸载该挂载点上的文件系统。 - 卸载成功则从挂载表中移除该条目。 3. **注意事项**: - 如果该目录下有打开的文件或进程正在使用,卸载会失败(返回`device is busy`错误)。 - 强制卸载方法(不推荐在重要系统上使用): ```bash umount -f /mnt/hda # 强制卸载 ``` - 或先终止占用进程: ```bash fuser -km /mnt/hda # 终止所有访问该挂载点的进程 umount /mnt/hda ``` ### 命令解析:`umount /dev/vda` 1. **操作对象**:设备文件`/dev/vda` 2. **执行过程**: - 系统在挂载表中查找设备`/dev/vda`对应的挂载点。 - 如果该设备只有一个挂载点,则卸载该设备在该挂载点上的文件系统。 - 如果该设备有多个挂载点(如多个分区分别挂载),则此命令会失败(因为需要指定具体挂载点或分区,如`/dev/vda1`)。 3. **注意事项**: - 虚拟磁盘设备`/dev/vda`通常出现在KVM等虚拟化环境中,作为虚拟机的块设备。 - 如果该设备被分成多个分区(如`/dev/vda1`, `/dev/vda2`等),那么卸载整个设备`/dev/vda`通常是不允许的(因为每个分区单独挂载)。此时应卸载具体的分区(如`umount /dev/vda1`)。 - 若卸载失败,处理方法同上(强制卸载或终止进程)。 ### 卸载失败常见原因及解决 1. **设备繁忙**(Device is busy): - 使用`lsof /mnt/hda`或`fuser -v /mnt/hda`查看占用进程。 - 结束进程或等待进程释放资源。 2. **挂载点不存在或未挂载**: - 确保挂载点存在且已挂载(可通过`mount | grep '/mnt/hda'`或`findmnt /mnt/hda`验证)。 3. **权限不足**: - 普通用户可能需要`sudo`权限执行卸载。 ### 总结 - 使用挂载点卸载更直观,因为一个设备只能挂载在一个挂载点(除非有绑定挂载或多挂载点,但通常一个设备分区对应一个挂载点)。 - 使用设备名卸载时,注意设备名是否对应单个挂载点(如整个磁盘设备通常不会被直接挂载,而是挂载其分区)。 §§相关问题§§ 1. 如何查看当前系统中已挂载的文件系统列表? 2. 当出现“device is busy”错误时,如何安全地解除占用? 3. 在虚拟化环境中,`/dev/vda`与`/dev/sda`有何区别? </think>### 解析指令 `umount /mnt/hda` 和 `umount /dev/vda` #### 命令结构解析 1. **`umount`** Linux 卸载命令,用于解除文件系统与目录树的关联[^1][^4]。 $$ \text{umount} \left[ \text{挂载点} \right] \quad \text{或} \quad \text{umount} \left[ \text{设备路径} \right] $$ 2. **`/mnt/hda`** - **挂载点路径**(卸载目标类型:目录) - 表示卸载挂载在目录 `/mnt/hda` 上的文件系统 - 属于**精准定位**方式(推荐),直接指定挂载点[^2][^4] 3. **`/dev/vda`** - **设备文件路径**(卸载目标类型:块设备) - 表示卸载设备 `/dev/vda`(通常是虚拟化环境中的虚拟磁盘)关联的文件系统 - 可能存在**歧义风险**:若同一设备挂载到多个目录,将卸载所有关联挂载点[^3][^4] #### 执行原理对比 | 特性 | `umount /mnt/hda` | `umount /dev/vda` | |--------------------|---------------------------------------|---------------------------------------| | **目标类型** | 目录(挂载点) | 块设备文件 | | **定位精度** | 精确(仅卸载指定目录) | 可能不精确(卸载设备所有挂载点) | | **推荐场景** | 标准操作 | 设备仅挂载到单一目录时 | | **风险** | 低 | 可能误卸载其他挂载点(如多分区情况) | | **底层操作** | 解除目录与设备的关联 | 解除设备与所有关联目录的绑定 | #### 操作流程 ```mermaid graph TD A[执行 umount] --> B{检测目标类型} B -->|目录路径| C[在挂载表中查找匹配项] B -->|设备路径| D[查找该设备所有挂载点] C --> E[仅解除目标目录关联] D --> F[解除设备所有关联目录] E & F --> G[释放系统资源] G --> H[更新 /etc/mtab 文件] ``` #### 注意事项 1. **卸载前提** - 目标文件系统未被进程占用(否则报错 `device is busy`) - 可强制卸载(不推荐): ```bash umount -f /mnt/hda # 强制卸载(可能丢失数据) fuser -km /mnt/hda # 终止占用进程后卸载[^4] ``` 2. **虚拟设备特性** `/dev/vda` 常见于虚拟化环境(KVM/Xen),其卸载行为与物理设备 `/dev/sda` 相同,但需注意: - 虚拟磁盘可能对应多个分区(如 `/dev/vda1`, `/dev/vda2`) - 卸载整个设备(`/dev/vda`)会同时卸载所有分区挂载点 3. **卸载验证** 检查是否成功: ```bash mount | grep '/mnt/hda' # 无输出表示卸载成功 lsblk | grep 'vda' # 查看设备挂载状态[^2] ``` #### 典型应用场景 1. **安全移除存储设备** ```bash umount /mnt/usbdisk && udisksctl power-off -b /dev/sdb1 ``` 2. **虚拟化环境磁盘维护** ```bash umount /dev/vda1 # 精确卸载分区 ``` 3. **系统修复** 重新挂载只读文件系统为读写模式: ```bash mount -o remount,rw /dev/vda2 # 免卸载直接修改挂载参数[^3] ``` > ⚠️ **最佳实践**:优先使用**挂载点路径**卸载(`umount /mnt/hda`),避免设备路径卸载可能引发的多目录误卸载问题。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值