1. Linux的磁盘与文件系统
磁盘简介:磁盘存储器(magnetic disk storage),以磁盘为存储介质的存储器。它是利用磁记录技术在涂有磁记录介质的旋转圆盘上进行数据存储的辅助存储器;具有存储容量大、数据传输率高、存储数据可长期保存等特点。
磁盘物理组成:盘片(Platters)、轴(Spindle)、读写头(Read/Write Head)、读写头激励器(Actuator)、控制器(Controller)和电路板(a printed circuit board)。
“巨磁电阻”效应:非常弱小的磁性变化就能导致巨大电阻变化。
磁盘类型:
- IDE:(Integrated Drive Electronics)集成驱动器电子的缩写,俗称并口;本意是指把控制器与盘体集成在一起的硬盘驱动器,是一种硬盘的传输接口,另一个名称叫做ATA(Advanced Technology Attachment);具有性能价格比高、适用面广等特点。
- SATA:(Serial ATA)俗称串口;采用点对点的方式实现了数据的分组传输从而带来更高的传输效率。
- SCSI:(Small Computer System Interface)具有应用范围广、多任务、带宽大、CPU占用率低,以及热插拔等优点,但较高的价格使得它很难如IDE硬盘般普及,因此SCSI硬盘主要应用于中、高端服务器和高档工作站中。
- SAS:(Serial Attached SCSI)即串行连接SCSI,是新一代的SCSI技术。和现在流行的SATA硬盘相同,都是采用串行技术以获得更高的传输速度,并通过缩短连结线改善内部空间等。SAS是并行SCSI接口之后开发出的全新接口。此接口的设计是为了改善存储系统的效能、可用性和扩充性,并且提供与SATA硬盘的兼容性。
- FC:(Fiber Channel)光纤通道硬盘是为提高多硬盘存储系统的速度和灵活性才开发的,它的出现大大提高了多硬盘系统的通信速度。光纤通道的主要特性有:热插拔性、高速带宽、远程连接、连接设备数量大等。光纤通道是为在像服务器这样的多硬盘系统环境而设计,能满足高端工作站、服务器、海量存储子网络、外设间通过集线器、交换机和点对点连接进行双向、串行数据通讯等系统对高数据传输率的要求。
- SSD:(Solid State Disk或Solid State Drive)称作电子硬盘或者固态电子盘,是由控制单元和固态存储单元(DRAM或FLASH芯片)组成的硬盘。固态硬盘的接口规范和定义、功能及使用方法上与普通硬盘的相同,在产品外形和尺寸上也与普通硬盘一致。由于固态硬盘没有普通硬盘的旋转介质,因而抗震性极佳。其芯片的工作温度范围很宽(-40~85℃)。目前广泛应用于军事、车载、工控、视频监控、网络监控、网络终端、电力、医疗、航空等、导航设备等领域。目前由于成本较高,正在逐渐普及到DIY市场。
存储类型:
- 直连式存储(Direct-AttachedStorage,简称DAS)依赖服务器主机操作系统进行数据的IO读写和存储维护管理,数据备份和恢复要求占用服务器主机资源(包括CPU、系统IO等)。
- 网络化存储(Fabric-AttachedStorage,简称FAS)
网络化存储根据传输协议又分为:
- 网络接入存储(Network-AttachedStorage,简称NAS)存储设备通过标准的网络拓扑结构(如以太网)添加到一群计算机上。NAS是文件级的存储方法,重点在于帮助工作组和部门级机构解决迅速增加存储容量的需求。如今用户采用NAS较多的功能是用来文档共享、图片共享、电影共享等等,而且随着云计算的发展,一些NAS厂商也推出了云存储功能,大大方便了企业和个人用户的使用。
- 存储区域网络(StorageAreaNetwork,简称SAN)通过光纤通道交换机连接存储阵列和服务器主机,成为一个专用的存储网络。SAN提供了一种与现有LAN连接的简易方法,并且通过同一物理通道支持广泛使用的SCSI和IP协议。SAN不受现今主流的、基于SCSI存储结构的布局限制。特别重要的是,随着存储容量的爆炸性增长,SAN允许企业独立地增加它们的存储容量。SAN的结构允许任何服务器连接到任何存储阵列,不管数据置放在那里,服务器都可直接存取所需的数据。
2. 查看磁盘目录与容量
df:检查文件系统的磁盘空间占用情况
语法:df [-ahikHTm] [目录或文件名]
选项与参数:
- -a :列出所有的文件系统,包括系统特有的 /proc 等文件系统;
- -k :以 KBytes 的容量显示各文件系统;
- -m :以 MBytes 的容量显示各文件系统;
- -h :以人们较易阅读的 GBytes, MBytes, KBytes 等格式自行显示;
- -H :以 M=1000K 取代 M=1024K 的进位方式;
- -T :显示文件系统类型;
- -i :不用硬盘容量,而以 inode 的数量来显示
du:查看文件和目录磁盘使用的空间,直接到文件系统内去搜寻所有的文件数据
语法:du [-ahskm] 文件或目录名称
选项与参数:
- -a :列出所有的文件与目录容量,因为默认仅统计目录底下的文件量而已。
- -h :以人们较易读的容量格式 (G/M) 显示;
- -s :列出总量而已,而不列出每个各别的目录占用容量;
- -S :不包括子目录下的总计,与 -s 有点差别。
- -k :以 KBytes 列出容量显示;
- -m :以 MBytes 列出容量显示;
ln:为某一个文件在另外一个位置建立一个同步的链接
语法:ln [参数][源文件或目录][目标文件或目录]
选项与参数:
- -b :删除,覆盖以前建立的链接
- -d :允许超级用户制作目录的硬链接
- -f :强制执行
- -i :交互模式,文件存在则提示用户是否覆盖
- -n :把符号链接视为一般目录
- -s :软链接(符号链接)
- -v :显示详细的处理过程
- -S :"-S<字尾备份字符串> "或 "--suffix=<字尾备份字符串>"
- -V :"-V<备份方式>"或"--version-control=<备份方式>"
- --help :显示帮助信息
- --version :显示版本信息
fdisk:是Linux 磁盘分区表操作工具
语法:fdisk [参数]
必要参数:
- -l :列出素所有分区表
- -u :与"-l"搭配使用,显示分区数目
- -s :<分区编号> 指定分区
- -v :版本信息
菜单操作说明:
- m :显示菜单和帮助信息
- a :活动分区标记/引导分区
- d :删除分区
- l :显示分区类型
- n :新建分区
- p :显示分区信息
- q :退出不保存
- t :设置分区号
- v :进行分区检查
- w :保存修改
- x :扩展应用,高级功能
3. 新增磁盘步骤
- 发现磁盘:
重启系统或在/sys下扫描SCSI:
- cd /sys/class/scsi_host
- echo "- - -" > /sys/class/scsi_host/host0/scan
fdisk–l查看新加的磁盘,如果没有则把host0换成host1或者host2尝试一下
- 分割磁盘:
创建分割槽的形式:
1)1-4 号尚有剩余,且系统未有extended:此时会出现让你挑选Primary / Extended 的项目,且你可以指定1~4 号间的号码;
2)1-4 号尚有剩余,且系统有extended:此时会出现让你挑选Primary / Logical 的项目;若选择p 则你还需要指定1~4 号间的号码;若选择l(L的小写) 则不需要配置号码,因为系统会自动指定逻辑分割槽的文件名号码;
3)1-4 没有剩余,且系统有extended:此时不会让你挑选分割槽类型,直接会进入logical 的分割槽形式。
- 格式化磁盘:
mkfs:在特定的分区上建立 linux 文件系统
语法:mkfs [-V] [-t fstype] [fs-options] filesys [blocks]
选项与参数:
- -t :可以接文件系统格式,例如 ext3, ext2, vfat 等(系统有支持才会生效)
- device :预备检查的硬盘分区,例如:/dev/sda1
- -V :详细显示模式
- -c :在制做档案系统前,检查该partition 是否有坏轨
- -l bad_blocks_file :将有坏轨的block资料加到 bad_blocks_file 里面
- block :给定 block 的大小
超过16T硬盘分区和格式化:传统fdisk分区不支持2T以上的磁盘分区,而parted分区可以支持;ext4格式不支持16T以上的磁盘空间分区,必须使用xfs系统类型。
parted:对大容量硬盘进行分区
语法:parted [选项]... [设备 [命令 [参数]...]...]
选项与参数:
- -h, --help :显示求助信息
- -i, --interactive :在必要时提示用户
- -l, --list :显示所有磁盘设备的分区表
- -s, --script :不进入用户交互模式
- -v, --version :显示版本
- -m, --machine :打印出方便机器解析的输出
- -a, --alignment :对齐分区
对大容量硬盘进行格式化:mkfs.xfs [设备]
check NUMBER | 做一次简单的文件系统检测 |
cp [FROM-DEVICE] FROM-NUMBER TO-NUMBER | 复制文件系统到另一个分区 |
help [COMMAND] | 显示所有的命令帮助 |
mklabel,mktable LABEL-TYPE gpt | 创建新的磁盘卷标(分区表) |
mkfs NUMBER FS-TYPE | 在分区上建立文件系统 |
mkpart PART-TYPE [FS-TYPE] START END | 创建一个分区 |
mkpartfs PART-TYPE FS-TYPE START END | 创建分区,并建立文件系统 |
move NUMBER START END | 移动分区 |
name NUMBER NAME | 给分区命名 |
print [devices|free|list,all|NUMBER] | 显示分区表、活动设备、空闲空间、所有分区 |
quit | 退出 |
rescue START END | 修复丢失的分区 |
resize NUMBER START END | 修改分区大小 |
rm NUMBER | 删除分区 |
select DEVICE | 选择需要编辑的设备 |
set NUMBER FLAG STATE | 改变分区标记 |
toggle [NUMBER [FLAG]] | 切换分区表的状态 |
unit UNIT | 设置默认的单位 |
Version | 显示版本 |
- 检验磁盘:
fsck:用来检查和维护不一致的文件系统
语法:fsck [-t 文件系统] [-ACay] 装置名称
选项与参数:
- -t :给定档案系统的型式,若在 /etc/fstab 中已有定义或 kernel 本身已支援的则不需加上此参数
- -s :依序一个一个地执行 fsck 的指令来检查
- -A :对/etc/fstab 中所有列出来的 分区(partition)做检查
- -C :显示完整的检查进度
- -V :详细显示模式
- -R :同时有 -A 条件时,省略 / 不检查
- -d : 打印出 e2fsck 的 debug 结果
- -p :同时有 -A 条件时,同时有多个 fsck 的检查一起执行
- -a :如果检查有错则自动修复
- -r :如果检查有错则由使用者回答是否修复
- -y :选项指定检测每个文件是自动输入yes,在不确定那些是不正常的时候,可以执行 # fsck -y 全部检查修复
- 挂载与卸除磁盘:
mount:挂载Linux系统外的文件
语法:mount [-t 文件系统] [-L Label名] [-o 额外选项] [-n] 装置文件名 挂载点
选项与参数:
- -V :显示程序版本
- -h :显示辅助讯息
- -v :显示较讯息,通常和 -f 用来除错。
- -a :将 /etc/fstab 中定义的所有档案系统挂上。
- -F :这个命令通常和 -a 一起使用,它会为每一个 mount 的动作产生一个行程负责执行。在系统需要挂上大量 NFS 档案系统时可以加快挂上的动作。
- -f :通常用在除错的用途。它会使 mount 并不执行实际挂上的动作,而是模拟整个挂上的过程。通常会和 -v 一起使用。
- -n :一般而言,mount 在挂上后会在 /etc/mtab 中写入一笔资料。但在系统中没有可写入档案系统存在的情况下可以用这个选项取消这个动作。
- -L :将含有特定标签的硬盘分割挂上。
- -U :将档案分割序号为 的档案系统挂下。-L 和 -U 必须在/proc/partition 这种档案存在时才有意义。
- -t :指定档案系统的型态,通常不必指定。mount 会自动选择正确的型态。
umount:卸除目前挂在Linux目录中的文件系统
语法:umount [-fn] 装置文件名或挂载点
选项与参数:
- -a :卸除/etc/mtab中记录的所有文件系统。
- -f :强制卸除
- -h :显示帮助。
- -n :卸除时不要将信息存入/etc/mtab文件中。
- -r :若无法成功卸除,则尝试以只读的方式重新挂入文件系统。
- -t :<文件系统类型> 仅卸除选项中所指定的文件系统。
- -v :执行时显示详细的信息。
- -V :显示版本信息。
挂载前注意的事情:
1)单一文件系统不应该被重复挂载在不同的挂载点(目录)中
2)单一目录不应该重复挂载多个文件系统;
3)要作为挂载点的目录,理论上应该都是空目录才是。
mtab文件和 fstab文件区别:它们结构和内容基本相同,一样在 /etc 文件下,但是不同的是,mtab文件记录的是,当前已挂载的分区信息。
1)/etc/fstab文件作用:文件/etc/fstab存放的系统启动时需要挂载的文件系信息。系统启动时会读该文件,当需要启动时挂载时,系统就自动挂载;
2)/etc/mtab文件作用:动态的记录现在系统已经挂载的文件系统,包括操作系统建立的虚拟文件等;而/etc/fstab是为系统启动挂载文件系统准备的。每当 mount 挂载分区、umount 卸载分区,都会动态更新 mtab,mtab 总是保持着当前系统中已挂载的分区信息,fdisk、df 这类程序,必须要读取 mtab 文件,才能获得当前系统中的分区挂载情况。
进入单人维护模式,在/目录只有read only的状态,需要修改/etc/fstab
- mount -n -o remount,rw /
4. RAID阵列
RAID:(Redundant Arrays of Inexpensive Disks, RAID)容错式廉价磁盘阵列,RAID 可以透过一个软件或硬件,将多个较小的磁盘整合成为一个较大的磁盘装置。
RAID level:
- RAID-0 (等量模式, stripe):效能最佳
- RAID-1 (映射模式, mirror):完整备份
- RAID 0+1,RAID 1+0
- RAID 5:效能与数据备份的均衡考量
- Spare Disk:预备磁盘,在坏掉硬盘时主动重建数据系统
项目 | RAID0 | RAID1 | RAID10 | RAID5 | RAID6 |
---|---|---|---|---|---|
最少磁盘数 | 2 | 2 | 4 | 3 | 4 |
最大容错磁盘数 | 无 | n-1 | n/2 | 1 | 2 |
资料安全性 | 完全沒有 | 最佳 | 最佳 | 好 | 比RAID5好 |
理论写入效能 | n | 1 | n/2 | <n-1 | <n-2 |
理论读出效能 | n | n | n | <n-1 | <n-2 |
可用容量 | n | 1 | n/2 | n-1 | n-2 |
一般应用 | 强调效能但资料不重要的环境 | 资料与备份 | 服务器、云系统常用 | 资料与备份 | 资料与备份 |
5. 配置软件磁盘阵列
- 创建RAID0
1)新建分区:创建RAID0 需要两块硬盘,所以我们拿/dev/sdb和/dev/sdc来实验。输入"n" 新建分区,这里我们将整个磁盘都划分成一个分区,然后输入"p" 查看分区情况。
2)修改分区类型:默认新建分区的类型是Linux,代号83,我们需要将其修改为raid 类型。输入"t",然后输入"L" 列出所有的文件格式,这里选择"fdLinux raid auto", 输入"fd",然后再输入"p" 查看分区情况,这是分区格式已经变成了Linux raid autodetect;输入"w" 保存分区。
3)同步分区:使用“partprobe”命令同步分区情况,保存完后查看/proc/partitions是否存在。此命令在物理机管用,在虚拟机不行,只能重启或“partx -a /dev/sdb1 /dev/sdb”
4)创建RAID0:mdadm -C /dev/md0 -ayes -l0 -n2 /dev/sd{b,c}1
mdadm:用于建设、管理和监控RAID阵列
语法:mdadm [mode] [options]
选项与参数:
- -A, --assemble :激活启用磁盘阵列
- -C, --create :创建一个新阵列
- -D, --detail :打印阵列设备的详细信息
- -G, --grow :改变阵列的大小或形态
- -v, --verbose :显示详细信息
- -f, --fail :将设备状态定为故障
- -s, --scan :扫描配置文件或 /proc/mdstat以搜寻丢失的信息。配置文件/etc/mdadm.conf
- -c, --chunk= :设定阵列的块chunk大小,单位为KB
- -a, --add :添加设备到阵列
- -x, --spare-devices= :指定初始阵列的备用盘数目
- -n, --raid-devices= :指定阵列成员数目,这个数目只能由 --grow 修改
- -l, --level= :设定磁盘阵列级别
- -r, --remove : 移除设备
- --auto=yes :自动为其创建设备文件
- -S, --stop :停用磁盘阵列
5)查看RAID0状态:cat /proc/mdstat; mdadm -D /dev/md0
6)创建配置文件/etc/mdadm.conf:mdadm --detail --scan --verbose >>/etc/mdadm.conf
7)格式化磁盘阵列:mkfs.ext4 /dev/md0
8)建立挂载点并挂载:mkdir /mnt/raid0; mount /dev/md0 /mnt/raid0
9)开机挂载:vi /etc/fstab
- 创建RAID1
和创建raid0类似,我们拿/dev/sdd和/dev/sde这两块硬盘来做演示。重复创建raid0前三个步骤。
4)创建RAID1:mdadm -C /dev/md1 -ayes -l1 -n2 /dev/sd[d,e]1
5)查看RAID1状态:cat /proc/mdstat; mdadm -D /dev/md1
6)创建配置文件/etc/mdadm.conf:mdadm --detail --scan --verbose >>/etc/mdadm.conf
7)格式化磁盘阵列:mkfs.ext4 /dev/md1
8)建立挂载点并挂载:mkdir /mnt/raid1; mount /dev/md1 /mnt/raid1
9)开机挂载:vi /etc/fstab
- 创建RAID10
raid10就是由两个raid1组成raid0的级别,raid0、raid1各需要两块磁盘,所以创建raid10就需要四块磁盘。重复创建raid0前三个步骤。
4)创建2个raid1:mdadm -C /dev/md3 -ayes -l1 -n2 /dev/sd[f,g]1; mdadm -C /dev/md4 -a yes -l1 -n2 /dev/sd{h,i}1
5)创建raid0:mdadm -C /dev/md10 -ayes -l0 -n2 /dev/md{3,4}
或以上2步骤化简为:mdadm -C /dev/md10 -ayes -l10 -n4 /dev/sd{f,g,h,i}1
6)查看RAID10状态:cat /proc/mdstat; mdadm -D /dev/md10
7)创建配置文件/etc/mdadm.conf:mdadm -Dsv >/etc/mdadm.conf
8)格式化磁盘阵列:mkfs -t xfs -f /dev/md10
9)建立挂载点并挂载:mkdir /mnt/raid10; mount /dev/md10 /mnt/raid10
10)开机挂载:vi /etc/fstab
- 创建RAID5
RAID5 至少需要三块硬盘,我们拿/dev/sdf, /dev/sdg, /dev/sdh, /dev/sdi这四块硬盘来做实验,三块做为活动盘,另一块做为热备盘。重复创建raid0前三个步骤。
4)创建RAID5:mdadm -C /dev/md5 -ayes -l5 –n3 -x1 /dev/sd[j,k,l,m]1
5)查看raid5 状态:cat /proc/mdstat; mdadm -D /dev/md5
6)创建配置文件/etc/mdadm.conf:mdadm --detail --scan --verbose >>/etc/mdadm.conf
7)格式化磁盘阵列:mkfs.ext4 /dev/md5
8)建立挂载点并挂载:mkdir /mnt/raid5; mount /dev/md0 /mnt/raid5
9)开机挂载:vi /etc/fstab
- raid5维护
1)模拟磁盘损坏:mdadm /dev/md5 -f /dev/sdm1
2)查看重建状态:cat /proc/mdstat; mdadm -D /dev/md5
3)移除损坏磁盘:mdadm /dev/md5 -r /dev/sdm1
4)再次查看状态:cat /proc/mdstat; mdadm -D /dev/md5
5)新加热备磁盘:mdadm /dev/md5 -a /dev/sdm1
6)再次查看状态:cat /proc/mdstat; mdadm -D /dev/md5
- 向RAID5增加存储硬盘
4)新加硬盘:mdadm /dev/md5 -a /dev/sdn1
5)查看raid5 状态:cat /proc/mdstat; mdadm -D /dev/md5
6)热备盘转换成活动盘:mdadm -G /dev/md5 -n4
7)扩容文件系统:resize2fs /dev/md5; df -TH
8)创建配置文件/etc/mdadm.conf:mdadm --detail --scan --verbose >>/etc/mdadm.conf
- 删除软件磁盘阵列
1)卸载阵列:umount /dev/md0
2)停止RAID阵列:
- mdadm --stop /dev/md0
- mdadm --misc --zero-superblock /dev/sdb
- mdadm --misc --zero-superblock /dev/sdc
3)防止开机启动RAID:把该设备相关的配置信息删除 vim /etc/mdadm.conf;删除开机启动信息 vim /etc/fstab
4. LVM卷管理
LVM:(Logical Volume Manager)逻辑盘卷管理的简称,它是Linux环境下对磁盘分区进行管理的一种机制,LVM是建立在硬盘和分区之上的一个逻辑层,来提高磁盘分区管理的灵活性。、
工作原理:通过将底层的物理硬盘抽象的封装起来,然后以逻辑卷的方式呈现给上层应用。
逻辑卷管理:
- PV(Physical Volume)物理卷,在逻辑卷管理中处于最底层,它可以是实际物理硬盘上的分区,也可以是整个物理硬盘,也可以是raid设备。
- VG(VolumneGroup)卷组,建立在物理卷之上,一个卷组中至少要包括一个物理卷,在卷组建立之后可动态添加物理卷到卷组中。一个逻辑卷管理系统工程中可以只有一个卷组,也可以拥有多个卷组。
- LV(Logical Volume)逻辑卷,建立在卷组之上,卷组中的未分配空间可以用于建立新的逻辑卷,逻辑卷建立后可以动态地扩展和缩小空间。系统中的多个逻辑卷可以属于同一个卷组,也可以属于不同的多个卷组。
- PE(Physical Extent)物理块。整个LVM 最小的储存区块,数据资料都是由写入PE 来处理的。
5. 卷管理操作
我们将模拟raid5、分区、物理硬盘三种类型设备创建VG,raid5需要四块硬盘,分区和物理硬盘各一块硬盘,还有扩容时需要至少一块硬盘,所以在虚拟机里添加八块硬盘,每块5GB.
- 创建LVM
1)安装LVM管理工具
检查系统中是否安装了LVM管理工具:rpm -qa | grep lvm
如果未安装,则使用yum 方式安装:yum install lvm*; rpm -qa | grep lvm
2)新建raid5设备:使用/dev/sdb, /dev/sdc, /dev/sdd, /dev/sde四块物理硬盘做软raid模拟。重复创建raid0前三个步骤。
- mdadm-C /dev/md5 -ayes -l5 -n3 –x1 /dev/sd[b,c,d,e]
3)创建配置文件/etc/mdadm.conf:mdadm -Dsv >/etc/mdadm.conf
4)新建分区:使用/dev/sdf硬盘进行分割和格式化为/dev/sdf1
5)创建PV:pvcreate /dev/md5 /dev/sdf1 /dev/sdg
6)查看PV:pvdisplay; pvs; pvscan
7)创建VG:vgcreate vg0 /dev/md5 /dev/sdf1 /dev/sdg
8)查看VG:vgdisplay; vgs; vgscan
9)创建LV:lvcreate -L 5G -n lv1 vg0
10)查看LV:lvdisplay
11)再看VG:vgs
12)格式化LV:mkfs.ext4 /dev/vg0/lv1
13)挂载LV:mkdir/mnt/lv1; mount /dev/vg0/lv1 /mnt/lv1/; df -TH
14)开机挂载:vi /etc/fstab
- 扩容LVM
1)查看vg0:vgs
2)扩容lv1:lvextend -L +1G /dev/vg0/lv1
3)查看lv1:lvs
4)扩容文件系统:resize2fs /dev/vg0/lv1; df -TH
5)扩容VG:pvcreate /dev/sdh; vgextend vg0 /dev/sdh
或 mdadm /dev/md5 -a /dev/sdj1; mdadm -G /dev/md5 -n4; pvresize /dev/md5
- 缩减LVM
1)卸载挂载点:umount /mnt/lv1/
2)缩减文件系统:resize2fs /dev/vg0/lv1 4G
3)检查磁盘:e2fsck -f /dev/vg0/lv1
4)再次执行缩减:resize2fs /dev/vg0/lv1 4G
5)缩减LV:lvreduce /dev/vg0/lv1 -L 4G (缩减到的大小)
6)挂载查看:mount /dev/vg0/lv1 /mnt/lv1; df -TH
7)卸载挂载点:umount /mnt/lv1/
8)查看PV:pvs
9)移除硬盘:vgreduce vg0 /dev/sdg
10)查看vg0:vgs
- 删除LVM
1)卸载挂载点:umount /mnt/lv1/
2)移除LV:lvremove /dev/vg0/lv1
3)移除VG:vgremove vg0; vgs
4)移除PV:pvremove /dev/md5 /dev/sdf1 /dev/sdg /dev/sdh
- LVM快照
snapshot:快照就是将当时的系统信息记录下来,就好像照相一样,未来若有任何资料变动了,则原始资料会被移动到快照区,没有被改动的区域则由快照区与档案系统共享。
1)建立LV:lvcreate -L 100M -n lv2 vg0
2)格式化LV:mkfs.ext4 /dev/vg0/lv2
3)挂载LV:mkdir /mnt/lv2; mount /dev/vg0/lv2 /mnt/lv2 (对 /mnt/lv2 挂载点写入测试数据)
4)创建快照:lvcreate -L 80M -s -n lv2snap /dev/vg0/lv2
5)查看快照:lvdisplay
6)挂载查看:mkdir /mnt/snapshot; mount /dev/vg0/lv2snap /mnt/snapshot (对 /mnt/lv2 挂载点文档进行修改操作)
7)打包备份:cd /mnt/snapshot; tar cjf /tmp/lvm.tar.bz2 *
8)卸载并移除snapshot:umount /mnt/snapshot; lvremove /dev/vg0/lv2snap
9)卸载并格式化/mnt/lv1:umount /mnt/lv2; mkfs.ext4 /dev/vg0/lv2
10)恢复数据:mount /dev/vg0/lv2 /mnt/lv2; tar xjf /tmp/lvm.tar.bz2 -C /mnt/lv2
11)查看挂载:ll /mnt/lv2/
6. 进程管理
进程:是正在执行的一个程序或命令,每一个进程都是一个运行的实体,都有自己的地址空间,并占用一定的系统资源。
进程和程序区别:
- 程序是静态概念,本身作为一种软件资源长期保存;而进程是程序的执行过程的动态概念,具有一定的生命期,是动态产生和消亡的。
- 程序和进程无对应关系。一个程序可以由多个进程公用;另一方面,一个进程在活动中有可顺序地执行若干个程序。
ps:显示当前进程的状态
语法:ps [options] [--help]
选项与参数:
- -w :显示加宽可以显示较多的资讯
- -C :指定显示的进程名
- -au :显示较详细的资讯
- -aux :显示所有包含其他使用者的行程
- au(x) :使用BSD操作系统格式显示系统中所有进程
- -e :显示所有进程,环境变量
- -f :显示程序间的关系,全格式输出
- -o :指定显示列名
- -h :不显示标题
- -l :长格式输出
- -a :显示终端上地所有进程,包括其他用户地进程
- -r :只显示正在运行地进程
- -x :显示没有控制终端地进程
- -u :以用户为主的格式来显示程序状况
- --lines<行数> :每页显示的行数
- --width<字符数> :每页显示的字符数
- --help :显示帮助信息
- --version :显示版本显示
ps配合watch使用,每秒中进行刷新显示:
- watch -n 1 'ps -u root u --sort -pcpu -pmem | head -n 10'
pstree:以树状图的方式展现进程之间的派生关系
语法:pstree [选项]
- -a :显示每个程序的完整指令,包含路径,参数或是常驻服务的标示;
- -c :不使用精简标示法;
- -G :使用VT100终端机的列绘图字符;
- -h :列出树状图时,特别标明现在执行的程序;
- -H<程序识别码> :此参数的效果和指定"-h"参数类似,但特别标明指定的程序;
- -l :采用长列格式显示树状图;
- -n :用程序识别码排序。预设是以程序名称来排序;
- -p :显示每个进程的PID
- -u :显示每个进程的所属账号名称
- -U :使用UTF-8列绘图字符;
- -V :显示版本信息。
- -A :各进程树之间的连接以ASCII码字符来连接
top:实时显示进程的动态
语法:top [选项]
选项与参数:
- -d :指定每两次屏幕信息刷新之间的时间间隔。当然用户可以使用s交互命令来改变之
- -p :通过指定监控进程ID来仅仅监控某个进程的状态
- -q :没有任何延迟的进行刷新
- -S :指定累计模式
- -s :使top命令在安全模式中运行,去除交互命令所带来的潜在危险
- -i :使top不显示任何闲置或者僵死进程
- -c :显示整个命令行而不只是显示命令名
- -n :更新的次数,完成后将会退出 top
- -b :批处理模式显示程序信息
交互式命令:
- K :终止一个进程。系统将提示用户输入需要终止的进程PID,以及需要发送给该进程什么样的信号。一般的终止进程可以使用15信号;如果不能正常结束那就使用信号9强制结束该进程。默认值是信号15
- i :忽略闲置和僵死进程
- q :退出程序
- s :改变两次刷新之间的延迟时间
- M :根据驻留内存大小进行排序
- P :根据CPU使用百分比大小进行排序
- T :根据时间/累计时间进行排序
- W :将当前设置写入~/.toprc文件中
- x :打开/关闭排序列的加亮效果,通过”shift + >”或”shift + <”可以向右或左改变排序列
- r :重新安排一个进程的优先级别。系统提示用户输入需要改变的进程PID以及需要设置的进程优先级值。输入一个正值将使优先级降低,反之则可以使该进程拥有更高的优先权。默认值是10
- S :切换到累计模式
- f或F :从当前显示中添加或者删除项目
- o或O :改变显示项目的顺序
- l :切换显示平均负载和启动时间信息
- m :切换显示内存信息
- t :切换显示进程和CPU状态信息
- c :切换显示命令名称和完整命令行
pidof:查找指定名称的进程的进程号id号
语法:pidof [option] [command]
选项与参数:
- -s :仅返回一个进程号
- -c :仅显示具有相同“root”目录的进程
- -x :显示由脚本开启的进程
- -o :指定不显示的进程ID
nice:指定程序的运行优先级
语法:nice [option] [command]
选项与参数:
- -n,--adjustment= :指定优先级
- --help :显示求助讯息
- --version :显示版本资讯
renice:改变一个或多个行程的优先级
语法:renice priority [[-p] pid ...] [[-g] pgrp ...] [[-u] user ...]
选项与参数:
-n,--priority <priority> :指定标识符的计划优先级
-g,--pgrp <pgid> :标识符指定为进程组ID
-u,--user <name_or_uid> :标识符指定为用户名或用户ID
-p,--pid <pid> :标识符指定为进程ID(默认)
-h,--help :显示帮助信息
-V,--version :显示版本信息
killall:杀死指定进程名
语法:kill [参数] [进程号]
选项与参数:
- -a :当处理当前进程时,不限制命令名和进程号的对应关系
- -Z :只杀死拥有scontext的进程
- -e :要求匹配进程名称
- -I :忽略小写
- -g :杀死进程组(不是进程)
- -i :杀死进程前会先询问用户
- -l :列出所有的已知信号名称
- -q :禁止输出警告信息
- -s :发送指定的信号
- -v :显示报告信号是否成功发送
- -w :等待进程死亡
- -u :指定用户
- --version :显示版本显示
kill:删除执行中的程序或工作
语法:kill [参数] [进程id]
选项与参数:
- -l :列出全部的信号名称
- -a :当处理当前进程时,不限制命令名和进程号的对应关系
- -p :指定kill 命令只打印相关进程的进程号,而不发送任何信号
- -s :指定发送信号
- -u :指定用户
信号代号 | 信号名称 | 说 明 |
---|---|---|
1 | SIGHUP | 该信号让进程立即关闭.然后重新读取配置文件之后重启 |
2 | SIGINT | 程序中止信号,用于中止前台进程。相当于输出 Ctrl+C 快捷键 |
8 | SIGFPE | 在发生致命的算术运算错误时发出。不仅包括浮点运算错误,还包括溢出及除数为 0 等其他所有的算术运算错误 |
9 | SIGKILL | 用来立即结束程序的运行。本信号不能被阻塞、处理和忽略。般用于强制中止进程 |
14 | SIGALRM | 时钟定时信号,计算的是实际的时间或时钟时间。alarm 函数使用该信号 |
15 | SIGTERM | 正常结束进程的信号,kill 命令的默认信号。如果进程已经发生了问题,那么这 个信号是无法正常中止进程的,这时我们才会尝试 SIGKILL 信号,也就是信号 9 |
18 | SIGCONT | 该信号可以让暂停的进程恢复执行。本信号不能被阻断 |
19 | SIGSTOP | 该信号可以暂停前台进程,相当于输入 Ctrl+Z 快捷键。本信号不能被阻断 |
pkill:控制同名程序的所有进程
语法:pkill [选项] [信号] 进程名
选项与参数:
- -f :显示完整程序
- -l :显示源代码
- -n :显示新程序
- -o :显示旧程序
- -v :与条件不符合的程序
- -x :与条件符合的程序
- -p<进程号> :列出父进程为用户指定进程的进程信息
- -t<终端> :指定终端下的所有程序
- -u<用户> :指定用户的程序
pgrep:查看当前正在运行的进程
语法:pgrep [选项] 进程名
选项与参数:
- -o :仅显示找到的最小(起始)进程号
- -n :仅显示找到的最大(结束)进程号
- -l :显示进程名称
- -P :指定父进程号
- -g :指定进程组
- -t :指定开启进程的终端
- -u :指定进程的有效用户ID
w:显示目前登入系统的用户信息
语法:w [选项] [用户名]
选项与参数:
- -f :开启或关闭显示用户从何处登入系统。
- -h :不显示各栏位的标题信息列。
- -l :使用详细格式列表,此为预设值。
- -s :使用简洁格式列表,不显示用户登入时间,终端机阶段作业和程序所耗费的CPU时间。
- -u :忽略执行程序的名称,以及该程序耗费CPU时间的信息。
- -V :显示版本信息。
7. 计划任务
at:一次性计划任务,在某一固定的时间执行特定命令
语法:at [选项] [时间参数]
选项与参数:
- -m :当计划任务执行结束后发邮件给客户
- -l :查看用户计划任务
- -d :删除用户计划任务
- -c :查看at计划任务的具体内容
- -f /path/from/somefile :从指定文件中读取任务,不用交互式输入
TIME格式:
- HH:MM :在今日的某时某分进行,若该时刻已过,则明天此时执行任务
- HH:MM YYYY-MM-DD :规定在某年某月的某一天的特殊时刻进行该项任务
- HH:MM [am|pm] [Month] [Date] :强调在某年某月某日的某时刻进行
- tomorrow,noon,midnight, teatime :明天、中午、午夜、下午茶时间
- HH:MM [am|pm] + number [minutes|hours|days|weeks] :在某个时间点再加几个时间后才进行任务
- now+#{minutes,hours,days,or weeks} :现在之后的多久执行任务
atd服务暂时启动:systemctl start atd; service atd restart
atd服务开机启动:systemctl enable atd; chkconfig --level 345 atd on
chkconfig:更新(启动或停止)和查询系统服务的运行级信息
语法:chkconfig [--add] [--del] [--list] [系统服务] 或 chkconfig [--level <等级代号>] [系统服务] [on/off/reset]
选项与参数:
- --add :增加所指定的系统服务,让chkconfig指令得以管理它,并同时在系统启动的叙述文件内增加相关数据
- --del :删除所指定的系统服务,不再由chkconfig指令管理,并同时在系统启动的叙述文件内删除相关数据
- --list [name] :显示所有运行级系统服务的运行状态信息(on或off)。如果指定了name,那么只显示指定的服务在不同运行级的状态
- --level<等级代号> :指定系统服务要在哪一个执行等级中开启或关毕
- 等级0:表示关机
- 等级1:单用户模式
- 等级2:无网络连接的多用户命令行模式
- 等级3:有网络连接的多用户命令行模式
- 等级4:不可用
- 等级5:带图形界面的多用户模式
- 等级6:重新启动
需要说明的是,level选项可以指定要查看的运行级而不一定是当前运行级。对于每个运行级,只能有一个启动脚本或者停止脚本。当切换运行级时,init不会重新启动已经启动的服务,也不会再次去停止已经停止的服务。
crontab:周期性计划任务,定期执行程序命令
语法:crontab [-u user] [-l | -r | -e] [-i]
选项与参数:
- -u :指定计划任务的用户,默认为当前用户
- -l :查看计划任务·
- -r :删除计划任务
- -e :编辑计划任务
- -i :删除时提示是否确认
crontab服务暂时启动:systemctl start crond; systemctl status crond; service cron start; service crond status
crontab服务开机启动:systemctl enable crond; chkconfig –level 345 crond on
分钟 小时 日 月 星期 命令
0-59 0-23 1-31 1-12 0-7 command (取值范围,0和7表示周日,周与日月不可同时并存)
使用以下特殊字符:
- 星号(*):代表取值范围内的数字
- 逗号(,):代表分隔时段
- 中杠(-):指定时间范围
- 正斜线(/n):指定时间的间隔频率
at控制文件分别为 /etc/at.allow; /etc/at.deny
crontab控制文件分别为 /etc/cron.allow; /etc/cron.deny
- 只有allow时,只允许allow用户添加计划
- allow与deny共存时,只允许allow中的用户添加
- 只有deny时,除deny中的用户都可添加
crontab不执行问题总结
- crond服务未启动:crontab不是Linux内核的功能,而是依赖crond服务,这个服务可以启动当然也可以停止。如果停止了就无法执行任何定时任务了,解决的方法是启动服务:/etc/init.d/crond restart
- 权限问题:(如:脚本没有x执行权限,解决方法:增加执行权限,或者用 /bin/bash abc.sh的方法执行)
- 路径问题:有的命令在shell中执行正常,但是在crontab执行却总是失败。有可能是因为crontab没有使用绝对路径
- 身份问题:在系统配置文件/etc/crontab里面,使用者自己的crontab并不需要指定身份,但/etc/crontab里面要指定身份!系统默认的例行性工作是以root的身份来进行的;“run-parts”后接目录参数,将会运行此目录中的每个脚本;如果去掉”run-parts”这个参数的话,后面可接运行的某个脚本名,而不是文件名
8. 日志管理
日志:记录系统活动信息文件
重要性:日志文件对于诊断和解决系统中的问题很有帮助,因为在Linux系统中运行的程序通常会把系统消息和错误消息写入相应的日志文件,这样系统一旦出现问题就会“有据可查”。此外,当主机遭受攻击时,日志文件还可以帮助寻找攻击者留下的痕迹.
常见日志文件:
- /var/log/messages :记录Linux内核消息及各种应用程序的公共日志信息,包括启动、IO错误、网络错误、程序错误等。对于未使用独立日志文件的应用程序或服务,一般都可以从该日志文件中获得相关的事件记录信息。
- /var/log/cron :记录crond计划任务产生的事件信息。
- /var/log/dmesg :记录系统在启动的时候核心侦测过程所产生的各项信息。
- /var/log/maillog :记录进入或发出系统的电子邮件活动。
- /var/log/lastlog :最近几次成功登录事件和最后一次不成功登录事件。
- /var/log/rpmpkgs :记录系统中安装的各rpm包列表信息。
- /var/log/secure :记录用户登录认证过程中的事件信息。
- /var/log/wtmp :记录每个用户登录、注销及系统启动和停机事件。
- /var/run/utmp :记录当前登录的每个用户的详细信息。
日志格式:
- 事件发生的日期与时间
- 发生此事件的主机名称
- 启动此事件的服务名称
- 该信息的实际数据内容
日志级别:
- (EMERG)紧急:系统不可用
- (ALERT)警告:必须马上采取措施
- (CRIT)严重:比较严重的错误
- (ERR)错误:软件运行出现错误
- (WARNING)提醒:可能影响系统功能,给出用户提醒
- (NOTICE)注意:不会影响系统功能,给出用户提醒
- (INFO)信息:一般信息
- (DEBUG)调试:程序或系统调试信息
日志类型:
- auth :认证相关
- authpriv :安全权限相关的日志
- cron :系统定期执行计划任务时产生的日志
- damon :和各个守护进程相关的日志
- kern :内核相关日志
- lpr :打印服务相关日志
- mail :邮件收发日志
- mark :产生时间戳
- news :网络新闻协议产生的日志
- syslog :记录rsyslog服务产生的日志
- user :用户程序产生的相关信息
- uucp :UUCP子系统的日志信息
- local0 through local7 :默认归类的日志,留给本地用户开发测试使用
连接符号:
- “*”:代表所有日志等级
- “.”:代表只要比后面的等级高的(包含该等级)日志都记录下来
- “.=”:代表只记录所需等级的日志,其他等级的都不记录
- “.!”:代表不等于,也就是除了该等级的日志外,其他等级的日志都记录
logger:通过shell命令接口使用Syslog的系统日志模块
语法:logger [options] [messages]
选项与参数:
- -d, --udp :使用数据报(UDP)而不是使用默认的流连接(TCP)
- -i, --id :逐行记录每一次logger的进程ID
- -f, --file file_name :记录特定的文件
- -h, --help :显示帮助文本并退出
- -n, --server :写入指定远程syslog服务器,使用UDP代替内装式syslog的例程
- -P, --port port_num :使用指定的UDP端口。默认的端口号是514
- -p, --priority priority_level :指定输入消息的优先级,优先级可以是数字或者指定为 "facility.level" 的格式
- -s, --stderr :输出标准错误到系统日志。
- -t, --tag tag :指定标记记录
- -u, --socket socket :写入指定的socket,而不是到内置系统日志例程。
- -V, --version :现实版本信息并退出
- **messages :**写入log文件的内容消息,可以与-f配合使用。
- ^ :后跟可执行脚本或程序的绝对路径
9. 远程日志同步
- 关闭防火墙和selinux
清空防火墙规则:/etc/init.d/iptables stop;
临时关闭Sselinux:setenforce 0; getenforce
开机关闭selinux:vi /etc/selinux/config,将SELINUX的值设置为disabled
临时关闭防火墙:systemctl stop firewalld; systemctl status firewalld; service iptables stop; service iptables status
开机自关闭防火墙:systemctl disable firewalld.service; chkconfig iptables off
- 部署服务端
1)打开TCP端口:vim /etc/rsylog.conf
$ModLoad imtcp
$InputTCPServerRun 514
@表示udp协议发送,@@表示tcp协议发送
2)编写配置文件:在GLOBAL DIRECTIVE块前追加以下三行
#按照主机名区分目录
- $template RemoteLogs,"/var/log/%HOSTNAME%/%PROGRAMNAME%.log" *
- *.* ?RemoteLogs
- & ~
#按照ip地址区分目录
- $template RemoteLogs,"/var/log/%fromhost-ip%/%fromhost-ip%_%$YEAR%-%$MONTH%-%$DAY%.log" *
- *.* ?RemoteLogs
- & ~
3)重启服务:systemctl restart rsyslog; service rsyslog restart
- 部署客户端
1)编辑配置文件:vim /etc/rsylog.conf
2)重启服务:systemctl restart rsyslog; service rsyslog restart
cron.* @@192.168.12.40:514
3)执行任务:crontab -e
*/1 * * * * echo “nihao”>>/tmp/file.log
- 验证配置
客户端查看:tail -f /var/log/cron
服务端查看:tail -f /var/log/['hostname']/CROND.log or tail -f /var/log/[‘address’]/['address_date'].log
10. 日志轮替
logrotate的配置文件:/etc/logrotate.conf; /etc/logrotate.d/,logrotate.conf是主要参数文件,logrotate.d目录里面的所有文件都会被主动读入/etc/logrotate.conf当中来进行!另外在/etc/logrotate.d/文件中,如果没有规定到的细部配置,则以/etc/logrotate.conf文件的规定来指定默认值。
logrotate:管理记录文件
语法:logrotate [-vf] logfile
选项与参数:
- -v, --version :显示日志轮替过程
- -f, --force :强制进行日志轮替。不管日志轮替的条件是否已经符合,强制配置文件中所有的日志进行轮替
- -d, --debug :以预演方式运行logrotate,模拟演练日志轮循并显示其输出,便于排错或了解程序执行的情况
- -s<状态文件>, --state=<状态文件> :使用指定的状态文件
参数 | 说明 |
---|---|
daily | 指定转储周期为每天 |
weekly | 指定转储周期为每周 |
monthly | 指定转储周期为每月 |
create mode owner group | 在轮替动作之后,postrotate脚本执行之前,立即使用刚轮替的日志文件名创建日志文件。MODE 指定日志文件的权限(0660之类),OWNER 指定日志文件的属主,GROUP 指定日志文件的属组 |
rotate count | 轮替最多保留之前的数据几次,超出的将被删除或邮件接收,设0则不保存 |
compress |
通过gzip压缩转储以后的日志 |
nocompress | 不需要压缩转储 |
nodelaycompress | 转储同时压缩 |
delaycompress | 指示logrotate不要将最近的归档压缩,压缩将在下一次轮循周期进行 |
dateext | 使用日期作为日志轮替文件的后缀 |
start count |
轮替文件名基于这个数字 |
missingok | 如果日志不存在,则忽略该日志的警告信息 |
sharedscripts | 在此关键字之后的脚本只执行一次 |
minsize | 大小日志轮替的最小值。日志达到最小值才会轮替,否则就算时间达到也不轮替 |
size Size | 当日志增长到指定大小的时候开始轮替,Size 可以指定 bytes(缺省)以及KB(sizek)或者MB (sizem) |
nomail | 不发送邮件到任何地址 |
mail address | 将轮替后的文件发送到指定E-mail地址 |
errors address | 专储时的错误信息发送到指定的Email 地址 |
mailfirst/maillast | 向邮件发送轮替文件/轮替后历史文件,默认 |
notifempty | 若日志为空文件,则不进行日志轮替 |
ifempty | 即使日志文件是空的也轮替 |
noolddir | 转储后的日志文件和当前日志文件放在同一个目录下,默认 |
olddir directory | 轮替后日志文件放入指定的目录,必须和当前日志文件在同一个文件系统 |
copytruncate | 用于还在打开中的日志文件,把当前日志备份并截断,开始轮替 |
postrotate/endscript | 在日志轮替之后执行脚本命令,endscript标示postrotate脚本结束;这两个关键字必须单独成行,注意使用外部指令时要用绝对路径 |
prerotate/endscript | 在日志轮替之前执行脚本命令,endscript标示prerotate脚本结束 |