开发者学堂课程【Linux 磁盘与文件系统管理:文件系统管理-1】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/589/detail/8330
文件系统管理-1
内容介绍:
一、知识内容回顾
二、mount 命令
三、卸载命令
四、挂载点和 /etc/fstab
一、知识内容回顾
对于一个硬盘,在拿到后如何进行硬盘空间的使用?
第一布创建分区,第二步创建文件系统第三步进行挂载。
第一步创建分区涉及到分区的两种方式:
MBR 和 GPT 的分区方式这两种方式最大的区别主要是体现在 GPT 可以支持更大的分区,而 lbr 只支持最大为2个 T 的分区。
目前使用 MBR 的方式更为多一些,而对应使用的管理工具有 fdisk、gdisk、parted,这两种可以用于创建分区。
fdisk 是对于 MBR 来讲是一个更为成熟的选择、gdisk 是对于 GPT 更为高效的,这两者的使用风格更为相似。
分区创建后,就会有可能带来同步的问题,尤其是旧的此磁盘上面已经分完了,并且是处在一个使用的状态下,如果继续创建新分区当使用 fdisk 的工具来创建新分区后保存,可能会弹出分区不同步的提示.win6 和 win7 的同步方式是不同的,
win6 的同步方法:
对于增加分区,则使用 parted-a,后面接上所用的硬盘;对于删除分区,则使用 -d或是 —nr,接上所删掉的分区编号,或’-‘删掉分区的范围, 后面接上所用的硬盘这就完成同步,注意在分区后及时查看是否同步成功。只有同步成功后,才能在后面创建文件系统,否则文件系统会不存在,后面的步骤无法进行。
第二步文件系统创建,‘make fs‘。在创建过程中可能需要指定一些选项,比如保留空间百分比,块大小若干值可以用来指定,但大部分我们采用的是默认值即可。
最后,将创建好的文件系统分区挂载到可使用的目录下来运用。这样分区就能进行存储数据。
挂载的关系具有一定的规定,当一个设备要挂载到目录上,目录必须为已存在的。特殊情况下,在曾经使用的神奇的目录下,本来没有,访问之后就出现目录的光盘挂载到目录里,这运用的是一种特殊技术。通常情况,挂载是要先将目录创建好,后将设备(可以是光盘、硬盘等等)挂载到目录中,在上次的教学中发现的一些规则,一个设备可以挂在多个目录上,但一个目录在多个设备上只有最后一个生效。
如果在一个目录上事先已经有了数据,现在把新的设备挂在目录上,所看到的数据就是来自新的设备,而原来的数据是被隐藏,意味着如果不卸载就会永远看不到原来的数据内容,浪费空间。所以通常下应该是挂载在一个空的目录上。
二、mount 命令
1.挂载 mount
挂载:将额外文件系统与根文件系统某现存的目录建立起关联关系,进而使得此目录做为其它文件访问入口的行为
卸载:为解除此关联关系的过程
把设备关联挂载点:mount Point
mount
卸载时:可使用设备,也可以使用挂载点
umount
挂载点下原有文件在挂载完成后会被临时隐藏
挂载点目录一般为空
2. 用 mount 命令挂载文件系统
挂载方法: mount DEVICE MOUNT POINT
mount:通过查看 /etc/mtab 文件显示当前已挂载的所有设 mount [-fnrsvw] [-t vfstype] [-o options]device dir
device:指明要挂载的设备;
设备文件:例如 /dev/sda5
卷标:-L'LABEL', 例如 -L'MYDATA'
UUID,-U'UUID':
例如 -U'0c50523c-43f1-45e7-85c0-a126711d406e
伪文件系统名称:procsysfs, devtmpfs, configfs
dir:挂载点
事先存在;建议使用空目录
进程正在使用中的设备无法被卸载
挂载除了之前演示的,还可以使用其它的配置方法,比如 -U’UUDI’或者是-L’LABLE‘ 来挂载,不一定需要写设备名。前面曾提出过关于设备名不稳定的问题,推荐使用 -U’UUID’,卷标的方式来挂载,卷标实际上不如 -U‘UUID’,因为 -U’UUID’能确保设备的唯一标识,它通常来讲只要创建好文件系统且后期没有变化,那么它是不会变化的,需要用到时候要在后面加上挂载点。
例如在 centos6 的当前 IP 上
观察到以下代码为当前可以看到的分区处于挂载状态下
[root@centos6 ~]#df
Filesystem lk-blocks Used Available Use% Mounted on
/dev/sda2 50264772 4719048 42985724 10% /
tumpfs 501508 76 501432 1% /dev/shm
/dev/sda1 999320 34116 912776 4% /boot
/dev/sda3 30106376 44996 28525580 1% /data
/dev/sr0 3897932 3897932 0 100% /media/centos _6.10_Final
/dev/sr0 3897932 3897932 0 100% /misc/cd
查询当前的文件系统
上述是一 ext 的文件系统,据代码可以得到它并没有挂载到任何的目录上,是空的。
对上述的 ext4 系统进行挂载操作(采用-U‘UUID’),代码如下:
[root¢os6 ~]#mkdir /mnt/sdb1
[root¢os6 ~]#mount-U 5fffaeb1-388d-44e5-b753-7652bcec69411 /mnt/sdb1
挂载完毕后运用以下代码可以看到挂载后的结果:
[root¢os6 ~]#df -h
对正在使用的分区:
[root¢os6 ~]#cd /mnt/sdb1
[root¢os6 sbd1]#cd
[root¢os6 ~]#cd~
/mnt/sdb1
此时如果用 umount 卸载设备,会出现此设备正忙的提示,也就是并未卸载成功,只要离开这个目录的情况下才可以。
[root¢os6 sbd1]umount /mnt/sdb1
umount: /mnt/sdb1:device is busy.
(In some cases useful info about processes that use
The device is found by lsof(8) or fuser(1))
[root¢os6 sbd1]#cdf
-bash: cdf:command not found
[root¢os6 sbd1]#cd
[root¢os6 ~]#umount /mnt/sdb1
在其它终端使用下,要想取消挂载,执行以下代码
[root¢os6 sbd1]#umount /mbt/sdb1
操作不成功,依旧会出现以下代码的情况
umount: /mnt/sdb1:device is busy.
(In some cases useful info about processes that use
The device is found by lsof(8) or fuser(1))
由于是需要知道是哪一个终端在使用,可以使用以下命令来查询;
[root¢os6 ~]# losf /mnt/sdb1
可以得到正在使用该目录的用户身份、命令
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
bash 2927 root cwd DIR 8,17 4096 2 /mnt/sdb1
或是使用下列命令来完成
[root¢os6 ~]#fuser -v /mnt/sdb1
USER PID ACCESS COMMAND
/mnt/sdb1: root 2927 ..c.. bash
所以现在用进程管理工具来关闭进程,使用 kill、fuser 来关掉,这里使用 fuser 来演示。
Fuser 的方式更为简单,因为使用这个进程的不止是一个人,这就带来了进程数量很多的问题,fuser 是将使用此目录全部终端的进程关闭掉
[root¢os6 ~]#fuser -km /mnt/sdb1
执行之后,会将其它终端全部剔除,注意如果在关掉过程中,部分终端在进行数据存储,这个操作会导致数据损失,需要提前告知各个终端。
可以看到有一个软件进程正在使用 2927,bash
3.mount 常用命令选项
(1)-t vsftype 指定要挂载的设备上的文件系统类型(一般不用写指定它的文件系统、mount 命令会自动选择合适的挂载系统进行挂载。也就是说文件系统是一种,挂的时候是另一种,例如文件系统是 ext3,但在挂的时候用 ext2 的方式挂载,这种方式严重不推荐,如果不匹配,会造成文件功能无法充分使用)
(2)- readonly,只读挂载
rw 是默认可读可写
只读挂载操作:
[root¢os6 ~]#
mount -r -U
5ffaeb1-388d-44e5-b753-7652bcec6941 /mnt/sdb1
[root¢os6 ~]# mount (此时只读挂载)
/dev/sda2on/typeext4 (rw)
proc on/proc type proc (rw)
sysfs on/sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
tmpfs on/dev/shm type tmpfs (rw)
/dev/sda1on/boot typeext4 (rw)
/dev/sda3on/data typeext4 (rw)
none on/proc/sys/fs/binfmt_misc type binfmt_misc (rw)
gvfs-fuse-daemonon/root/.gvfstypfuse.gvfs-fuse-daemon (rw,nosuid,nodev)
/dev/sr0 on /media/CentOS_6.10_Final type iso9660(ro, nosuid, nodey, uhelper=udisks, uid= a,gide B.isolanszed utf8, mode=0400, dmode=0500)
/dev/sr0 on /misc/cd type iso9660 (ro,nosuid,nodev)
/dev/sdb1on/mnt/sdb1 type ext4 (ro)
[root¢os6 ~]#cd /mnt/sdb1
[root¢os6 sdb1]#touch a
touch:cannot touch ‘a’:Read-only file system
此时,作为 root 身份不能够去写这个文件系统。同时当担心所挂载的内容被破坏也可以选择使用 -r 只读操作来完成
(3)-w read and write, 读写挂载 (一般默认)
(4)-n 不更新 /etc/mtab,mount 不可见
运行:[root¢os6 ~]#cat /ect/mtab
显示:
/dev/sda2on/typeext4 rw 0 0
proc on/proc type proc rw 0 0
sysfs on/sys type sysfs rw 0 0
devpts on /dev/pts type devpts rw,gid=5,mode=620 0 0
tmpfs on/dev/shm type tmpfs rw 0 0
/dev/sda1on/boot typeext4 rw 0 0
/dev/sda3on/data typeext4 rw 0 0
none /proc/sys/fs/binfmt_misc type binfmt_misc rw 0 0
gvfs-fuse-daemon on /root/.gvfs type fuse.gvfs-fuse-daemon rw,nosuid,nodev 0 0
/dev/sr0 /media/CentOS_6.10_Final iso9660 rw, nosuid, nodey, uhelper=udisks, uid= a,gide B.isolanszed utf8, mode=0400, dmode=0500 0 0
/dev/sr0 on /misc/cd type iso9660 ro,nosuid,nodev 0 0
/dev/sdb1on/mnt/sdb1 type ext4 ro 0 0
可以看到 etc 的文件会自动添加,然后进行取消挂载操作
运行:[root¢os6 sdb1]#
cd
[root¢os6 ~]#umount /dev/sdb1
[root¢os6 ~]#df
显示:
Filesystem lk-blocks Used Available Use% Mounted on
/dev/sda2 50264772 4719048 42985724 10% /
tumpfs 501508 76 501432 1% /dev/shm
/dev/sda1 999320 34116 912776 4% /boot
/dev/sda3 30106376 44996 28525580 1% /data
/dev/sr0 3897932 3897932 0 100% /media/centos _6.10_Final
/dev/sr0 3897932 3897932 0 100% /misc/cd
查询设备是否更新,运行代码:[root¢os6 ~]#cat /ect/mtab
显示:
/dev/sda2on/typeext4 rw 0 0
proc on/proc type proc rw 0 0
sysfs on/sys type sysfs rw 0 0
devpts on /dev/pts type devpts rw,gid=5,mode=620 0 0
tmpfs on/dev/shm type tmpfs rw 0 0
/dev/sda1on/boot typeext4 rw 0 0
/dev/sda3on/data typeext4 rw 0 0
none /proc/sys/fs/binfmt_misc type binfmt_misc rw 0 0
gvfs-fuse-daemon on /root/.gvfs type fuse.gvfs-fuse-daemon rw,nosuid,nodev 0 0
/dev/sr0 /media/CentOS_6.10_Final iso9660 rw, nosuid, nodey, uhelper=udisks, uid= a,gide B.isolanszed utf8, mode=0400, dmode=0500 0 0
/dev/sr0 on /misc/cd type iso9660 ro,nosuid,nodev 0 0
可以看到文件会自动进行修改,这也就说明只要通过 mount 命令进行修改挂载,会自动默认更新这个 mtab 文件,记录当前的挂载情况。如果不想更新就需要用到下面讲述的 -n。
-n 不更新 /etc/mtab,mount 不可见
运行到这一步,发现没有添加之后的显示并且没有提示报错,这个命令和 mount 命令都看不到,进行以下操作。
[root¢os6 ~]#cd /mnt/sdb1
[root¢os6 sdb1]#ls
f1 lost+found
这就表示已经挂载上。
注意:lost+found 通常是讲一个独立分区的根,这是ext文件系统的特性,这种系统只要创建好一个,就会默认 lost+found,这个一般是用在因为异常导致文件不可访问,不知道在哪一个目录中,就会放置在这个里面,只要是分区的根都是具有这个功能的
另一种查看挂载成功的方式;
[root¢os6 ~]#cat /proc/mounts
rootfs/rootfs rw 0 0
proc /proc proc rw, relatime 0 0
sysfs /sys sysfs rw, relatime 0 0
devtmpfs /dev devtmpfs rw, relatime, size=487196k, nr_ inodes=121799,mode=755 0 0
devpts/dev/pts devpts rw,relatime,gid=5,mode=620,ptmxmode=000 0 0
tmpfs/dev/shm tmpfs rw, relatime 0 O
/dev/sda2/ext4inw,relatime,barrier=1,data-ordered 00/proc/bus/usb/proc/bus/usb usbfs rw, relatime 00
/dev/sdal /boot ext4rw, relatime, barrier=1, data=ordered 0 0
/dev/sda3 /data ext4rw, relatime, barrier=1, data=ordered 0 0
None /proc/sys/fs/binfrit_misc binfmt_misc rw,relatime 0 0
/etc/auto.misc/miscautofsrw,relatine,fd=7,pgrp=2074, timeout=300,minproto=5,maproto=5,indirect 0 0
-host/netautofsr rw,relatime,fd=13,pgrp=2074,timeout=300,minproto=5,maxproto=5,indirect 0 O
gvfs—fuse—daemon/root/.qwfsfuse.quis—fuse—daemon nosuid, nodev, relatime, use_id=0,group_id=O 0 0
/dey/sr0/media/CentOS_6.10_Finaliso99660ro,nosuid, nodev,relatime,uid=0,,gid=0,iocharset=utf8,mode=0400,dmode=0500 0 0
/dev/srol/misc/iso9660 ro,nosuid,nodev,relatime,uid=0,gid=0,iocharset=utf_8,mode=0400,dmode=0500 0 0
/dev/sdb1/mnt/sdb1 ext4 rw,relatime,barrier=1, data=ordered O O
能够看到此时是出于挂载状态的,所以使用-n 的好处是可以隐藏挂载。
matb 实际上就是记录 mount 目录上的内容,即 mtap 文件和 mount 的效果是相同的,所以 mount 看不到的 mtab上也看不见。采用在 /proc/mounts 的目录下,可以看到所有的挂载信息,包括隐藏挂载。
(5)-a 自动挂载所有支持自动挂载的设备(定义在了 etc/fstab 文件中,且挂载选项中有 auto 功能
(6)-L‘LABEL' 以卷标指定挂载设备
(7)-U 'UUID' 以 UUID 指定要挂载的设备
(8)-B,--bind 绑定目录到另一个目录上
可以先建造一个空目录,然后用目录挂目录,并且需要在后面跟上-B或 —bind
[root¢os6 ~]#mount /boot /mnt/boot --bind
进入 matb 的 boot 下
[root¢os6 ~]#ls /mnt/boot
config-2.6.32-754.e16.x86_64initramfs-2.6.32-754.e16.x86_64.img System.map-2.6.32-754.e16.x86_64
efi lost+found vmlinuz-2.6.32-754.e16.x86_64
grub System-2.6.32-754.e16.x86_64
[root¢os6 ~]#ls /boot
config-2.6.32-754.e16.x86_64initramfs-2.6.32-754.e16.x86_64.img System.map-2.6.32-754.e16.x86_64
efi lost+found vmlinuz-2.6.32-754.e16.x86_64
grubSystem-2.6.32-754.e16.x86_64
可以看到两个运行后的结果是相同的。
(9)查看内核追踪到的已挂载的所有设备: cat/proc/mounts
(10)-o options:(挂载文件系统的选项),多个选项使用逗号分隔
①async 异步模式 sync 同步模式内存更改时,同时写磁盘。这两者之间的区别是在挂载之后,往设备上书写数据,即在目录上写文件,选择直接写入磁盘或者是先放入内存中过段时间再批量存入磁盘的这两种方式。显而易见,异步模式更快一些,而同步模式更安全一些效率较差。
②atime/noatime 包含目录和文件
atime 和文件的读时间有关,每打开一次就会记录一次读时间,更新读时间的意义不大。例如,所存的网页数据 HTML、index 文件,这类文件有上千个用户都在访问,并且时间不一定相同,意义不大因此可以把它屏蔽,屏蔽就用 noatime,可以是目录下的文件 atime 不会再更新,不用进行磁盘的写操作负载,这项就可以在生产数据关掉,也就会提高效率。
例如在 boot 下找一个文件
[root@centos6 ~]#ll
total 32304
-rw-r—r--.1 root root 10828 Jun 20 05:29 config-2.6.32-754.e16.x86_64
drwxr-xr-x.3 root root 4096 Sep 19 11:41 efi
drwxr-xr-x.2 root root 4096 Sep 19 11:44 qrub
-rw-------.1 root root 25755410 Sep 19 11:43 initramfs-2.6.32-754.el6.x86_64.img
drwx------.2 root root 16384 Sep 19 11:28 lost+found
-rw-r--r—.1 root root 216063 Jun 20 05:30 symvers-2.6, 32-754.el6.x86_64.gz
-rw-r--r--.1 root root 2652834 Jun 20 05:29 System.map-2.6.32-754.el6.x86_64
-rwxr-xr-x.1 root root 4315504 Jun 20 05:29 vmlinuz-2.6.32-754.el6.x86_64
[root@centosboot]#11 --time=atime config-2.6.32-754.e16.x86_64
-rw-r--r--.1 root root 108282 Jun 20 05:29 config -2.6.32-754.e16.x86_64
由于之前已经进行了挂载,所以进入到 /mnt/boot 的目录下查看是一样的
[root¢os6 boot]#mount
/dev/sda2on/type ext4 (rw)
proc on/proc type proc (rw)
sysfs on/sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
tmpfs on/dev/shm type tmpfs (rw)
/dev/sda1on/boot typeext4 (rw)
/dev/sda3on/data typeext4 (rw)
none on/proc/sys/fs/binfmt_misc type binfmt_misc (rw)
gvfs-fuse-daemonon/root/.gvfstypefuse.gvfs-fuse-daemon (rw,nosuid,nodev)
/dev/sr0 on /media/CentOS_6.10_Final type iso9660(ro, nosuid, nodey, uhelper=udisks, uid= a,gide B.isolanszed utf8, mode=0400, dmode=0500)
/dev/sr0 on /misc/cd type iso9660 _(ro,nosuid,nodev)
/boot on/mnt/boot type none (rw,bind)
[root@centos6 boot]#cd /mnt/boot
[root@centos6boot]#11 --time=atime config-2.6.32-754.e16.x86_64
-rw-r--r--.1 root root 108282 Jun 20 05:29 config -2.6.32-754.e16.x86_64
[root@centos6boot]#ll --time=atime config-2.6.32-754.e16.x86_64
-rw-r--r--.1 root root 108282 Oct 19 09:23 config -2.6.32-754.e16.x86_64
先取消挂载,在本次重新挂载后面加上 noatime:
[root@centos6 ~]#umount /mnt/boot
[root@centos6 ~]#mount -B -o noatime /boot /mnt/boot
[root@centos6 ~]#cd /mnt/boot
[root@centos6 boot]#ls
config-2.6.32-754.e16.x86_64initramfs-2.6.32-754.e16.x86_64.img System.map-2.6.32-754.e16.x86_64
efi lost+found vmlinuz-2.6.32-754.e16.x86_64
grub System-2.6.32-754.e16.x86_64
继续找一个目录 (grub)
total 280
-rw-r—r-- .1 root root 63 Sep 19 11:44 device.map
-rw-r—r-- .1 root root 13428 Sep 19 11:44 e2fs_stage1_5
-rw-r—r-- .1 root root 12636 Sep 19 11:44 fat_stage1_5
-rw-r—r--.1 root root 11780 Sep 19 11:44 ffs_stage1_5
-rw------- .1 root root 835 Sep 19 11:44 grub.conf
-rw-r—r-- .1 root root 11772 Sep 19 11:44 iso9660_stabe1_5
-rw-r—r-- .1 root root 13284 Sep 19 11:44 jfs_stage1_5
lrwxrwxrwx.1 root root 11 Sep 19 11:44 menu.lst ->./grub.conf
-rw-r—r-- .1 root root 11972 Sep 19 11:44 minix _stage1_5
-rw-r—r-- .1 root root 14428 Sep 19 11:44 reiserfs_ stagel_5
-rw-r—r-- .1 root root 1341 Nov 15 2010 sp1ash.xpm.gz
-rw-r—r-- .1 root root 512 Sep 19 11:44 stage1
-rw-r—r-- .1 root root 126148 Sep 19 11:44 stage2
-rw-r—r-- .1 root root 12040 Sep 19 11: 44 ufs2_stage1_5
-rw-r—r-- .1 root root 11380 Sep 19 11: 44 vstafs _stage1_5
-rw-r—r-- .1 root root 13980 Sep 1911: 44 xfs._stage1_5
[root@centos6 grub]#ll --time=atime grub.conf
-rw------- .1 root root 835 Oct 19 09:25 grub.conf
此时时间依旧发生了变化直接对目录挂载是无效的,要直接对设备
挂载。目录终究不是一个文件系统。
③
diratime/nodiratime
目录的访问时间戳
④
auto/noauto
是否支持自动挂载,是否支持 -a 选项
⑤
exec/noexec
是否支持将文件系统上运行应用程序 与前面提到的-a的用法是相关的
现在重新挂载将 /dev/sdb1 挂到 /mnt/sdb1 上
[root@centos6 grub]#mount /dev/sdb1 /mnt/sdb1
mount:/dev/sdb1 already mounted or /mnt/sdb1 busy
可以看到是处于已挂载的状态,进入目录下并创建可执行文件
[root@centos6 sdb1]#ls
f1 lost+found
[root@centos6 sdb1]#cat >f1.sh
hostname
添加执行权限
[root@centos6 sdb1]#chomod +x f1.sh
[root@centos6 sdb1]#ll
total 20
-rw-r--r--+ 1 root root 0 Oct 17 17:49 f1
-rwxr-xr-x 1 root root 9 Oct 19 09:26 f1.sh
drwx------ 2 root root 16384 Oct 17 17:49 lost+found
[root@centos6 sdb1]#.f1.sh
Centos localdomain
[root@centos6 sdb1]#cd
可以用 remount 来重新挂载。
[root@centos6 ~]#mount -o remount,/mnt/sdb1
mount:Can’t find /mnt/sdb1 in /etc/fstab or /etc/mtab
因为采用的是隐藏挂载,这个设备做不到,因此只能取消挂载,重新挂载并且加入noexec
[root@centos6 ~]#umount /mnt/sdb1
[root@centos6 ~]#mount -o noexec /dev/sdb1 /mnt/sdb1
然后进入目录
[root@centos6 ~]#cd /mnt/sdb1
[root@centos6 sdb1]#ls
f1 f1.sh lost+found
[root@centos6 sdb1]#./f1.sh
-bash:/f1.sh :Permission denied
[root@centos6 sdb1]#ll
total 20
-rw-r--r--+ 1 root root 0 Oct 17 17:49 f1
-rwxr-xr-x 1 root root 9 Oct 19 09:26 f1.sh
drwx------ 2 root root 16384 Oct 17 17:49 lost+found
可以得到加入了 noexec,就代表可执行的程序失去了执行能力
此时加上 -o remount,exec 来获得执行能力
即,[root@centos6 ~]#mount -o remount exec /mnt/sdb1
然后进入目录
[root@centos6 ~]#cd /mnt/sdb1
[root@centos6 sdb1]#./f1.sh
centos6.localdomain
remount 相当于不需要使用 umount 以及再挂载,这种将两个命令合为一条命令方式
⑥dev/nodev 是否支持在此文件系统上使用设备文件
⑦suid/nosuid 是否支持 suid 和 sgid 权限
⑧remount 重新挂载
⑨ro只读 rw 读写
是类似于之前的 -r 使用,相当于只设置了只读属性
[root@centos6 sdb1]#mount
/dev/sda2on/type ext4 (rw)
proc on/proc type proc (rw)
sysfs on/sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
tmpfs on/dev/shm type tmpfs (rw)
/dev/sda1on/boot typeext4 (rw)
/dev/sda3on/data typeext4 (rw)
none on/proc/sys/fs/binfmt_misc type binfmt_misc (rw)
gvfs-fuse-daemonon/root/.gvfstypefuse.gvfs-fuse-daemon (rw,nosuid,nodev)
/dev/sr0 on /media/CentOS_6.10_Final type iso9660(ro, nosuid, nodey, uhelper=udisks, uid= a,gide B.isolanszed utf8, mode=0400, dmode=0500)
/boot on/mnt/boot type none (rw,bind,noatime)
/dev/sdb1 on /mnt/sdb1 type ext4(rw)
想改成只读,配合刚刚的 remount 实现
同样的方法,将 ro 换成 rw 就可以可读可写
[root@centos6 sdb1]#mount -o remount,rw /mnt/sdb1
[root@centos6 sdb1]#touch f2
[root@centos6 sdb1]#ll
total 20
-rw-r--r--+ 1 root root 0 Oct 17 17:49 f1
-rwxr-xr-x 1 root root 9 Oct 19 09:26 f1.sh
-rw-r--r-- 1 root root 0 Oct 19 09:29 f2
drwx------ 2 root root 16384 Oct 17 17:49 lost+found
这就是不需要取消挂载就可以修改挂载的特性的方式。
现在想添加一个acl功能,在之前的文件中是不具备这种功能的。
[root@centos6 sdb1]#setfacl -m u:wang:rwx f2
查询之前是否手工加入过 acl 功能,
[root@centos6 sdb1]#tune2fs -1 /dev/sdb1
可以看到这个功能是具备的。
进行对 acl 功能的删除系统一般默认是不具备这个功能的,这里是由于在前面的学习中添加过。
[root@centos6 sdb1]#tune2fs -o ^acl /dev/sdb1
tune2fs 1.41.12 (17-May-2010)
删掉后重新挂载,默认是不具备 acl 功能的
[root@centos6 ~]#umount /dev/sdb1
[root@centos6 ~]#mount /dev/sdb1 /mnt /sdb1
[root@centos6 ~]#cd /mnt/sdb1
[root@centos6 sdb1]#ls
f1 f1.sh f2 lost+found
再通过设置刚刚的命令,可以看到此时是不支持 acl 功能
添加 acl 功能的挂载
acl 添加成功之后代码就会执行成功
[root@centos6 sdb1]#setfacl -m u:wang:rwx f2
在挂载的时候可以通过两个命令实现 acl,一个是 [root@centos6 sdb1]#tune2fs -o acl /dev/sdb1,还有一种是人工 mount 中敲写代码。
这些都是在 centos6 中运用,centos7 用不上它默认所有都具备 acl 功能。
删掉 acl
[root@centos6 sdb1]#mount -o remount,noacl /dev/sdb1
[root@centos6 sdb1]#mount
/dev/sda2on/type ext4 (rw)
proc on/proc type proc (rw)
sysfs on/sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
tmpfs on/dev/shm type tmpfs (rw)
/dev/sda1on/boot typeext4 (rw)
/dev/sda3on/data typeext4 (rw)
none on/proc/sys/fs/binfmt_misc type binfmt_misc (rw)
在结果中看到添加上了
[root@centos6 sdb1]#setfacl -m u:wang:rwx f2
setfacl:f2:Operation not supported
[root@centos6 sdb1]#mount -o remount,noacl /dev/sdb1
此时,它又具备了 acl 功能,意味着是后面的会将前面的内容覆盖掉。
因为不断使用的是 mount 挂载,那么用 umount 取消挂载是不会发生刚刚的那种问题,它写什么功能就有什么功能,不加就不会有某种功能。
Remount 是非常实用的,在某些情况下取消挂载是不现实的,比如根是不能取消挂载的。
比如现在所有的分区中,boot 是能取消的 ,boot 是已经用完的都已经加载到内存里,不再需要使用的。
但是根是取消不掉,因为现在的运行程序都在使用根,boot是能取消因为没有程序在使用它,之前的测试中得到了取消挂载要求不能有正在使用的程序的结论
恢复原来的 boot
恢复后,就可以看到原来的数据
[root¢os6 ~]#ls /boot
config-2.6.32-754.e16.x86_64initramfs-2.6.32-754.e16.x86_64.img System.map-2.6.32-754.e16.x86_64
efi lost+found vmlinuz-2.6.32-754.e16.x86_64
grub System-2.6.32-754.e16.x86_64
查询一个目录是否被人使用
[root¢os6 ~]#lsof /boo
或者是
[root¢os6 ~]#fuser -v /boot
如果编一个脚本来实现取消挂载,需要事先进行判断目录是否被人使用。所以需要编一个逻辑,判断目录是否被人使用,没人在用就直接取消;有人在用那么先用fuser km来关掉上面的进程在取消。
[root¢os6 ~]#lsof /boot
[root¢os6 ~]#echo $?
1
1这就表示没有人在使用这个目录,0就表示有人在使用这个目录。实际上挂载关系lsof 是一个通用命令,它是观察进程信息的,不仅可以查看目录,还可以查看许多内容
⑩user/nouser 是否允许普通用户挂载此设备 /etc/fstab 使用 一般是由管理员来进行挂载
acl 启用此文件系统上的 acl 功能
loop 使用 loop 设备 允许把磁盘上的文件挂载到目录上,注意是文件不是设备。
即可以拿文件在上面创建文件系统。
现在挂载到目录里
[root@centos6 ~]#mkdir /mnt/ext4
[root@centos6 ~]#mount -o loop /data/ext4file /mnt/ext4
centos6 中必须加入 -o,centos7 中就不需要加入,loop 是代表回环的意思。
将f1f2文件拷贝
[root@centos6 ext4]#cp /etc/fstab f1
[root@centos6 ext4]#cp /etc/fstab f2
[root@centos6 ext4]#ls
f1 f2 lost+found
由于本身是一个文件,所以可以将它拷走
[root@centos6 ext4]# scp /data/ext4file 192.168.35.7:/data
^[root@centos6 ext4]# scp /data/ext4file 192.168.34.7:/data
The authenticity of host '192.168.34.7(192.168.34.7)” can't be established.
RSAkefingerprinis es:51:53:97:dc:c5:eb:a2:82:47:fb:1d:69:36:87:9b.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added'192.168.34.7'(RSA) to the list of known hosts.
root@192.168.34.7's password:
ext4file 100%100MB 100,0MB/s 00:01
进入 centos7
查询:
[root@centos7 ~]#ll /data
total 108736
本身是一个文件系统可以把它挂到文件上去
[root@centos7~]#mkdir /mnt/ext4
[root@centos7~]#mount /data/ext4file /mnt/ext4
[root@centos7~]#ls /mnt/ext4
f1 f2 lost+found
[root@centos7~]#df
Filesystem 1K-blocks Used Available
/dev/sr1 9176232 9176232 0 100% /run/media/root/ CentOS7x86_64
/dev/loop0 95054 1550 86336 2% /mt/ext4
它会自动分配一个设备来进行挂载
但在 centos6 上,它的 df 也用到了,但并不显示出来
[root@centos6 ext4]#df
Filesystem lk-blocks Used Available Use% Mounted on
/dev/sda2 50264772 4719048 42985724 10% /
tumpfs 501508 76 501432 1% /dev/shm
/dev/sda3 30106376 44996 28525580 1% /data
/dev/sr0 3897932 3897932 0 100% /media/centos _6.10_Final
/dev/sda1 999320 34116 912776 4% /boot
/data/ext4file 95054 1552 88382 2% /mnt/ext4
用一下命令会显示出来:
[root@ centos6 ext4]#setup
/dev/loop0:[0803]:13 (/data/ext4file)
可以看到当前文件已经放上 loop0 下,这也是为什么要在执行命令的前面加上loop,这个是将文件分入到 loop 设备再放入到文件系统上去。
但是这个 loop 设备存在许多,如何查找 loop 设备
[root@ centos6 ext4]#ll /dev/loop*
brw-rw---- 1 root disk 7,0 Oct 19 08:54 /dev/loop0
brw-rw---- 1 root disk 7,1 Oct 19 08:54 /dev/loop1
brw-rw---- 1 root disk 7,2 Oct 19 08:54 /dev/loop2
brw-rw---- 1 root disk 7,3 Oct 19 08:54 /dev/loop3
brw-rw---- 1 root disk 7,4 Oct 19 08:54 /dev/loop4
brw-rw---- 1 root disk 7,5 Oct 19 08:54 /dev/loop5
brw-rw---- 1 root disk 7,6 Oct 19 08:54 /dev/loop6
brw-rw---- 1 root disk 7,7 Oct 19 08:54 /dev/loop7
一共由8个 loop,这一次挂载选择了 loop0,那么在下一次分配的时候会自动选择loop1,以此类推。当挂载的文件数大于 loop 的个数,对于 centos6 来说,可以拓展它的数量,这就需要我们修改它的参数。但在 centos7 上面就不需要,它上面的 loop 设备是自动增长的,需要几个就会自动生成几个
在 centos 下如何增加 loop 数量,需要在 boot 下对应的内核的配置文件进行修改。
[root@centos6 ext4] #vim /boot/grub/grub.conf
找到 kerne 的所在行,加上 max_loop =100
设定后需要重启才能有效
[root@centos6 ext4] #rebo
在 centos6和centos7 上有些命令是有一些细微差别
例如,[root@centos7 ~] #losetup 就可以直接用,但在 centos6 上还需要加入 -a才能正常使用
由于刚刚对 centos6 进行重启,此时的 mount 数据全部丢失,它只是一个临时的存储,需要重新挂载
[root@centos6 ~]#ll /dev/loop*
此时具有100个loop 可以使用。如果要恢复原来的是个同样的步骤将刚刚添加上的max_loop =100 删掉即可
[root@centos6 ~]#mount -o loop /data/ext4file /mnt/ext4
可以不加 loop,但需要事先人为的把文件和 loop 设备做好映射关系,这也支持挂载。但这样的映射需要用 losetup 将文件与设备连接
[root@centos6 ~]#losetup /dev/loop10 /data/ext4file
[root@centos6 ~]#losetup -a
完成之后就不需要在 mount 的时候加入 -o loop
dev 和 nodev 这个两个设备文件,比如在之前 centos6 下的 /dev/zero 就是一个设备文件,这种文件放在挂载的目录默认是可以使用的,也可以用 nodiv 设置为不可以
挂载后可以看到此目录下的 zero 文件,必须写上 -a 来保留它的属性。
此时,这个设备就不具备了使用能
为了安全有时会将 nodev 和 nosuid 的功能禁用,防止来路不明的光盘U盘对文件的挂载加上保护措
defaults:相当于 rwsuid, dev, exec, auto, nouser, async
三、卸载命令
查看挂载情况 findmnt MOUNT_POINT | device
可以用来查看某个文件是否处于挂载状态,以 /boot 为例
[root@centos6~]#
findmnt /boot
TARGET SOURCE FSTYLE OPTIONS
/boot /dev.sda1 ext4 rw,relatime ,barrier=1,data=ordered
[root@centos6~]#
findmnt /etc
[root@centos6~]#echo $?
1
[root@centos6~]#
findmnt /boot
TARGET SOURCE FSTYPE OPTIONS
/boot /dev/sda1 ext4 rw,relatime,barrier=1,data=ordered
[root@centos6~]#
echo $?
0
意味着只要后面的 findmnt 加上一个文件就可以判断出是否为一个挂载点,0是,1不是在写脚本进行挂载的时候要先看是否已经有了挂载的设备,由于新的挂载会覆盖原来的挂载设备,这就用到了这个判断方法。
查看正在访问指定文件系统的进程
lsof MOUNT_POINT
fuser -v MOUNT_POINT
终止所有在正访问指定的文件系统的进程
fuser -km MOUNT POINT
卸载
umount DEVICE
umount MOUNT POINT
注意:本次讲的所有挂载都是临时挂载,当机器重启后,一切记录都会消失。而且普通用户是不具备挂载设备的能力,普通用户是可以访问目录的,这里也就是体现了神奇的目录带来的一些好处。只要过一段时间不再访问,会自动取消挂载。这个访问不限于ls cd,只要访问,就会自动挂载
四、挂载点和 /etc/fstab(file system table)
1.概要
大部分命令是短暂生效的,要想记住命令需要重启保留文件,这就需要用到 fstab文件,它起到挂载的效果是 fs 的表,而 mtab 是 mem table 内存中的挂载表,这个比较特殊
一般 etc 中的文件大部分都不是内存中的数据,需要手工去改,它是磁盘的文件,但 mtab 是寸内存中的挂载信息,只要手工挂就会攻击 mtab 下的文件
u 配置文件系统体系
u 被 mount、fsck 和其它程序使用
u 系统重启时保留文件系统体系
u 可以在设备栏使用文件系统卷标
u 使用 mount-a 命令挂载 /etc/fstab 中的所有文件系统
2.代码演示
[root@centos6~]#
vim/etc/fstable
#/etc/fstab
#Created by anaconda on wed Sep 19 11:31:51 2018
#Accessible filesystems , by reference, are maintained under'/dev/disk'See man pages fstab(S),findfs(8),mount(8) and/or bikid(8) for more info
UUID=aab8912b-7c2c-419a-819f-35d514fe55c8 / ext4 defaults 1 1
UUID=af2a7293-725f-4353-a36c-c3daff96403a /boot ext4 defaults 1 2
UUID=b5d3110d-425f-4851-9265-d0eb666522c9 /data ext4 defaults 1 2
UUID=9da511ed-e024-4c86-811c-90b0d2fba836 swap swap ext4 defaults 0 0
tmpfs /dev/shm tmpfs defaults 0 0
devpts /dev/pts devpts gid=5, mode=620 0 0
sysfs /sys sysfs defaults 0 0
proc /proc proc defaults 0 0
/dev/sdb1 /mnt/sdb1 ext4 ro,acl,noexec 0 3
#开头,代表的是注释,可以看到装系统时间
出现设备的挂载信息,分为磁盘和虚拟内存中的挂载信息;其中磁盘的挂载信息有6项:
每一行代表一个挂载信息,前面四行是磁盘上的挂载,最下面的四行时虚拟内存中的挂载信息。对用户来说关心得是磁盘上的挂载
一共分为六列分别为:
第一列是设备的表示 UUID(预见)、设备名、卷标;第二列是挂载点;第三列是文件系统;第四列是挂载选项,是在前面 mount 上支持得选项如 -o,-acl,-noexec,ro 等,defaults 代表默认值,需要修改就将 defaults 得位置删掉);第五列是数字,代表是否需要备份,0是不备份,1表示1天备份一次,2是2天备份一次(现在这两列选项意义不大,因为备份需要结合专业的软件来做,现在很少使用,这里一般写0就行);第六列是数字,代表文件系统检查得次序,有一个fsck的命令,如果数字为非零值,就会检查文件系统的正确性,并且按照数字的升序进行检查,若数字相同则会同时查找
此时,添加的最后一个文件是未生效的。可以重启生效但较为麻烦,需要 mount 立即生效,-a 使自动支持需要挂载的设备
F1 f1.sh f2 lost+found zero
再改成可读可写
[root@centos6 ~]#vim /etc/fstab
#/etc/fstab
#Created by anaconda on wed Sep 19 11:31:51 2018
#Accessible filesystems , by reference, are maintained under'/dev/disk'See man pages fstab(S),findfs(8),mount(8) and/or bikid(8) for more info
/dec/loop10 on /mnt/ext4 type ext4 (rw)
/dev/sdb1 on /mnt/sdb1 type ext4(ro,noexec,acl)
发现此时并未生效,意味着 -a 并不是万能的,在挂载之前是生效的,当挂载之后修改是无效的,所以这应该使用 -o remount
[root@centos6 ~]#mount -o remount /mnt/sdb1
这种挂载方式最为简单,之前提到过许多挂载,比如挂光盘,挂目录,挂文件的格式。
3.挂光盘,挂目录,挂文件的格式
若文件名有卷标写卷标,有 UUID 写 UUID,
(1)目录挂的格式
(2)文件往目录里挂的格式
(3)挂光盘的格式
(4)过程中产生的问题
如 fsck中发现了一个在超级块中错误的魔术,做法是第一输入 root 口令或者按CTRL+d ,但 CTRL+d 会重启,这就只能输入 root 口令,[root@centos6 ~]#。
需要对刚才的文件进行修复
[root@centos6 ~]#fsck -y /dev/sdb1
检查是否修复成功
[root@centos6 ~]#tune2fs -l /dev/sdb1
这时,会有报错的提示,说该文件不可以改,强行退出也不行。原因是 sdb2 这个分区显示是 rw,但在实际上是只读的方式进行挂载。需要将它挂载方式变为可读可写的,要用到 remount, 也可以在 fstab 文件中修改为0
[root@centos6 ~]#mount
/dev/sdb2 on / type ext4 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
[root@centos6 ~]#pwd
/root
[root@centos6 ~]#touch xxx
touch:cannot touch‘xxx’:Read-only file system
[root@centos6 ~]#mount -o remount.rw /
现在已经改错了一个设备名和一零,现在重启进行观察
会发现能查出一个错误,但对另一个错误不管,还能够正常启动
这也就说明fstab文件最后一列如果输入的是非零值,开机会检查是否有错,若有错,就会停留页面直至错误修复完成,这种会导致服务器不启动,所以考虑将它不要在设置为非零值,就算出错至少还可以在网络上远程修复。
若目录挂载点出现问题,是不会影响挂载启动的
如何查询错误点?可以用下面的命令来查看,出现红色的部分就是错误点。
[root@centos6 ~]#cat /var/log/boot.log
在 centos7 出现问题如何修复?
[root@centos7 ~]#blkid
现在对文件的 UUID 出现错误,
缺少一位变为 UUID= c737ecf7-6f4c-4cd2-974a-f707dcd479f,此时机器再重启,需要等待较长时间,对于这种情况,需要采取救援光盘来救援,(这一项与检测位没有关系,检测位即使是0,出错后 centos7 依旧会进入这种模式)选择1,
Df 之后可以观察到它,别的分区都已经挂上,但 idv 还是挂不上说明挂载有问题,需要将 etc 文件或者是注释掉来修复,路径是 /mnt/sys image/etc/fstab,找到出故障的行数,修改后在 centos6 上执行起来,发现不行,所以在这只能选取注释的方法。
在这个过程中,需要先确保系统启动,在进行修改,启动能保证连上网络,确保可以得到维护。有的时候分区不能使用,但其他功能还是可以使用的。
切根并使用切根后的 vim
sh-4.2# chroot /mnt/sys image/
bash-4.2# vim /etc/fatab
bash-4.2# exit
exit
sh-4.2#