十、mount挂载

一.挂载和卸载文件系统

将额外文件系统与根文件系统某现存的目录建立起关联关系。进而使得此目录做为其它文件访问入口的行为称之为挂载

根文件系统之外的其它文件系统要想能够被访问,都必须通过“关联”至根文件系统上的某个目录来实现,此关联操作即为“挂载”;此目录即为“挂载点”;


挂载点:mount_point,用于作为另一个文件系统的访问入口;
(1) 事先存在;
(2) 应该使用未被或不会被其它进程使用到的目录;
(3) 挂载点下原有的文件将会被隐藏;

注意:1、一个挂载点同一时间只能挂一个设备!
      2、一个设备可以挂载在多个文件夹下,只不过看到的内容都是一样的
      3、挂载点最好是空文件夹,否则原来的文件会被暂时隐藏,直到被卸载后才会显现出来。

6.1 mount

mount [-fnrsvw] [-t vfstype] [-o options] device dir

  • device:指明要挂载的设备;
    • (1) 设备文件:例如/dev/sda5
    • (2) 卷标:-L 'LABEL', 例如 -L 'MYDATA'
    • (3) UUID, -U 'UUID':例如 -U '0c50523c-43f1-45e7-85c0-a126711d406e'
    • (4) 伪文件系统名称:proc, sysfs, devtmpfs, configfs
  • dir:挂载点
    • 事先存在;建议使用空目录
    • 进程正在使用中的设备无法被卸载

补充:
如何在不重启的情况阿霞在虚拟机识别新增的硬盘
echo "- - -" > /sys/class/scsi_host/host0/scan

mount      # 通过查看/etc/mtab文件显示当前已挂载的所有设备,该文件自动更新,记载设备挂载情况
mount  label=name   /data/mnt    # 用卷标挂载
mount   UUID="e206a05c-e04e-400c-8081-01fa18e079d4"   /data/mnt   # 用UUID挂载,由于uuid稳定唯一,所以尽量用uuid去挂载

# option:
    -t vsftype:指定要挂载的设备上的文件系统类型
    -r: readonly,只读挂载
    -w: read and write, 读写挂载
    -n: 不更新/etc/mtab,mount不可见 (cat /proc/mounts可见) -a:自动挂载所有支持自动挂载的设备(定义在了/etc/fstab文件中,且挂载选项中有auto功能) -L 'LABEL': 以卷标指定挂载设备 -U 'UUID': 以UUID指定要挂载的设备 -B, --bind: 绑定目录到另一个目录上; 注:查看内核追踪到的已挂载的所有设备:cat /proc/mounts
# -o options:(挂载文件系统的选项),多个选项使用逗号分隔 (启用和禁用的特性) async:异步模式,默认 sync:同步模式,内存更改时,同时写磁盘 atime/noatime:包含目录和文件 diratime/nodiratime:目录的访问时间戳 auto/noauto:是否支持自动挂载,是否支持-a选项 exec/noexec:是否支持将文件系统上运行应用程序
dev/nodev:是否支持在此文件系统上使用设备文件 suid/nosuid:是否支持suid和sgid权限 remount:重新挂载,不影响其他正在使用设备的用户 ro:只读 rw:读写 user/nouser:是否允许普通用户挂载此设备,/etc/fstab使用 禁止普通用户挂载 acl:启用此文件系统上的acl功能 noacl:关闭acl功能 mount -o noacl,remount /dev/sdb1 /data/mnt loop: 使用loop设备 defaults:相当于rw, suid, dev, exec, auto, nouser, async findmnt MOUNT_POINT|device # 查看挂载情况,已经挂载显示相应挂载情况,无挂载则无输出;可用于写脚本 findmnt /data/mnt &> /dev/dull || mount /dev/sdb2 /data/mnt lsof MOUNT_POINT fuser -v MOUNT_POINT # 查看正在访问指定文件系统的进程 fuser -km MOUNT_POINT # 终止所有在正访问指定的文件系统的进程
卸载
umount DEVICE umount MOUNT_POINT # 卸载

因此,mount命令可将将分区、文件夹(-B)、文件(loop) 都可以挂载在空文件夹上

补充:loop设备,可以在文件系统中创建一个设备文件,该设备文件可以分区,可以挂载
centos6 最多只能挂8个loop设备
ls /dev/loop*
但是,可以创建
mknod /dev/loop8 b 7 8 centos6上创建第8个loop设备

dd if=/dev/zero  of=/data/test_loop  bs=1M  count=500  # 创建loop设备
mkfs.ext4  test_loop   # 格式化
mount -o loop  test_loop  /data/mnt   # 挂载,centos6上需加-o loop选项,即我们实现了将一个文件挂载在文件夹上。

二、 /etc/fstab

我们挂载的命令执行结束后仅仅只是在内存在结束,一旦重启原来的挂载关系都不存在,所以我们要修改配置文件/etc/fstab来保存修改,这样才永久挂载

该文件很重要,最好备份。
如果出现故障

要挂载的设备或伪文件系统
1.设备文件
LABEL:LABEL=""
UUID:UUID=""
伪文件系统名称:proc, sysfs
2.挂载点
文件系统类型
3.挂载选项:defaults
4.转储频率:0:不做备份 1:每天转储 2:每隔一天转储
5.自检次序: 0:不自检 1:首先自检;一般只有rootfs才用1

mount -a 无需重启,挂载/etc/fstab中的所有文件系统

注意:对于loop、光盘、文件夹、一般在fatab中写设备名
一些特殊挂载在/etc/fatab:

补充:

mknod - make block or character special files   # 创建特殊文件
mknod  [OPTION]...  NAME  TYPE   [MAJOR MINOR]

# type:
b      # create a block (buffered) special file
c, u   # create a character (unbuffered) special file


mknod  zero  c 1 5  在 当前设备里创建zero文件,类似/dev/zero文件;注意,要提前cd至该设备的挂载目录里。
ll /dev/zero  /data/zero
crw-r--r--. 1 root root 1, 5 Dec 12 17:31 /data/zero crw-rw-rw-. 1 root root 1, 5 Dec 12 14:54 /dev/zero

补充:
简单删除一块磁盘的分区

dd if=/dev/zero of=/dev/sdb bs=1 count=512

三、swap

交换文件、交换分区,也叫虚拟内存,是系统RAM的补充
  swapon -s # 查看swap信息
创建swap分区;
第一步:fidisk 一个单独的分区,注意将分区类型改为82!
第二步:makeswap 格式化
第三步:修改/etc/fatab配置文件
第四步:swapon -a 激活全部swap

swapon  [OPTION]...  [DEVICE]  # 启用swap
    -a:激活所有的交换分区;
    -p PRIORITY:指定优先级
禁用 :swapoff [OPTION]... [DEVICE]   # 禁用swap

/etc/fstab文件中,可以在defaults后面跟pri=value 设置优先级,值越高优先级越高

练习:
1、根据挂载文件名查出该设备名称。
  blkid -U `grep /data /etc/fstab | sed -r "s/UUID=([^ ]*) .*/\1/" `
  findfs `grep /data /etc/fstab | cut -d" " -f1 `

实验1:修改/etc/fstab 中的uuid,可能导致无法启动,怎么修复
1.根据提示,输入root的密码进入bash;
2.在修改/etc/fstab 文件时会提示我们该文件为只读文件,无法修改。
3.重新挂载/目录
  mount -o rw,remount /dev/sda2 / 重新挂载根目录
4.再 vim /etc/fstab 修改配置文件,将最后两位修改为0 0即可。
5.正常重启

实验2:将一个文件夹迁移至一个新的磁盘分区,如将/home目录迁移至新的分区/dev/sdc1。

为避免在cp过程中别的用户在修改/home,我们可以在操作cp前这么操作
init 1 切换至单用户,也就是说别的终端不允许访问,只允许单用户终端访问,结束操作后再切回至init 5

1 建立新分区
2 建立文件系统
3 mkdir /mnt/home
mount /dev/sda6 /mnt/home
4 cp -av /home/* /mnt/home
5 tar cvf /app/home.tar /home
scp remote
6 init 1 断开网络,在远程不要执行
7 rm -rf /home/*
8 vim /etc/fstab
UUID=b0421d9a-8072-4be5-9526-070535ac0a8e /home ext4 defaults 0 0
9 mount -a
umount /mnt/home
10 init 5 还到原有模式

注意:跟 “/” 目录无法迁移

3.将CentOS6的CentOS-6.9-x86_64-bin-DVD1.iso和CentOS-6.9-x86_64-bin-DVD2.iso两个文件,合并成一个CentOS-6.9-x86_64-Everything.iso文件,并将其配置为yum源.

首先现将两个光盘合成一个

mkdir /data/centos6.9    创建一个空文件夹
cp -av  /misc/cd/*   /data/centos6.9  # 将正在挂载这的光盘dvd1的内容复制进刚刚创建的centos6.9的空文件夹
eject #将dvd1弹出

再放入dvd2
\cp -av /misc/cd/*  /data/centos6.9  # 因为dvd1与dvd2有很多相同的文件,所以在cp前加\表示使用cp的原命令,否则复制过程中每一个相同的文件都会提醒是否覆盖

mkisofs -r -o  CentOS-6.9-x86_64-Everything.iso   /data/centos6.9  # 制作iso
注意:制作的这个iso文件只能当yum源使用,无法作为系统启动光盘,如果要作为系统启动盘使用还需要去官网下载mkdvdiso脚本制作。

然后挂载

mount  -o loop  /data/ CentOS-6.9-x86_64-Everything.iso      /data/mnt

修改配置文件/etc/yum.repo.d/base.repo
最后

yum clean all
yum repolist 

4.创建一个2G的文件系统,块大小为2048byte,预留1%可用空间,文件系统ext4,卷标为TEST,要求此分区开机后自动挂载至/test目录,且默认有acl挂载选项.

fdisk  /dev/sdb   # 先分出一个2G的分区

mke2fs  -t ext4  -m 1  -b 2048  -L test   /dev/sdb1     # 创建文件系统,块大小为2048byte,预留1%可用空间,文件系统ext4,卷标为TEST

vim  /etc/fstab      # 修改配置文件
UUID=cb17acad-ad9c-40b1-bab1-aa11a9ff9741 /test    ext4  defaults,acl  0 0    #添加此条

mount  -a

5.写一个脚本,完成如下功能:

(1) 列出当前系统识别到的所有磁盘设备

(2) 如磁盘数量为1,则显示其空间使用信息
否则,则显示最后一个磁盘上的空间使用信息

#!/bin/bash
a=`lsblk -l | grep "sd[a-z]\>"  |wc -l`
b=`lsblk -l | grep "sd[a-z]\>" |cut -d" " -f1  |head -n1`
c=`lsblk -l | grep "sd[a-z]\>" |cut -d" " -f1  |tail -n1`


[ $a -eq 1 ]  && echo "`fdisk -l /dev/$b`"  || echo "`fdisk -l /dev/$c`"

注意:跟 “/” 目录无法迁移

猜你喜欢

转载自www.cnblogs.com/liuzhiyun/p/11345281.html
今日推荐