Linux----------Mount和unmount

Mount和unmount

一个文件系统可以使用之前,必须mount。操作系统然后做一些记录以确认正常。因为UNIX所有的文件在一个目录树中, mount操作的结果使新的文件系统的内容好象在某个已经mount的文件系统的一个已经存在的子目录中。

例如,图 4.3显示3个单独的文件系统,每个有其自己的根目录。当后2个文件系统被mount到第一个文件系统的/home /usr , 我们得到一个目录树,如图  4.4.

 

  figure1226
图4.3: 3个单独的文件系统。

 

 

  figure1233
图4.4: /home /usr 已经mount上。

 

上面的mount可能使用如下命令:

$ mount /dev/hda2 /home
$ mount /dev/hda3 /usr
$
mount  命令使用2个参数。第一个是与包括文件系统的磁盘或分区相关的设备文件。第二个是要mount到的目录。 mount以后,这2个文件系统的内容好象是 /home  /usr  目录。这样就可以说: /dev/hda2   被mount到 /home  , /usr  也同样。要看每个文件系统,就看其被安装的目录,好象它就是在那里。注意设备文件的区别, /dev/hda2  , 和安装到的目录 /home  。设备文件给出硬盘原始内容的存取,安装到的目录给出磁盘上文件的存取。安装到的目录叫 安装点

Linux支持许多文件系统。mount 会试着猜测文件系统种类。也可以使用-t fstype 选项直接定义种类;这有时是必要的,因为自检测mount  并非总能成功。例如要mount一个MSDOS软盘,可以用如下命令:

$ mount -t msdos /dev/fd0 /floppy
$
安装点目录不必是空的,但必须存在。其中的所有文件当文件系统mount后将不可用名字存取(已经打开的文件将继续可存取。有其他目录硬连接的文件可以通过那些名字存取)。这没有坏处,反而可能更有用。例如,有人喜欢将 /tmp  /var/tmp  作为同义,将 /tmp  作为 /var/tmp  的符号连接。系统启动时,在 /usr  文件系统被mount之前,使用驻留在根文件系统的 /var/tmp  目录。当 /usr  被mount上以后,根文件系统上的 /var/tmp  将不可用,如果根文件系统上不存在 /var/tmp  ,那么在mount上 /var  之前将不可能使用暂存文件。

如果不打算在一个文件系统上写任何东西,可以使用mount -r开关做一个只读mount。这将使核心停止任何对此文件系统的写要求,也将停止核心的对i节点的文件存取时间的更新。只读mount对不可写介质是必要的,例如CDROM。

细心的读者可能已经注意到一个小的逻辑问题。第一个文件系统(叫根文件系统,因为它包含根目录)如何mount,因为很明显,它不能mount到另一个文件系统? Well, the answer is that it is done by magic. gif The root filesystem is magically mounted at boot time, and one can rely on it to always be mounted-- 如果根文件系统不能mount,系统将不能启动。 The name of the filesystem that is magically mounted as root 被编译进核心,或用LILO或rdev 设置。

根文件系统通常先被只读mount。然后启动手稿运行fsck  校验它的有效性,如果没有问题,将re-mount它,使之可写。fsck  不能运行于一个已mount的文件系统,因为fsck 运行时,任何文件系统的改变将导致错误。因为根文件系统在被检查时是只读,fsck 可以无虑地修复任何问题,因为re-mount 操作将刷新文件系统在内存中的所有数据。

在有其他文件系统的许多系统中,启动时要自动mount,可以在/etc/fstab 文件中定义:文件格式细节请参考fstab 的手册页。 mount特别的文件系统的特别细节依赖于许多因素,可以根据需要由每个管理员设置。 When the chapter on booting is finished, you may read all about it there.

当一个文件系统不需要再mount着,可以用umount gif. umount  加一个参数unmount它,参数可以是设备文件或安装点。例如,要unmount上面例子中的目录,可以用:

$ umount /dev/hda2
$ umount /usr
$
要了解使用这个命令的更多的说明,参阅手册。注意:记住unmount已经mount的软盘, 而不能仅仅将软盘弹出软驱!由于磁盘缓冲,在你unmount软盘之前无须回写,因此过早取出软盘将导致内容不正确。只从软盘上读还不要紧,如果写,就可能发生灾难性的损失。

mount和umount需要超级拥护特权,即只有root 用户可以做。原因是:如果任何用户都可以mount软盘到任何目录,那么很容易用软盘做,比如,用特洛伊木马替换/bin/sh , 或者其他常用的程序。但是允许用户使用软盘经常又是必要的,有几种方法:

  • 给用户root 口令,很明显这对安全不利,但是最简单的方法。如果没有安全要求,这个方法很好,比如在非网络的、个人系统上。
  • 使用一个程序比如sudo 允许拥护使用mount。这同样对安全不利,但没有直接给任何人超级用户特权。 gif
  • 让用户使用mtools , 这是一个利用MSDOS文件系统的软件包,无须mount。如果是MSDOS软盘这样做很好,否则不好。
  • /etc/fstab 中用合适的选项列出软驱设备和允许的安装点。
最后一个选择可以在 /etc/fstab  文件中加类似下面的一行来完成:
/dev/fd0 /floppy msdos user,noauto 0 0
各列分别是:要mount的设备文件,要安装到的目录,文件系统类型,选项,备份频率(用于 dump  ) 和 fsck  次序(定义启动时文件系统被检查的次序,0表示不检查)。

noauto选项使系统启动是不自动mount(即, it stops mount -a  from mounting it)。 user允许任何用户mount这个文件系统,并且,由于安全原因,不允许执行程序(normal or setuid) and interpretation of device files from the mounted filesystem。这样,任何用户都可以用如下命令mount一个msdos文件系统的软盘:

$ mount /floppy
$
软盘可以用相关的 umount  被unmount。

如果想提供多种软盘的存取,需要给出多个安装点。对每个安装点的设置可以不同。例如,提供MSDOS和ext2文件系统的存取,可以在/etc/fstab 文件中加如下行:

/dev/fd0    /dosfloppy    msdos   user,noauto  0  0
/dev/fd0    /ext2floppy   ext2    user,noauto  0  0
对于MSDOS文件系统(不仅是软盘),可能需要用 uid, gid,和 umask  文件系统选项来限制存取权限,请看 mount  手册页。如果不小心,mount一个MS-DOS文件系统将给予任何用户至少是读权限,这可不是一个好主意。  
### CD-ROM 卸载失败的常见原因及解决方案 在 Linux 系统中,当尝试卸载 CD-ROM 时出现失败,通常是由于某些进程正在使用该设备或挂载点导致的。以下是一些可能的原因解决方法。 #### 原因分析 1. **进程占用**:如果某个进程正在访问挂载点中的文件或目录,系统会阻止卸载操作以防止数据丢失或损坏[^1]。 2. **循环脚本**:某些情况下,可能存在一个无限循环脚本(如引用中的示例[^2]),不断向挂载点写入内容,从而阻止卸载。 3. **权限问题**:用户可能没有足够的权限执行卸载命令。 4. **硬件问题**:虽然较少见,但硬件故障也可能导致卸载失败。 #### 解决方案 以下是针对上述问题的详细解决步骤: #### 1. 检查是否有进程占用挂载点 可以使用 `lsof` 或 `fuser` 命令来检查是否有进程正在使用挂载点。 ```bash lsof /media/cdrom ``` 或 ```bash fuser -m /media/cdrom ``` 如果有进程占用,可以尝试终止这些进程: ```bash fuser -km /media/cdrom ``` #### 2. 强制卸载 如果无法确定具体原因,可以尝试强制卸载: ```bash umount -f /media/cdrom ``` 强制卸载可能会带来一定风险,请确保没有重要任务正在运行于挂载点。 #### 3. 使用 `lazy` 卸载选项 `lazy` 选项允许系统延迟卸载,直到所有对该设备的引用都被释放: ```bash umount -l /media/cdrom ``` #### 4. 检查挂载状态 确认设备是否仍然处于挂载状态: ```bash mount | grep /media/cdrom ``` 如果设备未正确卸载,可以尝试重新挂载后再卸载: ```bash umount /media/cdrom || (mount /dev/cdrom /media/cdrom && umount /media/cdrom) ``` #### 5. 排查权限问题 确保当前用户具有足够的权限执行卸载操作。可以尝试使用 `sudo` 提升权限: ```bash sudo umount /media/cdrom ``` #### 6. 检查硬件状态 如果以上方法均无效,可能是硬件层面的问题。可以尝试重启设备或更换光驱。 ### 示例代码 以下是一个简单的脚本,用于自动化检测并解决问题: ```bash #!/bin/bash MOUNT_POINT="/media/cdrom" # 检查是否有进程占用 if fuser -s $MOUNT_POINT; then echo "Processes are using the mount point. Attempting to kill them..." fuser -km $MOUNT_POINT fi # 尝试卸载 if ! umount $MOUNT_POINT; then echo "Regular unmount failed. Trying lazy unmount..." umount -l $MOUNT_POINT fi # 最终检查 if mount | grep -q $MOUNT_POINT; then echo "Failed to unmount after all attempts." else echo "CD-ROM successfully unmounted." fi ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值