我的十年 Linux 之路

周末在整理电脑文件以及老的移动硬盘,发现好多东西,引起许多回忆。掐指一算应该是使用了十年的Linux,说来惭愧,在这么长的时间里,没有开发出像样的Linux软件,没有什么值得大书特书,但确实是走了不少弯路,做个总结。

2005年暑假,正好大二结束,到厦门岛内找到一份维护电子商务网站的暑假工,在学校本部跟2002级的师兄住一块,看到宿舍里师兄们热火朝天在学习Linux,他们说懂Linux好找到工作。于是从鸟江借来了红帽子7.3,研究硬盘分区,装N次双系统,折腾很久呢,经常把windows硬盘数据搞没,痛恨!在图书馆找到了一本RedHat的书,没花多久,就把常见的命令学会。然后折腾服务器LAMP,对系统参数配置了如指掌,顺带学习了网页编程语言php。常奔跑于各种论坛Linux版,水木清华BBS、一塌糊涂BBS、Linux公社搞vim,shell配置,研究gcc/g++所有编译选项,Makefile文件。我将绝大部分的时间手工安装编译各种软件,比如mplayer,apache,php,mysql等,各种依赖包缺失,版本问题,经常折腾到凌晨两三点,搞定了并引以为豪。现在回想起来,真是愚蠢至极,浪费生命。

Redhat 开始做企业版本收费,免费的个人版本是Fedora 系列。缪克华老师带领的足球机器人实验室使用的是Suse 9.2,KDE界面华丽,使用一段时间就放弃了,因为发现了斜对面计算机系ACM实验室使用Ubuntu,更胜一筹,界面更漂亮。从此在 http://wiki.ubuntu.org.cn/ http://forum.ubuntu.org.cn/ 泡wiki,论坛。心血来潮时,还看了kernel的代码,只是没有系统化的学习。大四业余时间在维护新糊涂BBS的代码。中间受到王垠鼓吹的「完全用 linux 工作」影响,基本不怎么使用windows。

毕业后在厦门网宿科技工作,本来是应聘软件工程师,上班第一天老板说运维人手不够,让我转做一段时间的运维。公司一千多台服务器都是装RHEL,运维的工作大约是做系统监控,配置服务器上线。那时运维同事学习氛围很浓,几乎人手一本《UNIX Shells by Example》,挺厚的一本书,一些同事时不时秀sed、awk奇技淫巧。做到第三个月,要转正了,跟老板说要转到软件部,老板说等会再转。我又再等一个月,还是没有希望。运维要上倒班,周末的是晚上10点上到第二天早上10点共12个小时。每每到凌晨5点天快要亮的时候,看楼下车来车往,觉得特别失落,我的能力不仅如此啊,这样下去离自己的梦想越来越来,我就是想写点代码而已。冒着很大的勇气跟师兄们说离职,骗说是去重庆找女朋友。厦门是呆不下去了,北京、上海又离家太远,广州治安乱,上学是在广州东站被骗过,有心里阴影,自然深圳是我的下一站。

在深圳找了一个月的工作,最后加入了broncho团队。broncho Linux手机平台是构建在linux 2.6 之上,采用GTK+/DirectFB作为GUI的手机平台。团队工作统一安装Fedora,那为什么没有使用ubuntu呢?主要是考虑稳定性。我的工作主要是做RIL(Radio Interface Layer),那几年工作都是使用vim,gcc,是我比较理想的工作环境。2008年10月22日,世界上第一款使用Google Android操作系统的手机HTC G1发布。Android一出来,几乎把Linux手机解决方案的厂家一棒子打死。09年4月,老板老魏根据自己的判断以及参考朋友的建议,果断宣布放弃自主研发的手机操作系统,转战Android。由于团队有很深的Linux开发功底,到12月份,就正式推出Broncho A1手机。产品出来了,要推广宣传,公司的网站、论坛落到我头上开发,php复习一下,选择 phpbb 搭建论坛,整合一下搞个订购系统。

那些年搞Android的design house,自己不搞个android market,出门都不好意思说自己公司是搞Androd的。这个事又落在我头上,于是反编译android market(现在改名为Google Play)作为参考,一个人花6个月时间搞了一个app以及后台。收尾工作还没做完,就离开了broncho团队。11年移动互联网迅速发展,基本上知名公司经理级别的,带四五个人出来创业,都能拿到投资,于是我来到了盒子支付。盒子支付最早的技术团队,是我招聘组建的,因此也脱离了一线的软件开发,转为技术管理。Linux用来做办公室越来越少,转到了mac。

总结一下,几点建议:

1. 想要学好Linux,别在windows装个虚拟机,最好当作日常办公使用。
2. 切勿去研究各种工具、命令行的奇技淫巧,少折腾各种配置,掌握二八原则。
3. Linux只是工具,应该花更多时间去掌握编程思想以及软件系统的构建。

遗憾!mytget 无法加入 homebrew

mytget 是什么?

Linux下的下载工具,大家使用比较多的是wget,curl,而他们不支持多线程下载,所以产生了mytget,开始是由南开大学的xiaosuo写的,放在sf上。第一次知道这工具,是2007年在厦门网宿科技工作时同事介绍,用得很爽的一点是在不同的机房拷贝文件很快。

我觉得一个软件要有生命力,就需要不断的更新。似乎过了几年,mytget一直没有更新过,在新版本的Linux gcc高版本编译不通过,Linux新手一般遇到也不知道从何下手,也就放弃了尝试使用这个软件的机会。所以11年我就接手过来维护,放在github上,原作者也过来参与,时不时贡献点代码。

最近几年都在mac下工作,下载软件都是brew install,那干脆把 mytget 放入 homebrew。

git clone https://github.com/iboxpay/homebrew.git
brew create https://github.com/lytsing/mytget/archive/v1.1.2.tar.gz
git checkout -b mytget
brew audit --strict mytget
brew edit mytget
cp /usr/local/Library/Formula/mytget.rb  Library/Formula/
git add Library/Formula/mytget.rb
git commit -m "add Library/Formula/mytget.rb"
git push origin mytget

文件的sha256 通过 shasum -a 256 v1.1.2.tar.gz 获得,然后迫不及待的 创建 pull request。dunn review 代码,说要先去掉注释,以及增加 test 功能。brew create 生产的 mytget.rb 头部有说明:

PLEASE REMOVE ALL GENERATED COMMENTS BEFORE SUBMITTING YOUR PULL REQUEST!

没注意看,就提交 pull request了。最后还是被拒绝,说是小众工具,fork、star的数量都不超过10人。详情:https://github.com/Homebrew/homebrew/pull/42785

由此可见,搞开源对代码质量要求非常高,多个空格,空行都不行,review的结果就是:

“Remove all the comments, please!”
“Please remove this empty line.”
“Please remove the trailing space.”

事前跑一下 brew audit –strict mytget 检查配置文件。

LDAP 使用备忘录

我们的运维工程师搭建了一个AD, windows下的,公司工作的wifi 帐号密码接入了 LDAP,很方便实用。最近一段时间,总结了上班工作时间消耗分布,发现很多人都是给我发消息,svn密码忘记了,新员工开个git/svn 帐号,烦得不得了。幸好代码及时从svn转为git,有了gitlab,管理确实方便。本周一口气把研发的几个内部系统接入LDAP:

  • gitlab
  • svn
  • redmine
  • jenkins
  • zentao

我们使用windows  AD, 登录名属性是 sAMAccountName,如果使用openLDAP,则是uid。

配置jenkins才发现,root DN不能带有空格,否则死活连不上。jenkins 使用ldap后,超级管理员的帐号老是登录不上,后面干脆在 config.xml 配置文件,将 admin改为我自己的帐号。

禅道开源版有个 LDAP插件,一年没更新也是使用不了,fork 他的代码修改,见https://github.com/iboxpay/ldap ,主要是修改 系统管理员帐号admin跳过LDAP 认证,不影响正常管理使用。

搞配置管理一定要细心、耐心,出现问题,优先从系统日志查找审断并适当Google。禅道是其他同事管理的,他自己折腾了很久搞不定,找了半天,原来是  sAMAccountName 单词写错成 sAMAcountName。手动敲字不要太自信,很容易笔误 ,要ctrl+c,ctrl+ v 才行。

Gitlab 日常维护

安装完gitlab只是第一步,后期维护还需要费力。

文件约定

VERSION 文件

每个项目要增加这个文件,里面写着版本号, 效果见 https://gitlab.com/gitlab-org/gitlab-ce 右则导航栏,方便查看当前版本号。

.gitignore

避免提交一堆垃圾文件,及时加上.gitignore文件,有在线工具生成 https://www.gitignore.io/

版本升级

参考官方提供的文档 https://gitlab.com/gitlab-org/gitlab-ce/blob/master/doc/update/upgrader.md 操作,一般不会遇到遇到很大的问题。如果本地修改一些文件,自动升级的脚本会执行git stash存档,同步完后,需要手动 git stash pop

但不会是一劳永逸,lib 目录下一些配置更新了,还需要对照版本升级说明 https://github.com/gitlabhq/gitlabhq/tree/master/doc/update 手动修改 。

以上的方式,比较适合不需要对gitlab大修改,如果定制自己的UI或页面,最好建立自己的分支:

su - git
cd /home/git/gitlab/
git checkout -b my_branch
  1. Stop gitlab service
  2. Run git fetch –all
  3. Run git branch 7-5-stable origin/7-5-stable (replace with appropriate version)
  4. Run git rebase 7-5-stable my_branch
  5. Follow the rest of instructions (db:migrate, assets:precompile, etc.)

参考: http://axilleas.me/en/blog/2014/custom-gitlab-login-page/

代码备份

已经有人写了一个脚本脚本,见 https://github.com/sund/auto-gitlab-backup 定期把备份数据拷贝到备机,避免硬盘挂掉的悲剧,更保险一点,需要每月拷贝到移动硬盘上存档。

性能优化

Nginx

根据CPU,work数跟CPU数一样。

CentOs 6.5 安装 GitLab 笔记

硬件要求: https://gitlab.com/gitlab-org/gitlab-ce/blob/master/doc/install/requirements.md
注意了,使用阿里云最便宜的主机,内存只有1G,会不够的哦,需要使用 swap交换分区,具体操作自行Google。

虽然可以按照官方文档 https://github.com/gitlabhq/gitlab-recipes/tree/master/install/centos 从头到尾 ctrl+c、ctrl+v,但有些地方需要注意的。

使用Ruby镜像

在运行

gem install bundler --no-doc

之前,参考这个 http://ruby.taobao.org/ ,使用淘宝提供的镜像,感谢阿里。否则要等半天。

nginx启动问题

[root@git gitlab-shell]# service nginx restart
Stopping nginx: [FAILED]
Starting nginx: nginx: [emerg] bind() to [::]:80 failed (98: Address already in use)
nginx: [emerg] bind() to [::]:443 failed (98: Address already in use)
nginx: [emerg] bind() to [::]:80 failed (98: Address already in use)
nginx: [emerg] bind() to [::]:443 failed (98: Address already in use)
nginx: [emerg] bind() to [::]:80 failed (98: Address already in use)
nginx: [emerg] bind() to [::]:443 failed (98: Address already in use)
nginx: [emerg] bind() to [::]:80 failed (98: Address already in use)
nginx: [emerg] bind() to [::]:443 failed (98: Address already in use)
nginx: [emerg] bind() to [::]:80 failed (98: Address already in use)
nginx: [emerg] bind() to [::]:443 failed (98: Address already in use)

编辑 /etc/nginx/conf.d/gitlab.conf,将ipv6端口注释掉,我们还没有高级的使用ipv6。
listen 0.0.0.0:80;
# listen [::]:80 default_server;

listen 0.0.0.0:443 ssl;
#listen [::]:443 ssl default_server;

nginx再启动,运行正常,打开网页报 500错误,查看 log发现:

== Seed from /home/git/gitlab/db/fixtures/production/001_admin.rb
2014-11-08T15:52:20Z 25461 TID-otwilgzbo INFO: Sidekiq client with redis options {:url=>”unix:/var/run/redis/redis.sock”, :namespace=>”resque:gitlab”}
rake aborted!

Errno::EACCES: Permission denied – connect(2) for /var/run/redis/redis.sock

简单粗暴的方式,把权限都打开了,

# chmod 777 /var/run/redis/redis.sock

不过每次都要设置,终极方案是要再补一刀。
# echo -e 'unixsocketperm 775' | sudo tee -a /etc/redis.conf

邮件发送问题

默认安装postfix,死活没有发送出去,查看日志cat /var/log/maillog,才知道要配置一下 主机,域名,编辑 /etc/postfix/main.cf,把myhostname,mydomain这两个值取消注释,填上你的值。

myhostname = git.XXX.com
#myhostname = virtual.domain.tld

# The mydomain parameter specifies the local internet domain name.
# The default is to use $myhostname minus the first component.
# $mydomain is used as a default value for many other configuration
# parameters.
#
mydomain = XXX.com

如果是阿里云主机需要打开这个:
#myorigin = $myhostname
myorigin = $mydomain

然后重启。测试邮件是否可以发出去,简单的方式是使用mail 命令行发送:

mail -s "hello world” your_email

回车,随便输入几个字,ctrl +d 结束输入。

修改logo

在 /home/git/gitlab/app/assets 这目录下,

images/brand_logo.png
images/favicon.ico
images/logo-black.png
images/logo-white.png

把这几个图片改成你自己的,再重新编译资源文件:

sudo -u git RAILS_ENV=production bundle exec rake assets:precompile

重启 gitlab。

修改默认皮肤

编译 config/gitlab.yml
# default_theme: 2 # default: 2

注释取消,记得要与上面的这一行 default_projects_limit: 10 对齐,多个空格少个空格都不行,不然启动报错,rails新手会经常犯错。当然,每个开发成员可以定制主题,Profile Settings -> Design,爱哪选哪。

其他注意

默认master分支是受保护的,developer成员没有权限提交,所以,要开发成员组自己创建分支,管理员才有权限 merge进来。

btw:) windows用户使用可能比较蛋疼,他们不太喜欢在命令行敲,需要有个学习适应的过程。

Puma 替换 Unicorn

为性能考虑,使用Puma,不过要跟jruby使用,不然会遇到多线程并发问题。参考 这篇 http://icyleaf.com/2014/01/moving-unicorn-to-puma-on-gitlab/

运行的时候,遇到:
[root@git gitlab]# service gitlab start
/etc/init.d/gitlab: line 38: PPID: readonly variable
Starting puma: /etc/init.d/gitlab: Usage: daemon [+/-nicelevel] {program}

^[[Ating sidekiq: [ OK ]

PPID跟系统的冲突了,改成 UPID即可。已经提交补丁,https://gitlab.com/lytsing/gitlab-recipes/commit/3c8d0a35f54f93caac28bac464829dba7e6dc736

Pages: 1 2 3 4 5 6 7 8 9 10 ... 19 20 21 Next