目录
前言
续上篇,知道了怎么创建新的磁盘分区已经算是一只脚踏进了文件系统学习的大门,接下来就看看怎么把新的分区给挂载上吧!
(5)mount与umount
挂载前注意:
1.单一文件系统不应该被重复挂载在不同的挂载点中
2.单一目录不应该重复挂载多个文件系统(一一对应)
3.要作为挂载点的目录,理论上都是空目录(若非空,原目录下的东西就会在挂载后暂时地消失,并不是被覆盖掉,而是给隐藏起来了,卸载后恢复)
[root@study ~]# mount -a
#依照配置文件/etc/fstab的数据将所有为挂载的磁盘都挂载上来,后面马上提到该文件
[root@study ~]# mount [-l]
#输入mount默认显示目前挂载信息,加-l,增列Label
[root@study ~]# mount [-t 文件系统] LABEL='' 挂载点
#加上文件系统种类来指定欲挂载的类型,常见的Linux支持类型有:xfs、ext3、ext4、reiserfs、vfat、iso9660(光盘格式)、nfs、cifs、smbfs(后三种为网络文件系统类型)
#其实现在很智能,操作系统能判断你要挂载的文件系统类型
#但这需要挂载测试,测到匹配的文件系统了,就用这个类型挂载待挂的文件系统
#这个测试中各文件系统类型的优先级放在/etc/filesystems中,Linux已加载的文件系统类型放在/proc/filesystems中
[root@study ~]# ls /lib/modules/$(uname -r)/kernel/fs
#查看文件系统类型的驱动程序,可以看看这个目录里的内容
[root@study ~]# mount [-t 文件系统] UUID='' 挂载点
#鸟哥的推荐,前面提过UUID的独一无二性
[root@study ~]# mount [-t 文件系统] 设备文件名 挂载点
#加-n则不将挂载情况及时写入/etc/mtab,如单人维护模式
#加-o可接一些挂载时的额外参数(async与sync-同不同步写入、atime与noatime-读取实不实施、ro与rw-只读还是可读写、auto与noauto-用a能否自动挂载、dev与nodev--可不可建立设备文件、suid与nosuid-是否允许有suid/sgid这样的文件、exec与noexec-是否允许有可执行的二进制文件、user与nouser-是否允许任何使用者用毕竟一般是root才能mount)
#defaults:rw\suid\dev\exec\auto\nouser\async
#remount:系统出错或重新更新参数时用
挂载时注意:
1.若挂载的是光驱里的光盘,那么一挂载就无法退出光盘了,除非将它卸载才行。另外光盘的磁盘使用率达到100%,所以无法直接写入任何数据到光盘当中。还有就是图形化界面中,光盘是会被自动挂载到/media目录下的。
2.挂载USB移动磁盘时,因为默认的CentOS 7没有支持NTFS文件系统格式,所以要按装相关驱动程序才能处理,当然vfat格式的挂载自然没有问题。
3.当挂载参数要改变或是根目录出现“只读”状态时,可采用重启或如下操作重新挂载
[root@study ~]# mount -o remount,rw,auto /
#重新挂载根目录,尤其是担任维护模式时,你的根目录常被挂载为只读,这个命令很有帮助
4.可以将某个目录挂载到另外一个目录,并非挂载文件系统,而是额外挂载某个目录,当然这就很像符号链接了。
[root@study ~]# mount --bind /var /data/var
#先创建/data/var这个目录,--bind选项可以把/var挂载到/data/var下,ls这两个目录后信息完全一致,这样进入/data/var就是进入/var
[root@study ~]# umount [-fn] 设备文件名或挂载点
-f:强制卸载。可用在类似网络文件系统(NFS)无法读取到的情况
-l:立刻卸载,比-f强
-n:不更新/etc/mtab情况下卸载
#可用设备文件名,挂载点来进行卸载,但对于挂载的目录要用挂载点卸载,因为相当于设备还有被其他方式挂载
#有时候无法卸载可能是逆还在使用该文件系统,离开该文件系统的挂载点cd去个别的地方即可
(6)修改文件系统的信息
1.mknod:
Linux下所有的设备都以文件来表示,具体是通过文件的major(主要设备代码)与minor(次要设备代码)数值来替代。
磁盘文件名 | major | minor |
---|---|---|
/dev/sda | 8 | 0~15 |
/dev/sdb | 8 | 16~31 |
/dev/loop0 | 7 | 0 |
/dev/loop1 | 7 | 1 |
当然2.6内核版本后,硬件文件名都可以被系统自动实时产生了,不需要手动建立设备文件。但依然有情况需要手动处理设备文件,例如某些服务被chroot到特定目录下时
[root@study ~]# mknod 设备文件名 [bcp] [Major] [Minor]
#不要忘记bcp的对应含义,在第五章一开始介绍ls命令的输出显示第一列里介绍过b-外接存储设备文件,c-外接输入设备文件,p-FIFO文件
[root@study ~]# mknod /dev/sda10 8 10
#创建完设备可以ll查看一下,事后记得rm
2.xfs_admin
修改XFS文件系统的UUID与Label name,因为格式化时可能忘记加入标头名称。
[root@study ~]# xfs_admin [-lu] [-L label] 设备文件名
#-l\-u只能列出
#-L\-U才能设置
#关于UUID的设置有一个uuidgen命令可以生成新的专有的UUID,毕竟UUID也有自己的一套规则不能乱输入
3.tune2fs
修改ext4的UUID与Label name
[root@study ~]# tune2fs [-l] [-L Label] [-U uuid] 设备文件名
#-l:类似dumpe2fs -h,读取superblock内的数据
#-L\-U:修改同上xfs的xfs_admin
#记得要针对文件系统的类型使用配套的命令
3.设置启动挂载
系统挂载的一些限制:
1.根目录必须挂载且必须先于其余挂载点
2.其他挂载点必须为已建立的目录,可任意指定,但一定要遵守不许动系统目录架构原则(FHS)
3.所有挂载点在同一时间之内,只能挂载一次
4.所有硬盘分区在同一时间之内,只能挂载一次
5.如若进行卸载,必须先将工作目录移到挂载点(及其子目录)之外
启动挂载的过程中会去读的文件是/etc/fstab
[root@study ~]# cat /etc/fstab
#Device Mount point filesystem parameters dump fsck
#输出显示的第一栏是设备文件名/UUID/LABEL name,三者之一
#有个/dev/mapper/xxx的是LVM的文件名,后续介绍
#第二栏挂载点一定是目录
#第三栏是磁盘分区的文件系统,前面刚说过在手动挂载时可以让系统自动测试挂载,但这个文件当中需要手动写入文件系统才行
#第四栏是文件系统参数,像mount命令下可设置的特殊参数,这里不再详述,要注意noexec这个最多仅设置于逆自定义或分享的一般数据目录,一般默认情况使用defaults即可
#第五栏是能否被dump备份命令作用,一般填0即可
#第六栏是是否以fsck检验扇区,xfs会自行检验,无需额外操作,填0即可
#[root@study ~]# nano /etc/fstab
……
#这里便是增删你想让每次启动是否都自动挂载的设备的编辑处
#按照6栏的格式准确书写
#编辑完成后用df确认当前文件系统没有被挂载
[root@study ~]# mount -a
#使用这个命令可以测试刚才的写入没有语法错误,不然要是写错了,Linux都可能无法顺利启动
[root@study ~]# mount -n -o remount,rw /
#单人维护模式下,无法修改/etc/fstab,也无法更新/etc/mtab,便可以用上述命令
特殊设备loop挂载:
1.挂载CD/DVD镜像文件:从镜像站下载的不需要刻录就用loop挂载到我们的设备上
#鸟哥事先上传好了DVD镜像文件到测试机
[root@study ~]# mkdir /data/centos_dvd
[root@study ~]# mount -o loop /tmp/CentOS-7.0-1406-x86-64-DVD.iso /data/centos_dvd
#完成后df或ll /data/centos_dvd 查看一下挂载情况
2.挂载大文件(当初分区时只划分出一个根目录,已经没有多余的容量可以进行额外的分区,偏偏根目录容量很大):制作出一个大文件,然后将其挂载,如此便感觉多了一个分区
[root@study ~]# dd if=/dev/zero of=/srv/loopdev bs=1M count=512
#dd建立空文件,if是input file,输入文件,那个/dev/zero是会一直输出0的设备,of是output file,将一堆零写入到后面接的文件中,bs是每个block大小,bs*count就是这个文件的容量
[root@study ~]# mkfs.xfs -f /srv/loopdev
#默认xfs是不能格式化文件,得加-f
[root@study ~]# blkid /srv/loopdev
#查看/srv/loopdev的UUID以备挂载之用
[root@study ~]# mount -o loop UUID="……" /mnt
#挂载完后df /mnt查看一下,还记得第5章里说的想要暂时挂载某些额外的设备建议可以放置到/mnt目录下吗
[root@study ~]# nano /etc/fstab
#加上那一行话(/srv/loopdev /data/file xfs defaults,loop 0 0),这回是永久性挂载,新建一个/data/file文件夹,把刚刚的卸载了,再用mount -a检查一下语法,同时也挂载了,最后df /data/file查看是不是挂载在这里了
4.内存交换分区(swap)的创建、特殊观察与操作
(1)swap相关
一般来说,如果硬件的设备资源足够的话,那么swap应该有没有都无所谓,物理内存不足时才会用到swap,用到它时,主机磁盘灯就会开始闪个不停。个人使用可能就不太需要,但服务器因为不知道何时会有大量来自网络的请求,因此最好还是能够预留一些内存交换分区来缓冲一下系统的内存使用量。如何建立你的内存交换分区?
1.设置一个内存交换分区
2.建立一个虚拟内存的文件
使用物理分区创建内存交换分区:
1.分区:gdisk默认会将分区的ID设置为Linux的文件系统,记得在Hex Code or GUID改成8200(Linux swap),其他分区操作同之前的,记得要partprobe更新显示,lsblk能看到多了一个内存交换分区说明到此为止都顺利。
2.开始创建swap格式:类比前面格式化的命令,用mkswap+设备名即可,用blkid看看这个分区的UUID,方便之后在文件/etc/fstab里书写以永久性挂载
3.开始观察与加载看看:
[root@study ~]# free
#查看一下你现在机子上的swap有多大
[root@study ~]# swapon 设备名
#启用你刚建立的swap分区
[root@study ~]# free
#再次查看,比较swap大小的变化
[root@study ~]# swapon -s
#可以看到目前启用的内存交换分区设备有哪些
[root@study ~]# nano /etc/fstab
#写入配置文件
前面所说的建立的都是物理分区,还是如果你之前没留空间,这里物理分区便无法支持,但也可以用文件去发挥内存交换的作用。
[root@study ~]# dd if=/dev/zero of=/tmp/swap bs=1M count=128
#在/tmp下建立一个128MB的文件
[root@study ~]# mkswap /tmp/swap
#对文件格式化操作,千万谨慎!!!
[root@study ~]# swapon /tmp/swap
[root@study ~]# swapon -s
#开启之后查看一下
[root@study ~]# nano /etc/fstab
#这里不能使用UUID,因为系统仅会查询区块设备不会查询文件
[root@study ~]# swapoff /tmp/swap 设备名
#忘记设备名可用swapon -s查看,关闭这个文件的启用
[root@study ~]# swapon -s
[root@study ~]# swapon -a
#重新启用所有的写在配置文件中的内存交换分区
[root@study ~]# swapon -s
PS:如果主机系统可以进入休眠模式,运行当中的程序状态则会被记录到内存交换分区中,以作为唤醒主机的状态依据。某些程序在运行时,本来就会利用内存交换分区的特性来存放一些数据,所以,内存交换分区也不是完全不被需要。
(2)磁盘浪费
原因:一个区块只能放置一个文件,因此太多小文件将会浪费非常多的磁盘容量,事实上,整个文件系统中的超级区块、inode对照表与其他中介数据等都会浪费磁盘容量。(会发现,/dev/sda4或是你前面实验挂载上的文件系统,明明是刚刚建立的,却已经有很多容量被使用了)
[root@study ~]# ll -sh
#可以查看到第一行的total,实际上便是该目录下所有数据所耗用的实际区块数量*区块大小的值,列出后的第一列则有每一个文件所占数据区块的大小(像crontab这种文件只有451字节,但却占了4K数据区块的,便是罪魁祸首)
(3)有趣的parted命令
前面提过gdisk与fdisk各有针对,但对于parted它既支持MBR分区格式,又支持GPT分区格式。
[root@study ~]# parted [设备] [命令[参数]]
#命令部分的可选:
#新增分区:mkpart [primary/logical/Extended] [ext4/vfat/xfs] 开始 结束
#显示分区:print
#删除分区:rm [partition]
#开始和结束的含义下面介绍
#若print之后列出数据第一列代表分区号码,第二列是该分区的起始位置在这块磁盘的多少MB处,第三列是分区结束的位置
#由第二列第三列得到第四列的分区大小
#第五列是文件系统可能的类型
#第六列像是gdisk的System ID
[root@study ~]# parted /dev/sda unit mb print
#统一下start与end显示的单位
#千万不要做下面的操作!!!将MBR分区表变成GPT分区表,这是个无法恢复的危险操作,会让后续的分区都死掉
[root@study ~]# parted /dev/sda mklabel gpt
#下面是一个可以尝试的操作
[root@study ~]# parted /dev/sda mkpart primary fat32 XXXGB XXXGB
#根据你之前print最后一行的End确定你这里的开始
#之后还是更新显示的partprobe,再lsblk /dev/sda7,这里只是例子,目的在于确保你新建的分区真的存在
[root@study ~]# mkfs -t vfat 设备名
#格式化
[root@study ~]# blkid 设备名
#查看UUID
[root@study ~]# mkdir /data/win
#新建目录,用于挂载我们刚才的文件系统
[root@study ~]# nano /etc/fstab
#添加新的一行
[root@study ~]# mount -a
#全按配置文件挂载上来,顺便检查语法
[root@study ~]# df /data/win
#最后看看情况
parted相较于gdisk的显著优势是它一气呵成,不需要一步一步去做。
(4)卸载实验过的所有
[root@study ~]# umount /data/ext4 /data/xfs /data/file /data/win
[root@study ~]# swapoff /dev/sda6 /dev/sda7
#具体设备名根据个人的建立而定,先卸载
[root@study ~]# nano /etc/fstab
#删掉后来新添的每一行,在/dev/mapper/centos-swap swap后的
[root@study ~]# parted /dev/sda rm 7
[root@study ~]# pated /dev/sda rm 6
……
#用parted的命令删完所有新添的设备当然用gdisk也能删
[root@study ~]# partprobe
[root@study ~]# rm /tmp/swap /srv/loopdev
#删除文件还是很基础的rm命令就行
总结
第7章到这里就正式结束了,到这里是不是终于知道了文件系统是个什么东西,挂载又如何进行呢。第8章还有关于文件系统进一步的应用等着我们一起来探索。