浅谈Linux磁盘存储管理推荐

一、 磁盘管理的基本概念linux系统中所有的硬件设备都是通过文件的方式来表现和使用的,我们将这些文件称为设备文件,在Linux下的/dev目录中有大量的设备文件,根据设备文件的不同,又分为字符设备文件和块设备文件。字符设备文件的存取是以字符流的方式来进行的,一次传送一个字符。常见的有打印机,终端(TTY)、绘图仪和磁带设备等等,字符设备文件有时也被称为 raw 设备文件。块设备文件是以数据块的方式来存取的,最常见的设备就是磁盘。系统通过块设备文件存取数据的时候,先从内存中的buffer中读或写数据。而不是直接传送数据到物理磁盘。这种方式有效的提高了磁盘的I/O性能。关于硬盘设备文件的概念,我们在第二章已经进行了初步的介绍,这里进行更深入的讲述。

1.1 磁盘设备在linux下的表示方法现在常见的磁盘类型有IDE并口硬盘、STAT串口硬盘以及SCSI硬盘,不同类型的硬盘在linux下对应的设备文件名称不尽相同,linux下磁盘设备常用的表示方案有两种:方案一:主设备号+次设备号+磁盘分区编号对于IDE硬盘:hd[a-z]x对于SCSI硬盘:sd[a-z]x方案二:(主设备号+[0-n],y)对于IDE硬盘:(hd[0-n],y)对于SCSI硬盘:(sd[0-n],y)主设备号代表设备的类型,可以唯一地确定设备的驱动程序和界面,主设备号相同的设备是同类型设备,即,使用同一个驱动程序,比如hd表示IDE硬盘,sd表示SCSI硬盘,tty表示终端设备等。次设备号代表同类设备中的序号, a-z 就表示设备的序号。如/dev/hda表示第一块IDE硬盘,/dev/hdb表示第二块IDE硬盘。同理,/dev/sda以及/dev/sdb分别表示第一、第二块SCSI硬盘。在有些情况下,系统只有一块硬盘,但是设备文件却显示为hdb,这与硬盘的跳线有关,只用知道设备表示的意思就行了。磁盘分区编号,用 x 表示在每块磁盘上划分的磁盘分区编号。在每块硬盘上可能会划分一定的分区,分区的意思类似与windows中C盘、D盘的概念,针对每个分区,linux用/dev/hdax或者/dev/sdbx表示,这里的 x 代表第一块IDE硬盘的第 x 个分区和第二块SCSI硬盘的第 x 个分区。除了用 a-z 表示同类硬盘的序号,也可以用 0-n 表示硬盘的序号,第二种方案中的 y 是一个数字,从 1 开始,表示磁盘分区编号。比如,(hd0,8)与hda7是等同的,表示第一块IDE硬盘的第七个分区,而(sd4,3)等同与sde2,表示第5块SCSI硬盘的第二个分区。

1.2 设备的挂载与使用在windows下,用户如果使用某些设备,如光盘或者软盘时,只需将设备放入相应的驱动器,然后系统自动加载,就可以通过对应的设备盘符,如G(光驱所在的盘符)盘、A盘(软驱盘符)来读取数据,但是在linux系统下,没有盘符的概念,对应的是磁盘分区,对任何设备的使用都需要通过挂载(mount)的方式实现,要完成挂载,需要满足3个条件: 挂载磁盘分区的文件系统类型 要挂载分区对应的设备文件 已经建立好的一个目录作为挂载点对于磁盘分区的文件系统,linux下最常用的是ext2/ext3,关于如何在磁盘建立文件系统,在下个章节会有详细讲述。挂载分区对应的设备文件在上面已经讲述,linux下所有设备文件存放在/dev目录下,因此对应的设备文件一般是/dev/hda1、/dev/sdc6等等。挂载点就是在linux上建立的一个目录,通过这个目录建立了操作系统和磁盘存取的入口,也就是说将设备挂载到这个目录后,对这个目录的任何操作就相当于对设备的操作。linux系统默认的挂载点目录为/mnt或者/media,我们也可以建立自己的挂载点。在进行挂载设备前必须注意:用pwd命令查看当前所在的目录是否是挂载点目录下,如果是,请用cd命令切换到其它目录下,不然mount时会提示 device busy 的错误。如果想退出某个设备,必须进行卸载操作,卸载命令为umount,语法为umount 挂载点,例如要想弹出光驱,按光驱弹出按钮是没用的,只有先进行卸载(umount /mnt/cdrom)操作,然后才能弹出光驱。请看下面的一个例子,通过df命令查看当前系统的分区情况:[root@data1 ~]# df -hFilesystem Size Used Avail Use% Mounted on/dev/sda5 15G 429M 14G 4% //dev/sda9 328G 195M 311G 1% /oracle/dev/sda8 7.6G 146M 7.1G 2% /tmp/dev/sda6 9.5G 151M 8.9G 2% /home/dev/sda3 15G 3.8G 9.7G 29% /usr/dev/sda2 15G 309M 14G 3% /var/dev/sda1 289M 16M 259M 6% /boottmpfs 3.9G 0 3.9G 0% /dev/shm/dev/sdb1 86G 9.8G 76G 2% /mnt/stor根据命令的输出我们可以知道: 左边第一列 Filesystem 项显示了每个分区对应的设备文件名,由设备文件名可知,此系统有两块硬盘,并且是SCSI硬盘,分别是/dev/sda和/dev/sdb。在/dev/sda设备上又划分了7个磁盘分区,而/dev/sdb设备上仅仅划分了一个分区。 第二列 Size 项显示了每个磁盘分区空间的大小。 第三列 Used 项显示了已经使用的磁盘空间大小。 第四列 Avail 项显示了可用的磁盘空间大小。 第五列 Use% 项显示了可用磁盘空间占用磁盘分区总空间的百分比。 最后一列 Mounted on 项显示了磁盘分区对应的挂载点目录名。如果我们要卸载/dev/sdb1设备,只需执行umount /mnt/stor即可,当然卸载前要保证此分区的所有程序没有在使用中。

1.3 磁盘分区的划分标准在第二章安装操作系统时,我们就详细讲述了如何给磁盘进行分区,因为分区对于linux系统的稳定和安全非常重要,合理正确的划分磁盘分区有助于系统的稳定运行和数据的安全保障,下面我们介绍如何合理的划分磁盘分区以及这种划分带来的好处。磁盘的分区由主分区、扩展分区和逻辑分区组成,在一块硬盘上,主分区的最大个数是4个,其中扩展分区也算一个主分区,在扩展分区下可以建立很多逻辑分区,所以主分区(包括扩展分区)范围是从1-4,逻辑分区从5开始,对于逻辑分区,Linux 规定它们必须建立在扩展分区上,而不是建立在主分区上。主分区的作用是用来启动操作系统的,主要存放操作系统的启动或引导程序,因此建议操作系统的引导程序都放在主分区,比如linux的/boot分区,最好放在主分区上。扩展分区只不过是逻辑分区的 容器 。实际上只有主分区和逻辑分区是用来进行数据存储的,因而可以将数据集中存放在磁盘的逻辑分区中,由于磁盘分区作用的不同,linux对主分区大小也有限制,因此,对于大量的数据,一定要存储在逻辑分区中。经过上面的阐述,一个合理的分区方式为:主分区在前,扩展分区在后,然后在扩展分区中划分逻辑分区;主分区的个数加上扩展分区个数要控制在四个之内。通过fdisk l命令可以显示当前系统分区的所有信息:[root@data1 ~]# fdisk -lDisk /dev/sda: 437.9 GB, 437998583808 bytes255 heads, 63 sectors/track, 53250 cylindersUnits = cylinders of 16065 * 512 = 8225280 bytes Device Boot Start End Blocks Id System/dev/sda1 * 1 38 305203+ 83 Linux/dev/sda2 39 1950 15358140 83 Linux/dev/sda3 1951 3862 15358140 83 Linux/dev/sda4 3863 53250 396709110 5 Extended/dev/sda5 3863 5774 15358108+ 83 Linux/dev/sda6 5775 7049 10241406 83 Linux/dev/sda7 7050 8069 8193118+ 82 Linux swap / Solaris/dev/sda8 8070 9089 8193118+ 83 Linux/dev/sda9 9090 53250 354723201 83 LinuxNote: sector size is 4096 (not 512)Disk /dev/sdb: 943.7 GB, 943718400000 bytes255 heads, 63 sectors/track, 14341 cylindersUnits = cylinders of 16065 * 4096 = 65802240 bytes Device Boot Start End Blocks Id System/dev/sdb1 1 14341 921552408 83 Linux对于输出每项的含义解释如下: Heads代表磁盘面数;sectors代表扇区数;每个扇区大小为0.5k,cylinders代表柱面数,因此,硬盘空间总大小=磁面个数*(扇区个数*每个扇区的大小512)*柱面个数。 左边第一列 Device 项显示了磁盘分区对应的设备文件名 第二列 Boot 项显示是否为引导分区,上面的/dev/sda1就是引导分区。 第三列 Start 项表示每个磁盘分区的起始位置,以柱面为计数单位。 第四列 End 项显示了每个磁盘分区的终止位置,以柱面为计数单位。 第五列 Blocks 项显示了磁盘分区的容量,以K为单位。 第六列 Id 项显示了磁盘分区对应的ID,根据分区的不同,分区对应的ID号也不同,linux下用83代表主分区和逻辑分区,用5代表扩展分区,而用82代表交换分区。用7代表NTFS分区等等。 第七列 System 项的含义与第六列基本相同,都是表示不同的分区类型。由此可知,此系统从/dev/sda1到/dev/sda4为主分区,而/dev/sda4为扩展分区,在/dev/sda4下又建立了/dev/sda5到/dev/sda9共5个逻辑分区,其中/dev/sda7为交换分区。

二、利用fdisk工具划分磁盘分区fdisk是linux下一款功能强大的磁盘分区管理工具,可以观察硬盘的使用情况,也可以对磁盘进行分割,linux下类似与fdisk的工具还有cfdisk、parted等,它们都有各自的优点,本文推荐fdisk,因为它简单容易上手,是各个linux发行版最经常使用的磁盘分区工具,下面具体介绍这个工具的使用。

2.1 fdisk参数含义介绍使用格式:fdisk [-l] [-b SSZ] [-u] device选项含义: -l:查询指定设备的分区状况,如:fdisk l /dev/sda,如果 -l 选项后面不加任何设备名称,则查看系统所有设备的分区情况。 -b SSZ:将指定的分区大小输出到标准输出上,单位为区块。 -u:一般与 -l 选项配合使用,显示结果将用扇区数目取代柱面数目,用来表示每个分区的起始地址。 device:要显示或操作的设备名称。fdisk的使用分为两个部分,查询部分和交互操作部分。通过fdisk device即可进入命令交互操作界面:然后输入m显示交互操作下所有可使用的命令。[root@localhost /]# fdisk /dev/sdbWarning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)Command (m for help): mCommand 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 v verify the partition table w write table to disk and exit x extra functionality (experts only)对于交互界面下的命令含义解释如下: a:设定硬盘启动区 b:编辑一个BSD类型分区 c:编辑一个DOS兼容分区 d:删除一个分区 l:查看指定分区的分区表信息 m:显示fdisk每个交互命令的详细含义 n:增加一个新的分区 o:创建一个DOS分区 p:显示分区信息 q:退出交互操作,不保存操作的内容 s:创建一个空的Sun分区表 t:改变分区类型 v:校验硬盘分区表 w:写分区表信息到硬盘,保存操作退出 x:执行高级操作模式。交互命令很多,但是经常用到的只有d、l、m、n、p、q、w这几个选项,只要熟练掌握这几个参数的含义和用法,简单的磁盘划分操作不成问题。

2.2 fdisk实例讲解为了更清楚的介绍fdisk的使用方法,接下来我们通过实例讲解的方式,从磁盘分区的创建显示、修改、删除3个方面介绍fdisk的使用方法和技巧。1.创建磁盘分区在现有的linux系统上增加了一块硬盘,系统对应的设备名为/deb/sdb,下面通过fdisk命令对这个磁盘进行分区划分,请看下面的实例讲解:[root@localhost /]# fdisk /dev/sdbThe number of cylinders for this disk is set to 1044.There is nothing wrong with that, but this is larger than 1024,and could in certain setups cause problems with:1) software that runs at boot time (e.g., old versions of LILO)2) booting and partitioning software from other OSs (e.g., DOS FDISK, OS/2 FDISK)Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)Command (m for help): n #输入 n 创建一个新的磁盘分区Command action e extended #这里的 e 代表创建一个扩展分区 p primary partition (1-4)#这里的 p 代表创建一个主分区p #首先创建一个主分区Partition number (1-4): Value out of range.Partition number (1-4): 1 #主分区的编号从1到4,这里输入1First cylinder (1-1044, default 1): #这里指定分区的起始值,以柱面为单位计数,默认从1开始,直接回车即可。Using default value 1 Last cylinder or +size or +sizeM or +sizeK (1-1044, default 1044): +1024M#这里是指定分区大小,直接输入需要的分区大小即可,例如 +1024M 表示此分区大小为1024M, +8G 表示此分区大小为8G。Command (m for help): p #这里输入 p 显示分区情况,从下面可以看到,此分区已经建立起来。Disk /dev/sdb: 8589 MB, 8589934592 bytes255 heads, 63 sectors/track, 1044 cylindersUnits = cylinders of 16065 * 512 = 8225280 bytes

Device Boot Start End Blocks Id System/dev/sdb1 1 125 1004031 83 Linux

Command (m for help): n #继续创建一个分区

Command action e extended p primary partition (1-4)pPartition number (1-4): 2First cylinder (126-1044, default 126): Using default value 126Last cylinder or +size or +sizeM or +sizeK (126-1044, default 1044): +1024M

Command (m for help): p

Disk /dev/sdb: 8589 MB, 8589934592 bytes255 heads, 63 sectors/track, 1044 cylindersUnits = cylinders of 16065 * 512 = 8225280 bytes

Device Boot Start End Blocks Id System/dev/sdb1 1 125 1004031 83 Linux/dev/sdb2 126 250 1004062+ 83 LinuxCommand (m for help): nCommand action e extended p primary partition (1-4)e #这里输入 e 创建一个扩展分区Partition number (1-4): 3 #由于扩展分区也属于主分区,而分区号1和2已经被使用,因此这里输入3。当然输入4也可以,要遵循的一个原则是:输入的分区号码必须在1-4之间,而且号码未被使用。First cylinder (251-1044, default 251): #这里仍然用缺省的输入值,直接回车即可。Using default value 251Last cylinder or +size or +sizeM or +sizeK (251-1044, default 1044): #根据磁盘分区的划分标准,如果要建立扩展分区,最好将磁盘所有剩余空间都分给了扩展分区,这里直接输入回车,磁盘剩余空间全部分给扩展分区。Using default value 1044

Command (m for help): p #从下面可以看出,我们已经划分了两个主分区和一个扩展分区。Disk /dev/sdb: 8589 MB, 8589934592 bytes255 heads, 63 sectors/track, 1044 cylindersUnits = cylinders of 16065 * 512 = 8225280 bytes

Device Boot Start End Blocks Id System/dev/sdb1 1 125 1004031 83 Linux/dev/sdb2 126 250 1004062+ 83 Linux/dev/sdb3 251 1044 6377805 5 Extended

Command (m for help): n

Command action l logical (5 or over) #这里的 l 表示创建一个逻辑分区 p primary partition (1-4) #这里的 p 表示创建一个主分区,此时我们已经不能创建主分区了,因为所有剩余的磁盘空间都已经分给扩展分区。l #这里输入 l 创建一个逻辑分区First cylinder (251-1044, default 251): #这里回车即可Using default value 251Last cylinder or +size or +sizeM or +sizeK (251-1044, default 1044): +1024M #这里输入要创建的逻辑分区大小,含义与上面创建主分区相同。Command (m for help): p #显示已经创建的磁盘分区情况,从下面可以看出,已经创建了两个主分区和一个扩展分区,在扩展分区下创建了一个逻辑分区。Disk /dev/sdb: 8589 MB, 8589934592 bytes255 heads, 63 sectors/track, 1044 cylindersUnits = cylinders of 16065 * 512 = 8225280 bytes

Device Boot Start End Blocks Id System/dev/sdb1 1 125 1004031 83 Linux/dev/sdb2 126 250 1004062+ 83 Linux/dev/sdb3 251 1044 6377805 5 Extended/dev/sdb5 251 375 1004031 83 Linux

Command (m for help): n #接下来继续创建一个逻辑分区Command action l logical (5 or over) p primary partition (1-4)lFirst cylinder (376-1044, default 376): #输入回车即可Using default value 376Last cylinder or +size or +sizeM or +sizeK (376-1044, default 1044): #这里仍输入回车,将剩余的所有磁盘空间给此逻辑分区。Using default value 1044

Command (m for help): p

Disk /dev/sdb: 8589 MB, 8589934592 bytes255 heads, 63 sectors/track, 1044 cylindersUnits = cylinders of 16065 * 512 = 8225280 bytes

Device Boot Start End Blocks Id System/dev/sdb1 1 125 1004031 83 Linux/dev/sdb2 126 250 1004062+ 83 Linux/dev/sdb3 251 1044 6377805 5 Extended/dev/sdb5 251 375 1004031 83 Linux/dev/sdb6 376 1044 5373711 83 Linux2.修改磁盘分区类型Linux下根据id值区分不同的磁盘分区类型,fdisk默认创建的主分区和逻辑分区类型为linux,对应的ID为83,扩展分区默认为Extended,对应的ID为5,如果我们想要修改分区类型或者创建一个非默认的分区类型,可以用fdisk的交互参数 t 来指定,紧接上面的实例,继续介绍如下:[root@localhost /]# fdisk /dev/sdbCommand (m for help): pDisk /dev/sdb: 8589 MB, 8589934592 bytes255 heads, 63 sectors/track, 1044 cylindersUnits = cylinders of 16065 * 512 = 8225280 bytes

Device Boot Start End Blocks Id System/dev/sdb1 1 125 1004031 83 Linux/dev/sdb2 126 250 1004062+ 83 Linux/dev/sdb3 251 1044 6377805 5 Extended/dev/sdb5 251 375 1004031 83 Linux/dev/sdb6 376 1044 5373711 83 Linux

Command (m for help): t #输入t改变磁盘分区的类型Partition number (1-6): 5 #要改变的磁盘分区对应的分区号,这里输入的5代表/dev/sdb5Hex code (type L to list codes): L #通过 l 可以查看分区类型对应的ID值0 Empty 1e Hidden W95 FAT1 80 Old Minix be Solaris boot 1 FAT12 24 NEC DOS 81 Minix / old Lin bf Solaris 2 XENIX root 39 Plan 9 82 Linux swap / So c1 DRDOS/sec (FAT-3 XENIX usr 3c PartitionMagic 83 Linux c4 DRDOS/sec (FAT-4 FAT16 32M 40 Venix 80286 84 OS/2 hidden C: c6 DRDOS/sec (FAT-5 Extended 41 PPC PReP Boot 85 Linux extended c7 Syrinx 6 FAT16 42 SFS 86 NTFS volume set da Non-FS data 7 HPFS/NTFS 4d QNX4.x 87 NTFS volume set db CP/M / CTOS / .8 AIX 4e QNX4.x 2nd part 88 Linux plaintext de Dell Utility 9 AIX bootable 4f QNX4.x 3rd part 8e Linux LVM df BootIt a OS/2 Boot Manag 50 OnTrack DM 93 Amoeba e1 DOS access b W95 FAT32 51 OnTrack DM6 Aux 94 Amoeba BBT e3 DOS R/O c W95 FAT32 (LBA) 52 CP/M 9f BSD/OS e4 SpeedStor e W95 FAT16 (LBA) 53 OnTrack DM6 Aux a0 IBM Thinkpad hi eb BeOS fs f W95 Ext’d (LBA) 54 OnTrackDM6 a5 FreeBSD ee EFI GPT 10 OPUS 55 EZ-Drive a6 OpenBSD ef EFI (FAT-12/16/11 Hidden FAT12 56 Golden Bow a7 NeXTSTEP f0 Linux/PA-RISC b12 Compaq diagnost 5c Priam Edisk a8 Darwin UFS f1 SpeedStor 14 Hidden FAT16 3 61 SpeedStor a9 NetBSD f4 SpeedStor 16 Hidden FAT16 63 GNU HURD or Sys ab Darwin boot f2 DOS secondary 17 Hidden HPFS/NTF 64 Novell Netware b7 BSDI fs fd Linux raid auto18 AST SmartSleep 65 Novell Netware b8 BSDI swap fe LANstep 1b Hidden W95 FAT3 70 DiskSecure Mult bb Boot Wizard hid ff BBT 1c Hidden W95 FAT3 75 PC/IX Hex code (type L to list codes): 7 #从上面的输出可知,7对应的分区类型为HPFS/NTFSChanged system type of partition 5 to 7 (HPFS/NTFS)

Command (m for help): p #可以看到,分区类型已经改变。

Disk /dev/sdb: 8589 MB, 8589934592 bytes255 heads, 63 sectors/track, 1044 cylindersUnits = cylinders of 16065 * 512 = 8225280 bytes

Device Boot Start End Blocks Id System/dev/sdb1 1 125 1004031 83 Linux/dev/sdb2 126 250 1004062+ 83 Linux/dev/sdb3 251 1044 6377805 5 Extended/dev/sdb5 251 375 1004031 7 HPFS/NTFS/dev/sdb6 376 1044 5373711 83 Linux3.分区的删除删除分区的fdisk参数是 d ,然后指定要删除的分区号,此分区就被删除了。[root@localhost /]# fdisk /dev/sdbCommand (m for help): p

Disk /dev/sdb: 8589 MB, 8589934592 bytes255 heads, 63 sectors/track, 1044 cylindersUnits = cylinders of 16065 * 512 = 8225280 bytes

Device Boot Start End Blocks Id System/dev/sdb1 1 125 1004031 83 Linux/dev/sdb2 126 250 1004062+ 83 Linux/dev/sdb3 251 1044 6377805 5 Extended/dev/sdb5 251 375 1004031 7 HPFS/NTFS/dev/sdb6 376 1044 5373711 83 Linux

Command (m for help): d #这里输入删除分区的指令Partition number (1-6): 6 #这里输入6表示要删除的分区是/dev/sdb6

Command (m for help): p #可以看到,/dev/sdb6已经被删除

Disk /dev/sdb: 8589 MB, 8589934592 bytes255 heads, 63 sectors/track, 1044 cylindersUnits = cylinders of 16065 * 512 = 8225280 bytes

Device Boot Start End Blocks Id System/dev/sdb1 1 125 1004031 83 Linux/dev/sdb2 126 250 1004062+ 83 Linux/dev/sdb3 251 1044 6377805 5 Extended/dev/sdb5 251 375 1004031 7 HPFS/NTFS4.保存分区设置在所有分区操作完成后,输入fdisk的交互指令 w 即可保存分区设置,如果不保存分区设置而退出的话,输入 q 指令,如下所示:[root@localhost /]# fdisk /dev/sdbCommand (m for help): w #保存分区设置退出The partition table has been altered!Calling ioctl() to re-read partition table.Syncing disks.到此为止,磁盘分区划分完毕。但是这些分区还是不能使用的,还需要将分区格式化为需要的文件系统类型,linux下默认支持ext2/ext3、vfat等文件系统,这里将分区格式化为ext3文件系统,然后通过mkfs.ext3命令格式化分区/dev/sdb1,操作如下:[root@localhost /]# mkfs.ext3 /dev/sdb1 关于mkfs.ext3命令我们会在下一章进行详细的讲述,这里不在多说。分区格式化完毕,最后一步是挂载(mount)此设备,操作如下:[root@localhost /]# mkdir /data[root@localhost /]# mount /dev/sdb1 /data[root@localhost /]# df|grep /data/dev/sdb1 988212 17652 920360 2% /data在上面操作中,我们首先建立了一个挂载目录/data,然后通过mount命令将设备挂载到了对应的目录下,挂载成功后,通过df命令就可以看到对应的分区。

第一个青春是上帝给的;第二个的青春是*自己努力的

浅谈Linux磁盘存储管理推荐

相关文章:

你感兴趣的文章:

标签云: