- Linux文件系统的操作
磁盘的写入速度慢于内存,因此为解决等待磁盘的写入读取效率,采用一个异步处理(asynchronously)的方式
当系统加载一个文件到内存后,如果该文件没有被改动过,则在内存区段的文件会被设置为(clean)的。但是如果内存中的文件数据被更改了,此时该内存中的数据会被设置成为Dirty。此时所有的操作都还在内存中执行,并没有写入到磁盘中,系统会不定时地将内存中设置为Dirty地数据写回磁盘,以保持磁盘与内存数据地一致性。当然也可以用sync命令强制写回磁盘
linux上文件系统与内存间有很大关系
- 系统会将常用地文件数据放置到主存储器地缓冲区,以加速文件系统地读/写
- 承上,因此linux的物理内存最后都会被用光。这是正常情况。可加速系统性能
- 可以手动用sync来强迫内存中设置为Dirty的文件中写回磁盘中
- 若正常关机时,关机命令会主动调用sync来将内存的数据写回磁盘内
- 但若不正常关机,由于数据尚未写回到磁盘内,因此重新启动后可能会花很多时间进行磁盘检测,甚至可能导致文件系统的损毁。
- 挂载点(mount point)的意义
每个文件都有独立的inode,block,super,block等信息,这个文件系统要能够连接到目录树才能被我们所使用,将文件系统与目录树结合的操作我们称为挂载。挂载点一定是目录,该目录为进入该文件系统的入口。因此并不是你有任何文件都可以使用,必须要"挂载"到目录树的某个目录后,才能够使用该文件系统的。
同一个文件系统的某个inode只会对应到一个文件内容而已(因为一个文件占用一个inode的原因),因此我们可以通过判断inode号码来确认不同文件名是否为相同的文件。
- 文件虚拟系统(VSF)
查看linux支持的文件系统有哪些
ls -l /lib/modules/$(uname -r)/kernel/fs
加载到内存中支持的文件系统:
cat /proc/filesystems
文件系统的简单操作
- 磁盘与目录的容量:df,du
df:列出文件系统的整体磁盘使用量
du:评估文件系统的磁盘使用量(常用于评估目录所占容量)
df [-ahikHTm] [目录或文件名]
-a:列出所有的文件系统,包括系统特有的 /proc等文件系统
-k:以kb的容量显示各文件系统
-m:以MB的容量显示各个文件系统
-h:以人们较易阅读的GB,MB,KB等格式自行显示
-H:以M=1000k替代M=1024k的进位方式
-T:连同该分区的文件系统名称
-i:不用硬盘容量,而以inode的数量来显示
- Filesystem:代表该文件系统实在哪个分区,所以列出设备名称
- 1k-blocks:说明下面的数字单位是1kb。可以利用-h -m改变容量
- Used:使用掉的硬盘空间
- Avaliable:也就是剩下的磁盘空间大小
- Use%:就是磁盘的使用率,如果磁盘的使用率高达90%以上,要注意免得容量不足造成系统问题
- Mountedon:就是磁盘挂载的目录所在(挂载点)
- 由于df主要读取的数据几乎都是针对整个文件系统,因此读取的范围主要实在Super block内的信息,所以这个命令显示结果的速度非常快速,在显示的结果中需要特别留意的是那个根目录的剩余容量,因为我们所有的数据都是由根目录衍生出来的,因此当根目录的剩余容量剩下0时,linux就出问题了。
使用-a参数时候,系统会出现/proc这个挂载点,但是里面的东西都是0。/proc的东西都是linux系统所需要加载的系统数据,而且是挂载到内存当中去的,所以当然没有占用任何的硬盘空间。
至于/dev/shm/目录,其实是利用内存虚拟出来的磁盘空间,由于是通过内存虚拟出来的磁盘,因此你在这个目录下面新建任何数据文件时,访问速度都是非常快的(在内存内工作)不过,由于它是内存虚拟出来的,因此这个文件系统的大小在每个主机上都不一样,而且新建的东西在下次开机时就消失了,因为是在内存中。
du [-ahskm] 文件或目录名称
-a 列出所有文件与目录容量,因为默认仅统计目录下面的文件量而已
-h:以人们较易读的容量格式(G/M)显示
-s:列出总量而已,而不列出每个目录占用容量
-S: 不包括子目录下的总计,与-s有点差别的;
-k: 以kb列出容量显示
-m:以MB列出容量显示
du命令其实会直接到文件系统内去查找所有的文件数据。默认情况下,是以kb来设计的,如果你想要知道目录占用了多少MB,那么就使用-m。如果只想知道该目录占用了多少容量,使用-s。
链接文件ln
在linux下面的链接文件有两种,一种是类似windows的快捷方式功能的文件,可以让你快速链接到目标文件或目录,另一种则是通过文件系统的inode连接来产生新文件名,而不是产生新文件,这种称为硬链接(hard link)
- hard link(硬连接或实际连接)
- 每个文件都会占用一个inode,文件内容由inode的记录来指向
- 想要读取该文件,必须要经过目录记录的文件名来指向到正确的inode号码才能读取
- 也就是说,其实文件名只与目录有关,但是文件内容则与inode有关,
- hard link只是在某个目录下新建一条文件名连接到某inode号码的关联记录而已。
- hard link 的限制:
- 不能跨文件系统
- 不能连接到目录
symbolic link(符号链接,快捷方式)
symbolic link就是在创建一个独立文件,而这个文件会让数据的读取指向它连接的那个文件的文件名。由于只是利用文件来作为指向的操作,所以,源文件被删除后,symbolic link的文件会"开不了",实际上就是找不到源文件"文件名"而已。
- ln [-sf] 源文件 目标文件
-s 如果不加任何参数就进行连接,就是硬链接。-s就是symbolic link
-f 如果目标文件存在时,就主动将目标文件直接删除后再创建。
目录的连接数量,当新建一个新的目录时,新的目录的连接数为2,而上层目录的连接数则会增加1。
磁盘的分区,格式化,检验与挂载
对于一个系统管理者(root)而言,磁盘的管理是相当重要的一环,尤其近来硬盘已经渐渐被当成是消耗品了。如果我们想要在系统里新增一块硬盘时,需要步骤:
- 对磁盘进行分区,以创建系统可用的文件系统,
- 对该分区进行格式化,以创建系统可用的文件系统。
- 若想要仔细一点,则可对刚才新建好的文件系统进行检验
- 在linux系统上,需要创建挂载点,也即是目录,并将它挂载上来。
fdisk [-l] 设备名称
-l 输出后面接的设备所有的分区内容,若仅有fdisk -l时,则系统将会把整个系统内能够找到的设备的分区均列出来
- 磁盘的删除
- fdisk /dev/sda 先进入fdisk界面
- p 先看一下分区的信息,假设要删除掉/dev/hdc1
- d 这个时候会要你选择一个分区,
- w 保存操作退出 q不保存操作退出 partprobe 强制让内核重新找一次分区表
- 磁盘的格式化
- 格式化的命令为mkfs(make file system)
- mkfs [-t 文件系统格式] 设备文件名
- -t 可以接文件系统格式,例如ext3,ext2,vfat等
格式化时比较重要的部分为:文件系统的卷标(lable),block的大小及inode的数量。如果要指定这些东西,就需要使用mke2fs这个命令。
mke2fs [-b block大小] [-i inode 大小] [-L 卷标] [-cj]设备
-b 可以设置每个block的大小,
-i 一个inode给与多少容量
-c 检查磁盘错误,仅下达一次 -c时,会进行快速读取测试,下达两次 -c -c进行读写测试
-L 后面可以接卷标名称(lable)
-j mke2fs是ext2,加上j,主动加入journal 而成为ext3
磁盘检验:fsck,badblocks
fsck [-t 文件系统] [-ACay] 设备名称
-t 同mkfs一样,fsck也是个综合软件,同样需要指定文件系统
-A 依据/etc/fstab的内容将需要的设备扫描一次,开机过程中就会执行此命令
-a 自动修复检查到的有问题的扇区,所以不用一只按y
-y -a类似,某些文件系统仅支持-y
-C 可以在检验的过程当中使用一个直方图来显示目前的进度。
EXT2/EXT3的额外参数功能:(e2fsck这支命令提供)
-f 强制检查,一般来说,如果fsck没有发现任何wnclean的标志,不会主动进入细化检查,如果想要强制fsck进入细化检查,就得加上-f
-D 针对文件系统下的目录进行优化配置
磁盘的挂载与卸载
- 单一文件系统不应该被重复挂载在不同的挂载点(目录)中;
- 单一目录不应该重复挂载多个文件系统
- 作为挂载点的目录理论上应该都是空目录才是
要用来挂载的目录里面并不是空的,那么挂载了文件系统之后,原目录下的东西就会暂时消失。
将文件系统挂载到我们的linux系统上,就要使用mount这个命令。
mount
- -a 依照配置文件 /etc/fstab的数据将所有未挂载的磁盘都挂载上来
- -l 单纯输入mount会显示目前挂载的信息,加上-l可增加列label名称
- -t 可以加上文件系统种类来指定欲挂载的类型常见linux支持类型有ext2,ext3,vfat,reiserfs,iso9660(光盘格式)nfs,cifs,smbfs(网络文件系统类型)
- -L 系统除了利用设备文件名外,还可以利用文件系统的卷标名称来挂载,
- -o 后面可以接一些挂载时额外加上的参数,比如说账号密码读写权限等
- ro rw 挂载文件系统成为只读,可读写
- async,sync 此文件系统是否使用同步写入sync 或异步(async)的内存机制,默认未async
- auto,noauto 允许此分区被以mount -a自动挂载
- dev nodev 是否允许次分区上可创建设备文件,dev为允许
- suid,nosuid 是否允许此分区含有suid/sgid的文件格式
- exec,noexec 是否允许次分区上拥有可执行的二进制文件
- user, nouser 是否允许此分区让任何用户执行mount。一般来说mount仅有root可以进行,但下达user参数,则可让一般user也能够对此分区进行mount
- defaults 默认值为rw suid dev exec auto nouser ad async
- remount 重新挂载,这在系统出错,或重新更新参数,很有用
/etc/filesystems:系统指定的测试挂载文件系统类型
/proc/filesystems:Linux系统已经加载的文件系统类型
/lib/moudles/$(uname -r)/kernel/fs/
将某个目录挂载到另外一个目录中去
mount --bind,可以将某个目录挂载到其他目录中去,而并不是整块文件系统。
umount [-fn]设备文件名或挂载点
- -f 强制卸载,可用在类似网络文件系统无法读取到的情况下
- -n 不更新/etc/mtab的情况下卸载
磁盘参数修改
- mknod 设备文件名 [bcp] [Major] [Minor]
linux下面所有的设备都以文件来代表,但是那个文件如何代表该设备,就是通过文件的major与minor数值来替代。所以那个major与minor数值是有特殊意义的,不是随意设置的。
b 设置设备名称成为一个外部存储设备文件,例如硬盘等
c 设置设备名称成为一个外部输入设备文件,例如鼠标/键盘等
p 设置设备名称成为一个FIFO文件
Major 主设备代码
Minor 次设备代码
- e2label 设备名称 新的label名称
卷标:windows下的c盘d盘之类的名称,就是卷标
- tune2fs [-jlL] 设备代号
-l 类似dumpe2fs -h,将super block内的数据读出来
-j 将ext2的文件系统转换为ext3的文件系统
-L 类似e2lable的功能,修改文件系统的卷标
设置开机挂载
- 开机挂载/etc/fstab及/etc/mtab
系统挂载的一些限制
- 根目录/是必须挂载的,而且一定要先于其它mount point被挂载进来
- 其他挂载点必须为已新建的目录,可任意指定,但一定要遵守必需的系统目录架构原则
- 所有挂载点在同一时间之内,只能挂载一次
- 所有分区在同一时间内只能挂载一次
- 如若进行卸载,你必须先将工作目录移到挂载点(及其子目录之外)
其实/etc/fstab就是将我们利用mount命令进行挂载时,将所有参数写入到这个文件就可以了。这个文件共有6个字段。比较重要。
- 第一列:磁盘设备文件名或该设备的Label,填写文件系统的设备文件名
- 第二列:挂载点,就是目录
- 第三列:磁盘分区的文件系统:在手动挂载时可以让系统自动测试挂载,但在这个文件当中我们必须手动写入文件系统才行。
- 第四列:文件系统参数
- 第五列:能否被dump备份命令作用,dump是一个用来作为备份的命令,我们可以通过fstab指定哪个文件系统必须要进行dump备份,0代表不要做dump备份,1代表要每天进行dump的操作,2也代表其他不定日期的dump备份操作,
- 第6列:是否以fsck检验扇区。开机的过程中,系统默认会以fsck检验我们的文件系统是否完整。0是不要检验,1是较早检验,2也是检验。
/etc/fstab是开机时的配置文件,不过实际文件系统的挂载是记录到/etc/fstab与/proc/mounts这两个文件当中的。每次我们在改动文件系统的挂载时候,也会同时更改这两个文件。但万一/etc/fstab出错,可以mount -n -o remount,rw /
内存交换空间swap的构建
- 使用物理分区够见swap
- 分区:先使用fdisk在你的磁盘中分出一个分区给系统作为swap
- 格式化:利用新建的swap格式的 mkswap 设备文件名 就能够格式化该分区为swap格式
- 使用: 最终通过free命令查看一内存使用情况
使用文件构建swap
- dd if=/dev/zero of=/tmp/swap bs=1M count=128
- mkswap将新建的文件格式化为swap文件格式
- swapon开启
swap主要的功能是当物理内存不够时,将某些在内存中所占的程序暂时移动到swa当中,让物理内存可以被需要的程序来使用。
大于2T的分区使用parted
parted [设备] [命令[参数]]
新增分区 mkpart [primary|logic|extended] [ext3|vfat] 开始 结束
分区表 print
删除分区 rm[partition]
简答题
- 新增一块磁盘,安装好磁盘后,fdisk 新磁盘文件名,进入磁盘分区设置
- n 新增分区,因为要分单一分区,所以点默认的,然后选择磁盘大小假设是500G,+500G
- 分区好后,进行格式化,mkfs -t ext3 设备名
- w写入,partprobe更新一下分区表
- 挂载到/home目录 mount 设备名 /home
- 修改/etc/fstab 设备名 /home ext3 defaluts 1 2 自动挂载
先卸载?
umount /dev/hda3
fsck -a /dev/hda3
文件系统
不会改变,硬链接删除后就不存在硬连接了。