今天我需要为AWS上的虚机升级测试版本的kernel,并进行一些测试。
由于公司的网络并不对外开放,因此我们需要手动拷贝YUM源进行升级。用传统的方法,步骤很容易理解:
- 在AWS网站上找到最新的AMI,用它启动一个虚机。
- 将安装镜像
RHEL-7.4-20170621.0-Server-x86_64-dvd1.iso
上传到这个虚机中。 - Mount这个镜像文件,并以此创建YUM源。
- 执行
yum update
操作完成更新。
然而这就遇到一个问题,这个镜像文件有4.2GB大小,上传不仅需要占用带宽资源,而且还要花费很多时间。
解决办法我首先想到将目录http://download.eng.pek2.redhat.com/pub/rhel/rel-eng/RHEL-7.4-20170621.0/compose/Server/x86_64/debug/tree/
拷贝到虚机上,然而发现自己并不确定哪些package是升级所需要的,因此只能全部上传,这样并不能有多大改观。
其次,我想到在AWS虚机上安装客户端,通过VPN访问内网资源。这样做当然是可行的,只是openvpn配置起来需要将证书拷来拷去,这使我担心潜在的安全问题,也担心后续会过多地占用VPN服务器资源。
后来,我想到了一个办法,将公司内网的HTTP代理服务器,用反向连接的方式,共享给AWS虚机,用到的命令大概会是这样:
ssh -R ec2-13-113-60-192.ap-northeast-1.compute.amazonaws.com:8080:squid.corp.redhat.com:3128 -i ~/.pem/ap-northeast-1-cheshi.pem ec2-user@ec2-13-113-60-192.ap-northeast-1.compute.amazonaws.com
这样做应该是最简单的方案了,但是它还有一个小问题,所有流量都要去公司代理服务器上绕一圈,数据通路看起来会是这样的:AWS <-> MyHost <-> ProxyServer <-> FileServer
。浪费资源是一方面,更重要的是如果更新量很大, 过多地占用了公司代理服务器的资源,有可能会被IT部门审计出来。
于是,我将这个方案进行了一些改进。我直接将MyHost做成了ProxyServer,并将代理的端口映射到AWS虚机中,这样就不会过多地占用公司的资源,速度也应该会快一些。下面来看我怎么做:
ProxyServer我用的是Squid,它是一款开源软件,配置十分简单,几乎不用修改任何配置就可以拿来当HTTP代理服务器用。首先,登录MyHost并执行:
[root@dhcp-1-202 ~]# yum install -y squid
[root@dhcp-1-202 ~]# squid -z
[root@dhcp-1-202 ~]# systemctl start squid.service
然后是将本地的3128
端口(Squid服务的默认端口)映射到AWS虚机的8080
端口,让虚机可以直接使用这个代理服务器。
ssh -R 8080:127.0.0.1:3128 -i ~/.pem/ap-northeast-1-cheshi.pem ec2-user@ec2-13-113-60-192.ap-northeast-1.compute.amazonaws.com
随后,来到AWS虚机中,添加YUM源,并为其设置代理服务器(http://127.0.0.1:8080/
)。
[ec2-user@ip-172-31-10-95 ~]$ cat /etc/yum.repos.d/rhel7u4.repo
[rhel7u4-debug]
name=rhel7u4-debug
baseurl=http://download.eng.pek2.redhat.com/pub/rhel/rel-eng/RHEL-7.4-20170621.0/compose/Server/x86_64/os
enabled=1
gpgcheck=0
proxy=http://127.0.0.1:8080/
[ec2-user@ip-172-31-10-95 ~]$
最后,进行更新即可。
[ec2-user@ip-172-31-10-95 ~]$ sudo yum update --enablerepo=rhel7u4-debug
Loaded plugins: amazon-id,rhui-lb,search-disabled-repos
Resolving Dependencies
--> Running transaction check ---> Package NetworkManager.x86_64 1:1.8.0-0.4.rc3.el7 will be updated ---> Package NetworkManager.x86_64 1:1.8.0-9.el7 will be an update ......
Complete!
[ec2-user@ip-172-31-10-95 ~]$
备注,如果没有设置代理服务器,或者代理服务器不通(通常是由于MyHost上的防火墙所致),就会收到这样的消息:
failure: repodata/repomd.xml from rhel7u4-debug: [Errno 256] No more mirrors to try.
http://download.eng.pek2.redhat.com//pub/rhel/rel-eng/RHEL-7.4-20170621.0/compose/Server/x86_64/debug/tree/repodata/repomd.xml: [Errno 14] curl#6 - "Could not resolve host: download.eng.pek2.redhat.com; Name or service not known"
搭建代理服务器有很多好处,比如可以通过wget
下载:
[ec2-user@ip-172-31-10-95 ~]$ export http_proxy=http://127.0.0.1:8080/
[ec2-user@ip-172-31-10-95 ~]$ wget http://download.eng.pek2.redhat.com/pub/rhel/rel-eng/RHEL-7.4-20170621.0/compose/Server/x86_64/os/GPL
......
[ec2-user@ip-172-31-10-95 ~]$
扩展阅读:Linux设置代理
相信大家已经看到,ssh
是个非常强大的命令,关于它在本文中的应用,可以参考我转载的另一篇博客:
参考文献:
- 使用ssh正向连接、反向连接、做socks代理的方法 http://blog.csdn.net/linsanhua/article/details/17360369
- Centos下搭建Squid代理服务器详细教程 http://www.tuicool.com/articles/IJzeAv2
- Linux设置代理 http://www.361way.com/linux-proxy/4184.html