###########################
#####第四单元.管理系统存储####
###########################
@@注意:主分区+逻辑分区总个数不能超过15
@@注意:一般分区时,分三个主分区,第四个为扩展分区(容器),给其分配剩余所有空间
###1.分区的划分####
fdisk /dev/vdb ##进入分区划分
partprobe ##加载分区表
cat /proc/partitions ##查看分区信息
mkfs.xfs ##格式化分区=创建xfs文件系统
blkid ##查看文件系统类型
mount /dev/vdb1 挂载点 ##分区挂载
umount /dev/vdb1 挂载点 ##卸载挂载
vim /etc/fstab ##实现永久挂载
/dev/vdb1 挂载点 文件系统类型(xfs) defaults 0 0
mount -a
df ##查看已挂载的分区
####2.swap分区管理####
swapon -s ##查看系统中的swap分区
建立swap分区
mkswap /dev/vdb1 ##把/dev/vdb1格式化为swap分区
swapon -a /dev/vdb1 ##激活
上述激活方式,重启后激活消失,如需永久激活,需要修改配置文件
vim /etc/fstab ##开机自动激活
/dev/vdb1 swap swap defaults 0 0
设备 挂载点 文件系统类型
swapoff /dev/vdb1 ##关闭激活的swap分区
添加临时swap分区
dd if=/dev/zero of=/mnt/swapfilename bs=1M count=1000 ##在/mnt中划分一块名为swapfile的分区,块大小为1M,数量为1000
mkswap /dev/vdb1 ##格式化swap格式
swapon -a /dev/vdb1 ##激活
@@!!!实例:
[root@station mnt]# fdisk /dev/vdb
Welcome to fdisk (util-linux 2.23.2).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
Device does not contain a recognized partition table
Building a new DOS disklabel with disk identifier 0xa1575c6c.
Command (m for help): m
Command action
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)
Command (m for help): n ##选择新建分区
Partition type:
p primary (0 primary, 0 extended, 4 free) ##分区类型为主分区
e extended ##分区类型为扩展分区
Select (default p): ##默认为主分区
Using default response p
Partition number (1-4, default 1): 1 ##主分区id
First sector (2048-20971519, default 2048): ##此分区起始位置(一般为默认)
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-20971519, default 20971519): +100M ##分区大小
Partition 1 of type Linux and of size 100 MiB is set
Command (m for help): p
Disk /dev/vdb: 10.7 GB, 10737418240 bytes, 20971520 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0xa1575c6c
Device Boot Start End Blocks Id System
/dev/vdb1 2048 206847 102400 83 Linux
Command (m for help): wq ##保存退出,若输入为q表示放弃更改退出
The partition table has been altered!
[root@station mnt]# partprobe
[root@station mnt]# cat /proc/partitions ##同步分区表
major minor #blocks name
253 0 10485760 vda
253 1 10484142 vda1
253 16 10485760 vdb
253 17 102400 vdb1
文件类型:
vfat
ntfs
ext:日志文件系统,最大分区为32T
xfs:最大分区为18eb,1eb=1024t,最快吞吐速度可达8G/s
后两者Windows不识别
mkfs.xfs /dev/vdb5 ##格式化
mount /dev/vdb5 /mnt ##挂载
例子:
[root@station mnt]# mkfs.xfs /dev/vdb5
meta-data=/dev/vdb5 isize=256 agcount=4, agsize=6400 blks
= sectsz=512 attr=2, projid32bit=1
= crc=0
data = bsize=4096 blocks=25600, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=0
log =internal log bsize=4096 blocks=853, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
[root@station mnt]# blkid
/dev/vda1: UUID="9bf6b9f7-92ad-441b-848e-0257cbb883d1" TYPE="xfs"
/dev/vdb5: UUID="64d88d75-16fa-4441-80c9-806dae86fc6d" TYPE="xfs"
[root@station mnt]# mount /dev/vdb5 /mnt
[root@station mnt]# df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/vda1 10473900 3811544 6662356 37% /
devtmpfs 927072 0 927072 0% /dev
tmpfs 942660 140 942520 1% /dev/shm
tmpfs 942660 17116 925544 2% /run
tmpfs 942660 0 942660 0% /sys/fs/cgroup
/dev/vdb5 98988 5280 93708 6% /mnt
####3.磁盘加密###
fdisk /dev/vdb
cryptsetup luksFormat /dev/vdb1 ##对vdb1进行luks加密
cryptsetup open /dev/vdb1 westos ##打开加密锁,并对其给予一个新的名字
mkfs.xfs /dev/mapper/westos ##对其进行格式化
mount /dev/mapper/westos /mnt ##对westos进行挂载
umount /mnt/ ##@@注意:执行此操作时,应该不在/mnt目录下,否则会提醒设备正在被使用的警告或报错
cryptsetup close westos ##对westos进行关闭(即上锁)
#####加密磁盘的永久挂载####
vim /etc/crypttab ##此文件的作用相当于使系统执行cryptsetup open /dev/vdb1 nihao 的这条命令
内容如下:
格式为: 解密后设备管理文件 设备 加密字符(密码)存放文件
nihao /dev/vdb1 /root/lukspsfile
vim /root/lukspsfile ##密码所存放的文件
内容为:lizhengtai ##自己所设置的密码
chmod 600 /root/lukspsfile ##给予文件600的权限
cryptsetup luksAddKey /dev/vdb1 /root/lukspsfile ##将磁盘和密码文件链接对应起来
Enter any passphrase: ##执行上条连接命令时需要输入密码
vim /etc/fstab
内容为:
/dev/mapper/redhat /mnt xfs defaults 0 0
执行完上述命令后reboot虚拟机后,执行df命令,便可以看到效果(即此时设备已经被挂载)
#####加密清除#####
vim /etc/fstab ##进入/etc/fstab文件删除在第2步中写入的行
> /etc/crypttab ##删除/etc/crypttab文件
rm -fr /root/lukspsfile ##删除mima存放的文件
umount /mnt ##卸载/mnt
cryptsetup close nihao ##关闭磁盘 !!!@@注意:此步骤一定要做
mkfs.xfs /dev/vdb1 ##格式化磁盘(此时会提醒报错,必须使用-f进行强行格式化)
mkfs.xfs: /dev/vdb1 appears to contain an existing filesystem (crypto_LUKS).
mkfs.xfs: Use the -f option to force overwrite.
mkfs.xfs /dev/vdb1 -f
meta-data=/dev/vdb1 isize=256 agcount=4, agsize=65536 blks
= sectsz=512 attr=2, projid32bit=1
= crc=0
data = bsize=4096 blocks=262144, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0 ftype=0
log =internal log bsize=4096 blocks=2560, version=2
= sectsz=512 sunit=0 blks, lazy-count=1
realtime =none extsz=4096 blocks=0, rtextents=0
操作完成,加密清除!!!
#####4.磁盘阵列####
fdisk /dev/vdb
mdadm -C /dev/md0 -a yes -l 1 -n 2 -x 1 /dev/vdb{1..3}
mkfs.xfs /dev/md0
mount /dev/md0 /mnt
监控命令:
watch -n 1 cat /proc/mdstat
@@!!!实例:
[root@localhost ~]# fdisk /dev/vdb
Command (m for help): n
Partition type:
p primary (0 primary, 0 extended, 4 free)
e extended
Select (default p): p
Partition number (1-4, default 1):
First sector (2048-20971519, default 2048):
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-20971519, default 20971519): +1G
Partition 1 of type Linux and of size 1 GiB is set
Command (m for help): p
Disk /dev/vdb: 10.7 GB, 10737418240 bytes, 20971520 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x1459613d
Device Boot Start End Blocks Id System
/dev/vdb1 2048 2099199 1048576 83 Linux
Command (m for help): t
Selected partition 1
Hex code (type L to list all codes): l
14 Hidden FAT16 <3 61 SpeedStor ab Darwin boot f2 DOS secondary
16 Hidden FAT16 63 GNU HURD or Sys af HFS / HFS+ fb VMware VMFS
17 Hidden HPFS/NTF 64 Novell Netware b7 BSDI fs fc VMware VMKCORE
18 AST SmartSleep 65 Novell Netware b8 BSDI swap fd Linux raid auto
Hex code (type L to list all codes): fd
Changed type of partition 'Linux' to 'Linux raid autodetect'
Command (m for help): p
Disk /dev/vdb: 10.7 GB, 10737418240 bytes, 20971520 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x1459613d
Device Boot Start End Blocks Id System
/dev/vdb1 2048 2099199 1048576 fd Linux raid autodetect
Command (m for help): n
Partition type:
p primary (1 primary, 0 extended, 3 free)
e extended
Select (default p):
Using default response p
Partition number (2-4, default 2):
First sector (2099200-20971519, default 2099200):
Using default value 2099200
Last sector, +sectors or +size{K,M,G} (2099200-20971519, default 20971519): +1G
Partition 2 of type Linux and of size 1 GiB is set
Command (m for help): t
Partition number (1,2, default 2): fd
Partition number (1,2, default 2):
Hex code (type L to list all codes): fd
Changed type of partition 'Linux' to 'Linux raid autodetect'
Command (m for help): n
Partition type:
p primary (2 primary, 0 extended, 2 free)
e extended
Select (default p):
Using default response p
Partition number (3,4, default 3):
First sector (4196352-20971519, default 4196352):
Using default value 4196352
Last sector, +sectors or +size{K,M,G} (4196352-20971519, default 20971519): +1G
Partition 3 of type Linux and of size 1 GiB is set
Command (m for help): t
Partition number (1-3, default 3):
Hex code (type L to list all codes): fd
Changed type of partition 'Linux' to 'Linux raid autodetect'
Command (m for help): p
Disk /dev/vdb: 10.7 GB, 10737418240 bytes, 20971520 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x1459613d
Device Boot Start End Blocks Id System
/dev/vdb1 2048 2099199 1048576 fd Linux raid autodetect
/dev/vdb2 2099200 4196351 1048576 fd Linux raid autodetect
/dev/vdb3 4196352 6293503 1048576 fd Linux raid autodetect
Command (m for help): wq
The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.
[root@localhost ~]# partprobe
[root@localhost ~]# cat /proc/partitions
major minor #blocks name
[root@localhost ~]# mdadm -C /dev/md0 -a yes -l 1 -n 2 -x 1 /dev/vdb{1..3}
mdadm: Note: this array has metadata at the start and
may not be suitable as a boot device. If you plan to
store '/boot' on this device please ensure that
your boot-loader understands md/v1.x metadata, or use
--metadata=0.90
Continue creating array? y
[root@localhost ~]# mkfs.xfs /dev/md0
[root@localhost ~]# mount /dev/md0 /mnt
卸载磁盘阵列:
mdadm -f /dev/md0 /dev/vdb1 ##破坏磁盘阵列md0中的vdb1磁盘
mdadm -D /dev/md0 ##查看正在使用的磁盘
mdadm -r /dev/md0 /dev/vdb1 ##删除磁盘阵列中的vdb1磁盘
mdadm -a /dev/md0 /dev/vdb1 ##
umount /mnt
mdadm -S /dev/md0 ##停止使用磁盘阵列
@@!!!实例:
[root@localhost ~]# mdadm -r /dev/md0 /dev/vdb1
mdadm: hot remove failed for /dev/vdb1: Device or resource busy
[root@localhost ~]# mdadm -r /dev/md0 /dev/vdb2
mdadm: hot remove failed for /dev/vdb2: Device or resource busy
[root@localhost ~]# mdadm -f /dev/md0 /dev/vdb2
mdadm: set /dev/vdb2 faulty in /dev/md0
[root@localhost ~]# mdadm -r /dev/md0 /dev/vdb2
mdadm: hot removed /dev/vdb2 from /dev/md0
[root@localhost ~]# mdadm -f /dev/md0 /dev/vdb3
mdadm: set /dev/vdb3 faulty in /dev/md0
[root@localhost ~]# mdadm -r /dev/md0 /dev/vdb3
mdadm: hot removed /dev/vdb3 from /dev/md0
[root@localhost ~]# umount /mnt
[root@localhost ~]# mdadm -f /dev/md0 /dev/vdb3
mdadm: set device faulty failed for /dev/vdb3: No such device
[root@localhost ~]# mdadm -S /dev/md0
mdadm: stopped /dev/md0
[root@localhost ~]# fdisk /dev/vdb
Welcome to fdisk (util-linux 2.23.2).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
Command (m for help): d
Partition number (1-3, default 3): 1
Partition 1 is deleted
Command (m for help): d
Partition number (2,3, default 3): 2
Partition 2 is deleted
Command (m for help): d
Selected partition 3
Partition 3 is deleted
Command (m for help): p
Disk /dev/vdb: 10.7 GB, 10737418240 bytes, 20971520 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x1459613d
Device Boot Start End Blocks Id System
Command (m for help): wq
The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.
[root@localhost ~]# partprobe
####5.配额###
fdisk /dev/vdb
mkdir /pub
mount /dev/vdb1 /pub
mkfs.xfs /dev/vdb1 -f
chmod 1777 /pub ##给予目录/pub的权限为1777
mount -o usrquota /dev/vdb1 /pub
quotaon -uv /dev/vdb1 ##激活配额
edquota -u username ##给用户分配配额
内容如下:
Disk quotas for user student (uid 1000):
Filesystem blocks(事实) soft hard inodes soft(事实) hard
/dev/vdb1 0 0 102400 0 0 0
即除了修改第一个hard,其余参数不用修改
su - username ##切换用户
切换用户后执行:
dd if=/dev/zero of=/pub/file bs=1M count=10
dd if=/dev/zero of=/pub/file bs=1M count=100
dd if=/dev/zero of=/pub/file bs=1M count=101
quota ##查看用户被分配的配额
@@!!!实例:
fdisk /dev/vdb
Welcome to fdisk (util-linux 2.23.2).
Last sector, +sectors or +size{K,M,G} (2048-20971519, default 20971519): +500M
[root@localhost ~]# mkdir /pub
[root@localhost ~]# mount /dev/vdb1 /pub
mount: unknown filesystem type 'linux_raid_member' ##报错原因:因为此磁盘在上一布用于磁盘阵列,所以格式化时应该加-f
[root@localhost ~]# mkfs.xfs /dev/vdb1 -f
[root@localhost ~]# chmod 1777 /pub ##给予目录/pub的权限为1777
[root@localhost ~]# mount -o usrquota /dev/vdb1 /pub
[root@localhost ~]# quotaon -uv /dev/vdb1 ##激活配额
quotaon: Enforcing user quota already on /dev/vdb1
[root@localhost ~]# edquota -u username ##给用户分配配额
[root@localhost ~]# su - username ##切换用户
[student@localhost ~]$ dd if=/dev/zero of=/pub/file bs=1M count=10
10+0 records in
10+0 records out
10485760 bytes (10 MB) copied, 0.0227461 s, 461 MB/s
[student@localhost ~]$ dd if=/dev/zero of=/pub/file bs=1M count=100
100+0 records in
100+0 records out
104857600 bytes (105 MB) copied, 1.23691 s, 84.8 MB/s
[student@localhost ~]$ dd if=/dev/zero of=/pub/file bs=1M count=101
dd: error writing ‘/pub/file’: Disk quota exceeded ##报错原因:超过root用户给分配的配额
101+0 records in
100+0 records out
104857600 bytes (105 MB) copied, 0.640045 s, 164 MB/s
[student@localhost ~]$ quota ##查看用户被分配的配额
Disk quotas for user student (uid 1000):
Filesystem blocks quota limit grace files quota limit grace
/dev/vdb1 102400* 0 102400
#####自动挂载配额分区####
/dev/vdb1 /mnt xfs defaults,usrquota 0 0
文件内容编写不正确,则重启会报错,此时,修改文件,当修改完后,重启则又可以正常启动
#####################################
####### 1.lvm (建立可拓展磁盘)#########
#####################################
pe为最小单位
######1.LVM建立########
1.划分物理分区并把分区id修改为8e
pvs|pvdisplay
vgs|vgdisplay
lvs|lvdisplay
第一步:建立lvm
监控命令:
watch -n 1 'echo "=pvinfo=";pvs;echo "=vginfo=";vgs;echo =lvinfo=;lvs'
pvcreate /dev/vdb1 ##建立pv
vgcreate lzt /dev/vdb1 ##建立vg(组)
lvcreate -L 110M -n lv0 lzt ##设置vm的大小
mkfs.xfs /dev/lzt/lv0 ##格式化
mount /dev/lzt/lv0 /mnt ##挂载
第二步:对建立的lvm进行拓展与拉伸
监控命令:
watch -n 1 'echo "=pvinfo=";pvs;echo "=vginfo=";vgs;echo =lvinfo=;lvs;df -h /mnt'
lvextend -L 250M /dev/lzt/lv0 ##拓展分区为250M
xfs_growfs /dev/lzt/lv0 ##对xfs文件系统进行拉伸(须知: 1.当执行完上条命令时,由监控命令可知新拓展的区域还没有xfs文件系统 2.挂载的位置没有变化,故可直接拉伸)
当一个pv不能满足拓展与拉伸的需求时,操作如下命令:
pvcreate /dev/vdb2 ##建立第二个pv
vgextend lzt /dev/vdb2 ##将第二个pv添加到建立的vg组里
lvextend -L 600M /dev/lzt/lv0 ##拓展分区为600M
xfs_growfs /dev/lzt/lv0 ##对xfs文件系统进行拉伸
@@!!!第一步实例:
[root@localhost ~]# pvcreate /dev/vdb1
Physical volume "/dev/vdb1" successfully created
[root@localhost ~]# vgcreate lzt /dev/vdb1
Volume group "lzt" successfully created
[root@localhost ~]# lvcreate -L 110M -n lv0 lzt
Rounding up size to full physical extent 112.00 MiB
Logical volume "lv0" created
[root@localhost ~]# mkfs.xfs /dev/lzt/lv0
[root@localhost ~]# mount /dev/lzt/lv0 /mnt
第二步实例:
[root@localhost ~]# lvextend -L 250M /dev/lzt/lv0
[root@localhost ~]# xfs_growfs /dev/lzt/lv0
[root@localhost ~]# lvextend -L 600M /dev/lzt/lv0
Extending logical volume lv0 to 600.00 MiB
Insufficient free space: 87 extents needed, but only 61 available ##报错:现有的pv不能满足要求,需要87个pe才可成功,现有的只有61个
[root@localhost ~]# pvcreate /dev/vdb2
[root@localhost ~]# vgextend lzt /dev/vdb2
Volume group "lzt" successfully extended
[root@localhost ~]# lvextend -L 600M /dev/lzt/lv0
Extending logical volume lv0 to 600.00 MiB
Logical volume lv0 successfully resized ##成功拓展与拉伸
[root@localhost ~]# xfs_growfs /dev/lzt/lv0
第三步:分区的缩小:
(xfs文件类型不能进行缩小,ext文件类型可以)
umount /mnt/
mkfs.ext4 /dev/lzt/lv0 ##首先格式化lvm为ext4文件类型
e2fsck -f /dev/lzt/lv0 ##对lvm中的数据进行查看(在缩小lvm前必须要做的)
resize2fs /dev/lzt/lv0 550M ##将lvm文件系统的大小缩小为500M
lvreduce -L 500M /dev/lzt/lv0 ##将lv大小缩小为500M
pvremove /dev/vdb1 /dev/vdb2 ##将/dev/vdb1中的数据移动到/dev/vdb2中(切记:此过程中不要执行ctrl+c命令操作)
vgreduce lzt /dev/vdb1 ##将/dev/vdb1从vg组中移除
pvremove /dev/vdb1 ##删除pv(即/dev/vdb1)
第三步:分区缩小实例:
[root@localhost ~]# umount /mnt
[root@localhost ~]# e2fsck -f /dev/lzt/lv0
[root@localhost ~]# resize2fs /dev/lzt/lv0 550M
[root@localhost ~]# mount /dev/lzt/lv0 /mnt
[root@localhost ~]# lvreduce -L 550M /dev/lzt/lv0
[root@localhost ~]# umount /mnt
[root@localhost ~]# e2fsck -f /dev/lzt/lv0
[root@localhost ~]# resize2fs /dev/lzt/lv0 200M
[root@localhost ~]# mount /dev/lzt/lv0 /mnt
[root@localhost ~]# lvreduce -L 200M /dev/lzt/lv0
[root@localhost ~]# pvmove /dev/vdb1 /dev/vdb2
/dev/vdb1: Moved: 28.0%
/dev/vdb1: Moved: 100.0%
[root@localhost ~]# vgreduce lzt /dev/vdb1
[root@localhost ~]# pvremove /dev/vdb1
@@@!!!易出现错误:
若先缩减lv则会出现错误,此时应先将设备的空间升上来,
若删除了正在使用的设备,则需执行vgreduce --removemissing lzt(vg组名)
操作实例:
[root@localhost ~]# lvreduce -L 100M /dev/lzt/lv0
WARNING: Reducing active and open logical volume to 100.00 MiB
THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce lv0? [y/n]: y
Reducing logical volume lv0 to 100.00 MiB
Logical volume lv0 successfully resized
[root@localhost ~]# df
[root@localhost ~]# umount /mnt
[root@localhost ~]# mount /dev/lzt/lv0 /mnt
mount: wrong fs type, bad option, bad superblock on /dev/mapper/lzt-lv0,
missing codepage or helper program, or other error
In some cases useful info is found in syslog - try
dmesg | tail or so.
[root@localhost ~]# mount /dev/lzt/lv0 /mnt
[root@localhost ~]# resize2fs /dev/lzt/lv0
resize2fs 1.42.9 (28-Dec-2013)
Please run 'e2fsck -f /dev/lzt/lv0' first.
[root@localhost ~]# e2fsck -f /dev/lzt/lv0
[root@localhost ~]# mount /dev/lzt/lv0 /mnt
mount: wrong fs type, bad option, bad superblock on /dev/mapper/lzt-lv0,
missing codepage or helper program, or other error
In some cases useful info is found in syslog - try
dmesg | tail or so.
[root@localhost ~]# lvextend -L 200M /dev/lzt/lv0
Extending logical volume lv0 to 200.00 MiB
Logical volume lv0 successfully resized
[root@localhost ~]# mount /dev/lzt/lv0 /mnt
[root@localhost ~]# vgextend lzt /dev/vdb1
Volume group "lzt" successfully extended
[root@localhost ~]# fdisk /dev/vdb
Welcome to fdisk (util-linux 2.23.2).
Command (m for help): d
Partition number (1,2, default 2): 1
Partition 1 is delete
Command (m for help): wq
[root@localhost ~]# partprobe
[root@localhost ~]# vgreduce --removemissing lzt
@@@!!!lvm快照:
lvcreate -L 12M -n lv0-backc -s /dev/lzt/lv0
实例:
[root@localhost mnt]# touch file
[root@localhost mnt]# cd
[root@localhost ~]# lvcreate -L 12M -n lv0-backc -s /dev/lzt/lv0
Logical volume "lv0-backc" created
[root@localhost ~]# mount /dev/lzt/lv0-backc /mnt
[root@localhost ~]# cd /mnt
[root@localhost mnt]# ls
file lost+found
[root@localhost mnt]# rm -fr file
[root@localhost mnt]# ls
lost+found
[root@localhost mnt]# lvremove /dev/lzt/lv0-backc
Logical volume lzt/lv0-backc contains a filesystem in use.
[root@localhost mnt]# cd
[root@localhost ~]# umount /mnt
[root@localhost ~]# lvremove /dev/lzt/lv0-backc
Do you really want to remove active logical volume lv0-backc? [y/n]: y
Logical volume "lv0-backc" successfully removed
[root@localhost ~]# lvcreate -L 12M -n lv0-backc -s /dev/lzt/lv0
Logical volume "lv0-backc" created
[root@localhost ~]# mount /dev/lzt/lv0-backc /mnt
[root@localhost ~]# cd /mnt
[root@localhost mnt]# ll
total 16
-rw-r--r--. 1 root root 0 Nov 6 03:04 file
drwx------. 2 root root 16384 Nov 6 02:09 lost+found
@@@!!!lvm的删除:
lvremove /dev/lzt/lv0-backc
lvremove /dev/lzt/lv0
vgremove lzt
pvremove /dev/vdb2
实例:
[root@localhost ~]# lvremove /dev/lzt/lv0-backc
Logical volume lzt/lv0-backc contains a filesystem in use.
[root@localhost ~]# umount /mnt
[root@localhost ~]# lvremove /dev/lzt/lv0-backc
Do you really want to remove active logical volume lv0-backc? [y/n]: y
Logical volume "lv0-backc" successfully removed
[root@localhost ~]# lvremove /dev/lzt/lv0
Logical volume lzt/lv0 contains a filesystem in use.
[root@localhost ~]# umount /mnt
[root@localhost ~]# lvremove /dev/lzt/lv0
Do you really want to remove active logical volume lv0? [y/n]: y
Logical volume "lv0" successfully removed
[root@localhost ~]# vgremove lzt
Volume group "lzt" successfully removed
[root@localhost ~]# pvremove /dev/vdb2
!!!自己课后去查看awk,grep正则表达式,expect.
######第六单元.shell脚本命令#####
######1.diff#####
diff file file1 ##比较两个文件的不同
-c ##显示周围的行
-u ##按照统一格式输出生成补丁
-r ##比较两个目录中文件的不同
patch file file.path ##打补丁
-b ##备份原文件
#####2.grep######
grep 关键字 文件|目录 ##在文件或目录中查找含有关键字的行
grep -i ##忽略大小写
-n ##显示关键字所在行的序号(第几行)
-c ##显示过滤结果的行数
-v ##反向过滤
-E "关键字1|关键字2" ##过滤多个关键字
-r 目录 ##在目录中查找含有关键字的文件
注意: ^关键字 ##以关键字开头
关键字$ ##以关键字结尾
例如:
[root@station mnt]# grep -i root passwd | grep -E "^root|root$" -v -n
2:operator:x:11:0:operator:/root:/sbin/nologin
4:test:root:nihao
6:nihao:test:ROOT
[root@station mnt]# grep -i root passwd -n | grep -E "^root|root$" -v
1:root:x:0:0:root:/root:/bin/bash
10:operator:x:11:0:operator:/root:/sbin/nologin
34:root:nihao:test
35:test:root:nihao
37:nihao:test:ROOT
[root@station mnt]# grep -E -i "^root|root$" -v passwd -n |grep root
10:operator:x:11:0:operator:/root:/sbin/nologin
35:test:root:nihao
[root@station mnt]# grep -E "^root|root$" -v passwd -n | grep root
10:operator:x:11:0:operator:/root:/sbin/nologin
35:test:root:nihao
#####3.cut#####
cut ##截取字符
cut -d 分隔符 ##指定分隔符
cut -f 1,7 ##显示指定的列
cut -c 1-4 ##显示指定序号的字符(第几个到第几个)
例子:只输出执行ifconfig后,显示的ip
[root@station mnt]# ifconfig eth0 | grep -i "inet " | cut -c 14-24
172.25.7.10
[root@station mnt]# ifconfig eth0 | grep "inet "|awk -F " " '{print $2,$1}'
172.25.7.10 inet
#####4.sort####
sort
-n ##纯数字排序
-u ##去冗余
|uniq -c ##去除冗余并统计冗余的次数
-t ##指定分隔符
-k ##指定列
例子:
[root@station mnt]# sort -n file |uniq -c
3
3 0
2 2
1 3
1 4
1 5
1 10
1 21
1 54
1 112
1 02220
1 51122
[root@station mnt]# vim file
[root@station mnt]# sort -t : -k 2 file -n
A:
A:
A:
A:0
A:0
A:0
A:2
A:2
A:3
A:4
A:5
A:10
A:21
A:54
A:112
A:02220
A:51122
[root@station mnt]# sort -t : -k 2 file -n | cut -c 3-7
0
0
0
2
2
3
4
5
10
21
54
112
02220
51122
[root@station mnt]# sort -t : -k 2 file -n | cut -d : -f 2
0
0
0
2
2
3
4
5
10
21
54
112
02220
51122
#####5.uniq###
sort file |uniq -c ##去除冗余并统计冗余的次数
-d ##显示冗余的行
-u ##显示唯一的行
@@注意:直接执行uniq命令时,只有相邻的两行相同时才会被系统识别为冗余行,但是在和sort搭配使用时则是在文件全文中寻找相同行(冗余行)
例子:[root@station mnt]# uniq -c file
1 1
1 22
1 33
1 2
2 1
1 55
1 2213
1 551156
2 22
1 4
1 112
1 15
[root@station mnt]# uniq -d file
1
22
[root@station mnt]# uniq -u file
1
22
33
2
55
2213
551156
4
112
15
[root@station mnt]# sort file |uniq -c
3 1
1 112
1 15
1 2
3 22
1 2213
1 33
1 4
1 55
1 551156
[root@station mnt]# sort file |uniq -d
1
22
[root@station mnt]# sort file |uniq -u
112
15
2
2213
33
4
55
551156
#####6.sed###
sed 's/原字符/替换字符/g' file
sed -e '策略1' -e '策略2' file
sed -i file ##把转换后的内容输入到指定文件
sed '3,5s/原字符/替换字符/g' ##3-5行替换
注: 下面的x表示数字
sed xd ##屏蔽指定行
sed xp ##复制指定行
sed -n xp ##只显示指定行
附加:
cat -b filename ##给文件显示内容加行号
tr 'a-z' 'A-Z' < filename ##将filename中的小写字母替换成大写
#####7.awk#####
awk 用法:awk ' pattern {action} '
变量名 含义
ARGC 命令行变元个数
ARGV 命令行变元数组
FILENAME 当前输入文件名
FNR 当前文件中的记录号
FS 输入域分隔符,默认为一个空格
RS 输入记录分隔符
NF 当前记录里域个数
NR 到目前为止记录数
OFS 输出域分隔符
ORS 输出记录分隔符
1、awk '/101/' file 显示文件file中包含101的匹配行。
awk '/101/,/105/' file
awk '$1 == 5' file
awk '$1 == "CT"' file 注意必须带双引号
awk '$1 * $2 >100 ' file
awk '$2 >5 && $2<=15' file
2、awk '{print NR,NF,$1,$NF,}' file 显示文件file的当前记录号、域数和每一行的第一个和最后一个域。
awk '/101/ {print $1,$2 + 10}' file 显示文件file的匹配行的第一、二个域加10。
awk '/101/ {print $1$2}' file
awk '/101/ {print $1 $2}' file 显示文件file的匹配行的第一、二个域,但显示时域中间没有分隔符。
3、df | awk '$4>1000000 ' 通过管道符获得输入,如:显示第4个域满足条件的行。
4、awk -F "|" '{print $1}' file 按照新的分隔符“|”进行操作。
awk 'BEGIN { FS="[: \t|]" }
{print $1,$2,$3}' file 通过设置输入分隔符(FS="[: \t|]")修改输入分隔符。
Sep="|"
awk -F $Sep '{print $1}' file 按照环境变量Sep的值做为分隔符。
awk -F '[ :\t|]' '{print $1}' file 按照正则表达式的值做为分隔符,这里代表空格、:、TAB、|同时做为分隔符。
awk -F '[][]' '{print $1}' file 按照正则表达式的值做为分隔符,这里代表[、]
5、awk -f awkfile file 通过文件awkfile的内容依次进行控制。
cat awkfile
/101/{print "\047 Hello! \047"} --遇到匹配行以后打印 ' Hello! '.\047代表单引号。
{print $1,$2} --因为没有模式控制,打印每一行的前两个域。
6、awk '$1 ~ /101/ {print $1}' file 显示文件中第一个域匹配101的行(记录)。
7、awk 'BEGIN { OFS="%"}
{print $1,$2}' file 通过设置输出分隔符(OFS="%")修改输出格式。
8、awk 'BEGIN { max=100 ;print "max=" max} BEGIN 表示在处理任意行之前进行的操作。
{max=($1 >max ?$1:max); print $1,"Now max is "max}' file 取得文件第一个域的最大值。
(表达式1?表达式2:表达式3 相当于:
if (表达式1)
表达式2
else
表达式3
awk '{print ($1>4 ? "high "$1: "low "$1)}' file
9、awk '$1 * $2 >100 {print $1}' file 显示文件中第一个域匹配101的行(记录)。
10、awk '{$1 == 'Chi' {$3 = 'China'; print}' file 找到匹配行后先将第3个域替换后再显示该行(记录)。
awk '{$7 %= 3; print $7}' file 将第7域被3除,并将余数赋给第7域再打印。
11、awk '/tom/ {wage=$2+$3; printf wage}' file 找到匹配行后为变量wage赋值并打印该变量。
12、awk '/tom/ {count++;}
END {print "tom was found "count" times"}' file END表示在所有输入行处理完后进行处理。
13、awk 'gsub(/\$/,"");gsub(/,/,""); cost+=$4;
END {print "The total is $" cost>"filename"}' file gsub函数用空串替换$和,再将结果输出到filename中。
1 2 3 $1,200.00
1 2 3 $2,300.00
1 2 3 $4,000.00
awk '{gsub(/\$/,"");gsub(/,/,"");
if ($4>1000&&$4<2000) c1+=$4;
else if ($4>2000&&$4<3000) c2+=$4;
else if ($4>3000&&$4<4000) c3+=$4;
else c4+=$4; }
END {printf "c1=[%d];c2=[%d];c3=[%d];c4=[%d]\n",c1,c2,c3,c4}"' file
通过if和else if完成条件语句
awk '{gsub(/\$/,"");gsub(/,/,"");
if ($4>3000&&$4<4000) exit;
else c4+=$4; }
END {printf "c1=[%d];c2=[%d];c3=[%d];c4=[%d]\n",c1,c2,c3,c4}"' file
通过exit在某条件时退出,但是仍执行END操作。
awk '{gsub(/\$/,"");gsub(/,/,"");
if ($4>3000) next;
else c4+=$4; }
END {printf "c4=[%d]\n",c4}"' file
通过next在某条件时跳过该行,对下一行执行操作。
14、awk '{ print FILENAME,$0 }' file1 file2 file3>fileall 把file1、file2、file3的文件内容全部写到fileall中,格式为
打印文件并前置文件名。
15、awk ' $1!=previous { close(previous); previous=$1 }
{print substr($0,index($0," ") +1)>$1}' fileall 把合并后的文件重新分拆为3个文件。并与原文件一致。
16、awk 'BEGIN {"date"|getline d; print d}' 通过管道把date的执行结果送给getline,并赋给变量d,然后打印。
17、awk 'BEGIN {system("echo \"Input your name:\\c\""); getline d;print "\nYour name is",d,"\b!\n"}'
通过getline命令交互输入name,并显示出来。
awk 'BEGIN {FS=":"; while(getline< "/etc/passwd" >0) { if($1~"050[0-9]_") print $1}}'
打印/etc/passwd文件中用户名包含050x_的用户名。
18、awk '{ i=1;while(i<NF) {print NF,$i;i++}}' file 通过while语句实现循环。
awk '{ for(i=1;i<NF;i++) {print NF,$i}}' file 通过for语句实现循环。
type file|awk -F "/" '
{ for(i=1;i<NF;i++)
{ if(i==NF-1) { printf "%s",$i }
else { printf "%s/",$i } }}' 显示一个文件的全路径。
用for和if显示日期
awk 'BEGIN {
for(j=1;j<=12;j++)
{ flag=0;
printf "\n%d月份\n",j;
for(i=1;i<=31;i++)
{
if (j==2&&i>28) flag=1;
if ((j==4||j==6||j==9||j==11)&&i>30) flag=1;
if (flag==0) {printf "%02d%02d ",j,i}
}
}
}'
19、在awk中调用系统变量必须用单引号,如果是双引号,则表示字符串
Flag=abcd
awk '{print '$Flag'}' 结果为abcd
awk '{print "$Flag"}' 结果为$Flag
以上转自chinaunix,以下是自己的总结:
求和:
$awk 'BEGIN{total=0}{total+=$4}END{print total}' a.txt -----对a.txt文件的第四个域进行求和!
$ awk '/^(no|so)/' test-----打印所有以模式no或so开头的行。
$ awk '/^[ns]/{print $1}' test-----如果记录以n或s开头,就打印这个记录。
$ awk '$1 ~/[0-9][0-9]$/(print $1}' test-----如果第一个域以两个数字结束就打印这个记录。
$ awk '$1 == 100 || $2 < 50' test-----如果第一个或等于100或者第二个域小于50,则打印该行。
$ awk '$1 != 10' test-----如果第一个域不等于10就打印该行。
$ awk '/test/{print $1 + 10}' test-----如果记录包含正则表达式test,则第一个域加10并打印出来。
$ awk '{print ($1 > 5 ? "ok "$1: "error"$1)}' test-----如果第一个域大于5则打印问号后面的表达式值,否则打印冒号后面的表达式值。
$ awk '/^root/,/^mysql/' test----打印以正则表达式root开头的记录到以正则表达式mysql开头的记录范围内的所有记录。如果找到一个新的正则表达式root开头的记 录,则继续打印直到下一个以正则表达式mysql开头的记录为止,或到文件末尾
######8.grep正则表达式####
grep 命令是支持正则表达式的一个多用途文本搜索工具,他的一般格式为:
grep [选项] [模式] [文件...]
grep命令的选项用于对搜索过程进行补充说明。grep命令的模式十分灵活,可以是字符串、变量,还可以是正则表达式。无论模式是何种形式,只要模式中包含了空格,就需要使用双引号或单引号将模式引起来。
下面具体说明grep选项的含义和用法。
1、-c选项: -c选项表示输出匹配字符串行的数量。
例子:#输出文件00.pem中包含jk的行的数量
$ grep -c jk 00.pem
6
$
2、-n选项:列出所有的匹配行,并输出行号。
例子:#输出文件00.pem中包含jk行的行号和行。
$ grep -n jk 00.pem
1:jkfrdjkfdkl
2:dkjfkjkjelkrge
4:frjkj-----------kltijkert
9:fjkdkle;roitoer
13:djkfthe the23
14:the jejk ekj44
$
3、-选项: 显示不包含模式的所有行。
例子:#输出文件00.pem中不包含jk的行的数量
$ grep -vc jk 00.pem
12
$
4、-i选项: 表示grep命令不区分大小写。
例子:#输出文件00.pem中包含 jk(不论大小写)的行
$ grep -i jk 00.pem
Jkfrdjkfdkl
dkjfkjkjelkrge
frjkj-----------kltijkert
fJKdkle;roitoer
djkfthe the23
the jejk ekj44
$
5、-h选项: 表示查询多文件时不显示文件名。
6、-l选项: 表示只列出符合匹配的文件名,而不列出具体匹配行。
7、-s选项: 表示不显示不存在或无匹配文本的错误信息。
例1:#未使用-s选项,打印错误信息
$ grep jk dk 00.pem
grep: dk: 没有那个文件或目录
00.pem:Jkfrdjkfdkl
00.pem:dkjfkjkjelkrge
00.pem:frjkj-----------kltijkert
00.pem:the jejk ekj44
例2:#使用-s选项后,不打印错误信息
$ grep -s jk dk 00.pem
00.pem:Jkfrdjkfdkl
00.pem:dkjfkjkjelkrge
00.pem:frjkj-----------kltijkert
00.pem:the jejk ekj44
$
8、-r选项: 表示递归搜索,不仅搜索当前目录,而且搜索子目录。
9、-w和-x选项:
-w选项表示匹配整词,即以模式的字面意思去解析它。
-x选项是匹配整行,即只有当文件中有整行内容与模式匹配时,grep命令才输出改行结果。
例:说明grep命令的-w和-x选项的区别
$ cat world.txt
Hello World
World
World Cup
African
One One World
$
#搜索包含单词“World”的文本行
$ grep -w 'World' world.txt
Hello World
World
World Cup
One One World
$
#搜索整行文本是单词“World”的行
$ grep -x 'World' world.txt
World
&
10、-q选项: 表示grep将不再输出任何结果,而是以退出状态表示搜索是否成功。0表示成功,1表示未搜索到满足模式的文本行,2表示命令或程序由于错误而未能执行。
例1:grep命令搜索成功
$ grep -q -x 'World' world.txt
$ echo $?
0
$
例2:grep命令未搜索到满足模式的文本行
$ grep -q -x 'World African' world.txt
$ echo $?
1
$
例3:grep命令执行失败
$ grep -q -x 'World African' world
grep : world : 没有那个文件或目录
$ echo $?
2
$
11、-b和-o选项:
grep -b选项打印匹配行距文件头部的偏移量,以字节为单位。如果在-b选项后面再加上-o选项,grep命令将打印匹配的词距文件头部的偏移量。
例1:#第一条命令:打印匹配行距文件头部的偏移量
$ grep -b -w 'World' world.txt
0:Hello World
12:World
18:World Cup
36:One One World
$
例2:#第一条命令:打印匹配词距文件头部的偏移量
$ grep -b -o -w 'World' world.txt
6:World
12:World
18:World
44:World
$
下面介绍一下grep和正则表达式结合使用的例子。
1、匹配行首:
元字符“^”表示行首,如果需要匹配.pem为后缀的文件中以橫杠“-”开头的行,可输入如下命令:
$ grep ^- *.pem
2、设置大小写:
利用-i符号可以使grep命令不区分大小写,[ ]符号也可以实现这一功能。
例如:
$ grep -n [Jj][Kk] 00.pem
Jkfrdjkfdkl
dkjfkjkjelkrge
frjkj-----------kltijkert
fJKdkle;roitoer
the jejk ekj44
$
3、匹配重复字符:
可以用“.”符号和“*”符号来实现。
例1:grep和.符号
#表示搜索00.pem文件中以/字符开始、中间4个任意字符、第6个字符仍为/的行。
$ grep ^/..../ 00.pem
/home/globus/fff.pem
例2:grep和*符号
#表示搜索00.pem文件中以“-”开头,重复“-”符号任意次,然后是B字符的行。
$ grep ^-*B 00.pem
----------Bkjfkerj
$
4、转移符:
如果匹配的目标字符串包含的元字符,则需要用转义符“\”屏蔽其意义。
例: #搜索“-”符号重复5次的文本行。
$ grep '\-\{5\}' 00.pem
----------Bkjfkerj
frjkj----------Bkltijkert
riuitieoe---erj-----rg
$
5、POSIX字符类:
类名 意义
[:upper:] 表示大写字母[A-Z]
[:lower:] 表示小写字母[a-z]
[:digit:] 表示阿拉伯数字[0-9]
[:alnum:] 表示大小写字母和阿拉伯数字[0-9 a-z A-Z]
[:space:] 表示空格或Tab键
[:alpha:] 表示大小写字母[a-z A-Z]
[:cntrl:] 表示Ctrl键
[:graph:][:print:] 表示ASCII码33-16之间的字符
[:xdigit:] 表示16进制数字[0-9 A-F a-f]
6、精确匹配:
正则表达式中的“\<\>”用于精确匹配。
例子:
$ grep the 00.pem #列出包含the字符串的行
the jskj 'dff
ddfd df the rlt
gkjtuthelr112
dkfthe the23
the jejk ekj44
jhh lk klrthe 'f'
$
$ grep "\<the\>" 00.pem #精确匹配the这个单词
the jskj 'dff
ddfd df the rlt
the jejk ekj44
$
7、或字符
或字符“|”是扩展的正则表达式中定义的,grep需要加上-E才能支持它。grep -E等价于egrep。
例:搜索00.pem中以冒号“:”或以非英文字母结尾的行。
$ egrep "[^[:alpha:]]$|:$" 00.pem
aslkdlsf:
tji54oio7yu:
gkjtuthelr112
dkfthe the23
the jejk ekj44
jhh lk klrthe 'f'
erkjgtl35:
rgjtkry67
---------------------------------------------
$ grep -E"[^[:alpha:]]$|:$" 00.pem
aslkdlsf:
tji54oio7yu:
gkjtuthelr112
dkfthe the23
the jejk ekj44
jhh lk klrthe 'f'
erkjgtl35:
rgjtkry67
######9.expect#####
1,使用“-c”选项,从命令行执行expect脚本
expect可以让你使用“-c”选项,直接在命令行中执行它,如下所示:
$ expect -c 'expect "\n" {send "pressed enter\n"}
pressed enter
$
如果你执行了上面的脚本,它会等待输入换行符(\n)。按“enter”键以后,它会打印出“pressed enter”这个消息,然后退出。
2,使用“-i”选项交互地执行expect脚本
使用“-i”选项,可以通过来自于标准输入的读命令来交互地执行expect脚本。如下所示:
$ expect -i arg1 arg2 arg3
expect1.1>set argv
arg1 arg2 arg3
expect1.2>
正常情况下,当你执行上面的expect命令的时候(没有“-i”选项),它会把arg1当成脚本的文件名,所以“-i”选项可以让脚本把多个参数当成一个连续的列表。
当你执行带有“-c”选项的expect脚本的时候,这个选项是十分有用的。因为默认情况下,expect是交互地执行的。
3,当执行expect脚本的时候,输出调试信息
当你用“-d”选项执行代码的时候,你可以输出诊断的信息。如下所示:
$ cat sample.exp
# !/usr/bin/expect -f
expect "\n";
send "pressed enter";
$ expect -d sample.exp
expect version 5.43.0
argv[0] = expect argv[1] = -d argv[2] = sample.exp
set argc 0
set argv0 "sample.exp"
set argv ""
executing commands from command file sample.exp
expect: does "" (spawn_id exp0) match glob pattern "\n"? no
expect: does "\n" (spawn_id exp0) match glob pattern "\n"? yes
expect: set expect_out(0,string) "\n"
expect: set expect_out(spawn_id) "exp0"
expect: set expect_out(buffer) "\n"
send: sending "pressed enter" to { exp0 pressed enter}
4,使用“-D”选项启动expect调试器
“-D”选项用于启动调试器,它只接受一个布尔值的参数。这个参数表示提示器必须马上启动,还是只是初始化调试器,以后再使用它。
$ expect -D 1 script
“-D”选项左边的选项会在调试器启动以前被处理。然后,在调试器启动以后,剩下的命令才会被执行。
$ expect -c 'set timeout 10' -D 1 -c 'set a 1'
1: set a 1
dbg1.0>
5,逐行地执行expect脚本
通常,expect会在执行脚本之前,把整个脚本都读入到内存中。“-b”选项可以让expect一次只读取脚本中的一行。当你没有写完整个脚本的时候,这是十分有用的,expect可以开始执行这个不完整的脚本,并且,它可以避免把脚本写入到临时文件中。
$ expect -b
6,让expect不解释命令行参数
你可以使用标识符让expect不解释命令行参数。
你可以像下面这样的读入命令行参数:
$ cat print_cmdline_args.exp
#!/usr/bin/expect
puts 'argv0 : [lindex $argv 0]';
puts 'argv1 : [lindex $argv 1]';
当执行上面的脚本的时候,会跳过命令行选项,它们会被当成参数(而不是expect选项),如下所示:
$ expect print_cmdline_args.exp -d -c
argv0 : -d
argv1 : -c