回顾:
压缩、归档工具
gzip
bzip2
xz
zip/unzip
tar
cpio
机械式磁盘的工作原理,技术参数,常用术语
使用磁盘的步骤:
分区
fdisk gdisk
parted
高级格式化
ext
超级块(备份),GDT,metadata,data
mkfs.ext2/3/4 mkfs.vfat
mke2fs
dumpe2fs
tune2fs
blkid
挂载
mount
-o
acl
umount
/etc/fstab
设备文件(设备名,卷标,UUID...) 挂载点 fs类型 选项 转储频率 自检次序
两种特殊文件:
设备文件:
mknod
符号链接文件:
链接:就是访问一个文件的不同的路径;
硬链接
数据块指针指向同一个数据块的文件;
不能跨文件系统创建硬链接
目录文件不能创建硬链接
每次创建硬连接都会增加inode的引用计数
符号链接(软链接)
用于存储被链接文件的路径的文件
可以跨文件系统创建
也可以对目录创建
每次都必须进行两组路径的查找
ln命令:
ln [option...] src_file link_file
-s, --symbolic:创建符号链接,省略该选项,即创建硬链接;
-v:显示链接创建的过程;
注意:创建符号链接时,如果想要保证该链接文件被复制或移动到其他路径中依然可以,最好链接至被链接文件的绝对路径;
版本管理:
apache:
2.2 2.4
将不同的版本的软件分别放置于不同的目录中,使用符号链接,将软件链接的一个统一的路径:
/usr/local/apache --> /usr/local/apache-2.2
/usr/local/apache-2.2
/usr/local/apache-2.4
user.sh --> user1.sh
user1.sh user2.sh user3.sh
什么是RAID
RAID:Redundant Arrays of Inexpensive Disks
即:廉价磁盘冗余阵列
Redundant Arrays of Independent Disks
独立磁盘冗余阵列
1988年由加利福尼亚大学伯克利分校(University of California-Berkeley)提出的“A Case for Redundant Arrays of Inexpensive Disks”。
旨在将多个相对廉价的IDE接口的磁盘合成一个“阵列”来提供更好的IO性能、实现磁盘冗余,或者两者都提供。
RAID
提高IO能力:
磁盘并行读写
提高耐用性;
磁盘冗余来实现
级别:多块磁盘组织在一起的工作方式有所不同
RAID实现的方式:
外接式磁盘阵列:通过扩展卡提供适配能力
内接式RAID:主板集成RAID控制器
安装OS前在BIOS里配置
Software RAID:
RAID级别
RAID-0:条带卷,strip
RAID-1: 镜像卷,mirror
RAID-2
..
RAID-5
RAID-6
RAID-10
RAID-01
RAID-0:
读、写性能提升;
可用空间:N*min(S1,S2,...)
无容错能力
最少磁盘数:2, 2
RAID-1:
读性能提升、写性能略有下降;
可用空间:1*min(S1,S2)
有冗余能力
最少磁盘数:2, 2+
RAID-4:
多块数据盘异或运算值,存于专用校验盘
坏了一块硬盘仍然可以继续工作的模式称为降级模式
校验盘压力最大,很容易形成性能瓶颈;
RAID-5:
读、写性能提升
可用空间:(N-1)*min(S1,S2,...)
有容错能力:允许最多1块磁盘损坏
最少磁盘数:3, 3+
RAID-6:
读、写性能提升
可用空间:(N-2)*min(S1,S2,...)
有容错能力:允许最多2块磁盘损坏
最少磁盘数:4, 4+
RAID混合类型级别
RAID-10:
读、写性能提升
可用空间:N*min(S1,S2,...)/2
有容错能力:每组镜像最多只能坏一块
最少磁盘数:4, 4+
RAID-01、RAID-50
RAID7:可以理解为一个独立存储计算机,自身带有操作系统和管理工具,可以独立运行,理论上性能最高的RAID模式
JBOD:Just a Bunch Of Disks
功能:将多块磁盘的空间合并一个大的连续空间使用
可用空间:sum(S1,S2,...)
常用级别:RAID-0, RAID-1, RAID-5, RAID-10, RAID-50, JBOD
实现方式:
硬件实现方式
软件实现方式
CentOS 6上的软件RAID的实现:
结合内核中的md(multi devices)模块实现;
mdadm:模式化工具
命令的语法格式:
mdadm [mode] <raiddevice> [options] <component-devices>
支持的RAID级别:LINEAR, RAID0, RAID1, RAID4, RAID5, RAID6, RAID10,...
模式:
创建模式:-C
装配模式:-A
监控模式:-F
管理模式:-f, -r, -a
<raiddevice>:/dev/md#
<component-devices>:任意块设备,注意如果是分区的话,其分区类型要改为fd
-C:创建模式
-n #:使用#个块设备来创建此RAID
-l #:指明要创建的RAID的级别
-a {yes|no}:自动创建目标RAID设备的设备文件
-c CHUNK_SIZE:指明块大小, 默认值为512K
-x #:指明空闲盘的个数
例如:创建一个10GB可用空间的RAID5
混杂模式
显示RAID的详细信息
-D
mdadm -D /dev/md#
停止md设备:
mdadm -S /dev/md0
管理模式:
-f:为指定的磁盘或分区添加损坏标记
-a:添加磁盘或分区到md设备中
-r:从md设备中移除磁盘或分区
装配模式:Assemble
-A
用于将停止的RAID设备重新装配使之能够正常工作。
在装配RAID设备的时候,需要依赖/etc/mdadm.conf文件进行
mdadm -D --scan >> /etc/mdadm.conf
mdadm -S /dev/md2
mdadm -S /dev/md0
mdadm -C -n 2 -l 0 /dev/sdc /dev/sdf
mdadm -A /dev/md2
mdadm /dev/md2 -a /dev/md0
观察md的状态:
cat /proc/mkstat
watch命令:
-n #:刷新时间间隔,单位为秒,默认为1秒;
watch -n # ‘COMMAND‘
写一个脚本:模拟Linux登录界面
1) 将用户名和密码(明文即可)存放于/tmp/userinfo文件中,格式为username:password
2) 运行脚本后提示用户输入用户名和密码
3) 用户输入完成后,判断用户输入的是否正确
a) 如果输入错误的用户名,直接提示用户重新输入正确的用户名;
b) 如果用户名正确,密码错误,提示用户重新输入密码,三次连续输错,则让用户重新输入用户名
#!/bin/bash
#
while : ; do
read -p "login: " GET_USERNAME
if ! grep -q "^\<$GET_USERNAME\>" /tmp/userinfo ; then
continue
fi
COUNT=0
until false ; do
if [ $COUNT -eq 3 ] ; then
break
fi
read -p "password: " GET_PASSWORD
PASSWORD=$(grep "^\<$GET_USERNAME\>" /tmp/userinfo| cut -d: -f2)
if [ "$GET_PASSWORD" != "$PASSWORD" ] ; then
let COUNT++
continue
else
break 2
fi
done
done
echo "login successfully."
LVM2
Logical Volume Manager,逻辑卷管理器,Version 2
IBM
使用纯软件的方式组织一个或多个底层的块设备,将它们重新定义为一个逻辑块设备的解决方案;
利用内核中的dm模块实现;
dm:device mapper,设备映射表
dm模块可以将一个或多个底层块设备组织成一个逻辑块设备;
用户空间中的相应命令来向dm模块发出系统调用,就可以完成后逻辑块设备的管理;
逻辑块设备统一存放在/dev/dm-#
使用DM机制实现LVM管理的步骤:
1.创建并表示物理卷,PV
注意:如果用来创建物理卷的设备是普通分区,一定要将分区的ID修改为8e;
2.基于PV创建卷组,逻辑块设备,创建的卷组的同时指定PE的大小;
注意:一旦PE大小被指定,就不允许更改;
3.在已经创建的卷组中创建逻辑卷
4.在逻辑卷中创建文件系统(高级格式化)
5.挂载
物理卷的管理操作:
pvcreate:创建物理卷
pvdisplay:显示物理卷的详细信息
pvs:显示物理卷的简单信息
pvremove:删除物理卷
pvmove:将某个物理卷中的所有的PE移动到其他物理卷中;
卷组的管理操作:
vgcreate:创建卷组
-s #{kKmMgG}:指定PE的大小,如果省略该选项,默认的PE为4M;
vgremove:删除卷组
vgextend:扩展卷组容量,将新的pv添加到卷组中
vgextend VolumeGroupName PhysicalDevicePath [PhysicalDevicePath...]
vgreduce:缩减卷组容量,将pv从卷组中移除;在做此操作之前,应该先使用pvmove,保证被移除的pv上没有被占用的PE;
vgreduce VolumeGroupName PhysicalDevicePath [PhysicalDevicePath...]
vgdisplay:显示卷组的详细信息
vgs:显示卷组的简短信息
逻辑卷的管理操作:
lvcreate:创建逻辑卷
-L LV_SIZE(#{kK|mM|gG}):指定逻辑卷的大小,不能超过卷组的容量;
-l #%{FREE|VG|ORIGIN|PVS}:指定逻辑卷占用对应存储单元的百分比;
-n LV_NAME:指定逻辑卷的名称
-i #:在创建逻辑卷的时候,以条带的方式创建,并指明这个逻辑卷上有#个条带
-I #:在创建逻辑卷的时候,以条带的方式创建,并指明CHUNK的大小;
lvremove:移除逻辑卷
lvdisplay:显示逻辑卷的详细信息
lvs:显示逻辑卷的简短信息
lvchange:修改LV的状态
-ay:激活逻辑卷
-an:停用逻辑卷
lvextend:扩展逻辑卷的空间,
注意:一定要先扩展逻辑卷的物理边界,再扩展逻辑卷的逻辑边界;
使用ext系列文件系统的时候,resize2fs命令扩展逻辑边界;
扩大逻辑卷的物理边界:
lvextend -L [+]SIZE /PATH/TO/LVM
如果SIZE有+:表示在原有逻辑卷容量的基础上,增加SIZE空间
如果SIZE无+:表示将逻辑卷的容量扩大到SIZE空间
扩大逻辑卷的逻辑边界:
e2fsck /PATH/TO/LVM
resize2fs [-f] /PATH/TO/LVM
lvreduce:缩减逻辑卷的空间
注意:先缩减逻辑卷的逻辑边界,再缩减逻辑卷的物理边界;
使用ext系列文件系统的时候,resize2fs命令缩减逻辑边界
lvreduce -L [-]SIZE /PATH/TO/LVM
如果SIZE有-:表示在原有逻辑卷容量的基础上,削减SIZE空间
如果SIZE无-:表示将逻辑卷的容量直接削减至SIZE空间
umount /PATH/TO/LVM
e2fsck /PATH/TO/LVM //强制校验数据一致性
resize2fs -f /PATH/TO/LVM LV_SiZE //修改逻辑卷的逻辑边界,LV_SIZE为调整后的逻辑卷大小
lvchange -an /PATH/TO/LVM //关闭逻辑卷
lvreduce -L [+]SIZE /PATH/TO/LVM //修改逻辑卷的物理边界,大小要和逻辑边界保持一致
lvchange -ay /PATH/TO/LVM //重新激活逻辑卷
mount /PATH/TO/LVM /PATH/TO/LVM_MOUNT_POINT
为了更方便的使用逻辑卷,为/dev/dm-#设备创建了两个符号链接文件:
/dev/mapper/VG_NAME-LV_NAME --> ../dm-#
/dev/VG_NAME/LV_NAME --> ../dm-#
逻辑卷的快照:
快照,本身也是一种逻辑卷;目标逻辑卷的另外一个访问路径;
快照是特殊的逻辑卷,它是在生成快照时存在的逻辑卷的准确拷贝
对于需要备份或者复制的现有数据集临时拷贝以及其它操作来说,快照是最合适的选择。
快照只有在它们和原来的逻辑卷不同时才会消耗空间。
在生成快照时会分配给它一定的空间,但只有在原来的逻辑卷或者快照有所改变才会使用这些空间
当原来的逻辑卷中有所改变时,会将旧的数据复制到快照中。
快照中只含有原来的逻辑卷中更改的数据或者自生成快照后的快照中更改的数据
也可以使用lvextend扩展快照卷。
快照就是将当时的系统信息记录下来,就好像照相一般,若将来有任何数据改动了,则原始数据会被移动到快照区,没有改动的区域则由快照区和文件系统共享。
由于快照区与原本的LV共用很多PE的区块,因此快照去与被快照的LV必须要要在同一个VG上!系统恢复的时候的文件数量不能高于快照区的实际容量。
快照逻辑卷
lvcreate -L SNAPSHOT_SIZE -s -p r -n SNAPSHOT_NAME /PATH/TO/ORIGIN_LVM
-L SIZE:指定快照逻辑卷的大小
-s:创建一个快照逻辑卷
-p r:创建处理的逻辑卷是只读权限
-n SNAPSHOT_NAME:指定快照逻辑卷的名称
三个命令:
df命令:
df - report file system disk space usage
df [OPTION]... [FILE]...
-h, --human-readble:单位转换
-l, --local:只显示本地文件系统,不显示网络文件系统
-i, --inodes:显示inode使用状态
-T, --print-type:显示文件系统类型
-P, --portability:使用POSIX输出格式,更易于阅读
du命令:
du - estimate file space usage
du [OPTION]... [FILE]...
-s, sumary,:显示整个目录汇总的文件大小
-h, human-readble:单位转换
dd命令:convert and copy a file
dd [OPERAND]...
dd OPTION
常见的OPERAND:
dd if=/PATH/FROM/SRC of=/PATH/TO/DEST
bs=BYTES:block size, 复制单元大小
count=N:复制多少个bs
of=FILE:写到所命名的文件而不是到标准输出
if=FILE:从所命名文件读取而不是从标准输入
ibs=BYTES:一次读size个byte
obs=BYTES:一次写size个byte
skip=BLOCKS:从开头忽略blocks个ibs大小的块
seek=BLOCKS:从开头忽略blocks个obs大小的块
conv=conversion[,conversion...]:用指定的参数转换文件。
转换参数:
ascii:转换EBCDIC为ASCII。
ebcdic:转换ASCII为EBCDIC。
block:把每一行转换为长度为cbs的记录,不足部分用空格填充。
unblock:使每一行的长度都为cbs,不足部分用空格填充。
lcase:把大写字符转换为小写字符。
ucase:把小写字符转换为大写字符。
swab:交换输入的每对字节。
noerror:读取出错时继续读取。
notrunc:不截短输出文件。
sync:把每个输入块填充到ibs个字节,不足部分用空(NULL)字符补齐
磁盘拷贝:
~]# dd if=/dev/sda of=/dev/sdb
备份MBR:
~]# dd if=/dev/sda of=/tmp/mbr.bak bs=512 count=1
破坏MBR中的bootloader:
~]# dd if=/dev/zero of=/dev/sda bs=64 count=1 seek=446
有二进制文件fileA,size>2K。现在想从第64个字节位置开始读取,需要读取的大小是128Byts。又有fileB, 想把上面读取到的128Bytes写到第32个字节开始的位置,替换128Bytes,请问如何实现?
~]# dd if=fileA of=fileB bs=1 count=128 skip=63 seek=31 conv=notrunc
备份:
将本地的/dev/sdx整盘备份到/dev/sdy
~]# dd if=/dev/sdx of=/dev/sdy将本地的/dev/sdx整盘备份到/dev/sdy
将/dev/sdx全盘数据备份到指定路径的image文件
~]# dd if=/dev/sdx of=/path/to/image
备份/dev/sdx全盘数据,并利用gzip工具进行压缩,保存到指定路径
~]# dd if=/dev/sdx | gzip >/path/to/image.gz
恢复:
将备份文件恢复到指定盘
~]# dd if=/path/to/image of=/dev/sdx
将压缩的备份文件恢复到指定盘
~]# gzip -dc /path/to/image.gz | dd of=/dev/sdx
拷贝内存资料到硬盘
将内存里的数据拷贝到root目录下的mem.bin文件
~]# dd if=/dev/mem of=/root/mem.bin bs=1024
从光盘拷贝iso镜像
拷贝光盘数据到root文件夹下,并保存为cd.iso文件
~]# dd if=/dev/cdrom of=/root/cd.iso
销毁磁盘数据
利用随机的数据填充硬盘,在某些必要的场合可以用来销毁数据。执行此操作以后,/dev/sda1将无法挂载,创建和拷贝操作无法执行。
~]# dd if=/dev/urandom of=/dev/sda1
得到最恰当的block size
通过比较dd指令输出中所显示的命令执行时间,即可确定系统最佳的block size大小
~]# dd if=/dev/zero bs=1024 count=1000000 of=/root/1Gb.file
~]# dd if=/dev/zero bs=2048 count=500000 of=/root/1Gb.file
~]# dd if=/dev/zero bs=4096 count=250000 of=/root/1Gb.file
~]# dd if=/dev/zero bs=8192 count=125000 of=/root/1Gb.file
测试硬盘读写速度
通过上两个命令输出的执行时间,可以计算出测试硬盘的读/写速度
~]# dd if=/root/1Gb.file bs=64k | dd of=/dev/null
~]# dd if=/dev/zero of=/root/1Gb.file bs=1024 count=1000000
修复硬盘
当硬盘较长时间(比如1,2年)放置不使用后,磁盘上会产生消磁点。当磁头读到这些区域时会遇到困难,并可能导致I/O错误。当这种情况影响到硬盘的第一个扇区时,可能导致硬盘报废。上边的命令有可能使这些数据起死回生。且这个过程是安全,高效的。
~]# dd if=/dev/sda of=/dev/sda
写一个脚本:
1) 显示一个菜单给用户:
d|D) show disk usages.
m|M) show memory usages.
s|S) show swap usages.
q|Q) quit.
2) 当用户给定选项后显示相应的内容;
3) 每次执行完成后不退出脚本,而是提示用户可以继续查看其它信息;直到用户键入q、Q、quit或QUIT退出;
4) 如果用户给出的不是菜单中可用的选项,则告诉用户选项错误,需要重新选择;
#!/bin/bash
#
menu(){
cat << EOF
d|D) show disk usages.
m|M) show memory usages.
s|S) show swap usages.
q|Q) quit.
EOF
}
while : ;do
menu
read -p "please give me choice:" NUM
case $NUM in
d|D)
df -hTP
continue
;;
m|M)
free -m | head -2
continue
;;
s|S)
free -m | head -1
free -m | tail -1
continue
;;
[Qq]|[Qq][Uu][Ii][Tt])
break
;;
*)
echo "Warning: please choose another option"
continue
;;
esac
done
btrfs
Balance-tree FS
Better FS
Butter FS
2007年有Oracle开源,到目前为止,仍然是技术预览版(Technical Preview)。
btrfs开发目的就是取代ext系列文件系统,成为下一代Linux的标准文件系统。
在Linux上运行的btrfs,遵循GPL开源协定;2014年8月,稳定版推出。
btrfs的特性:
1.可扩展性
extent是最小管理逻辑单元,每个extent是由一组连续的block组成
ext文件系统inode数量是一定的,btrfs的inode数量是动态可调整的
2.多物理卷支持:
btrfs可以跨越多个物理设备,动态的增加或减少设备来达到扩容或缩容的目的;
而且,从技术角度来讲,btrfs还支持RAID-0,RAID-1,RAID-5,RAID-10等
还支持在线添加,删除,及修改设备;
3.写时复制更新机制(CoW, Copy on Write)
所谓的CoW,就是每次写磁盘数据的时候,先将当前块的数据复制到一个新块中,然后在新块中进行数据更新写入,当新块写入完成后,只需要将原来指向旧块的指针指向新块即可。
4.双重校验机制——数据及元数据都有校验码:checksum
5.支持子卷:
6.快照卷:
对父卷做快照
对子卷做快照
对快照卷做快照
7.透明压缩,隐形压缩:
mkfs.btrfs
选项:
-L|--label <name>:为即将创建的btrfs文件系统指定卷标
-d|--data <type>:为数据存储指定类型;可以选择的类型有:raid0, raid1, raid5, raid6, raid10 or single
-m|--metadata <profile>:指定元数据的存储方式;可以选择的类型有:raid0, raid1, raid5, raid6, raid10, single or dup
-O|--features <feature1>[,<feature2>...]:指定btrfs文件系统的特性,如果想要查看哪些特性,可以使用命令:mkfs.btrfs -O list-all
可以用支持btrfs文件系统的mount命令中使用下列方式开启透明压缩功能:
mount -o compress={lzo|zlib} DEVICE MOUNT_POINT
btrfs
btrfs - control a btrfs filesystem
btrfs <command> [<args>]
btrfs filesystem show
查看btrfs文件系统的详细属性;
btrfs filesystem df MOUNT_POINT
查看文件系统的挂载和使用情况
例:btrfs filesystem df /mnt/btrfs/
在线修改文件系统大小:
btrfs filesystem resize {+|-}SIZE[KkMmGgTtPpEe] MOUNT_POINT
例:btrfs filesystem resize -15G /mnt/btrfs/
btrfs filesystem resize +5G /mnt/btrfs/
btrfs filesystem resize max /mnt/btrfs/
向btrfs文件系统中添加或删除设备
btrfs device
btrfs device add [options] <device> [<device>...] <path>
向文件系统中添加一个新设备
btrfs device delete <device> [<device>...] <path>
从文件系统中删除一个设备
平衡数据:
btrfs balance start [options] <path>
开启跨设备的chunk的数据平衡
-mconvert={radi0|raid1|raid5|radi10|raid6|single|dup}
改变元数据的数据平衡布局方式
例:btrfs balance start -mconvert=raid5 /mnt/btrfs/
-dconvert={radi0|raid1|raid5|radi10|raid6|single}
改变数据的数据平衡布局方式
例:btrfs balance start -dconvert=raid6 /mnt/btrfs/
btrfs balance pause <path>
暂停数据平衡
btrfs balance cancel <path>
取消正在进行的或已经暂停的数据平衡
btrfs balance resume <path>
恢复被打断的数据平衡
btrfs balance status [-v] <path>
显示正在进行的或已经暂停的数据平衡的状态信息
子卷管理:
btrfs subvolume create [-i <qgroupid>] [<dest>/]<name>
创建子卷
例:btrfs subvolume create /mnt/btrfs/mysub1/
btrfs subvolume delete [options] <subvolume> [<subvolume>...]
删除子卷
例:btrfs subvolume delete /mnt/btrfs/mysub1/
btrfs subvolume show <subvol-path>
显示子卷的信息
例:btrfs subvolume show /mnt/btrfs/mysub1/
子卷类似于ext文件系统中的将其他分区挂载到根目录下的某个空闲子目录的操作;
快照:
btrfs subvolume snapshot [-r] [-i <qgroupid>] <source> <dest>|[<dest>/]<name>
创建指定子卷的快照卷
例:btrfs subvolume snapshot /mnt/btrfs/mysub1/ /mnt/btrfs/snap_mysub1
将btrfs和ext系列进行转换:
btrfs-convert
btrfs-convert - convert from ext2/3/4 filesystem to btrfs or rollback
btrfs-convert [options] <device>
将文件系统从ext转换为btrfs:
~]# btrfs-convert /dev/sdb1
注意:/dev/sdb1分区,应该事先格式化为ext系列文件系统;
将文件系统从btrfs回滚到ext
~]# btrfs-convert -r /dev/sdb1