Linux下的/、/home、/boot、/swap等等并不是分区,而是所谓的“挂载点”。
所谓“挂载点”(mount point)实际上是目录树上的一个目录。
和Windows不同,Linux的目录树是单根的,根目录就是/。并不像Windows一样存在C:、D:、E:之类分区以及C盘根目录C:\之类概念,它就一个根,也就是/。
那么,当我们有多块磁盘、或者分了若干个分区,怎么用呢?
很简单,用mount命令挂载在某个“挂载点”即可。
比如,我有两块SSD,SSD快但容量小,所以打算拿来装系统以及加速大型软件/游戏;那么我们就可以把它挂载在/bin和/home/huge_app下面。这样往/bin和/home/huge_app存文件就会存到SSD上。
类似的,我们可以搞一块傲腾或者别的什么,把它格式化成Linux swap格式,然后挂载在/swap分区——于是内存不足使用磁盘虚拟时,性能就不会掉太多。
再比如,我们存了很多电影,/home不够用了。怎么办呢?
买一块8T的硬盘,挂载到/home就好了——你可以复制旧内容过去,还可以把SSD继续挂载在/home/huge_app。
有了这个基础知识,那么Linux该如何分区就一目了然了。
一般来说,你应该准备起码三个区。
第一个区是/boot分区,大约200~500M就够用了。它的作用是安装grub、存放Linux kernel以及initrd映像。这些都是启动时必需的东西,单独存在boot区便于管理。
第二个区是swap分区。这是因为Linux的swap分区格式为内存交换做过专门优化;你不设swap分区也行,或者指定主分区上的一个文件也行,但性能方面都比不过专门的swap分区。这个区建议使用最快的硬盘(但如果用SSD的话,最好选用MLC甚至SLC,不然内存不足时读写量太大,容易把SSD写废)。
这个分区的大小一般建议和你机器上安装的内存大小相当。当然你设置的更大/更小也可以。
第三个区就是/分区,这里安装了Linux系统以及你自己的用户文件,请把你硬盘上的剩余空间都留给它。
当然,如果你想搞的更细致的话,也可以分出10~50G安装Linux(以及其它应用),把它挂载到/;剩下的所有空间挂载到/home:这样可以把Linux系统文件和你的用户文件分开,将来换其它版本的Linux也不会影响你自己的数据。
类似的,如果你打算在上面架设网站的话,也可以分一个区挂载到/opt——另外买一个硬盘、甚至买十个硬盘组个RAID然后把它整个的挂载到/opt,都行。
事实上,如果你安装较新的Linux发行版的话,以上这些也可以不管,在硬盘上留下足够的未分区空间、安装程序就会自动在上面分区、安装——规划方式就是我前面说的,它会自动为你分三个区,分别对应于/、/boot和/swap。
当然,如果你准备了SSD和大容量机械硬盘、甚至搞了更多更酷的存储器,那么就需要主动指定这些存储器的使用方案了。
基本思路就前面提到的,一个可靠但容量小的分区或者磁盘挂载到/boot,一个速度较快的分区或者磁盘挂载到/,一个耐读写同时速度快的分区或者磁盘挂载到/swap……以此类推。
首先,这些不是分区,而是挂载点,其它知友已经说了。
在这里,我说说一开始Linux为什么需要分区。
因为 Linux 是一个多用户操作系统。
多用户意味着一个问题:并非所有用户的操作都是可控的。
而系统正常运行的话,必须要一定的剩余空间。
这也就意味着:如果一个用户自己把空间占满了,它不应当影响系统的正常运行。
这也就是 /home 分区当初一定要单独分区的道理。因为 /home 分区给普通用户使用,他如果把空间占满了,会导致系统不可用。
而 / 分区如果与 /home 分区独立,用户把 /home 写满,不影响 / 分区上的系统正常使用。
这也是 /root 用户的分区不在 /home 下的原因,要确保普通用户把空间占满的时候 ,root 用户还能正常的登录进系统,正常操作,因为 /root 是在 根分区下的。
/boot 分区为什么常常独立挂载呢?这是因为,/boot 分区在启动之后就不再修改,因此把它独立挂载为只读分区,更安全,(是教科书这么说的,虽然我个人认为这个所谓的安全性存疑,如果一个应用程序拥有改写 boot 分区的权限,它又怎么会不知道 remount boot 分区为可写呢?)
同样的道理,为什么某些应用或者服务,建议挂载到独立的分区,比如 /opt?
是因为这些应用或者服务会不断的生成数据。一旦他们生成的数据(比如日志)涨满了磁盘,可能导致系统无法使用,无法登录。而把他们放到独立的分区,就能确保根分区 / 始终可以使用。
另外一个比较特殊的是交换分区。交换分区的存在,一开始是为了解决如何更好的利用所有的内存这个问题。因为内存接近满的时候,整个系统可用性会非常低,这也就意味着,你安装的一部分内存,可能永远都没有机会用到。但交换分区的存在就意味着你真的能用满硬件配备的内存,同时把一小部分放进交换分区。个人建议是配备到256M~2G之间就行。假定你的系统需要预留2G内存空间保证正常运行,那你有16G内存实际上只能用到14G,但如果加了2G的交换文件,你实际上就可以用满16G内存依然还有2G内存空间。配备更大交换文件的意义感觉不大。
对于服务器来说,交换分区的意义相对较小,这是因为服务器如果爆内存基本意味着需要加内存或者有内存泄漏了,都是需要解决的严重问题,让得不到内存的程序死掉才是最好的方案。
而且服务器不怕死,就怕慢。服务器如果死掉,立马就能被检测到,然后热备份,冷备份,负载均衡的服务器都可以顶上。但服务器如果慢,卡顿,是没法很快得到反应的。没有交换分区能够使服务器程序在缺少内存的时候尽快崩溃,从而尽快触发备份服务器上线以及负载均衡服务器上线。若是加交换分区,则使得缺少内存的服务器不能及时崩溃,变得卡顿,这种卡顿会拖累所有服务的响应速度,降低整个服务的可靠性,而且问题查起来要困难得多:你维护一个服务器群的时候,某个服务器挂掉是很好查的,但某个服务器卡顿则相对难定位得多。
也就是说,这些分区,其实都是从服务器运维的角度,有必要存在。
然而,如果你把 Linux 当作一台单用户的 PC ,作为桌面而非服务器使用,上面这些分区其实很多情况下都是没有必要的。就算真的把根分区塞满了,在能够物理接触到主机的情况下,很多问题也有办法解决,而不像服务器,一旦出了必须进机房才能解决的问题,就比较不方便,所以通常,运维会力求将问题控制在远程能解决的范畴内。
总结:Linux各个分区的作用,是为了在极端情况下方便服务器运维处理异常。如果你的 Linux 不是一台服务器,而是一台桌面开发PC,那么这些分区大部分情况下并无必要。
上古时代,一个磁盘的容量不够大,装不下整个系统,所以分了 / 和 /usr 两个不同的文件系统,分在不同的磁盘上。这时候,/ 文件系统要支持系统启动直到运行 mount /usr ,/usr 文件系统放剩下的部分。
/tmp 是用作存储临时文件的空间。划分成单独的文件系统的话,可以避免意外写入大量临时文件的时候把 / 文件系统写满。
/ 文件系统写满的话,后果很严重。
/var 是用作存储系统日志的空间。划分成单独的文件系统的话,可以避免意外写入大量日志的时候把 / 文件系统写满。
/boot 是用作存储 kernel 和 initrd image 的空间。假若 / 文件系统采用了 OS loader 不认得的格式,或者放在了 OS loader 读不出来的地方;那就得把 /boot 划分成单独的文件系统,采用 OS loader 认得的格式,并且放在 OS loader 读得出来的地方。
/usr/local 是用作存储系统管理员自行编译安装的软件。划分成单独的文件系统的话,在需要重新安装操作系统的时候,可以保留 /usr/local 下面安装配置好的软件。
/opt 是用作存储系统上通过包管理工具安装的第三方软件。划分成单独的文件系统的话,在操作系统跨越大版本做升级的时候,可以方便管理和维护。
/srv 是用作存储对外提供服务的数据。划分成单独的文件系统的话,可以避免意外爆出来大量数据的时候把 / 文件系统写满。也方便运行数据备份。
/home 是用作存储普通用户的主目录。划分成单独的文件系统的话,可以避免普通用户意外写入大量数据的时候把 / 文件系统写满。也方便配置使用 user quota 和 group quota。需要重新安装操作系统的时候,也方便保留 /home 下面的数据。
/tmp、/var、/srv、/home,这些是在系统运行时会被频繁读写的目录。把这些目录划分成单独文件系统的话,可以避免当系统意外断电导致文件系统烂掉的时候,波及 / 文件系统。
/ 文件系统烂掉的话,后果很严重。
