linux文件系统目录结构
《Unix文件系统结构标准》(Filesystem Hierarchy Standard)中有相应的规则。
Unix目录结构演变史
根目录下面有一个子目录/bin,用于存放二进制程序。但是,/usr子目录下面还有/usr/bin,以及/usr/local/bin,也用于存放二进制程序;某些系统甚至还有/opt/bin。这同Unix目录结构和历史演变有关。
早期Unix得服务器单盘容量很小。随着根目录增长,一块盘容纳不下。于是加盘,并规定第一块盘只放系统程序,第二块盘只放用户的程序,因此挂载的目录点取名为/usr。也就是说,根目录"/“挂载在第一块盘,”/usr"目录挂载在第二块盘。除此之外,两块盘的目录结构完全相同,第一块盘的目录(/bin, /sbin, /lib, /tmp…)都在/usr目录下重新出现一次。当加了第三张盘,挂载的目录点取名为/home,并且规定/usr用于存放用户的程序,/home用于存放用户的数据。
从此,这种目录结构就延续了下来。随着硬盘容量越来越大,各个目录的含义进一步得到明确。
/:存放系统程序,也就是At&t开发的Unix程序。
/usr:存放Unix系统商(比如IBM和HP)开发的程序。
/usr/local:存放用户自己安装的程序。
/opt:在某些系统,用于存放第三方厂商开发的程序,所以取名为option,意为"选装"。
当前linux 各目录作用
/bin Binaries (二进制文件) 的缩写, 这个目录存放着最经常使用的命令
/boot 启动 Linux 时使用的一些核心文件,包括一些连接文件以及镜像文件。
/dev Device(设备) 缩写, 存放外部设备,Linux 访问设备的方式和访问文件的方式相同。
/etc是 Etcetera(等等) 缩写,存放所有的系统管理所需要的配置文件和子目录。
/home:用户主目录,
/lib是 Library(库) 缩写,存放系统最基本的库文件,类似于 Win的 DLL 文件。
/lost+found:这个目录一般情况下是空的。
/media:OS自动识别一些设备,如U盘,识别后把设备挂载到/media。
/mnt:为了让用户临时挂载别的文件系统的,我们可以将光驱挂载在 /mnt/ 上
/opt:optional(可选) 的缩写,额外安装软件的目录。如安装ORACLE。
/proc:Processes(进程) 的缩写,是伪文件系统,是内存的映射,存储内核运行状态的文件。
/root:超级权限者的用户主目录。
/sbin:Superuser Binaries (超级用户的二进制文件) 的缩写,存放的系统管理员使用的系统管理程序。
/selinux:Redhat 特有的目录,存放selinux相关的文件的。
/srv:存放一些服务启动之后需要提取的数据。
/sys: Linux2.6 内核后出现,安装了 2.6 内核中新出现的一个文件系统 sysfs 。sysfs 集成了3种文件系统的信息:针对进程信息的 proc 文件系统、针对设备的 devfs 文件系统以及针对伪终端的 devpts 文件系统。
该文件系统是内核设备树的一个直观反映。
当一个内核对象被创建的时候,对应的文件和目录也在内核对象子系统中被创建。
/tmp:temporary(临时) 的缩写这个目录是用来存放一些临时文件的。
/usr:unix shared resources(共享资源) 的缩写,用户的很多应用程序和文件都放在这个目录下,类似于 windows 下的 program files 目录。
/var:目录主要用于存放可变数据,即变化频繁、增长较快或由系统和进程生成的数据.
Device mapper机制
Linux系统的一般的文件系统名称类似于/dev/vda1,一部分/dev/mapper/datavg-datalv
$ df -h
Filesystem Size Used Avail Use% Mounted on
/dev/vda1 99G 9.8G 84G 11% /
/dev/mapper/datavg-datalv 488G 8.0G 455G 2% /data
... ...
... ...
Device mapper机制
Device mapper是Linux2.6内核中提供的一种从逻辑设备到物理设备的映射机制,具体管理时需要用到Linux下的逻辑卷管理器,当前主流逻辑卷管理器有 LVM2(Linux Volume Manager 2 version)、EVMS(Enterprise Volume Management System)、dmraid(Device Mapper Raid Tool)等。
服务器有三块盘a,b,c,每块盘1T。安装Linux的时
根据系统及自身的需要建立基本的分区,对硬盘a进行了分区,分出去了0.1T的空间挂载在/boot目录下,
其他硬盘未进行分区。系统利用Device mapper机制建立了一个卷组(volume group,VG),
在VG上面创建LV。要将a的剩余空间、硬盘b和硬盘c都加入到VG,则硬盘a的剩余空间首先会被系统建立为一个PV,这个PV 0.9T,硬盘b和硬盘c 为1T PV,加入到VG,此时VG池中 2.9T.
/dev/mapper/Volume-lv_root的意思是有一个VG 叫Volume, 这个Volume里面有一个LV叫作lv_root。
这个/dev/mapper/Volume-lv_root文件是一个连接文件,是连接到/dev/dm-0的,可以用命令ll /dev/mapper/Volume-lv_root进行查看。
在系统里/dev/Volume/lv_root 和 /dev/mapper/Volume-lv_root以及/dev/dm-0都是一个东西,都可当作一个分区来对待。
文件系统 /proc
proc是一个伪文件系统,它被用作内核数据结构的接口,是内存映射的一块区域,通常被挂载在/proc上,大部分文件都是只读的,但是有一些文件允许内核变量修改。
#使用mount查看
mount |grep -i proc
proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)
下面介绍一下/proc的目录结构:
/proc/[pid]
每个运行中的进程都有以一个数字命名的子目录,目录名是进程PID,每个这样的子目录包含了下面一些伪文件和目录。
/proc/[pid]/auxv
包含了传递给运行时进程的 ELF 解释器信息,格式是每一项都是一个 unsigned long长度的 ID 加上一个 unsigned long 长度的值。最后一项以连续的两个 0x00 开头。
$ hexdump /proc/15104/auxv
/proc/[pid]/cgroup
# 这个文件描述了归属进程/任务的资源控制信息,每个cgroup描述都是用:分割开的形式:
$ cat /proc/15104/cgroup
11:memory:/user.slice
10:devices:/user.slice
9:blkio:/user.slice
8:freezer:/
7:net_prio,net_cls:/
6:perf_event:/
5:hugetlb:/
4:cpuacct,cpu:/user.slice
3:cpuset:/
2:pids:/
1:name=systemd:/user.slice/user-1000.slice/session-16754.scope
# 第一列是层次结构的ID,第二列是绑定到该层次结构的子系统集合,最后一列表示层次结构中的控制组属于哪个进程。需要注意的是这个文件只有在内核配置选项CONFIG_CGROUPS启用时才有。
/proc/[pid]/cmdline
这个文件保存了进程的完整命令行信息。如果这个进程是 僵尸进程,则这个文件没有任何内容。该文件以空字符 null 而不是换行符作为结束标志
/proc/[pid]/coredump_filter
进程coredump时,内核转储掩码设置的值
The following 7 memory types are supported:
- (bit 0) anonymous private memory(匿名私有内存段)
- (bit 1) anonymous shared memory(匿名共享内存段)
- (bit 2) file-backed private memory(file-backed 私有内存段)
- (bit 3) file-backed shared memory(file-bakced 共享内存段)
- (bit 4) ELF header pages in file-backed private memory areas (it is
effective only if the bit 2 is cleared)(ELF 文件映射,只有在bit 2 复位的时候才起作用) - (bit 5) hugetlb private memory(大页面私有内存)
- (bit 6) hugetlb shared memory(大页面共享内存)
/proc/[pid]/cpuset
将进程限制在cpu的子集中
/proc/[pid]/cwd
这是进程当前工作目录的一个软链接,可以使用下面的命令找出当前进程的工作目录cd cwd/;/bin/pwd
cd /proc/[pid]/cwd/; /bin/pwd
/proc/[pid]/environ
# 这个文件包含了进程运行的环境变量
/proc/[pid]/exe
2.2版本之后的内核,这个文件是一个软链接,它指向执行命令的实际路径。该链接可以正常地被取消引用,如果尝试打开它将会被执行,你甚至可以输入/proc/[pid]/exe来运行一份[pid]进程的拷贝。在多线程处理器中,如果主线程已经退出,则符号链接的内容将会消失。
/proc/[pid]/fd/
这个子目录包含了进程打开的所有文件描述符的链接,每个链接指向实际的文件,因此0是标准输入1是标准输出2是标准错误输出等等
/proc/[pid]/fdinfo/
这个子目录包含了进程打开的文件描述符的入口,每个文件命名都是以描述符命名, 它包含了每个文件描述符可以读取的信息
/proc/[pid]/io
这个文件包含了进程的 I/O 统计信息
$ cat /proc/15104/io
rchar: 249358100 读出总字节数
wchar: 32820986 写入总字节数
syscr: 340344 读系统调用次数
syscw: 164979 写系统调用此时
read_bytes: 1064960 实际从磁盘读取的字节总数
write_bytes: 37273600 实际写入磁盘的字节总数
cancelled_write_bytes: 0 由于截断pagecache导致应该发生而没有发生的写入字节数
/proc/[pid]/limits
这个文件展示了每个进行的资源限制情况
/proc/[pid]/map_files/
这个子目录包含的项和mmap文件一致,每一项的名称为内存起止地址对,它指向实际的映射文件。
虽然这些项表示使用MAP_FILE标志映射的内存范围,但是通过MAP_ANON|MAP_SHARED标志创建的匿名共享内存也会出现在这个目录中,其目标文件是被删除的/dev/zero。
这个目录仅在内核选项CONFIG_CHECKPOINT_RESTORE 打开时才会出现
/proc/pid/maps
这个文件包含了当前映射的内存范围和它们的访问权限
访问权限位标识
r = read
w = write
x = execute
s = shared
p = private (copy on write)
如果pathname项是空的,则表示这是一个通过mmap的匿名映射
.
/proc/[pid]/mem
这个文件可以通过open/read来访问进程的内存页
/proc/[pid]/mountinfo
这个文件包含了挂载点信息
/proc/[pid]/mounts
当前进程的挂载命名空间中挂载的文件系统
/proc/[pid]/mountstats
这个文件导出了进程命名空间中挂载点的信息
/proc/[pid]/ns/
每个命名空间支持被setns操纵
/proc/[pid]/ns/ipc
绑定挂载这个文件到文件系统中其他位置,保留pid指定的进程IPC命名空间,及时当前命名空间中所有进程终止
/proc/[pid]/ns/net
绑定挂载这个文件到文件系统中其他位置,保留pid指定的进程网络命名空间,及时当前命名空间中所有进程终止
/proc/[pid]/ns/uts
绑定挂载这个文件到文件系统中其他位置,保留UTS指定的进程网络命名空间,及时当前命名空间中所有进程终止
/proc/[pid]/numa_maps
包含有关给定进程使用的每个存储区域的信息
/proc/[pid]/oom_adj
这个文件可以用来调整 oom killer选择应该被 kill的进程的分数。内核使用该值进行位移操作,该值范围是-16到15,该值越大表示在oom时越有可能被杀掉, -17表示永远不会被oom kill
默认值是0, 一个新的进程会继承父进程的 oom_adj设置,进程必须有特权才能修改这个文件
/proc/[pid]/oom_score
这个文件展示了当前内核给这个进程计算的选择OOM kill的分数, 这个分数越高,则越有可能被oom killer 选中。这个分数基于这个进程使用的内存数量,包括以下因素:
这个进程是否创建了大量子进程
这个进程是否运行了一长段时间,或者使用了大量的CPU时间
这个进程是否有一个低的nice值
这个进程是否有特权、
这个进程是否有直接的硬件访问
oom_score也反映了oom_score_adj和oom_adj调整的结果
/proc/[pid]/oom_score_adj
在计算最终的 badness score 时,会在计算结果中加上 oom_score_adj ,这样用户就可以通过该在值来保护某个进程不被杀死或者每次都杀某个进程。其取值范围为-1000到1000 。
如果将该值设置为-1000,则进程永远不会被杀死,因为此时 badness score 永远返回0
/proc/[pid]/root
进程根目录的符号链接,linux支持每个进程一个root文件系统的方式。
在一个多线程处理器中,如果主线程退出了,这个软链接的内容也会消失
/proc/[pid]/smaps
这个文件列出了进程的每一个映射的内存消耗情况
/proc/[pid]/stat
ps命令会这用的进程的信息
proc/[pid]/statm
提供进程的内存使用信息,以页为单位
/proc/[pid]/status
相较于/proc/[pid]/stat 和 /proc/[pid]/statm 提供更为丰富的格式化信息是的人类更易读
/proc/[pid]/task
进程中的每个线程有一个子目录,目录名为线程ID[TID]。每个子目录中有一系列和/proc/[pid]/目录下相同名字的文件。对应所有线程共享的属性,task/[tid]子目录中每个文件的内容和父目录/proc/[pid]中一致。对于每个线程独立的属性,task/[tid]目录中的文件可能会有不同的值。
tmpfs
一种基于内存的文件系统,和虚拟磁盘ramdisk类似,但不完全相同,同ramdisk一样tmpfs可以使用RAM,但它也可以使用swap分区来存储。而且传统的ramdisk是个块设备,要用mkfs来格式化它,才能真正地使用它;而tmpfs是一个文件系统,并不是块设备,只是安装它,就可以使用了。tmpfs是最好的基于RAM的文件系统。
oracle 11g引入了memory_target参数,memory_target 和 /dev/shm(即tmpfs)有紧密联系,tmpfs的大小制约了memory_target的使用范围。
tmpfs优点:
根据需求动态调整大小,速度快
如何使用tmpfs:
tmpfs默认情况下会mount到/dev/shm目录下,要使用tmpfs,需要在内核配置时,启用“Virtual memory file system support”。
为了防止tmpfs使用了全部的VM,有时候要限制大小。要创建一个最大为1G的tmpfs文件系统,输入:
mount tmpfs /dev/shm -t tmpfs -o size=1G
编辑/etc/fstab文件,添加如下内容:
tmpfs /dev/shm tmpfs size=1G 00
扩容tmpfs
查看tmpfs大小
[root@drz ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 16G 14G 1.7G 89% /
tmpfs 996M 72K 996M 1% /dev/shm
/dev/sda1 194M 34M 151M 19% /boot
编辑/etc/fstab
size大小必须是整数
[root@drz ~]# vi /etc/fstab
tmpfs /dev/shm tmpfs defaults,size=1500M 0 0
devpts /dev/pts devpts gid=5,mode=620 0 0
sysfs /sys sysfs defaults 0 0
proc /proc proc defaults 0 0
/dev/sdb1 swap swap defaults 0 0
/home/swapfile swap swap defaults 0 0
重新挂载
[root@drz ~]# mount -o remount /dev/shm
验证增加的大小
[root@drz ~]# df -PH
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 17G 15G 1.8G 89% /
tmpfs 1.6G 74k 1.6G 1% /dev/shm
/dev/sda1 204M 36M 158M 19% /boot
临时修改,也可以通过mount来直接修改和挂载
mount -o size=1500M -onr_inodes=1000000 -o noatime,nodiratime -o remount /dev/shm
将最大容量调到1.5G,并且inode数量调到1000000,这意味着大致可存入最多一百万个小文件。
分布式文件系统
分布式文件系统曾经很多,如:MooseFS、MogileFS、GlusterFS、GFS2、ceph、Lustre、PVFS2、fastDFS、Coda、Hadoop HDFS、FastDFS、NFS、15、dCache、xtreemfs、CloudStore (KosmosFS)、NFSv4 Referrals、NFSv4.1 pNFS、spNFS、GFarm
主流分布式文件系统分类
- 通用型:符合POSIX标准,如Lustre、Ceph
- 专用型:针对特定场景优化,如HDFS(大数据)、TFS(电商)5
- 云原生:如GFS(Google内部)、S3(对象存储)1
| 系统 | 类型 | 特点 | 适用场景 |
|---|---|---|---|
| HDFS | 专用 | 高容错,适合批处理 | 大数据分析 |
| Ceph | 通用 | 支持块/文件/对象存储 | 云平台 |
| FastDFS | 专用 | 轻量级,高并发 | 图片/视频存储 |
| GFS | 专用 | 谷歌内部使用,未开源 | 海量数据存储 |
多路径
多路径的作用:
故障切换高可用
负载均衡
磁盘虚拟化
多路径软件
多路径厂商一般提供多路径软件,redhat suse等也提供通用的多路径软件。
rpm -qa|grep -i mapper redhat提供的多路径软件包
device-mapper-multipath-libs-0.4.9-93.el6.x86_64
device-mapper-event-libs-1.02.117-7.el6.x86_64
device-mapper-event-1.02.117-7.el6.x86_64
device-mapper-persistent-data-0.6.2-0.1.rc7.el6.x86_64
device-mapper-libs-1.02.117-7.el6.x86_64
device-mapper-multipath-0.4.9-93.el6.x86_64
device-mapper-1.02.117-7.el6.x86_64
1、device-mapper-multipath:即multipath-tools。主要提供multipathd和multipath等工具和 multipath.conf等配置文件。这些工具通过device mapper的ioctr的接口创建和配置multipath设备(调用device-mapper的用户空间库。创建的多路径设备会在/dev/mapper中)。
2、 device-mapper:主要包括两大部分:内核部分和用户部分。内核部分主要由device mapper核心(dm.ko)和一些target driver(md-multipath.ko)。核心完成设备的映射,而target根据映射关系和自身特点具体处理从mappered device 下来的i/o。同时,在核心部分,提供了一个接口,用户通过ioctr可和内核部分通信,以指导内核驱动的行为,比如如何创建mappered device,这些divece的属性等。linux device mapper的用户空间部分主要包括device-mapper这个包。其中包括dmsetup工具和一些帮助创建和配置mappered device的库。这些库主要抽象,封装了与ioctr通信的接口,以便方便创建和配置mappered device。multipath-tool的程序中就需要调用这些库。
3、dm-multipath.ko和dm.ko:dm.ko是device mapper驱动。它是实现multipath的基础。dm-multipath其实是dm的一个target驱动。
4、scsi_id:包含在udev程序包中,可以在multipath.conf中配置该程序来获取scsi设备的序号。通过序号,便可以判断多个路径 对应了同一设备。这个是多路径实现的关键。scsi_id是通过sg驱动,向设备发送EVPD page80或page83 的inquery命令来查询scsi设备的标识。但一些设备并不支持EVPD 的inquery命令,所以他们无法被用来生成multipath设备。但可以改写scsi_id,为不能提供scsi设备标识的设备虚拟一个标识符,并 输出到标准输出。multipath程序在创建multipath设备时,会调用scsi_id,从其标准输出中获得该设备的scsi id。在改写时,需要修改scsi_id程序的返回值为0。因为在multipath程序中,会检查该直来确定scsi id是否已经成功得到。
[root@TKBS-PDB ~]# cat /etc/multipath.conf
defaults {
polling_interval 10
user_friendly_names no
find_multipaths yes
}
devices {
device {
vendor "IBM" #厂商名称
product "2145" #产品型号
path_grouping_policy "group_by_prio" #默认的路径组策略
path_selector "round-robin 0" #选择那条路径进行下一个IO操作的方法
# path_selector "service-time 0" # Used by Red Hat 7.x
prio "alua"
path_checker "tur"
failback "immediate" #故障恢复的模式
no_path_retry 5 #在disable queue之前系统尝试使用失效路径的次数的数值
rr_weight uniform
rr_min_io_rq "1"
dev_loss_tmo 120
}
}
multipaths {
multipath {
wwid 3600507680c80837f90000000000001e6
alias mpathc
}
... ...
... ...
... ...
multipath {
wwid 3600507680c80837f9000000000000457
alias mpathj
}
}
[root@TKBS-PDB ~]# multipath -ll
mpathe (3600507680c80837f90000000000001e8) dm-4 IBM,2145
size=2.0T features='1 queue_if_no_path' hwhandler='0' wp=rw
|-+- policy='round-robin 0' prio=50 status=active
| |- 1:0:6:2 sdh 8:112 active ready running
| |- 3:0:8:2 sdab 65:176 active ready running
| |- 1:0:7:2 sdl 8:176 active ready running
| `- 3:0:9:2 sdag 66:0 active ready running
`-+- policy='round-robin 0' prio=10 status=enabled
|- 1:0:0:2 sdd 8:48 active ready running
|- 3:0:2:2 sdt 65:48 active ready running
|- 1:0:8:2 sdp 8:240 active ready running
`- 3:0:4:2 sdx 65:112 active ready running
... ...
... ...
... ...
mpathf (3600507680c80837f90000000000001e9) dm-3 IBM,2145
size=2.0T features='1 queue_if_no_path' hwhandler='0' wp=rw
|-+- policy='round-robin 0' prio=50 status=active
| |- 1:0:0:3 sde 8:64 active ready running
| |- 3:0:2:3 sdu 65:64 active ready running
| |- 1:0:8:3 sdq 65:0 active ready running
| `- 3:0:4:3 sdy 65:128 active ready running
`-+- policy='round-robin 0' prio=10 status=enabled
|- 1:0:6:3 sdi 8:128 active ready running
|- 3:0:8:3 sdac 65:192 active ready running
|- 1:0:7:3 sdm 8:192 active ready running
`- 3:0:9:3 sdan 66:112 active ready running
#/dev/下面
[root@TKBS-PDB dev]# ls -l|grep -i disk
drwxr-xr-x 5 root root 100 Oct 10 2018 disk
brw-rw---- 1 root disk 253, 0 Oct 9 2018 dm-0
brw-rw---- 1 root disk 253, 1 Oct 9 2018 dm-1
... ...
... ...
... ...
brw-rw---- 1 root disk 253, 37 May 18 14:51 dm-37
brw-rw---- 1 root disk 7, 0 Oct 9 2018 loop0
... ...
... ...
... ...
brw-rw---- 1 root disk 7, 7 Oct 9 2018 loop7
brw-rw---- 1 root disk 1, 0 Oct 9 2018 ram0
... ...
... ...
... ...
brw-rw---- 1 root disk 1, 15 Oct 9 2018 ram15
brw-rw---- 1 root disk 8, 0 Oct 9 2018 sda
brw-rw---- 1 root disk 8, 1 Oct 9 2018 sda1
brw-rw---- 1 root disk 8, 2 Oct 9 2018 sda2
brw-rw---- 1 root disk 65, 160 Apr 3 2020 sdaa
... ...
... ...
... ...
brw-rw---- 1 root disk 67, 48 Jan 20 2021 sdaz
brw-rw---- 1 root disk 8, 16 Oct 9 2018 sdb
brw-rw---- 1 root disk 67, 64 Jan 20 2021 sdba
... ...
... ...
... ...
brw-rw---- 1 root disk 68, 16 May 6 14:42 sdbn
brw-rw---- 1 root disk 8, 32 Aug 11 19:32 sdc
... ...
... ...
... ...
brw-rw---- 1 root disk 65, 144 Aug 11 19:32 sdz
crw-rw---- 1 root disk 21, 0 Oct 9 2018 sg0
crw-rw---- 1 root disk 21, 1 Oct 9 2018 sg1
... ...
... ...
... ...
crw-rw---- 1 root disk 21, 65 May 6 14:42 sg65
# /dev/mapper下面
$ls -lrt
total 0
lrwxrwxrwx 1 root root 7 Jun 23 15:54 mpathf -> ../dm-3
lrwxrwxrwx 1 root root 8 Jun 23 15:54 mpathh -> ../dm-31
lrwxrwxrwx 1 root root 7 Jun 23 15:54 mpathd -> ../dm-5
lrwxrwxrwx 1 root root 7 Jun 23 15:54 mpathc -> ../dm-2
lrwxrwxrwx 1 root root 8 Jun 23 15:54 mpathj -> ../dm-33
lrwxrwxrwx 1 root root 8 Jun 23 15:54 mpathi -> ../dm-32
lrwxrwxrwx 1 root root 8 Jun 23 15:54 mpathg -> ../dm-30
lrwxrwxrwx 1 root root 7 Jun 23 15:54 mpathe -> ../dm-4
crw-rw---- 1 root root 10, 58 Oct 9 2018 control
lrwxrwxrwx 1 root root 7 Oct 9 2018 rootvg-swap -> ../dm-0
lrwxrwxrwx 1 root root 8 Oct 9 2018 datavg-pbslog -> ../dm-24
lrwxrwxrwx 1 root root 7 Oct 9 2018 rootvg-root -> ../dm-1
lrwxrwxrwx 1 root root 8 Oct 9 2018 rootvg-tivoli -> ../dm-28
lrwxrwxrwx 1 root root 8 Oct 9 2018 rootvg-tmp -> ../dm-27
lrwxrwxrwx 1 root root 8 Oct 9 2018 rootvg-var -> ../dm-26
lrwxrwxrwx 1 root root 8 Oct 9 2018 rootvg-kdump -> ../dm-29
lrwxrwxrwx 1 root root 7 Jan 20 2021 datavg-db2inst1 -> ../dm-6
lrwxrwxrwx 1 root root 7 May 6 14:44 datavg-pbsdta01 -> ../dm-8
lrwxrwxrwx 1 root root 7 May 6 14:47 datavg-pbsdta02 -> ../dm-9
lrwxrwxrwx 1 root root 8 May 6 14:49 datavg-pbsdta03 -> ../dm-10
lrwxrwxrwx 1 root root 8 May 6 14:51 datavg-pbsdta04 -> ../dm-11
lrwxrwxrwx 1 root root 8 May 6 14:55 datavg-pbsdta05 -> ../dm-12
lrwxrwxrwx 1 root root 8 May 6 14:57 datavg-pbsdta06 -> ../dm-13
lrwxrwxrwx 1 root root 8 May 6 15:03 datavg-pbsdta07 -> ../dm-14
lrwxrwxrwx 1 root root 8 May 6 15:06 datavg-pbsdta08 -> ../dm-15
lrwxrwxrwx 1 root root 8 May 6 15:09 datavg-pbsdta09 -> ../dm-16
lrwxrwxrwx 1 root root 8 May 6 15:14 datavg-pbsdta10 -> ../dm-17
lrwxrwxrwx 1 root root 8 May 6 15:18 datavg-pbsdta11 -> ../dm-18
lrwxrwxrwx 1 root root 8 May 6 15:21 datavg-pbsdta12 -> ../dm-19
lrwxrwxrwx 1 root root 8 May 6 15:27 datavg-pbsdta13 -> ../dm-20
lrwxrwxrwx 1 root root 8 May 6 15:33 datavg-pbsdta14 -> ../dm-21
lrwxrwxrwx 1 root root 8 May 6 15:40 datavg-pbsdta15 -> ../dm-22
lrwxrwxrwx 1 root root 8 May 6 15:45 datavg-pbsdta16 -> ../dm-23
lrwxrwxrwx 1 root root 7 May 8 15:01 datavg-pbsdta -> ../dm-7
lrwxrwxrwx 1 root root 8 May 18 14:50 db2temp-data1 -> ../dm-34
lrwxrwxrwx 1 root root 8 May 18 14:50 db2temp-data2 -> ../dm-35
lrwxrwxrwx 1 root root 8 May 18 14:51 db2temp-data3 -> ../dm-36
lrwxrwxrwx 1 root root 8 May 18 14:51 db2temp-data4 -> ../dm-37
lrwxrwxrwx 1 root root 8 Jun 23 15:54 datavg-pbsarclog -> ../dm-25
multipath在Redhat 5 中的基本配置过程:
# 1、安装和加载多路径软件包
$ rpm -ivh device-mapper-1.02.39-1.el5.rpm #安装映射包
$ rpm -ivh device-mapper-multipath-0.4.7-34.el5.rpm #安装多路径包
$ chkconfig –level 2345 multipathd on #设置成开机自启动multipathd
$ lsmod |grep dm_multipath #来检查安装是否正常
# 如果模块没有加载成功请使用下列命初始化DM,或重启系统
---Use the following commands to initialize and start DM for the first time:
$ modprobe dm-multipath
$ modprobe dm-round-robin
$ service multipathd start
$ multipath –v2
# 配置multipath:Multipath的配置文件是/etc/multipath.conf ,
#multipath基本操作命令
$ /etc/init.d/multipathd start #开启mulitipath服务
$ multipath -F #删除现有没有使用的路径
$ multipath -v2 #格式化路径,检测路径,合并路径
$ multipath -ll #查看多路径状态
#如果配置正确的话就会在/dev/mapper/目录下多出mpath0、mpath1等之类设备。通常不一定显示完全,需要重启系统。
#用fdisk -l命令可以看到多路径软件创建的磁盘,
$ fdisk -l|grep -i /dev/
Disk /dev/sda: 599.6 GB, 599584145408 bytes
/dev/sda1 * 1 64 512000 83 Linux
/dev/sda2 64 72896 585018368 8e Linux LVM
Disk /dev/sdb: 2199.0 GB, 2199023255552 bytes
... ...
... ...
... ...
Disk /dev/sdz: 2199.0 GB, 2199023255552 bytes
Disk /dev/mapper/mpathc: 2199.0 GB, 2199023255552 bytes
... ...
... ...
... ...
Disk /dev/mapper/mpathj: 2199.0 GB, 2199023255552 bytes
Disk /dev/mapper/rootvg-swap: 34.4 GB, 34359738368 bytes
Disk /dev/mapper/rootvg-root: 17.2 GB, 17179869184 bytes
Disk /dev/mapper/rootvg-var: 17.2 GB, 17179869184 bytes
Disk /dev/mapper/rootvg-tmp: 8589 MB, 8589934592 bytes
Disk /dev/mapper/rootvg-tivoli: 8589 MB, 8589934592 bytes
Disk /dev/mapper/rootvg-kdump: 34.4 GB, 34359738368 bytes
Disk /dev/mapper/datavg-db2inst1: 134.2 GB, 134217728000 bytes
Disk /dev/mapper/datavg-pbsdta: 429.5 GB, 429496729600 bytes
Disk /dev/mapper/datavg-pbsdta01: 1003.9 GB, 1003948605440 bytes
... ...
... ...
... ...
Disk /dev/mapper/datavg-pbsdta16: 1003.9 GB, 1003948605440 bytes
Disk /dev/mapper/datavg-pbslog: 214.7 GB, 214748364800 bytes
Disk /dev/mapper/datavg-pbsarclog: 697.9 GB, 697932185600 bytes
Disk /dev/sdaa: 2199.0 GB, 2199023255552 bytes
... ...
... ...
... ...
Disk /dev/sdbm: 2199.0 GB, 2199023255552 bytes
Disk /dev/mapper/db2temp-data1: 211.5 GB, 211527139328 bytes
Disk /dev/mapper/db2temp-data2: 211.5 GB, 211527139328 bytes
Disk /dev/mapper/db2temp-data3: 211.5 GB, 211527139328 bytes
Disk /dev/mapper/db2temp-data4: 211.5 GB, 211527139328 bytes
[root@TKBS-PDB by-id]# pvs
PV VG Fmt Attr PSize PFree
/dev/mapper/mpathc datavg lvm2 a--u 2.00t 0
... ...
/dev/mapper/mpathj datavg lvm2 a--u 2.00t 0
/dev/sda2 rootvg lvm2 a--u 557.91g 445.91g
/dev/sdbf db2temp lvm2 a--u 893.25g 105.25g
[root@TKBS-PDB by-id]# vgs
VG #PV #LV #SN Attr VSize VFree
datavg 8 20 0 wz--n- 16.00t 48.97g
db2temp 1 4 0 wz--n- 893.25g 105.25g
rootvg 1 6 0 wz--n- 557.91g 445.91g
[root@TKBS-PDB by-id]# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
db2inst1 datavg -wi-ao---- 125.00g
pbsarclog datavg -wi-ao---- 650.00g
pbsdta datavg -wi-ao---- 400.00g
pbsdta01 datavg -wi-ao---- 935.00g
... ...
... ...
... ...
data3 db2temp -wi-ao---- 197.00g
data4 db2temp -wi-ao---- 197.00g
kdump rootvg -wi-ao---- 32.00g
root rootvg -wi-ao---- 16.00g
swap rootvg -wi-ao---- 32.00g
tivoli rootvg -wi-ao---- 8.00g
tmp rootvg -wi-ao---- 8.00g
var rootvg -wi-ao---- 16.00g
$ blkid
/dev/mapper/rootvg-kdump: UUID="9acf890c-c920-4e00-b905-d4b10e926bfb" TYPE="ext4"
/dev/sda1: UUID="1632b6bf-e136-405d-ae14-eb845e51a9f8" TYPE="ext4"
/dev/sda2: UUID="t9dRFy-8wY3-yjJi-uXxF-ucN6-xHze-qjGPPB" TYPE="LVM2_member"
/dev/sdb: UUID="XEA308-qcOU-y6BI-cQs7-0KEL-HNLG-hBt8Uk" TYPE="LVM2_member"
... ...
... ...
... ...
/dev/sdx: UUID="vm6ViR-Fa5h-CraC-wtBQ-8TY7-nINW-BJ6CYD" TYPE="LVM2_member"
/dev/sdy: UUID="hOmP0J-OUTL-n0xz-iYNd-K4uD-DghB-JsGq1f" TYPE="LVM2_member"
/dev/mapper/rootvg-swap: UUID="83b93d4a-4b32-4589-9ca6-f05e95294306" TYPE="swap"
/dev/sdv: UUID="XEA308-qcOU-y6BI-cQs7-0KEL-HNLG-hBt8Uk" TYPE="LVM2_member"
/dev/mapper/rootvg-root: UUID="0de2cbef-bfb2-4329-926e-d5b133bb1091" TYPE="ext4"
/dev/mapper/mpathc: UUID="XEA308-qcOU-y6BI-cQs7-0KEL-HNLG-hBt8Uk" TYPE="LVM2_member"
multipath磁盘的基本操作
要对多路径软件生成的磁盘进行操作直接操作/dev/mapper/目录下的磁盘就行.
在对多路径软件生成的磁盘进行分区之前最好运行一下pvcreate命令:
# pvcreate /dev/mapper/mpath0
# fdisk /dev/mapper/mpath0
用fdisk对多路径软件生成的磁盘进行分区保存时会有一个报错,此报错不用理会。
fdisk对多路径软件生成的磁盘进行分区之后,所生成的磁盘分区并没有马上添加到/dev/目录下,此时我们要重启IPSAN或者FCSAN的驱动,如果是用iscsi-initiator来连接IPSAN的重启ISCSI服务就可以发现所生成的磁盘分区了
# service iscsi restart
# ls -l /dev/mapper/
如上图中的mpath0p1和mpath1p1就是我们对multipath磁盘进行的分区
# mkfs.ext3 /dev/mapper/mpath0p1 #对mpath0p1分区格式化成ext3文件系统
# mount /dev/mapper/mpath0p1 /ipsan/ #挂载mpath0p1分区
# mkfs.ext3 /dev/mapper/mpath1p1 #对mpath1p1分区格式化成ext3文件系统
# mount /dev/mapper/mpath1p1 /ipsan/ #挂载mpath1p1分区
2个都要格式化,2个路径都挂在一个挂载点,可能是这样!!!这个还需要弄清楚。。
负载均衡测试:
可以使用dd命令来对设备进行读写操作,并同时通过iostat来查看I/0状态,流量从哪个路径出去:
DD命令:dd if=/dev/zero of=/mnt/1Gfile bs=8k count=131072 在上面我们已经把磁盘挂载在/MNT文件夹下所以我们在读写磁盘时直接对/mnt文件夹直接读写就可以了。
如果想对磁盘重复读写可以用如下语句:
[root@liujing ~]# for ((i=1;i<=5;i++));do dd if=/dev/zero of=/mnt/1Gfile bs=8k count=131072 2>&1|grep MB;done; —重复读写5次这个值可以根据自己测试需求修改。
##################使用uuid挂载
UUID 全称是 Universally Unique Identifier,也就是说,每个分区有一个唯一的 UUID 值,这样就不会发生分区识别混乱的问题了。

被折叠的 条评论
为什么被折叠?



