概述
设备类型
块设备:block,存取单位“块”,磁盘
字符设备:char,存取单位“字符”,键盘
设备文件:关联至一个设备驱动程序,进而能够与之对应硬件设备进行通信
设备号码:
主设备号,次设备号
brw-rw----. 1 root disk 8, 0 Mar 12 16:37 /dev/sda
crw-rw-rw-. 1 root root 1, 5 Mar 12 16:37 /dev/zero 这个设备里面存放的都是0
硬盘存储术语:
head:磁头
track:磁道
cylinder:柱面
sector:扇区,512bytes
磁盘的使用
1.分区
两种分区方式:MBR,GPT
如何分区:按柱面,按扇区
0磁道0扇区:512bytes
446bytes:boot loader
64bytes:分区表
16bytes:标识一个分区
2bytes:55AA 标记位
MBR:4个主分区:3主分区+1扩展(N个逻辑分区)
hexdump -C /dev/sdb -n 512 查看/dev/sdb的前512字节
列出块设备
lsblk
创建分区使用:
fdisk 创建MBR分区
fdisk /dev/sdb 管理分区
子命令:
a toggle a bootable flag
b edit bsd disklabel
c toggle the dos compatibility flag
d delete a partition
g create a new empty GPT partition table
G create an IRIX (SGI) partition table
l list known partition types
m print this menu
n add a new partition
o create a new empty DOS partition table
p print the partition table
q quit without saving changes
s create a new empty Sun disklabel
t change a partition's system id
u change display/entry units
v verify the partition table
w write table to disk and exit
x extra functionality (experts only)
gdisk 创建GPT分区
parted 高级分区操作
parted的操作都是实时生效的,小心使用
parted /dev/sdb mklabel gpt|msdos 标识要创建的分区是MBR还是GPT
parted /dev/sdb print 输出分区信息
parted /dev/sdb mkpart primary 1 1200 (默认M) 创建分区
parted /dev/sdb rm 1 删除分区
parted -l 列出分区信息
内存与磁盘的分区表做同步:
6:增加分区partx -a /dev/sdb 删除分区 partx -d --nr 6-8 /dev/sdb
7:partprobe /dev/sdb partprobe——重新设置内存中的内核分区表版本,同步分区表
2.创建文件系统;格式化
cache与buffer的区别:
cache:从磁盘中读出数据到cache中,偏向读操作
buffer:从内存中修改的数据,先放入到buffer中,待系统空闲后再写入到磁盘中,偏向于写操作
查看当前操作系统支持的文件系统
/lib/modules/`uname -r`/kernel/fs
df -T 必须是已经挂载的文件系统
文件系统的分类
根据其是否支持“journal”功能
日志型文件系统:ext3,ext4,xfs,......
非日志型文件系统:ext2,vfat
创建文件系统的工具:
mkfs命令
mkfs.FS_TYPE /dev/device
mkfs -t FS_TYPE /dev/device
-L 'LABEL':设定卷标
-b {1024|2048|4096} 指定块大小
blkid 块设备属性信息查看 只有做好文件系统的分区才能标识到
查看文件系统类型:blkid /dev/sda1 不加参数是查看所有的磁盘
-U UUID:根据指定的UUID来查找对应的设备
-L LABEL:根据指定的LABEL来查找对应的设备
tune2fs:重新设定ext系列文件系统可调整参数的值
修改卷标:tune2fs -L '/dev/sdb2' /dev/sdb2
文件系统的检测和修复(确保文件系统处于umount状态,一定不要再挂载状态下修复)
fsck /dev/device
3.挂载:分配目录名
dd if=/dev/zero of=/data/f1 bs=1M count=20 做一个20M的文件f1
挂载:将额外文件系统与根文件系统现存的目录建立起关联关系,进而使得此目录作为其他文件访问入口的行为
注意:
1.一个挂载点同一时间只能挂载一个设备
2.一个设备可以挂在多个挂载点上
3.挂载点下原有文件在挂载成新的设备后会被临时隐藏,建议把设备挂载到空目录
卸载:为解除此关联关系的过程
umount 设备名/挂载点
mount命令
挂载方法:mount device mount_point
mount:通过查看/etc/mtab文件显示当前已挂载的所有设备
常用选项:
-r:readonly,只读挂载
-w:read and write,读写挂载
-o option:(挂载文件系统的选项),多个选项用逗号分隔
remount:重新挂载
ro:只读
rw:读写
acl:启用此文件系统上的acl功能
suid/nosuid:是否支持suid和sgid权限
exec/noexec:是否支持将文件系统上运行应用程序
auto/noauto:是否支持自动挂载,是否支持-a选项
user/nouser:是否允许普通用户挂载此设备,/etc/fstab使用
async/sync:异步模式/同步模式,内存更改时,同时写磁盘
defaluts:相当于rw,suid,dev,exec,auto,nouser,async
-a:自动挂载所有支持自动挂载的设备(定义在了/etc/fstab文件中,且挂载选项中又auto功能)
-L ‘LABEL’:以卷标指定挂载设备
-U ‘UUID’:以UUID指定要挂载的设备
查看内核追踪到的已挂载的所有设备
cat /proc/mounts
三种挂载形式:
分区:mount /dev/sdb2 /data/sdb2
文件夹:mount -B/--bind 绑定目录到另一个目录上
设置永久挂载
/boot /mnt/boot none bind 0 0
文件:mount -o loop /root/p1 /mnt
设置永久挂载
/root/p1 /mnt/p1 ext4 loop 0 0
设置永久挂载:
/etc/fstab中的内容含义
设备标识(可以是设备名、LABEL、UUID) 挂载点 文件系统类型 挂载选项 备份 检查次序
UUID=591d5eac-4f08-43f6-8c5e-9c82382863d8 /boot xfs defaults 1 2
使用mount -a命令挂载/etc/fstab中的所有文件系统
修改/etc/fstab后,需要重新挂载,再使用mount -a
mount -o remount /dev/sdb1 /data/sdb1
mount -a
/etc/fstab中的UUID如果写错的话,重启机器会导致不能启动
mount -o rw,remount /
vi /etc/fstab 改成0 0,所以这个最好写成0 0
reboot
swap交换分区
free -m 以MB为单位显示内存
内存不够时,会使用swap交换分区
创建swap分区
1 fdisk /dev/sdb dd if=/dev/zero of=/swapfile bs=1M count=1024 使用文件当swap分区
修改分区类型82swap
/dev/sdb1
2 mkswap /dev/sdb1 -L swap_sdb1
3 vim /etc/fstab
UUID=xxx swap swap defaults,pri=100 0 0 swap分区有优先级,先使用优先级大的
/swapfile swap swap defaults 0 0
4 swapon -a
5 swapon -s 查看生效
6 swapoff /dev/sdb1 禁用swap分区
外围设备的使用
使用光盘
创建ISO文件
cp /dev/cdrom /root/iso
mkisofs -r -o /root/etc.iso /etc 把etc下所有的文件做成镜像etc.iso
使用USB介质
查看USB设备是否识别:
lsusb
手动挂载:
mount /dev/sdf /mnt
常用工具:
文件系统空间占用等信息的查看工具
df [OPTION]... [FILE]...
-h:human-readable
-T:文件系统类型
查看某目录总体空间占用状态
du [OPTION]... [DIR]
-h:human-readable
-s:summary
--max-depth #:指定目录深度
工具dd:convert and copy a file
用法:
dd if=/PATH/FROM/SRC of=/PATH/TO/DEST
bs=#:block size,复制单元大小(既是ibs也是obs)
count=#:复制多少bs
if=file 从所命名文件读取而不是从标准输入
of=file 写到所命名的文件而不是标准输出
bs=size 指定块大小
count=n 只拷贝n个记录
ibs=size 一次读size个byte
obs=size 一次写size个byte
skip=blocks 从开头忽略blocks个ibs大小的块
seek=blocks 从开头忽略blocks个obs大小的块
conv=conversion,...
转换参数:
notrunc 不截断输出文件
dd使用范例
备份MBR:
dd if=/dev/sda of=/tmp/mbr.bak bs=512 count=1
破坏MBR中的64bytes分区表信息:
dd if=/dev/zero of=/dev/sda bs=64 count=1 seek=446
有一个大小是2K的二进制文件fileA,现在想从第64个字节位置开始读取,需要读取的大小是128bytes.
又有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全盘数据备份到指定路径的image文件
dd if=/dev/sdx of=/path/to/image
RAID管理 多个磁盘合成一个“阵列”来提供更好的性能、冗余,或者两者都提供
RAID:Redundant Arrays of Inexpensive(Independent) Disks
提高IO能力
磁盘并行读写
提高耐用性
磁盘冗余来实现
级别:多块硬盘组织在一起的工作方式有所不同
RAID实现的方式:
外接式磁盘阵列:通过扩展卡提供适配能力
内接式RAID:主板集成RAID控制器
安装OS前再BIOS里配置
软件RAID:通过OS实现
常用RAID级别
RAID-0
最少磁盘数:2,2+
读,写性能提升
无容错能力
可用空间:N*min(D1,D2,...)
RAID-5
最少磁盘数:3,3+
读写性能提升
有容错能力:允许最多一块磁盘损坏
可用空间:(N-1)*min(D1,D2,...)
RAID-1
最少磁盘数:2,2+
读性能提升、写性能略有下降
有冗余能力
可用空间:1*min(D1,D2,...)
RAID-01(先做RAID0,再做RAID1)
RAID-10(先做RAID1,再做RAID0)
创建软RAID(以RAID5为例):
RAID设备名可命名为/dev/md#(md:multi device)
mdadm命令:
-C:创建模式
-n #:使用#个块设备来创建此RAID
-l #:指明要创建的RAID的级别
-a {yes|no}:自动创建目标RAID设备的设备文件
-c CHUNK_SIZE:指明块大小,单位k
-x #:指明空闲盘的个数
mdadm -C /dev/md0 -a yes -l5 -c 32 -n3 -x1 /dev/sd{b,c,d,e}
-D:显示RAID的详细信息
mdadm -D /dev/md#
管理模式:
-f:标记指定磁盘为损坏
-a:添加磁盘
-r:移除磁盘
创建RAID5
1.准备4块磁盘,大小一致
dd if=/dev/sdb of=/dev/sdc bs=1 count=66 skip=446 seek=446
partprobe /dev/sdc
2.mdadm -C /dev/md0 -a yes -l5 -c 32 -n3 -x1 /dev/sd{b,c,d,e}
3.mkfs.ext4 /dev/md0
4.vim /etc/fstab
5.mdadm -Ds /dev/md0 > /etc/mdasm.conf
6.mdadm -S /dev/md0 停止
7.mdadm -A /dev/md0 激活
8.mdadm /dev/md0 -f /dev/sde 模拟损坏
9.mdadm /dev/md0 -r /dev/sde 删除
10.mdadm /dev/md0 -a /dev/sde 增加
LVM(逻辑卷管理器)管理
允许对卷进行方便操作的抽象层,包括重新设定文件系统的大小
允许多个物理设备间重新组织文件系统
将设备指定为物理卷
用一个或者多个物理卷来创建一个卷组
物理卷是用固定大小的物理区域(physical extent,PE)来定义的
在物理卷上创建的逻辑卷是由物理区域(PE)组成 ,卷组由PE组成
可以在逻辑卷上创建文件系统
设备名:/dev/dm-#
软连接:
/dev/VG_NAME/LV_NAME
/dev/mapper/VG_NAME-LV_NAME
echo ‘- - -’ > /sys/class/scsi_host/host2/scan 扫描新加进来的硬盘
新加的lv没有文件系统,要同步一下:resize2fs /dev/vg0/lv0
pv管理工具
显示pv信息:pvs/pvdisplay
创建pv:pvcreate /dev/DEVICE
vg管理工具
显示卷组:vgs/vgdisplay
创建vg:vgcreate -s 16M VG_NAME PhysicalDivecePath PhysicalDivecePath ...
管理vg:
vgextend VG_NAME PhysicalDivecePath ...
vgreduce VG_NAME PhysicalDivecePath...
删除卷组
先做pvmove,再做vgremove
-s:指定PE大小
lv管理工具
-L:指定lv大小
-n:指定lv名字
显示逻辑卷:lvs/lvdisplay
创建逻辑卷:
lvcreate -L #[m,g,t] -n NAME VG_NAME
删除逻辑卷:
lvremove /dev/VG_NAME/LV_NAME
重设文件系统大小:
resize2fs device
LVM实验:
创建:
pvcreate /dev/sdb1
pvcreate /dev/sdb2
vgcreate -s 4M vg0 /dev/sdb1 /dev/sdb2
lvcreate -L 2G -n lv0 vg0
mkfs.ext4 /dev/vg0/lv0
mount /dev/vg0/lv0 /mnt
扩展:
lvextend -L +2G /dev/vg0/lv0
resize2fs /dev/vg0/lv0
或者直接加-r选项直接同步 lvextend -r -L +2G /dev/vg0/lv0
缩减;
umount /mnt
fsck -f /dev/vg0/lv0
resize2fs /dev/vg0/lv0 1G
lvreduce -L 1G /dev/vg0/lv0
mount /dev/vg0/lv0 /mnt/
删除VG中的PV:
pvmove /dev/sdb1
vgreduce vg0 /dev/sdb1
pvremove /dev/sdb1
跨主机迁移卷组:
源计算机上
1 在旧系统中,umount所有卷组上的逻辑卷
2 vgchange -a n vg0
lvdisplay
3 vgexport vg0
pvscan
vgdisplay
拆下旧硬盘
在目标计算机上
4 在新系统中安装旧硬盘,并vgimport vg0
5 vgchange -ay vg0
6 mount所有卷组上的逻辑卷
相关命令:
hexdump
lsblk
fdisk
gdisk
parted
partx
partprobe
mkfs.FS_TYPE
blkid
tune2fs
fsck
dd
mount/umount
free
mkswap
swapon
swapoff
df
du
练习:
1.迁移/home到新分区上
1 备份/home/*
2 fdisk
3 mkfs.ext4 /dev/sdb1 -L /home
4 mkdir /mnt/home
mount /dev/sdb1 /mnt/home
5 init 1 单用户模式,网络会断
6 cp -av /home/* /mnt/home
7 rm -rf /home/*
8 vim /etc/fstab
UUID=xxx /home ext4 defaults 0 0
9 mount -a
10 umount /mnt/home
rm -rf /mnt/home
11 init 5
2.创建一个2G的文件系统,块大小为2048byte,预留1%可用空间,文件系统ext4,卷标TEST
要求此分区开机后自动挂载只/test目录,且默认有acl挂载选项
3.写一个脚本,完成如下功能:
1 列出当前系统识别到的所有磁盘设备
2 如磁盘数量为1,则显示其空间使用信息;否则,则显示最后一个磁盘上的空间使用信息
4.将centos6的两个iso文件合并成一个everything.iso文件,并将其配置成yum源
5.创建由三块硬盘组成的可用空间为2G的RAID5设备,要求其chunk大小为256k,文件系统为ext4,开机可自动挂载至/mydata目录