1. 挂载相关—{mount,/etc/mtab}

1. 挂载相关—{mount,/etc/mtab}

  • 挂载:将额外文件系统与根文件系统某现存的目录建立起关联关系,进而使得此目录做为其它文件访问入口的行为
  • 卸载:为解除此关联关系的过程
  • 把设备关联挂载点:mount Point
    mount
  • 卸载时:可使用设备,也可以使用挂载umount 设备名|挂载点
  • 注意挂载点(目录)下如果存在有文件,则在挂载完成后这些原文件会被临时隐藏
  • 因此挂载点目录一般为空

1.1. 用mount命令挂载文件系统

  • 挂载方法:mount DEVICE MOUNT_POINT
  • mount(只输入mount):通过查看/etc/mtab文件显示当前已挂载的所有设备
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:挂载点目录 挂载点要**事先存在**,建议新创建目录,然后使用这个空目录 进程**正在使用**中的设备**无法被卸载**

1.2. mount常用命令选项

-t vsftype 指定要挂载的设备上的文件系统类型,mount命令可以自动识别文件系统,所以此选项一般不用 -r readonly,只读挂载,即使root账号也无法更改里面的文件 -w read and write, 读写挂载 -n 不更新/etc/mtab,(注意并不是/etc/fstab) (此选项导致Centos6上mount命令不可见,Centos7上仍然可见此次挂载信息,具体看下面解释) -a 自动挂载所有支持自动挂载的设备(定义在了/etc/fstab文件中,且挂载选项中有auto功能,其中defaults默认选项包含有auto功能) -L 'LABEL' 以卷标指定挂载设备 -U 'UUID' 以UUID指定要挂载的设备 -B, --bind 绑定目录到另一个目录上(相当于目录挂载到目录上,**它不是软链接,也不是硬链接**)
  • 查看内核追踪到的已挂载的所有设备
    cat /proc/mounts (cat /etc/mtab)

1.2.1. mount -o中的细分选项

-o options:(挂载文件系统的选项),多个选项使用逗号分隔 async 异步模式 sync 同步模式,内存更改时,同时写磁盘 atime 不开启noatime功能,此时就会使用kernel默认的atime策略(一般是relatime) noatime 永远不更新文件的atime diratime/nodiratime 目录的访问时间戳 auto/noauto 是否支持自动挂载,是否支持-a选项 exec/noexec 是否支持将文件系统上运行应用程序 dev/nodev 是否支持在此文件系统上使用设备文件 suid/nosuid 是否支持suid和sgid权限 remount 重新挂载 ro 只读 rw 读写 user/nouser 是否允许普通用户挂载此设备,/etc/fstab使用 acl 启用此文件系统上的acl功能 loop 使用loop设备 ----------------------- defaults:相当于rw, suid, dev, exec, auto, nouser, async

2. 卸载相关—{findmnt,lsof,fuser,umoount}

2.1. 查看挂载情况—{findmnt}

findmnt MOUNT_POINT|device : 这个既可以查看设备又可以查看挂载点,可以根据echo $? 判断是否挂载有文件

2.2. 查看正在访问指定文件系统的进程—{lsof,fuser}

lsof MOUNT_POINT fuser -v MOUNT_POINT

2.3. 终止所有在正访问指定的文件系统的进程—{fuser}

fuser -km MOUNT_POINT

2.4. 卸载—{umount}

umount DEVICE umount MOUNT_POINT

3. 挂载和卸载注意点1—{losetup,mknod}:

  1. 注意挂载前先1创建分区,然后2创建文件系统格式,然后再3挂载(包括写入fstab),这三步。
  2. 挂载的时候如果挂载点目录不是空的,则里面包含的文件会被隐藏,就相当于暂时找不到这些文件但是空间仍然被占用了,因此不要挂载到非空目录上,要挂载到新建的空目录上。
  3. 一个设备可以同时挂载到多个挂载点目录上,每个目录都可访问里面的内容也都可以修改。但是多个设备不能同时挂载到一个挂载点目录上,如果这样做的话,最新的挂载设备会覆盖掉上一个挂载设备的挂载信息。
    • 注意此时取消这个挂载之后之前挂载的设备就会重新显示出来
  4. 卸载挂载点的时候,如果有用户或者进程正在访问这个挂载点内文件,则无法卸载
    • 可以用fuser -km mount_point 命令踢出所有占用的用户或进程,然后再取消挂载(慎用慎用!)。
    • 当然比较和谐的方式可以先利用who以及lsof MOUNT_POINTfuser -v MOUNT_POINT命令找出谁在占用某个挂载点,然后利用下面的方式先告诉他不要占用
      • 1.wall广播(不过wall命令是给所有的人发送消息)
      • 2.echo "please do not occupy dirname" > /dev/pts(tty)/#
      • 3.利用write命令:write user ttyname
  5. 挂载最好用UUID,不要用设备名,卷标等;因为只有这样才能保证设备的唯一性,不会出错(比如其他设备上的硬盘已经分好区做好文件系统的装到本机上挂载,如果用设备名或者卷标可能出错或者重复,因此要用UUID)
  6. 只读挂载即使root账号也无法修改挂载后设备内文件内容。
  7. mount -n 选项在centos7中,用mount命令仍然可以看到挂在信息,虽然mount命令实际上查看的是/etc/mtab文件(注意不是/etc/fstab文件)中的内容,但在Centos7中这个文件它是个软链接,链接到了/proc/self/mounts文件(额外地,/proc/mounts文件也是软链接,连接到了/proc/self/mounts文件上)
    • 但是在centos6中,则真的无法看到了,其mount命令看的就是/etc/mtab文件,而-n选项让挂载信息不更新进去,因此看不到,但如果用cat /proc/mounts 仍然可以看到挂载信息。
------------- Centos7: # ll /etc/mtab /proc/mounts lrwxrwxrwx. 1 root root 17 Mar 22 15:36 /etc/mtab -> /proc/self/mounts lrwxrwxrwx 1 root root 11 Mar 26 19:40 /proc/mounts -> self/mounts ------------- Centos6: # ll /etc/mtab /proc/mounts -rw-r--r--. 1 root root 488 Mar 26 19:40 /etc/mtab lrwxrwxrwx. 1 root root 11 Mar 26 19:41 /proc/mounts -> self/mounts
  1. -B --bind选项如上所写,既不是软链接也不是硬链接,它相当于把一个目录挂载到另外一个目录上去了,它俩就好像是同一个目录
    • 挂载后使用mount命令以及df命令得到的结果,其中显示的挂载信息是这个被挂载的文件夹的块设备挂载了,但实际上是这个文件夹被挂载了,但是显示的结果并不是而已,注意这一点。
    • https://www.cnblogs.com/sparkdev/p/9045563.html
    • 它的功能有点类似软链接但又不是软链接,当然利用软链接也可以实现它能实现的功能
  2. 一个硬盘即使不分区,也可以直接在上面创建文件系统,然后挂载使用,(跳过分区的步骤).
    • 这样的话相当于整个硬盘是一个大分区,但实际上用hexdump -C -n 512命令可以看到它并没有分区表MBR的数据格式
    • 因此还不能完全把这整个硬盘当做一个大分区来理解;
    • 但可以把这样的整个硬盘当做是一个普通硬盘分区之后的partition分区部分,此时这里面只有文件系统和各种文件data的数据,并没有什么MBR分区表等等信息。这样才是准确的理解
  3. 如果硬盘全满也没有办法增加新的硬盘了,同时硬盘也全部分区完毕了。此时需要新的文件系统(比如swap等等)那把一个文件当做一个分区(或者硬盘)对它创建文件系统(centos6虽然支持xfs,但是没有管理工具,可以用yum install xfs安装)也是可以的。比如:
# dd if=/dev/zero of=/data/bigfileDisk bs=1M count=300 300+0 records in 300+0 records out 314572800 bytes (315 MB) copied, 0.428576 s, 734 MB/s # file /data/bigfileDisk /data/bigfileDisk: data # mkfs.ext4 /data/bigfileDisk mke2fs 1.42.9 (28-Dec-2013) /data/bigfileDisk is not a block special device. Proceed anyway? (y,n) y ----------------------- blkid无法直接查看,因为它查看的只是块设备,加上路径之后可以查看 # blkid /data/bigfileDisk /data/bigfileDisk: UUID="1f212236-8241-4903-950b-6a03d4d82448" TYPE="ext4" ------------------------ 对它进行挂载并查看信息 # mkdir /mnt/bigfileDisk # mount bigfileDisk /mnt/bigfileDisk/ # df(或者df /dev/loop0) /dev/sr0 10491772 10491772 0 100% /run/media/root/CentOS 7 x86_64 /dev/loop0 289285 2062 267767 1% /mnt/bigfileDisk # lsblk (或者lsblk /dev/loop0) NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT loop0 7:0 0 300M 0 loop /mnt/bigfileDisk # losetup NAME SIZELIMIT OFFSET AUTOCLEAR RO BACK-FILE /dev/loop0 0 0 1 0 /data/bigfileDisk # losetup -a /dev/loop0: [2051]:89185 (/data/bigfileDisk)
  • 注意创建之后无法直接用blkid来查看它,因为他不是一个blk文件,但可以blkid加上路径之后查看,然后就可以创建新的空文件夹,将其进行挂载。(挂载之前没有loop将其对应,因此无法用df直接显示,但是挂载之后由于有了loop#设备与其对应,因此便可以用blkid命令查看到此文件了)
  • 注意centos7可以直接挂载,但是centos6上必须用mount -o loop 设备名(其实是文件名) 挂载点 的方式才可挂载。
  • 挂载之后loop自动对应了文件,此时便可以用df查看,df查看结果会用/dev/loop#的方式代表这个文件,同时也可用lsblk命令看到loop#。但是centos6里面用df命令仍然看不到loop的标识,它显示的就是这个文件本身挂载到文件夹上。
  • losetup [-a] 选项可以看到loop设备和对应的文件(6和7都可以,但是6里面必须加上-a)
  • 注意7上面每使用一个loop它都会自动创建一个新的,而6上面默认一开始只有8个loop设备。
Centos6: # ll /dev/loop* brw-rw----. 1 root disk 7, 0 Mar 26 19:39 /dev/loop0 brw-rw----. 1 root disk 7, 1 Mar 26 19:39 /dev/loop1 brw-rw----. 1 root disk 7, 2 Mar 26 19:39 /dev/loop2 brw-rw----. 1 root disk 7, 3 Mar 26 19:39 /dev/loop3 brw-rw----. 1 root disk 7, 4 Mar 26 19:39 /dev/loop4 brw-rw----. 1 root disk 7, 5 Mar 26 19:39 /dev/loop5 brw-rw----. 1 root disk 7, 6 Mar 26 19:39 /dev/loop6 brw-rw----. 1 root disk 7, 7 Mar 26 19:39 /dev/loop7 ------------------- Centos7: # ll /dev/loop* brw-rw---- 1 root disk 7, 0 Mar 26 20:01 /dev/loop0 crw-rw---- 1 root disk 10, 237 Mar 26 20:01 /dev/loop-control
  • 在Centos中(不论是7还是6,但主要用在6中,7中无需这么麻烦操作),可以用losetup /dev/loop# /data/bigfiletest2 的命令,先手动让这个创建的模拟分区的大文件对应关联loop设备,然后挂载的时候就可以用mount /dev/loop# /mnt/mntbigfiletest2 的命令方式挂载了,不再需要mount -o loop 模拟分区文件 挂载点的方式了

    • 也可以直接mkfs.ext4 /dev/loop# 对其进行分区,就相当于是用 /dev/loop#指代了之前的那个文件) 挂载后则6中此时也可以用df命令看到这个文件对应的loop标识而不是文件本身了。
  • 6中默认只有8个loop,可以用mknod /dev/loop100 b 7 8的命令来创建新的loop设备。其中编号100自己写,7(文件类型)不能更改,8(同一个文件类型编号)可以更改。rm -f /dev/loop100 可以直接删除这个自己创建的loop文件

    • 注意并不是取消loop#和文件它俩之间的关联,而是之间把这个文件给删除了
    • 取消关联则要通过losetup -d /dev/loop#
  • 6中也可更改/boot/grub/grub.confkernel=行的最后面加入 max_loop=200 修改启动设置,直接启动创建200个设备。此时需要重启生效。

  • 文件挂载到空目录之后便可以把挂载点/mnt/bigfileDisk 当做一个硬盘挂载点来使用各种命令,如果需要拷贝里面的文件则只需要拷贝这个文件即可。但是需要注意拷贝完文件到其它主机上需要将它重新挂载之后才能查看里面的内容

    • 用这种方式,相当于把这个模拟分区的大文件当成一个硬盘,或者当作一个U盘使用,十分方便
  • 这就是属于虚拟化技术,VMware的硬盘模拟也是按照这种方式把文件模拟成硬盘使用(window上的.vmdk文件),不过虚拟化的硬盘是有格式的(比如qcow2),上面的例子里创建文件的数据都是0,就相当于raw格式(没有格式)。

  1. du /dir -sh 可以显示dir文件夹内所有文件的大小总和,df /dir 则可以看到dir里面所占数据(它比du的要大,因为df还包含更多其他数据,比如元数据,节点表等等)
    • 如果用dd if=/dev/zero of=/data/bigfile bs=1M count=100 seek=20480,则ll显示为21G,dudf都仍然显示100M,这也称为空洞文件或者稀疏文件
    • 用ll命令看到的是逻辑大小,用du df看到的则是实际大小。
# dd if=/dev/zero of=/data/bigfile bs=1M count=100 seek=20480 100+0 records in 100+0 records out 104857600 bytes (105 MB) copied, 0.127369 s, 823 MB/s # ll bigfile -h -rw-r--r-- 1 root root 21G Mar 26 20:23 bigfile # df /data/ -h Filesystem Size Used Avail Use% Mounted on /dev/sda3 50G 280M 50G 1% /data # du bigfile -h 100M bigfile
  1. mount -o ro,remount /dev/sdb1 (或者 /mnt/sdb1,两个任何中任何写一个即可,无需设备和挂载点都写上) :重新挂载并修改为只读(注意修改挂载选项只会修改这一项,不会覆盖掉其他项)
    • 只要修改挂载选项都要重新挂载,要么两个命令先卸载,再挂载。要么一个命令直接remount
    • relatime选项(rel+atime)是控制文件的访问时间(atime)更新的策略的,只有在满足特定的条件下才会更新atime;
      • 也就是:1.距离最新读取文件的时间一天以上,它会更新读的时间。2.或者说修改时间比读的时间还要新,则再次读文件的的时候它会更新;
      • 其他情况下比如刚更新过一个文件的atime,则再次进行读取的时候,atime不会进行更新,因为并不满足上面的条件中的任意一个。
    • noatime可以关闭更新文件读时间,可以减少系统负载
    • async异步模式更改数据的时候是先放入buffer缓冲区中,过一段时间再真正写入硬盘空间中。这样可以提高写的速率,但有丢失数据的风险(断电等故障)
    • 挂载的时候-o 选项就是修改Default mount options里面的挂载选项,可以直接加上acl(查看前面的tune2fs注意点),也可以用多个选项然后remount的命令修改选项。

4. 挂载点和配置文件—{/etc/fstab}

配置文件系统体系
被mount、 fsck和其它程序使用
系统重启时保留文件系统体系
可以在设备栏使用文件系统卷标
使用mount -a 命令挂载/etc/fstab中的所有文件系统

4.1. 文件挂载配置文件

  • /etc/fstab每行定义一个要挂载的文件系统
  1. 要挂载的设备或伪文件系统
      设备文件(直接写设备名比如 /dev/sdb2)
      LABEL:LABEL=""
      UUID:UUID=""
      伪文件系统名称:proc, sysfs
  2. 挂载点
  3. 文件系统类型:ext4,xfs,iso9660,nfs,none
  4. 挂载选项:defaults ,acl,bind(文件夹或文件绑定) ,loop(模拟分区文件回环挂载)
  5. 转储频率:0:不做备份 1:每天转储 2:每隔一天转储
  6. fsck检查的文件系统的顺序:允许的数字是0 1 2
      0:不自检
      1:首先自检;一般只有rootfs才用
      2:非rootfs使用

4.2. 挂载配置文件fstab注意点2

  1. 挂载时候的名称最好用UUID避免删除硬件后其设备名发生改变引起错误。xfs文件格式的分区挂载点根目录下没有lost+found目录,ext系列文件格式挂载点根目录下有这个文件夹,就是为了当发生错误时里面的文件无法找到自己所在位置时将其放入lost+found文件夹内。
  2. 注意挂载选项中就算不写defaults,写上其他的选项,但是挂载的时候也同样会有defaults里包含的选项,除非写的其它选项正好对应defaults里的选项将其修改了,就比如前面的 mount -o opts,remount 设备 命令类似, 这个是追加并不是覆盖,不是说写了选项则就只有选项的内容了,还包括有defaults里面的内容。除非追加的内容修改了defaults里的选项会把默认选项相对应的那一项给改掉,其他的仍然不变。
  3. /etc/fstab 里面新增加的挂载选项,用 mount -a 则可以让它生效挂载上(前提是支持auto选项,默认都支持)。但是如果修改一个已经挂载过的设备的各种选项的话,用mount -a命令则无效了
    • 此时要么先取消(umount 设备)再重新挂载(mount 设备 挂载点),使用这两个命令
    • 要么用mount -o remount 设备|挂载点 这一条命令
      • 注意上面的两种方式,虽然没有加任何挂载选项(也就相当于mount -o opts中的opts除了remount没有任何其他选项),但是重新挂载一个设备的时候,如果在/etc/fstab中有关于这个设备的配置条目,则会按照这个/etc/fstab中的条目对这个设备进行重新挂载;而如果在/etc/fstab中没有关于设备的条目,则不加任何选项的时候就是以defaults选项对设备进行(重新)挂载.
      • 但同时注意,对于在fstab文件中写有配置的设备,如果用命令行命令mount -o opt,opt,... 设备 挂载点对它进行(重新)挂载,则命令行中的opts的优先级更高(比如/etc/fstab中写ro,命令行写rw,则命令行mount命令执行之后,是以rw的方式进行挂载的,因为它优先级更高)
  4. 修复信息
    • Centos6: 如果fstab里面的信息有错误,则centos6启动时会报错,修复它需要输入root账户的密码,然后将fstab里面的错误的那一行最后一位检测改为0,即忽略错误检测(或者已知哪一行错误,把它注释掉,或者将其错误的部分改为正确的。这3种方式均可),但是需要注意,此时挂载的根目录是只读的(虽然mount显示的是rw,但经过测试可知无法修改创建热河文件),因此需要重新挂载根设备mount -o remount,rw / ,然后才能修改fstab。修改之后reboot即可。(如果用修改最后一位为0的方式,一定要进入系统之后修改这一行fstab为正确的,不能以后每次开机仍然错着它,仅仅只是将它忽略开机,这种做法不可取)
    • Centos7:同理,开机的时候先按esc按键取消图形界面遮挡,可以看到也是出现错误,但需要等待1分30秒它检测是否能够跳过这个错误,然后输入密码和上面的步骤一样了。(此时7里面已经挂载的硬盘是rw挂载,不需要像6中一样要重新挂载)注意这里只能用注释错误行或者将错误的地方改为正确两种方法,最后一位改为0下次开机并不能忽略检测。

4.3. /etc/fstab特殊文件永久(开机)挂载参考—{findfs}

  1. 挂载分区(装好文件系统)
  2. 硬盘(不分区但装好文件系统)
  3. 硬盘(不分区也不装文件系统,直接二进制0101来用,此时只能用设备名挂载方式,因为它没有UUID)
  4. 挂载文件(全是0的二进制raw格式文件装好文件系统之后,上面有介绍,此时这个文件有UUID和文件系统,相当于一个挂载分区)
  5. 目录或者文件的绑定挂载(bind,-B)
  6. (非本地)远程共享目录或者文件的挂载(之后再详细更新接介绍)
  7. ISO光盘格式文件的挂载
    • 附加知识点:可以直接cp原始安装光盘挂载的目录到硬盘,新命名文件写上iso后缀,这样就相当于创建一个ISO文件,比如cp /dev/sr0 /data/centos7.iso,注意拷贝的原文件直接就是/dev/sr0 不是光盘挂载的位置/run/media/####
    • 此时挂载这个IOS文件时需要注意:
    • centos7上相当于隐藏了mount -o loop选项,它会直接再次分配loop#对应这个iso文件进行挂载;
    • centos6上必须在fstab文件中写上loop选项或者提前手动分配loop
    • 用这种写入fstab的方式挂载iso就可以永久挂载光盘文件到http服务网站上做yum源了。(当然如果之前用的是 软链接ln -s /misc/cd /var/www/html/yumrepertory 这种方式的,就不需要写入fstab了;不论是挂载还是软链接方式都能使用)
  8. Swap分区挂载,详细参考下面SWAP分区的处理方法

4.3.1. 特殊文件挂载注意点3:

  1. 注意不论是iso大文件(自己cp的文件,不是设备/dev/sr#)还是bigfileDisk这种都相当于是文件挂载,只是说他们两个的文件系统格式不相同,一个是iso9660,一个是ext4或xfs等文件系统.
  2. 文件挂载的特别注意点:挂载**普通文件(非光盘iso文件)**都是需要用/dev/loop#(回环设备)将其对应,然后再挂载到目录中的,注意普通文件挂载选项处写defaults即可(注意可以加上loop,在7中它会自动分配,不加上也行,但是6里面必须要加上这个选项,要写在fstab文件中)
  3. 但是(普通文件中的)光盘ISO文件在写入fstab中时可以用UUID的方式挂载,其他普通文件不可以,挂载时必须写文件名,不然无法找到这个文件开机会出错误。
    • 重要建议:是只要是普通文件挂载(普通文件模拟分区,iso文件,,或者文件当做swap分区用)都要用文件名的方式挂载,这样就不会开机出现错误了。 挂载格式例子如下:
------------------------- 找相关挂载硬件(文件)的信息的各种命令(找把文件当做硬盘的那个文件相关信息,有下面几种方法): # blkid /dev/loop0 /dev/loop0: LABEL="fileDisktt" UUID="1f212236-8241-4903-950b-6a03d4d82448" TYPE="ext4" # findfs /dev/loop0 /dev/loop0 # findmnt /dev/loop0 TARGET SOURCE FSTYPE OPTIONS /mnt/bigfileDisk /dev/loop0 ext4 rw,relatime,data=ordered # lsblk -f NAME FSTYPE LABEL UUID MOUNTPOINT loop0 xfs 3fad6a15-950b-4030-9622-23b64680e0f1 /mnt/bigfile # losetup [-a] /dev/loop0: [2051]:89185 (/data/bigfileDisk) # mount 省略…………………… /data/bigfileDisk on /mnt/bigfileDisk type ext4 (rw,relatime,data=ordered) --------------------------- 2. 然后/etc/fstab里面部分格式参考: 注意!!:挂载选项里面如果有除了defaults之外的选项,defaults可以不写,但并不代表defaults选项的内容没有被设置上; 在上面“挂载配置文件fstab注意点2”中的第2条也有说明 ###### 1-1.swap分区,硬盘Swap分区挂载 ####### UUID=b846b132-1872-4599-829c-daa681da4d13 swap swap defaults 0 0 ###### 1-2.swap分区,自己用文件模拟出来的回环Swap分区挂载 ###### /mnt/dev/sdc2/swappagefile(swap文件) swap swap defaults 0 0 ###### 2.普通文件模拟分区创建文件系统后挂载,选项是defaults,也可写上loop,7中可以不写,6中必须写 ###### ###### 经测试注意此时必须用文件名来挂载,不可以用UUID,不然开机无法查询到这个UUID ###### ###### 如果已经开机了再写上UUID可以用mount -a 命令挂载上,但是没有意义,所以必须用文件名的方式挂载 ###### ###### 下面三种效果一样 ###### /data/bigfileDisk /mnt/bigfileDisk ext4 loop[,defaults] 0 0 # 只有Centos7可以用下面方式: /data/bigfileDisk /mnt/bigfileDisk ext4 defaults 0 0 ###### 3.文件(夹)绑定挂载到文件(夹),此时虽然mount命令中看到的是包含/boot的设备名比如/dev/sda挂载到/mnt/boot下,但实际上就是文件夹挂载到文件上了 ####### ###### 下面两种效果一样 ###### /boot /mnt/boot none bind[,defaults] 0 0 ###### 4.iso文件做硬盘,写上loop或者不写都行;注意因为它是光盘文件,因此会被判断为只读挂载 ###### ###### 同时由于它没有UUID,所以也只能以文件名的方式进行挂载;###### ###### 但就算有UUID也不能用UUID的方式挂载,因为自己cp的ISO文件它也属于一个文件模拟分区,文件模拟分区用UUID方式挂载开机时无法找到设备的 ###### ###### 下面三种效果一样 ###### /data/centos7.iso /mnt/iso iso9660 loop[,defaults] 0 0 # 只有Centos7可以用下面方式: /data/centos7.iso /mnt/iso iso9660 defaults 0 0

5. 处理交换文件和分区

  • swap交换分区是系统RAM的补充,Swap 分区支持虚拟内存。当没有足够的RAM 保存系统处理的数据时会将数据写入 swap 分区
  • 当系统缺乏 swap 空间时,内核会因 RAM 内存耗尽而终止进程。配置过多swap 空间会造成存储设备处于分配状态但闲置,造成浪费,过多 swap 空间还会掩盖内存泄露

5.1. 推荐系统 swap 空间表

系统中的RAM量推荐的swap空间允许休眠的swap空间 建议大小
低于2GBRAM量的两倍RAM量的三倍
2GB-8GB等于RAM量RAM量的两倍
8GB-64GB4GB到RAM量的0.5倍RAM量的1.5倍
超过64GB独立负载(至少4GB)不建议使用休眠功能

注意大内存可以自己设定swap分区,不一定非得按照表格建议

5.2. 挂载和创建交换分区—{swapon,swapoff}

5.2.1. 创建新的SWAP基本步骤:

  1. 创建交换分区或者文件(把文件当做swap来使用)
  2. 使用mkswap创建swap分区系统并同时写入特殊签名
  3. 用MBR的fdisk中t选项更改刚创建的swap分区标签,如果是GPT格式则用gdisk方式修改标签;
    • 注意这两种分区方式标签编号不一样:fdisk是83;gdisk是19
  4. /etc/fstab文件中添加适当的条目,使其开机挂载
  5. 使用swapon -a 激活交换空间(当前不关机立即启动swap分区)

5.2.2. 启用:swapon

swapon [OPTION]... [DEVICE] -a:激活所有的交换分区 -p PRIORITY:指定优先级 /etc/fstab 在第4列中:pri=value

5.2.3. 禁用:swapoff [OPTION]… [DEVICE]

5.2.4. SWAP的优先级

  • 可以指定swap分区0到32767的优先级,值越大优先级越高
  • 如果用户没有指定,那么核心会自动给swap指定一个优先级,这个优先级从-1开始,每加入一个新的swap分区,用户并没有指定其优先级的,则会给这个优先级减1
  • 先添加的swap的缺省优先级比较高,除非用户自己指定一个优先级,而用户定的优先级(是正数)永远高于核心缺省指定的优先级(是负数)
  • 优化性能:分布存放,高性能磁盘存放

5.3. swap交换分区相关注意点4:

  1. 总体步骤再次总结:1.创建分区(或者文件模拟),2.改标签(不改也行最好改),3.用mkswap创建swap文件格式,4.写入fstab开机挂载,5.swapon立即挂载启动swap分区。
  2. free -h 查看内存和swap信息,在centos7中和centos6中有区别,其中的free空间可以将buffer/cache空间拿过来使用,因此6中有第二行显示,7中没有(但7中也是这个原理,buffer和cache不用的时候可以当做free空间用作它用)
  3. dd if=/dev/zero of=dev/null bs=6G(大块数据) count=1 可以简单的强行占用所有内存空间测试swap。但是有些大程序如果内存太小运行时会自动关闭。
    • 此时如果内存+swap小于6G则这个命令无法使用
  4. 最好用高速磁盘来用作swap分区提供更好的性能。
    • SSD就不用说了
    • HHD的话,最好用它最外圈也就是编号小的扇区或者柱面,如果分区的话也就是HDD设备最开头的分区,比如一块新的硬盘/dev/sdc,则使用/dev/sdc1分区作为Swap分区使用
  5. 创建swap文件格式的命令不同于mkfs.FS ,用专有格式化命令mkswap.
  6. 创建好swap分区格式之后,注意它与之前的普通分区挂载稍微有区别。swap挂载的挂载点不是一个空文件夹,在fstab中直接就是swap(前面不加/),后面的文件系统类型也是swap。 改完fstab文件后,不重启立即挂载的命令是swapon -a(类似普通文件格式分区挂载mount -a)
UUID=3925deed-69a6-45b7-b44e-1027ab9b7caf swap swap defaults 0 0
  1. cat /proc/swaps 或者swap -s 命令可以更加清楚看到swap来自哪个分区,优先级等信息。因此可以修改swap分区的优先级让更好性能的swap分区优先使用。修改优先级要在fstab中的defaults处加上pri=value用逗号分隔(此时defaults可以不写了)。
    • 但修改完选项仍未生效(和普通分区修改选项一样),此时要重新挂载,可用swapoff /dev/sd*# 取消挂载之后然后再 swapon -a 或者swapon /dev/sd*#
    • swapon 命令没有remount的选项,所以只能先取消再重新启用swap
/dev/sdc1 swap swap pri=1[,defaults] 0 0
  1. 如果一个主机即没有多于内存插口也没有多于硬盘插口,但内存不够想要增加Swap分区,则可以用一个文件来做swap分区,操作类似上面的把文件当做普通分区,只不过文件系统格式,fstab设置和挂载命令不同而已。**(同样注意要用想要做swap的这个文件名来挂载,不要用UUID,不然开机无法识别,测和之前说的普通文件挂载,IOS文件挂载相同,开机无法识别UUID)**例子:
1.先保证想要用文件模拟swap的这个文件所在的分区(比如下面例子的sdc2分区)中至少有足够空间装swap文件 - 同时要注意,保存Swap文件的这个分区(也就是下面例子里的sdc2分区),一定要此分区提前挂载到一个目录并写入fstab文件中令其开机自动挂载 - 这样以免这个分区没有提前开机挂载,则在其内的模拟swap分区的文件找不到, - 当然在这里只是测试用的,实际上可以直接在根分区或者其他分区创建这个swap文件,但同样也要注意提前挂载好保存swap文件的分区 dd if=/dev/zero of=/mnt/dev/sdc2/swappagefile bs=1M count=2048 2.创建swap分区文件系统 mkswap /mnt/dev/sdc2/swappagefile 3.修改fstab /mnt/dev/sdc2/swappagefile swap swap defaults 0 0 4.立刻启动swap分区 swapon -a 或 swapon /mnt/dev/sdc2/swappagefile free -h 5.修改swap文件权限 chmod 600 /mnt/dev/sdc2/swappagefile 注意提示文件的权限安全问题,可以按照建议把文件的权限修改为0600: 11:48[root@centos7 /mnt/dev/sdc2]# swapon -a swapon: /mnt/dev/sdc2/swappagefile: insecure permissions 0644, 0600 suggested.
  • 注意用文件当做swap方式,有权限的安全问题,最好改成 chmod 600 /mnt/dev/sdc2/swappagefile,避免普通用户查看文件中内容
  • 不过用文件创建的swap的方式比用分区性能更差。
  • 想要删除此文件创建的swap分区,则先卸载 swapoff /mnt/dev/sdc2/swappagefile(由于没有挂载点,所以只能写这个文件本身),然后rm删除它即可
  • 同样的其他的swap硬盘类的分区想要删除只需要卸载即可(swapoff 分区设备本身),然后这个硬盘分区就可以重新分区或者格式化用作它用。

6. 移动介质

  • 挂载意味着使外来的文件系统看起来如同是主目录树的一部分
    • 访问前,介质必须被挂载
    • 摘除时,介质必须被卸载
  • 按照默认设置,非根用户只能挂载某些设备(光盘、 DVD、软盘、 USB等等)
  • 挂载点通常在/media/mnt

6.1. 使用光盘—{eject,mkisofs,wodin}

  • 在图形环境下自动启动挂载
    /run/media/< user >/< label >
    • 否则就必须被手工挂载,命令如下 :
        mount /dev/cdrom /mnt/
  • 操作光盘(可利用它确认机房中机器的位置~~):
    eject 弹出光盘
    eject -t 插入光盘
  • 创建ISO文件
    cp /dev/cdrom /root/centos.iso :./dev/cdrom就是软连接到/dev/sr0
    mkisofs -r -o /root/etc.iso /etc :类似于tar ,把/etc下的文件打包成光盘iso文件。
  • 刻录光盘
    wodim –v –eject centos.iso

6.2. 挂载USB介质—{lsusb}

  • 查看USB设备是否识别 lsusb
  • 被内核探测为SCSI设备 /dev/sdaX、 /dev/sdbX或类似的设备文件
  • 在图形环境中自动挂载 图标在[计算机]窗口中创建
    挂载在/run/media/<user>/<label>
  • 手动挂载
    mount /dev/sdb1 /mnt
  • 注意U盘必须是fat格式 NTFS格式不支持

7. 查看文件系统常用的工具—{df,du}

7.1. 文件系统空间占用等信息的查看工具

df [OPTION]... [FILE]... -H 以10为单位 -T 文件系统类型 -h human-readable -i inodes instead of blocks -P 以Posix兼容的格式输出

7.2. 查看某目录总体空间占用状态

du [OPTION]... DIR -h human-readable -s summary --max-depth=# 指定最大目录层级

7.3. df和du注意点5

  1. df只能查看已经挂载上的设备或文件信息
    • -P用于对应显示,当文件名比较长的时候对齐可用它
  2. 默认du显示当前文件夹内每个文件的大小,以K为单位(注意默认是有单位的),加上-s显示当前文件夹内所有文件大小总和
  3. du -sh /* :看根下面所有文件夹大小
    • 常用 du -sh
    • du * -sh
  4. 这两个命令都是显示真实大小,ll显示逻辑大小,但是df能看到所有文件包括元数据(inode)总共占用的空间,而du只能看到文件占用的空间,这点需要注意

8. 转换和拷贝文件工具dd—{dd}

  • dd 命令:convert and copy a file
  • 用法:
dd if=/PATH/FROM/SRC of=/PATH/TO/DEST bs=# count=# if=file 从所命名文件读取而不是从标准输入 of=file 写到所命名的文件而不是到标准输出 ibs=size 一次读size个byte,注意这里size可以加单位,比如M,G,K等等,下同 obs=size 一次写size个byte bs=size block size, 指定块大小(既是是ibs也是obs,同时读取和写入size个byte) cbs=size 一次转化size个byte skip=blocks 从开头忽略blocks个ibs大小的块 seek=blocks 从开头忽略blocks个obs大小的块 count=n 复制n个bs
  • conv=conversion[,conversion...] 用指定的参数转换文件
转换参数: ascii 转换 EBCDIC 为 ASCII ebcdic 转换 ASCII 为 EBCDIC lcase 把大写字符转换为小写字符 ucase 把小写字符转换为大写字符 nocreat 不创建输出文件 noerror 出错时不停止 notrunc 不截短输出文件 sync 把每个输入块填充到ibs个字节,不足部分用空(NUL)字符补齐 fdatasync 写完成前,物理写入输出文件 转换举例 例如把小写字母转换为大写字母: # dd if=/etc/fstab of=/data/FSTAB conv=ucase 1+1 records in 1+1 records out 810 bytes (810 B) copied, 0.000294966 s, 2.7 MB/s # cat /data/FSTAB # # /ETC/FSTAB # CREATED BY ANACONDA ON WED NOV 4 01:58:42 2020 # # ACCESSIBLE FILESYSTEMS, BY REFERENCE, ARE MAINTAINED UNDER '/DEV/DISK' # SEE MAN PAGES FSTAB(5), FINDFS(8), MOUNT(8) AND/OR BLKID(8) FOR MORE INFO # UUID=0CDDFC17-8304-4C27-BABD-C45E693EFF33 / XFS DEFAULTS 0 0 UUID=787D4A7C-EA9D-4A8F-9547-807DB5EB8891 /BOOT XFS DEFAULTS 0 0 UUID=ABB50E00-E5DE-4FD1-9D1D-7FC29C6807C4 /DATA XFS DEFAULTS 0 0 UUID=46726829-6042-4C52-BD1E-21412A9B2249 SWAP SWAP DEFAULTS 0 0 UUID=2DE2FC3E-A7F9-407B-ABE8-5FA292097CFC /MNT/SDB1 XFS DEFAULTS 0 0 /DATA/TEST/BIGFILE /MNT/BIGFILE XFS DEFAULTS 0 0 /SWAP/SWAPFILE SWAP SWAP DEFAULTS 0 0

8.1. 备份和恢复硬盘等等用法举例(利用dd命令)

8.1.1. 备份MBR

dd if=/dev/sda of=/tmp/mbr.bak bs=512 count=1

8.1.2. 破坏MBR中的bootloader

dd if=/dev/zero of=/dev/sda bs=64 count=1 seek=446

  • 示例:有一个大与2K的二进制文件fileA。现在想从第64个字节位置开始读取,需要读取的大小是128Bytes。又有fileB,想把上面读取到的128Bytes写到第32个字节开始的位置,替换128Bytes,实现如下
    dd if=fileA of=fileB bs=1 count=128 skip=63 seek=31 conv=notrunc

8.1.3. 硬盘备份:

dd if=/dev/sdx of=/dev/sdy :将本地的/dev/sdx整盘备份到/dev/sdy
dd if=/dev/sdx of=/path/to/image :将/dev/sdx全盘数据备份到指定路径的image文件
dd if=/dev/sdx | gzip > /path/to/image.gz :备份/dev/sdx全盘数据,并利用gzip压缩,保存到指定路径

8.1.4. 恢复:

dd if=/path/to/image of=/dev/sdx :将备份文件恢复到指定盘
gzip -dc /path/to/image.gz | dd of=/dev/sdx :将压缩的备份文件恢复到指定盘

8.1.5. 拷贝内存资料到硬盘

dd if=/dev/mem of=/root/mem.bin bs=1024 : 将内存里的数据拷i贝到root目录下的mem.bin文件

8.1.6. 从光盘拷贝iso镜像

dd if=/dev/cdrom of=/root/cd.iso : 拷贝光盘数据到root文件夹下,并保存为cd.iso文件

  • 用cp和dd都可以直接创建iso文件

8.1.7. 销毁磁盘数据

dd if=/dev/urandom of=/dev/sda1
利用随机的数据填充硬盘,在某些必要的场合可以用来销毁数据,执行此操作
以后,/dev/sda1将无法挂载,创建和拷贝操作无法执行

8.1.8. 得到最恰当的block size

dd if=/dev/zero of=/root/1Gb.file bs=1024 count=1000000
dd if=/dev/zero of=/root/1Gb.file bs=2048 count=500000
dd if=/dev/zero of=/root/1Gb.file bs=4096 count=250000
通过比较dd指令输出中命令的执行时间,即可确定系统最佳的block size大小

8.1.9. 测试硬盘写速度(写入哪就是测那个硬盘,下同)

dd if=/dev/zero of=/root/1Gb.file bs=1024 count=1000000 conv=fdadasync

8.1.10. 测试硬盘读速度

dd if=/root/1Gb.file bs=64k | dd of=/dev/null (它会利用内存,最好每次都清一下内存再测)

  • 这只是简单测试,并不准确

8.2. dd注意点:

  1. 不写count的话,默认是拷贝文件内所有内容。ibs和obs可以让一次性读写的块的大小分别设置不同的数值。
  2. dd if=/dev/zero bs=1 count=200 >/data/testdd 可以直接重定向到一个文件,也可以用of,也可以用管道先压缩然后在重定向到一个文件,比如上面的硬盘备份。
  3. dd默认先写入缓存buffer,等待一段时间后后台再写入文件,用conv=fdatasync可以写入缓存区之后,结束整个命令后直接写入磁盘文件中。可以用这个命令简单测试磁盘速度。
  4. conv=notrunc 选项代表着如果输入文件的字符块数比输入文件字符块数小,则输入到输出文件替换的时候只替换修改的部分(seek之后,seek+count之前),输入文件原本的前后其他部分仍然保留不变。如果不加上这个选项,则输入之后输出文件的被替换部分(seek之后所有的字符块)之后的所有字符块都将被消掉写入输入的字符块内容,不论长短。
最后修改日期: 2021年7月7日

作者

留言

撰写回覆或留言

发布留言必须填写的电子邮件地址不会公开。