###########################

#####第四单元.管理系统存储####

###########################

@@注意:主分区+逻辑分区总个数不能超过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