Linux学习笔记之——Linux硬盘分区知识

搭建Linux环境之前,有必要对Linux的硬盘分区知识有所了解。本文总结Linux的硬盘分区知识。 

一、关于硬盘种类、物理几何结构及硬盘容量、分区大小计算 
      首先了解一下硬盘本身的一些信息。 
1、硬盘种类、物理几何结构 
      硬盘的种类主要是SCSI 、IDE及目前流行的SATA等;所有一种硬盘的生产都要一定的标准;随着相应的标准的升级,硬盘生产技术也在升级;比如SCSI标准已经历了SCSI- 1 、SCSI-2、SCSI-3;其中目前咱们经常在服务器网站看到的Ultral-160就是基于SCSI-3标准的;IDE 
遵循的是ATA标准,而目前流行的SATA,是ATA标准的升级版本;IDE是并口设备,而SATA是串口,SATA的发展目的是替换IDE; 
      硬盘的物理几何结构是由盘、磁盘表面、柱面、扇区组成,一个张硬盘内部是由几张碟片叠加在一起,这样形成一个柱体面;每个碟片都有上下表面;磁头和磁盘表 面接触从而能读取数据; 
2、硬盘容量及分区大小的算法 
     在Linux下执行fdisk -l命令,将出现类似下面的信息: 
Disk /dev/hda: 80.0 GB, 80026361856 bytes 
255 heads, 63 sectors/track, 9729 cylinders 
Units = cylinders of 16065 * 512 = 8225280 bytes 
   Device Boot      Start         End      Blocks   Id  System 
/dev/hda1   *           1         765     6144831    7  HPFS/NTFS 
/dev/hda2             766        2805    16386300    c  W95 FAT32 (LBA) 
/dev/hda3            2806        9729    55617030    5  Extended 
/dev/hda5            2806        3825     8193118+  83  Linux 
/dev/hda6            3826        5100    10241406   83  Linux 
/dev/hda7            5101        5198      787153+  82  Linux swap / Solaris 
/dev/hda8            5199        6657    11719386   83  Linux 
/dev/hda9            6658        7751     8787523+  83  Linux 
/dev/hda10           7752        9729    15888253+  83  Linux 

其中 heads 是磁盘面;sectors 是扇区;cylinders 是柱面;每个扇区大小是 512byte,也就是0.5K; 

通过上面的例子,我们发现此硬盘有 255个磁盘面,有63个扇区,有9729个柱面;所以整个硬盘体积换算公式应该是: 

磁面个数 x 扇区个数 x 每个扇区的大小512 x  柱面个数 = 硬盘体积 (单位bytes) 

所以在本例中磁盘的大小应该计算如下: 
255 x 63  x  512 x 9729 =  80023749120 bytes  
提示:由于硬盘生产商和操作系统换算不太相同,硬盘厂家以10进位的办法来换算,而操作系统是以2进位制来换算,所以在换算成M或G 时,不同的算法结果却不相同;所以我们的硬盘有时标出的是80G,在操作系统下看却少几M; 
上面例子中,硬盘厂家算法 和 操作系统算数比较: 
硬盘厂家: 80023749120 bytes = 80023749.120 K = 80023.749120 M  (向大单位换算,每次除以1000) 
操作系统: 80023749120 bytes = 78148192.5 K = 76316.594238281 M  (向大单位换算,每次除以1024) 
我们在查看分区大小的时候,能用生产厂家提供的算法来简单推算分区的大小;把小数点向前移动六位就是以G表示的大小;比如 hda1 的大小约为 6.144831G ; 

二、关于硬盘分区划分标准及合理分区结构 
1、硬盘分区划分标准 
      硬盘的分区由主分区、扩展分区和逻辑分区组成;所以我们在对硬盘分区时要遵循这个标准;主分区(包括扩展分区)的最大个数是四个且扩展分区不能包围在主分 区之间,主分区(包含扩展分区)的个数由硬盘的主引导记录MBR(Master Boot Recorder)决定的,MBR存放启动管理程式(GRUB,LILO,NTLOARDER等)和分区表记录。其中扩展分区也算一个主 分区;扩展分区下能包含更多的逻辑分区;所以主分区(包括扩展分区)范围是从1-4,逻辑分区是从5开始的;比如下面的例子: 
   Device Boot      Start         End      Blocks   Id  System 
/dev/hda1   *           1         765     6144831    7  HPFS/NTFS 
/dev/hda2             766        2805    16386300    c  W95 FAT32 (LBA) 
/dev/hda3            2806        9729    55617030    5  Extended 
/dev/hda5            2806        3825     8193118+  83  Linux 
/dev/hda6            3826        5100    10241406   83  Linux 
/dev/hda7            5101        5198      787153+  82  Linux swap / Solaris 
/dev/hda8            5199        6657    11719386   83  Linux 
/dev/hda9            6658        7751     8787523+  83  Linux 
/dev/hda10           7752        9729    15888253+  83  Linux 
通过这个例子,我们能看到主分区有3个,从 hda1-hda3 ,扩展分区由 hda5-hda10 ;此硬盘没有主分区4,所以也没有显示主分区hda4 ;但逻辑分区不可能从4开始,因为那是主分区的位置,明白了吧;而且可以看出hda3是扩展分区,逻辑分区就是从该分区划分出来的。 

另外,可以将L i n u x 安装在一个或多个类型为"Linux Native"的硬盘分区,通常称为"L i n u x原始分区或主分区"。同时还需要一个类型为"Linux Swap "的分区,也叫做"L i n u x 交换分区",关于Swap,一会详细说明。 

PS:Windows与Linux硬盘分区对比: 

Linux学习笔记之——Linux硬盘分区知识 

2、硬盘设备(包括移动存储设备)在Linux或其他类Unix系统的表示; 

IDE 硬盘在Linux或其他类Unix系统的一般表示为 hd* ,比如hda、hdb ... ... ,我们能通过 fdisk-l 来查看;有时你可能只有一个硬盘,在操作系统中看到的却是 hdb ,这和硬盘的跳线有关;另外hdc大多表示是光驱设备;如果你有两块硬盘,大多是 hda和hdb。在这方面说的太多也无用,还是以fdisk -l 为准为好;SCSI 和SATA 硬盘在Linux通常也是表示为 sd* ,比如 sda 、sdb ... ...   以fdisk -l 为准;移动存储设备在linux表示为 sd* ,比如 sda 、sdb ... ...  以fdisk -l 为准 

3、合理的规划分区 

在对硬盘进行分区前,应该先弄清楚计算机担负的工作及硬盘的容量有多大,还要考虑到以下几个问题。 
第一点也是最重要的一点,要知道当前安装Linux的开机管理程序(boot loader)是使用LILO(Linux Loader)的版本,因为LILO2.21及早期版本对硬盘大小有限制,如果安装LILO到1023磁道以外即 8G的空间以外,LILO就无法启动。但一些BIOS较老的机器,LINUX仍然无法突破1024磁道的限制,因此这些BIOS无法认出大于1024的硬盘空间。 

还需要考虑的问题有: 

◆ 是否限制用户可使用的磁盘空间大小? 

◆ 在系统中需要安装哪些软件? 

◆ 交换分区需要多大? 

◆ 系统是否有多个硬盘? 

下面,我们按系统工作性质的不同对分区的划分提出了一些建议。当然,根据实际情况,在满足系统工作需求的前提下,下面的分区大小也可以灵活的变 动。 

基本工作站的分区方案 
假设系统的硬盘大小是10G。 

   1. /boot 20M   
   2. Swap 128M   
   3. /root 9.85G  

建立一个20M的/boot分区是为了避免将系统内核文件放到1024磁道以外,如果将/boot做为root分区的一个子目录,内核文件就会安 装在root分区的任何地方,因为硬盘的大小超过了8G,所以在启动时就有可能出现问题。建议将交换分区的大小设置为内存的两倍,在这里我们假设系统的内 存为64M。最后我们将硬盘的剩余空间全部分给了root分区。 

Red Hat Linux 6.2 及其早期版本上的基本服务器硬盘分区方案 
这里的服务器我们假设只提供几种通用的服务,如WWW服务及FTP服务等几种服务,通过telnet登录的用户数很少。假设其硬盘大小为25G。 

   1. /boot 20M   
   2. Swap 128M   
   3. / 10G   
   4. /home 13G   
   5. /var 2G  

在硬盘的最前面创建20M大小的/boot分区,原因同上。交换分区的大小也是128M,因为内存的大小为64M。 

/ ,即root分区设为10G这么大是因为其中有一个/usr目录,这个目录可能会占用很多硬盘空间,特别是在安装了X Server,运行图形界面的应用程序的时候。 

/home分区是硬盘中最大的分区,这似乎与我们假设系统用户数不多有些矛盾。实际上在/home目录下确实没有几个用户目录,但在Red Hat6.2及更早的版本中,Apache服务器和wu-ftpd FTP服务器被放在了/home/httpd及/home/ftp目录中。所以这个分区这么大也是有原因的。 

最后,/var目录独自占用了一个分区,因为系统的所有日志都写到了/var/log目录下,这将会占用很大的硬盘空间。如果系统日志记录得非常 详细,整个目录很快会被写满,导致系统工作呆滞。当然,可以通过系统日志后台守护程序syslogd来修改日志配置,避免发生这种情况。 

Red Hat 7及以上版本的基本服务器分区方案 
这种情况同前一个方案的情况相同,不同的是LINUX版本为Red Hat 7.0及其以上版本。 

   1. /boot 20M   
   2. Swap 128M   
   3. / 10G   
   4. /var 15G  

与RedHat6不同,在RedHat7中HTTP服务和FTP服务的目录现在位于 /var/www/ 和/var/ftp/,因此/var分区有15G之大也就不难理解了。 

多用户服务器分区方案 
在这种服务器系统中,同时有多个用户通过telnet, ssh, rlogin或其方式在远程访问系统。系统中有三个35G的硬盘驱动器,总共有105G的磁盘空间 。系统中用到了RAID 5技术做数据冗余。这种情况下,管理员必须为每个用户分配磁盘空间。对RedHat 6.2及更早的版本,分区如下: 

   1. Disk 1:   
   2. /boot 20M   
   3. / 4G   
   4. /var 3GB   
   5. /home 27.98G   
   6. Disk 2:   
   7. swap 20MB   
   8. / 4GB   
   9. /var 3GB   
  10. /home 27.98GB   
  11. Disk 3:   
  12. swap 20MB   
  13. / 4GB   
  14. /var 3GB   
  15. /home 27.98GB  

这样分区的原因:首先,Disk1上的20M /boot分区不属于任何RAID阵列,否则如果你将/boot放至RAID阵列中,以后就不能系统内核升级了。 

为了方便管理,在其它两个硬盘中建立了20M的交换分区。这种服务器一般配有1G以上的内存,因此交换分区的大小不成问题。如果增大交换分区,就 会减少RAID分区空间,所以20M是足够的。RAID分区的分组如下: 

◆ 1-A, 2-A, and 3-A 一起组成一个8G的 RAID 5 驱动器,做为/根目录打开。 

◆ 1-B, 2-B, and 3-B 组成 6GB的 RAID 5 驱动器,做为 /var目录。 

◆ 1-C, 2-C, and 3-C 组成 55.96GB RAID 5 驱动器, 做为 /home.目录。 

这种分配方案总共有55.96G的空间分配给所有用户及Apache和FTP服务,在/var下用6G空间用做记录日志、邮件,这么大的空间是足 够的。 

如果安装Red Hat7或以上版本,应给/var分区更大的空间,因为它同时还存放着WEB和FTP服务的两个目录。 希望你能学会这些Linux硬盘分区的最佳方案。 

三、交换分区与交换文件 

当程序需要的内存比电脑上拥有的物理内存还要大的时候,不管是 Windows 也好,Linux 也好,解决办法就是把存不下的东西转移到硬盘上的“虚拟内存”中去,尽管硬盘的速度比内存慢上很多,但是至少容量要大上很多。 

另外,操作系统也可以把一些很久不活动的程序转移到虚拟内存中去,留出更多的主内存给需要的程序和磁盘缓冲。 

Linux 在安装的时候,一般需要划出一个分区作为 Linux 的“交换分区”,作为虚拟内存内容的保存分区。 

swapon -s 这个命令,可以查看当前系统的虚拟内存的情况,这条命令需要 root 来运行。 

Filename Type Size Used Priority 

/dev/sda3 partition 1004052 0 -1 

可以看到常常看到当前的交换分区为 /dev/sda3,第 2 栏的 Type 中显示为 partition,说明这是个交换分区,那么,还有其他的 Type 吗? 

当然,其实 Linux 也可以像 Windows 一样,用交换文件来保存虚拟内存的内容,这样即使你忘记划出交换分区也不要紧,而且灵活性上会更大一些。下面我们看看如何创建交换文件。 

交换文件和交换分区一样,大小是固定的,比如你想要一个 1G 的交换文件,那么首先要创建一个 1G 的空白文件,我们用 dd 这个工具来完成这个任务: 

dd if=/dev/zero of=/swapfile bs=1024 count=1048576 

1048576 就是 1G 用 KB 表示的大小,如果你想要其他大小的文件,更改这个数字即可。 

上面的命令,会在根目录下创建 swapfile 这个文件,然后,我们需要将它格式化为交换文件的格式: 

mkswap /swapfile 

然后把挂载上去,就可以立刻应用这个交换文件了: 

swapon /swapfile 

你可以运行 swapon -s 查看一下: 

Filename Type Size Used Priority 

/dev/sda3 partition 1004052 0 -1 

/swapfile file 1048486 0 -2 

多出来了一项,Type 为 file,确实是我们创建的交换文件,系统已经在使用了。 

如果你想开机的时候自动挂载这个交换文件,那么还要在 /etc/fstab 中加上下面这一句: 

/swapfile none swap sw 0 0 

这样就 OK 了。 

经常有人问,虚拟内存要设多大才合适,是主内存的几点几倍性能最好云云,其实作为一般用途来讲,1~2G 就到顶了,妄想从虚拟内存上提高系统性能,是不可能的,去买内存条才是王道。 

PS: 
交换分区的创建与使用 

一.创建交换分区 

系统内存无法存放更多数据的时候linux会自动使用交换分区,如果分区的时候没有创建交换分区,可以格式化一个分区为交换分区,然后在创建交换 分区。 

mkswap /dev/hda1 将/dev/hda1格式化为交换分区 

mkswap -c /dev/hda1 将/dev/hda1格式化为交换分区,并检查交换分区有无坏块 

在文件中创建交换分区: 

dd if=/dev/zero of=/tmp/swapfile count=65536 创建一个32M的swapfile文件 
chmod 666 /tmp/swapfile 指定/tmp/swapfile文件的权限 
mkswap /tmp/swapfile 将/tmp/swapfile格式化成交换分区 

二.使用交换分区 

swapon /dev/hda1 开启/dev/hda1分区的交换功能 

swapon -v /dev/hda1 开启/dev/hda1分区的交换功能,并输出详细信息 

swapon -v /tmp/swapfile  开启/tmp/swapfile文件的交换功能,并输出详细信息 

swapon -s 查看开启的全部交换分区或交换文件 

swapon -v -p 1 /dev/hda1 将/dev/hda1设置成最高优先级,-p选项指定优先级 

swapoff -v /tmp/swapfile 关闭交换区 

参考网址: 
1、http://www.sudu.cn/info/html/edu/20080425/301647.html 
2、http://os.51cto.com/art/200912/171215.htm 
3、http://linux.ccidnet.com/art/9513/20080108/1334995_1.html 

4、http://huanxiangwu.com/277/linux%E4%BA%A4%E6%8D%A2%E5%88%86%E5%8C%BA%E7%9A%84%E5%88%9B%E5%BB%BA%E5%92%8C%E4%BD%BF%E7%94%A8


     本文转自polaris1119 51CTO博客,原文链接:http://blog.51cto.com/polaris/349653,如需转载请自行联系原作者






上一篇:实现自己的系统调用(两种方式) 【转】


下一篇:一张图说明Linux启动过程