Linux mount Windows目录遇到 write-protected 问题 及 一个屌丝的逆袭

Linux挂载Windows共享目录解决write-protected问题
本文描述了在Linux系统中挂载Windows共享目录时遇到的写保护问题,以及解决方案。通过安装cifs-utils包可以解决此问题。此外,文章还介绍了如何利用Linux挂载的共享目录来修改文件的last modified和access time,以避免被定时删除。通过crontab和Python脚本`update_ts.py`,可以更新文件和子目录的时间戳。

参考:

http://blog.csdn.net/gtlions/article/details/8558718

http://2hei.net/mt/2008/12/wndows-use-python-edit-filetime.html

http://www.pythoncentral.io/recursive-file-and-directory-manipulation-in-python-part-1/


【问题描述】


Windows 机器192.168.1.103共享了 /share/yasi 目录,并且赋予了写的权限,在Windows机器下可以用 yasi/pass 登录。在一台CentOS 6.3机器上尝试将该共享目录 mount 到 /mnt/yasi 上

mount -t cifs //192.168.1.103/share/yasi /mnt/yasi -o username="yasi",password="pass"

结果失败,错误提示如下:

mount: block device //192.168.1.103/share/yasi is write-protected, mounting read-only
mount: cannot mount block device //192.168.1.103/share/yasi read-only


【原因】

需要安装cifs-utils


【解决】

安装cifs-utils

yum install cifs-utils.x86_64

然后重新执行

mount -t cifs //192.168.1.103/share/yasi /mnt/win -o username="yasi",password="pass"
就mount上了,并且具有写的权限。


【利用Linux mount 上 Windows 共享目录做点事情】


出于对资源的合理利用,公司对某个共享文件夹做了如下限制:该文件夹下的各个员工的个人文件夹中,last modified/access time 老于30天的文件或子文件夹将会在每天定时执行的某个脚本中被删除。然而很多文件很大但我们不希望被删除。

下面,屌丝的逆袭来了:


1)将该共享文件夹下的个人文件夹(比如 //192.168.1.103/share/yasi)mount到一台Linux机器上

mount -t cifs //192.168.1.103/share/yasi /mnt/yasi -o username="yasi",password="pass"


2)在Linux机器上编码如下 Python 脚本,/home/yasi/update_ts.py

import os, sys, time

topdir = "/mnt/yasi"

def update_time(timestamp, dirname, names):
        for name in names:
                timestamps = (timestamp, timestamp)
                os.utime(os.path.join(dirname, name), timestamps)

os.path.walk(topdir, update_time, time.time())

3)在 Linux 机器上添加 cron job 如下,即每天23:00的时候执行 update_ts.py 脚本

crontab -e

0 23 * * * python /home/yasi/update_ts.py

于是,每天23:00 都会将  //192.168.1.103/share/yasi 下的所有文件和子文件夹的 last modified/access time 改成当前时间,这样就永远不存在 “老于30天没有访问过” 的文件和文件夹了!


【注意】


update_ts.py 中指定的 /mnt/yasi 即 //192.168.1.103/share/yasi 里面的所有文件和子文件夹都会被更改时间戳,但是 //192.168.1.103/share/yasi 这个文件夹本身的时间戳不会被 update_ts.py 修改


<think>用户的问题LinuxDocker下/dev/loop77设备挂载时提示处于write-protected状态。首先,我需要理解这个问题可能的原因。Write-protected通常意味着设备被设置为只读,可能由多种因素引起,比如文件系统错误、设备被其他进程锁定,或者Docker容器本身的配置问题。接下来,我应该考虑可能的解决方法。首先检查设备是否真的被挂载为只读,可以使用mount命令查看挂载选项。如果确实是只读,可能需要重新挂载为读写模式,使用mount-oremount,rw命令。但需要注意,如果设备本身是只读的,比如某些镜像文件,可能需要修改镜像文件或容器的配置。另外,Docker容器中的设备权限也可能导致这个问题。需要检查容器是否有权限访问该设备,可能需要使用--privileged参数运行容器,或者调整设备的权限和所有者。此外,检查Docker的配置文件,比如daemon.json,是否有相关设置限制了设备的访问。还有可能是文件系统本身的问题,比如/dev/loop77对应的文件系统存在错误,导致挂载时自动以只读模式保护数据。这时候需要使用fsck命令检查并修复文件系统。但需要注意,在Docker容器内可能无法直接运行fsck,可能需要进入宿主机进行操作。另外,用户可能是在挂载一个镜像文件作为循环设备,这时候需要确认镜像文件是否被正确创建,并且没有设置为只读属性。可以使用losetup命令查看循环设备的详细信息,确认是否被标记为只读,或者是否有其他进程正在使用该设备导致锁定。最后,可能需要考虑Docker的存储驱动是否与循环设备兼容,或者是否有已知的bug导致此类问题。查阅Docker的文档或社区论坛,看看是否有其他用户遇到类似问题,并参考他们的解决方案。总结下来,可能的解决步骤包括:检查挂载选项,重新挂载为读写;检查设备和文件系统权限;修复文件系统错误;调整Docker容器或宿主的配置;确认镜像文件或设备的属性设置。需要逐步排查这些可能性,找到具体原因并解决。</think>在Linux Docker环境下,`/dev/loop77`设备挂载时提示“write-protected”状态,通常由以下原因导致: 1. **设备本身被设置为只读** `/dev/loop`设备通常关联镜像文件(如`.img`或`.iso`)。若镜像文件本身是只读的(例如通过`chmod -w`修改权限或原始文件为只读),挂载后会继承只读属性。 2. **文件系统错误导致保护性挂载** 若镜像文件内的文件系统(如`ext4`、`xfs`)存在错误,Linux会以只读模式挂载以防止数据损坏。 3. **Docker容器权限限制** Docker默认会限制容器对宿主主机设备的直接访问。若未正确传递设备权限或使用`--privileged`模式,可能导致设备操作失败。 4. **循环设备(loop device)未正确配置** 使用`losetup`绑定镜像文件到`/dev/loop77`时,若未指定读写模式(如`losetup -r`),设备会默认以只读方式挂载。 ### 解决方法: 1. **检查镜像文件权限** 在宿主主机上确认镜像文件是否可写: ```bash ls -l /path/to/image.img ``` 若显示`-r--r--r--`,需修改权限: ```bash chmod +w /path/to/image.img ``` 2. **重新挂载为读写模式** 若设备已挂载,先卸载再重新挂载: ```bash umount /dev/loop77 mount -o remount,rw /dev/loop77 /mnt/point ``` 3. **修复文件系统错误** 使用`fsck`检查并修复镜像文件内的文件系统: ```bash fsck /dev/loop77 ``` *注意:需先卸载设备。* 4. **在Docker中传递设备权限** 启动容器时,通过`--device`参数传递设备并指定读写权限: ```bash docker run -it --device=/dev/loop77:/dev/loop77:rwm --rm alpine ``` 或使用`--privileged`模式(不推荐,存在安全风险): ```bash docker run -it --privileged --rm alpine ``` 5. **重新绑定循环设备** 若通过`losetup`手动绑定,确保未使用`-r`(只读)选项: ```bash losetup /dev/loop77 /path/to/image.img ``` 若已绑定,可先解除再重新绑定: ```bash losetup -d /dev/loop77 losetup /dev/loop77 /path/to/image.img ``` ### 验证步骤: - 在容器内检查设备是否可写: ```bash touch /mnt/point/testfile ``` 若成功创建文件,则问题解决。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值