1 Linux磁盘分区相关


1. 磁盘的组成和分区表

磁盘的组成主要由磁盘盘、机械手臂、磁盘读取头和主轴马达所组成,数据写入在磁盘盘上面,而磁盘盘上面又可以细分出扇区和磁柱,每个扇区大小为512字节。磁盘的第一个扇区主要记录了以下连个信息:

MBR(Master Boot Record)主要启动记录区:可以用来安装开机管理程序,大小为446字节;

partition table分区表:记录整个磁盘的分区情况,大小为64字节。

2. 主分区、拓展分区、逻辑分区:

受限于分区表的大小,储存在分区表中的分区记录最多只有4条,使得硬盘的主分区(Primary)或者拓展分区(Entended)至多只有四个;

主分区格式化后可以直接拿来使用而不可以再分区,作用就是计算机用来进行启动操作系统的,因此每一个操作系统的启动,或者称作是引导程序,都应该存放在主分区上

拓展分区至多只有一个,它的目的是使用额外的扇区来记录分区信息,需要经过二次分区才能使用,不可以格式化,当然不能储存数据;

由拓展分区再分割出来的是逻辑分区,逻辑分区没有数量限制,不过最终受限于Linux分区数量;

对于IDE硬盘,Linux分配了1-63序列号码作为这块硬盘上的分区号码,如第一块硬盘的标识为hda1-hda63(IDE),其中1-4为主分区或者拓展分区号码,逻辑分区占用5-63这59个号码;而SCSI硬盘只有1-16这些序列号码,1-4为主分区或者拓展分区号码,逻辑分区占用5-16这12个号码。

2 Linux系统支持的文件系统格式


1. Linux支持多种文件系统格式,可以在/lib/modules/`uname -r`/kernel/fs目录下查看:

ls /lib/modules/`uname -r`/kernel/fs

autofs4     configfs  exportfs  fat      jbd    mbcache.ko  nls

btrfs       cramfs    ext2      fscache  jbd2   nfs         squashfs
cachefiles  dlm       ext3      fuse     jffs2  nfs_common  ubifs
cifs        ecryptfs  ext4      gfs2     lockd  nfsd        udf

上面的命令显示该Linux系统在当前内核下所支持的文件系统格式,包括FAT、NFS、EXT2-4等等,不同的文件系统格式会有不同的分区标识。

2. EXT2文件系统:

EXT系列文件系统是索引式文件系统,采用inode+block模式来进行数据存储,其中文件权限和属性放置在inode中,实际数据放置在data block区块中,superblock超级区块会记录整个文件系统的整体信息,包括inode和block的总量、使用量、剩余量等;

每一个inode和block都有编号,其中:

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

inode:记录文件的属性,一个文件占用一个 inode,同时记录此文件的数据所在的 block 号码;
block:实际记录文件的内容,若文件太大时,会占用多个 block 。

Ext2 文件系统在格式化的时候基本上是区分为多个区块群组 (block group) ,每个区块群组都有独立的inode/block/superblock 系统,这样在文件系统很大的时候,不会因为inode和block数量太庞大而不易管理。

Ext2文件系统所支持的block大小有1KB、2KB、4KB,不同的大小,其所支持的最大磁盘容量和最大单一文件容量不同,具体如下:

Block大小                                         1KB             2KB                     4KB

最大单一文件限制                             16GB             256GB                 2TB
最大文件系统总容量                             2TB             8TB                     16TB

Ext2的block限制:

block的大小和数量在格式化完就不能够再改变了(除非重新格式化);

每个 block 内最多只能够放置一个文件的数据;
如果文件大于 block 的大小,则一个文件会占用多个 block 数量;
如果文件小于 block ,则该 block 的剩余容量就不能够再被使用了(磁盘空间会浪费)。

Ext2的inode的特点:

每个大小为128字节;

每个文件只会占用一个inode,那么文件系统能够建立的文件数量与inode数量有关;

系统读取文件时需要先找到 inode,并分析 inode 所记录的权限与用户是否符合,若符合则能够开始实际读取block的内容。

Ext3是Ext2的改进版,增加了日志式文件系统功能,而Linux kernel从2.6.28开始正式支持新的文件系统 Ext4,Ext4是Ext3的改进版,修改了Ext3部分重要的数据结构。Ext4和Ext3有很多区别,其中较之Ext3目前所支持的最大16TB文件系统和最大2TB文件,Ext4分别支别1EB(1,048,576TB,1EB=1024PB,1PB=1024TB)的文件系统,以及16TB 的文件,而且Ext4可以有无限数量的子目录,而Ext3目前只支持32,000个子目录

3 Linux磁盘管理


1. 获取硬盘的属性信息:

dmesg | grep scsi

scsi0 : ata_piix

scsi1 : ata_piix
scsi2 : ata_piix
scsi3 : ata_piix
scsi 0:0:0:0: Direct-Access     ATA      ST500DM002-1BD14 KC45 PQ: 0 ANSI: 5
scsi 1:0:0:0: CD-ROM            TSSTcorp DVD+-RW SH-216BB D100 PQ: 0 ANSI: 5
sr0: scsi3-mmc drive: 48x/48x writer dvd-ram cd/rw xa/form2 cdda tray
sr 1:0:0:0: Attached scsi CD-ROM sr0
scsi4 : SCSI emulation for USB Mass Storage devices
scsi 4:0:0:0: Direct-Access     Generic- Multi-Card       1.00 PQ: 0 ANSI: 0 CCS
sd 0:0:0:0: Attached scsi generic sg0 type 0
sr 1:0:0:0: Attached scsi generic sg1 type 5
sd 4:0:0:0: Attached scsi generic sg2 type 0

2. 查看磁盘整体使用情况:df

df命令各个选项的含义如下:

-a:显示所有文件系统的磁盘使用情况,包括0块(block)的文件系统,如/proc文件系统。

-k:以K字节为单位显示。

-m:以M字节为单位显示。

-i:显示i节点信息,而不是磁盘块。

-t:显示各指定类型的文件系统的磁盘空间使用情况。

 -x:列出不是某一指定类型文件系统的磁盘空间使用情况(与t选项相反)。

-T:显示文件系统类型。

-h:以人们较易阅读的 GBytes, MBytes, KBytes 等格式自行显示。

df -h

Filesystem      Size  Used Avail Use% Mounted on

/dev/sda3       150G   44G   99G  31% /
tmpfs           1.9G  236K  1.9G   1% /dev/shm
/dev/sda1        51G   24G   27G  47% /mnt/Offense
/dev/sda5       101G   58G   43G  58% /mnt/Defense
/dev/sda6       151G  4.8G  147G   4% /mnt/Free
/dev/sda7        11G   24K   11G   1% /mnt/Echo

3. 显示目录或文件占用磁盘空间大小:du

该命令的功能是逐级进入指定目录的每一个子目录并显示该目录占用文件系统数据块(1024字节)的情况。若没有给出指定目录,则对当前目录进行统计。

du命令的各个选项含义如下:

-s:对每个Names参数只给出占用的数据块总数。

-a:递归地显示指定目录中各文件及子目录中各文件占用的数据块数。若既不指定-s,也不指定-a,则只显示Names中的每一个目录及其中的各子目录所占的磁盘块数。

-b:以字节为单位列出磁盘空间使用情况(系统默认以k字节为单位)。

 -k:以K字节为单位列出磁盘空间使用情况。

-m:以M字节为单位列出磁盘空间使用情况。

-c:最后再加上一个总计(系统默认设置)。

-l:计算所有的文件大小,对硬链接文件,则计算多次。

 -x:跳过在不同文件系统上的目录不予统计。

-h :以人们较易读取的容量格式 (G/M) 显示;

du -s /mnt

72792    /root/

4. 软链接和硬链接

软链接:Symbolic link,又称符号链接,相当于windows系统中的快捷方式。软链接会创建一个独立的文件(占用一个inode),而这个文件会让数据的读取指向它连接的那个文件的别名,即有多个inode指向同一个block或blockgroup。创建:ln -s ...

硬链接:hard link,实际链接,只在某个目录下新建一条文件名链接到某inode号码的关联记录,不会创建新的文件。当所指向的inode被删除时,该链接将无法使用。硬链接不能跨文件系统,不能链接到目录。命令:ln ....。

5. 磁盘的分割:fdisk

Linux使用fdisk可以进行磁盘分区,具体步骤可参考:

fdisk /dev/sda

The device presents a logical sector size that is smaller than
the physical sector size. Aligning to a physical sector (or optimal
I/O) size boundary is recommended, or performance may be impacted.
Command (m for help): m
Command action
  a   toggle a bootable flag
  b   edit bsd disklabel
  c   toggle the dos compatibility flag
  d   delete a partition
  l   list known partition types
  m   print this menu
  n   add a new partition
  o   create a new empty DOS partition table
  p   print the partition table
  q   quit without saving changes
  s   create a new empty Sun disklabel
  t   change a partition's system id
  u   change display/entry units
  v   verify the partition table
  w   write table to disk and exit
  x   extra functionality (experts only)

6. 磁盘格式化:mkfs

为什么要进行磁盘格式化?

因为每种操作系统所设定的文件属性/权限都不相同, 为了存放这些文件所需的数据,因此就需要将分区进行格式化,以成为操作系统能够使用的文件系统格式(filesystem)。

mkdfs [-t 文件系统格式] 磁盘名

-t:指定系统支持的文件系统格式,如ext4,vfat等。

mke2fs:创建ext2/3/4文件系统

选项与参数:

-b :可以设定每个 block的大小,目前支持 1024, 2048, 4096 bytes 三种;

-i : inode容量大小;
-c :检查磁盘错误,仅下达一次 -c 时,会进行快速读取测试;如果下达两次 -c -c,会测试读写(read-write),比较耗时;
-L :后面可以接标头名称 (Label)
-j :本来 mke2fs 是 EXT2 ,加上 -j 后,会主动加入 journal(日志式文件系统功能)而成为 EXT3。
-t:指定文件系统格式,包括ext2/3/4。

7. 磁盘检查:fsck,badblocks

fsck [-t 文件系统] options 磁盘名

选项与参数:

-t :指明文件系统格式,Linux可通过superblock去查找文件系统,所以此选项可不用;

-A :依据/etc/fstab内容进行扫描;

-a:自动修复检查到扇区问题;

-y:类似于-a,只是某些filesystem只支持此参数;

-C:以直方图的形式的来显示检查的进度;

-f:对于ext系列的filesystem,可执行此选项来进行强制检查;

-D :对于ext系列的filesystem,针对文件系统下的目录进行优化配置。

badblocks:检查硬盘等扇区是否有坏道

选项与参数:

-s :在屏幕上以百分比的方式显示进度
-v :Verbose mode
-w :使用写入的方式来测试,建议不要使用此一参数,尤其是待检查的装置已有文件数据时。

8. 磁盘的挂载和卸载:

mount 磁盘文件名 挂载点

-a:依照配置文件 /etc/fstab 的数据将所有未挂载的磁盘都挂载上来;

-l :单纯的输入 mount 会显示目前挂载的信息。加上 -l 可增列 Label 名称;

-n :在默认的情况下,系统会将实际挂载的情况实时写入 /etc/mtab 中,以利于其他程序的运作;

-o:可接挂载时额外加上的参数,如帐号、密码、读取权限等。

-L:利用卷标名来进行挂载。

umount 磁盘名或挂载点

-f:强制卸载;

-n:不更新/etc/mtab的情况下卸载

开机自动挂载:/etc/fstab

可通过修改此文件来进行开机自动挂载,cat /etc/fstab:

UUID=f139256a-b396-48e5-ba9c-6c13f4f8923b /                       ext4    defaults        1 1

UUID=624d6d56-8613-4a27-ad6a-50eab26868a9 swap                    swap    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/sda1          /mnt/Offense        ntfs     defaults     0 0
/dev/sda5          /mnt/Defense        ntfs     defaults     0 0
/dev/sda6          /mnt/Free        ntfs     defaults     0 0
/dev/sda7          /mnt/Echo        vfat     defaults     0 0

ps:根目录必须挂载,且要先于其他挂载点;挂载点的目录必须事先建立,且同一时间内,只能挂载一次;分区在同一时间内也只能挂载一次;在进行卸载时,要将工作目录移到挂载点之外

                                                                                                                       ——Rango Chen