Liunx--总结

磁盘存储和文件系统

磁盘存储

机械硬盘:盘片,磁头,盘片转轴及控制电机,磁头控制器,数据转换器,接口,缓存等几个部分组成
固态硬盘:用固态电子存储芯片阵列而制成的硬盘,由控制单元和存储单元(FLASH芯片、DRAM芯片)组成

一、硬盘存储术语
head:磁头
track:磁道
cylinder:柱面--同一磁道称为柱
sector:扇区,512bytes

fdisk -l /dev/sd#--观察硬盘指标

CHS用24bit位寻址 其中前10位表示cylinder柱面,中间8位表示head,后面6位表示sector 扇区 早期用chs方式寻址最大寻址空间8GB 512 2^62^8*2^10

LBA(logical block addressing) LBA是一个整数,通过转换成CHS格式完成磁盘具体寻址 ATA-1规范中定义了28位寻址模式,以每扇区512位组来计算,ATA-1所定义的28位LBA上限达到128 GiB。2002年ATA-6规范采用48位LBA,同样以每扇区512位组计算容量上限可达128 Petabytes

二、磁盘两种分区方式:MBR,GPT

MBR分区中一块硬盘最多有4个主分区,也可以3主分区+1扩展(N个逻辑分区)
MBR分区结构
硬盘主引导记录MBR由4个部分组成(0磁道0扇区512byte) 1.主引导程序(偏移地址0000H--0088H),它负责从活动分区中装载,并运行系统引导程序
出错信息数据区,偏移地址0089H--00E1H为出错信息,00E2H--01BDH全为0字节 2.分区表(DPT,Disk|Partition|Table)含4个分区项,偏移地址01BEH--01FDH,每个分区表项长16个字节,共64字节为分区项1、分区项2、分区项3、分区项4
3.结束标志字,偏移地址01FE--01FF的2个字节值为结束标志55AA

GPT分区:GPT:GUID(Globals Unique Identifiers) partition|table(分区表)支持128个分区,使用64位,支持8Z( 512Byte/block )64Z ( 4096Byte/block)

使用128位UUID(Universally Unique Identifier) 表示磁盘和分区,GPT分区表自动备份在头和尾两份,并有CRC校验位

hexdump -C -n 512 /dev/sd#--查看硬盘前512字节
dd if=/dev/sda of=/data/mbr bs=1 count=64--dd备份分区表(分区表放在它处)

。。。分区工具 parted命令的操作都是实时生效的,小心使用
用法:parted [选项]... [设备 [命令 [参数]...]...]
parted /dev/sdb mklabel gpt|msdos--打标记然后进行分区gpt|msdos
parted -l 查看partition Table:gpt列出分区信息
parted /dev/sdb print打印分区信息
parted /dev/sdb mkpart primary 1 200 (默认M)--分区连续分区不要跳着分
parted /dev/sdb rm 1 删除分区

fdisk mbr和gdisk gpt--命令格式基本相同不做赘述
fdisk /dev/sd# 交互式管理分区
p 分区列表
t 更改分区类型改id
n 创建新分区-p主(1-4)e扩展 默认1开始自设+2M\G\K --分区需要注意连续分区,不要跳着分
d 删除分区 对应分区数字 分区数字易改变
v 校验分区
u 转换单位
w 保存并退出 出去立马执行才会更改
q 不保存并退出

。。分过区可能会出现内存中未加载新分区的信息
lsblk
ll /dev/sdb*
cat /proc/partitions--到这都是看内存中的硬盘信息
fdisk -l /dev/sd#--看到某硬盘的所有分区状态
partprobe同步硬盘信息 entOS 5,7
。。。。 centos6 partx -a /dev/DEVICE 创建时同步
partx -d --nr 6-7 /dev/DEVICE 删除时同步


文件系统

文件系统是操作系统用于明确存储设备或分区上的文件的方法和数据结构;即在存储设备上组织文件的方法。操作系统中负责管理和存储文件信息的软件结构称为文件管理系统,简称文件系统

查看系统支持的文件系统:/lib/modules/uname –r/kernel/fs
各种文件系统:
https://en.wikipedia.org/wiki/Comparison_of_file_systems

ext4:是ext文件系统的最新版。提供了很多新的特性,包括纳秒级时间戳、创建和使用巨型文件(16TB)、最大1EB的文件系统,以及速度的提升
xfs:SGI,支持最大8EB的文件系统
btrfs(Oracle), reiserfs, jfs(AIX), swap
光盘:iso9660
Windows:FAT32, exFAT,NTFS
Unix: FFS(fast), UFS(unix), JFS2
网络文件系统:NFS, CIFS
集群文件系统:GFS2, OCFS2(oracle)
分布式文件系统: fastdfs,ceph, moosefs,mogilefs, glusterfs, Lustre
RAW:未经处理或者未经格式化产生的文件系统

lsblk -f 查看文件系统
一、创建文件系统命令 (下面命令两两一组,每组的选项基本通用)
mkfs命令 (1) mkfs.FS_TYPE /dev/DEVICE
ext4-xfs-btrfs-vfat
(2) mkfs -t FS_TYPE /dev/DEVICE
-L 'LABEL' 设定卷标
-f 强制对已经存在xfs重装
mkfs -b 设置快大小以快为单位
mke2fs:ext系列文件系统专用管理工具
-t {ext2|ext3|ext4} 指定文件系统类型
-b {1024|2048|4096} 指定块大小
-L ‘LABEL’ 设置卷标
-j 相当于 -t ext3
mkfs.ext3 = mkfs -t ext3 = mke2fs -j = mke2fs -t ext3
-i#为数据空间中每多少个字节创建一个inode;不应该小于block大小
-N # 指定分区中创建多少个inode
-I 一个inode记录占用的磁盘空间大小,128---4096
-m # 默认5%,为管理人员预留空间占总空间的百分比
-O FEATURE[,...] 启用指定特性
-O ^FEATURE 关闭指定特性

tune2fs 设定ext系列文本系统可调整参数的值 -l 查看指定文件系统超级块信息;super block
-L 'LABEL’ 修改卷标
-m # 修预留给管理员的空间百分比
-j 将ext2升级为ext3
-O 文件系统属性启用或禁用, –O ^has_journal
-o 调整文件系统的默认挂载选项,–o ^acl
-U UUID 修改UUID号
dumpe2fs:将磁盘块分组管理
-h:查看超级块信息,不显示分组信息

文件系统检测和修复:常发生于死机或者非正常关机之后
挂载为文件系统标记为“no clean”
注意:一定不要在挂载状态下修复
fsck: File System Check--fsck /dev/sdb3 -y(自动回答)修复数据任然丢失
fsck.FS_TYPE
fsck -t FS_TYPE
-p 自动修复错误
-r 交互式修复错误
FS_TYPE 一定要与分区上已经文件类型相同
e2fsck:ext系列文件专用的检测修复工具 -y 自动回答为yes -f 强制修复 。。。 centos6 etx4 后续添加硬盘分区没有acl权限
fdisk n e +100M
mkfs.etx4 /dev/sda6
tune2fs -l /de/sda6
挂载 进入磁盘设置acl权限
tune2fs -o acl /dev/sdb6 添加acl权限
tune2fs -o ^acl /dev/sdb6 去

文件系统标签:指向设备的另一种方法-与设备无关
blkid [OPTION] [DEVICE]--块设备属性信息查看 -U UUID 根据指定的UUID来查找对应的设备
-L LABEL 根据指定的LABEL来查找对应的设备
e2label:管理ext系列文件系统的LABEL e2label DEVICE [LABEL]
findfs :查找分区
findfs [options] LABEL=<label> findfs [options] UUID=<uuid>

二、mount挂载

将额外文件系统与根文件系统某现存的目录建立起关联关系,进而使得此目录做为其它文件访问入口的行为 mount通过查看/etc/mtab文件显示当前已挂载的所有设备

mount[-fnrsvw][-t vfstype][-o options]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:挂载点
事先存在,建议使用空目录
进程正在使用中的设备无法被卸载
mount常用命令选项 --通过mount命令查看挂载设备
-t vsftype 指定要挂载的设备上的文件系统类型
-r readonly,只读挂载
-w read and write, 读写挂载
-n 不更新/etc/mtab,6mount不可见 cat /etc/mtab
cat /proc/mounts查看内核追踪到的已挂载的所有设备
centos6 /etc/mtab /proc/mounts
-a自动挂载所有支持自动挂载的设备(定义在了/etc/fstab文件中,且挂载选项中有auto功能)
-L 'LABEL' 以卷标指定挂载设备
-U 'UUID' 以UUID指定要挂载的设备
-B, --bind 绑定目录到另一个目录上(挂载目录)
-当两个文件inode一样时可能是目录挂载
-mount -B /boot/grub2 /mnt/grub2

卸载命令
findmnt MOUNT_POINT|device--查看文件是否以挂载 $?的值判断 查看正在访问指定文件系统的进程
lsof MOUNT_POINT--查看谁在访问
fuser -v MOUNT_POINT--查看谁在访问
终止所有在正访问指定的文件系统的进程
fuser -km MOUNT_POINT
卸载 umount DEVICE umount MOUNT_POINT

mount /dev/sda /mnt /sda--uuid或卷标都可挂 uuid挂载好有唯一性

文件系统空间占用等信息的查看工具
df [OPTION]... [FILE]...
-H 以10为单位 -T 文件系统类型 -h human-readable -i inodes instead of blocks
-P 以Posix兼容的格式输出
查看某目录总体空间占用状态
du [OPTION]... DIR -h human-readable -s summary 总和
--max-depth=# 指定最大目录层级
。。。 空洞文件或稀疏
dd if=/dev/zero of=/data/bigfile bs=1M count=1023 seek=2048
ls -h bigfile 3G --看到的逻辑大小
du -sh bigfile 1G --只占用1G df/data看到的都是实际大小
loop设备关联文件
ll /dev/loop* c6查看loop设备默认0-78个
dd if=/dev/zero of=/data/bigfile bs=1M count=1023 seek=2048
mkfs.ext4 /data/bigfile
losetup /dev/loop6 /data/bigfile--设备关联
losetup -a
losetup -d
。。。。 mknod创建特殊文件基本什么都可以创建 mknod /dev/loop100 b 7 8 --创建loop设备 rm -rf loop100 /boot/grub/grub.conf 下面可以 max_loop=100 重启 ll /devloop*

mount -o ptions:多个选项使用逗号分隔
async.异步模式sync.同步模式,内存更改时,同时写磁盘
atime/noatime包含目录和文件(存放时间超过一天才会更新或mtime>atime时间
diratime/nodiratime 目录的访问时间戳
auto/noauto 是否支持自动挂载,是否支持- a选项
exec/noexec 是否支持将文件系统上运行应用程序
dev/nodev 是否支持在此文件系统上使用设备文件
suid/nosuid 是否支持suid和sgid权限
remount 重新挂载
ro 只读 rw 读写
user/nouser 是否允许普通用户挂载此设备,/etc/ fstab使用
acl 启用此文件系统上的acl功能
loop 使用loop设备

文件挂载配置文件
/etc/fstab每行定义一个要挂载的文件系统
1、要挂载的设备或伪文件系统
设备文件 LABEL:LABEL="" UUID:UUID=""
伪文件系统名称:proc, sysfs
2、挂载点
3、文件系统类型:ext4,xfs,iso9660,nfs,none
4、挂载选项:defaults ,acl,bind -o 的选项
5、转储频率:0:不做备份 1:每天转储 2:每隔一天转储
6、fsck检查的文件系统的顺序:允许的数字是0 1 2
0:不自检
1:首先自检;一般只有rootfs才用
2:非rootfs使用
。。。 /dev/sdr6 /mnt/sda6 ext4 defaults 0 3
空洞文件用uuid在fstab写入挂载
/boot /mnt/boot none bind 0 0 文件挂文件配置

mount-a自动挂载所有支持自动挂载的设备且挂载选项中有auto功能

三、swap 交换分区是系统RAM的补充,Swap分区支持虚拟内存。当没有足够的RAM保存系统处理的数据时会将数据写入 swap 分区 当系统缺乏swap空间时,内核会因RAM内存耗尽而终止进程。配置过多swap空间会造成存储设备处于分配状态但闲置,造成浪费,过多 swap 空间还会掩盖内存泄露

挂载交换分区--基本设置包括:•创建交换分区或者文件 •使用mkswap写入特殊签名•在/etc/fstab文件中添加适当的条目•使用swapon -a 激活交换空间
启用:swapon
swapon [OPTION]... [DEVICE]
-a:激活所有的交换分区
-p PRIORITY:指定优先级
/etc/fstab 在第4列中:pri=value
禁用:swapoff [OPTION]... [DEVICE]
SWAP的优先级
可以指定swap分区0到32767的优先级,值越大优先级越高 如果用户没有指定,那么核心会自动给swap指定一个优先级,这个优先级从-1开始,每加入一个新的没有用户指定优先级的swap,会给这个优先级减一
先添加的swap的缺省优先级比较高,除非用户自己指定一个优先级,而用户指定的优先级(是正数)永远高于核心缺省指定的优先级(是负数)
优化性能:分布存放,高性能磁盘存放
。。。 分swap分区 free -h 看内存使用情况
fdisk /dev/sdc p m t L 19 改分区盘id w (gpt) mkswap 创建swap文件系统=mkswap/dev/sdc1
写到fstab文件 free -h 没看到
swapon -a 开启swap free -h
cat /proc/swaps 查看swap分区具体有多少=swapon -s
swapoff /dev/sdc1禁用


补充

dd 命令:convert and copy a file
dd if=/PATH/FROM/SRC of=/PATH/TO/DEST bs=# count=#
if=file 从所命名文件读取而不是从标准输入
of=file 写到所命名的文件而不是到标准输出
ibs=size 一次读size个byte
obs=size 一次写size个byte
bs=size block size, 指定块大小(既是是ibs也是obs)
cbs=size 一次转化size个byte
skip=blocks 从开头忽略blocks个ibs大小的块
seek=blocks 从开头忽略blocks个obs大小的块
count=n 复制n个bs
conv=conversion[,conversion...]用指定的参数转换文件 转换参数:
dd if=/data/file of=fstab conv=ucase
ascii 转换 EBCDIC 为 ASCII
ebcdic 转换 ASCII 为 EBCDIC
lcase 把大写字符转换为小写字符
ucase 把小写字符转换为大写字符
nocreat 不创建输出文件
noerror 出错时不停止
notrunc 不截短输出文件
sync把每个输入块填充到ibs个字节,不足部分用空(NUL)字符补齐
fdatasync写完成前,物理写入输出文件,判断读写速度

备份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 有一个大与2K的二进制文件fileA。现在想从第64个字节位置开始读取,需要读取的大小是128Byts。又有fileB,想把上面读取到的128Bytes写到第32个字节开始的位置,替换128Bytes,实现如下 dd if=fileA of=fileB bs=1 count=128 skip=63 seek=31 conv=notrunc

1、备份: dd if=/dev/sdx of=/dev/sdy 将本地的/dev/sdx整盘备份到/dev/sdy dd if=/dev/sdx of=/path/to/image 将/dev/sdx全盘数据备份到指定路径的image文件 dd if=/dev/sdx | gzip >/path/to/image.gz 备份/dev/sdx全盘数据,并利用gzip压缩,保存到指定路径 恢复: dd if=/path/to/image of=/dev/sdx 将备份文件恢复到指定盘 gzip -dc /path/to/image.gz | dd of=/dev/sdx 将压缩的备份文件恢复到指定盘

2、拷贝内存资料到硬盘
dd if=/dev/mem of=/root/mem.bin bs=1024
将内存里的数据拷贝到root目录下的mem.bin文件

3、从光盘拷贝iso镜像
dd if=/dev/cdrom of=/root/cd.iso
拷贝光盘数据到root文件夹下,并保存为cd.iso文件

4、销毁磁盘数据
dd if=/dev/urandom of=/dev/sda1
利用随机的数据填充硬盘,在某些必要的场合可以用来销毁数据,执行此操作以后,/dev/sda1将无法挂载,创建和拷贝操作无法执行

5、得到最恰当的block size
dd if=/dev/zero of=/root/1Gb.file bs=1024 count=1000000
dd if=/dev/zero of=/root/1Gb.file bs=2048 count=500000
dd if=/dev/zero of=/root/1Gb.file bs=4096 count=250000
通过比较dd指令输出中命令的执行时间,即可确定系统最佳的block size大小

6、测试硬盘写速度
dd if=/dev/zero of=/root/1Gb.file bs=1024 count=1000000 conv=fdatasync
测试硬盘读速度
dd if=/root/1Gb.file bs=64k | dd of=/dev/null conv=fdatasync