linux磁盘管理详解

磁盘管理

Linux 系统一切以文件的方式存储于硬盘,应用程序数据需要时刻读写硬盘,所以企业
生产环境中对硬盘的操作变得尤为重要,对硬盘的维护和管理也是每个运维工程师必备工作
之一。本节介绍硬盘简介、硬盘数据存储方式、如何在企业生产服务器添加硬盘、对硬
盘进行分区、初始化以及对硬盘进行故障修复等

1、计算机硬盘简介

硬盘是计算机主要存储媒介之一,由一个或者多个铝制或者玻璃制的碟片组成,碟片外覆盖有铁磁性材料,硬盘内部由磁道、柱面、扇区、磁头等部件组成,如图:
linux磁盘管理详解_第1张图片
    Linux 系统中硬件设备相关配置文件存放在/dev/下,常见硬盘命名:/dev/hda、/dev/sda、
/dev/sdb、/dev/sdc、/dev/vda。不同硬盘接口,在系统中识别的设备名称不一样。IDE 硬盘接口在 Linux 中设备名为/dev/hda,SAS、SCSI、SATA 硬盘接口在 Linux 中设备名为 sda,高效云盘硬盘接口会识别为/dev/vda 等。
    文件储存在硬盘上,硬盘的最小存储单位叫做 Sector(扇区),每个 Sector 储存 512 字节。操作系统在读取硬盘的时候,不会逐个 Sector 的去读取,这样效率非常低,为了提升读取效率,操作系统会一次性连续读取多个 Sector,即一次性读取多个 Sector 称为一个 Block(块)。由多个 Sector 组成的 Block 是文件存取的最小单位。Block 的大小常见的有 1KB、2KB、4KB,Block 在 Linux 中常设置为 4KB,即连续八个 Sector 组成一个 Block。
    /boot 分区 Block 一般为 1KB,而/data/分区或者/分区的 Block 为 4K。可以通过如下三种方法查看 Linux 分区的 Block 大小:
1、dumpe2fs /dev/sda1 |grep “Block size”
2、tune2fs -l /dev/sda1 |grep “Block size”
3、stat /boot/|grep “IO Block”
例如创建一个普通文件,文件大小为 10Bytes,而默认设置 Block 为 4K,如果有 1 万个小文件,由于每个 Block 只能存放一个文件,如果文件的大小比 Block 大,会申请更多的Block,相反如果文件的大小比默认 Block 小,仍会占用一个 Block,这样剩余的空间会被浪费掉。
    1 万个文件理论只占用空间大小:10000x10=100000Bytes=97.65625MBytes;1 万个文件真实占用空间大小:10000x4096Bytes=40960000Bytes=40000MBytes=40GB。根据企业实际需求,此时可以将 Block 设置为 1K,从而节省更多的空间。

2、硬盘 Block 及 Inode 详解

    通常而言,操作系统对于文件数据的存放包括两个部分:文件内容、权限及文件属性。操作系统文件存放是基于文件系统,文件系统会将文件的实际内容存储到 Block 中,而将权限与属性等信息存放至 Inode 中。
通常而言,操作系统对于文件数据的存放包括两个部分:文件内容、权限及文件属性。操作系统文件存放是基于文件系统,文件系统会将文件的实际内容存储到 Block 中,而将权限与属性等信息存放至 Inode 中。
Superblock:记录文件系统的整体信息,包括 inode 与 block 的总量、使用大小、剩余大小,以及文件系统的格式与相关信息等;
Inode:记录文件的属性,权限,同时会记录该文件的数据所在的 block 编号;
Block:存储文件的内容,如果文件超过默认 Block 大小,会自动占用多个 Block。
因为每个 inode 与 block 都有编号,而每个文件都会占用一个inode ,inode 内则有文件数据放置的 block 号码。如果能够找到文件的 inode,就可以找到该文件所放置数据的block 号码,从而读取该文件内容。
操作系统进行格式化分区时,操作系统自动将硬盘分成两个区域。一个是数据 Block 区,用于存放文件数据;另一个是 Inode Table 区,用于存放 inode 包含的元信息。每个
格式化磁盘时,可以指定默认 Inode 和 Block 的大小,-b 指定默认 Block 值,-I 指定默认 Inode 值,如图 7-2 所示,命令如下:
mkfs.ext4 -b 4096 -I 256 /dev/sdb
linux磁盘管理详解_第2张图片

3、硬链接介绍

一般情况下,文件名和 inode 编号是一一对应的关系,每个 inode 号码对应一个文件名。但 UNIX/Linux 系统多个文件名也可以指向同一个 inode 号码。这意味着可以用不同的文件名访问同样的内容,对文件内容进行修改,会影响到所有文件名。但删除一个文件名,不影响另一个文件名的访问。这种情况就被称为硬链接(hard link)。
创建硬链接的命令为:ln jf1.txt jf2.txt,其中 jf1.txt 为源文件,jf2.txt 为目标文件。如上命令源文件与目标文件的 inode 号码相同,都指向同一个 inode。inode 信息中有一项叫做"链接数",记录指向该 inode 的文件名总数,这时会增加 1,变成 2,如图所示:
linux磁盘管理详解_第3张图片
同样删除一个 jf2.txt 文件,就会使得 jf1.txt inode 节点中的"链接数"减 1。如果该 inode值减到 0,表明没有文件名指向这个 inode,系统就会回收这个 inode 号码,以及其所对应block 区域,如图所示:
linux磁盘管理详解_第4张图片
实用小技巧:硬链接不能跨分区链接,硬链接只能对文件生效,对目录无效,也即是目录不能创建硬链接。硬链接源文件与目标文件共用一个 inode 值,从某种意义上来,节省 inode空间。不管是单独删除源文件还是删除目标文件,文件内容始终存在。同时链接后的文件不占用系统多余的空间。

4、软链接介绍

除了硬链接以外,还有一种链接-软链接。文件 jf1.txt 和文件 jf2.txt 的 inode 号码虽然不一样,但是文件 jf2.txt 的内容是文件 jf1.txt 的路径。读取文件 jf2.txt 时,系统会自动将访问者导向文件 jf1.txt。无论打开哪一个文件,最终读取的都是文件 jf1.txt。这时,文件 jf2.txt 就称为文件 jf1.txt的"软链接"(soft link)或者"符号链接(symbolic link)。文件 jf2.txt 依赖于文件 jf1.txt 而存在,如果删除了文件 jf1.txt,打开文件 jf2.txt 就会报错:“No such file or directory”。软链接与硬链接最大的不同是文件 jf2.txt 指向文件 jf1.txt 的文件名,而不是文件 jf1.txt的 inode 号码,因此文件 jf1.txt 的 inode 链接数不会发生变化,如图所示:
linux磁盘管理详解_第5张图片
实用小技巧:软链接可以跨分区链接,软链接支持目录同时也支持文件的链接。软链接源文件与目标文件 Inode 不相同,从某种意义上来,会消耗 inode 空间。不管是删除源文件还是重启系统,该软链接还存在,但是文件内容会丢失,一旦新建源同名文件名,软链接文件恢复正常。

5、Linux 下磁盘实战操作命令

企业真实场景由于硬盘常年大量读写,经常会出现坏盘,需要更换硬盘。或者由于磁盘空间不足,需添加新硬盘,新添加的硬盘需要经过格式化、分区才能被 Linux 系统所使用,虚拟机 CentOS6,centos 7 Linux 模拟 DELL R730 真实服务器添加一块新硬盘,不需要关机,直接插入用硬盘即可,一般硬盘均支持热插拔功能。企业中添加新硬盘的操作流程如下:
(1)检测 Linux 系统识别的硬盘设备,新添加硬盘被识别为/dev/sdb,如果有多块硬盘,会依次识别成/dev/sdc、/dev/sdd 等设备名称,如图所示: fdisk -l
linux磁盘管理详解_第6张图片
(2)基于新硬盘/dev/sdb 设备,创建磁盘分区/dev/sdb1,如图所示
fdisk /dev/sdb
linux磁盘管理详解_第7张图片
(3)fdisk 分区命令参数如下,常用参数包括 m、n、p、e、d、w。
b 编辑 bsd disklabel; c 切换 dos 兼容性标志;
d 删除一个分区; g 创建一个新的空 GPT 分区表;
G 创建一个 IRIX(SGI)分区表;l 列出已知的分区类型; m 打印帮助菜单;
n 添加一个新分区; o 创建一个新空 DOS 分区表; p 打印分区表信息;
q 退出而不保存更改;s 创建一个新的空的 Sun 磁盘标签;t 更改分区的系统 ID;
u 更改显示/输入单位;v 验证分区表; w 将分区表写入磁盘并退出;x 额外功能
(4) 创建/dev/sdb1 分区方法,fdisk /dev/sdb,然后按 n-p-1-Enter 键- +20G-Enter 键-w,最后执行 fdisk –l|tail -10,如图 (a)、图 (b)所示
linux磁盘管理详解_第8张图片
linux磁盘管理详解_第9张图片
(5)mkfs.ext4 /dev/sdb1 格式化磁盘分区,如图所示:
linux磁盘管理详解_第10张图片
(6)/dev/sdb1 分区格式化,使用 mount 命令挂载到/data/目录,如图所示:
mkdir -p /data/ 创建/data/数据目录
mount /dev/sdb1 /data 挂载/dev/sdb1 分区至/data/目录
df -h 查看磁盘分区详情
echo “mount /dev/sdb1 /data” >> /etc/rc.local 将挂载分区命令加入/etc/rc.local 开机启动

(7)自动挂载分区除了可以加入到/etc/rc.local 开机启动之外,还可以加入到/etc/fstab 文件中,如图所示:
/dev/sdb1 /data/ ext4 defaults 0 0
mount -o rw,remount / 重新挂载/系统,检测/etc/fstab 是否有误。
linux磁盘管理详解_第11张图片
linux磁盘管理详解_第12张图片

6、基于 GPT 格式磁盘分区

MBR 分区标准决定了 MBR 只支持在 2TB 以下的硬盘,为了支持能使用大于 2T 硬盘空间,需使用 GPT 格式进行分区。创建大于 2TB 的分区,需使用 parted 工具。在企业真实环境中,通常一台服务器有多块硬盘,整个硬盘容量为 10T,需要基于 GTP格式对 10T 硬盘进行分区,操作步骤如下:
parted -s /dev/sdb mklabel gpt 设置分区类型为 gpt 格式;
mkfs.ext3 /dev/sdb 基于 Ext3 文件系统类型格式化;
mount /dev/sdb /data/ 挂载/dev/sdb 设备至/data/目录
(1)如图所示,假设/dev/sdb 为 10T 硬盘,使用 GPT 格式来格式化磁盘:
linux磁盘管理详解_第13张图片
(2)执行命令:parted -s /dev/sdb mklabel gpt,如图所示:
linux磁盘管理详解_第14张图片
(3) 基于 mkfs.ext3 /dev/sdb 格式化磁盘,如图所示:
linux磁盘管理详解_第15张图片
parted 命令行也可以进行分区,如图以下三张图所示:
Parted—>select /dev/sdb—>mklabel gpt—>mkpart primary 0 -1—>print
mkfs.ext3 /dev/sdb1
mount /dev/sdb1 /data/
linux磁盘管理详解_第16张图片
linux磁盘管理详解_第17张图片
linux磁盘管理详解_第18张图片

7、MOUNT 命令工具

Mount 命令工具主要用于将设备或者分区挂载至 Linux 系统目录下,Linux 系统在分区时,也是基于 mount 机制将/dev/sda 分区挂载至系统目录,将设备与目录挂载之后,Linux操作系统方可进行文件的存储

8、Mount 命令参数详解

如下为企业中 Mount 命令常用参数详解:
mount [-Vh]
mount -a [-fFnrsvw] [-t vfstype]
mount [-fnrsvw] [-o options [,…]] device | dir
mount [-fnrsvw] [-t vfstype] [-o options] device dir
-V: 显示 mount 工具版本号; -l: 显示已加载的文件系统列表;
-h: 显示帮助信息并退出; -v: 输出指令执行的详细信息;
-n: 加载没有写入文件/etc/mtab 中的文件系统; -r: 将文件系统加载为只读模式;
-a: 加载文件/etc/fstab 中配置的所有文件系统;-o: 指定 mount 挂载扩展参数,常见扩展指令:rw、
remount、loop 等,其中-o 相关指令如下:
-o atime: 系统会在每次读取文档时更新文档时间;
-o noatime: 系统会在每次读取文档时不更新文档时间;
-o defaults: 使用预设的选项 rw,suid,dev,exec,auto,nouser 等;
-o exec 允许执行档被执行;
-o user、-o nouser: 使用者可以执行 mount/umount 的动作;
-o remount: 将已挂载的系统分区重新以其他再次模式挂载;
-o ro: 只读模式挂载;
-o rw: 可读可写模式挂载;
-o loop 使用 loop 模式,把文件当成设备挂载至系统目录。
-t: 指定 mount 挂载设备类型,常见类型 nfs、ntfs-3g、vfat、
iso9660 等,其中-t 相关指令如下:
iso9660 光盘或光盘镜像;
msdos Fat16 文件系统;
vfat Fat32 文件系统;
企业常用 Mount 案例
mount /dev/sdb1 /data 挂载/dev/sdb1 分区至/data/目录
mount /dev/cdrom /mnt 挂载 Cdrom 光盘至/mnt 目录;
mount -t ntfs-3g /dev/sdc /data1 挂载/dev/sdc 移动硬盘至/data1 目录;
mount -o remount,rw / 重新以读写模式挂载/系统;
mount -t iso9660 -o loop centos7.iso /mnt 将 centos7.iso 镜像文件挂载至/mnt 目录;
mount -t fat32 /dev/sdd1 /mnt 将 U 盘/dev/sdd1 挂载至/mnt/目录;
mount -t nfs 192.168.1.11:/data/ /mnt 将远程 192.168.1.11:/data目录挂载至本地/mnt目录。

9、Linux 硬盘故障修复

企业服务器运维中,经常会发现操作系统的分区变成只读文件系统,错误提示信息为“Read-only file system”,出现只读文件系统,会导致只能读取,而无法写入新文件、新数据等操作。造成该问题的原因包括:磁盘老旧长期大量的读写、文件系统文件被破坏、磁盘碎片文件、异常断电、读写中断等等。
以企业 CentOS 6, centos 7 Linux 为案例,来修复文件系统,步骤如下:
(1) 远程备份本地其他重要数据,出现只读文件系统,需先备份其他重要数据,基于rsync|scp 远程备份,其中/data 为源目录,/data/backup/2019/为目标备份目录。
rsync -av /data/ [email protected]:/data/backup/2019/
(2) 可以重新挂载/系统,挂载命令如下,测试文件系统是否可以写入文件。
mount -o remount,rw /
(3) 如果重新挂载/系统无法解决问题,则需重启服务器,以 CD/DVD 光盘引导进入Linux Rescue 修复模式,如下两张图所示,光标选择“Troubleshooting”, 按 Enter 键,然后选择“Rescue a CentOS system”,按 Enter 键

linux磁盘管理详解_第19张图片
linux磁盘管理详解_第20张图片
(4) 选择“1)Continue”继续操作,如图所示:

linux磁盘管理详解_第21张图片
(5) 登录修复模式,执行如下命令,df –h 显示原来的文件系统,如下图所示:
chroot /mnt/sysimage
df -h
linux磁盘管理详解_第22张图片

(6) 对有异常的分区进行检测并修复,根据文件系统类型,执行相应的命令如下:
umount /dev/sda3
fsck.ext4 /dev/sda3 –y
(7) 修复完成之后,重启系统即可
reboot

七、Linux文件服务器企业实战
运维和管理企业 Linux服务器,除了要熟练掌握 Linux系统本身的维护和管理之外,最
重要的是熟练甚至精通 Linux系统安装配置各种应用软件,对软件进行调优以及针对软件
在使用中遇到的各类问题,能够快速定位并解决。
本章向读者介绍进程、线程、企业 Vsftpd服务器实战、匿名用户访问、系统用户访问及
虚拟用户实战等内容。
7.1、进程与线程的概念及区别
Linux系统各种软件和服务存在于系统,必然会占用系统各种资源,系统资源是如何分配及调度的,本节将给读者展示系统进程、资源及调度相关的内容。
进程( process)是计算机中的软件程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。
在早期面向进程设计的计算机结构中,进程是程序的基本执行实体,在当代面向线程设计的计算机结构中,进程是线程的容器。软件程序是对指令、数据及其组织形式的描述,面进程是程序的实体,通常而言,把运行在系统中的软件程序称之为进程。
除了进程,读者通常会听到线程的概念,线程也被称为轻量级进程( lightweight process, LWP),是程序执行流的最小单元,一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成。
线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有操作系统资源,但是该线程可与同属进程的其他线程共享该进程所拥有的全部资源。
程序、进程、线程三者区别如下。
程序:程序并不能单独执行,是静止的,只有将程序加载到内存中,系统为其分配资源后才能够执行。
进程:程序对一个数据集的动态执行过程,一个进程包含一个或者更多的线程,一个线程同时只能被一个进程所拥有,进程是分配资源的基本单位。进程拥有独立的内存单元,而多个线程共享内存,从而提高了应用程序的运行效率
线程:线程是进程内的基本调度单位,线程的划分尺度小于进程,并发性更高,线程本身不拥有系统资源,但是该线程可与同属进程的其他线程共享该进程所拥有的全部资源。每一个独立的线程,都有一个程序运行的入口、顺序执行序列和程序的出口
多进程:每个进程互相独立,不影响主程序的稳定性,某个子进程崩溃对其他进程没有影响,通过增加CPU可以扩充软件的性能,可以减少线程加锁/解锁的影响,极大提高性能。缺点是多进程逻辑控制复杂,需要和主程序交互,需要跨进程边界,进程之间上下文切换比线程之间上下文切换代价大。
多线程:无须跨进程,程序逻辑和控制方式简单,所有线程共享该进程的内存和变量等。缺点是每个线程与主程序共用地址空间,线程之间的同步和加锁控制比较麻烦,一个线程的崩溃会影响到整个进程或者程序的稳定性。

你可能感兴趣的:(linux磁盘管理详解)