文件系统操作简述

[TOC]

基础知识

  1. 磁道 Track:一个磁盘上 的一个圆圈为一个磁道,而许多同心圆组起来就是盘面。

  2. 扇区 Sector:磁道上是有若干弧形组成,每个弧形就是一个扇区,扇区大小是固定的为512bytes。

  3. 柱面 Cylinder:每个盘面都被划分为数目相等的磁道,并从外缘的0开始编号,具有相同编号的磁道形成一个圆柱,称之为磁盘的柱面。柱面是由半径相同的一组同心圆组成,形成一个圆柱体。柱面是分区的最小单位。 o_360px-Cylinder_Head_Sector_svg_thumb

  4. 磁盘分区就是指指定分区的起始和结束柱面。

  5. 第一个扇区里面有硬盘的主引导记录MBR以及分区表的信息。

    MBR站446bytes,partition table占64bytes。

    由于分区表只有64bytes,所以最多只能记录四条分区记录,分为主primary分区和扩展extended分区。扩展分区还能再分出逻辑分区logical。

    扩展分区最多只能有一个,操作系统限制的。

    能被格式化的只有主分区和逻辑分区,扩展分区无法格式化。

  6. 文件系统中,有如下区分:

    super block:记录此文件的整体信息,包括inode/block的总量,使用量,剩余量,以及文件系统的格式和相关信息等。

    inode:记录文件的属性,一个文件占用一个inode,同时记录此文件的数据所在的block号码。

    block:记录实际文件的内容,若文件太大时,会占用多个block。

    文件系统会先格式化出inode与block的块。

    通过找到inode再来找到对应的block成为索引式文件系统。而FAT格式的没有inode,每个block号码都记录找在前一个block中。

  7. 一般格式化后block的大小就固定了,一般可选1KB,2KB,4KB。每个block里只能放一个文件。

  8. 由于每个inode只有一个文件,所以文件系统能创建的文件数量和inode的数量有关。而由于inode的大小有限,单个文件大小也有限制,但是文件系统能通过block来记录其他block。

拿到新硬盘三部曲

分区

  1. 2T以内

    fdisk -l

    找到系统所有分区

    fdisk /dev/sda

    对磁盘进行分区,这里没有123编号,因为是对磁盘分区而不是对分区分区
    这时会出现帮助提示,m为帮助,这里可以进行操作,一般步骤为:
    n 新建分区

    新建后首先会让选择分区类型,扩展分区或者主分区,扩展分区一般不能直接用,而要被再划分成逻辑分区。
    还能设置分区大小,比如+1GB

    p 显示现有分区
    q 不保存退出
    d 删除分区,后面接分区编号
    w 保存所有改动,如果不w,则所有改动都不生效

  2. 大于2T

    parted /dev/sda print

    列出本机该磁盘的分区资料

    parted /dev/sda mkpart primary ext4 1MB 1.5TB

    这里的mkpart是新建分区,类型有primary,extended,logical,后面是起始容量和结束容量

    parted /dev/sda rm 2

    后面的2代表分区编号,这里执行就马上删了

格式化

  1. mkfs -t ext4 /dev/sda1

    这里对分区进行格式化,t后面跟文件系统格式
    起始mkfs是综合命令,他会调用系统的mkfs.ext4来进行格式化操作
    这个命令会自动把block设置成4K

  2. mke2fs 这个命令可以手动设置block大小个各种参数比如卷标

挂载

  1. mount -a

    自动从/etc/fstab挂载,一般用于测试fstab写的是否正确

    mount -l

    显示目前所有挂载情况,l参数能显示label信息

    mount /dev/sda1 /data

    ,把sda1挂载到data

  2. umount /data

    卸载

  3. 开机启动放在/etc/fstab,按照如下格式加一行

    /dev/sda2  /root       ext4    defaults        0       0
    

    修改完卸载所有,然后执行mount -a

  4. fuser

    当需要umount一个分区的时候,提示繁忙,这个时候需要找出是那些进程在占用分区,就可以使用这个命令

    fuser -m -v /dev/sda1 #m代表mount,显示所有占用的进程,v是verbose,显示完整的信息
    fuse -m -i -k /dev/sda1 #把占用的进程找出来并且都kill掉,i参数为互动模式
    

查看磁盘容量

  1. df -h

    显示文件系统整体磁盘容量,也能看到所有挂载情况

  2. du -sh /data

    显示data目录下的磁盘占用,用人性化的容量显示,不显示子文件夹的容量而显示所有的

测试

测试硬盘写入速度,可以使dd命令生成一个大文件:

dd if=/dev/zero of=/data/filename bs=1M count=1024 conv=fdatasync

if指的input file,zero是一个输出0的设备,of指output file,bs指block大小,count指bs个数

问: 以下几种方式测试磁盘读写速度有什么区别?
col1 col2
1 ddbs=1M count=128 if=/dev/zero of=test
2 dd bs=1M count=128 if=/dev/zero of=test; sync
3 dd bs=1M count=128 if=/dev/zero of=test conv=fdatasync
4 dd bs=1M count=128 if=/dev/zero of=test oflag=dsync

答:区别在于内存中写缓存的处理方式。

  1. ddbs=1M count=128 if=/dev/zero of=test

没有加任何参数,dd默认的方式不包括“同步(sync)”命令。也就是说,dd命令完成前并没有让系统真正把文件写到磁盘上。所以以上命令只是单纯地把这128MB的数据读到内存缓冲当中(写缓存[write cache])。所以你得到的将是一个超级快的速度。因为其实dd给你的只是读取速度,直到dd完成后系统才开始真正往磁盘上写数据,但这个速度你是看不到了。所以如果这个速度很快,先不要偷着乐。呵呵

  1. ddbs=1M count=128 if=/dev/zero of=test; sync

和前面1中的完全一样。分号隔开的只是先后两个独立的命令。当sync命令准备开始往磁盘上真正写入数据的时候,前面dd命令已经把错误的“写入速度”值显示在屏幕上了。所以你还是得不到真正的写入速度。

  1. ddbs=1M count=128 if=/dev/zero of=test conv=fdatasync

加入这个参数后,dd命令执行到最后会真正执行一次“同步(sync)”操作,所以这时候你得到的是读取这128M数据到内存并写入到磁盘上所需的时间,这样算出来的时间才是比较符合实际的。

  1. ddbs=1M count=128 if=/dev/zero of=test oflag=dsync

加入这个参数后,dd在执行时每次都会进行同步写入操作。也就是说,这条命令每次读取1M后就要先把这1M写入磁盘,然后再读取下面这1M,一共重复128次。这可能是最慢的一种方式了,因为基本上没有用到写缓存(write cache)。

问:那应该用哪一种呢?
答:建议使用

ddbs=1M count=128 if=/dev/zero of=test conv=fdatasync

因为这种方式最接近计算机实际操作,所以测出来的数据最有参考价值。

来源:http://blog.csdn.net/xrb66/article/details/7180919

系统级别监控:iostat

进程级别监控:iotop

备份

  1. cp,显示不了进度,v参数只能显示当前复制的文件

    cp -ravi /data/* /mnt/king

    r遍历
    a相当于d保持连接p保持属性r递归,加了a后r不用加
    v显示当前复制的文件
    i交互模式

    cp 拷贝文件时,如果目标文件存在,则把文件截短为0,然后把新内容写入;如果目标文件不存在,则创建文件,然后把文件写入目标文件。

规划

  1. /mnt 临时挂载,一般用来显示u盘等
  2. /data 一般用来放置软件产生的或者自身有价值的文件,比如nginx的wwwroot目录
  3. /media 一般用来放置挂载的硬盘等

← 安装SAMBA服务  openWRT路由器的一些小问题 →