storage 存储

storage 存储
linux存储模式
五层:
应用程序 cp ls mv rsync
虚拟文件系统 VFS   挂载
文件系统 格式化
设备驱动 ext4.ko xfs.ko
物理卷 dd
物理卷:
如硬盘或分区:
硬盘接口:
IDE,SATA,SCSI,SAS,SSD;
设备驱动:
要使用对应的文件系统需要对应的模块。
如ext4
lsmod |grep ext4
如ntfs
linux内核支持,但redhat内核没有加上对应的功能
解决方法:
1,重编内核,加上ntfs支持
2,用第三方软件(如ntfs-3g),加上此功能
文件系统:
有对应的驱动模块,就可以格式化成对应的文件系统
mkfs.ext4 /dev/sdax
虚拟文件系统层(VFS):
先提一个问题:我能不能把ext4文件系统里的一个文件cp到ntfs文件系统里呢?
答案:可以.
那么也就是说开发人员开发一个cp命令要支持所有的文件系统,如果出现一个新的文件系统,开发人员需要去修改cp命令的源代码。这样效率低下。
实际情况是:cp命令源代码不需要修改,就是因为有虚拟文件系统层(VFS)。
应用层:
在文件系统上任何操作的命令都是应用层,如ls,cp,mv等
----------------------------------------------------------------------------------------------------------------
dd - convert and copy a file
msdos 446+64(分区表)+2=512 MBR
gpt
1,备份mbr(master boot record主引导记录)
dd if=/dev/sda of=/backup/mbr.backup bs=1 count=512
覆盖可用mbr dd if=/dev/zero of=/dev/sda bs=1 count=512
就会发现fdisk -l 看不到分区,一重启系统就启不来了
恢复:dd if=/backup/mbr.backup of=/dev/sda
2,备份整个硬盘
dd if=/dev/sda of=/dev/sdb --把/dev/sda的数据备份到/dev/sdb
恢复:dd if=/dev/sdb of=/dev/sda
dd if=/dev/sda of=/backup/full.backup --把/dev/sda的数据备份成一个文件
恢复:dd if=/backup/full.backup of=/dev/sda
3,备份软盘
dd if=/dev/fd0 of=/backup/fd0.backup bs=1 count=1440
恢复:dd if=/backup/fd0.backup of=/dev/fd0
4,从光盘拷贝iso镜像 (把iso镜像文件需要刻录软件如nero把它刻录到光盘)
dd if=/dev/cdrom of=/xxx.iso
5,从内存里拷贝资料到磁盘
dd if=/dev/mem of=/backup/mem.bin
特殊应用:
6,销毁磁盘数据
dd if=/dev/urandom of=/dev/sda --随机数填充磁盘
7,修复硬盘,当硬盘长时间不使用
dd if=/dev/sda of=/dev/sda
8,raw设备(裸设备)或者lvm数据迁移等
--讲udev时会讲
裸设备 (没有格式化成文件系统的设备,优势就是跳过文件系统层,提高性能效率)
稀疏文件
# dd if=/dev/zero of=test bs=1M count=1 seek=4000000
# ll test -h
-rw-r--r-- 1 root root 3.9T Sep 17 16:41 test
# du -s test
1024 test
# dd if=/dev/zero of=test1 bs=1M count=1 seek=17000000
dd: failed to truncate to 17825792000000 bytes in output file `test1': File too large
--在ext4下,单个文件最大大小为16T,再大的话就会报错
单个文件16T是在ext4文件系统默认的block size=4096的情况下,如果块大小为1024,那么单个文件最大大小为4T
--xfs文件系统测试单个文件大小达到8E
用dd备份,干掉,恢复分区表
skip为跳过input(也就是if后接的设备)
seek为跳过output(也就是of后接的设备)
446+64(分区表)+2=512  447-510
1,备份分区表
dd if=/dev/sda of=/backup/partition_table.bak bs=1 count=64 skip=446
2,干掉分区表
dd if=/dev/zero of=/dev/sda bs=1 count=64 seek=446
3,恢复分区表
dd if=/backup/partition_table.bak of=/dev/sda bs=1 count=64 seek=446
====================================
msdos 有主分区,扩展分区,逻辑扩展分区,mbr的概念
gpt 没有主分区,扩展分区,逻辑扩展分区的概念,支持单个分区最大超过2TB
BIOS (Basic input and output system)
EFI/UEFI (Extensible Firmware Interface)
fdisk (只能分msdos分区)
parted (可以分msdos和gpt分区)
===================================
如何查看当前我们使用的是msdos,还是gpt?
# parted /dev/sda --parted后接你要查看到设备名,再使用print打印信息
GNU Parted 2.1
Using /dev/sda
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) print
Model: ATA ST3500312CS (scsi)
Disk /dev/sda: 500GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos --这里可以看到是什么类型
这两种分区格式怎么转换?
(parted) mklabel gpt --在parted里输入这样的命令去转换
Warning: Partition(s) on /dev/sda are being used.
Ignore/Cancel? --宿主机千W不要输入Ignore(表示忽略警告,直接干掉系统磁盘里的所有内容),输入Cancel取消或者ctrl+c取消
(parted) mklabel msdos
--注意,不要对正在使用的磁盘做转换(当然你如果不需要当前硬盘的数据的话,也可以直接对使用磁盘做转换;或者先需要备份数据,再做转换)
一般来说,我们应该要在分区前就选好分区类型,比如如下两个场景:
场景一:对一个新加的还未使用的硬盘可以直接决定分区类型,再进行分区
例:使用kvm新加一个4T的硬盘来测试,假设我的kvm虚拟机名字为kvm2
下面的操作是在宿主机上做的
# dd if=/dev/zero of=/var/lib/libvirt/images/newdisk.img bs=1M count=1 seek=4000000
# virsh edit kvm2 --编译虚拟机配置文件,加上新的硬盘,如下一段
<disk type='file' device='disk'>
<driver name='qemu' type='raw' cache='none'/>
<source file='/var/lib/libvirt/images/newdisk.img'/>
<target dev='vdb' bus='virtio'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x08' function='0x0'/>
</disk>
# virsh destroy kvm2
# virsh start kvm2
下面的操作是在虚拟机里面做的
验证,使用fdisk /dev/vdb分不了大于2T的分区(用fdisk分区一定是msdos分区,并且可以证明msdos单个分区不能超过2T)
--验证过程省略
下面使用parted命令把/dev/vdb分成gpt分区,并且单个分区大于2T
# parted /dev/vdb
GNU Parted 2.1
Using /dev/vdb
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) print --print显示错误,因为还没有决定分区类型
Error: /dev/vdb: unrecognised disk label
(parted) mklabel gpt --做成gpt类型
(parted) print
Model: Virtio Block Device (virtblk)
Disk /dev/vdb: 4194GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt --可以看到是gpt类型
Number Start End Size File system Name Flags
(parted) mkpart --分区指令
Partition name? []? 第一个分区 --取一个名字,随意
File system type? [ext2]? ext4 --类型,你要格式化成什么类型,这里写什么类型
Start? 2048s --第一个分区以0开始会有警告,这里以2048s开始或者从1049KB开始(gpt分区的特性)
End? 100G --以什么结束
(parted) print
Model: Virtio Block Device (virtblk)
Disk /dev/vdb: 4194GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Number Start End Size File system Name Flags
1 1049kB 100GB 100GB 第一个分区
(parted) mkpart
Partition name? []? 第二个分区
File system type? [ext2]?ext4
Start?100GB
End?3T
(parted) print
Model: Virtio Block Device (virtblk)
Disk /dev/vdb: 4194GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Number Start End Size File system Name Flags
1 1049kB 100GB 100GB 第一个分区
2 100GB 3000GB 2900GB 第二个分区
(parted) quit
场景二:安装系统分区时指定分gpt分区
在第一次安装系统时,选择自定义分区,进入到分区界面分区默认是什么分区类型?如何区分?
答案: 由硬件决定,有些默认是msdos,有些默认是gpt;区分的方法是在图形创建第一个分区时,看有没有Force to be a primary partition这一句,有则表示为msdos,没有则表示为gpt;
如果默认为msdos分区,但我想分成gpt分区再安装OS,请问怎么做?
答案:在安装过程的图形分区那一步切换到文本命令模式(vmware为ctrl+alt+F2,kvm为按图形界面上面的sendkey里选择ctrl+alt+F2);切换到文本模式后,使用parted /dev/sda命令,并mklabel gpt将其定为gpt分区类型,再进行分区(可以直接在parted命令模式继续分区,也可以ctrl+alt+F6切回图形再退到上一步,然后回到分区步骤进行图形分区就是gpt分区了)
如果是centos7,也可以使用ctrl+alt+F2切换到文本模式,然后使用parted命令操作
posted @ 2018-06-19 22:16  Sky-wings  阅读(973)  评论(0编辑  收藏  举报