上周在作日志机扩容的时候,发现运维同窗将一块硬盘的挂载点没有同之前的日志机保持一致,考虑到这会给往后的维护带来麻烦,因而尝试着手修改,在修改的同时,review 了下以前日志机的挂载配置,发现竟然存在随时掉坑的可能。。。至于什么坑,我会在文末说明。 php
so,感受这事儿虽然简单,也许一条命令就搞定的事情,可是,不少童鞋可能不明就里,纯复制粘贴网上的命令,这很容易给人挖坑埋雷,今天就来聊聊 linux 下磁盘分区、挂载的问题,篇幅所限,不会聊的太底层,纯当科普吧~ node
硬盘分区表中最多能存储四个分区,但咱们实际使用时通常只分为两个分区,一个是主分区(Primary Partion)一个是扩展分区(extended partition),主分区能够立刻被使用但不能再分区,扩展分区必须再进行分区后才能使用,也就是说它必须还要进行二次分区。那么由扩展分区再分下去的是什么呢?它就是逻辑分区(Logical Partion),逻辑分区没有数量上限制。 linux
对习惯于使用Dos或Windows的同窗来讲,有几个分区就有几个驱动器,而且每一个分区都会得到一个字母标识符,而后就能够选用这个字母来指定在这个分区上的文件和目录,它们的文件结构都是独立的,很是好理解。然而对Red Hat Linux新手来讲,可就有点恼人了。由于对Linux用户来讲不管有几个分区,都得分给目录使用,它归根结底就只有一个根目录,一个独立且惟一的文件结构。Red Hat Linux中每一个分区都是用来组成整个文件系统的一部分,由于它采用了一种叫“挂载点”的处理方法,它的整个文件系统中包含了一整套的文件和目录,且将一个分区和一个目录联系起来。这时要载入的一个分区就在linux的存储空间的某个目录下得到。
下面咱们先来看看Red Hat Linux的驱动器是如何标识的。 对于IDE硬盘,驱动器标识符为“hdx1”,其中“hd”代表分区所在设备的类型,这里是指IDE硬盘了。“x”为盘号(a为基本盘,b为基本从属盘,c为辅助主盘,d为辅助从属盘),“1”表明分区,前四个分区用数字1到4表示,它们是主分区或扩展分区,从5开始就是逻辑分区。例,hda3表示为第一个IDE硬盘上的第三个主分区或扩展分区,hdb2表示为第二个IDE硬盘上的第二个主分区或扩展分区。对于SCSI硬盘则标识为“sdx1”,SCSI硬盘是用“sd”来表示分区所在设备的类型的,其他则和IDE硬盘的表示方法同样,再也不赘述。
咱们从上面能够看到,Red Hat Linux的分区是不一样于其它操做系统分区的,它的分区格式经常使用的有Ext3和Swap两种,Ext3用于存放系统文件,Swap则做为Red Hat Linux的交换分区(至关于windows中的虚拟内存文件)。那么如今咱们就能够知道Red Hat Linux至少须要两个专门的分区(Linux Native(本地)和Linux Swap(交换))。因为不能将Red Hat Linux安装在Dos/Windows分区。通常来讲咱们将Red Hat Linux安装一个或多个类型为“Linux Native”的硬盘分区,可是在Red Hat Linux的每个分区都必需要指定一个“Mount Point”(挂载点),告诉Red Hat Linux在启动时,这个目录要给哪一个分区使用。对“Swap”分区来讲, 通常也定义一个,且它没必要要定义载入点。
下面咱们先对“Linux Native”和“Linux Swap”有个初步的了解。
nginx
分多个区有如下几个目的:
shell
每块硬盘都分为若干个分区,每一个分区都有本身的文件系统。Windows为这些文件系统各自指定了一个字母。不过 GNU/Linux 使用惟一的树形结构来管理文件,而每一个文件系统都挂载于树形结构的某个位置。
正如 Windows 须要有 C: 驱动器同样,GNU/Linux 必须可以将根文件系统挂载于文件树的根(/)上。当根挂载完成以后,您就能够将其它文件系统挂载于树形结构各类挂载点上。根结构下的任何目录均可以做为挂载点,而您也能够将同一文件系统同时挂载于不一样的挂载点上。
挂载点实际上就是linux中的磁盘文件系统的入口目录
数据库
目录 内容 windows
/ 根目录,存放系统命令和用户数据等(若是下面挂载点没有单独的分区,它们都将在根目录的分区中)
/boot boot loader 的静态连接文件,存放与Linux启动相关的程序
/home 用户目录,存放普通用户的数据
/tmp 临时文件
/usr 是Red Hat Linux系统存放软件的地方,若有可能应将最大空间分给它
/usr/local 自已安装程序安装在此
/var 不断变化的数据,服务器的一些服务、日志放在下面。
/opt (Option可选的)附加的应用程序软件包
/bin 基本命令执行文件
/dev 设备文件
/etc 主机特定的系统配置
/lib 基本共享库以及内核模块
/media 用于移动介质的挂载点
/mnt 用于临时挂载文件系统或者别的硬件设备(如光驱、软驱)
/proc 系统信息的虚拟目录(2.4 和 2.6 内核),这些信息是在内存中,由系统本身产生的。
/root root 用户的目录
/sbin 基本系统命令执行文件
/sys 系统信息的虚拟目录(2.6 内核)
/srv 系统提供的用于 service 的数据
/usr/X1186 X-Windows目录,存放一些X-Windows的配置文件
/usr/include 系统头文件,存储一些C语言的头文件
/usr/src Linux内核源代码,Linux系统所安装的内核源代码都保存在此
/usr/bin 对/bin目录的一些补充
/usr/sbin 对/sbin目录的一些补充
/lost+found 这个目录在大多数状况下都是空的。可是若是你正在工做忽然停电,或是没有用正常方式关机,在你从新启动机器的时候,有些文件就会找不到应该存放的地方,对于这些文件,系统将他们放在这个目录下。
/boot: 必须老是物理地包含 /etc、/bin、/sbin、/lib 和 /dev,不然您将不能启动系统。
/home:每一个用户将放置他的私有数据到这个目录的子目录下。
/tmp: 程序建立的临时数据大都存到这个目录。
/usr:包含全部的用户程序(/usr/bin),库文件(/usr/lib),文档(/usr/share/doc),等等。
/var:全部的可变数据,如新闻组文章、电子邮件、网站、数据库、软件包系统的缓存等等,将被放入这个目录。这个目录的大小取决于您计算机的用途,可是对大多数人来讲,将主要用于软件包系统的管理工具。若是作服务器的话空间应尽可能大。个人服务器的实际分法及实际使用的大小,尚未实际投入使用。因此/var目录没有用那么多。通常WEB存放网页的目录是/var/www,postfix邮件的存放邮件的目录是:/var/mail,var/log,是系统日志记录分区, /var/spool:存放一些邮件、新闻、打印队列等。
/opt:存放可选的安装的软件。 缓存
上面介绍了几个挂载点,通常来讲咱们最少须要两个分区(固然只要一个 / 分区也能够),须要一个SWAP分区,和一个“/”分区,但把一些经常使用、重要的挂载点分到其它分区,这样便于管理。通常一个/分区,一个/usr分区,一个/home 分区,一个/var/log分区。固然这没有什么规定,彻底是依照须要来定的。咱们可使用Red Hat Linux提供的硬盘管理工具Disk Druid来完成分区和挂载点设置。 服务器
对照上图和目录简介,能够把Linux系统的挂载点想象成一棵大树
/ 为大树的树根
/ 衍生的其余挂载点为这颗大树的树枝
挂载点下的文件为树叶
运维
若是你看过我以前写的 Linux 系列文章,那么应该记得我曾经标红过一句话:linux 下一切皆文件!换言之就是linux操做系统将系统中的一切都做为文件来管理。在windows中咱们常见的硬件设备(打印机、网卡、声卡...)、磁盘分区等,在linux中通通都被视做文件,对设备、分区的访问就是读写对应的文件。
举个栗子,原来分区状况以下:
[root@sg-sl-data]# df -h Filesystem Size Used Avail Use% Mounted on /dev/sda2 20G 5.6G 13G 31% / /dev/sda6 996M 35M 910M 4% /data /dev/sda5 426G 199M 404G 1% /disk1 /dev/sda1 996M 46M 899M 5% /boot tmpfs 7.9G 0 7.9G 0% /dev/shm
上面步骤中的方法只是临时工干的活儿,开机后磁盘分区会不可见或者仍是挂载以前的模样,要想永久生效,还须要修改/etc/fstab,将
LABEL=/data /data ext3 defaults 1 2
LABEL=/disk1 /disk1 ext3 defaults 1 2
修改成:
/dev/sda5 /data ext3 defaults 1 2
/dev/sda6 /disk1 ext3 defaults 1 2
说明:fstab 是文件系统分配表的配置文件,该文件有着严格的语法格式限制,相似 crontab 同样,保存时也会对你的输入格式进行校验,请慎重使用,不然会有意想不到的问题发生。其一共有 6 个字段,空格分隔,具体每一个字段的含义请参考这里,再也不赘述:http://diamonder.blog.51cto.com/159220/282542
友情提示:分区操做是高危操做,尤为是新手同窗请勿在生产环境随意尝试,不然后果自负!
更为详细的分区教程请参见:
linux磁盘分区fdisk命令详解 http://linux008.blog.51cto.com/2837805/548711
fdisk /dev/sdb 输入m---n---p---1--回车---回车---p---w mkfs.ext3 /dev/sdb1 mkdir /disk2 mount /dev/sdb1 /disk2/ 在/etc/fstab中添加: /dev/sdb1 /disk2 ext3 defaults 1 2
fstab 文件你们都很熟悉,Linux 在启动的时候经过 fstab 中的信息挂载各个分区,一个典型的分区条目就像这样:
/dev/sdb4 /mnt/usb vfat utf8,umask=0 0 0
/dev/sda4 为须要挂载的分区,sda4 是 Linux 检测硬盘时按顺序给分区的命名,通常来说,这个名称并不会变化,可是若是你有多块硬盘,硬盘在电脑中的顺序变化的时候,相同的名称可能表明着不一样的硬盘分区,若是你是从 USB 设备启动,与其余 USB 设备的插入顺序也会致使分区识别的困难。
所以上面 3.2 小节中的配置直接写 /dev/sda6 是有很大的隐患的,重启后硬盘的顺序可能发生变化,好比 你把 nginx 的用户日志放在一个单独的分区上,那么重启后虽然设置了 fstab,可是因为顺序变了相同的分区号可能表明不一样的硬盘分区了,这样就会致使某些分区上的数据服务不可用了。
(PS:文章开头说过在 review 之前同窗的挂载配置的时候发现了埋下的一个雷,正是上面的问题。)
这个时候 UUID 就派上用场了,UUID 全称是 Universally Unique Identifier,也就是说,每一个分区有一个惟一的 UUID 值,这样就不会发生分区识别混乱的问题了。
在 fstab 中用 UUID 挂载分区,看起来向这样:
UUID=1234-5678 /mnt/usb vfat utf8,umask=0 0 0
在 UUID= 后面填入分区相应的 UUID 值,就能够正确挂载分区了。
那么,咱们如何知道一个分区的 UUID 呢?
有 3 种方法:
好比我最后把 /dev/sdb 挂载在了 /data1 目录下(不放心的话重启或者生成文件测试下,看挂载分区的空间被占用没):
文件系统 类型 容量 已用 可用 已用% 挂载点 /dev/sda3 ext4 518G 2.7G 489G 1% / tmpfs tmpfs 16G 0 16G 0% /dev/shm /dev/sda1 ext4 1008M 61M 896M 7% /boot /dev/sdb ext4 1.8T 1.1G 1.7T 1% /data1 grep -v '#' /etc/fstab |column -t UUID=0c685e8b-dbb3-4a1c-a106-3f1716ab34dd / ext4 defaults,noatime 1 1 UUID=2d7f1bcf-06d1-486e-87df-404ba670fcd9 /boot ext4 defaults,noatime 1 2 UUID=248e7a99-b459-4800-bbd3-354047e49a2f swap swap defaults,noatime 0 0 tmpfs /dev/shm tmpfs defaults,nosuid,noexec,nodev 0 0 devpts /dev/pts devpts gid=5,mode=620 0 0 sysfs /sys sysfs defaults 0 0 proc /proc proc defaults 0 0 UUID=870ebaf6-727f-48d3-b60c-f203339d94ac /data1 ext4 defaults,noatime 0 0
[1] Linux入门笔记之一:系统分区及挂载点 http://newthink.blog.51cto.com/872263/223795/
[2] 挂载点 http://wiki.linuxdeepin.com/index.php?title=%E6%8C%82%E8%BD%BD%E7%82%B9
[3] 什么叫“挂载”,“挂载点”?linux文件系统中的概念 http://bbs.csdn.net/topics/380197703
[4] Linux文件系统简介 http://alicsd.iteye.com/blog/816268
[5] 第八章、Linux 磁盘与文件系统管理 http://vbird.dic.ksu.edu.tw/linux_basic/0230filesystem.php
[6] /etc/fstab 详解 http://diamonder.blog.51cto.com/159220/282542 http://dikar.iteye.com/blog/361659
[7] 如何在CentOS下使用fdisk添加新硬盘 http://343308530.blog.51cto.com/7202597/1251558
[8] 多硬盘分区管理fdisk http://blog.fens.me/linux-fdisk/