如何知道 OpenStack Nova 的安装版本号?

安装完 OpenStack Nova 以后过段时间就很容易忘记自己装的是哪个版本,OpenStack 开发进度很快,遇到问题到 mailing list 寻求帮助的时候最好带上 Nova 的版本号。如何知道自己安装的是哪个版本的 OpenStack Nova 呢?旧版本的 OpenStack Nova 提供了 version 的接口,不过只是针对开发人员,命令行工具没有面向系统管理员的接口,所以只能通过 python 调取 nava API 来获得version 信息:

# nova-manage shell python
Python 2.7.1+ (r271:86832, Apr 11 2011, 18:13:53) 
[GCC 4.5.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> from nova import version
>>> version.version_string()
'2011.2'
>>> version.version_string_with_vcs()
u'2011.2-workspace:tarmac-20110415024701-a9bdb77vaatk99lh'
>>>

新版本的 OpenStack Nova 提供了简单的管理员接口,不再需要通过 API 调用了:

# nova-manage version list
2011.3-dev (2011.3-workspace:tarmac-20110428165803-elcz2wp2syfzvxm8)

删除 OpenStack Nova Volume 时遇到的 error_deleting 问题

前段时间 VPSee 在 OpenStack Nova 上删除一个 volume 的时候(vol-00000002)报错,检查了一下 volume 的状态是 error_deleting 然后就无法删除了,不管用 euca-delete-volume 还是 nova-manage volume delete 都无法删除。

# euca-delete-volume vol-00000002
ApiError: ApiError: Volume status must be available

# euca-describe-volumes 
VOLUME	vol-00000002  10  nova	error_deleting (mycloud, node01, None, None)	2011-08-30T13:15:24Z
VOLUME	vol-00000003  10  nova	available (mycloud, node01, None, None)	2011-08-30T13:20:04Z

查了一下要删除的 volume-00000002 的情况:

# lvdisplay
...
--- Logical volume ---
  LV Name                /dev/nova-volumes/volume-00000002
  VG Name                nova-volumes
  LV UUID                UgOwdr-W61E-MrdG-PrdY-IToa-LBi8-2XJjXF
  LV Write Access        read/write
  LV Status              available
  # open                 0
  LV Size                10.00 GiB
  Current LE             2560
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           251:2
...

既然用工具没法删除的话就干脆从数据库里直接删除,无非就是一条记录而已,先从 nova 数据库里找到这条 volume 记录并设置状态为 deleted,然后删除实际对应的 LVM. 从数据库里找到相应的表和记录后设置 status 为 deleted 状态:

# mysql -u root -p
Enter password:

mysql> use nova;

mysql> select status,id from volumes;
+----------------+----+
| status         | id |
+----------------+----+
| creating       |  1 |
| error_deleting |  2 |
| available      |  3 |
+----------------+----+
3 rows in set (0.00 sec)

mysql> update volumes set status='deleted' where id='2';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

退出 mysql 数据库操作回到命令行就会看到 vol-00000002 的状态是 deleted 的,然后用 lvmremove 命令删除:

# euca-describe-volumes 
VOLUME	vol-00000002  10  nova	deleted (mycloud, node01, None, None)	2011-08-30T13:15:24Z

# ls /dev/nova-volumes/
volume-00000002 volume-00000003

# lvremove /dev/nova-volumes/volume-00000002 
Do you really want to remove active logical volume volume-00000002? [y/n]: y
  Logical volume "volume-00000002" successfully removed

最后用 nova-manage 命令从数据库里彻底删除 vol-00000002(当然也可以直接在 mysql 里用 SQL 语句操作删除对应的记录 DELETE FROM volumes WHERE id=’2′;):

# nova-manage volume delete vol-00000002

# euca-describe-volumes 
VOLUME	vol-00000003  10  nova	available (mycloud, node01, None, None)	2011-08-30T13:20:04Z

Linode 只有19人?!

今天无意中在 2011 Inc. 5000 看到了几家 hosting 公司的数据,包括我们熟悉的 VPS 服务商 Linode,Linode 去年的收入为1070万美元,却只有19名员工,生产力非常强悍~~

另一家大家熟悉的服务器托管公司 SingleHop 发展迅猛,2006年创立,2007年收入只有17万美元,2011年收入就达到1260万美元,3年增长 7305%!,员工43人。SingleHop 的创始人 Zak Boca 和 Dan Ushman 在大学的时候还曾创办了一家大家熟悉的 hosting 公司 MidPhase,并在2007年卖给了 VPS.NET,MidPhase 增长速度也非常惊人,网站开通6个月就吸引了1000位客户,Zak 和 Dan 意识到了“商机”,立即退学到芝加哥开了第一间办公室,3年内从0增长到年收入1600万美元,卖掉 MidPhase 的时候他们还不到25岁。

同样也是在2006年创立的托管公司 WiredTree,同样也是在芝加哥,收入和上面的 SingleHop 比起来就差远了,只有400多万美元。

公司 创立时间 员工数 年收入(2010)
Linode 2003 19 $10.7 百万
SingleHop 2006 43 $12.6 百万
SoftLayer Technologies 2005 550 $278.8 百万
WiredTree 2006 21 $4.3 百万
Go Daddy 1997 2900 $741.2 百万
Fibernet Corp 1994 33 $3.7 百万

OpenStack Nova 的存储管理

OpenStack Nova 创建出来的 instance 不是所有的类型都有存储的,比如 m1.tiny: Memory: 512MB, VCPUS: 1, Storage: 0GB, FlavorID: 1, Swap: 0MB, RXTX Quota: 0GB, RXTX Cap: 0MB 的存储就是 0,也就是说关闭 m1.tiny 类型的 instance 后所有数据都会丢失。OpenStack Nova 使用 nova-volume 服务来管理存储,可以把这种服务看成云计算时代的 USB,可以随时 attach 到 instance 上做额外存储,其实现和 Amazon 的 Elastic Block Storage (EBS) 不同,nova-volume 提供的是一种基于 Linux LVM 的 iSCSI 解决方案。

Nova-volume 需要一个单独的分区做 LVM,如果系统上没有多余的分区做 LVM 的话可以用一个文件来充当硬盘,当然这种方法只能自己测试玩玩,应用到生产环境最好还是用物理硬盘上的分区做 LVM.

新建一个文件来做 LVM:

# dd if=/dev/zero of=/home/vpsee/nova-volumes.img bs=1M seek=100000 count=0
# losetup -f nova-volumes.img

# losetup -a
/dev/loop0: [fb00]:24120015 (/home/vpsee/nova-volumes.img)

# vgcreate nova-volumes /dev/loop0
  No physical volume label read from /dev/loop0
  Physical volume "/dev/loop0" successfully created
  Volume group "nova-volumes" successfully created

# pvscan 
  PV /dev/sda5    VG node01         lvm2 [465.52 GiB / 48.00 MiB free]
  PV /dev/loop0   VG nova-volumes   lvm2 [97.65 GiB / 77.65 GiB free]
  Total: 2 [563.17 GiB] / in use: 2 [563.17 GiB] / in no VG: 0 [0   ]

默认情况下 iscsitarget 软件包安装后并没有自动启动,所以需要手动配置和启动 iscsitarget 服务:

# vi /etc/default/iscsitarget
ISCSITARGET_ENABLE=true

# service iscsitarget start
 * Starting iSCSI enterprise target service

新建一个大小为 10GB 的 volume,检查一下是否创建成功(available),并把刚创建的 volume 附加到正在运行的 instance 上,附加成功后再次检查 volume 的状态就变成 in-use 了:

# euca-create-volume -s 10 -z nova
VOLUME	vol-00000003	10	creating (mycloud, None, None, None)	2011-08-30T13:20:04Z

# euca-describe-volumes 
VOLUME	vol-00000003	 10		nova	available (mycloud, node01, None, None)	2011-08-30T13:20:04Z

# euca-describe-instances 
RESERVATION	r-i5927300	mycloud	default
INSTANCE	i-00000031	ami-00000006	172.16.39.224	172.16.39.224	running	mykey.priv (mycloud, node01)	0		m1.tiny	2011-08-26T07:12:57Z	nova		

# euca-attach-volume -i i-00000031 -d /dev/vdb vol-00000003
VOLUME	vol-00000003

# euca-describe-volumes 
VOLUME	vol-00000003	 10		nova	in-use (mycloud, node01, i-00000031[node01], /dev/vdb)	2011-08-30T13:20:04Z

如果想从运行的 instance 上卸载 volume 的话用 euca-detach-volume,卸载成功的话就会看到 volume 的状态又变回 available 了:

# euca-detach-volume vol-00000003
VOLUME	vol-00000003

# euca-describe-volumes 
VOLUME	vol-00000003	 10		nova	available (mycloud, node01, None, None)	2011-08-30T13:20:04Z

Linux Then and Now

今年 Linux 满20周年,Linux Foundation 做了个漂亮的图片,从 LinuxConf 2011 与会人员的调查数据来看有个惊讶的地方是选择 ArchLinux 版本的人(选择 Other 的人几乎填的都是 ArchLinux)仅次于 Ubuntu 和 Fedora/Redhat,居然用的人比 Debian 还多?!

linux then and now

OpenStack Nova 安装后的 FlatManager 网络配置

这篇在 Ubuntu 上安装和配置 OpenStack Nova 的评论比较多,至少有6位网友遇到 ping 不通的问题,说实话 ping 不通的原因有很多(最常见的是 euca-authorize 授权问题),如果没有提供有用信息只是留下一句“ping 不通”很难判断问题所在,建议大家以后留言的时候尽量把自己的情况说清楚,尽量多的提供一些信息。OpenStack Nova 的网络设置很复杂,controller 上可以有多个网卡,compute 上也可以有多网卡,controller 和 compute 的网络设置还可以不同,并且每个设置还可以分为 FlatManager, FlatDHCPManager, VlanManager,每个 project 允许不同的网络设置,并且每个 user 可以创建多个 project 和 network,晕了吧-~

这里只介绍最简单的一种情况,只有一个网卡、一个 user 创建一个 project 和 network、直接使用现有的局域网 IP 地址不干扰现有网络。就是说把安装好的 OpenStack Nova Controller/Compute 并入到现有的局域网里,在 Nova 上创建的 instance 通过 bridge 使用现有局域网的 IP(而不是另建一个私有网络)。比如 VPSee 实验室现在已经有了 172.16.38.0/23 这个网络,如何利用这个网络和配置 OpenStack Nova 呢?

先检查一下 Nova 的配置文件:

$ sudo vi /etc/nova/nova.conf
--logdir=/var/log/nova
--state_path=/var/lib/nova
--lock_path=/var/lock/nova
--verbose
--s3_host=172.16.39.111
--rabbit_host=172.16.39.111
--cc_host=172.16.39.111
--ec2_url=http://172.16.39.111:8773/services/Cloud
--FAKE_subdomain=ec2
--sql_connection=mysql://root:[email protected]/nova
--glance_host=172.16.39.111
--image_service=nova.image.glance.GlanceImageService
--my_ip=172.16.39.111
--network_manager=nova.network.manager.FlatManager
--fixed_range=172.16.38.0/23
--num_networks=1
--flat_injected=true

看看 bridge 网卡配置是否正确:

$ sudo vi /etc/network/interfaces
auto lo
iface lo inet loopback

auto br100
iface br100 inet static
address 172.16.39.111
netmask 255.255.254.0
gateway 172.16.38.1
bridge_ports eth0
bridge_stp off
bridge_maxwait 0
bridge_fd 0

如果修改了上面的配置需要重启 Nova 的各个模块和 Ubuntu 的网络,怕麻烦的话还是直接重启系统吧:

$ sudo reboot

如果 nova-manage network list 发现有以前留下的网络需要 delete 掉,删除所有以前残留的网络然后重新创建一个 172.16.38.0/23 新网络:

$ sudo nova-manage network delete 192.168.3.0/24 1 255

$ sudo nova-manage network create 172.16.38.0/23 1 512

$ sudo nova-manage network list
network           	netmask        	start address  	DNS            
172.16.38.0/23    	255.255.254.0  	172.16.38.2    	8.8.4.4

因为有些 IP 地址是我们局域网正在用的,新建的 VM 不能占用这些 IP,所以需要划分一些 IP 留给 OpenStack Nova 用,需要进入数据库后修改 fixed_ips 这个表的 reserved 为 0,比如我们想把 172.16.39.222-226 这5个 IP 留给 OpenStack Nova instances:

$ mysql -u root -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 135
Server version: 5.1.54-1ubuntu4 (Ubuntu)

Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.
This software comes with ABSOLUTELY NO WARRANTY. This is free software,
and you are welcome to modify and redistribute it under the GPL v2 license

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> use nova;
Database changed

mysql> update fixed_ips set reserved = '1';
Query OK, 6 rows affected (0.00 sec)
Rows matched: 1448  Changed: 6  Warnings: 0

mysql> update fixed_ips set reserved = '0' where address='172.16.39.222';
mysql> update fixed_ips set reserved = '0' where address='172.16.39.223';
mysql> update fixed_ips set reserved = '0' where address='172.16.39.224';
mysql> update fixed_ips set reserved = '0' where address='172.16.39.225';
mysql> update fixed_ips set reserved = '0' where address='172.16.39.226';

重启 OpenStack Nova 的各个模块,然后新建一个 ubuntu instance 测试一下是否得到了正确的 IP 并能 ping 通网关(172.16.38.1)。

Joyent 发布 SmartOS 开源操作系统

以 OpenSolaris 为基础架构的云计算公司 Joyent 上周发布了他们自己的操作系统 SmartOS,并在 github 上公开了其所有的源代码,很高兴看到又一个云计算厂商加入到开源的队伍。和其他依赖 Linux 的云计算系统不同,Joyent 提供的 SmartOS 基于 illumos(SUN 被 Oracle 收购后,OpenSolaris 分裂出来的版本)。SmartOS 很好的综合了 Solaris 上面几个最优秀的技术 Zones, ZFS 和 DTrace,并硬是把 Linux 上的 KVM 虚拟技术集成到了 SmartOS(为什么不集成 Xen 呢?OpenSolaris 已经有了 Xen,集成 Xen 会更容易一些),想不到集成在 Linux 内核里面的 KVM 还能被生剥下来放到 illumos 内核里,工作量可是相当大,据说两三个人只花了一年的时间,现在的牛人真是牛的无法无天:)

SmartOS 最大的特色可能就是 KVM on illumos/Solaris. SmartOS 同时包含了全虚拟化技术 KVM 和操作系统级别的虚拟化技术 Zone,加上对 ZFS 文件系统的支持和 DTrace 动态跟踪工具的配合,可以说是一个相当完美的系统。SmartOS 有啥用呢?谁可能会有兴趣呢?

Developers, Cloud Providers, Carriers, ISV Appliance Makers, Mobile Device Manufacturers, Service Providers, Enterprises, Next generation HPC.

晚上 VPSee 没事玩了一下 SmartOS,启动 SmartOS 后就可以直接用 kvm 创建虚拟机了:

# qemu-img create -f qcow2 ubuntu.img 10G 
# qemu-system-x86_64 -hda ubuntu.img -cdrom \
/home/vpsee/ubuntu-10.04.3-server-amd64.iso -boot d -m 512

SmartOS 的启动界面:

smartos

在 CentOS 上安装和配置 OpenStack Nova

因为 Python 的版本问题,在 CentOS 5.6 上安装 OpenStack 不是件容易的事情,因为 OpenStack 是 Python 2.6 写的,CentOS 5.6 上默认的是 Python 2.4 的环境,一些关键工具(比如 yum 等)和依赖关系都需要 2.4,不容易直接升级到 2.6,所以要在 CentOS 上安装 OpenStack 的话简单的办法是直接用 CentOS 6.0(默认是 Python 2.6). OpenStack 的基本介绍以及如何在 Ubuntu 上安装 OpenStack Nova 可以看:在 Ubuntu 上安装和配置 OpenStack Nova. 对云计算平台感兴趣的朋友可以看看另一个开源的云计算系统:在 CentOS 上安装和配置 OpenNebula.

安装和配置基本系统

在安装完基本的 CentOS 6.0 系统后(最小化安装)升级和更新整个系统,然后关闭 SELINUX 后重启,为了简单方便最好也关闭 iptables:

# yum update
# yum upgrade

# vi /etc/sysconfig/selinux
SELINUX=disabled

# chkconfig iptables off
# service iptables stop

# shutdown -r now

安装 OpenStack Nova

下载和安装 OpenStack 源:

# wget http://yum.griddynamics.net/yum/diablo-3/openstack/openstack-repo-2011.3-0.3.noarch.rpm
# rpm -ivh openstack-repo-2011.3-0.3.noarch.rpm

OpenStack Nova 需要在控制结点(Cloud Controller)和计算结点(Cloud Compute)上都安装和启用 libvirtd:

# yum install libvirt
# chkconfig libvirtd on
# service libvirtd start

如果服务器用来做 Cloud Controller 结点需要安装(OpenStack Nova 云里至少要有一台服务器作为控制结点):

# yum install euca2ools openstack-nova-node-full unzip

如果服务器只是做 Cloud Compute 结点则需要在每个计算结点上都安装(理论上 OpenStack Nova 云里可以有无数个计算结点):

# yum install openstack-nova-node-compute

配置 MySQL 数据库

OpenStack Nova 需要数据库的支持,这里用的是 MySQL:

# service mysqld start
# chkconfig mysqld on
# service rabbitmq-server start
# chkconfig rabbitmq-server on

修改 MySQL 绑定地址,以便其他的节点服务器也能访问这个数据库:

# vi /etc/my.cnf
...
#bind-address           = 127.0.0.1
bind-address            = 0.0.0.0
...

# service mysql restart

创建一个名为 nova 的数据库,并设置 root 从任何 IP 访问的权限和密码:

# mysql -uroot -ppassword -e 'CREATE DATABASE nova;'
# mysql -uroot -ppassword -e "GRANT ALL PRIVILEGES ON *.* TO \
'root'@'%' WITH GRANT OPTION;"
# mysql -uroot -ppassword -e "SET PASSWORD FOR \
'root'@'%' = PASSWORD('password');"

配置 Nova:

$ sudo vi /etc/nova/nova.conf
--verbose=false
--ec2_url=http://172.16.39.111:8773/services/Cloud
--s3_host=172.16.39.111
--cc_host=172.16.39.111
--rabbit_host=172.16.39.111
--sql_connection=mysql://nova:[email protected]/nova
--glance_api_servers=172.16.39.111:9292
--use_s3=true
--libvirt_type=kvm
--use_syslog=false
--node_availability_zone=nova
--logdir=/var/log/nova
--logging_context_format_string=%(asctime)s %(name)s: %(levelname)s [%(request_id)s %(user)s %(project)s] %(message)s
--logging_default_format_string=%(asctime)s %(name)s: %(message)s
--logging_debug_format_suffix=
--use_cow_images=true
--auth_driver=nova.auth.dbdriver.DbDriver
--network_manager=nova.network.manager.VlanManager
--scheduler_driver=nova.scheduler.zone.ZoneScheduler
--image_service=nova.image.glance.GlanceImageService
--use_ipv6=false
--ca_path=/var/lib/nova/CA
--keys_path=/var/lib/nova/keys
--images_path=/var/lib/nova/images
--buckets_path=/var/lib/nova/buckets
--instances_path=/var/lib/nova/instances
--networks_path=/var/lib/nova/networks
--dhcpbridge_flagfile=/etc/nova/nova.conf
--dhcpbridge=/usr/bin/nova-dhcpbridge
--injected_network_template=/usr/share/nova/interfaces/
--libvirt_xml_template=/usr/share/nova/libvirt.xml.template
--vpn_client_template=/usr/share/nova/client.ovpn.template
--credentials_template=/usr/share/nova/novarc.template
--state_path=/var/lib/nova
--lock_path=/var/lib/nova/tmp
--vnc_enabled=true
--vncproxy_url=http://172.16.39.111:6080
--vncserver_host=0.0.0.0
--vnc_token_ttl=300

每次重启一堆服务很麻烦,写个脚本方便重启 nova 所有服务:

# vi nova-restart-all.sh
#!/bin/bash
for n in api compute network objectstore scheduler vncproxy; do service openstack-nova-$n restart; done
service openstack-glance-api restart
service openstack-glance-registry restart

# chmod +x nova-restart-all.sh

# ./nova-restart-all.sh

使用 Nova

接下来的步骤和在 Ubuntu 上安装和配置 OpenStack Nova 差不多,这里就不再赘述:

# nova-manage db sync
# nova-manage network create 192.168.0.0/24 1 255
# nova-manage floating create 10.10.10.2 10.10.10.224/27
# nova-manage user admin vpsee
# nova-manage project create mycloud vpsee

导出权限信息:

# mkdir /home/vpsee/creds
# nova-manage project zipfile mycloud vpsee /home/vpsee/creds/novacreds.zip

# cd /home/vpsee/creds
# unzip novacreds.zip
# chown -R vpsee:vpsee /home/vpsee/creds/

# source /home/vpsee/creds/novarc

再次重启 nova 相关的所有服务:

# ./nova-restart-all.sh

如果一切正常的话,应该可以看到下面的类似信息,这样 OpenStack Nova 就成功安装了:

# euca-describe-availability-zones verbose
AVAILABILITYZONE	nova	available
AVAILABILITYZONE	|- node00	
AVAILABILITYZONE	| |- nova-network	enabled :-) 2011-08-16 19:28:13
AVAILABILITYZONE	| |- nova-compute	enabled :-) 2011-08-16 19:28:22
AVAILABILITYZONE	| |- nova-scheduler	enabled :-) 2011-08-16 19:28:14

启动第一个实例

启动实例之前需要先上传一个系统模版(称之为镜像 image),自己制作 image 有点麻烦,可以参考:为 OpenStack Nova 制作 Ubuntu 镜像为 OpenStack Nova 制作 Windows 镜像

有了 image 后就可以启动实例了,就像在 C++/Java 等面向对象语言里面有了类(class)以后可以创建实例(instance)一样,这里有了 OS image 以后就可以创建 OS instance 了。启动和访问实例可以看这篇 的相关部分。

BigV:£10 1GB Cloud VPS

bigv

BigV Hosting 是英国 Bytemark Hosting 旗下的一个品牌,Bytemark 2001年由一位软件工程师和一位网络工程师共同创立,2007年的时候进入 Xen VPS 市场。VPSee 经常看的一个 Linux 网站 Debian Administration 的站长和创始人居然就是他们公司的一位系统管理员。他们自己开发了基于 KVM 的 BigV 产品,能轻松扩展到 120GiB 的内存和 40TiB 的存储,他们的产品有点特别,可以下载一个工具后从自己本地电脑的 CD-ROM 里安装操作系统到 VPS 里,虽然这样安装的速度可能会很慢,不过对那些网速快想使用自己系统安装盘的客户还是很方便的。他们的 BigV 系统现在正在 Beta 测试中,得到邀请后就可以测试他们的系统,可以随意扩展 VPS 到 120GB 内存哦,想想怎么玩 120GB 内存的机器吧。VPS 配置如下:

1GB RAM
25GB 硬盘
每月 200GB 流量
1 IP
10英镑每月

没有服务器硬件配置信息。

定期清理和保留 history 记录

有经验的 Linux 系统管理员都喜欢把 Bash 的 HISTSIZE/HISTFILESIZE 设置的很大,这样可以记录更多的历史命令以便以后查阅,这是个好习惯,有个小问题就是 history 记录了的大量信息在系统启动后就被 load 到内存里,并且一直保存在内存里,这样浪费了不少内存,据统计100000条历史记录大概占用 10MB 左右的内存。对于优化过的 64MB/128MB 小内存 VPS 来说 10MB 的可用内存可以干很多事情,比如启用一个 MySQL 服务,开多个 Nginx/PHP-CGI,开个 syslogd, openvpn 等,把 10MB 留给 history 实在太浪费。那么如何保存尽量多的历史记录而又不浪费内存呢?一个办法就是把历史记录定期保存到硬盘上,bash 的当前历史记录保存在 .bash_history 里,只要定期清理这个文件的记录就可以了:

#!/bin/bash
# archive linux command history files
# written by vpsee.com

umask 077
maxlines=2000

lines=$(wc -l < ~/.bash_history)

if (($lines > $maxlines)); then
    cut=$(($lines - $maxlines))
    head -$cut ~/.bash_history >> ~/.bash_history.sav
    sed -e "1,${cut}d"  ~/.bash_history > ~/.bash_history.tmp
    mv ~/.bash_history.tmp ~/.bash_history
fi

上面脚本所做的事情很简单,检查 .bash_history 文件,如果行数超过2000行就剪裁2000行记录并添加到 .bash_history.sav 这个文件里,这样我们就可以保存所有的历史记录,而且当前的历史记录不超过2000行,只占用少量资源。