Proxmox修改hostname笔记

今天无意中发现的一个问题,Proxmox 虽然是基于 Debian 的,但是修改 hostname 的方法却又不能像在 Debian 中修改那样直接。

在一台 Proxmox 服务器上修改主机名后发现,登录web面板之后产生了一个新的 datacenter,原先创建的vm都在旧的 datacenter中并且无法启动(处于脱机状态)。

Google 了一下,找到了答案,备忘如下:

  1. 编辑 /etc/hostname 和 /etc/hosts 将旧的 hostname 替换为新的。
  2. 重启服务器。
  3. 服务器启动后,会发现文初描述到的情形。通过 SSH 登录并进入 /etc/pve/nodes 目录,这里你会看到两个目录,分别是新 hostname 和旧 hostname。
  4. 对于 LXC,配置文件应该存储在 /etc/pve/nodes/旧 hostname/lxc,对于 KVM 则应该是 /etc/pve/nodes/旧 hostname/qemu-server,将其中的 VM/LXC 配置文件移动到相对应的新 hostname目录下。
  5. 重启服务器。
  6. 若觉得有必要,将 /etc/pve/nodes/旧 hostname/ 备份到其他位置,以备不时之需。
 

CentOS 7如何绑定附加IP

在CentOS 7上绑定附加IP有几种方法,本文将一一进行解释。

确定网卡名称

在正式开始配置附加IP的绑定之前,我们需要先确定网卡的名称,可以通过以下命令来输出:

[root@localhost ]# ip link | awk 'NR%2==1' | awk '{print $2,$8,$9}' | tr -d ':'

输出的内容应该类似于以下结果:

lo state UNKNOWN
enp3s0 state UP
enp4s0 state DOWN

第一个设备 lo 代表了loopback,第二个设备通常就是你的网卡设备,可以看到它目前的状态是 UP(即正常在线)。在上述的例子中,我们看到了 enp4s0,它是另外一张网卡但状态是 DOWN(离线),因此 enp3s0 是我们需要绑定IP的网卡。

如果你的情况是:两张网卡都是UP状态,你需要先做一个判断,选出你倾向于绑定IP上去的网卡。

定位配置文件

在上一步的一个命令中,我们使用 ip link 输出了网卡名称,现在我们可以定位它的配置文件位置(通常都在 /etc/sysconfig/network-scripts/目录中),配置文件通常都以 ifcfg-设备名称 的命名格式存在,譬如:

[root@localhost ]# cat /etc/sysconfig/network-scripts/ifcfg-enp3s0

输出结果:

TYPE=Ethernet
BOOTPROTO=none
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
NAME=enp3s0
UUID=a007fd6d-4cc5-45b6-9a38-991a8e820eaf
DEVICE=enp3s0
ONBOOT=yes
IPADDR=10.0.0.2
PREFIX=29
GATEWAY=10.0.0.1
DNS1=8.8.8.8
DNS2=8.8.4.4
IPV6_PEERDNS=yes
IPV6_PEERROUTES=yes

可以看到,目前网卡上绑定的IP是 10.0.0.2,它存在于一个 CIDR /29 的IP段中,这意味着10.0.0.3, 10.0.0.4, 10.0.0.5, 以及 10.0.0.6 也应该处于可用状态(如果你是从IDC处购得服务器,那么先确认服务商是分配给你了一个CIDR /29的IP段)。

绑定IP地址

如果你要添加绑定的IP数量较少,可以手动进行绑定。编辑网卡配置文件:

[root@localhost ]# vi /etc/sysconfig/network-scripts/ifcfg-enp3s0

因为你的网卡本身已经绑定了一个IP:IPADDR=10.0.0.2

你可以用以下方式添加这个CIDR段内的其他IP:

IPADDR0=192.168.1.3
IPADDR1=192.168.1.4
IPADDR2=192.168.1.5
IPADDR3=192.168.1.6
PREFIX0=29
PREFIX1=29
PREFIX2=29
PREFIX3=29

重启服务器网络使其生效:

[root@localhost]# systemctl restart network

如果你只是想临时绑定某个或某几个IP,可以使用命令行添加的方式,这种方式会在服务器重启后失效:

[root@localhost ]# ip addr add IP或IP段 dev 网卡名 label 设备名:别名

比如:

[root@localhost ]# ip addr add 192.168.1.44/32 dev enp3s0 label enp3s0:0

如果要移除绑定,则可以使用:

[root@localhost ]# ip addr del IP地址 dev 设备名

例如:

[root@localhost ]# ip addr del 192.168.1.72/32 dev enp3s0

绑定IP段

首先我们需要对网卡配置文件做一个小小的调整:

[root@localhost ]# vi /etc/sysconfig/network-scripts/ifcfg-enp3s0

如果该文件中没有 NM_CONTROLLED=NO 这一行,则将这一行加到文件的最底部,在CentOS 7中添加IP段绑定这是不可缺少的一步,接着我们创建IP段对应的配置文件:

[root@localhost ]# vi /etc/sysconfig/network-scripts/ifcfg-enp3s0-range

对于IP段的数量,系统并没有限制,如果你有多个IP段希望配置,则可以使用 ifcfg-enp3s0-range0, ifcfg-enp3s0-range1 这样的命名方式。

添加以下内容到文件中:

IPADDR_START=192.168.1.2 #起始IP
IPADDR_END=192.168.1.254 #结束IP
PREFIX=24 #CIDR IP段标识
CLONENUM_START=0 #别名起始号

如果你添加的IP段和你当前网卡绑定的IP不在一个段内,且不共用一个网关(Gateway),那么你还需要向文件中添加:

GATEWAY=网关地址

一切就绪之后,重启服务器网络:

[root@localhost ]# systemctl restart network
 

如何使用Proxmox管理虚拟机

最近我向不少用户推荐了Proxmox VE作为虚拟化解决方案,它具有强大的功能支持和友好的操作界面,适合初学者或希望快速创建/管理虚拟机的用户使用,下面我将针对Proxmox VE的常规使用进行讲解。

登录Proxmox VE的网页管理端口

在服务器交付邮件中,一般都给出了 宿主服务器IProot密码 两个参数,这是我们登录Proxmox VE的重要凭据。

打开浏览器,输入:

https://:8006

将替换为服务器交付邮件中您的宿主服务器IP,回车,会进入如下操作界面:

proxmox-1.png

因为Proxmox会使用自签证书,浏览器默认情况下不信任该证书,因此我们需要点击 高级 -> 继续前往(不安全)。随后我们会进入如下界面:

Proxmox-2.png

熟悉 Proxmox VE 网页版操作界面

进入 Proxmox VE 的网页版操作界面后,首先会弹出一个提示:

Proxmox-3.png

这是因为我们使用的 Proxmox VE 是社区版本(免费版)而不是 Proxmox VE 的商业版本,直接点击 OK(确定)即可。

这里我们可以把界面分为3个区域,分别是 左侧栏菜单、头部菜单、实际操作区 以及 日志与任务区,如下图所示:

proxmox-4.png

这几个区域的主要作用是:

  • 左侧栏菜单:展示宿主服务器以及其下的虚拟机、存储单元等
  • 头部菜单:主要用来创建VM(KVM虚拟机)和CT(LXC容器)
  • 实际操作区:设置查看宿主机参数、虚拟机的参数,查看虚拟机运行情况等
  • 日志与任务区:显示当前与历史任务的执行状态

左侧栏菜单

左侧栏菜单默认情况下会以树状结构展示,依次展开,会列出所有虚拟机(如果有的话)。

斯塔克云计算 以及 未镭科技 的交付流程中,虚拟机应该是已经创建完成并完成了基础配置(即可以直接使用),虚拟机的状态也应该是“正常运行中”(绿点标识)。

选择你要操作的虚拟机,在其名称上点击右键,会出现如下图所示:

proxmox-5.png

功能依次是:开机、暂停、关机、停机、转移、克隆、转化为系统模板、控制台。

点击控制台,会发现没有任何反应,这是为什么?

因为我们的浏览器阻止了新窗口的弹出,请在URL地址栏的最右侧找到一个带红叉的小图标,单击它:

proxmox-6.jpg

选择始终允许该网站弹出窗口,然后点击确定。现在浏览器将不再继续阻止新窗口的弹出,重新打开控制台,看看是不是有窗口弹出了?

在弹出的窗口中,会显示虚拟机的屏幕输出,如果是Windows服务器,那么输出的就是虚拟机的远程桌面了;Linux服务器则会输出命令行的操作界面。

 

面基小记:Ericec周良

今天在木木的Bitcron群里,得知周良来了武汉,果断约了时间,见见这位认识多年却又素未谋面的博友。

我认识周良的时候,他还没有用上Ericec这么洋气的名字,那时候他叫“小武”,一晃已经是好些年前的事情了。那是WordPress独立博客大热的时候,写博客的人多,我也是其中之一,每天打开电脑第一件事情是去访问博友的网站,看他们的最新发现、生活感悟、技术心得,也就是在这样的习惯下,认识了周良。

回忆起来,周良是我见过的第三位博友,前两位分别是 刘坤(后来的小七)、Zeraba(阿润)。与博友见面如今并不主流,当独立博客热潮退去之后,能有几个日常交流的博友已实属不易。

去见周良的时候已经是傍晚,珞狮南路车水马龙水泄不通,隔很远就望见他,我向他招手。他告诉我来武汉参加一个Sketch的线下活动,在武汉待两天。武汉的天气三十八九度,空气里密不透风,我们聊得却很欢快。

吃饭的时候我们聊起项目,聊起博客圈,聊到很多名字:万戈,林木木,Kn007,凉心,Jaskni,牧风(无冷),Elizen(三儿),漠北,沐歌,虾子酱(Yescola),ZWW,水煮鱼,Hzlzh(自力),毕扬,西门等等,我们交换这些老朋友的近况,感慨时间过得飞快,也感叹圈子真小,独立博客坚持不易,我有亲身体会,早几年因为创业的关系,鲜有时间打理博客,它也就慢慢长满荒草,但每次看到这些熟悉的名字,一个个点开链接,又使我重燃博客写作的兴致,多年前因为兴趣,而今多半因为信仰。

我把我最近在研究的项目讲给周良听,他饶有兴致,很认真的给我讲他的见解,这个比我小4岁的小兄弟非常有想法,年纪轻轻已经经历创业的酸甜苦辣,更加让我认识到后生可畏,更加觉得学无止境。早些年上大学的时候,我推崇“读书无用论”,如今进入社会,痛恨自己才疏学浅,胸无点墨。当初信誓旦旦在QQ签名中写上“坚定信念,投身新闻,此签名四年不换”,中途选择放弃转行做互联网,虽然现在混得也不算差,但还是看不起自己。

我与他讲我经历的最难熬的创业经历,讲不堪回首的艰难抉择,跟一个有相同经历的朋友讲这些让我觉得轻松,几年熬下来我已不是那个容易心血来潮的愣头青,增加的是社会阅历和对事情更成熟的看法——必须承认这当中有很多都源自博友们的日常分享,时常翻看,提醒我不要掉队。

只是Feed中存活的订阅已经越来越少,让人觉得遗憾,当初热衷博客圈子的朋友,因为工作的压力、生活的羁绊、兴趣的流失,选择了妥协,这是时间的程式不可回避,而我希望自己能够写的更久一些,写到七十岁、八十岁、九十岁,或者更多一点。

尽管这只是一次普通的面基,对我而言却有着重要非凡的意义——过去几年中零社交的状态终于结束了!诚挚欢迎各位大佬们来到武汉指点迷津把酒言欢,这里鱼肉管饱,酒水管够。

 

一次socket.error: [Errno 99] Cannot assign requested address报错排查

今天在阿里云国际版的机器上配置某个不可描述的服务时,遇到了 socket.error: [Errno 99] Cannot assign requested address 的错误,详细如下:

Traceback (most recent call last):
  File "/usr/bin/ssserver", line 11, in
    load_entry_point('shadowsocks==2.8.2', 'console_scripts', 'ssserver')()
  File "/usr/lib/python2.7/site-packages/shadowsocks/server.py", line 68, in main
    tcp_servers.append(tcprelay.TCPRelay(a_config, dns_resolver, False))
  File "/usr/lib/python2.7/site-packages/shadowsocks/tcprelay.py", line 582, in __init__
    server_socket.bind(sa)
  File "/usr/lib64/python2.7/socket.py", line 224, in meth
    return getattr(self._sock,name)(*args)

原先以为是resolver的问题,但是指定了Google的nameservers仍然无解,于是想到可能是服务器IP地址设置的问题,因为阿里云默认给网卡绑定的是内网IP地址。

于是修改某服务的配置文件中的Server IP为 0.0.0.0,再启动服务,问题解决。

 

Juniper EX4200屏蔽指定端口笔记

最开始配Juniper的时候,只是胡乱在网上找了一些别人现成的配置文件,对很多配置的理解并不透彻,这导致在很长的一段时间里面,有几个机柜的网络配置是非常minimal的,没有发挥EX4200作为TOR的优良特征。

最近想起这个事儿来了,有一个机柜默认全局屏蔽了25端口(邮件发送),这样一来就好坏通杀,想正常发邮件都不行了。于是重新翻阅了Juniper的参考文档,取以下部分为笔记:

创建防火墙filter

不管是要对端口,VLAN还是Layer 3 interface进行限制,都需要创建filter,然后在filter中创建匹配规则。

对于端口和VLAN,设置family address类型为 ethernet-switching 即可:

[edit firewall]
user@switch# set family ethernet-switching

对于Layer 3 interface,则设置family address为 inet:

[edit firewall]
user@switch# set family inet
  • 备注:对于IPv6的family address则为 inet6。可以同时在一个layer 3 interface中配置IPv4和IPv6的filter.

指定filter名称

给filter取名,最好是取得有意义一点,能够在review的时候看懂是用作什么用途,我的习惯是根据进流量和出流量命名:

[edit firewall family ethernet-switching]
user@switch# set filter INPUT-FILTER

指定规则名称

给规则取名,一个filter可以有多个规则:

[edit firewall family ethernet-switching filter INPUT-FILTER]
user@switch# set term BLOCK-25-SOURCE

设置匹配

这里可以操作的事情就很多了,比如屏蔽端口,屏蔽IP地址等:

[edit firewall family ethernet-switching filter INPUT-FILTER term BLOCK-25-SOURCE]
user@switch# set from source-port 25

设定了匹配规则,当然还要设置匹配的操作

[edit firewall family ethernet-switching filter INPUT-FILTER term BLOCK-25-SOURCE]
user@switch# set then discard

参考配置

firewall {
    family ethernet-switching {
        filter INPUT-FILTER {
            term BLOCK-25-SOURCE {
                from {
                    source-port 25;
                }
                then {
                    discard;
                    count BLOCK-25-SOURCE;
                }
            }
            term BLOCK-25-DEST {
                from {
                    destination-port 25;
                }
                then {
                    discard;
                    count BLOCK-25-DEST;
                }
            }
            term ACCEPT {
                then accept;
            }
        }
        filter OUTPUT-FILTER {
            term BLOCK-25-SOURCE {
                from {
                    source-port 25;
                }
                then {
                    discard;
                    count BLOCK-25-SOURCE;
                }
            }
            term BLOCK-25-DEST {
                from {
                    destination-port 25;
                }
                then {
                    discard;
                    count BLOCK-25-DEST;
                }
            }
            term ACCEPT {
                then accept;
            }
        }
    }
}

将规则应用到端口、VLAN或者Layer 3 interface

只需要在对应的配置规则中引入filter,即:

filter {
   input INPUT-FILTER;
   output OUTPUT-FILTER;
}

端口和VLAN对应的是 ethernet-switching, Layer 3 interface 对应的则是 inet。

 

LNMP环境快速部署Observium监控

为了项目需要,需要临时快速部署一台Observium服务器用于监控,官方给的文档已经很简洁明了,但是还是想用自己的办法部署一遍,本文仅作为部署笔记供大家参考,不一定会定期维护。

部署LNMP环境

因Observium的运行环境需要 PHP+MySQL 的支持,先找好一台Linux服务器,一键安装宝塔面板:

yum install -y wget && wget -O install.sh http://download.bt.cn/install/install.sh && sh install.sh

你完全可以根据自己的习惯和需要部署LNMP环境,我比较图省事,面板部署好根据终端中输出的登录信息登录面板,对LNMP的环境进行安装和定制,这里就不赘述了。

安装Observium运行所需组件

在终端中执行:

yum install net-snmp net-snmp-utils fping rrdtool subversion jwhois ipmitool graphviz libvirt

安装Observium

在宝塔面板添加好网站,然后从官方下载Observium社区版本安装包:

cd /www/wwwroot/monitor.dearroy.com
wget http://www.observium.org/observium-community-latest.tar.gz
tar zxvf observium-community-latest.tar.gz

解压完成后,将observium文件夹中的文件移动到网站根目录。

然后复制一份配置文件的模板文件,并进入编辑模式:

cp config.php.default config.php
vi config.php

针对MySQL数据库信息进行补全后,保存并退出编辑模式。

然后插入MySQL初始数据库信息:

./discovery.php -u

创建rrd目录并赋予写权限:

mkdir rrd
chown www:www rrd

接着添加一个初始管理员账户(等级level为10):

./adduser.php 用户名 密码 10

添加一个监控设备:

./add_device.php   v2c

如果遇到类似 Could not ping localhost. 这样的提示,请检查你的PHP是否禁用了 proc_open 这个函数。

做一个初始抓取:

./discovery.php -h all
./poller.php -h all

创建定时任务:

首先创建一个 /etc/cron.d/observium 文件,添加以下内容到其中:

# Run a complete discovery of all devices once every 6 hours
33  */6   * * *   root    /opt/observium/discovery.php -h all >> /dev/null 2>&1

# Run automated discovery of newly added devices every 5 minutes
*/5 *     * * *   root    /opt/observium/discovery.php -h new >> /dev/null 2>&1

# Run multithreaded poller wrapper every 5 minutes
*/5 *     * * *   root    /opt/observium/poller-wrapper.py 8 >> /dev/null 2>&1

# Run housekeeping script daily for syslog, eventlog and alert log
13 5 * * * root /opt/observium/housekeeping.php -ysel

# Run housekeeping script daily for rrds, ports, orphaned entries in the database and performance data
47 4 * * * root /opt/observium/housekeeping.php -yrptb

重启定时任务进程:

systemctl reload crond

大功告成!

被监控服务器的配置

首先当然是安装SNMP服务了:

yum install -y net-snmp net-snmp-utils

然后编辑 /etc/snmp/snmpd.conf,在最底部加入:

com2sec readonly default TestSecret
group MyROGroup v1 readonly
group MyROGroup v2c readonly
group MyROGroup usm readonly
view all included .1 80
access MyROGroup "" any noauth exact all none none
syslocation Los Angeles, CA
syscontact Stack Network Ltd

启动snmp服务 service snmpd start 并设置开机自启动 chkconfig snmpd on


在实际的使用中遇到了一个问题,就是Observium的数据图不返回数据,全部都是NaN的状态,于是猜想可能是定时任务执行有问题,测试了定时任务中的语句之后发现果然,poller-wrapper.py 在执行的时候提示连接不上数据库。

那么问题就来了,数据库的信息肯定是正确的,不然Observium肯定会运行出错。

自己Google了一下,原来是Python在连接数据库时不能解析 localhost,更换 config.php 中的 db_host 为 127.0.0.1 即可。

 

救援模式下chroot: failed to run command /bin/zsh的解决办法

一直都习惯用私钥进行服务器的SSH授权登录,结果今天发现有台服务器的私钥丢失了,自然就登录不进去了。

先通过NOC-PS启动到Rescue System (这里有个坑,一定要选对与服务器操作系统相匹配的位数版本,32位系统就启动到32位的Rescue System),然后执行:

mount /dev/mapper/vg-root /mnt

将硬盘挂载好之后,执行:

root@sysresccd /root % chroot /mnt
chroot: failed to run command ‘/bin/zsh’: No such file or directory

出现了chroot: failed to run command ‘/bin/zsh’: No such file or directory这样的错误,谷歌之,原来是需要指定位置的bash命令来执行,于是:

chroot /mnt /bin/bash

大功告成了!

 

使用PHP监控网站运行状态,宕机邮件提醒

今天看到钉钉上同事说城市服务有页面挂掉了,也不知道是什么时候出现的问题,如果有一个监控程序能够实时提醒运维进行修复,就可以把损失和影响控制到最小。

准备工作

  1. 准备一个邮箱用于接收提醒,最好是能及时Push到手机上的,比如QQ邮箱、126邮箱、Gmail,如果是其他的邮箱也可以通过邮箱客户端软件使用IMAP/POP3来实现实时的邮件收取。

  2. 一台能够运行PHP脚本的服务器,需要能够执行定时任务(Cron Job)。

监控脚本

打开代码编辑器,新建一个文件,保存为 monitor.php ,这部分代码也很简单,就是两个函数,一个用于测试网页是否可以访问,另一个用于给你发送邮件通知。

第一个函数 check(),需要传递两个参数:第一$host是你想要监控的网站(如:dearroy.com);第二个$find用于查找你的网站首页源代码中的一段字符串,其实添加这个的目的是出于安全考虑,如果你的首页包含这段字符串,说明你的网页没有被修改(如:被黑客恶意修改)。

如果你的网站无法访问或者安全字符串找不到,将会运行 alert() 函数,给你发送告警邮件。请确保你的监控主机可以正常使用PHP的发送邮件函数mail(),否则将无法发送邮件,替代方法是使用phpmailer

好了,保存monitor.php,并上传至你的监控服务器上。

设置一个计划任务

现在问题又来了,要想让monitor.php运行,我们得在浏览器中打开 http://yourdomain.com/monitor.php 才能检测服务器状态,不然的话再怎么监控也等于白搭。

解决这个问题的办法是使用计划任务(Cron Job),大多数虚拟主机都提供了这个功能,它可以在你设定的时刻自动地运行php脚本(例如每小时运行一次monitor.php),关于计划任务的设定可根据各人的主机来设定,遇到问题可以联系主机的客服。

*/5 * * * * php -q /htdocs/www/monitor.php
 

精致一点

danbo-fire-camp.jpg

大概是从2013年的某一天开始,就进入了一种不断忙碌的状态。忙碌于虚荣。

准确地说,有那么一阵子,很长的一阵子,我是一个分不清昼和夜的创业者,我知道只有争分夺秒才能弥补起步太晚的劣势。我和对手在时间上赛跑。

也大概正是从这个时候开始,过得越来越简单,饭能吃饱就好,觉能睡着就好,日子能过就好。

朋友说,你这不叫简单,叫糙。

一糙就糙了三四年,糙成了习惯,突然松弛下来,反倒有点不适应,睡得早了,吃得香了,睡得稳了,日子变有趣了。

陆陆续续又发掘了自己收纳打扫的天赋,做菜的兴趣,和从来没落下的弹琴哼唱的本事。

于是,我又成了更好的自己。生活不是一条路走到黑,而是天黑前能有一个安稳的地方歇脚。