zoukankan      html  css  js  c++  java
  • 文件系统

    +======================================================================
    张贺,多年互联网行业工作经验,担任过网络工程师、系统集成工程师、LINUX系统运维工程师
    笔者微信:zhanghe15069028807,现居济南历下区
    +======================================================================

    文件系统

    基础概念

    如果我们想要linux系统上格式化一个分区的话,必须具备三个条件:

    • 内核支持该文件系统

    • 内核当中集成了某文件系统的模块,内核当中有内核的模块意味着内核有能力将分区格式化成某一文件系统。

    • 用户空间的管理工具,内核当中有文件系统的模块还不够,有模块意味着内核有能力把分区格式化格式成文件系统,但是使用这个能力,还要通过工具才可以,当我们使用工具的时候就意味着向内核请求一个文件系统并应用到磁盘。

    最常见的模块:ext4 xfs vfat,用户空间对应的管理工具就是mkfs.ext3 mkfs.xfs mkfs.vfat

    //查看当前系统支持哪些文件系统,没有nodev关键字的就是可以使用的文件系统。
    [root@kk dev]# cat /proc/filesystems | grep -v nodev
    xfs
    
    //查看系统上所有可以使用的模块
    [root@kk dev]# lsmod | grep xfs
    xfs                   997127  2 
    

    过去的时候一个分区也就对应一个文件系统,但是现在就不一样了,比如LVM(逻辑卷管理器),可以实现将多个分区整合成一个分区(卷组),在这一个分区上再划分子分区(逻辑卷),然后每一个子分区(逻辑卷)对应一个文件系统,这样就实现了一个分区对应多个不同的文件系统。

    文件系统由三部分构成

    1. 超级块:记录文件系统的整体信息,包括inote/block的总量、使用量、剩余量等。
    2. Inode区域:inote区域就由inode块组成的区域,每个文件都会占用一个inode块,inote块当中记录了此文件的元数据和blcok号码。
    3. Block区域:block区域就由block块组成的区域block块里面存放的就是文件真实的数据了,这没什么好说的。

    硬链接

    其实在学到这里面的时候我是有一个疑问的,就是为什么一个文件只会占用一个inode块?一个小文件元数据和block块记录只占用一个inode块我是可以理解的,但是一个1G的文件它要引用的block块那就多了,一个inode肯定是存不下呀!难道不会占用更多的inode块吗?后来我专门查了《鸟哥的私房菜》之后才知道,如果一个文件要引用的block号码实在太多了,一个inode存放不下,也不会再浪费一个inode块,而是专门拿出一个block块来存放inode号码,这是第一级引用,如果需要的话,可以有二级和三级引用,所谓的二级引用就是第一级的block也存放不下block号码了,第一级block本身可以再引用二级,这就是第二级,第三级以此类推。

    我们上面所述的是ext2文件系统,ext2文件系统是这样进行数据存放的,但并不所有的文件系统在存放文件的时候都是这样,比如FAT文件系统,FAT文件系统是windows上的一种文件系统,我们新买的U盘一般就是样的文件系统,这种文件系统在在存放大量的block号码的时候并不像ext2文件系统那样借用多级引用,而是不断的跳转?什么意思呢?FAT文件系统并没有inode块区域,FAT文件系统里面全都是block块区域,也就是说FAT文件系统并不能够像ext2文件系统那样通过读取inode块得知这个文件占用了多少block块,FAT文件系统上的一个文件只会连接一个block块,而每个block块都会空余出一点空间,指向下一个block块,至少会连接多少了块取决于文件的大小,当我们查看这个文件的时候就像是不断的跳转那样来读取每一个block块当中的内容,如果说,每一块他们距离的比较远,以至于跨越了多个柱面,那么在不断跳转的同时,磁头也会多次移动,可想而知这样会大大耽误数据读写的效率,所以又有了磁盘碎片整理这么一项技术。磁盘碎片整理就是将同一个文件所占用的block块尽量放到相邻的地方,比如相邻的扇区和磁道,以其通过这样的手段加快数据读取的速度。磁盘碎片整理对于FAT文件系统有很大的作用,但是对于ext系列的文件系统是没有太大意义的。

    有了上面的见解,我们再去理解硬链接就简单多了。一个文件只有一个inode号码,在操作系统当中可以创建多个指向这个inode号码的链接,这就是硬链接,也就是说文件自己其实也是一个硬链接,这就是为什么我们新创建的文件,明明没有给它创建硬链接,他的硬链接数已经是1了的原因。同时,我们也应该了解,只要不把所有的硬链接全部删除干净,我们总能够通过某一个硬链接找到inode块,进而找到文件内容,所以硬链接是可以做一为一种备份的手段。

    当我们创建一个目录的时候,硬链接数就是2,为什么一个新的目录硬链接就是2呢?

    [root@localhost tmp]# mkdir test.dir ; ll -d test.dir
    drwxr-xr-x 2 root root 6 10月 17 19:05 test.dir
    

    目录也是文件,目录也占用了文件系统的一个inode块,当我们创建这个目录的时候要给一个文件名吧!这个文件名难道不是一个硬链接吗?是的,当然是,那这也就一个硬链接,为什么是2呢?

    [root@localhost tmp]# cd test.dir ; ll -a
    drwxr-xr-x  2 root root   6 10月 17 19:05 .
    drwxrwxrwt. 9 root root 142 10月 17 19:05 ..
    

    发现了没有,在新创建的目录里面竟然有两个目录,这不是我创建的,而是默认就有的,一个叫点,另一个叫点点,而点就代表当前目录,当前目录就是test.dir,这又是一个硬链接,所以test.dir目录的硬链接数就是2.

    还有一个有趣的点,如下所示,/etc/目录的硬链接数竟然高达138个!怎么会这么多呢?

    [root@localhost ~]# ll -d /etc/
    drwxr-xr-x. 138 root root 8192 10月 17 18:50 /etc/
    [root@localhost ~]# ll /etc/ | grep '^d' | wc –l  #
    136
    

    /etc/目录下面有136个目录,每个目录下面都有点点,这就是136个硬链接,另外两个就就/etc/目录名字自己和/etc/目录里面的点。

    常见的文件系统

    • 光盘:iso9660

    • unix:FFS,UFS,JFS2

    • 网络文件系统:NFS

    根据其是否支持日志功能

    • 日志型文件系统:ext3,ext4,xfs……

    • 非日志型文件系统:ext2,vfat

    磁盘为什么要分区?

    1. 有了分区重装系统之后只会重装系统所有的分区,其余分区的数据不丢失。

    2. 提高性能

    一般分区是都是三个主分区+一个扩展分区,然后在扩展分区里面再划分多个逻辑分区,其实上扩展分区也是一段空间,不过这段空间不能存在真正的数据,而是存放的是在其身上的分区的地址。写到这里,想起了之前学过的软链接,软链接文件里面存储也是路径地址。

    分区格式化和swap意义?

    格式化是为了实现数据能够结构化管理。

    当我们把一个硬盘进行分区完之后就要在里面打格子了,打格子的过程就是格式化,所以格式化的目的并不是删除文件,而是给分区打格子。常见的打格子的方式有:ntfs、ext2、ext4、fat32,那么不同的类型打格子的方式意味着什么呢?意味着数据在分区上的排列方式不同。就像一张白纸可以打成方格、田字格、横线等类型。

    其实不同的文件系统有不同的位数,这个位数其实就是单个文件所能够寻找的磁盘块,位数越大单个文件的寻址能力就越强,单个文件的容量就越大,像最新的btrfs文件系统支持64位,其实就相当于无上限了(2的64次方,约等于无限),像早期的fat文件系统其实就是因为其位数小的原因所以单个文件最大不能超过2G。

    swap是交换分区,当我们在安装系统的时候最好要进行分区的。它相当于内存的外延,当内存的压力过大时帮助内存分担压力的。那么swap到底要分多大呢?这是视情况而定的,对于要求内存的要求大的服务比如mysql、sqlserver这类数据要快速在内存进行交替反而swap应该要小一些,为什么呢?数据中的数据在内存当中是以页框存在的,当内存中的压力过大的时候,就需要把一些闲置应用的分页调用到swap分区,用的时候再调用到内存当中,但是swap是存在于硬盘上的,硬盘是机械的,它的速度远远跟不上内存,调用速度就会很慢,但是这类应用的要求的就是速度,所以要把交换分区划分的小一些2G足矣,大了性能反而会下降。但是如果主机上跑的就是批处理类的、不是关键类的、对内存性能要求低但是对于内存的量要求很大的,可以把交换分区调的大一些,甚至可以把大部分硬盘都划分给swap分区,像用于科学计算的批处理主机。总之一句话交换分区的大小视情况而定的,并不是越大越好。

    日志型与非日志型

    总的来说,所有的文件系统分为日志型与非日志型。

    什么是日志型与非日志型呢?它的作用是什么呢?非日志与日志型文件系统又有什么不同呢?想要搞清楚这件事我们要从一个例子来讲起:

    有一天,我有迅雷下载一个将近2G的电影时,我刚把种子添加到迅雷的下载区域,点击下载之后立马报错“空间不足”,我去我的电脑看了一下我的分区的确是没有多少空间了,但是还有1G的空间。那么我们从这个事情能体会到什么?当一个文件要计算机创建的时候首先计算空间判断这个文件能不能在你的磁盘上存下,也就是说当一个文件创建的时候要先创建其元数据信息。如果判断空间充足,继续下载下载了一半的时候突然断电了,当重新开机时是要进行修复的,那么这个修复的过程是怎样的?其实这个修复就是内核去扫描磁盘上的元数据,根据元数据中记录的文件的块的地址,查看这些数据块是不是完整的,如果是完整的说明文件没有事,如果文件不是完整的,说明文件有损,能修好就修好,修不好拉倒,这就是非日志型文件系统的工作方式。

    而日志型的文件系统比非日志的文件系统要高级,日志型的文件系统除了真正的数据部分、元数据部分还有一个区域这个区域被称为“日志区域”,当我们向磁盘写入一个文件的时候,首先在日志区域创建元数据,当这个文件完整顺利的写入到磁盘上之后再把日志区域上记录的元数据导入到真正的元数据区域。那么这样做有什么好处呢?当向磁盘写入一个文件的时候如果这个文件没有写完就断电了,当系统重新开机的时候就不去扫描真正的元数据区域而是去扫描日志区域,根据日志区域内记录的元数据记录的数据块地址检察数据是否完整,能恢复的就恢复,不能恢复就拉倒。直接扫描日志区域是可以加快系统修复的时候的,因为日志区域存储的元数据总是要比真正的元数据区域要少很多。

    超级块

    当一个分区格式化成文件系统的时候,文件系统会评估此分区有多少个块,然后平均把所有的块分成一个又一个有块组,每个块组有同样多的块,这样做的目的是为了方便管理,而记录这个分区块组的信息(多少到多少块是一个组,组多大,占用和剩余空间)的块就叫做超级块,超级块里面存储的是整个分区的结构化信息,所以它不容有失,一个分区只有一个超级块正在使用,超级块有许多的备份,在我们格式化分区的时候为提醒我们超级块备份到了哪些块当中,如下图当中圈起来的块就是超级块所在的地址。

    如果说一个分区相当于一个“连队”,那么超级块就是连队里面班长。

    image-20200313212541763

    块组

    如果我们的一个文件系统很大,高达几百个G,现在这很常见呀,我现在一个windows桌面系统的D盘就有1T大小,如果这个文件系统(D盘)的block区域和inode区域都放置在一起的话,block块的号码就会被排非常大,而且在inode块引用block块的时候因为block的号码太大了也会占用太多的空间,所以实际上真实的文件系统并不是这样的,而是进一步划分了区域,真实的文件系统在创建的时候首先创建的是块组,也就是将文件系统分成一个又一个的区域,然后在区域里面再划分出block块区域、inode块区域、超级块区域这三个区域,这样一来,每一个块组内block块号码不会变得非常大,做引用的时候也不会占用太多的空间。

    UUID

    UUID全局唯一标识符,UUID一定不会重复,一个主机上可能有数十块和上百块的磁盘,我们通过磁盘的设备文件和卷标在追踪一个磁盘是不靠谱的,因为卷标是可调整的,而设备文件名也有很大的可能会变动,但是UUID是一定不会变动的,全球唯一,所以当我们在脚本中挂载或者卸载分区的时候最好使用UUID,靠谱!

    //显示分区的基本属性,包含文件系统和uuid
    [root@zhanghe /]# blkid /dev/sda1 
    /dev/sda1: UUID="934e695d-d37f-45e5-8323-1ce23cab1bda" **TYPE="ext4**"
    

    分区

    创建-mkfs

    mkfs是最常见的用户空间的工具。

    使用方法:mkfs.FS_TYPE /dev/DEVICE 例如:mkfs.ext4 /dev/sda3

    FS.TYPE代表文件系统:ext4,xfs,btrfs,vfat

    此外还有第二种使用方法:mkfs -t FS_TYPE /dev/DEVICE, 例如:mkfs -t ext4 /dev/sda3

    最常见的一个选项就是-L,指明卷标,如:

    [root@China ~]# mkfs.ext4 -L zhanghe /dev/sdb2
    [root@China ~]# blkid /dev/sdb2
    /dev/sdb2: LABEL="zhanghe" UUID="a34688a58d1665d6c3" TYPE="ext4"
    

    创建-mke2fs

    mke2fs:是ext系列文件系统的专用管理工具,只能用来格式化ext系列

    • -t:{ext2|ext3|ext4}
    • -b:指明块大小{1024|2048|4096}
    • -L:指明卷标
    • -i #:为数据空间中每多少个字节创建一个inode,此大小不应该小于block的大小
    • -m #:为管理人员预留的空间占据的百分比,默认是百分之五

    块大小的创建时应该根据存入什么样的文件,如果此分区上经常存放大文件,块最好设置成4096,如果此分区上经常存放小文件的话那么就应该把块大小设置小一些,这样做的目的就是让块大小与inote大小的比例能够合理。

    创建-mkswap

    第一步:创建swap分区的前提是调整其分区ID为82(fdisk>t>82)

    第二步:然后使用mkswap命令指明卷标创建swap分区

    [root@China ~]# mkswap /dev/sdb7
    [root@China ~]# blkid /dev/sdb7
    /dev/sdb7: UUID="d27752c6-f8e6-400e-9362-a3410f9cb9c2" TYPE="swap"
    

    查看-blkid

    [root@localhost ~]# blkid /dev/sda2  #块设备属性查看
    /dev/sda2: UUID="HkGxcj-DD0Q-zFpa-OGFT-ffTb-t6gq-u0dIA9" TYPE="LVM2_member" 
    [root@localhost ~]# blkid -U HkGxcj-DD0Q-zFpa-OGFT-ffTb-t6gq-u0dIA9
    /dev/sda2
    blkid –L “lablel”根据指定的UUID来查找对应的设备?
    

    查看-dumpe2fs

    dumpe2fs查看超级块和整个磁盘的布局信息

    -h查看超级块的信息

    修改-e2lable

    管理ext文件系统的卷标

    [root@China ~]# e2label /dev/sdb6                #查看卷标
    mydate
    [root@China ~]# e2label /dev/sdb6 zhanghe     #设置卷标
    [root@China ~]# e2label /dev/sdb6
    zhanghe
    
    

    修改-tune2fs

    重新设定在格式化ext文件系统时指定的选项参数,与mke2fs相对应

    • -l(小写的L)查看超级块的信息
    • -L:修改卷标
    • -m修改预留着管理员的空间百分比
    • -O文件系统的属性启用或者禁用
    • -o调整文件系统的默认挂载选项
    [root@China ~]# tune2fs -l /dev/sdb6
    Filesystem volume name:  zhanghe    #卷标
    Last mounted on:     <not available>  #什么时候被挂载过
    Filesystem UUID:     399bab36-0ebc-4d20-866e-e9fca9e431d4
    Filesystem magic number: 0xEF53     #文件系统的魔数
    Filesystem features:   ext_attr resize_inode dir_index filetype sparse_super #有哪些特性
    Default mount options:  (none)     #默认挂载选项
    Filesystem state:     clean   #文件系统的状态
    Errors behavior:     Continue
    Inode count:       265320    有多少inote
    Block count:       530128          有多少块
    Free blocks:       492775
    Free inodes:       265309
    
    

    检测-fask

    fsck –t <文件系统类型> -a|-r <分区设备>

    • -a是自动修复
    • -r:交互式修复错误

    注意:指定的文件系统类型千万不能搞错

    检测-e2fsck

    ext专用的修复工具

    • -y自动应答为yes
    • -f强制修复
    [root@China ~]# e2fsck /dev/sdb6
    e2fsck 1.41.12 (17-May-2010)
    zhanghe: clean, 11/265320 files, 37353/530128 blocks
    [root@China ~]# e2fsck -f /dev/sdb6
    e2fsck 1.41.12 (17-May-2010)
    
    

    第一步: 检查inode,块,和大小

    第二步: 检查目录结构

    第3步: 检查目录连接性

    Pass 4: Checking reference counts

    第5步: 检查簇概要信息

    zhanghe: 11/265320 files (0.0% non-contiguous), 37353/530128 blocks

    挂载与卸载

    可以使用以下方式挂载

    • 使用设备文件,下文演示
    • 使用UUID,要加-U选项,下文演示
    • 使用卷标,要加-L选项,下文演示
    [root@zhanghe /]# mount /dev/sda3 /mnt/test   #传统方式挂载,使用设备文件
    [root@zhanghe /]# umount /mnt/test          #卸载挂载点
    [root@zhanghe /]# e2label  /dev/sda3 mydata    #设备卷标和修改卷标
    [root@zhanghe /]# e2label  /dev/sda3        #查看卷标
    mydata
    [root@zhanghe /]# mount -L mydata /mnt/test  #使用卷标挂载
     [root@zhanghe /]# umount /dev/sda3        #卸载设备文件
    [root@zhanghe /]# blkid /dev/sda3          	#查看分工的基本信息,获取UUID
    /dev/sda3: LABEL="mydata" UUID="6da20b40-ed04-4e72-935b-8f69ec028995" 
     [root@zhanghe /]# mount -U 6da20b40-ed04-4e72-935b-8f69ec028995 /mnt/test
    #使用UUID的方式挂载
    
    

    挂载选项

    //挂载分区,先写设备文件,然后再写挂载点
    mount /dev/sdb3 /mnt/dir 
    
    //查看当前挂载了哪些分区,实际上读取/etc/mtab这个文件,如果我们挂载的时候不想写入到这个文件的话,使用mount –a即可。
    [root@zhanghe ~]# mount 
    
    

    -o指明挂载选项:

    • l sync以同步的方式IO
    • l async以非同步的方式IO,默认
    • l atime访问文件时更新时间戳
    • l noatime访问文件时更新时间戳
    • l auto当使用mount –a时自动挂载,默认
    • l noauto当使用mount –a时不自动挂载
    • l exec挂载完可执行二进制文件,默认
    • l noexec挂载完成后不可执行二进制文件
    • l dev可读取文件系统上的字符或者块设备
    • l nodev不可读取文件系统上的字符或者块设备
    • l ro只读挂载
    • l rw读写挂载,默认

    解释:sync以同步的方式挂载。平时是当我们保存一个文件的时候,是异步保存,虽然看起来是保存成功了,但是实际上只是保存到内存当中了,等到内存不忙时再写入磁盘上,这样的话有利于主机的效率,但是一旦掉电的话文件实际上没有保存,异步是实际上是默认挂载,而同步挂载的就是每当我们写入数据的时候内存都会立马与硬盘进行同步,这样的话数据是安全了,但是主机的效率却降低了。

    noatime不更改访问时间戳,这也是为了磁盘的IO考虑,有时主机也同时要打开上万的文件,如果这些文件都要更新时间戳,对主机来说是一笔很大的IO的负担,所以我们最好关闭。

    noexec挂载完成之后不可执行二进制文件,这也是一个对主机的保护措施,这一选项用于挂载U盘,光盘等外部设备,如果不设置这个选项的话但我们在主机插入U盘的时候很有可能被U盘的病毒给攻击,所以这一个选项一定要选上。

    默认挂载选项: rw, suid, dev, exec, auto, nouser, async, and relatime

    [root@zhanghe dir]# mount -o ro /dev/sdb6 /mnt/dir    #只读挂载
    [root@zhanghe dir]# cd /mnt/dir
    [root@zhanghe dir]# touch test.txt
    touch: 无法创建"test.txt": 只读文件系统
    mount  -o exec  dev/sdb6 /mnt/dir 禁止挂载分区当中的命令运行
    mount  –o  look  test.iso   #挂载光盘镜像
    [root@zhanghe]# mount -o remount,exec,rw  /dev/sdb6 /mnt/dir  #更改挂载属性
    
    
    [root@zhanghe ~]# umount /mnt/dir   #卸载分区时,有时候会失败
    umount: /mnt/dir: device is busy.
            (In some cases useful info about processes that use
             the device is found by lsof(8) or fuser(1))
    [root@zhanghe ~]# fuser -cu /mnt/dir  #查看一下谁在访问挂载点
    /mnt/dir:             2749c(root)
    [root@zhanghe ~]# fuser -km /mnt/dir   #强制把对方从挂载点当中踢出去,k表示kill之意
    /mnt/dir:             2749c
    [root@zhanghe ~]# umount /mnt/dir  #这里再卸载就没有问题了
    
    

    挂载镜像

    mount  –o  loop  /dev/sdb8 /media       #重点是要使用-o lo如果你不使用,会提示你使用的。
    
    

    自动挂载

    如果新创建一个分区我们每次登录时都要使用,不用每次都要手动挂载那么麻烦,linux专门有一个自动挂载 的文件,就是/etc/fstab这个文件:

    image-20200314084523484

    /dev/sdb1				/mnt/cdrom		ext4	defaults    0 0		
    
    

    这个文件当中的内容一共有五个字段,从左到右分别为:<uuid|设备文件|卷标> <挂载点路径><文件系统><挂载选项><备份频率><挂载的优先级,只有根可以为1> 。我们一般的设置的时候只要把最后两个字段设置为00(不备份,不检查)即可,如果我们想开机就进行挂载的话就把挂载的信息写入到这个文件里面即可开机自动挂载,或者在当前主机上卸载了之后使用mount –a也可自动进行挂载。

    //比如
    UUID=b01be8bd-b702-4c43-9541-a8bd04b9e6d1 swap    swap defaults 0 0
    
    

    管理

    内存占用查看-free

    查看系统上的物理内存和swap分区的使用情况,默认单位是字节,-m以M为单位显示

    image-20200314084647531

    tocal总大小

    buffer和cached,缓冲和缓存

    用池来缓冲大河对小河的冲击,这个池就是缓冲,目的是为了避免速度或性能慢的设备

    一个设备送数据特别慢,另一个设备拿特别快,找一个池子把经常的数据先放到池子里,用的时候能够快速的拿,缓存的目的是数据的重复使用。

    在操作系统当中我们可以把buffer理解成为里面存储的是元数据,比如当我们访问的是/var/log/message的时候,先从根开始查找比较麻烦,为了下一次用的时候比较快速,就可以把第一次找到的元数据先放到buffer当中,那么下一次使用的时候就可以直接从buffer里面得到目标文件的地址不用从根开始查找了。cached就是第一次查找完数据就放到到内存当中,等到下一次用的时候不用再去硬盘当中去调用,直接在内存当中进行调用即可,这两段空间完成可以清除,是为了加速性能存在的。

    好了,下面我们解释一下上图的的意思,total指的是总大小,used指的是已经使用的空间,但是请注意,这里说的已经使用的空间是真正已经使用的空间和可以被清除的buffer和cache的空间,也就是说这段空间内包括了buffer和cache的空间,但是我们在上面提到过,buffer和cache是可以被清除的,因而不能作数,所以,虽然明面上已经使用了416M,但是要减去53(buffer)和(cache)195才是真正的已经使用的空间:416-53-195=168M,那么168就是实际上真正已经使用的空间,其实是这个168就是第二行的166,少去的2M被损耗了呗!!

    还有第三个字段是空间我多少,上图中显示是3648,但是这3400是不包括buffer和cache的,所以当把buffer和cahe清除了之后,真正的空闲空间还有:3648+53+195=3648,约等于3649呗。

    最后一行,显示swap没有用,这才是最好的结果,因为linux只有物理内存够用,就不会使用swap分区,所以没有使用就说明物理内存足够使用。而windows则不同,windows可以一开机即使物理内存够用,也会占用虚拟内存。

    下图是centos7的free命令,centos7比centos6要好看许多:

    image-20200314084716746

    一共有4.3G,已经用了204M,还有3.7G,共享8.9M,缓存和缓存387M,可用有3.8G

    free算上了缓存,而available的没有算上缓存。

    swapon

    我们在上面讲过,增加一个swap分区的话先调整分区的类型,然后使用mkswap进行格式化,再然后使用swapon进行挂载启用,关闭swap分区使用swap使用swapoff即可。

    image-20200314084829039

    swapon –a   #启动定义在/etc/fstab当中的设备,与mount  –a 类似
    
    

    dd

    convert or copy file转换或者复制文件

    比如把/etc/issue复制到/tmp目录下:

    image-20200314084939129

    这个复制较之cp复制结果虽然看上去是相同的,但是其原理却是千差万别,cp是以文件为单位进行复制的,而dd以二进制为单位,直接在硬盘上操作的二进制流。像cp的复制是针对某个文件,把文件对应的数据调用到内存上,然后以文件为单位进行复制,而dd命令在硬盘的底层进行操作。

    默认单位是字节,我们也可以指成以M为单位。

    dd可谓只复制一个文件的一部分,比如前几个字节,用来备份MBR特别好

    [root@zabbix /]# dd if=/dev/sda of=/tmp/MBR.backup bs=512 count=1
    
    

    这段字符的含义就是把sda这块硬盘上的前512个字节,前512个字节就是MBR,把这512个字节复制一份到/tmp/MBR.backup上,bs=512就代表一个单位是5212,而count=1代表这一个单位。

    还可以通过cat来做光盘的镜像,比如放入一个光盘叫/dev/sdb3

    cat  /dev/sdb3  > /tmp/zh.iso     #光盘镜像就是这么做出来的
    
    

    swap应急

    如果swap磁盘不够用,但是又没有分区可以使用了,我们怎样才能增加swap分区呢?我们可以在别的有空间的分区上创建一个空文件,然后把这个文件当然是一块磁盘,然后mkswap这块磁盘,再然后启用也可以增加swap分区,用于临时救急,不可长时间使用,因为性能不会好,如果swap不够,最好的办法是加内存。

    [root@zabbix /]# dd if=/dev/zero of=/var/swap.bk bs=1M count=1024 
    记录了1024+0 的读入
    记录了1024+0 的写出
    1073741824字节(1.1 GB
    )已复制,108.412 秒,9.9 MB/秒
    
    

    利用dd命令在/var/下的创建一个正好1G的文件,同时我们也可以看到了磁盘的性能是每秒9.9M

    [root@zabbix /]# swapon /var/swap.bk
    
    

    df

    查看挂载分区的使用情况 。

    image-20200314085147613

    du

    查看目录和文件真正的大小。

    [root@zabbix /]# du -sh /boot    #查看/boot总大小,s为sum总大小之意,而h为人性化之意
    37M	/boot
    
    
    [root@zabbix ~]# du -h /boot               #里面每个目录的大小,-ah所有文件的大小
    13K	/boot/lost+found
    252K	/boot/efi/EFI/redhat
    254K	/boot/efi/EFI
    256K	/boot/efi
    
    
  • 相关阅读:
    关于webpack升级过后不能打包的问题;
    数组的一些理解
    .NET(C#):使用Win32Exception类型处理Win32错误代码
    托管代码和非托管代码
    托管DLL和非托管DLL的区别
    C#实现Dll(OCX)控件自动注册的两种方法(转)
    Com组件和Dll文件区别
    C#创建COM组件
    ajaxFileUpload插件上传文件 返回 syntaxError :unexpected token
    jquery插件--ajaxfileupload.js上传文件原理分析
  • 原文地址:https://www.cnblogs.com/yizhangheka/p/12424667.html
Copyright © 2011-2022 走看看