如何使用旧版本的ubuntu源

老旧版本的ubuntu源设置

在ubuntu中,通常软件源设置在/etc/apt/sources.list文件中,默认一般都从archive.ubuntu.com和security.ubuntu.com下载,通常,这不会有问题,但是如果使用的ubuntu过于老旧,可能会碰到fetch 404的问题,典型报错如:

1
2
3
4
Err http://archive.ubuntu.com hoary/restricted Packages
404 Not Found [IP:91.189.88.152 80]
Err http://archive.ubuntu.com hoary/main Sources
404 Not Found [IP:91.189.88.152 80]

这是因为太老旧的版本,官方会将维护的源移到old-release.ubuntu.com下面。所以只需要将sources.list文件中的archive.ubuntu.com和security.ubuntu.com域名都更改为old-release.ubuntu.com域名即可。至于多老旧的版本会移动到这个域名下,我暂时还不清楚。而老版本可以追溯到4.10版本(我目前测试的版本是5.04版本,顺便一提,此版本内核为2.6.10,配合《linux设备驱动 第三版》看刚刚好)

参考资料:
1 https://coderwall.com/p/3n6xka/fix-apt-on-old-unsupported-ubuntu-releases
2 https://askubuntu.com/questions/91815/how-to-install-software-or-upgrade-from-an-old-unsupported-release

jenkins problem

1 设置在远程服务器上执行的脚本,脚本中如果获取$HOME,$PATH变量,其值实际上是jenkins服务器上的值而不是远程服务器上的值,同时会导致后续的脚本内容执行在jenkins服务器上而不是设想的远程服务器上

authorized_key

authorized_key权限问题

假设现在需求为设置从pc1通过免密码到pc2的登录,则一个做法是直接将pc1的公钥内容拷贝到pc2的.ssh/authorized_keys文件中,但是会发现仍然不能生效,排查发现,生效的时候,authorized_keys文件的权限不应该超过644,而新建的文件的权限是755,所以将authorized_keys文件的权限减小,问题就得到了解决

gitlab_dockerlized

docker化安装gitlab(分离redis和postgresql服务)

步骤:
1 拉取postgresql docker镜像

1
docker pull postgresql

2 拉取redis docker镜像
1
docker pull redis

3 拉取gitlab docker镜像
1
docker pull gitlab/gitlab-ce

4 编辑postgresql启动脚本postgresql.sh,内容如下:
1
2
3
4
5
6
7
8
9
docker run \
--name gitlab-postgresql \
-d \
--env 'DB_NAME=gitlabhq_production' \
--env 'DB_USER=gitlab' \
--env 'DB_PASS=password' \
--env 'DB_EXTENSION=pg_trgm' \
--volume /srv/docker/gitlab/postgresql:/var/lib/postgresql \
postgres

给脚本添加执行权限
1
chmod +x postgresql.sh

5 编辑redis启动脚本redis.sh,内容如下:
1
2
3
4
5
docker run \
--name gitlab-redis \
-d \
--volume /srv/docker/gitlab/redis:/var/lib/redis \
redis

给脚本添加执行权限
1
chmod +x redis.sh

6 编辑gitlab启动脚本gitlab.sh,内容如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
docker run \
--name gitlab \
-d \
--link gitlab-postgresql:postgresql \
--link gitlab-redis:redisio \
--publish 10022:22 \
--publish 10080:80 \
--env 'GITLAB_PORT=10080' \
--env 'GITLAB_SSH_PORT=10022' \
--env 'GITLAB_SECRETS_DB_KEY_BASE=jMHCqz7v4HWjm9KJHfnPCWmRv9Hft4q4xvFPWcRPdvnCcmHvFsdzgcRqdXRzmmMp' \
--env 'GITLAB_SECRETS_SECRET_KEY_BASE=WpVrsCVjnm7mrhcmtHrqfKtCHWfq9k4nNKnLCszcFtkqj9X9MXzngdPrwxzfNN9J' \
--env 'GITLAB_SECRETS_OTP_KEY_BASE=c7rLr3hwdXLkKbMXwKdfddX7dkMxdCHJPzHnP4tstqJm4mdxwVLnKTvFCHcdXbFP' \
--env 'DB_HOST=172.17.0.2' \
--env 'DB_NAME=gitlabhq_production' \
--env 'DB_USER=gitlab' \
--env 'DB_PASS=password' \
--volume /srv/docker/gitlab/gitlab/config:/etc/gitlab \
--volume /srv/docker/gitlab/gitlab/logs:/var/log/gitlab \
--volume /srv/docker/gitlab/gitlab/data:/var/opt/gitlab \
gitlab/gitlab-ce

给脚本添加执行权限
1
chmod +x gitlab.sh

7 启动postgresql并进入终端
1
2
./postgresql.sh
docker run -it postgresql /bin/bash

以postgres用户连接数据库,创建gitlab服务所需要的数据库
1
2
3
4
5
6
7
su postgresql
psql
CREATE ROLE gitlab with LOGIN CREATEDB PASSWORD 'password';
CREATE DATABASE gitlabhq_production;
GRANT ALL PRIVILEGES ON DATABASE gitlabhq_production to gitlab;
\q
exit

仍然以postgresql用户连接到gitlabhq_production数据库,开启pg_trgm扩展
1
2
3
4
psql gitlabhq_production
CREATE EXTENSION pg_trgm;
\q
exit

8 启动redis服务
1
./redis.sh

9 先启动一次gitlab,然后停止掉
./gitlab.sh
(等待大约1分钟后)
通过docker ps 查看gitlab的id
然后关闭并删除
docker stop docker_id_geted_before
docker rm docker_id_geted_before
这样,应该在宿主机的/srv/docker/gitlab/gitlab/config目录下生成了gitlab.rb文件
10 编辑gitlab.rb文件,指定使用外部的postgresql和redis
1
2
3
4
5
6
7
postgresql['enable'] = false
redis['enable'] = false
gitlab_rails['db_adapter'] = 'postgresql'
gitlab_rails['db_encoding'] = 'utf8'
gitlab_rails['db_database'] = 'gitlabhq_production'
gitlab_rails['db_username'] = 'gitlab'
gitlab_rails['db_password'] = 'password'

为bash shell添加git分支名称提示

为bash shell添加git分支名称提示

在我的日常开发工作中,主要使用git flow工作流,因此,会经常涉及到分支间的切换问题,发现周围小伙伴使用的zsh可以给终端添加git分支提示,效果一级棒,但是作为一个bash shell拥护者,肯定是不会为这么一个小功能就转投zsh的怀抱啦。于是乎,我就想看看bash shell下是否也有类似的解决方案。经过调查,发现其实原理并不复杂。简单来说,就是通过某种方法获取到当前git的分支名,然后附加在bash shell的提示之后,组成新的bash shell提示文字。
简单的修改如下:
1 在~/.bashrc文件里新增一个函数,用于获取git的分支信息

1
2
3
parse_git_branch() {
git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/ (\1)/'
}

2 将获取的git分支信息附加到终端提示符之后
1
2
# PS1='\[\033[01;32m\]\u@\h\[\033[01;34m\] \w \$\[\033[00m\] ' # old bash shell prompt
PS1="\[\033[01;32m\]\u@\h\[\033[01;34m\] \w\[\033[33m\]\$(parse_git_branch)\[\033[00m\] "

从上面的新旧PS1的对比不难看出,就是在终端输出的结尾位置添加了git的分支名称,并且用合适的颜色进行了设置。

参考资料:
1 https://coderwall.com/p/fasnya/add-git-branch-name-to-bash-prompt

fcitx安装折腾

记一次fcitx安装折腾

背景:gentoo系统进行了一次大升级(大约积攒了一年多的时间没有滚动升级),升级后桌面环境为gnome-3.18.0
过程:
1 安装fcitx, emerge -avq fcitx,并且添加了gtk3的use flag (添加文件/etc/portage/package.use/fcitx文件,文件内容为app-i18n/fcitx gtk3 gtk2)
2 安装fcitx-cloudpinyin fcitx-sunpinyin, emerge -avq fcitx-cloudpinyin fcitx-sunpinyin,使得fcitx可以进行中文输入
3 此时,还不能使用fcitx,终端中输入命令fcitx,将会有如下的关键提示:

1
2
(ERROR-7032 /var/tmp/portage/app-i18n/fcitx-4.2.9.1/work/fcitx-4.2.9.1/src/frontend/xim/xim.c:240) Start XIM error. Another XIM daemon named ibus is running?
(ERROR-7032 /var/tmp/portage/app-i18n/fcitx-4.2.9.1/work/fcitx-4.2.9.1/src/lib/fcitx/instance.c:440) Exiting.

这是因为gnome默认安装ibus作为输入法管理器,所以我们需要卸载ibus输入法(gentoo系统必须卸载,禁用无效),具体过程为
1)将-i18n这个use flag添加到make.conf文件(/etc/portage/make.conf)
2)emerge –update –newuse –deep @world –ask
3)对gnome-shell包禁用nls这个use flag(执行命令:echo ‘>=gnome-shell-30.18.0 -nls’ >> /etc/portage/package.use/gnome-shell)
4)移除ibus包(执行命令 emerge -avC ibus,执行之前,建议先执行emerge -pv –depclean ibus,确保ibus没有被其他包所依赖)
4 重启系统
5 打开Fcitx Configuration,添加中文输入法(通过fcitx-config-gtk3开启配置界面,此时应该默认有中文输入法和英文输入法,去除其中的中文输入法,重新添加sunpinyin)
6 注销并重新登录,如有必要,重启系统
7 修改(或新建,如果不存在).xprofile文件,设置如下:
1
2
3
export GTK_IM_MODULE=fcitx 
export QT_IM_MODULE=fcitx
export XMODIFIERS="@im=fcitx"

注销并重新登录,如有必要,重启系统,经过以上步骤,在终端中以及vim编辑器下还不能正常切换中英文输入法,只能使用英文输入,为解决这个问题,进行如下一步操作:
1
gsettings set org.gnome.settings-daemon.plugins.xsettings overrides "{'Gtk/IMModule':<'fcitx'>}"

8 安装google-chrome, emerge -avq google-chrome,在此之前,需要先确保已经通过emerge –sync对系统源进行更新,否则可能出现无法下载google-chrome软件包,因为在gentoo源上始终只提供截止当前最新的google-chrome包,老版本的包都会被移除
9 重启系统,发现ctrl+space无法在chrome下进行中英文输入法切换,在其他软件,包括gentoo默认浏览器下,都可以正常输入中文,只不过输入中文为繁体,这可以通过ctlr+shift+f组合键切换为简体中文(在fcitx运行的情况下)
10 通过设置use并重新编译fcitx解决仅在google-chrome下不能切换中英文问题:修改/etc/portage/package.use/fcitx文件内容为app-i18n/fcitx gtk3 gtk2,然后重新编译fcitx,再重启chrome浏览器,问题得以解决

参考资料

1 https://wiki.archlinux.org/index.php/fcitx
2 https://fcitx-im.org/wiki/Note_for_GNOME_Later_than_3.6
3 https://forums.gentoo.org/viewtopic-p-7961822.html?sid=fd7b34290ea4c40f7359ab52d4cea033

ssh 免密码登录设置

linux设置免密码登录

在自动化部署工作中,为安全考虑,不会允许在脚本中使用登录密码进入服务器,这就要求要做密码免登操作。具体步骤如下:
1 生成本地机器的公司钥对
ssh-keygen -t rsa -b 2048 (指定使用rsa算法,生成的密钥长度为2048位)
2 拷贝本地机器的公钥文件内容到远端机器的authorized_keys文件
cat ~/.ssh/id_rsa.pub | ssh foo@example.com ‘cat >> .ssh/authorized_keys’

参考资料

1 http://www.howtogeek.com/168147/add-public-ssh-key-to-remote-server-in-a-single-command/

phantomjs在linux上的安装

phantomjs在linux上的安装问题

当通过npm install phantomjs时,看起来已经安装成功,但是执行测试的时候,仍然报如下错误:
“error while loading shared libraries: libfontconfig.so.1: cannot open shared object file: No such file or directory”
这是因为phantomjs对libfontconfig存在依赖,解决办法就是安装libfontconfig这个包。在ubuntu系统上,通过apt-get install libfontconfig进行安装。安装前可以通过apt-get update命令进行源更新,否则可能会碰到这样的提示:“E: Unable to locate package libfontconfig”

参考资料

1 http://stepansuvorov.com/blog/2012/10/phantomjs-error-while-loading-shared-libraries-libfontconfig-so-1/
2 https://github.com/ariya/phantomjs/issues/10904
3 https://github.com/BetterJS/doc/issues/8
4 http://askubuntu.com/questions/378558/unable-to-locate-package-while-trying-to-install-packages-by-apt

路由路径解析

url路径解析

对于一个url,例如:http://www.example.com:8888/search?keyword=test&page=1#a ,其包含的部分有:
1 协议(protocol)”http:”,可以通过window.location.protocol属性获取
2 域名:(hostname)”www.example.com”,可以通过window.location.hostname属性和window.location.host获取
3 路由:(route) “/search”,可以通过window.location.pathname属性获取
4 查询串:(query) “keyword=test&page=1”,可以通过window.location.search属性获取
5 hash:(hash) “#a”,可以通过window.location.hash属性获取

linux-extended-file-attribute

extended file attribute(扩展文件属性)

1. 概念

在linux操作系统所使用的现代文件系统中,赋予了管理员额外操纵文件和目录的能力。而这,就是扩展文件属性。
扩展文件属性的配置独立于acl。
包含在内核中,主要可用的文件系统属性有以下这些
A 当文件修改时,不修改文件的最后修改时间(atime记录)
a 文件内容不允许被覆盖写或者删除,仅允许在文件末尾新增内容
c 表明文件是被压缩过的,保存在文件中的数据自动被压缩
D 当一个目录被修改的时候,同时将修改存储到硬盘上
d 当使用dump程序进行备份拷贝时候,给定的文件将被跳过
i 使得所有的系统用户都不能对文件进行操作
j 在ext3文件系统中,强制在将文件保存到硬盘之前,先保存到值班日志
s 删除文件时,将文件占据的空间使用0进行覆盖写
S 修改文件时,立刻同步保存到硬盘
t
u 删除文件时,其磁盘上的内容不被覆写,以便文件以后进行恢复

2. 察看和设置

可以通过lsattr察看,chattr进行修改
chattr 使用+表示增加给定的属性,-表示减少给定的属性,=表示只设置给定的属性
例如:
chattr +A test.txt // 给文件test.txt添加扩展文件属性A
chattr -a test.txt // 给文件test.txt去除扩展文件属性a
chattr =s test.txt // 给文件test.txt设置扩展属性s(其他已有的扩展文件属性均被去除)

3. 参考资料:

1 https://books.google.com.hk/books?id=VpiMCwAAQBAJ&pg=PT4&lpg=PT4&dq=extended+attributes+on+filesystem+objects&source=bl&ots=airyGHyYsA&sig=e1w1UdvQVFpATXIcBmtmahcnix8&hl=en&sa=X&ved=0ahUKEwj9ste5_5PPAhWJoZQKHXk6CgcQ6AEIOjAF#v=onepage&q&f=false