目录

mknod,[h|s]d[a-z][0-9]

Track,sectors,cylinder,MBR(msdos),GPT,

fdisk,parted

元数据区(inode table),数据区

VFS,超级块

硬链接与软链接


一、linux磁盘管理

     linux一切皆文件,linux对设备的操作都是通过文件接口来实现

1、设备类型

块设备(block):随机访问,数据交换单位为“块”

字符(character):线性访问,数据交换单位为字符

设备文件:FHS(LSB) 文件系统层级标准

/dev/        #设备相关文件的目录

       设备文件关联设备驱动程序

设备号:

       major:主设备号  区分设备类别,用于标明所需驱动程序

       minor:次设备号  区分同类设备不同个体

[root@Node3 dev]# ls -l sd*
brw-rw---- 1 root disk 8, 0 12月  1 14:18 sda        #主设备和次设备号用逗号隔开
brw-rw---- 1 root disk 8, 1 12月  1 14:18 sda1
brw-rw---- 1 root disk 8, 2 12月  1 14:18 sda2
brw-rw---- 1 root disk 8, 3 12月  1 14:18 sda3

手动创建设备文件:

mknod

mknod [OPTION]... NAME TYPE [MAJOR MINOR]                #自己创建的没意义

         -m:指定其权限

         TYPE:设备类型c,b,s

[root@Node3 src]# mknod testdev c 100 0
[root@Node3 src]# ls -l testdev
crw-r--r-- 1 root root 100, 0 12月  5 08:42 testdev
[root@Node3 src]# mknod -m 755 testdev01 c 100 1
[root@Node3 src]# ls -l testdev01
crwxr-xr-x 1 root root 100, 1 12月  5 08:42 testdev01

2、设备文件的文件名(ICANN)           #国际互联网地址分配

磁盘设备文件:

      IDE接口(ATA):并行,133MB/s

              两个IDE控制器:每个控制器可通过线缆介入两块磁盘,一主一从

              在linux上表示为/dev/hd[a-z][N],N表示分区                                       

      SCSI接口:并行,640MB/s  工业级别  #smail computer system interface 小型计算机系统接口

      SATA接口:串行,6Gpbs

      USB接口:串行,5Gpbs

      SAS接口:串行,

             在linux系统上的设备文件都表现为了:/dev/sd[a-z][N]


3、硬盘的内部结构

磁道:Track

扇区:Sectors

柱面:Cylinder

分区:通过柱面来划分,

分区标识方式:

     主分区或扩展分区:1-4

     逻辑分区:5,6,7,8..

注意:对linux而言,每个磁盘分区都是独立的可自我管理,可访问磁盘设备,每个磁盘分区都能创建独立的文件系统

硬盘的内部结构和工作原理,详见硬盘内部硬件结构和工作原理详解

MBR:master boot record 主引导扇区  

       它是存在于硬盘的0柱面,0磁头,1扇区里,占512字节的空间(扇区编号从0开始而不是1)。

   它由三个部分组成,主引导程序(bootloader)硬盘分区表DPT(Disk Partition table)和硬盘有效标志(55AA)。在总共512字节的主引导扇区里主引导程序(boot loader)占446个字节,第二部分是Partition table区(分区表),即DPT,占64个字节,硬盘中分区有多少以及每一分区的大小都记在其中。第三部分是magic number(标识当前MBR信息是否有效的标记),占2个字节,固定为55AA(有效)

       主引导扇区MBR是不属于任何一个操作系统,也不能用操作系统提供的磁盘操作命令来读取它,但可以通过命令来修改和重写,例如 fdisk/mbr;扇区中的主引导程序用来引导操作系统,告诉主机硬件从那里加载操作系统引导文件;

      扇区中的分区表DPT部分只有64字节,由于每个分区信息需要16个字节,所以对于采用MBR型分区结构的硬盘(其磁盘卷标类型为MS-DOS),最多只能识别4个主要分区。所以对于一个采用此种分区结构的硬盘来说,想要得到4个以上的主要分区是不可能的。这里就需要引出扩展分区了。扩展分区也是主分区(Primary partition)的一种,但它与主分区的不同在于理论上可以划分为无数个逻辑分区,每一个逻辑分区都有一个和MBR结构类似的扩展引导记录(EBR)

         在MBR分区表中最多4个主分区或者3个主分区+1个扩展分区,也就是说扩展分区只能有一个并且不能保存数据也不能格式化,只能再细划分为逻辑分区才可以使用
        在Linux系统中,硬盘分区命名为sda1-sda4或者hda1-hda4(其中a表示硬盘编号可能是a、b、c等等)。在MBR硬盘中,分区号1-4是主分区(或者扩展分区),逻辑分区号只能从5开始。

   传统的硬盘采用MBR分区格式,使用LBA寻址,这种寻址机制是32位的,因此最大能够支持2^32232次方)个扇区,而每个扇区的数据量是512字节,于是2^32 x 512,就得出了最大支持容量,这个数值按硬盘厂商的计算方式(1000进位制)来说,大约就是2.199TB.3TB硬盘明显已经超越了这个数值,于是多出来的那部分容量就会无法寻址,于是也就无法使用。所以在MBR分区表中,一个分区最大的容量为2T且每个分区的起始柱面必须在这个disk的前2T内。你有一个3T的硬盘,根据要求你至少要把它划分为2个分区,且最后一个分区的起始扇区要位于硬盘的前2T空间内。如果硬盘太大则必须改用GPT。详见MBR GPT FDISK PARTED 详解


二、磁盘分区

1、fdisk命令

        fdisk指令是Linux下通用的磁盘分区工具,它可以操纵硬盘分区表,完成对硬盘分区进行管理的各种操作。

fdisk [options] <disk>   change partition table

fdisk [options] -l <disk>  list partition table(s)  

 1)查看分区

[root@Node3 ~]# fdisk -l      #查看所有显示已识别的磁盘设备

Disk /dev/sda: 42.9 GB, 42949672960 bytes
255 heads, 63 sectors/track, 5221 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00037190

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1          64      512000   83  Linux
Partition 1 does not end on cylinder boundary.
/dev/sda2              64        2418    18902016   83  Linux
/dev/sda3            2418        2673     2048000   82  Linux swap / Solaris
#设备  有可引导系统  起始柱面  结束柱面   块数   分区标识  应用的系统
Disk /dev/sdb: 21.5 GB, 21474836480 bytes
255 heads, 63 sectors/track, 2610 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

[root@Node3 ~]# fdisk -l /dev/sda1     #查看单独的分区  

Disk /dev/sda1: 524 MB, 524288000 bytes
255 heads, 63 sectors/track, 63 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

 2)管理分区 

      fdisk提供了一个交互式接口来管理分区,它有许多子命令,分别用于不同的管理功能 ,所有的操作均在内存中完成。  

常用命令:

      m:查看子命令的帮助信息

      p:显示现有分区表

      n:创建新分区

      d:删除现有分区

      t:修改分区ID

      l:查看支持哪些分区ID

      w:保存退出 

      q:不保存退出  

使用一个新的硬盘分区:

[root@Node3 ~]# fdisk /dev/sdb
Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel
Building a new DOS disklabel with disk identifier 0x9b1b2b22.
Changes will remain in memory only, until you decide to write them.
After that, of course, the previous content won't be recoverable.

Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)

WARNING: DOS-compatible mode is deprecated. It's strongly recommended to
         switch off the mode (command 'c') and change display units to
         sectors (command 'u').

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)

Command (m for help): p

Disk /dev/sdb: 21.5 GB, 21474836480 bytes
255 heads, 63 sectors/track, 2610 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x9b1b2b22

   Device Boot      Start         End      Blocks   Id  System

Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
p  
Partition number (1-4): 1
First cylinder (1-2610, default 1): 
Using default value 1
Last cylinder, +cylinders or +size{K,M,G} (1-2610, default 2610): +10G

Command (m for help): p

Disk /dev/sdb: 21.5 GB, 21474836480 bytes
255 heads, 63 sectors/track, 2610 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x9b1b2b22

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1               1        1306    10490413+  83  Linux

Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
e
Partition number (1-4): 2
First cylinder (1307-2610, default 1307): 
Using default value 1307
Last cylinder, +cylinders or +size{K,M,G} (1307-2610, default 2610):   #剩下所有的空间都分给扩展分区
Using default value 2610

Command (m for help): p

Disk /dev/sdb: 21.5 GB, 21474836480 bytes
255 heads, 63 sectors/track, 2610 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x9b1b2b22

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1               1        1306    10490413+  83  Linux
/dev/sdb2            1307        2610    10474380    5  Extended

Command (m for help): n
Command action
   l   logical (5 or over)
   p   primary partition (1-4)
l    #此时这里只能选l了,选p的话会因为没有空间而报错
First cylinder (1307-2610, default 1307): 
Using default value 1307
Last cylinder, +cylinders or +size{K,M,G} (1307-2610, default 2610): +5G

Command (m for help): n
Command action
   l   logical (5 or over)
   p   primary partition (1-4)
l
First cylinder (1961-2610, default 1961): 
Using default value 1961
Last cylinder, +cylinders or +size{K,M,G} (1961-2610, default 2610): 
Using default value 2610

Command (m for help): p

Disk /dev/sdb: 21.5 GB, 21474836480 bytes
255 heads, 63 sectors/track, 2610 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x9b1b2b22

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1               1        1306    10490413+  83  Linux
/dev/sdb2            1307        2610    10474380    5  Extended
/dev/sdb5            1307        1960     5253223+  83  Linux
/dev/sdb6            1961        2610     5221093+  83  Linux

Command (m for help): w      #保存并推出
The partition table has been altered!            #分区表已更改

Calling ioctl() to re-read partition table.      #调用ioctl()重读分区表
Syncing disks.                                       #同步磁盘 
[root@Node3 ~]# fdisk -l    #再次查看

Disk /dev/sda: 42.9 GB, 42949672960 bytes
255 heads, 63 sectors/track, 5221 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00037190

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1          64      512000   83  Linux
Partition 1 does not end on cylinder boundary.
/dev/sda2              64        2418    18902016   83  Linux
/dev/sda3            2418        2673     2048000   82  Linux swap / Solaris

Disk /dev/sdb: 21.5 GB, 21474836480 bytes
255 heads, 63 sectors/track, 2610 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x9b1b2b22

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1               1        1306    10490413+  83  Linux
/dev/sdb2            1307        2610    10474380    5  Extended
/dev/sdb5            1307        1960     5253223+  83  Linux
/dev/sdb6            1961        2610     5221093+  83  Linux

使用已使用的/dev/sda硬盘的空余空间创建新分区:

[root@Node3 ~]# fdisk /dev/sda

WARNING: DOS-compatible mode is deprecated. It's strongly recommended to
         switch off the mode (command 'c') and change display units to
         sectors (command 'u').

Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
p
Selected partition 4
First cylinder (2673-5221, default 2673): 
Using default value 2673
Last cylinder, +cylinders or +size{K,M,G} (2673-5221, default 5221): +1G

Command (m for help): p

Disk /dev/sda: 42.9 GB, 42949672960 bytes
255 heads, 63 sectors/track, 5221 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00037190

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1          64      512000   83  Linux
Partition 1 does not end on cylinder boundary.
/dev/sda2              64        2418    18902016   83  Linux
/dev/sda3            2418        2673     2048000   82  Linux swap / Solaris
/dev/sda4            2673        2804     1060090   83  Linux

Command (m for help): w
The partition table has been altered!   #分区表已更改

Calling ioctl() to re-read partition table.   #调用ioctl()重读分区表

WARNING: Re-reading the partition table failed with error 16: 设备或资源忙.
The kernel still uses the old table. The new table will be used at
the next reboot or after you run partprobe(8) or kpartx(8)
Syncing disks.     #重读分区表失败

注意:

         这里需要注意如果磁盘没有任何分区,没有使用。内核能自动重新读取分区表识别分区,并同步到磁盘。如果是已有分区的磁盘则会有警告信息提示,不能识别,不能进行下一步格式化,要重启后才可以。(之前一直都是在虚拟机上新加硬盘操作的,没注意到这个问题)

[root@Node3 ~]# fdisk -l

Disk /dev/sda: 42.9 GB, 42949672960 bytes
255 heads, 63 sectors/track, 5221 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00037190

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1          64      512000   83  Linux
Partition 1 does not end on cylinder boundary.
/dev/sda2              64        2418    18902016   83  Linux
/dev/sda3            2418        2673     2048000   82  Linux swap / Solaris
/dev/sda4            2673        2804     1060090   83  Linux
#fdisk -l 命令能看到然并卵,格式化时就找不到

Disk /dev/sdb: 21.5 GB, 21474836480 bytes
255 heads, 63 sectors/track, 2610 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x9b1b2b22

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1               1        1306    10490413+  83  Linux
/dev/sdb2            1307        2610    10474380    5  Extended
/dev/sdb5            1307        1960     5253223+  83  Linux
/dev/sdb6            1961        2610     5221093+  83  Linux

查看内核是否已经识别新建分区:  cat /proc/partitions

[root@Node3 ~]# cat /proc/partitions 
major minor  #blocks  name

   8        0   41943040 sda
   8        1     512000 sda1
   8        2   18902016 sda2
   8        3    2048000 sda3
   8       16   20971520 sdb
   8       17   10490413 sdb1
   8       18          1 sdb2
   8       21    5253223 sdb5
   8       22    5221093 sdb6

通知内核强制重新读取分区表:

CentOS 5: partprobe /dev/Device               

CentOS 6: partx -a /dev/sd[a-z] 或 kpartx -af /dev/sd[a-z]     

注意:成功读取分区可能需要命令重复执行2次或以上


       如果使用fdisk对大于2T的磁盘分区,虽然可以分区,但仅识别2T的分区,所以分区大小超过2T的话,就使用Parted工具来实现对GPT磁盘进行分区操作

注意:是分区不能识别超过2T的分区,不是2T的硬盘,所以fdisk将超过2T的硬盘分区多个小于2T的分区是没有问题的

[root@Node3 ~]# fdisk /dev/sdc
Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel
Building a new DOS disklabel with disk identifier 0x2a4c75c9.
Changes will remain in memory only, until you decide to write them.
After that, of course, the previous content won't be recoverable.

Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)

WARNING: The size of this disk is 4.3 TB (4294967296000 bytes).
DOS partition table format can not be used on drives for volumes
larger than (2199023255040 bytes) for 512-byte sectors. Use parted(1) and GUID 
partition table format (GPT).


WARNING: DOS-compatible mode is deprecated. It's strongly recommended to
         switch off the mode (command 'c') and change display units to
         sectors (command 'u').

Command (m for help): p

Disk /dev/sdc: 4295.0 GB, 4294967296000 bytes
255 heads, 63 sectors/track, 522166 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x2a4c75c9

   Device Boot      Start         End      Blocks   Id  System

Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-522166, default 1): 
Using default value 1
Last cylinder, +cylinders or +size{K,M,G} (1-267349, default 267349): +3000G            
Value out of range.
Last cylinder, +cylinders or +size{K,M,G} (1-267349, default 267349): +2500G  
Value out of range.
Last cylinder, +cylinders or +size{K,M,G} (1-267349, default 267349): +2000G

Command (m for help): p

Disk /dev/sdc: 4295.0 GB, 4294967296000 bytes
255 heads, 63 sectors/track, 522166 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x2a4c75c9

   Device Boot      Start         End      Blocks   Id  System
/dev/sdc1               1      261084  2097157198+  83  Linux

Command (m for help): q


2、parted

       parted是一个可以分区并进行分区调整的工具,他可以创建,破坏,移动,复制,调整ext2 linux-swap fat fat32 reiserfs类型的分区,可以创建,调整,移动Macintosh的HFS分区,检测jfs,ntfs,ufs,xfs分区。

Parted 命令分为两种模式:命令行模式和交互模式。

命令行模式:parted [option] device [command] ,

       该模式可以直接在命令行下对磁盘进行分区操作,比较适合编程应用。

交互模式:parted [option] device 类似于使用fdisk /dev/xxx

       MBR:MBR分区表(即主引导记录)大家都很熟悉。所支持的最大卷:2T,而且对分区有限制:最多4个主分区或3个主分区加一个扩展分区

       GPT: GPT(即GUID分区表)。是源自EFI标准的一种较新的磁盘分区表结构的标准,是未来磁盘分区的主要形式。与MBR分区方式相比,具有如下优点。突破MBR 4个主分区限制,每个磁盘最多支持128个分区。支持大于2T的分区,最大卷可达18EB。

    使用方法:parted [options] [device [command [options...]...]]

 【选项说明】

  -l  显示所有块设备上的分区

选    项

功    能

-h

显示帮助信息

-i

交互式模式

-s

脚本模式,不提示用户

-v

显示版本号

【参数说明】

参数

功    能

设备

指定要分区的硬盘所对应的设备文件(没有指定则使用第一个块设备)

命令

要执行的parted命令。忽略此参数时,

parted指令进入自己的提示符。
支持的内部命令如下:

check(对指定分区执行简单的检查);

cp(将原设备上的原分区的文件复制到当前设备的目标分区);

help(显示命令帮助);

mkfs(在分区上创建指定的文件系统);

mklabel(创建新的磁盘标签(分区表));

mkpart(创建分区);

mkpartfs(创建分区及分区上的文件系统);

move(移动分区);

name(设置分区的名称);

print(显示分区列表);

quit(退出parted);

resize(调整分区大小);

rm(删除指定分区);

select(选择要操作的硬盘);

set(改变分区的状态标志)

查看分区:

[root@Node3 ~]# parted -l
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sda: 42.9GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos

Number  Start   End     Size    Type     File system     标志
 1      1049kB  525MB   524MB   primary  ext4            启动
 2      525MB   19.9GB  19.4GB  primary  ext4
 3      19.9GB  22.0GB  2097MB  primary  linux-swap(v1)
 4      22.0GB  23.1GB  1086MB  primary


Model: VMware, VMware Virtual S (scsi)
Disk /dev/sdb: 21.5GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos

Number  Start   End     Size    Type      File system  标志
 1      32.3kB  10.7GB  10.7GB  primary
 2      10.7GB  21.5GB  10.7GB  extended
 5      10.7GB  16.1GB  5379MB  logical
 6      16.1GB  21.5GB  5346MB  logical


错误: /dev/sdc: unrecognised disk label   #无法识别的磁盘标签                                 

[root@Node3 ~]#

管理分区:

[root@Node3 ~]# parted /dev/sdc
GNU Parted 2.1
使用 /dev/sdc
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) help                                                             
  align-check TYPE N                        check partition N for TYPE(min|opt) alignment
  check NUMBER                             do a simple check on the file system
  cp [FROM-DEVICE] FROM-NUMBER TO-NUMBER   copy file system to another partition
  help [COMMAND]                           print general help, or help on COMMAND
  mklabel,mktable LABEL-TYPE               create a new disklabel (partition table)
  mkfs NUMBER FS-TYPE                      make a FS-TYPE file system on partition NUMBER
  mkpart PART-TYPE [FS-TYPE] START END     make a partition
  mkpartfs PART-TYPE FS-TYPE START END     make a partition with a file system
  move NUMBER START END                    move partition NUMBER
  name NUMBER NAME                         name partition NUMBER as NAME
  print [devices|free|list,all|NUMBER]     display the partition table, available devices,
        free space, all found partitions, or a particular partition
  quit                                     exit program
  rescue START END                         rescue a lost partition near START and END
  resize NUMBER START END                  resize partition NUMBER and its file system
  rm NUMBER                                delete partition NUMBER
  select DEVICE                            choose the device to edit
  set NUMBER FLAG STATE                    change the FLAG on partition NUMBER
  toggle [NUMBER [FLAG]]                   toggle the state of FLAG on partition NUMBER
  unit UNIT                                set the default unit to UNIT
  version                                  display the version number and copyright
        information of GNU Parted
(parted) print                                                            
错误: /dev/sdc: unrecognised disk label                                   
(parted) mklabel gpt     #创建一个分区表,就是硬盘分区(分区表)格式                                                 
(parted) p                                                                
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sdc: 4295GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt

Number  Start  End  Size  File system  Name  标志

(parted) mkpart        #创建一个分区                                    
分区名称?  []?                                                           
文件系统类型?  [ext2]? ext3                                              
起始点?                                                                  
起始点? 0                                                                
结束点? +3T          #不用加+号了                                                         
错误: Invalid number.                                                              
(parted) mkpart
分区名称?  []? gp1
文件系统类型?  [ext2]? ext3                                              
起始点? 0                                                                
结束点? 3000G                                                            
警告: The resulting partition is not properly aligned for best performance.
忽略/Ignore/放弃/Cancel?                                                  
忽略/Ignore/放弃/Cancel? ignore      #忽略警告                                       
(parted) p                                                                
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sdc: 4295GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt

Number  Start   End     Size    File system  Name  标志
 1      17.4kB  3000GB  3000GB               gp1
                                            
(parted) mkpart                                                           
分区名称?  []?                                                           
文件系统类型?  [ext2]? ext3                                              
起始点? 3000G                                                            
结束点? 4000G                                                            
(parted) p                                                                
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sdc: 4295GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt

Number  Start   End     Size    File system  Name  标志
 1      17.4kB  3000GB  3000GB               gp1
 2      3000GB  4000GB  1000GB

(parted) mkpart                                                           
分区名称?  []?                                                           
文件系统类型?  [ext2]?                                                   
起始点? 4000G                                                            
结束点? 4001G                                                            
(parted) p                                                                
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sdc: 4295GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt

Number  Start   End     Size    File system  Name  标志
 1      17.4kB  3000GB  3000GB               gp1
 2      3000GB  4000GB  1000GB
 3      4000GB  4001GB  1000MB

(parted) rm                                                               
分区编号? 3                                                              
(parted) p                                                                
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sdc: 4295GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt

Number  Start   End     Size    File system  Name  标志
 1      17.4kB  3000GB  3000GB               gp1
 2      3000GB  4000GB  1000GB

(parted) q                                                                
信息: You may need to update /etc/fstab.                                  

[root@Node3 ~]#

       由于parted内建的mkfs还不够完善,所以完成以后我们可以使用quit命令退出parted并使用 系统的mkfs命令对分区进行格式化了。

查看系统上的磁盘分区:

[root@Node3 ~]# fdisk -l

Disk /dev/sda: 42.9 GB, 42949672960 bytes
255 heads, 63 sectors/track, 5221 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00037190

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1          64      512000   83  Linux
Partition 1 does not end on cylinder boundary.
/dev/sda2              64        2418    18902016   83  Linux
/dev/sda3            2418        2673     2048000   82  Linux swap / Solaris
/dev/sda4            2673        2804     1060090   83  Linux

WARNING: GPT (GUID Partition Table) detected on '/dev/sdc'! The util fdisk doesn't support GPT. Use GNU Parted.
#可以看到fdisk不支持GPT分区

Disk /dev/sdc: 4295.0 GB, 4294967296000 bytes
255 heads, 63 sectors/track, 522166 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

   Device Boot      Start         End      Blocks   Id  System
/dev/sdc1               1      267350  2147483647+  ee  GPT         #显示不出来

Disk /dev/sdb: 21.5 GB, 21474836480 bytes
255 heads, 63 sectors/track, 2610 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x9b1b2b22

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1               1        1306    10490413+  83  Linux
/dev/sdb2            1307        2610    10474380    5  Extended
/dev/sdb5            1307        1960     5253223+  83  Linux
/dev/sdb6            1961        2610     5221093+  83  Linux

用parted查看:

[root@Node3 ~]# parted -l
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sda: 42.9GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos

Number  Start   End     Size    Type     File system     标志
 1      1049kB  525MB   524MB   primary  ext4            启动
 2      525MB   19.9GB  19.4GB  primary  ext4
 3      19.9GB  22.0GB  2097MB  primary  linux-swap(v1)
 4      22.0GB  23.1GB  1086MB  primary


Model: VMware, VMware Virtual S (scsi)
Disk /dev/sdb: 21.5GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos

Number  Start   End     Size    Type      File system  标志
 1      32.3kB  10.7GB  10.7GB  primary
 2      10.7GB  21.5GB  10.7GB  extended
 5      10.7GB  16.1GB  5379MB  logical
 6      16.1GB  21.5GB  5346MB  logical


Model: VMware, VMware Virtual S (scsi)
Disk /dev/sdc: 4295GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt

Number  Start   End     Size    File system  Name  标志
 1      17.4kB  3000GB  3000GB               gp1
 2      3000GB  4000GB  1000GB


[root@Node3 ~]#


三、文件系统

      磁盘分区完成后,接下来的步骤就是格式化,格式化就是在分区上创建文件系统   

1、 文件系统

元数据

      文件跟内容没有关系的属性类信息,可以使用stat命令查看,属主属组、大小,文件名,时间戳等

元数据区(inode table):

      存放元数据,每个索引项(条目)称一个Inodeinode记录了文件的元数据(不包括文件名)和文件保存在哪些磁盘块上

根在内核中:其需要被关联至根文件系统,即rootfs    #系统启动时就关联了,否则启动不了系统

目录会保存它一级子目录、文件的文件名和指向的indoe信息(编号)

例: /var/logs/messages  访问一个文件的过程

      根的inode-->根目录对应的磁盘块-->var对应的inode编号-->查inode table,找到编号对应的Inode-->var目录的磁盘块-->logs对应的Inode编号-->查inode table,找到编号对应的inode-->找到Logs目录的磁盘块-->找到messages文件名对应的INODE编号-->查inode table,找到编号对应的inode-->找到messages磁盘块

dentry:内核会缓存文件的查找路径


2、VFS

Virtual File System   虚拟文件系统,把不同的文件系统虚拟成一个接口。

Linux文件系统:ext2,ext3,ext4,reiserfs,xfs,btrfs,

    光驱:iso9600

    网络文件系统:nfs,cifs

    集群文件系统:gfs2,ocfs2

    分布式文件系统:ceph

    windows文件系统:ntfs,vfat

    伪文件系统:tmpfs,hugepagefs,proc,sysfs

    Unix的文件系统:FFS,UFS,JFS

    交换文件系统:swap

日志型文件系统:加速文件检测并修复的过程,ext3,ext4,xfs

非日志型文件系统:ext2


3、块组(这个好像是ext系列文件系统才有的

      block group,为了方便管理,把块分成块组,每个块组的磁盘块个数都一样,每个块组都有自己的数据区和元数据区。

超级块:记录了整个分区的块组信息,在其它的块组中有该组超级块的备份


4、inode位图,块位图:快捷查找inode和块是否已经被使用


四、链接文件

链接文件:访问同一个文件数据不同路径

1、硬链接(实际链接)      

       多个文件路径指向了同一个Inode

创建方法:

       cp  -l  SRC  DEST

        ln  SRC  DEST

特性:

      1、目录不支持硬链接

      2、硬链接不能跨文件系统(分区)

      3、硬链接文件与原文件是指向同一个Inode,创建硬链接文件会增加Inode的引用计数,


2、软链接(符号链接)

       链接文件是一个完全独立的新文件(新的inode),但其指向了原文件的访问路径

创建方法:

      ln -s SRC DEST

特性:

   1、符号链接文件与原文件是两个独立文件

        2、目录可以创建符号链接

        3、可以跨文件系统

        4、删除链接不影响原文件,但删除原文件,符号指向的文件路径不复存在,因此,此时链接文件将变成失效的链接,

        5、其大小并非真正原文件大小,而是指向的原文件的文件路径字符串所包含的字节数


一、inode是什么?

理解inode,要从文件储存说起。

文件储存在硬盘上,硬盘的最小存储单位叫做"扇区"(Sector)。每个扇区储存512字节(相当于0.5KB)。

 

操作系统读取硬盘的时候,不会一个个扇区地读取,这样效率太低,而是一次性连续读取多个扇区,即一次性读取一个"块"(block)。这种由多个扇区组成的"块",是文件存取的最小单位。"块"的大小,最常见的是4KB,即连续八个sector组成一个 block。


文件数据都储存在"块"中,那么很显然,我们还必须找到一个地方储存文件的元信息,比如文件的创建者、文件的创建日期、文件的大小等等。这种储存文件元信息的区域就叫做inode,中文译名为"索引节点"。


二、inode的内容

inode包含文件的元信息,具体来说有以下内容:

  * 文件的字节数

  * 文件拥有者的User ID

  * 文件的Group ID

  * 文件的读、写、执行权限

  * 文件的时间戳,共有三个:ctime指inode上一次变动的时间,mtime指文件内容上一次变动的时间,atime指文件上一次打开的时间。

  * 链接数,即有多少文件名指向这个inode

  * 文件数据block的位置

 

可以用stat命令,查看某个文件的inode信息:

stat example.txt


总之,除了文件名以外的所有文件信息,都存在inode之中。至于为什么没有文件名,下文会有详细解释。

 

三、inode的大小

inode也会消耗硬盘空间,所以分区格式化的时候,分区自动将硬盘分成两个区域。一个是数据区,存放文件数据;另一个是inode区(inode table),存放inode所包含的信息。

每个inode节点的大小,一般是128字节或256字节。inode节点的总数,在格式化时就给定,一般是每1KB或每2KB就设置一个inode。假定在一块1GB的硬盘中,每个inode节点的大小为128字节,每1KB就设置一个inode,那么inode table的大小就会达到128MB,占整块硬盘的12.8%。

 

查看每个硬盘分区的inode总数和已经使用的数量,可以使用df命令。

df -i

查看每个inode节点的大小,可以用如下命令:

sudo dumpe2fs -h /dev/hda | grep "Inode size"

由于每个文件都必须有一个inode,因此有可能发生inode已经用光,但是硬盘还未存满的情况。这时,就无法在硬盘上创建新文件。

 

四、inode号码

每个inode都有一个号码,操作系统用inode号码来识别不同的文件。

 

这里值得重复一遍,Unix/Linux系统内部不使用文件名,而使用inode号码来识别文件。对于系统来说,文件名只是inode号码便于识别的别称或者绰号。表面上,用户通过文件名,打开文件。实际上,系统内部这个过程分成三步:首先,系统找到这个文件名对应的inode号码;其次,通过inode号码,获取inode信息;最后,根据inode信息,找到文件数据所在的block,读出数据。

 

使用ls -i命令,可以看到文件名对应的inode号码:

ls -i example.txt

 

五、目录文件

Unix/Linux系统中,目录(directory)也是一种文件。打开目录,实际上就是打开目录文件。

目录文件的结构非常简单,就是一系列目录项(dirent)的列表。每个目录项,由两部分组成:所包含文件的文件名,以及该文件名对应的inode号码。


ls命令只列出目录文件中的所有文件名:

ls /etc

ls -i命令列出整个目录文件,即文件名和inode号码:

ls -i /etc

如果要查看文件的详细信息,就必须根据inode号码,访问inode节点,读取信息。ls -l命令列出文件的详细信息。

ls -l /etc

 

六、硬链接

    一般情况下,文件名和inode号码是"一一对应"关系,每个inode号码对应一个文件名。但是,Unix/Linux系统允许,多个文件名指向同一个inode号码。这意味着,可以用不同的文件名访问同样的内容;对文件内容进行修改,会影响到所有文件名;但是,删除一个文件名,不影响另一个文件名的访问。这种情况就被称为"硬链接"(hard link)。

 

ln命令可以创建硬链接:

ln 源文件 目标文件

   运行上面这条命令以后,源文件与目标文件的inode号码相同,都指向同一个inode。inode信息中有一项叫做"链接数",记录指向该inode的文件名总数,这时就会增加1。反过来,删除一个文件名,就会使得inode节点中的"链接数"减1。当这个值减到0,表明没有文件名指向这个inode,系统就会回收这个inode号码,以及其所对应block区域。

 

这里顺便说一下目录文件的"链接数"。创建目录时,默认会生成两个目录项:"."和".."。前者的inode号码就是当前目录的inode号码,等同于当前目录的"硬链接";后者的inode号码就是当前目录的父目录的inode号码,等同于父目录的"硬链接"。所以,任何一个目录的"硬链接"总数,总是等于2加上它的子目录总数(含隐藏目录),这里的2是父目录对其的“硬链接”和当前目录下的".硬链接“。

 

七、软链接

  除了硬链接以外,还有一种特殊情况。文件A和文件B的inode号码虽然不一样,但是文件A的内容是文件B的路径。读取文件A时,系统会自动将访问者导向文件B。因此,无论打开哪一个文件,最终读取的都是文件B。这时,文件A就称为文件B的"软链接"(soft link)或者"符号链接(symbolic link)。

 

这意味着,文件A依赖于文件B而存在,如果删除了文件B,打开文件A就会报错:"No such file or directory"。这是软链接与硬链接最大的不同:文件A指向文件B的文件名,而不是文件B的inode号码,文件B的inode"链接数"不会因此发生变化。

 

ln -s命令可以创建软链接。

ln -s 源文文件或目录 目标文件或目录

 

八、inode的特殊作用

由于inode号码与文件名分离,这种机制导致了一些Unix/Linux系统特有的现象。

  1. 有时,文件名包含特殊字符,无法正常删除。这时,直接删除inode节点,就能起到删除文件的作用。

  2. 移动文件或重命名文件,只是改变文件名,不影响inode号码。

  3. 打开一个文件以后,系统就以inode号码来识别这个文件,不再考虑文件名。因此,通常来说,系统无法从inode号码得知文件名。

      第3点使得软件更新变得简单,可以在不关闭软件的情况下进行更新,不需要重启。因为系统通过inode号码,识别运行中的文件,不通过文件名。更新的时候,新版文件以同样的文件名,生成一个新的inode,不会影响到运行中的文件。等到下一次运行这个软件的时候,文件名就自动指向新版文件,旧版文件的inode则被回收。

 

九 实际问题

   在一台配置较低的Linux服务器(内存、硬盘比较小)的/data分区内创建文件时,系统提示磁盘空间不足,用df -h命令查看了一下磁盘使用情况,发现/data分区只使用了66%,还有12G的剩余空间,按理说不会出现这种问题。 后来用df -i查看了一下/data分区的索引节点(inode),发现已经用满(IUsed=100%),导致系统无法创建新目录和文件。 
查找原因:

  /data/cache目录中存在数量非常多的小字节缓存文件,占用的Block不多,但是占用了大量的inode。 

 

解决方案:
  1、删除/data/cache目录中的部分文件,释放出/data分区的一部分inode。
  2、用软连接将空闲分区/opt中的newcache目录连接到/data/cache,使用/opt分区的inode来缓解/data分区inode不足的问题:
  ln -s /opt/newcache /data/cache