LVM---动态调整磁盘容量
一、创建逻辑卷的步骤:
1)通过fdisk 工具将磁盘转换为linux分区
2)通过pvcreate命令将linux分区转换成物理卷(PV);
3)通过vgcreate命令将创建好的物理卷处理成卷组(VG);
4)通过lvcreate命令将卷组分成若干个逻辑卷(LV);
5)对逻辑卷进行格式化,挂载,动态调整逻辑卷的大小,并且该操作不会影响逻辑卷(Lv)上的数据。
二、物理卷(PV)创建及管理具体操作步骤:
1)先查看linux分区,将未使用空间转换为物理卷(先使用fdisk建立普通分区)
[root@RHEL5 ~]# fdisk -l /dev/sdb #查看linux分区情况
Disk /dev/sdb: 21.4 GB, 21474836480 bytes
255 heads, 63 sectors/track, 2610 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/sdb1 1 500 4016218+ 83 Linux
/dev/sdb2 501 1000 4016250 83 Linux
/dev/sdb3 1001 1500 4016250 83 Linux
/dev/sdb4 1501 2610 8916075 5 Extended
/dev/sdb5 1501 2610 8916043+ 83 Linux
备注:/dev/sdb是一块新增加的磁盘,上面没有任何数据,也未挂载
2)将linux物理分区转变为物理卷
[root@RHEL5 ~]# pvcreate /dev/sdb{1,2} #将物理分区/dev/sdb{1,2}转变为物理卷
Physical volume "/dev/sdb1" successfully created
Physical volume "/dev/sdb2" successfully created
3)#使用Pvscan查看物理卷信息
[root@RHEL5 ~]# pvscan #查看物理卷信息,会显示所有物理卷信息
PV /dev/sda2 VG VolGroup00 lvm2 [39.88 GB / 0 free]
PV /dev/sdb1 lvm2 [3.83 GB]
PV /dev/sdb2 lvm2 [3.83 GB]
Total: 3 [47.54 GB] / in use: 1 [39.88 GB] / in no VG: 2 [7.66 GB]
4)使用pvdisplay查看各物理卷详细参数
[root@RHEL5 ~]# pvdisplay #查看各物理卷详细参数
--- Physical volume ---
PV Name /dev/sda2
VG Name VolGroup00
PV Size 39.90 GB / not usable 20.79 MB
Allocatable yes (but full)
PE Size (KByte) 32768
Total PE 1276
Free PE 0
Allocated PE 1276
PV UUID aJlaad-NHPT-Cgg3-7yu4-a2RJ-kJJ1-qxSFgD
--- NEW Physical volume ---
PV Name /dev/sdb1
VG Name
PV Size 3.83 GB
Allocatable NO
PE Size (KByte) 0
Total PE 0
Free PE 0
Allocated PE 0
PV UUID v2VajD-yS53-SiQA-yTzu-KOiD-RyT3-p0wTvt
--- NEW Physical volume ---
PV Name /dev/sdb2
VG Name
PV Size 3.83 GB
Allocatable NO
PE Size (KByte) 0
Total PE 0
Free PE 0
Allocated PE 0
PV UUID iOoK3V-yuww-ZlLF-cRLq-v7hC-CL7c-0bQU1x
----------------------------------------------------------------------
当物理卷没有被使用时可删除物理卷
[root@RHEL5 /]# pvremove /dev/sdb2 #删除物理卷,
Labels on physical volume "/dev/sdb2" successfully wiped
----------------------------------------------------------------------
三、卷组(VG)创建及管理具体操作步骤:
1)使用vgcreate将物理卷转化为卷组
[root@RHEL5 /]# vgcreate vg01 /dev/sdb{1,2} #将已经是物理卷的/dev/sdb{1,2}转化为卷组名为vg01的卷组
Volume group "vg01" successfully created
备注:以上未加参数,扩展块(PE)大小默认4M,若通过 vgcreate -s 8M vg01 /dev/sdb{1,2},则指定了扩展块大小为8M
2)使用vgdisplay 查看所有卷组详细信息
[root@RHEL5 /]# vgdisplay #看所有卷组详细信息
--- Volume group ---
VG Name vg01
System ID
Format lvm2
Metadata Areas 2
Metadata Sequence No 1
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 0
Open LV 0
Max PV 0
Cur PV 2
Act PV 2
VG Size 7.66 GB
PE Size 4.00 MB
Total PE 1960
Alloc PE / Size 0 / 0
Free PE / Size 1960 / 7.66 GB
VG UUID 1g8QL0-0cGM-TJji-Q98P-LJ3f-PhDN-2ouSM3
--- Volume group ---
VG Name VolGroup00
System ID
Format lvm2
Metadata Areas 1
Metadata Sequence No 3
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 2
Open LV 2
Max PV 0
Cur PV 1
Act PV 1
VG Size 39.88 GB
PE Size 32.00 MB
Total PE 1276
Alloc PE / Size 1276 / 39.88 GB
Free PE / Size 0 / 0
VG UUID AhhisY-vDrc-s4jx-XIsn-QmCp-wMiT-2v01YZ
备注:也可以通过 [root@RHEL5 /]# vgdisplay -v /dev/vg01 查看具体某一卷组详细信息
3)查看卷组信息
[root@RHEL5 /]# vgscan #查看卷组信息
Reading all physical volumes. This may take a while...
Found volume group "vg01" using metadata type lvm2
Found volume group "VolGroup00" using metadata type lvm2
4)扩展卷组vgextend,将某个物理卷添加到已存在的卷组中
[root@RHEL5 /]# pvcreate /dev/sdb3 #创建一个新的物理卷
Physical volume "/dev/sdb3" successfully created
[root@RHEL5 /]# vgextend vg01 /dev/sdb3 #将新增的物理卷添加到vg01卷组中
Volume group "vg01" successfully extended
-----------------------------------------------------------------------
使用vgremove删除卷组
[root@RHEL5 /]# vgremove /dev/vg01
Volume group "vg01" successfully removed
-----------------------------------------------------------------------
四、逻辑卷(LV)创建及管理具体操作步骤:
1)创建逻辑卷大小为6G卷名为data,从vg01生成
[root@RHEL5 /]# lvcreate -L 6G -n data vg01 #从卷组vg01上划分6G的空间为逻辑卷data
Logical volume "data" created
2)对划分的逻辑卷进行格式化
[root@RHEL5 /]# mkfs -t ext3 /dev/vg01/data #以ext3的文件格式化逻辑卷
mke2fs 1.39 (29-May-2006)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
786432 inodes, 1572864 blocks
78643 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=1610612736
48 block groups
32768 blocks per group, 32768 fragments per group
16384 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736
Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done
This filesystem will be automatically checked every 35 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.
备注:也可通过 [root@RHEL5 /]# mkfs.ext3 /dev/vg01/data 格式化
3)使用lvsacn查看逻辑卷的信息
[root@RHEL5 /]# lvscan #查看逻辑卷的信息
ACTIVE '/dev/vg01/data' [6.00 GB] inherit
ACTIVE '/dev/VolGroup00/LogVol00' [38.88 GB] inherit
ACTIVE '/dev/VolGroup00/LogVol01' [1.00 GB] inherit
4)使用lvdisplay查看逻辑卷的具体参数:
[root@RHEL5 /]# lvdisplay #查看逻辑卷的具体参数
--- Logical volume ---
LV Name /dev/vg01/data
VG Name vg01
LV UUID QUmuTB-ofgI-9BbG-1DvN-gWzo-7Vqb-Twmf45
LV Write Access read/write
LV Status available
# open 0
LV Size 6.00 GB
Current LE 1536
Segments 2
Allocation inherit
Read ahead sectors 0
Block device 253:2
--- Logical volume ---
LV Name /dev/VolGroup00/LogVol00
VG Name VolGroup00
LV UUID SrNP2L-bOWm-4clq-22Lh-Fg10-ydeg-7dNpdH
LV Write Access read/write
LV Status available
# open 1
LV Size 38.88 GB
Current LE 1244
Segments 1
Allocation inherit
Read ahead sectors 0
Block device 253:0
--- Logical volume ---
LV Name /dev/VolGroup00/LogVol01
VG Name VolGroup00
LV UUID e7u6Wx-MXhq-Nc2o-lrF9-yea1-Hia5-Cv7d7e
LV Write Access read/write
LV Status available
# open 1
LV Size 1.00 GB
Current LE 32
Segments 1
Allocation inherit
Read ahead sectors 0
Block device 253:1
备注:也可使用 [root@RHEL5 /]# lvdisplay -v /dev/vg01/data 查看某一逻辑卷详细参数
5)使用lvextend增大逻辑卷大小,在线扩容
[root@RHEL5 /]# lvextend -L +1G /dev/vg01/data #从卷组vg01上对逻辑卷/dev/vg01/data进行扩容,逻辑卷大小变为7GB
Extending logical volume data to 7.00 GB
Logical volume data successfully resized
6)使用resize2fs命令更新系统识别的文件系统大小,立即生效
[root@RHEL5 /]# resize2fs /dev/vg01/data #使增加的逻辑卷大小立即生效
resize2fs 1.39 (29-May-2006)
Resizing the filesystem on /dev/vg01/data to 1835008 (4k) blocks.
The filesystem on /dev/vg01/data is now 1835008 blocks long.
7)使用lvreduce减小逻辑卷大小,必须是离线方式(即先卸载文件系统)
[root@RHEL5 /]# lvreduce -L -1G /dev/vg01/data #将逻辑卷/dev/vg01/data容量减小1GB
/dev/cdrom: open failed: Read-only file system
WARNING: Reducing active logical volume to 6.00 GB
THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce data? [y/n]: y
Reducing logical volume data to 6.00 GB
Logical volume data successfully resized
[root@RHEL5 /]# resize2fs /dev/vg01/data #使减少的逻辑卷大小立即生效
resize2fs 1.39 (29-May-2006)
Resizing the filesystem on /dev/vg01/data to 1572864 (4k) blocks.
resize2fs: Can't read an block bitmap while trying to resize /dev/vg01/data
备注:缩小逻辑卷通常要先卸载文件系统,并且缩小后空间容量必须大于等于文件当前占用的容量,若操作不当,会导致数据丢失,须谨慎。
[root@RHEL5 /]# lvscan #查看逻辑卷大小变为6GB
ACTIVE '/dev/vg01/data' [6.00 GB] inherit
ACTIVE '/dev/VolGroup00/LogVol00' [38.88 GB] inherit
ACTIVE '/dev/VolGroup00/LogVol01' [1.00 GB] inherit
备注:
--------------------------------------------------------------------
删除逻辑卷
[root@RHEL5 /]#lvremove /dev/vg01/data
--------------------------------------------------------------------
五、挂载逻辑卷
1)将逻辑卷挂载到/quota目录
[root@RHEL5 /]# mount /dev/vg01/data /quota/ #将逻辑卷挂载到/quota
[root@RHEL5 /]# df -hT
Filesystem Type Size Used Avail Use% Mounted on
/dev/mapper/VolGroup00-LogVol00
ext3 38G 11G 26G 29% /
/dev/sda1 ext3 99M 12M 82M 13% /boot
tmpfs tmpfs 233M 0 233M 0% /dev/shm
/dev/hdc iso9660 224M 224M 0 100% /media/cdrom
/dev/mapper/vg01-data
ext3 6.9G 142M 6.5G 3% /quota
2)设置开机自动挂载
[root@RHEL5 /]#vi /etc/fstab #设置开机自动挂载
/dev/VolGroup00/LogVol00 / ext3 defaults 1 1
LABEL=/boot /boot ext3 defaults 1 2
devpts /dev/pts devpts gid=5,mode=620 0 0
tmpfs /dev/shm tmpfs defaults 0 0
proc /proc proc defaults 0 0
sysfs /sys sysfs defaults 0 0
/dev/VolGroup00/LogVol01 swap swap defaults 0 0
/dev/vg01/data /quota ext3 defaults 0 0
六、逻辑卷快照管理功能,可以把卷中的数据冻结起来,类似于为这些数据拍一张照片,可以永久保存建立快照当时的状态。
1)创建卷快照
[root@RHEL5 ~]# lvcreate -L 1G -s -n snaplv1 /dev/vg01/data # lvcreate -L 原始逻辑卷大小的15%-20% -s -n 快照名 源逻辑卷名
Logical volume "snaplv1" created
备注:和创建逻辑卷差不多,只是加了参数 -s
[root@RHEL5 ~]# lvscan #查看状态为 snapshot
ACTIVE Original '/dev/vg01/data' [6.00 GB] inherit
ACTIVE Snapshot '/dev/vg01/snaplv1' [1.00 GB] inherit
ACTIVE '/dev/VolGroup00/LogVol00' [38.88 GB] inherit
ACTIVE '/dev/VolGroup00/LogVol01' [1.00 GB] inherit
2)创建好快照后也需要挂载点
[root@RHEL5 ~]# mkdir /snap #创建快照挂载点
[root@RHEL5 ~]# mount /dev/vg01/snaplv1 /snap #挂载快照到/snap
备注:snap中的文件与/quota下一样,即使在/quota下新增或删除文件,/snap仍然保持不变,此时可对/snap进行备份。
3)由于每产生一个卷快照就会占用一部分卷组空间,因此产生的卷快照越多,卷组可用的空间就会越来越少。所以在完成备份后就可删除快照了。
[root@RHEL5 quota]# umount /snap/ #卸载快照
[root@RHEL5 quota]# lvremove /dev/vg01/snaplv1 #删除快照
/dev/cdrom: open failed: Read-only file system
Do you really want to remove active logical volume "snaplv1"? [y/n]: y
Logical volume "snaplv1" successfully removed
七、当有一天实体磁盘的分区出现了故障,必须要更换硬盘时,该如何处理?LVM提供了pvmove工具,可以将一个物理卷上的数据转移到另外一个物理卷上。
1)将新的物理卷加入到卷组中
[root@RHEL5 /]# pvcreate /dev/sdc1 #将linux分区转换为物理卷
Physical volume "/dev/sdc1" successfully created
[root@RHEL5 /]# vgextend vg01 /dev/sdc1 #将新增的物理卷添加到vg01卷组中
Volume group "vg01" successfully extended
2)移动物理卷上的数据到新加入的物理卷上
[root@RHEL5 ~]# pvmove /dev/sdb1 /dev/sdc1 #将/dev/sdb1的数据移动到/dev/sdc1上
/dev/sdb1: Moved: 41.7%
/dev/sdb1: Moved: 84.2%
/dev/sdb1: Moved: 100.0%
备注:此时可使用pvscan查看变化
3)将旧的物理卷从卷组中卸载
[root@RHEL5 ~]# vgreduce vg01 /dev/sdb1 #使用vgreduce将/dev/sdb1从卷组vg01中分离
Removed "/dev/sdb1" from volume group "vg01"
[root@RHEL5 ~]# pvremove /dev/sdb1 #最后要能够取下物理磁盘维修,则需要删除此物理卷;若物理磁盘划分成了多个物理卷,则需要将所有物理卷都删除才可以。
Labels on physical volume "/dev/sdb1" successfully wiped
八、当有一天需要将整个LVM的磁盘迁移到另外一台计算机中,则需要按以下步骤:
1)在原先的计算机上导出卷组
[root@RHEL5 ~]#umount /dev/vg01/data #导出卷组前要先卸载该卷组中所有逻辑卷
[root@RHEL5 ~]#vgchange -a n vg01 #使用vgchange将卷组修改为非有效(inactive)配置
[root@RHEL5 ~]#vgexport vg01 #使用vgexport导出卷组
2)将LVM磁盘安装到目的计算机上
3)在目的计算机上导入卷组
[root@RHEL5 ~]#pvscan #使用pvscan扫描所有物理卷,以便让linux可以驱动这些物理卷
[root@RHEL5 ~]#vgimport vg01 #导入卷组
[root@RHEL5 ~]#vgchange -a y vg01 #将卷组修改为有效(active)配置
4)挂载逻辑卷
[root@RHEL5 ~]#mount /devv/vg01/data /quota #将逻辑卷挂载到文件系统
九、 以上是对新增磁盘进行LVM划分。而通常在安装系统时就采用了LVM划分磁盘,按需调整磁盘空间。当有一天,你发现某个文件系统空间不够时,此时需要扩容。
比如说:现在有需求要将weblogic92安装在 /weblogic下。而 / 空间不够。这样就需要将新增的逻辑卷挂载到/weblogic就OK了。
1)使用df查看各文件系统大小
[root@tydic4f20 /]# df -hT #查看各文件系统大小
Filesystem Type Size Used Avail Use% Mounted on
/dev/mapper/vg00-LogVol00
ext3 3.0G 2.0G 820M 71% /
/dev/mapper/vg00-lvopt
ext3 3.0G 69M 2.7G 3% /opt
/dev/mapper/vg00-lvusr
ext3 6.8G 4.3G 2.2G 67% /usr
/dev/mapper/vg00-lvhome
ext3 3.0G 75M 2.7G 3% /home
/dev/mapper/vg00-lvpublic
ext3 20G 1.8G 17G 10% /public
/dev/mapper/vg00-lvtmp
ext3 3.0G 70M 2.7G 3% /tmp
/dev/mapper/vg00-lvvar
ext3 3.0G 177M 2.6G 7% /var
/dev/sda1 ext3 99M 20M 75M 21% /boot
tmpfs tmpfs 7.9G 0 7.9G 0% /dev/shm
2)使用lvscan查看可知道卷组名字为vg00
[root@tydic4f20 /]# lvscan #使用lvscan查看
ACTIVE '/dev/vg00/LogVol00' [3.00 GB] inherit
ACTIVE '/dev/vg00/lvopt' [3.00 GB] inherit
ACTIVE '/dev/vg00/lvusr' [7.00 GB] inherit
ACTIVE '/dev/vg00/lvhome' [3.00 GB] inherit
ACTIVE '/dev/vg00/lvpublic' [20.00 GB] inherit
ACTIVE '/dev/vg00/lvtmp' [3.00 GB] inherit
ACTIVE '/dev/vg00/lvvar' [3.00 GB] inherit
ACTIVE '/dev/vg00/LogVol01' [17.62 GB] inherit
3) [root@tydic4f20 /]#lvcreate -L 20G -n lvweblogic vg00 #从卷组vg00上划分20G的空间为逻辑卷lvweblogic
Logical volume "lvweblogic" created
4)对划分的逻辑卷进行格式化
[root@tydic4f20 /]# mkfs -t ext3 /dev/vg00/lvweblogic #以ext3的文件格式化逻辑卷
备注:注意,接下来是挂载,为了使开机自动挂载,需要修改/etc/fstab,可参照上面逻辑卷创建方法。
十、逻辑卷创建及删除推荐步骤
创建逻辑卷(LV)的顺序:Linux分区---物理卷(PV)---卷组(VG)---逻辑卷(LV)---挂载到文件系统
删除逻辑卷(LV)的顺序:卸载文件系统----逻辑卷(LV)---卷组(VG)----物理卷(PV)---Linux分区
本文出自 “唐光辉” 博客,请务必保留此出处http://firefly222.blog.51cto.com/899793/413515
LVM---动态调整磁盘容量的更多相关文章
- 六、LVM和从磁盘配额
一.LVM概述 Logical Volume Manager,逻辑卷管理 优点:能够保证在现有数据不变的情况下,动态调整磁盘容量,从而提高磁盘管理的灵活性 /boot分区用于存放引导文件,不能基于LV ...
- VirtualBox 磁盘容量调整
起因 此前用VBox,初始时动态或固定分配的磁盘容量用完了就再重新建一个磁盘,但是有个虚拟机的系统分区容量不够了,把整个磁盘都分成系统盘仍然不够,于是研究了下磁盘容量调整问题. 正文 1,从当前虚拟机 ...
- Linux下动态调整LVM文件系统大小
LINUX下可以通过LVM动态调整一个已挂载的文件系统大小 LV可以根据需求增大或减小,但是LV改变大小以后,在LV中的文件系统也需要相应的改变大小.这个概念非常重要,如果没有相应的调整LV中文件系统 ...
- Linux下基于LVM调整分区容量大小的方法
Linux下调整分区容量大小的方法(适用于centos6-7) 说明:以下方法均使用centos6.9和centos7.4进行测试. Centos6分区容量调整方法 1.web分区空间不足,新添加一块 ...
- LVM : 扩展文件系统的容量
如果发现文件系统的容量不足了,可以通过 LVM 轻松的进行扩展(当然也可以进行缩减操作).本文将紧接前文中的 demo 详细的介绍扩展文件系统的操作过程.说明:本文的演示环境为 ubuntu 16.0 ...
- VMware 扩展磁盘容量
背景:创建虚拟机后,发现原先定的磁盘容量不够了,这时候可以通过vmware扩展磁盘容量 步骤一 先关闭虚拟机,右键虚拟机设置:(我没关虚拟机,所以灰显了) 步骤二: 启动VMware环境下的Linux ...
- Disk:磁盘管理之LVM和系统磁盘扩容
简介 小伙伴们好,好久不见,今天想给大家介绍一下关于磁盘管理的方法和心得:磁盘管理可谓运维工作中的重要内容,主要包括磁盘的合理规划以及扩缩容 常用的磁盘管理方法为LVM(Logical Volume ...
- 2.lvm动态逻辑卷
Lvm动态逻辑卷 一. 基本概念 LVM 把实际的物理磁盘数据映射到一个简单而灵活的虚拟逻辑存储视图上,藉以控制磁盘资源: 也就是重新考虑了管理文件系统和卷的方法,在文件系统管 ...
- 扩展VirtualBox虚拟机磁盘容量
1. 在cmd命令行下进入VirtualBox的安装目录,使用“VBoxManage list hdds”命令,找到需要修改磁盘容量的虚拟机的img路径或UUID: VirtualBox安装目录> ...
随机推荐
- meta标签兼容性
基本标签SEO 优化为移动设备添加 viewportWindows 8其他 禁止数字识自动别为电话号码不让android识别邮箱每 8 秒刷新一次页面移动端的头部标签和meta 基本标签 声明文档使用 ...
- 在FreeBSD上安装Bugzilla
Bugzilla 是一款开源的 Web 应用,是一款bug跟踪系统和测试工具,由 mozilla 开发,并采用 Mozilla 公共许可证授权(MPL),它经常被一些高科技公司如 mozilla.红帽 ...
- 递归神经网络之理解长短期记忆网络(LSTM NetWorks)(转载)
递归神经网络 人类并不是每时每刻都从头开始思考.正如你阅读这篇文章的时候,你是在理解前面词语的基础上来理解每个词.你不会丢弃所有已知的信息而从头开始思考.你的思想具有持续性. 传统的神经网络不能做到这 ...
- android 点击edittext弹出软键盘,否则不弹
只需要加android:windowSoftInputMode="stateHidden|stateAlwaysHidden"就可以 如:<activity android: ...
- 2015GitWebRTC编译实录9
2015.07.20 neteq 编译通过注意不要引用tools目录里的内容 [1347/1600 ] CXX obj /webrtc/modules/audio_coding/neteq/neteq ...
- codeforces magic five --快速幂模
题目链接:http://codeforces.com/contest/327/problem/C 首先先算出一个周期里面的值,保存在ans里面,就是平常的快速幂模m做法. 然后要计算一个公式,比如有k ...
- 文件API及其特点
Internet Explorer 10 和使用 JavaScript 的 Windows 应用商店应用引入了对文件 API 的支持.文件 API 是万维网联合会 (W3C) 的一个 Web 规范草案 ...
- 3-5 RPM包校验
1.RPM包校验 <1>rpm -V 已安装的包名 <2>选项: -V 校验制定RPM包中的文件(verify) <3>说明: <1>若没有显示任何内容 ...
- html-javascript前端页面刷新重载的方法汇总
记得我在兴安得力实习要转正的时候,我领导象征性的给我出了一套测试题目,里面就有js闭包和页面刷新等题目.今天把很久之前的测试题目之一,js页面刷新的方法以及页面自动刷新跳转和返回上一页和下一页等方法总 ...
- 二十四种设计模式:中介者模式(Mediator Pattern)
中介者模式(Mediator Pattern) 介绍用一个中介对象来封装一系列的对象交互.中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互. 示例有一个Messa ...