golang
在Ubuntu14.04系统中非常容易安装golang,系统库中就自带所有安装包。不过网上的一些文章往往是直接取官方的源码进行编译,不知道这样做的好处是什么?跟踪最新的进展?这是不是反映golang还不够稳定,还在不断进化过程中?
如果不是很想追新的话,直接使用以下命令就可以安装了:
sudo apt-get install golang
简单查了一下,默认是安装golang的1.2.1版本。
在Ubuntu14.04系统中非常容易安装golang,系统库中就自带所有安装包。不过网上的一些文章往往是直接取官方的源码进行编译,不知道这样做的好处是什么?跟踪最新的进展?这是不是反映golang还不够稳定,还在不断进化过程中?
如果不是很想追新的话,直接使用以下命令就可以安装了:
sudo apt-get install golang
简单查了一下,默认是安装golang的1.2.1版本。
数据中心升级,要求所有节点最好是64位系统。而我们的节点不幸是32bit系统,因此不得不大动干戈地重新构造系统。
原来的系统是采用Ubuntu 10.04,年代比较久了。这次升级打算全部换成Debian7,真是no zuo no die。虽说两个系统相差不大,但是其中的一些细节还是会坑死人的。
Debian7中root用户采用bash,如果新创建一个用户,默认居然采用sh,无法理解。因此需要修改/etc/passwd文件,将用户对应的shell修改为bash即可。
这个不是大问题,无非就是修改/etc/sudoers文件,手工将用户加入sudo用户列表中即可。(升级完成后,最好将用户剔出sudoer列表,只保留root用户)。
这些配置折腾了几乎一天。在Ubuntu环境中,很容易搞定,ubuntu非常体贴的提供了一个安装包dovecot-postfix,几乎不需要配置就可以转起来。而Debian7则需要手工进行配置。首先dovecot必须安装以下几个包:
apt-get install dovecot-common dovecot-core dovecot-pop3d
在配置之前,首先要弄明白一些关键概念:
通常网上的文章都会采用SASL服务器或者连接MySQL数据库等来实现一个非常复杂的邮件服务系统。而我们的需求没有这么夸张,debian系统的用户就是email用户,不需要进行区分。因此我们采用dovecot来鉴权。
跑个题先,网上居然有文档配置postfix时不进行鉴权,简直是纯找死的节奏,这种情况下,任何人都可以利用他的服务器发送邮件,过不了多久,相信全世界的邮件服务器都会视其为垃圾邮件服务器,直接屏蔽掉。
因此配置的关键点在于以下几点:
这里臭骂一下Debian。把dovecot的配置拆成N多文件,乱七八糟,有必要么?网上的参考文档多半是基于RHEL或者CentOS,基本都是在一个文件中进行配置(Ubuntu 10.04也基本是一个文件),Debian这种方式貌似很合理,实际操作起来更让人纠结。
首先修改/etc/dovecot/conf.d/10-auth.conf文件,设定以下参数:
disable_plaintext_auth = no auth_mechanisms = plain login
接着修改/etc/dovecot/conf.d/auth-system.conf.ext文件,在文件尾添加以下配置:
service auth { unix_listener /var/spool/postfix/private/auth-dovecot { mode = 0660 user = postfix group = postfix } }
简要说明:在这个文件中,可以看到以下信息,默认就是采用系统用户鉴权。其中的passwd就是指/etc/passwd文件。
userdb { driver = passwd }
而我们添加的信息,其实就是为postfix创建一个管道,准备接受postfix的鉴权请求。管道名称就是auth-dovecot,创建在/var/spool/postfix/private目录下。这个信息在postfix配置中需要用到。
debian系统中的postfix基本配置与其他linux版本没有太大差别,无非就是修改一些hostname信息等。鉴权配置需要修改,修改/etc/postfix/main.cf文件,在文件尾添加以下信息:
home_mailbox = Maildir/ smtpd_sasl_auth_enable = yes smtpd_sasl_type = dovecot smtpd_sasl_path = private/auth-dovecot smtpd_sasl_security_options = noanonymous smtpd_recipient_restrictions = reject_unknown_sender_domain, reject_unknown_recipient_domain, reject_unauth_pipelining, permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination broken_sasl_auth_clients = yes smtpd_sasl_authenticated_header = yes smtpd_sasl_local_domain = $myhostname smtpd_sender_restrictions = reject_unknown_sender_domain
其中关键部分就是蓝色字体标识的部分。”smtpd_sasl_path”项就是在dovecot中配置的管道路径(在这些配置项上,我几乎摔得满头是包)。
完成上述配置后,重启dovecot和postfix服务即可:
service dovecot restart service postfix restart
处于安全因素的考虑,修改默认的SSH登录端口以及禁止root用户远程登录。修改/etc/ssh/sshd_config文件:
Port 1234 PermitRootLogin no
在linux环境下获取本地IP地址的方法,通常都是先getifaddrs获取当前计算机中所有的接口信息,然后循环调用getnameinfo获取各接口的IP地址。
这是网络上常见的描述方式。在IPv4组网时,没有任何问题。但是在IPv6组网(获取IPv6地址)时,出现了问题。由该函数返回的IP地址字符串中包含了当前接口的名称,例如以下返回值:
fe80::5a94:6bff:fe48:4cec%wlan1
如果想获得纯粹的IPv6地址,应当通过接口地址信息,调用inet_ntop来转换IP地址为字符串,如下处理:
char ipstr[512]={0}; sockaddr_in6* sockaddr_ipv6=reinterpret_cast<sockaddr_in6*>(ifa->ifa_addr); inet_ntop(AF_INET6,&sockaddr_ipv6->sin6_addr,ipstr,sizeof(ipstr));
此时获取的IP地址字符串信息就不再包含当前接口的名称:
fe80::5a94:6bff:fe48:4cec
IPv6地址带接口名称实际是“zone identifier (区域标识)”,在RFC6874规范中有相应的定义。
在Linux系统中,要使用ping6命令来ping IPv6的地址,并且要求带上接口索引。例如如果只是ping IPv6地址,会返回以下错误:
ping6 fe80::a00:27ff:fe37:a9d0 connect: Invalid argument
正确的使用方法如下所示:
ping6 fe80::a00:27ff:fe37:a9d0%eth0
初步用了一下最新发布的Ubuntu 14.04版本,大体上来说还是很不错。不过Unity7还是一如既往的奇葩,在与Qt程序的配合中更是如此。很不幸,我们的软件就是采用Qt,因此在Unity中有些莫名奇妙的小冲突,例如systemTray等问题,虽然不影响使用,但是给人的感觉很不爽、很不专业。
简单的处理方式就是程序自动判断当前是不是Ubuntu版本,然后再针对性地做一些处理就好了。目前还没有统一的API可以说明当前linux的发行版本信息,网上有各种各样的方式进行判断。对deb系的发行版本而言,以下方式经验证还比较靠谱:
直接读取/etc/issue文件,这个文件的内容目前包含发行版本信息。
这种方式有一些不确定之处:
(1)首先这个文件名就很奇葩。’issue’为什么是用来存储版本信息的? 为什么不直接用version或者别的更好、更直接的文件名?linux开发人员的思维总是让人搞不懂啊。
(2)既然没有人解释为什么会使用这个文件,同样也就没有人保证以后还会这么做。
Ubuntu14.04版本今天正式发布并可下载了。从阿里云镜像网站下载了相应的iso文件,并在vbox中安装运行,感觉还是很不错,很显然ubuntu一直在进步。虽然在vbox中运行还是很慢,不过印象中比12.04要快一些,基本还是可以用的。
不过这个版本有个奇怪的问题(也许以前版本也有),在vbox中的解析度非常小,大概只有800*600。需要重新安装vbox附加工具才行:
sudo apt-get install virtualbox-guest-dkms
安装完后重启即可。
最近检查了一下系统的流量等情况,发现有人尝试以root身份登陆系统,简单粗暴地尝试各种密码,实在是很没品的事。对付这种无聊人无聊事最好的办法就是安装fail2ban,让他们醒悟吧。
fail2ban的原理简而言之就是:扫描log文件,发现有告警就记录。当告警超过一定的阀值,例如失败了6次,就调用iptables,将对应的IP地址屏蔽一段时间(缺省为600秒)。因此首先要确保iptables已经安装了,否则仅仅靠fail2ban是没有任何作用的。
在Ubuntu 10.04环境安装fail2ban是件轻松愉快的事,运行以下命令即可:
sudo apt-get install fail2ban
安装后,fail2ban默认会随系统启动而启动。
由于ssh默认最大尝试数为6,我们希望改成3, 因此需要修改/etc/fail2ban/jail.conf文件。找到ssh段落简单修改即可:
[ssh] ... maxretry = 3
然后重启fail2ban使新配置生效:
sudo service fail2ban restart
可以检查/var/log/fail2ban.log文件了解各种过滤情况。
在Ubuntu中使用mercurial命令行提交修改(hg commit)时,出现上述错误提示。出问题的原因大约是当前linux用户与mercurial中的用户不一致。修改方式比较简单:
修改本地库.hg/hgrc文件,根据实际用户信息加入以下配置即可:
[ui] username=yxh <yxh@myvoipapp.com> editor=vim
上述示例中,同时指定默认的编辑器采用vim。
最近将开发环境从Kubuntu 12.04升级到13.04,整个过程基本顺利。然而在使用过程中,逐渐发现一些有问题的地方,升级实际上导致了一些问题。例如Apache出现的问题。
升级后,Apache运行php脚本时全部失败,在log中可以看到以下一些类似的信息:
SoftException in Application.cpp ...
premature end of script headers...
解决方法也比较简单,将libapache2-mod-suphp模块删除后重新安装即可,没有去深究其中的具体原因。从中也可以看出:linux各版本目前作得都比较不错了,可是还是总有一些小问题会时不时出现并困扰你,让你去折腾,这可能也就是为什么linux始终无法进入主流消费者领域的原因吧。
将Kubuntu从12.04升级到13.04后,(在终端)运行程序会出现以下告警信息:
Fontconfig warning: “/etc/fonts/conf.d/99-language-selector-zh.conf”, line 11: Having multiple values in <test> isn’t supported and may not work as expected
检查该99-language-selector-zh.conf文件,发现在第一个<test name=”family” compare=”contains” >内定义了多个<string>参数,因此仅需要将这个项拆成多个family项即可,例如下面的修改:
<test name="family" compare="contains" > <string>Song</string> </test> <test name="family" compare="contains" > <string>Sun</string> </test> <test name="family" compare="contains" > <string>Kai</string> </test> <test name="family" compare="contains" > <string>Ming</string> </test>
以下配置在kubuntu12.04版本中验证通过。假设有两个网站,分别配置在80端口以及81端口。
step1:修改/etc/apache2/ports.conf,增加以下内容:
NameVirtualHost *:81 Listen 81
step2:修改/etc/apache2/sites-available/default文件,增加以下内容:
<VirtualHost *:81> ServerAdmin webmaster@localhost DocumentRoot /home/yi/work/mss_web <Directory /> Options FollowSymLinks AllowOverride all </Directory> <Directory /home/yi/work/mss_web/> Options Indexes FollowSymLinks MultiViews AllowOverride all Order allow,deny allow from all </Directory> ScriptAlias /cgi-bin/ /home/yi/work/mss_web/cgi-bin/ <Directory "/home/yi/work/mss_web/cgi-bin"> AllowOverride None Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch Order allow,deny Allow from all </Directory> </VirtualHost>
最后,重新启动apache2即可:
sudo service apache2 restart