月度归档:2017年06月

yum安装中config.py错误解决

报错内容

Traceback (most recent call last):
  File "/usr/bin/yum", line 29, in <module>
    yummain.user_main(sys.argv[1:], exit_code=True)
  File "/usr/share/yum-cli/yummain.py", line 298, in user_main
    errcode = main(args)
  File "/usr/share/yum-cli/yummain.py", line 115, in main
    base.getOptionsConfig(args)
  File "/usr/share/yum-cli/cli.py", line 229, in getOptionsConfig
    self.conf
  File "/usr/lib/python2.6/site-packages/yum/__init__.py", line 911, in <lambda>
    conf = property(fget=lambda self: self._getConfig(),
  File "/usr/lib/python2.6/site-packages/yum/__init__.py", line 300, in _getConfig
    startupconf = config.readStartupConfig(fn, root)
  File "/usr/lib/python2.6/site-packages/yum/config.py", line 896, in readStartupConfig
    startupconf.releasever = _getsysver(startupconf.installroot, startupconf.distroverpkg)
  File "/usr/lib/python2.6/site-packages/yum/config.py", line 1047, in _getsysver
    hdr = idx.next()
StopIteration

报错Traceback提示为,config.py中的_getsysver方法出现了问题

解决方法为

rpm --rebuilddb

参考:Yum completely broken after deleting something

Hyper-V内网穿透策略

在家里弄了一台Hyper-V的小服务器,作为服务器,自然得能从公网访问。所以,就需要进行一些策略配置来达到公网访问(内网穿透)的目的。

基本信息:

  1. Hyper-V服务器一台,部署两台虚拟机
    • Hyper-V: 192.168.1.100
    • Windows: 192.168.1.101
    • CentOS: 192.168.1.102
  2. ASUS路由器一台
    • IP: 192.168.1.1
    • DDNS: zivers.asuscomm.com
  3. 公网域名:zivers.com
  4. 公网服务器一台:111.111.111.111

需求:

  1. 在公网使用SSH连接到CentOS虚拟机
  2. 在公网使用公网域名home.zivers.com访问到CentOS中的网站
  3. 在公网通过远程桌面登录到Hyper-V服务器和Windows虚拟机

下面是内网穿透方法。

路由器绑定

内网穿透的关键在于将域名绑定到路由器,这一步完成后,只需要通过端口转发将路由器端口与服务器内网IP绑定即可。

华硕路由器提供了自己的DDNS域名,如果不是使用华硕路由器,也可以用花生壳或No-IP域名替代,如果也不想用花生壳之流,可以使用ngrok插件实现。由于电信运营商提供的IP一直在变,所以想要访问到路由器,只能通过DDNS这种方式。DDNS实现了从DDNS域名 -> 实际IP的映射,那么我们只需要完成公网域名home.zivers.com -> DDNS域名的映射,实际上就是绑定了公网域名和路由器实际IP。而这一步,仅需要在DNS解析处设置一个CNAME解析记录即可。

端口转发

完成了路由器的绑定,下面只需要在路由器上设置端口规则。比如,在路由器上建立了如下规则:

ROUTER:8081 -> 192.168.1.102:80

这样访问home.zivers.com:8081实际上将会将请求转到192.168.1.102的80端口处理。也能通过端口来区分不同服务器上的同一服务。例如,我需要通过远程桌面分别访问到Hyper-V服务器和Windows虚拟机,这样我就需要开启两个端口转发规则,分别指向这两台服务器的3389端口。

ROUTER:3389 -> 192.168.1.100
ROUTER:3390 -> 192.168.1.101

Nginx反向代理

由于电信运营商封闭了80端口,所以在路由器上直接进行zivers.asuscomm.com:80 -> 192.168.1.102:80的端口转发是行不通的。那么,势必不能用常用的端口,所以我选择了8081,于是就成了:

home.zivers.com:8081 -> zivers.asuscomm.com:8081 -> 192.168.1.102:80

但是,这样也会有一个问题,就是正常用户不会在公网上使用带端口号的域名访问网站,所以这里就需要加上一层Nginx反向代理。将www.zivers.com代理到home.zivers.com:8081。这样只需要在公网访问www.zivers.com实际上访问的就是192.168.1.102:80了。下面是Nginx规则:

server {
    listen 80;
    server_name www.zivers.com;
    location / {
        proxy_pass http://home.zivers.com:8081;
    }
}

CentOS 7安装Python3

在最新的CentOS版本7.3中,自带的Python版本依旧是2.7,而Django的建议版本已经到了3.x。所以需要安装新版本的Python,同时保留旧的Python环境。

首先安装epel源

yum install epel-release

查看可用的python3版本

yum list python3*

可以看见列表里提供Python 3.4

yum -y install python34

下面安装pip,python2.7和pyhon3.4的pip是可以同时存在的,默认分别为pip,pip3

yum install python-pip # 安装python2.7的pip
yum install python34-pip # 安装python3.4的pip,两者可以同时存在

查看pip版本信息

~# pip -V
pip 8.1.2 from /usr/lib/python2.7/site-packages (python 2.7)
~# pip3 -V
pip 8.1.2 from /usr/lib/python3.4/site-packages (python 3.4)

其实是一个东西,不过安装在了不同目录下。一般使用其中一个就行了。例如安装virtualenv

pip3 install virtualenv

使用virtualenv创建python3虚拟环境

virtualenv venv -p /bin/python3 --no-site-packages

Hyper-V虚拟机开机内存占用过高原因

用Hyper-V启动了两台虚拟机,一台Win7,另一台CentOS。但启动后都出现了一个现象,明明是刚启动,但是内存却几乎已经占满。查看任务管理器/TOP,并没有任何应用占用了内存,那么内存究竟是被什么占了呢。

可以看见,两个系统的内存占用率都达到了90%以上。Google后,serverfault上的一帖给出了原因:

You enabled Dynamic Memory. So, while there’s nothing requiring that memory in your VM, the hypervisor asked for the memory back, and received it. To make sure that this memory that the guest OS has released back to the hypervisor isn’t accidentally used (which would cause the guest OS to fault,) the Dynamic Memory integration component (a device driver) in the guest has allocated it. This is why the report shows the memory as allocated.

简单的说就是我在Hyper-V创建虚拟机时启用了动态内存,动态内存的机制是:比如你给虚拟机分配了8G内存,虚拟机实际占用1G,那么剩下的7G就会被Hyper-V服务器回收,回收的这部分也显示为占用,所以就全部被占满了。

参考:Guest VM showing HIGH memory usage when nothing is using the memory

CentOS手动指定IP

由于在安装系统的时候没有指定IP配置,所以系统自动选择了DHCP的方式获取IP。这里将说明如何手动配置static ip:

首先配置nameserver

[root@localhost ~]# cat /etc/resolv.conf 
# Generated by NetworkManager
nameserver 223.5.5.5
nameserver 223.6.6.6

然后手动指定IP(不使用DHCP)

[root@localhost ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0 
TYPE=Ethernet
BOOTPROTO=static    #不使用DHCP,修改为static
DEFROUTE=yes
PEERDNS=yes
PEERROUTES=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_PEERDNS=yes
IPV6_PEERROUTES=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=eth0
UUID=0a8e2b36-ac3a-4050-8792-1b68c8b4a36e
DEVICE=eth0
ONBOOT=yes    #修改为yes,启动生效
IPADDR0=192.168.50.101    #需要指定的IP
PREFIX0=24    #子网掩码
DNS1=223.5.5.5    #手动配置DNS服务器
DNS2=223.6.6.6

重启network生效

service network restart

使用Hyper-V建立CentOS虚拟机

首先打开Hyper-V的管理面板

选择虚拟交换机管理器

创建新的外部网络虚拟交换机。之后创建的虚拟机将通过连接到这个虚拟交换机连接外部网络。

下面是我的网络情况

路由器(网关):192.168.50.1
家用PC:192.168.50.2~99
Windows Server(Hyper-V):192.168.50.100
CentOS(虚拟机,桥接到之前创建的虚拟交换机):192.168.50.101

创建好了的网络之后,下面创建虚拟机

选择第一代能够具有更好的兼容性,第二代性能更强。这里我选择的是第一代

网络选择连接到之前创建的虚拟交换机

选择安装镜像

其他的配置按照推荐即可。然后启动服务器完成正常的系统安装步骤,就不再这里详述了。

搭建Hyper-V服务器

Hyper-V是微软主导的虚拟化产品,与之对应的是Linux下的KVM。和VMware ESXi以及Xen这类的虚拟化产品的使用目的相同,但前两者都是以操作系统为基础,而后两者直接在物理机上部署。

折腾了许久的VPS,终于忍不住自己动手组件一套虚拟机平台来玩玩了。配置如下:

CPU: Intel E3-1265L v2
Motherboard: Gigabyte GA-H77TN
Memory: Hynix DDR3-1600 16Gb (SO-DIMM 8Gb*2)
mSATA: Plextor M6M 256GB
SATA: Crucial MX300 750GB
CPU Cooler: ID-COOLING IS-20i
Power Supply: HP AC/DC Adapter 19V
Case: SilverStone SST-PT13B

之所以在2017年中还使用2012年的LGA 1155老平台是因为我已经有一套x99 5820k的高性能主机,这台小主机仅仅是用来折腾的,所以配置够用就好。而且这个平台现在的价格已经十分合适,所以选择了以上配置。

系统安装

安装基于Windows Server 2016平台,安装方式和使用U盘安装普通Windows系统相同:

  1. 下载Windows Server的.iso镜像文件
  2. 使用UltraISO软件将镜像刻录到U盘中*
  3. 修改BIOS将U盘设置为优先启动
  4. 使用安装密钥安装系统
  5. 使用KMS激活系统

*刻录到U盘中时,可能出现安装失败的情况,提示为sources/install.win错误。出现原因是,刻录到U盘时,U盘的系统被修改成了FAT32,但需要的系统是NTFS,解决办法如下:

在CMD下执行命令

convert X:/FS:NTFS #其中X为U盘盘符

然后将ISO镜像中的install.win文件提取出来,覆盖掉U盘sources目录下的同样文件。之后正常安装即可。

工具附录

Windows Server 2016镜像下载:

ed2k://|file|cn_windows_server_2016_x64_dvd_9718765.iso|6176450560|CF1B73D220F1160DE850D9E1979DBD50|/

安装密钥(支持KMS):

KMS激活工具:其中,Datacenter(数据中心)版可以支持所有属性,所以我选择的是这个版本。

KMSPico:https://pan.baidu.com/s/1pLoaZTT