mount和/etc/fstab文件详解,inode和软硬链接,RAID和LVM2(第8天)
前戏:
内核与ramdisk到底是什么关系?系统在启动的过程中,内核与ramdisk分别扮演什么角色啊?
我对启动的过程一直不明白,懂的朋友帮我讲讲。
谢谢
精彩回答:
ramdisk一个作用就是用来解决boot过程中mount根文件系统的“先有鸡还是先有蛋”的问题的。
一般来说,根文件系统在形形色色的存储设备上,不同的设备又要不同的硬件厂商的驱动,比如intel的南桥自然需要intel的ide/sata驱动,VIA的南桥需要VIA的ide/sata驱动,根文件系统也有不同的文件系统的可能,比如ubuntu发行版可能一般用ext3,suse可能就不是了,不同的文件系统也需要不同的文件系统模块;假如把所有驱动/模块都编译进内核(注:即编一个通用的、万能的内核),那自然没问题,但是这样就违背了“内核”的精神或本质,所以一般来说驱动/模块都驻留在根文件系统本身上/lib/modules/xxx,那么“鸡蛋”问题就来了,现在要mount根文件系统却需要根文件系统上的模块文件,怎么办?于是,就想出ramdisk,内核总是能安装ramdisk的(注:这是因为ramdisk临时文件系统和内核一样,也是由bootloader通过低级读写命令(如uboot用nand read,而不用通过文件系统层提供的高级读写接口)加载进内存,因此内核可以挂载内存里ramdisk文件系统),然后把所有可能需要的驱动/模块都放在ramdisk上,首先,让内核将ramdisk当作根文件系统来安装,然后再用这个根文件系统上的驱动来安装真正的根文件系统,就将这个矛盾问题解决了
1:文件系统管理
将额外文件系统与根文件系统某现存的目录建立起关联关系,进而使得此目录做为其它文件系统访问入口的行为称之为挂载;
解除此关联关系的过程称之为卸载;
把设备关联挂载点:Mount Point
mount
卸载时:可使用设备,也可以使用挂载点
umount
注意:必须退出挂载点,才能umount成功
注意:挂载点下原有文件在挂载完成后会被临时隐藏;
挂载方法:mount DEVICE MOUNT_POINT
mount:通过查看/etc/mtab文件显示当前系统已挂载的所有设备
mount [-fnrsvw] [-t vfstype] [-o options] device dir 将device挂载到根文件系统上的dir挂载点
device:指明要挂载的设备;
(1) 设备文件:例如/dev/sda5
(2) 卷标指明的设备:-L 'LABEL', 例如 -L 'MYDATA'
(3) UUID指明的设备, -U 'UUID':例如 -U '0c50523c-43f1-45e7-85c0-a126711d406e'
(4) 伪文件系统名称:proc, sysfs, devtmpfs, configfs
dir:挂载点
事先存在;建议使用空目录;
进程正在使用中的设备无法被卸载;
常用命令选项:
-v 表示输出详细信息
-t vsftype:指定要挂载的设备上的文件系统类型,可以不指定;
-r 表示readonly,只读挂载;
-w 表示read and write, 读写挂载;
-n: 每个文件系统挂载后默认会添加到/etc/mtab中,这个选项表示不更新/etc/mtab;
-a:自动挂载所有支持自动挂载的设备;(定义在了/etc/fstab文件中,且挂载选项中有“自动挂载”功能)
-L 'LABEL': 以卷标指定挂载设备;
-U 'UUID': 以UUID指定要挂载的设备;
-B, --bind: 绑定目录到另一个目录上;
注意:查看内核追踪到的已挂载的所有设备:cat /proc/mounts
-o options:(挂载文件系统的选项,表示要指明的挂载特性)
async:异步模式;
sync:同步模式;频繁发起I/O事件,数据可靠性高
atime/noatime:更新目录和文件的访问时间戳
diratime/nodiratime:更新目录的访问时间戳
auto/noauto:是否支持自动挂载
exec/noexec:是否支持将文件系统上应用程序运行为进程
dev/nodev:是否支持在此文件系统上使用设备文件;
suid/nosuid:是否支持suid
remount:重新挂载
ro:只读挂载
rw: 读写挂载
user/nouser:是否允许普通用户挂载此设备
acl:启用此文件系统上的acl访问控制列表功能
注意:上述选项可多个同时使用,彼此使用逗号分隔;
默认挂载选项:defaults相当于rw, suid, dev, exec, auto, nouser, and async
例子 mount -o rw,sync /dev/sdb1 /mnt/
卸载命令:
# umount DEVICE
# umount MOUNT_POINT
查看正在访问指定文件系统的进程:
# fuser -v MOUNT_POINT
终止所有在正访问指定的文件系统的进程:
# fuser -km MOUNT_POINT
挂载交换分区:
启用:swapon
swapon [OPTION]... [DEVICE]
-a:激活所有的交换分区,使用这个选项就不需要指定DEVICE;
-p PRIORITY:指定优先级;
禁用:swapoff
swapoff [OPTION]... [DEVICE]
内存空间使用状态:
free [OPTION]
-m: 以MB为单位
-g: 以GB为单位
文件系统空间挂载到哪个目录,占用等信息的查看工具:
df [OPTION]... [FILE]...
-h: human-readable 例如 df -h /dev/sdb1
-i:inodes instead of blocks
-P: 以Posix兼容的格式输出;
查看某目录总体空间占用状态:
du:
du [OPTION]... DIR
-h: human-readable
-s: summary 例如 du -sh /etc
命令总结:mount, umount, free, df, du, swapon, swapoff, fuser
文件挂载的配置文件:/etc/fstab
使用mount命令挂载的文件系统,在系统重启之后就失效了,如果需要在系统重启之后就自动挂载需要的文件系统,则可以使用配置文件/etc/fstab。
该文件每行定义一个要挂载的文件系统;
每一列的定义如下,共6列:
第1列是要挂载的设备或伪文件系统:可以是设备文件、LABEL(LABEL="")、UUID(UUID="")、伪文件系统名称(proc, sysfs)
第2列是挂载点
第3列是文件系统类型
第4列是挂载选项:就是mount命令中的-o里的那些选项
第5列是转储频率:0表示不做备份;1表示每天转储;2表示每隔一天转储
第6列是自检次序:0表示不自检;1表示首先自检,一般只有rootfs才用1; ....
例子:/dev/sdb1 /mnt/sdb1 btrfs defaults 0 0 表示将/dev/sdb1设备挂载到/mnt/sdb1目录下
2:文件系统上的其它概念
inode:index node 索引节点
一个inode存储单个文件的元数据(文件的属性),还存储了这个文件占用的磁盘块的编号。
inode的地址指针,有直接指针,间接指针,三级指针。
inode bitmap:对位标识每个inode空闲与否的状态信息;
目录占据磁盘块,目录是一张表,表中存储其下的文件名和目录名和inode的对应关系。
硬链接就是指向同一个文件(inode)的两个或多个不同的路径。
链接文件有硬链接文件和软连接文件:
硬链接:
不能够对目录进行;
不能跨分区进行;
指向同一个inode的多个不同路径;创建文件的硬链接即为inode创建新的引用路径,因此会增加此inode的引用计数;
例子 ln /etc/fstab /tmp/fstab.txt 创建fstab的硬链接文件fstab.txt,因此/tmp/fstab.txt和/etc/fstab两个不同的路径就指向的是同一个inode。
符号链接:
可以对目录进行;
可以跨分区;
指向的是另一个文件的路径;其大小为指向的路径字符串的长度;不增加或减少目标文件inode的引用计数;
ln [-sv] SRC DEST
-s:symbolic link 表示创建符号链接
-v: verbose
文件管理操作对文件的影响:
文件删除:
文件复制:
文件移动:
练习:
1、创建一个20G的文件系统,块大小为2048,文件系统ext4,卷标为TEST,要求此分区开机后自动挂载至/testing目录,且默认有acl挂载选项;
(1) 创建20G分区;
(2) 格式化:mke2fs -t ext4 -b 2048 -L 'TEST' /dev/DEVICE
(3) 编辑/etc/fstab文件
LABEL='TEST' /testing ext4 defaults,acl 0 0
2、创建一个5G的文件系统,卷标HUGE,要求此分区开机自动挂载至/mogdata目录,文件系统类型为ext3;
3、写一个脚本,完成如下功能:
(1) 列出当前系统识别到的所有磁盘设备;
(2) 如磁盘数量为1,则显示其空间使用信息;否则,则显示最后一个磁盘上的空间使用信息;
#!/bin/bash
number=`fdisk -l | grep -E -o "^Disk /dev/[sh]d[a-z]" | cut -d" " -f2 | wc -l`
all_disk=`fdisk -l | grep -E -o "^Disk /dev/[sh]d[a-z]" | cut -d" " -f2`
echo $all_disk
if [ $number -eq 1 ];then
fdisk -l /dev/[sh]da
else
fdisk -l `echo $all_disk | tail -1`
fi
3:bash脚本编程之用户交互:
read [option]... [name ...]
-p 'PROMPT' 例如 read -p "Enter your name!" name
-t TIMEOUT
bash -n /path/to/some_script
检测脚本中的语法错误
bash -x /path/to/some_script
调试执行
示例:
#!/bin/bash
# Version: 0.0.1
# Author: MageEdu
# Description: read testing
read -p "Enter a disk special file: " diskfile
[ -z "$diskfile" ] && echo "Fool" && exit 1
if fdisk -l | grep "^Disk $diskfile" &> /dev/null; then
fdisk -l $diskfile
else
echo "Wrong disk special file."
exit 2
fi
4:RAID
Redundant Arrays of Inexpensive Disks
Independent
独立冗余磁盘阵列
提高IO能力:磁盘并行读写;
提高耐用性;磁盘冗余来实现
级别:多块磁盘组织在一起的工作方式有所不同;
RAID实现的方式:
外接式磁盘阵列:通过扩展卡提供适配能力
内接式RAID:主板集成RAID控制器
Software RAID
级别:level
RAID-0:0, 条带卷,strip;
RAID-1: 1, 镜像卷,mirror;
RAID-2
..
RAID-5:
RAID-6
RAID10
RAID01
RAID-0:
读、写性能提升;
可用空间:N*min(S1,S2,...)
无容错能力
最少磁盘数:2, 2+
例子:例如将一个数据分成4个chunk,第1,3个chunk存储到磁盘1中,第2,4个chunk存储到磁盘2中。
RAID-1:
读性能提升、写性能略有下降;
可用空间:1*min(S1,S2,...)
有冗余能力
最少磁盘数:2, 2+
例子:例如将一个数据分成4个chunk,第1个磁盘存储这4个chunk,第2个磁盘也存储这4个chunk。
RAID-4:
1101, 0110, 1011
例子:例如将一个数据分成4个chunk,第1,3个chunk存储到磁盘1中,第2,4个chunk存储到磁盘2中,第3个磁盘存储第1个chunk和第2个chunk运算校验码,存储第3个chunk和第4个chunk的运算校验码。
RAID-5:
读、写性能提升
可用空间:(N-1)*min(S1,S2,...)
有容错能力:1块磁盘
最少磁盘数:3, 3+
同RAID4,只是所有磁盘轮流当校验盘。
RAID-6:
读、写性能提升
可用空间:(N-2)*min(S1,S2,...)
有容错能力:2块磁盘
最少磁盘数:4, 4+
混合类型
RAID-10:
读、写性能提升
可用空间:N*min(S1,S2,...)/2
有容错能力:每组镜像最多只能坏一块;
最少磁盘数:4, 4+
RAID-01:
RAID-50、RAID7
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>: 任意块设备
-C: 创建模式,创建完成之后,必须使用mkfs命令安装文件系统,然后才能挂载使用
-n #: 使用#个块设备来创建此RAID;
-l #:指明要创建的RAID的级别;
-a {yes|no}:自动创建目标RAID设备的设备文件;
-c CHUNK_SIZE: 指明块大小;
-x #: 指明空闲盘的个数;
例如:创建一个10G可用空间的RAID5;
mdadm -C /dev/md0 -n 3 -l 5 -a yes -x 1 /dev/sdb{7,8,9,10}
mkfs -t ext4 /dev/md0
mount /dev/md0 /mydata
-D:显示raid的详细信息;
mdadm -D /dev/md#
管理模式:
-f: 标记指定磁盘为损坏;
-a: 添加磁盘
-r: 移除磁盘
观察md的状态:
cat /proc/mdstat
停止md设备:
mdadm -S /dev/md#
watch命令:用来查看别的命令的执行过程
-n #: 刷新间隔,单位是秒;
watch -n# 'COMMAND'
练习1:创建一个可用空间为10G的RAID1设备,要求其chunk大小为128k,文件系统为ext4,有一个空闲盘,开机可自动挂载至/backup目录;
练习2:创建一个可用空间为10G的RAID10设备,要求其chunk大小为256k,文件系统为ext4,开机可自动挂载至/mydata目录;
博客作业:raid各级别特性;
5:LVM
LVM: Logical Volume Manager, Version: 2
dm: device mapper,将一个或多个底层块设备组织成一个逻辑设备的模块;
设备文件为如下3个:
/dev/dm-#
/dev/mapper/VG_NAME-LV_NAME 例如 /dev/mapper/vol0-root
/dev/VG_NAME/LV_NAME 例如 /dev/vol0/root
原理:多个物理卷(PV),组成成一个卷组(VG),在卷组上面创建逻辑卷(LV),LV是可以随时扩展的。VG的分割单位是PE,对应到LV的分割单位是LE。
pv管理工具:
pvs:简要pv信息显示
pvdisplay:显示pv的详细信息
pvcreate /dev/DEVICE: 创建pv,例如pvcreate /dev/sda3 使用/dev/sda3创建为一个pv
vg管理工具:
vgs 简要vg信息显示
vgdisplay 显示vg的详细信息
vgcreate [-s #[kKmMgGtTpPeE]] VolumeGroupName PhysicalDevicePath [PhysicalDevicePath...] -s指定大小
vgextend VolumeGroupName PhysicalDevicePath [PhysicalDevicePath...]
扩展卷组
vgreduce VolumeGroupName PhysicalDevicePath [PhysicalDevicePath...]
vg缩减要先对要缩减的pv做pvmove
vgremove
lv管理工具:
lvs
lvdisplay
lvcreate -L #[mMgGtT] -n NAME VolumeGroup -L用于指定逻辑卷大小
创建lv之后,可以使用mkfs安装文件系统,然后挂载使用
lvremove /dev/VG_NAME/LV_NAME
扩展逻辑卷分2步:
# lvextend -L [+]#[mMgGtT] /dev/VG_NAME/LV_NAME
# resize2fs /dev/VG_NAME/LV_NAME
缩减逻辑卷步骤如下:
# umount /dev/VG_NAME/LV_NAME 先卸载文件系统
# e2fsck -f /dev/VG_NAME/LV_NAME 检测文件系统
# resize2fs /dev/VG_NAME/LV_NAME #[mMgGtT]
# lvreduce -L [-]#[mMgGtT] /dev/VG_NAME/LV_NAME
# mount
快照:snapshot,也是一种逻辑卷
lvcreate -L #[mMgGtT] -p r -s -n snapshot_lv_name original_lv_name
练习1:创建一个至少有两个PV组成的大小为20G的名为testvg的VG;要求PE大小为16MB, 而后在卷组中创建大小为5G的逻辑卷testlv;挂载至/users目录;
练习2: 新建用户archlinux,要求其家目录为/users/archlinux,而后su切换至archlinux用户,复制/etc/pam.d目录至自己的家目录;
练习3:扩展testlv至7G,要求archlinux用户的文件不能丢失;
练习4:收缩testlv至3G,要求archlinux用户的文件不能丢失;
练习5:对testlv创建快照,并尝试基于快照备份数据,验正快照的功能;
6:文件系统挂载使用之光盘使用:
挂载光盘设备:
光驱如果是IDE接口,则光盘对应的设备文件是/dev/hdc;如果是SATA接口,则设备文件是/dev/sr0
如下的符号链接文件链接至上面提到的光盘设备文件:
/dev/cdrom
/dev/cdrw
/dev/dvd
/dev/dvdrw
mount -r /dev/cdrom /media/cdrom 将光盘设备挂载到/media/chrom目录上使用
umount /dev/cdrom
7:dd命令的使用 convert and copy a file
用法:dd if=/PATH/FROM/SRC of=/PATH/TO/DEST
bs=#:block size, 复制单元大小;
count=#:复制多少个bs;
磁盘拷贝 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=256 count=1
两个特殊设备:
/dev/null: 数据黑洞;
/dev/zero:吐零机;
内核与ramdisk到底是什么关系?系统在启动的过程中,内核与ramdisk分别扮演什么角色啊?
我对启动的过程一直不明白,懂的朋友帮我讲讲。
谢谢
精彩回答:
ramdisk一个作用就是用来解决boot过程中mount根文件系统的“先有鸡还是先有蛋”的问题的。
一般来说,根文件系统在形形色色的存储设备上,不同的设备又要不同的硬件厂商的驱动,比如intel的南桥自然需要intel的ide/sata驱动,VIA的南桥需要VIA的ide/sata驱动,根文件系统也有不同的文件系统的可能,比如ubuntu发行版可能一般用ext3,suse可能就不是了,不同的文件系统也需要不同的文件系统模块;假如把所有驱动/模块都编译进内核(注:即编一个通用的、万能的内核),那自然没问题,但是这样就违背了“内核”的精神或本质,所以一般来说驱动/模块都驻留在根文件系统本身上/lib/modules/xxx,那么“鸡蛋”问题就来了,现在要mount根文件系统却需要根文件系统上的模块文件,怎么办?于是,就想出ramdisk,内核总是能安装ramdisk的(注:这是因为ramdisk临时文件系统和内核一样,也是由bootloader通过低级读写命令(如uboot用nand read,而不用通过文件系统层提供的高级读写接口)加载进内存,因此内核可以挂载内存里ramdisk文件系统),然后把所有可能需要的驱动/模块都放在ramdisk上,首先,让内核将ramdisk当作根文件系统来安装,然后再用这个根文件系统上的驱动来安装真正的根文件系统,就将这个矛盾问题解决了
1:文件系统管理
将额外文件系统与根文件系统某现存的目录建立起关联关系,进而使得此目录做为其它文件系统访问入口的行为称之为挂载;
解除此关联关系的过程称之为卸载;
把设备关联挂载点:Mount Point
mount
卸载时:可使用设备,也可以使用挂载点
umount
注意:必须退出挂载点,才能umount成功
注意:挂载点下原有文件在挂载完成后会被临时隐藏;
挂载方法:mount DEVICE MOUNT_POINT
mount:通过查看/etc/mtab文件显示当前系统已挂载的所有设备
mount [-fnrsvw] [-t vfstype] [-o options] device dir 将device挂载到根文件系统上的dir挂载点
device:指明要挂载的设备;
(1) 设备文件:例如/dev/sda5
(2) 卷标指明的设备:-L 'LABEL', 例如 -L 'MYDATA'
(3) UUID指明的设备, -U 'UUID':例如 -U '0c50523c-43f1-45e7-85c0-a126711d406e'
(4) 伪文件系统名称:proc, sysfs, devtmpfs, configfs
dir:挂载点
事先存在;建议使用空目录;
进程正在使用中的设备无法被卸载;
常用命令选项:
-v 表示输出详细信息
-t vsftype:指定要挂载的设备上的文件系统类型,可以不指定;
-r 表示readonly,只读挂载;
-w 表示read and write, 读写挂载;
-n: 每个文件系统挂载后默认会添加到/etc/mtab中,这个选项表示不更新/etc/mtab;
-a:自动挂载所有支持自动挂载的设备;(定义在了/etc/fstab文件中,且挂载选项中有“自动挂载”功能)
-L 'LABEL': 以卷标指定挂载设备;
-U 'UUID': 以UUID指定要挂载的设备;
-B, --bind: 绑定目录到另一个目录上;
注意:查看内核追踪到的已挂载的所有设备:cat /proc/mounts
-o options:(挂载文件系统的选项,表示要指明的挂载特性)
async:异步模式;
sync:同步模式;频繁发起I/O事件,数据可靠性高
atime/noatime:更新目录和文件的访问时间戳
diratime/nodiratime:更新目录的访问时间戳
auto/noauto:是否支持自动挂载
exec/noexec:是否支持将文件系统上应用程序运行为进程
dev/nodev:是否支持在此文件系统上使用设备文件;
suid/nosuid:是否支持suid
remount:重新挂载
ro:只读挂载
rw: 读写挂载
user/nouser:是否允许普通用户挂载此设备
acl:启用此文件系统上的acl访问控制列表功能
注意:上述选项可多个同时使用,彼此使用逗号分隔;
默认挂载选项:defaults相当于rw, suid, dev, exec, auto, nouser, and async
例子 mount -o rw,sync /dev/sdb1 /mnt/
卸载命令:
# umount DEVICE
# umount MOUNT_POINT
查看正在访问指定文件系统的进程:
# fuser -v MOUNT_POINT
终止所有在正访问指定的文件系统的进程:
# fuser -km MOUNT_POINT
挂载交换分区:
启用:swapon
swapon [OPTION]... [DEVICE]
-a:激活所有的交换分区,使用这个选项就不需要指定DEVICE;
-p PRIORITY:指定优先级;
禁用:swapoff
swapoff [OPTION]... [DEVICE]
内存空间使用状态:
free [OPTION]
-m: 以MB为单位
-g: 以GB为单位
文件系统空间挂载到哪个目录,占用等信息的查看工具:
df [OPTION]... [FILE]...
-h: human-readable 例如 df -h /dev/sdb1
-i:inodes instead of blocks
-P: 以Posix兼容的格式输出;
查看某目录总体空间占用状态:
du:
du [OPTION]... DIR
-h: human-readable
-s: summary 例如 du -sh /etc
命令总结:mount, umount, free, df, du, swapon, swapoff, fuser
文件挂载的配置文件:/etc/fstab
使用mount命令挂载的文件系统,在系统重启之后就失效了,如果需要在系统重启之后就自动挂载需要的文件系统,则可以使用配置文件/etc/fstab。
该文件每行定义一个要挂载的文件系统;
每一列的定义如下,共6列:
第1列是要挂载的设备或伪文件系统:可以是设备文件、LABEL(LABEL="")、UUID(UUID="")、伪文件系统名称(proc, sysfs)
第2列是挂载点
第3列是文件系统类型
第4列是挂载选项:就是mount命令中的-o里的那些选项
第5列是转储频率:0表示不做备份;1表示每天转储;2表示每隔一天转储
第6列是自检次序:0表示不自检;1表示首先自检,一般只有rootfs才用1; ....
例子:/dev/sdb1 /mnt/sdb1 btrfs defaults 0 0 表示将/dev/sdb1设备挂载到/mnt/sdb1目录下
2:文件系统上的其它概念
inode:index node 索引节点
一个inode存储单个文件的元数据(文件的属性),还存储了这个文件占用的磁盘块的编号。
inode的地址指针,有直接指针,间接指针,三级指针。
inode bitmap:对位标识每个inode空闲与否的状态信息;
目录占据磁盘块,目录是一张表,表中存储其下的文件名和目录名和inode的对应关系。
硬链接就是指向同一个文件(inode)的两个或多个不同的路径。
链接文件有硬链接文件和软连接文件:
硬链接:
不能够对目录进行;
不能跨分区进行;
指向同一个inode的多个不同路径;创建文件的硬链接即为inode创建新的引用路径,因此会增加此inode的引用计数;
例子 ln /etc/fstab /tmp/fstab.txt 创建fstab的硬链接文件fstab.txt,因此/tmp/fstab.txt和/etc/fstab两个不同的路径就指向的是同一个inode。
符号链接:
可以对目录进行;
可以跨分区;
指向的是另一个文件的路径;其大小为指向的路径字符串的长度;不增加或减少目标文件inode的引用计数;
ln [-sv] SRC DEST
-s:symbolic link 表示创建符号链接
-v: verbose
文件管理操作对文件的影响:
文件删除:
文件复制:
文件移动:
练习:
1、创建一个20G的文件系统,块大小为2048,文件系统ext4,卷标为TEST,要求此分区开机后自动挂载至/testing目录,且默认有acl挂载选项;
(1) 创建20G分区;
(2) 格式化:mke2fs -t ext4 -b 2048 -L 'TEST' /dev/DEVICE
(3) 编辑/etc/fstab文件
LABEL='TEST' /testing ext4 defaults,acl 0 0
2、创建一个5G的文件系统,卷标HUGE,要求此分区开机自动挂载至/mogdata目录,文件系统类型为ext3;
3、写一个脚本,完成如下功能:
(1) 列出当前系统识别到的所有磁盘设备;
(2) 如磁盘数量为1,则显示其空间使用信息;否则,则显示最后一个磁盘上的空间使用信息;
#!/bin/bash
number=`fdisk -l | grep -E -o "^Disk /dev/[sh]d[a-z]" | cut -d" " -f2 | wc -l`
all_disk=`fdisk -l | grep -E -o "^Disk /dev/[sh]d[a-z]" | cut -d" " -f2`
echo $all_disk
if [ $number -eq 1 ];then
fdisk -l /dev/[sh]da
else
fdisk -l `echo $all_disk | tail -1`
fi
3:bash脚本编程之用户交互:
read [option]... [name ...]
-p 'PROMPT' 例如 read -p "Enter your name!" name
-t TIMEOUT
bash -n /path/to/some_script
检测脚本中的语法错误
bash -x /path/to/some_script
调试执行
示例:
#!/bin/bash
# Version: 0.0.1
# Author: MageEdu
# Description: read testing
read -p "Enter a disk special file: " diskfile
[ -z "$diskfile" ] && echo "Fool" && exit 1
if fdisk -l | grep "^Disk $diskfile" &> /dev/null; then
fdisk -l $diskfile
else
echo "Wrong disk special file."
exit 2
fi
4:RAID
Redundant Arrays of Inexpensive Disks
Independent
独立冗余磁盘阵列
提高IO能力:磁盘并行读写;
提高耐用性;磁盘冗余来实现
级别:多块磁盘组织在一起的工作方式有所不同;
RAID实现的方式:
外接式磁盘阵列:通过扩展卡提供适配能力
内接式RAID:主板集成RAID控制器
Software RAID
级别:level
RAID-0:0, 条带卷,strip;
RAID-1: 1, 镜像卷,mirror;
RAID-2
..
RAID-5:
RAID-6
RAID10
RAID01
RAID-0:
读、写性能提升;
可用空间:N*min(S1,S2,...)
无容错能力
最少磁盘数:2, 2+
例子:例如将一个数据分成4个chunk,第1,3个chunk存储到磁盘1中,第2,4个chunk存储到磁盘2中。
RAID-1:
读性能提升、写性能略有下降;
可用空间:1*min(S1,S2,...)
有冗余能力
最少磁盘数:2, 2+
例子:例如将一个数据分成4个chunk,第1个磁盘存储这4个chunk,第2个磁盘也存储这4个chunk。
RAID-4:
1101, 0110, 1011
例子:例如将一个数据分成4个chunk,第1,3个chunk存储到磁盘1中,第2,4个chunk存储到磁盘2中,第3个磁盘存储第1个chunk和第2个chunk运算校验码,存储第3个chunk和第4个chunk的运算校验码。
RAID-5:
读、写性能提升
可用空间:(N-1)*min(S1,S2,...)
有容错能力:1块磁盘
最少磁盘数:3, 3+
同RAID4,只是所有磁盘轮流当校验盘。
RAID-6:
读、写性能提升
可用空间:(N-2)*min(S1,S2,...)
有容错能力:2块磁盘
最少磁盘数:4, 4+
混合类型
RAID-10:
读、写性能提升
可用空间:N*min(S1,S2,...)/2
有容错能力:每组镜像最多只能坏一块;
最少磁盘数:4, 4+
RAID-01:
RAID-50、RAID7
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>: 任意块设备
-C: 创建模式,创建完成之后,必须使用mkfs命令安装文件系统,然后才能挂载使用
-n #: 使用#个块设备来创建此RAID;
-l #:指明要创建的RAID的级别;
-a {yes|no}:自动创建目标RAID设备的设备文件;
-c CHUNK_SIZE: 指明块大小;
-x #: 指明空闲盘的个数;
例如:创建一个10G可用空间的RAID5;
mdadm -C /dev/md0 -n 3 -l 5 -a yes -x 1 /dev/sdb{7,8,9,10}
mkfs -t ext4 /dev/md0
mount /dev/md0 /mydata
-D:显示raid的详细信息;
mdadm -D /dev/md#
管理模式:
-f: 标记指定磁盘为损坏;
-a: 添加磁盘
-r: 移除磁盘
观察md的状态:
cat /proc/mdstat
停止md设备:
mdadm -S /dev/md#
watch命令:用来查看别的命令的执行过程
-n #: 刷新间隔,单位是秒;
watch -n# 'COMMAND'
练习1:创建一个可用空间为10G的RAID1设备,要求其chunk大小为128k,文件系统为ext4,有一个空闲盘,开机可自动挂载至/backup目录;
练习2:创建一个可用空间为10G的RAID10设备,要求其chunk大小为256k,文件系统为ext4,开机可自动挂载至/mydata目录;
博客作业:raid各级别特性;
5:LVM
LVM: Logical Volume Manager, Version: 2
dm: device mapper,将一个或多个底层块设备组织成一个逻辑设备的模块;
设备文件为如下3个:
/dev/dm-#
/dev/mapper/VG_NAME-LV_NAME 例如 /dev/mapper/vol0-root
/dev/VG_NAME/LV_NAME 例如 /dev/vol0/root
原理:多个物理卷(PV),组成成一个卷组(VG),在卷组上面创建逻辑卷(LV),LV是可以随时扩展的。VG的分割单位是PE,对应到LV的分割单位是LE。
pv管理工具:
pvs:简要pv信息显示
pvdisplay:显示pv的详细信息
pvcreate /dev/DEVICE: 创建pv,例如pvcreate /dev/sda3 使用/dev/sda3创建为一个pv
vg管理工具:
vgs 简要vg信息显示
vgdisplay 显示vg的详细信息
vgcreate [-s #[kKmMgGtTpPeE]] VolumeGroupName PhysicalDevicePath [PhysicalDevicePath...] -s指定大小
vgextend VolumeGroupName PhysicalDevicePath [PhysicalDevicePath...]
扩展卷组
vgreduce VolumeGroupName PhysicalDevicePath [PhysicalDevicePath...]
vg缩减要先对要缩减的pv做pvmove
vgremove
lv管理工具:
lvs
lvdisplay
lvcreate -L #[mMgGtT] -n NAME VolumeGroup -L用于指定逻辑卷大小
创建lv之后,可以使用mkfs安装文件系统,然后挂载使用
lvremove /dev/VG_NAME/LV_NAME
扩展逻辑卷分2步:
# lvextend -L [+]#[mMgGtT] /dev/VG_NAME/LV_NAME
# resize2fs /dev/VG_NAME/LV_NAME
缩减逻辑卷步骤如下:
# umount /dev/VG_NAME/LV_NAME 先卸载文件系统
# e2fsck -f /dev/VG_NAME/LV_NAME 检测文件系统
# resize2fs /dev/VG_NAME/LV_NAME #[mMgGtT]
# lvreduce -L [-]#[mMgGtT] /dev/VG_NAME/LV_NAME
# mount
快照:snapshot,也是一种逻辑卷
lvcreate -L #[mMgGtT] -p r -s -n snapshot_lv_name original_lv_name
练习1:创建一个至少有两个PV组成的大小为20G的名为testvg的VG;要求PE大小为16MB, 而后在卷组中创建大小为5G的逻辑卷testlv;挂载至/users目录;
练习2: 新建用户archlinux,要求其家目录为/users/archlinux,而后su切换至archlinux用户,复制/etc/pam.d目录至自己的家目录;
练习3:扩展testlv至7G,要求archlinux用户的文件不能丢失;
练习4:收缩testlv至3G,要求archlinux用户的文件不能丢失;
练习5:对testlv创建快照,并尝试基于快照备份数据,验正快照的功能;
6:文件系统挂载使用之光盘使用:
挂载光盘设备:
光驱如果是IDE接口,则光盘对应的设备文件是/dev/hdc;如果是SATA接口,则设备文件是/dev/sr0
如下的符号链接文件链接至上面提到的光盘设备文件:
/dev/cdrom
/dev/cdrw
/dev/dvd
/dev/dvdrw
mount -r /dev/cdrom /media/cdrom 将光盘设备挂载到/media/chrom目录上使用
umount /dev/cdrom
7:dd命令的使用 convert and copy a file
用法:dd if=/PATH/FROM/SRC of=/PATH/TO/DEST
bs=#:block size, 复制单元大小;
count=#:复制多少个bs;
磁盘拷贝 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=256 count=1
两个特殊设备:
/dev/null: 数据黑洞;
/dev/zero:吐零机;
评论
发表评论