首页 > 代码库 > linux下的磁盘和文件系统管理

linux下的磁盘和文件系统管理

一.硬盘分区知识

 1.分区类型

 硬盘分区一共有3种:主分区、扩展分区和逻辑分区。扩展分区只不过是逻辑分区的“容器”,实际上只有主分区和逻辑分区进行数据存储。在一块硬盘上最多只能有4个主分区,可以另外建立一个扩展分区来代替4个主分区的其中一个,然后在扩展分区下可以建立更多的逻辑分区。

2.分区和格式化

       不同的操作系统具有不同的硬盘分区工具,Windows系统下非常有名的分区工具是FDISK,在LINUX系统下进行分区可以使用fdisk,或者使用相同功能的图形界面程序。

     在一块硬盘上最多只能有4个分区,

      通过分区当然不能产生任何文件系统。在分区之后只是对硬盘上的磁盘空间进行了保留,还不能直接使用。在此之后分区必须要进行格式化。在Windows系统下可以通过资源管理器下的文件菜单或者format程序来执行,在Linux系统下大多使用mkfs命令来完成。Linux支持不同的文件系统,应用最广泛的是ext3。

注意:进行任何磁盘分区或大小改动工作,都会丢失以前的数据,因此在分区之前一定要对数据进行备份。

二.使用fdisk进行硬盘分区

     Linux系统使用fdisk命令能将磁盘划分成为若干个区,同时也能为每个分区指定分区的文件系统,比如ext2,ext3,FAT32,SWAP,FAT16以及其他类UNIX操作系统的文件系统等。

1.fdisk的介绍

使用fdisk命令可以对磁盘进行分区。

[root@redhat2 ~]# fdisk

Usage:

 fdisk [options] <disk>    change partition table

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

 fdisk -s <partition>      give partition size(s) in blocks

Options:

 -b <size>                 sector size (512, 1024, 2048 or 4096)

 -c                        switch off DOS-compatible mode

 -h                        print help

 -u <size>                 give sizes in sectors instead of cylinders

 -v                        print version

 -C <number>               specify the number of cylinders

 -H <number>               specify the number of heads

 -S <number>               specify the number of sectors per track

[root@redhat2 ~]#

 2.Linux系统下硬盘分区举例

  下面以实例的方式讲述Linux系统下创建、删除、查看分区以及转换分区的文件系统。

(1).进入fdisk界面,列出所有命令。

[root@redhat2 ~]# 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): 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):

(2)显示硬盘分区信息

Command (m for help): p

Disk /dev/sda: 32.2 GB, 32212254720 bytes

255 heads, 63 sectors/track, 3916 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: 0x0003827d

   Device Boot      Start         End      Blocks   Id  System

/dev/sda1   *           1          39      307200   83  Linux

Partition 1 does not end on cylinder boundary.

/dev/sda2              39         439     3211264   82  Linux swap / Solaris

Partition 2 does not end on cylinder boundary.

/dev/sda3             439        3917    27937792   83  Linux

Command (m for help):

(3).在非交互式界面下显示当前硬盘的分区信息。

[root@redhat2 ~]# fdisk -l /dev/sda

Disk /dev/sda: 32.2 GB, 32212254720 bytes

255 heads, 63 sectors/track, 3916 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: 0x0003827d

   Device Boot      Start         End      Blocks   Id  System

/dev/sda1   *           1          39      307200   83  Linux

Partition 1 does not end on cylinder boundary.

/dev/sda2              39         439     3211264   82  Linux swap / Solaris

Partition 2 does not end on cylinder boundary.

/dev/sda3             439        3917    27937792   83  Linux

[root@redhat2 ~]#

三.创建文件系统

   LINUX系统支持目前主流的文件系统,如VFAT,ext2,ext3,ReiserFS,ISO 9660和SWAP交换分区等。如果在计算机上新增加了一块硬盘,需要格式化成Linux的文件系统,

最好选择reiserfs或ext3文件系统。

  如果需要使用某个文件系统存放数据,一般要经过以下操作步骤。

(1)使用fdisk命令在硬盘上创建分区。

(2)使用mkfs命令在分区上创建文件系统。

(3)使用mount命令挂载文件系统,或是修改/etc/fstab文件使得开机自动挂载文件系统。

(4)使用umount卸载文件系统。

1.查看系统上的磁盘

[root@redhat2 ~]# ls -l /dev/sd*

brw-rw---- 1 root disk 8,  0 Jan 17 06:14 /dev/sda

brw-rw---- 1 root disk 8,  1 Jan 17 06:14 /dev/sda1

brw-rw---- 1 root disk 8,  2 Jan 17 06:14 /dev/sda2

brw-rw---- 1 root disk 8,  3 Jan 17 06:14 /dev/sda3

brw-rw---- 1 root disk 8, 16 Jan 17 06:14 /dev/sdb

[root@redhat2 ~]#

2.使用mkfs命令创建文件系统

  使用mkfs命令可以在分区上建立各种文件系统。

[root@redhat2 ~]# mkfs

Usage: mkfs [-V] [-t fstype] [fs-options] device [size]

[root@redhat2 ~]#

例1:使用mkfs命令创建文件系统。

(1) 查看当前磁盘上的分区情况,该分别是sda和sdb。

[root@redhat2 ~]# fdisk -l /dev/sda

Disk /dev/sda: 32.2 GB, 32212254720 bytes

255 heads, 63 sectors/track, 3916 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: 0x0003827d

   Device Boot      Start         End      Blocks   Id  System

/dev/sda1   *           1          39      307200   83  Linux

Partition 1 does not end on cylinder boundary.

/dev/sda2              39         439     3211264   82  Linux swap / Solaris

Partition 2 does not end on cylinder boundary.

/dev/sda3             439        3917    27937792   83  Linux

[root@redhat2 ~]#

------------------------------------------------------------

[root@redhat2 ~]# fdisk -l /dev/sdb

[root@redhat2 ~]#

//可以看出sdb盘没有任何分区

(2). 格式化/dev/sdb分区,创建ext3文件系统

[root@redhat2 ~]# mkfs -t ext3 /dev/sdb

mke2fs 1.41.12 (17-May-2010)

/dev/sdb is entire device, not just one partition!

Proceed anyway? (y,n) y

Filesystem label=

OS type: Linux

Block size=4096 (log=2)

Fragment size=4096 (log=2)

Stride=0 blocks, Stripe width=0 blocks

327680 inodes, 1310720 blocks

65536 blocks (5.00%) reserved for the super user

First data block=0

Maximum filesystem blocks=1342177280

40 block groups

32768 blocks per group, 32768 fragments per group

8192 inodes per group

Superblock backups stored on blocks:

        32768, 98304, 163840, 229376, 294912, 819200, 884736

 

Writing inode tables: done                           

Creating journal (32768 blocks): done

Writing superblocks and filesystem accounting information: done

 

This filesystem will be automatically checked every 23 mounts or

180 days, whichever comes first.  Use tune2fs -c or -i to override.

四.挂载和卸载文件系统

1.挂载文件系统

   使用mount命令可以将某个分区、光盘、软盘或是U盘挂载到Linux系统的目录下。

2.挂载硬盘

例:挂载分区/dev/sda3到/mnt/kk目录中。

root@redhat2 ~]# mount /dev/sda3 /mnt/kk

[root@redhat2 ~]# cd /mnt/kk

[root@redhat2 kk]# ls

bin   dev  home  lib64       lvm    mnt  ora_tbs  root  selinux  sys  usr  yum

boot  etc  lib   lost+found  media  opt  proc     sbin  srv      tmp  var

[root@redhat2 kk]#

//使用df命令查看挂载的/dev/sda3分区的信息。

[root@redhat2 kk]# df

Filesystem           1K-blocks      Used Available Use% Mounted on

/dev/sda3             27499388   5909764  20192736  23% /

tmpfs                   796140        88    796052   1% /dev/shm

/dev/sda1               297485     33069    249056  12% /boot

/dev/sda3             27499388   5909764  20192736  23% /mnt/kk

例2:以只读方式挂载/dev/sdb分区到/mnt/kk目录中。

[root@redhat2 ~]# mount -o ro /dev/sdb /mnt/kk

[root@redhat2 ~]# mkdir /mnt/kk/yang

mkdir: cannot create directory `/mnt/kk/yang‘: Read-only file system

3.卸载文件系统

[root@redhat2 ~]# umount /dev/sdb

[root@redhat2 ~]#

[root@redhat2 ~]# df

Filesystem           1K-blocks      Used Available Use% Mounted on

/dev/sda3             27499388   5909732  20192768  23% /

tmpfs                   796140        88    796052   1% /dev/shm

/dev/sda1               297485     33069    249056  12% /boot

[root@redhat2 ~]#

//由上面可以看出/dev/sdb已经卸载

4.查看分区挂载情况

  要查看Linux系统分区挂载情况,除了使用df命令之外,还可以通过mount -s 命令以及/查看etc/mtab文件获取信息。

(1).使用mount -s 命令

例:使用mount命令查看分区挂载情况。

[root@redhat2 ~]# mount -s

/dev/sda3 on / type ext4 (rw)

proc on /proc type proc (rw)

sysfs on /sys type sysfs (rw)

devpts on /dev/pts type devpts (rw,gid=5,mode=620)

tmpfs on /dev/shm type tmpfs (rw)

/dev/sda1 on /boot type ext4 (rw)

none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)

vmware-vmblock on /var/run/vmblock-fuse type fuse.vmware-vmblock (rw,nosuid,nodev,default_permissions,allow_other)

(2).查看/etc/mtab文件

例:通过/etc/mtab文件查看分区挂载情况。

[root@redhat2 ~]# cat /etc/mtab

/dev/sda3 / ext4 rw 0 0

proc /proc proc rw 0 0

sysfs /sys sysfs rw 0 0

devpts /dev/pts devpts rw,gid=5,mode=620 0 0

tmpfs /dev/shm tmpfs rw 0 0

/dev/sda1 /boot ext4 rw 0 0

none /proc/sys/fs/binfmt_misc binfmt_misc rw 0 0

vmware-vmblock /var/run/vmblock-fuse fuse.vmware-vmblock rw,nosuid,nodev,default_permissions,allow_other 0 0

[root@redhat2 ~]#

五.设置开机自动挂载文件系统

      将某个分区或是设备挂载了以后才能使用,但是当计算机重新启动以后,又需要重新挂载,这个时候可以通过修改/etc/fstab文件实现开机自动挂载文件系统。

1./etc/fstab文件简介

  /etc/fstab文件是一个配置文件,它包含了所有分区以及存储设备的信息。其中包含了磁盘分区和存储设备如何挂载,以及挂载什么地方的信息。

如果在Linux系统中不能访问Windows的分区,或者作为一名普通用户,不能挂载光驱和向软盘中写入数据,或者在管理CD-RW的过程中遇到了问题,就有可能是错误地配置了/etc/fstab文件,通常可以通过编辑/etc/fstab这个文件来解决前面提到的问题。

/etc/fstab文件是一个简单的文本文件,可以用任何文本编辑器去编辑它,但是必须要以root用户登录才可以编辑该文件。

2./etc/fstab文件详解

 由于每台计算机系统的分区和设备属性不同,所以/etc/fstab文件也不痒,但是基本的结构总是相似的。下面就是/etc/fstab文件北荣的一个示例。

[root@redhat2 ~]# cat /etc/fstab

# /etc/fstab

# Created by anaconda on Mon Jun  2 13:54:22 2014

#

# Accessible filesystems, by reference, are maintained under ‘/dev/disk‘

# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info

UUID=e49f5ee2-2691-4d26-8359-f1f1624a01df /                       ext4    defaults        1 1

UUID=a717290f-db0b-403e-9649-2a26e4ab8e76 /boot                   ext4    defaults        1 2

UUID=ebe91f80-8f5b-4813-a622-f158a9a0874b 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

[root@redhat2 ~]#

每1行包含着1个设备或分区的信息,每1行又有多个列的信息。第一列是设备名,第2列是它的挂载点,第3列是它的文件系统格式,第4是挂载参数,第5列是转存选项,第6列是文件系统检查选项。

 下面详细讲解/etc/fstab文件的具体构成。

(1).设备和默认挂载目录

  第1列和第2列的内容是设备和默认挂载点。Linux系统为每个设备或分区都设定了挂载目录,一般选择在/mnt目录下创建挂载点。当Linux系统启动时,这些分区和设备同样会被自动地挂载。

(2).文件系统格式

   第3列指定了设备和分区的文件系统格式。

(3).挂载选项

  第4列列出了对于每一个设备或者分区的所有挂载选项。

?auto和noauto

  通过使用auto选项,设备会在系统启动时自动挂载,auto是默认选项,如果不希望某些设备自动被挂载,在/etc/fstab的对应地方把auto选项改为noauto即可。通过使用noauto选项,可以在需要的时候才挂载设备。

?user和nouser

   user选项允许一般用户挂载设备,然而noauto选项仅允许让root用户挂载设备。noauto是默认选项,主要是在于防止新用户的越权行为。如果一般用户不能挂载自己的cdrom,floppy及Windows分区等,可以在/etc/fstab里边加入user选项。

?exec和noexec

  exec选项允许执行被设为exec分区上的二进制文件,然而noexec选项却不允许这样做,exec是默认的选项。

?ro

    ro选项是以可读可写方式挂载文件系统。

?rw

   rw选项是以可读可写方式挂载文件系统。

?sync和async

   这两个选项指出了文件系统的I/O将以何种方式进行,sync表示I/O将会同步进行。例如,复制一个文件到软盘时,那些改变将会在执行命令的同时物理性地写入到软盘中。

 当使用async选项时,I/O将会被异步执行,这时当复制一个文件到软盘中时,用户所做的改变会在命令执行后的较长时间后才被物理性地写入软盘中。

?defaults

使用此选项与使用rw,suid,dev,exec,auto,nouser,async选项时一样的功能。

六.使用交换空间

 1.添加交换空间

 有时,用户需要在安装Linux系统后添加更多的交换空间。用户可以添加一个交换分区或添加一个交换文件,推荐使用添加一个交换分区。交换空间可以是一个专用的交换分区,也可以是一个交换文件,或是两者的结合。交换空间总的大小至少为计算机内存的1~2倍左右,但是它最好不要超过2GB容量。

2.添加交换分区

例1:添加交换分区

?创建交换分区。

 使用fdisk命令已经创建好分区/dev/sdb,假设将分区/dev/sdb创建为交换(SWAP)分区,在SHELL提示下以root用户身份输入以下命令。

[root@redhat2 ~]# mkswap /dev/sdb

mkswap: /dev/sdb: warning: don‘t erase bootbits sectors

        on whole disk. Use -f to force.

Setting up swapspace version 1, size = 5242876 KiB

no label, UUID=e71d426d-3e73-4db1-834b-7ebbe477bf20

//将/dev/sdb分区创建为交换分区

[root@redhat2 ~]# free

             total       used       free     shared    buffers     cached

Mem:       1592280     338744    1253536          0      25484     142940

-/+ buffers/cache:     170320    1421960

Swap:      3211256          0    3211256

[root@redhat2 ~]#

//因为当前还没有启动交换分区,所以使用free命令无法看到。

?启用交换分区。

 输入以下命令启用交换分区/dev/sdb。

[root@redhat2 ~]# swapon /dev/ssdb

[root@redhat2 ~]# free

             total       used       free     shared    buffers     cached

Mem:       1592280     342712    1249568          0      25568     142956

-/+ buffers/cache:     174188    1418092

Swap:      8454128          0    8454128

[root@redhat2 ~]#

//因为当前已经启动了交换分区/dev/sdb所以总的交换分区容量已经增加了

?确认已经启用交换分区。

    创建并启用了交换分区之后,使用如下命令查看交换分区是否已启用。

[root@redhat2 ~]# cat /proc/swaps

Filename                                Type            Size    Used    Priority

/dev/sda2                               partition       3211256 0       -1

/dev/sdb                                partition       5242872 0       -2

[root@redhat2 ~]#

//可以看到当前计算机的SWAP分区由/dev/sda2和/dev/sdb这两个分区构成

?如果要在系统引导时启用交换分区,编辑/etc/fstab文件添加如下内容。然后在系统下次引导时,就会启用新建的交换分区。

/dev/sdb                                                           swap                     swap           defaults        0              0

 3.添加交换文件

?创建文件/swapfile

     将大小乘以1024来判定块的大小。例如,大小为68MB的交换文件的块大小为65536。

     在shell提示下以root用户身份输入以下命令,其中的count等于想要输入的块大小。

[root@redhat2 ~]# dd if=/dev/zero of=/swapfile bs=1024 count=66536

66536+0 records in

66536+0 records out

68132864 bytes (68 MB) copied, 0.816242 s, 83.5 MB/s

[root@redhat2 ~]# ls /

bin   etc   lib64       media  ora_tbs  sbin     swapfile  usr

boot  home  lost+found  mnt    proc     selinux  sys       var

dev   lib   lvm         opt    root     srv      tmp       yum

[root@redhat2 ~]#

//在“/”目录下可以看到文件swapfile

?创建交换文件。

   使用以下命令创建交换文件。

[root@redhat2 ~]# mkswap /swapfile

mkswap: /swapfile: warning: don‘t erase bootbits sectors

        on whole disk. Use -f to force.

Setting up swapspace version 1, size = 66532 KiB

no label, UUID=d9ba8642-e1df-4e68-a2fe-b3a2a656cd0c

[root@redhat2 ~]#

?启用交换文件。

  使用如下命令启用交换文件。

 [root@redhat2 ~]# swapon /swapfile

?新添加了交换分区并启用它之后,使用如下命令确保交换文件已被启用了。

[root@redhat2 ~]# free

             total       used       free     shared    buffers     cached

Mem:       1592280     612556     979724          0      55060     342040

-/+ buffers/cache:     215456    1376824

Swap:      8520656          0    8520656

[root@redhat2 ~]#

[root@redhat2 ~]# cat /proc/swaps

Filename                                Type            Size    Used    Priority

/dev/sda2                               partition       3211256 0       -1

/dev/sdb                                partition       5242872 0       -2

/swapfile                               file            66528   0       -3

[root@redhat2 ~]#

?如果要在系统引导时启用交换文件,编辑/etc/fstab文件添加如下内容。然后在系统下次引导时,就会启用新建的交换文件。

          /swapfile                             swap                      swap  defaults               0             0

4.删除交换空间

 当某个交换分区或交换文件不再需要时,可以使用如下步骤将其删除。

?删除交换分区

例:在shell提示下以root用户身份输入以下命令禁用交换分区(这里的/dev/sdb是交换分区)。

[root@redhat2 ~]# swapoff /dev/sdb

[root@redhat2 ~]# free

             total       used       free     shared    buffers     cached

Mem:       1592280     608828     983452          0      55232     342056

-/+ buffers/cache:     211540    1380740

Swap:      3277784          0    3277784

[root@redhat2 ~]#

如果要在系统引导时不启用交换分区,编辑/etc/fstab文件删除如下内容。然后在系统下次引导时,就不会启用交换分区。

/dev/sdb                              swap                             swap                  defaults                     0       0

?删除交换文件

1).在shell提示下以root用户身份执行以下命令来禁用交换文件(这里的/swapfile是交换文件)。

[root@redhat2 ~]# swapoff /swapfile

[root@redhat2 ~]# free

             total       used       free     shared    buffers     cached

Mem:       1592280     626392     965888          0      55312     342060

-/+ buffers/cache:     229020    1363260

Swap:      3211256          0    3211256

[root@redhat2 ~]#

2).删除/swapfile文件。

输入以下命令来删除/swapfile文件。

[root@redhat2 ~]# rm -rf /swapfile

3).如果要在系统引导时不启用交换文件,编辑/etc/fstab文件删除如下内容。然后在系统下次引导时,就不会启用交换文件。

/swapfile                     swap                                 swap                             defualts                     0                   0

linux下的磁盘和文件系统管理