Jan 22

通常,一个大型工程总会被分拆为一些子工程。这既有利于工程开发难度的降低,也有利于使用现成的方案或者第三方方案作为子工程。git-submodule 就是完成这样一种子工程拆分与整合的工具。下面开始简单介绍一下 git-submodule 的用法。

A、带 submodule 的 git 仓库的创建
正如 git 仓库有两种创建方式一样,带 submodule 的 git 仓库的创建也有两种。

1、新建一个大型工程

$ cd /path/to/massproj
$ echo Example of Mass Project > README.md
$ git init
$ git add README.md
$ git commit -m 'Mass Project created.'

接着使用 git submodule add 为新建的工程增加一个第三方子工程,例如

$ git submodule add git@domain.com:subproj.git subproj
$ git status

可能会注意到,git 只记录了 submodule 目录,而没有记录目录下的文件。实际上,git 是按照 commit id 来比对 submodule 变动的。直接递交本次更改

$ git commit -m 'thirdpart submodule added.'

若有管理该项目的 Git 服务器,可上传该项目至服务器,例如

$ git remote add origin git@domain.com:massproj.git
$ git push origin master

2、克隆一个带 submodule 的 git 仓库

$ cd /path/to/hold/projcet/
$ git clone git@domain.com:massproj.git

不过不同于常规的 git 仓库克隆,还需要将该仓库中的子模块初始化以及更新:

$ git submodule init
$ git submoudle update

如果觉得这样克隆一个 git 仓库太麻烦,那么试试

$ git clone --rescursive git@domain.com:massproj.git

该命令行会自动完成一系列必需的动作。

B、带 submodule 的 git 仓库更新
git 仓库正常更新过程是这样的:

$ git pull

然后根据修改情况,自动解决冲突、递交变更并合并到 git 仓库。不过对于带 submodule 的 git 仓库的更新,就有两种情况了。

1、更新主 git 仓库,如前,先执行

$ git pull

就要留意 submodule 的变更,先试试

$ git status

若发现 submodule 有修改,需立即执行

$ git submodule update

更复杂一些的情况是,如果有一个 submodule 依赖另一个 submodule,那么很可能需要在 git pull 和 git submodule update 之后,再分别到每个有依赖关系的 submodule 目录中再执行一次 git submodule update。为了免去麻烦,可以执行

$ git submodule foreach "git submodule update"

来实现一次性更新所有 submodule。

2、更新某个子模块,需先进入子模块目录,然后执行普通的更新操作,例如

$ cd subproj
$ git pull

若有很多子模块需要做类似的操作,可简单执行

$ git submodule foreach "git pull"

若子模块之间还有依赖关系,可采用

$ git submodule foreach "git pull" --rescursive

来一次性更新所有模块。

不过需要注意的是,这样的更新操作都是在本地 git 仓库没有做任何修改的前提之下完成的。假如本地仓库有所改动,特别是本地仓库中的子模块有所修改,那么有可能还需要解决一系列冲突才能合并。这需要用到下面这段的知识。

C、带 submodule 的 git 仓库的修改
本地仓库的普通修改不是这里的主要内容,这里要讨论一下本地仓库中子模块的更改。比如我们拥有某个 submodule 的远程仓库操作权限,此时正好碰到该子工程被大型工程调用时需要修改代码。切回到的该子工程在本地的原先仓库位置进行相关操作当然略显麻烦,若能在该大型工程的子模块仓库中直接修改无疑更方便一些。这里就来介绍一下子模块修改的大概流程。

1、有一个重要的事实需要特别强调,在执行 git submodule update 时 git 默认并不会将 submodule 切到任何 branch。因此,submodule 的 HEAD 默认是处于游离状态的(‘detached HEAD’ state)。在子模块修改前,记得一定要将当前的 submodule 分支切换到相应分支,例如切换到 master 分支:

$ cd /path/to/massproj/subproj
$ git checkout master

然后才能对子模块做修改和提交。另外,子模块中所跟踪的远程分支可被 .gitmodules 或者 .git/config 的配置覆盖,例如

$ nano -w .gitmodules
[submodule "subproj"]
   path = subproj
   url = git@github.com:subproj.git
   branch = master

实际上,.gitmodules 的修改可通过在增加 submodule 时直接指定跟踪分支自动完成,例如

$ git submodule add git@github.com:subproj.git -b master

若有很多 submodule 需要类似分支切换操作,可使用如下命令

$ git submodule foreach "git checkout master"

实际上,高版本的 git 解决这一问题的方式更简单,例如执行

$ git submodule update --remote

来跟踪远程分支,默认是 origin/master;若子模块之间还有依赖关系,可采用

$ git submodule update --remote --rescursive

一次性跟踪所有子模块的远程分支。

2、下面开始对子模块目录做一些修改,例如修改 README.md 文件:

$ cd /path/to/massproj/subproj
$ echo this is a new line. >> README.md

再将修改递交到 git 仓库中:

$ git add README.md
$ git commit -m "new comments added."
$ git push

递交完之后,回到大型工程的顶层目录,该示例中就是

$ cd ..

再试试

$ git status

会看到子模块 subproj 还需要再做一次递交

$ git add subproj
$ git commit -m 'submodule updated'
$ git push

由于 submodule 的更新只记录 commit id,因此,子模块的修改必须按上述流程递交版本。也即先在 submodule 內做递交,之后回到顶层目录再作一次递交,不然会引起 git 仓库的版本错乱。

3、如果你不慎在修改子模块之前忘记将它切换到远程跟踪分支,且又做了提交,此时可以用 cherry-pick 命令挽救。具体做法如下:先到该子模块将 HEAD 从游离状态切换到远程跟踪分支,例如 master 分支:

$ cd subproj
$ git checkout master

这时候,git 会报 Warning 说有一个提交没有在 branch 上,记住这个提交的 change-id(假如 change-id 为 aaaa)。随后将刚刚的提交重新作用远程跟踪分支上:

$ git cherry-pick aaaa

最后只需将更新提交到远程版本库中:

$ git push

D、git 仓库中 submodule 的更名或移动
随着大型工程的进行,有可能需要变更子模块,例如移动子模块的位置,或者第三方方案本身需要更名等。由于 submodule 的更名与移动两者差别不大,这里主要介绍子模块移动目录的流程。至于更名,只略微提及。假设要将 subproj 移动到 /massproj/platform 目录之下,先新建目录并移动子模块到里面

$ cd /path/to/massproj
$ mkdir platform
$ mv subproj platform/

修改相关的配置文件,主要是 .gitmodules、.git/config、子模块目录中的 .git 以及 .git/modules 目录中几个文件与目录:

$ sed -i 's@subproj@platoform/subproj@' .gitmodules
$ sed -i 's@subproj@platoform/subproj@' platform/subproj/.git
$ mv .git/modules/subproj .git/modules/platform/subproj
$ sed -i 's@subproj@platoform/subproj@' .git/modules/platform/subproj/config

若是子模块更名,那么还请留意 .gitmodules、.git/config 以及 git/modules/<path/to/submodule>/config 中 url 设置,根据需要进行调整。最后让 git 记录所有的变更

$ git rm --cached subproj
$ git add platform/subproj .gitmodules
$ git submodule sync -- platform/subproj

若觉得上述手续太烦且网络速度还可以的话,可直接删除原先的子模块,随后指定新路径添加模块。有关这个方法,需先了解一下后一段知识,再回过头来看一下以下操作

$ cd /path/to/massproj
$ git rm --cached subproj
$ rm -rf subproj
$ rm -rf .git/modules/subproj
$ nano -w .gitmodules
...remove subproj...
$ nano -w .git/config
...remove subproj...
$ git submodule add git@github.com:subproj.git platform/subproj -b master
$ git add .gitmodules
$ git commit -m 'subproj moved to platform/.'
$ git push

E、带 submodule 的 git 仓库中 submodule 的删除
这里以 platform/subproj 子模块为例介绍一下子模块删除的大概流程。先到大型工程的顶层目录清理子模块文件:

$ cd /path/to/massproj
$ git rm --cached platform/subproj
$ rm -rf platform/subproj
$ rm -rf .git/modules/platform/subproj

接着删除 git 中记录的相关数据

$ nano -w .gitmodules
...remove platform/subproj...
$ nano -w .git/config
...remove platform/subproj...

随后将变更递交到远程仓库

$ git add .gitmodule
$ git commit -m 'platform/subproj submodule removed.'
$ git push

Sep 21
A、简单说明
CentOS 是一款基于 Red Hat Enterprise Linux 提供的可自由使用源代码的企业级 Linux 发行版本。作为服务器的工作环境,相对于其他 Linux 发行版,它的稳定性是值得信赖的。CentOS 的安装方式也非常的多样,例如用 CentOS 光盘镜像开启图形或文本界面安装程序;再如以 kickstart 进行网络安装。这里主要介绍以 chroot 方式实现 CentOS 的自举,主要利用的工具是 Red Hat 的包管理工具 rpm 以及 yum。它们分别提供了与 chroot 配合的 --root 与 --installroot 选项。这种安装方式不仅适用于双 Linux 系统的安装,也适用于利用 Linux Live CD 环境安装 Fedora/CentOS。
 
B、准备 Linux 宿主环境
想要通过自举的方式安装 CentOS,就需要提供一个 Linux 宿主环境。一般而言,这个宿主环境可以是 Red Hat 系的操作系统,也可以是非 Red Hat 系的操作系统。宿主环境可以是硬盘中安装的 Linux,也可以是 Live CD 中的 Linux。尽管如此,Linux 宿主环境还是必须提供 Red Hat 的包管理工具。如果宿主环境是 Red Hat 系,那么显然已经满足了这一要求,不过最好保证 yum 是最新的
$ sudo yum update yum
下面将给出 Gentoo、Debian 发行版中是如何安装 Red Hat 包管理器?为方便计,切换到 root 用户:
$ su -
1. 在 Gentoo 中安装 YUM 包管理器
Gentoo Portage 中提供了 rpm、yum 等 Red Hat 工具,请安装最新版本,这里以 amd64 架构为例:
# echo 'sys-apps/yum ~amd64' >> /etc/portage/package.keywords
# echo 'dev-python/sqlitecachec ~amd64' >> /etc/portage/package.keywords
# echo 'app-arch/rpm sqlite' >> /etc/portage/package.use
# emerge -avuDN sys-apps/yum app-arch/rpm dev-python/m2crypto
 
2、在 Debian 中安装 YUM 包管理器
Debian 源中也提供了 Red Hat 的包管理工具,不过要安装最新的 yum 包
# apt-get install -t experimental yum rpm python-m2crypto
 
C、准备 CentOS 的安装空间
有了宿主环境,还需要安装 CentOS 的空间。通常根据宿主环境的不同,可以是同一块硬盘中的空闲空间,也可以从其他机器上暂时拆一下一块硬盘提供的空闲空间,还可以是移动硬盘或者 U 盘,当然也不排除虚拟机空间。为了方便起见,不妨假设我们在虚拟机中操作。下面开始分区相关操作。
 
空间分区
# fdisk /dev/sda
假设分了三个区,分别是交换分区 /dev/sda1、根分区 /dev/sda2、启动分区 /dev/sda3。格式化分区
# mkswap /dev/sda1
# mke2fs -j /dev/sda2
# mke2fs -j /dev/sda3
接着挂载分区
# mkdir /mnt/centos
# mount /dev/sda2 /mnt/centos
# mkdir /mnt/centos/boot
# mount /dev/sda3 /mnt/centos/boot
# swapon /dev/sda1
 
D、将 Red Hat 包管理工具安装到 CentOS 的分区中
先建立 RPM 数据库
# mkdir -p /mnt/centos/var/lib/rpm
# rpm --root /mnt/centos --initdb
接着到 CentOS 的官方镜像网站 http://vault.centos.org 下载需要版本的 centos-release 并安装,也可到 http://rpm.pbone.nethttp://www.rpmfind.net 网找查找 centos-release 包:
# rpm -ivh --nodeps --root /mnt/centos http://vault.centos.org/6.4/os/x86_64/Packages/centos-release-6-3.el6.centos.x86_64.rpm
上述命令会将 centos-release 包提供的 CentOS 的官方源的配置文件安装到 /mnt/centos/etc/yum.repos.d 目录。
 
由于 Red Hat 系并没有提供 locale-gen 之类的命令配置系统 locale 的数量,这里采用 RPM 宏的方式来选择它们
# echo %_install_langs en:zh:zh_CN:zh_CN.UTF-8 >> /mnt/centos/etc/rpm/macros.lang
 
可以将 Red Hat 的包管理工具 YUM 安装到 /mnt/centos 了:
# yum --installroot /mnt/centos install yum --nogpgcheck
注意上述命令中的 --nogpgcheck 选项,以防出现 GPG 公匙验证错误。若直接使用官方的 CentOS 镜像进行安装比较慢,也可以替换 CentOS 的源配置,例如
# mv /mnt/centos/etc/yum.repos.d/CentOS-Base.repo /mnt/centos/etc/yum.repos.d/CentOS-Base.repo.backup 
# wget -O /mnt/centos/etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo 
# yum makecache
再试试上述的 yum 操作。
 
若不想进入下一步繁琐的 chroot 操作,实际上,最小安装也可以通过下面的方法直接实现
# wget http://vault.centos.org/6.4/os/x86_64/images/install.img
# yum install squashfs-tools
# unsquashfs -d /mnt/centos install.img
该镜像安装完成之后,chroot 的相关操作会相对简单一些。
 
E、进入预装的 CentOS 系统
复制域名解析配置文件
# cp -L /etc/resolv.conf /mnt/centos/etc/resolv.conf
挂载必要的
# mount --bind /dev /mnt/centos/dev
# mount -t proc none /mnt/centos/proc
# mount -t sysfs none /mnt/centos/sys
好了,进入 chroot 环境
# chroot /mnt/centos /bin/bash
 
1、重建 RPM 数据库
可能由于宿主环境中的 RPM 数据库的版本问题,在 chroot 环境中执行 yum 可能会报 DB 数据库错误,用下述方法重建 RPM 数据库
# rpmdb --rebuilddb -vv
 
2、重置 root 用户的密码
为了确保我们能够以 root 用户进入 CentOS 系统,需要重置密码。由于 Red Hat 系的发行版中都默认开启了 SELinux,因此,chroot 环境中是不能通过 passwd 修改 root 密码的。我们可以通过手动修改 /etc/passwd 文件并通过 shadow-utils 工具来加密密码。为了简单起见,我们重置 root 密码为空
# sed -i 's@^root:x:@root::@' /etc/passwd
接着创建 /etc/shadow 文件
# yum install shadow-utils
# pwconv
 
3、设置系统的默认时区
# cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
 
4、配置 /etc/fstab
在开始内核安装之前,务必配置好系统根分区的信息,例如
# cat > /etc/fstab  << EOF
/dev/sda1     swap          swap       defaults           0 0
/dev/sda2     /             ext3       defaults           1 1
/dev/sda3     /boot         ext3       defaults           1 2
/dev/cdrom    /mnt/cdrom    iso9660    noauto,ro          1 1
tmpfs         /dev/shm      tmpfs      defaults           0 0
devpts        /dev/pts      devpts     gid=5,mode=620     0 0
sysfs         /sys          sysfs      defaults           0 0
proc          /proc         proc       defaults           0 0
EOF
注意到里面的 /mnt/cdrom,故需新建该目录
# mkdir -p /mnt/cdrom
另外,若喜欢使用 UUID 作为分区标记,可先用
# blkid /dev/sda2
# blkid /dev/sda3
参看各个分区的 UUID,随后修改 /etc/fstab 文件。
 
5、安装 Linux 内核
该轮到内核安装了,由于 CentOS 是自举安装的,因此推荐直接安装二进制内核以解决相关的依赖性问题:
# yum install kernel
 
6、配置 CentOS 的网络
设定主机名并启用网络
# cat > /etc/sysconfig/network << EOF
NETWORKING=yes
HOSTNAME=bootstrap
EOF
本地解析主机名设定
# echo '127.0.0.1 bootstrap' >> /etc/hosts
 
根据网络情况设定 IP 地址。如果机器获得静态 IP 地址,则
# cat > /etc/sysconfig/network-scripts/ifcfg-eth0 << EOF
DEVICE=eth0
HWADDR=00:00:00:00:01
ONBOOT=yes
BOOTPROTO=static
TYPE=Ethernet
IPADDR=10.10.19.234
NETMASK=255.255.254.0
GETEWAY=10.10.18.254
EOF
假如机器以动态方式获得 IP 地址,则需先安装 DHCP 客户端
# yum install dhclient
随后配置网络
# cat > /etc/sysconfig/network-scripts/ifcfg-eth0 << EOF
DEVICE=eth0        
ONBOOT=yes
BOOTPROTO=dhcp
EOF
其他方式的网络获得方法,请自行查阅资料。
 
最后,根据实际情况配置域名解析服务器
# cat /etc/resolv.conf
nameserver 208.67.222.222
nameserver 208.67.220.220
 
7、配置 Linux 键盘布局以及终端字体(可选)
这一部分对于大多数用户来说是不需要配置的,因为通常的键盘布局都是美式的;用户的工作方式也大多集中于图形操作界面。不过,如需相关配置的话,请先查阅 /usr/share/doc/initscripts 中的说明文件。
 
配置键盘布局,通常使用的键盘都是美式的,可作如下操作
# yum install kbd
# echo KEYTABLE="/lib/kbd/keymaps/i386/qwerty/us.map.gz" >> /etc/sysconfig/keyboard
有关键盘布局的信息,可到 /lib/kdb/keymanps 目录查看。
 
终端字体的安装
# yum install terminus-fonts-console
使用term系列字体,很漂亮,偶现在用的是ter-g16f.psf.gz字体。即使生效的办法是
# setfont /lib/kbd/consolefonts/ter-g16f.psf.gz
若想永久生效,可配置
# echo SYSFONT="/lib/kbd/consolefonts/ter-g16f.psf.gz" >> /etc/sysconfig/i18n
如需更多终端字体,请到 /lib/kbd/consolefonts 目录中查看。
 
8、安装必要的系统工具
为了方便调试系统以及维护系统,常用的系统日志与日程管理工具是必需的:
# yum install rsyslog crontabs cronie cronie-anacron
 
9、安装引导程序
目前 Linux 的引导程序基本上都是 grub,不过由于 CentOS 相对陈旧,它还没有提供 grub2。
# yum install grub
接着根据分区情况配置 grub
# cat > /boot/grub/grub.conf << EOF
timeout 5
default 0

# (0) CentOS
title CentOS 6.4
root (hd0,1)
kernel /vmlinuz-2.6.32-358.18.1.el6.x86_64 root=/dev/sda2 ro
initrd /initrd-2.6.32-358.18.1.el6.x86_64.img
EOF
用下述命令将 grub 安装到
# grub-install /dev/sda
若安装失败,可尝试
# grub
> root (hd0,1)
> setup (hd0)
> quit
 
10、退出 chroot 环境并重启系统
# exit
# cd /
# umount /mnt/centos/dev
# umount /mnt/centos/proc
# umount /mnt/centos/sys
# umount /mnt/centos/boot
# umount /mnt/centos
# reboot
 
D、进入全新的 CentOS 系统
 
如果一切正常的话,电脑将进入全新的 CentOS 系统,以 root 用户无密码登录即可
login: root
 
进入系统的第一件事情就是重置 root 用户密码,先将常用的 passwd 工具装上
# yum install passwd
试着执行一下 passwd 命令,由于 SELinux 的原因,通常会出现下面的错误
# passwd
passwd: unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 is not authorized to change the password of root
为了让 passwd 正常工作,请禁用 SELinux:
# setenforce 0
如果想永久的禁用 SELinux,请执行
# cat > /etc/selinux/config << EOF
SELINUX=disabled
SELINUXTYPE=targeted
EOF
# ln -s /etc/selinux/config /etc/sysconfig/selinux
好了,试试重置 root 用户的密码吧:
# passwd
 
为方便控制用户权限,可安装 sudo 包:
# yum install sudo
接着开启 wheel 组的 root 权限
# sed -i 's|^# %wheel  ALL=(ALL:ALL) NOPASSWD: ALL|%wheel  ALL=(ALL:ALL) NOPASSWD: ALL|' /etc/sudoers
增加普通用户到 CentOS 系统并将它加入 wheel 组:
# adduser easior -a wheel
接着重置 easior 的密码
# passwd easior
好了再次重启系统
# reboot
测试普通用户的权限设置是否正常?
 
以普通用户登录
login: easior
password: 
尝试用 sudo 安装基本工具
$ sudo yum install nano man-pages openssh
一切正常的话,可以进行其他配置了。
 
E、CentOS/RHEL 软件源简介
 
CentOS 官方发行版提供了四个配置文件:CentOS-Base.repo、CentOS-Vault.repo、CentOS-debuginfo.repo、CentOS-Media.repo。后三个配置文件分别是发行版所有过往的源配置文件、官方源中相应包的 debuginfo 源配置文件、光盘镜像的源配置文件,它们默认是不开启的。因此,CentOS 官方发行版中的源是由 CentOS-Base.repo 决定的。虽然该配置文件里包含了 base、updates、extras、CentOSPlus、contrib 源,但官方源中去除了很多有版权争议的软件,导致可安装的软件数量非常有限;而且相对于 Fedora 等版本,软件版本也不是最新的。这就需要我们使用第三方软件源作为补充,简化 CentOS 用户的使用。下面稍微对 CentOS/RHEL 中的常用源做一些说明。有关 CentOS/RHEL 源的更多介绍,请看 http://wiki.centos.org/AdditionalResources/Repositories。当然,里面的内容可能有些过时。
 
CentOS/RHEL 官方源
正如前面提到的,CentOS/RHEL 官方提供了一些源,不过默认状态下只开启了少量的几个源。例如 CentOS 只开启了 CentOS-base.repo 中的 base、update、extras 这三个源,而其他源均不开启。base 与 updates 是 CentOS/RHEL 发行版中提供的基础组件软件包及其更新。extras 提供了一些额外的不破坏 CentOS/RHEL 系统兼容性且不改变基础组件的软件包。这些软件包已经由 CentOS 开发小组经过测试确保它们在 CentOS 中正常工作。这些软件可能不是由 RHEL 上游提供的。值得指出的是,extras 源中含有持续发行软件源 centos-release-cr,它含有下一个 CentOS 发行版的软件包。CentOSPlus 源是为那些更改 CentOS 基本组件的软件包而设立的。使用该源会导致 CentOS 与上游提供者的内容有异。CentOS 的开发小组已经针对该源内的每个程序作出测试,确定它们能在 CentOS 下创建及运作。contrib 源中则含有 CentOS 用户供献的组件,它们并不会与核心发行版本的组件重叠。这些组件并没有经过 CentOS 的开发者测试,也未必会紧跟 RHEL 的发行。
 
CentOS-Testing 源
该源是由 CentOS 开发者维护并为 CentOSPlus 与 extras 两个源提供软件包的。这些软件包既不一定进入 CentOS 的正式源,也不一定保证正常工作。这些软件包是专门给测试者使用并由他们反馈相关的功能与稳定性。源中这些处于开发阶段的软件随时可能移除,因此在生产环境中务必关闭该源。 CentOS-Testing 源默认不自带在 CentOS 系统中,不过仍可通过下面的方法添加
$ sudo wget http://dev.centos.org/centos/6/testing/CentOS-Testing.repo  -O /etc/yum.repos.d/CentOS-Testing.repo
$ sudo sed -i 's/^enable=0/enable=1'  /etc/yum.repos.d/CentOS-Testing.repo
 
EPEL 源
EPEL(Extra Packages for Enterprise Linux) 源是由 Fedora 社区创建维护的,为 RHEL 及衍生发行版如 CentOS、Scientific Linux 等提供高质量软件包的项目。EPEL 中含有大量的软件,对官方标准源是一个很好的补充。Fedora 的官方说明在 http://fedoraproject.org/wiki/EPEL。EPEL 源的添加方法很简单
$ sudo rpm -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
 
RPMForge 源(REPOForge 源)
RPMForge 源是由 Dag 及其它包装者合作维护的,它为 CentOS/RHEL 提供了超过 10000 多个包,其中包含了dropbox、wine、vlc、mplayer、xmms-mp3 以及其他一些非常流行的媒体工具。它本身不是 CentOS/RHEL 的一部分,但是它与这些发行版是相容的。目前,REPOForge 是 RPMForge 继任者,不过源本身并没有改名。RPMForge 源被 CentOS 社区认为是最安全也是最稳定的一个第三方软件源。RPMForge 的官方网站在 http://repoforge.org/。它的添加方法如下:
i386 架构的系统,请执行
$ sudo rpm -ivh http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.2-2.el5.rf.i386.rpm
而 x86_64 架构的系统则执行
$ sudo rpm -ivh http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.2-2.el5.rf.x86_64.rpm
接着注入 DAG 的 PGP 公匙
$ sudo rpm --import http://apt.sw.be/RPM-GPG-KEY.dag.txt
 
RPM Fusion 源
RPM Fusion 提供了很多 Fedora Project 或 Red Hat 没有提供的软件包。所有这些软件均以预编译的 RPM 包的形式提供给 Fedora 与 CentOS/RHEL。 RPM Fusion 混合了原先的 Dribble、Freshrpms 与 Livna。RPM Fusion 源中除了提供大量的多媒体工具之外,还提供了 VirtualBox 相关的工具。RPM Fusion 官网位于 http://rpmfusion.org。配置 RPM Fusion 源非常简单,请执行
$ sudo rpm -ivh http://download1.rpmfusion.org/free/el/updates/6/i386/rpmfusion-free-release-6-1.noarch.rpm 
$ sudo rpm -ivh http://download1.rpmfusion.org/nonfree/el/updates/6/i386/rpmfusion-nonfree-release-6-1.noarch.rpm
 
Adobe 源
该源提供了多种语言的 Adobe Reader 与 flash-plugin,它的详细介绍请参看 http://blogs.adobe.com/acroread/2008/02/adobe_reader_now_available_via.html。对于 i386 架构的系统,请执行
$ sudo rpm -ivh http://linuxdownload.adobe.com/linux/x86_64/adobe-release-x86_64-1.0-1.noarch.rpm
来配置 Adobe 源;而对 x86_64 架构的系统,则可执行
$ sudo rpm -ivh http://linuxdownload.adobe.com/linux/i386/adobe-release-i386-1.0-1.noarch.rpm
 
Google 源
Google 源提供了诸如 Google Chrome、Google Earth、Google Talk Plugin 等应用,具体信息参见 http://www.google.com/linuxrepositories/。尽管 Google 并没有提供源的安装方法,不过,关于 Google 源的示例却不难找到,下面便是源安装示例:
$ sudo cat > /etc/yum.repos.d/google.repo << EOF
[google-chrome]
name=Google Chrome - $basearch
baseurl=http://dl.google.com/linux/chrome/rpm/stable/$basearch/
enabled=1
gpgcheck=1
gpgkey=https://dl-ssl.google.com/linux/linux_signing_key.pub

[google-earth]
name=Google Earth - $basearch
baseurl=http://dl.google.com/linux/earth/rpm/stable/$basearch/
enabled=1
gpgcheck=1
gpgkey=https://dl-ssl.google.com/linux/linux_signing_key.pub

[google-musicmanager]
name=Google Music Manager - $basearch
baseurl=http://dl.google.com/linux/musicmanager/rpm/stable/i386
enabled=1
gpgcheck=1
gpgkey=https://dl-ssl.google.com/linux/linux_signing_key.pub

[google-talkplugin]
name=Google Talk Plugin - $basearch baseurl=http://dl.google.com/linux/talkplugin/rpm/stable/$basearch
enabled=1
gpgcheck=1
gpgkey=https://dl-ssl.google.com/linux/linux_signing_key.pub 

[google-mod-pagespeed]
name=Google Mod PageSpeed - $basearch baseurl=http://dl.google.com/linux/mod-pagespeed/rpm/stable/$basearch
enabled=1
gpgcheck=1
gpgkey=https://dl-ssl.google.com/linux/linux_signing_key.pub
EOF
 
以上各源对 CentOS/RHEL 等系统完全兼容,但各软件源之间并不能保证完全兼容没有冲突。如果需要使用以上源,最好安装 yum-plugin-priorities 插件调整各个源之间的优先级
$ sudo yum install yum-plugin-priorities
安装 yum-plugin-priorities 插件后,可以通过修改 /etc/yum.repos.d/ 中各个源的配置文件,在其中插入指令
priority=N
从而设置各个源的优先级 priority,其中 N 为1到99的正整数,数值越小优先级越高。一般官方源优先级设置为 1,最高;第三方源的优先级这只推荐为 >10。例如下面示例中将 base、updates、extras 源优先级设为了 1,而 CentOSplus、contrib 的优先级则为 2:
$ cat /etc/yum.repos.d/CentOS-Base.repo
# CentOS-Base.repo
#
# The mirror system uses the connecting IP address of the client and the
# update status of each mirror to pick mirrors that are updated to and
# geographically close to the client.  You should use this for CentOS updates
# unless you are manually picking other mirrors.
#
# If the mirrorlist= does not work for you, as a fall back you can try the 
# remarked out baseurl= line instead.
#
#

[base]
name=CentOS-$releasever - Base
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os
#baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/
gpgcheck=1
gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-CentOS-6
priority=1

#released updates 
[update]
name=CentOS-$releasever - Updates
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=updates
#baseurl=http://mirror.centos.org/centos/$releasever/updates/$basearch/
gpgcheck=1
gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-CentOS-6
priority=1

#additional packages that may be useful
[extras]
name=CentOS-$releasever - Extras
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=extras
#baseurl=http://mirror.centos.org/centos/$releasever/extras/$basearch/
gpgcheck=1
gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-CentOS-6
priority=1

#additional packages that extend functionality of existing packages
[centosplus]
name=CentOS-$releasever - Plus
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=centosplus
#baseurl=http://mirror.centos.org/centos/$releasever/centosplus/$basearch/
gpgcheck=1
enabled=0
gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-CentOS-6
priority=2

#contrib - packages by Centos Users
[contrib]
name=CentOS-$releasever - Contrib
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=contrib
#baseurl=http://mirror.centos.org/centos/$releasever/contrib/$basearch/
gpgcheck=1
enabled=0
gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-CentOS-6
priority=2
 
F、一些简单的配置
作为服务器而言,CentOS 的配置通常集中在网络服务上面,例如 LAMP、FTP、RSYNC 等。相对而言,它的桌面应用的相关配置反而显得并不重要。不过不管怎样,CentOS 的终端界面总是需要配置的,特别是中文显示、输入等等。
 
为了让中文能够正常显示,需要设定系统的 locale 以及安装一些中文字体
$ su -c 'echo Lang="zh_CN.UTF-8" >> /etc/sysconfig/i18n'
$ sudo yum install wqy-micro-fonts wqy-bitmap-fonts
即使如此,中文字符在 Linux 的终端仍显示为乱码,这涉及到 Linux 内核的问题。解决的办法是要么给 Linux 内核打 UTF-8 补丁,要么安装 Framebuffer 终端模拟器。这里采用后者,为此添加 EPEL 源
$ sudo rpm -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
$ sudo yum clean all
$ sudo yum install fbterm
接着安装中文手册页,并运行 fbterm 测试中文显示是否正常:
$ sudo yum install man-pages-zh-CN
$ fbterm
随便打开一个中文 man page 看看吧!
 
为了在终端输入中文字符,可以安装 fcitx-fbterm 或者 ibus-fbterm 来配合 fbterm 使用。这里使用 ibus-fbterm 来输入中文,不过可惜所有源中均无此包,只能自己动手了。先安装基本的工具链
$ sudo yum install @Development\ Tools
某些包的编译过程可能还需好内核功能:
$ sudo yum install kernel-devel kernel-headers
接着安装 RPM 开发工具并在用户家目录建立 RPM 开发目录
$ sudo yum install rpmdevtools
$ rpmdev-setuptree
接着到 Fedora 官方中下载 ibus-fbterm 的 RPM 源码包进行编译安装
$ wget http://dl.fedoraproject.org/pub/fedora/linux/releases/19/Everything/source/SRPMS/i/ibus-fbterm-0.9.1-16.fc19.src.rpm
$ rpm -ivh /ibus-fbterm-0.9.1-16.fc19.src.rpm
进入 ~/rpmbuild/SPECS 目录适当修改 ibus-fbterm.spec,接着便可生成 ibus-fbterm 的 rpm 包了
$ cd  ~/rpmbuild/SPECS
$ nano -w ibus-fbterm.spec
$ sudo yum install yum-utils
$ sudo yum-builddep ibus-fbterm.spec
$ rpmbuild -ba ibus-fbterm.spec
$ cd ../RPMS/x86_64
$ sudo rpm -ivh ibus-fbterm.*.rpm
为了方便用户使用,可直接查看页面上给出的 FedoraPeople 上的 DoReMi 源。 
 
再来安装 Linux 终端下的图片浏览器 fbi 与 PDF 文档阅读工具 fbgs
$ sudo yum install fbida fbida-fbgs
另外,还有截屏工具 fbgrab
$ sudo yum install fbgrab
 
文本浏览器
$ sudo yum install w3m w3m-img links2
网络聊天工具
$ sudo yum install finch irssi
 
想要获得终端的鼠标支持功能,需安装 gpm 并启动 gpm 服务
$ sudo yum install gpm
$ sudo service gpm start
$ sudo chkconfig gpm on
试试用鼠标左键选择、鼠标中键复制吧。
 
在 CentOS 中安装 VirtualBox 非常简单,只需开启 RPM Fusion 源。不过,VirtualBox 官方也提供了相应的源,这里不妨用 VirtualBox 官方的源:
$ sudo wget http://download.virtualbox.org/virtualbox/rpm/rhel/virtualbox.repo -O /etc/yum.repos.d/virtualbox.repo
接着根据需要安装相应版本的 VirtualBox
$ sudo yum install VirtualBox-4.2
接着配置 VirtualBox,下面的命令行会创建 vboxusers 用户以及用户组,同时将自动编译相关的内核模块
$ sudo service vboxdrv setup
试试以 headless 方式启动 VirtualBox 吧!
Sep 13

众所周知,除去 rawhide 之外,Fedora 的版本是不能滚动的。但是我们仍可以通过启用不同版本的源,直接由 YUM 实现跨版本升级。跨版本升级的好处是显而易见的,如同滚动升级一样,系统上常用的包,除了需要更新之外,不必像装新系统那样一次次地从头安装。这里以 Fedora 18 升级到 Fedora 20(Branched Release) 为例,说明一下大概的步骤。至于上面提到的 Branched Release 的相关信息以及它的生存周期,请参考 https://fedoraproject.org/wiki/Releases/Branched

在开始升级系统之前,先清理一下系统中的孤包、残留包以及没有合并的配置文件。为此,先安装
$ sudo yum install yum-utils
随后执行
$ sudo package-cleanup --orphans
查看孤包列表,根据需要删除孤包列表中的某些软件。注意,要小心列表中的包,因为里面的包并不一定都是没用的包。再来执行
$ sudo package-cleanup --leaves
查看残余包列表,根据需要删除其中的某些包。作为准备工作的最后一步,记得合并一下所有变更过的配置文件:
$ sudo yum install rpmconf
$ sudo rpmconf -a
根据提示查看更改细节,然后决定合并的方式。
 
现在可以开始跨版本升级 Fedora 了,为了防止系统更新过程中 X Window 不能正常工作,请切换到控制台完成以下操作(即 Alt-F1~F6)。先升级 YUM 工具:
$ sudo yum update yum --releasever=20 --disablerepo=* --enablerepo=fedora --enablerepo=updates-testing --disableplugin=presto
注意上述命令中禁用了 yum-presto 插件,以防版本差距较大的 delta 包破坏系统的更新过程。另外,此过程中还可能会出现 GPG 公匙验证错误,可用下面的方式暂时忽略它
$ sudo yum update yum --releasever=20 --disablerepo=* --enablerepo=fedora --enablerepo=updates-testing --nogpgcheck --disableplugin=presto
当然,也可以参看 https://fedoraproject.org/keys 页面中的信息,然后根据提示注入 GPG 公匙,例如 Fedora 20(Branched Release) 的公匙注入方法:
$ sudo rpm --import https://fedoraproject.org/static/246110C1.txt
包管理器 YUM 升级成功之后,可以升级系统了(这是一件相对冒险的事情,记得备份好系统):
$ sudo yum distro-sync --releasever=20 --disablerepo=* --enablerepo=fedora --enablerepo=updates-testing --nogpgcheck --disableplugin=presto
这一步将会经过漫长的时间处理包之间的依赖关系,如果一切顺利的话,便可直接更新系统版本了。倘若这一步仍有依赖性无法解决,那么有三个方法可以解决:一、根据提示暂时删除那些破坏依赖关系的包,不过对我们工作有用的那些包,最好不要用这招,以免日后忘了重新安装它;二、与升级 YUM 的方法一样,单独升级某几个破坏依赖的包,例如
$ sudo yum update python-pexec --releasever=20 --disablerepo=* --enablerepo=fedora --enablerepo=updates-testing --nogpgcheck --disableplugin=presto
三、利用 --skip-broken 暂时跳过无法解决依赖的那些包:例如
$ sudo yum distro-sync --releasever=20 --disablerepo=* --enablerepo=fedora --enablerepo=updates-testing --nogpgcheck --disableplugin=presto --skip-broken
如果开始执行上面这一行命令的话,会有大面积的包需要下载与更新,这就需要我们耐心等待。
 
长时间等待之后,Fedora 18 系统顺利更新到了 Fedora 20(Branched Release)。不过版本更新过程还没有结束,下面开始做必要的检查工作。首先,确认 Fedora 18 中的第三方源中哪些源还能正常工作:
$ sudo yum repolist
根据提示信息,手动禁用那些无法工作的源,例如
$ sudo yum-config-manager --disable livna
接着再来确认 Fedora 20(Branched Release) 的最小系统是否已经更新完成:
$ sudo yum update "Minimal Install"
重新安装 Fedora 系统的引导程序,目前 grub2 是 Fedora 20 中的引导程序,因此
$ sudo grub2-install /dev/sda
$ su -c 'grub2-mkconfig -o /boot/grub2/grub.cfg'
修复一下初始话脚本的启动次序
$ su
# cd /etc/rc.d/init.d; for f in *; do [ -x $f ] && /sbin/chkconfig $f resetpriorities; done
最后,大范围的版本升级可能造成系统配置的更改,请再次运行下述命令合并配置文件
$ sudo rpmconf -a
好了,基本上重启之前的准备工作已经完成了。重启系统吧:
$ sudo reboot

 

尽管 Fedora 20 的系统能够启动起来,不过,由于目前刚进入 Branched Release 不久,系统里面的包还不是很完整。例如,通过下述方式可查看系统中残留的 Fedora 18 的软件包:

$ sudo package-cleanup --leaves

这个列表中有一部分包来自于原先 Fedora 18 系统的第三方源。对于这些包,我们不必急着删除它们,可以等到第三方源更新到 Fedora 20 的时候再升级它们。

Sep 9
由于某些原因,前一段时间比较关注于系统的安全问题,因此接触到了著名的渗透系统 BackTrack。最初,BackTrack 是基于 Slackware 和 SLAX 的自启动运行光盘,包含了一套安全及计算机取证工具。此后,它还基于 Ubuntu 发布了新的 BackTrack 版本。不过它一直以 Live CD 的形式存在,并不能算一个完整的发行版。但是,自2013年开始,BackTrack 的开发团队决定以 Debian 为基础重建系统,并将它改名为 Kali Linux。自此,Kali Linux 作为 BackTrack 的后继,成为了一个新的 Linux 发行版。在重建过程,Kali Linux 的开发团队复查并打包所有渗透工具。同时,除了发布 x86 架构之外,他们还发布了 ARM 架构的版本。有关 Kali Linux 的介绍,可到它的官方主页 http://www.kali.org 上查看。
 
尽管 Kali Linux 是一个著名的安全测试平台,不过这里所要讨论则是:它作为 Debian 分支,是如何定制的?这里所谓的“定制”,并非官方的定制方法,而是基于 Debian 的 debootstrap 功能来实现系统的定制。至于官方的定制方法,可参看 
http://docs.kali.org/live-build/customize-the-kali-desktop-environment 上所介绍的安装镜像文件的定制方法,这里只借鉴了其中的一部分。作为一个相对完整的定制过程,这里仅侧重于介绍 Gnome 桌面相关工具的安装过程。至于 Kali Linux 做为网络服务器、渗透系统等方面精细定制,只能自己去体会了。
 
A、设定 VirtualBox 中的 Kali Linux 客户机配置
为了在 VirtualBox 安装 Kali Linux,主机中应该事先安装 VirtualBox,这里就不多作展开了。通常,VirtualBox 提供了非常友好的图形界面来完成客户机的配置安装。为了免去配图的麻烦,我们采用 VirtualBox 提供的命令行工具来完成相关客户结的配置操作。 命令行创建客户机分三步:
1、创建一个名为 Kali Dev 的客户机:
$ VBoxManage createvm --name "Kali Dev" --register
2、调整 Kali Dev 中的各项参数,其中 --ostype 可通过命令行
$ VBoxManage list ostypes
查看。调整客户机参数如下:
$ VBoxManage modifyvm "Kali Dev" --ostype Debian_64 --memory 1024 --vram 36 --audio coreaudio --audiocontroller ac97 --acpi on --boot1 dvd --nic1 nat
容易看出,客户机类型是 Debian 64 bit、内存是 1024M、显存是 36M、开启声音、电源控制、以 DVD 媒质为首选启动方式以及以 NAT 方式配置虚拟机的网络。
3、创建 Kali Dev 的硬盘文件并把它关联到客户机上:
$ VBoxManage createhd --filename "Kali Dev.vdi" --size 8192 --variant Standard
$ VBoxManage storagectl "Kali Dev" --name "SATA" --add sata --controller IntelAHCI
$ VBoxManage storageattach "Kali Dev" --storagectl "SATA" --port 0 --device 0 --type hdd --medium "Kali Dev.vdi"

这三条命令分别为客户机 Kali Dev 创建好了一个大小为 8 G的动态硬盘、将类型为 IntelAHCI 的 SATA 控制器关联到 Kali Dev 上、再将 8 G 的动态硬盘关联到了 Kali Dev 客户机。至此,客户机 Kali Dev 创建完成,可通过下述方式查看它的所有参数设定

$ VBoxManage showvminfo "Kali Dev"
 
B、准备好安装 Kali Linux 的 Linux 宿主环境
通常,我们可以为 VirtualBox 准备一份 Kali Linux 的 LiveCD。实际上,Linux 定制安装只需要有个 Linux 的宿主环境即可,不一定非要相同的 Linux 环境。这里便是以之前已经使用过的 Fedora  18 Live  CD 作为提供安装的宿主环境,也给出下载地址作为示例:
$ cd ~/Downloads
$ wget http://mirrors.163.com/fedora/releases/18/Live/x86_64/Fedora-18-x86_64-Live-Desktop.iso
现在可以将镜像关联到客户机 Kali Dev 上:
$ VBoxManage storageattach "Kali Dev" --storagectl "SATA" --port 1 --device 0 --type dvddrive --medium ~/Downloads/Fedora-18-x86_64-Live-Desktop.iso
一切就绪,可以开始启动 VirtualBox 中的 Kali Dev 客户机了:
$ VBoxManage startvm "Kali Dev"
在正常情况下,稍作等待之后就可以进入 VirtualBox 的 Kali Dev 客户机中的 Fedora 18 Live 环境了。在正式开始安装之前,先确认一下 VirtuaBox 中网络是否正常工作:
$ ping http://www.kali.org
如果 Fedora 18 Live 环境已经链接网络,那么可以到下一步了。如果没有连接上互联网的话,请确认 VirtualBox 的联网方式以及相关的网络配置是否正确。
 
C、为 VirtualBox 中 Kali Linux 硬盘的分区
由于 Fedora 18 Live 提供的 Gnome 桌面环境,而下面的安装都是在虚拟终端下进行的,因此,在 Fedora 18 Live 的程序菜单中找到 gnome-terminal 并点击,然后切换到超级用户
$ su -
现在可以开始对客户机 Kali Dev 的硬盘进行分区操作了:
# fdisk -l
# fdisk /dev/sda
如果对于分区操作不熟悉的话,可采用下述脚本:
#!/bin/bash
VMDISK="/dev/sda"
fdisk ${VMDISK} &> /dev/null  <<EOF
n
p
1

+512M
t
2
82
n
p
2


w
EOF
一定要注意该脚本中的空行数,不要随意改动。然后将它保存为 fdisk_vm.sh,接着运行它:
# chmod +x fdisk_vm.sh
# ./fdisk_vm.sh
脚本运行完成之后,便会在客户机的硬盘 /dev/sda 创建两个区:大小为 512 M 的交换分区 /dev/sda1、囊括剩余大小的根分区 /dev/sda2。 格式化分区:
# mkswap /dev/sda1
# mke2fs -j /dev/sda2
然后挂载根分区
# mkdir /mnt/kali
# mount /dev/sda2 /mnt/kali
再挂载上你其它的分区,这里只有交换分区需要挂载
# swapon /dev/sda1
 
D、准备 debootstrap
debootstrap 是一个快速完成 Debian 基本系统(stage 3)安装的工具。该工具不仅存在于 Debian 系的 APT 源中,甚至其他发行版也有它的打包版本,方便用其他发行版定制 Debian 系统。不过这里考虑特定版本的修改可能性,因此采用 Kali 官方提供的 deboostrap版本:
# cd ~/
# wget http://http.kali.org/kali/pool/main/d/debootstrap/debootstrap_1.0.48+kali1_all.deb
下载好 debootstrap 之后,可以解包安装了。不过由于我们的 Live 环境不是 Debian 系的,所以没有 dpkg 工具。不过,deb 包中的数据仍可通过 binutils 提供的工具 ar 解开:
# ar -xf debootstrap_1.0.48+kali1_all.deb && tar zxvpf data.tar.gz -C /
如果 Live 环境没有提供 ar 工具的,利用它的包管理器安装它,例如
# yum install binutils
如果不出意外的话,debootstrap 已经可以使用了。开始 debootstrap 吧
# debootstrap --arch amd64 sid /mnt/kali http://http.kali.org/kali
经过一段时间(时间长短取决于网络状况)的等待,客户机的硬盘中应该已经装好了 Kali Linux 的基本系统了。
 
E、进入预装的 Kali Linux 环境
先复制域名解析配置文件
# cp -L /etc/resolv.conf /mnt/kali/etc/resolv.conf
挂载 /proc 及 /dev 档案系统:
# mount -t proc none /mnt/kali/proc
# mount -t sysfs none /mnt/kali/sys
# mount -o bind /dev /mnt/kali/dev
然后进入我们的 Kali Linux 环境:
# chroot /mnt/kali /bin/bash
好了,我们已经在预装的 Kali Linux 环境中了。不过安装工作还没有完,还有一系列软件包需要安装。
 
1、配置你的APT源,debootstrap 会创建一个非常基本的 /etc/apt/sources.list 文件用于安装额外的软件包。可以添加 Kali Linux 的官方源(对应于 Debian 的 stable 版):
# cat << EOF > /etc/apt/sources.list
## Kali Official Repositories
deb http://http.kali.org/kali kali main non-free contrib
deb-src http://http.kali.org/kali kali main non-free contrib
## Kali proposed updates
deb http://http.kali.org/kali kali-proposed-updates main non-free contrib
deb-src http://http.kali.org/kali kali-proposed-updates main non-free contrib
## Security updates
deb http://security.kali.org/kali-security kali/updates main contrib non-free
deb-src http://security.kali.org/kali-security kali/updates main contrib non-free
EOF
如果用户希望体验最新的软件,可选择 Kail 的开发版本(对应于 Debian 的 unstable 版):
# cat << EOF > /etc/apt/sources.list
## Kali Official Repositories
deb http://http.kali.org/kali kali-dev main non-free contrib
deb-src http://http.kali.org/kali kali-dev main non-free contrib
EOF
若想再激进一点,可以试试 Kali 的 Bleeding-edge 版本(对应于 Debian 的 experimental 版)
# cat << EOF > /etc/apt/sources.list
## Kali Official Repositories
deb http://http.kali.org/kali kali-bleeding-edge main non-free contrib
deb-src http://http.kali.org/kali kali-bleeding-edge main non-free contrib
EOF
稳妥一点的话,可以试试 Kali 的测试版(对应于 Debian 的 testing 版)
# cat << EOF > /etc/apt/sources.list
## Kali Official Repositories
deb http://http.kali.org/kali kali-rolling main non-free contrib
deb-src http://http.kali.org/kali kali-rolling main non-free contrib
## Security updates
deb http://security.kali.org/kali-security kali-rolling/updates main contrib non-free
deb-src http://security.kali.org/kali-security kali-rolling/updates main contrib non-free
EOF
另外要指出的是,若想让 Kali 的定制过程加快,不妨尝试加入 Debian 源(后果自负):
# echo "## Debian Offical Mirrors
deb http://mirrors.163.com/debian sid main non-free contrib
deb-src http://mirrors.163.com/debian sid main non-free contrib"
>> /etc/apt/sources.list
默认 apt-get 安装、升级包是不会列出包的版本信息,这对我们来说不一定方便。因此做下述设置:
# cat > /etc/apt/apt.conf.d/01apt << EOF
APT::Default-Release "sid"; 
APT::Get::Show-Upgraded "true"; 
APT::Get::Purge "true"; 
APT::Get::Show-Versions "true"; 
APT::Cache::NamesOnly "true";
EOF
更新一下 APT 软件列表:
# apt-get update
 
如果你觉得 Kali Linux 或者 Debian 的镜像有点慢,你可以尝试镜像选择工具 netselect-apt
# apt-get install netselect-apt
# netselect-apt
 
如果你在更新列表的时候出现了
W: GPG error: http://http.kali.org lucid Release: The following signatures were invalid: BADSIG 54422A4B98AB5139 Oracle Corporation (VirtualBox archive signing key)
的错误,请尝试
# apt-key del 16126D3A3E5C1192
# apt-get update
# apt-key adv --recv-keys --keyserver keyserver.ubuntu.com 16126D3A3E5C1192
或者尝试
# apt-get clean            # Remove cached packages
# cd /var/lib/apt
# mv lists lists.old       # Backup mirror info
# mkdir -p lists/partial   # Recreate directory structure
# apt-get clean
# apt-get update           # Fetch mirror info
 
2、设置时区
# apt-get install tzdata
安装完之后,debconf 会自动以 ncurses 界面的形式提示用户选择时区,这里选择 Asia/Shanghai。以后需要调整时区的话,可执行
# dpkg-reconfigure tzdata
实际上,也可以像其他发行版一样手动操作。首先在 /etc/timezone 里面写上中国的时区
# nano -w /etc/timezone
Asia/Shanghai
接着把原先的 /etc/localtime 删除,并复制合适的时区文件
# rm /etc/localtime
# cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
有可能还需要修改 /etc/default/rcS 文件:
# nano -w /etc/default/rcS 
把 UTC=yes 改为
UTC=no
使 Linux 默认BIOS 时间为本地时间 
 
3、安装配置系统的 locales
安装 locales:
# apt-get install locales
安装完之后,debconf 会自动提示用户选择要生成的 locale,这里选择了 en_US.UTF-8、zh_CN.UTF-8、zh_CN.GB18030、zh_CN.GB2312、zh_CN.GBK。如果想以后修改这个设置,可以运行下述命令
# dpkg-reconfigure locales
再或者可以手动调整 locales。先在 /etc/locale.gen 中选择需要生成的 locale,例如
# nano -w /etc/locale.gen
en_US.UTF-8 UTF-8
zh_CN.UTF-8 UTF-8
zh_CN.GB18030 GB18030
zh_CN.GB2312 GB2312
zh_CN.GBK GBK
然后执行下述命令生成
# locale-gen
 
4、配置您的键盘布局(如果需要):
# apt-get install keyboard-configuration

debconf 会自动提示用户设置键盘布局。如果以后想修改的话,可执行下述命令

# dpkg-reconfigure keyboard-configuration
 
5、安装内核
5.1、不喜欢编译内核或不懂如何编译内核的人可以先用
# apt-cache search linux-image
看看,然后直接安装最新的内核
# apt-get install linux-image-3.7-trunk-amd64
 
5.2、如果想要编译内核,想简单一点,可以选用 Kali Linux 或者 Debian 提供的内核源码
# apt-cache search linux-source
# apt-get install linux-source-3.7
或者
# apt-get source linux-3.7
# tar jxf linux-source-3.7.tar.bz2 -C /usr/src/
我一般喜欢自己编译内核,不需要整一大堆驱动模块放机器里。不过要注意的是如果自己编译内核的话就要记得安装一个devfsd和module-init-tools,另外你解压内核源码之后最好在/usr/src里创建一个内核源码目录到 /usr/src/linux的符号连接。
 
6、配置网络
如果电脑通过有线网卡获得的是静态 IP 地址,那么可根据下面的例子修改:
# nano -w /etc/network/interfaces
auto lo
iface lo inet loopback

auto eth0
iface eth0 inet static
address 192.168.159.62
network 192.168.0.0
netmask 255.255.255.0
broadcast 192.168.0.255
gateway 192.168.159.1
如果我们使用的是有线网卡自动获得 IP 地址,则
# nano -w /etc/network/interfaces
auto lo
iface lo inet loopback

auto eth0
iface eth0 inet dhcp
 
当然,还有可能的情况是上网的设备不是有线网卡。例如,电脑通过无线网卡获得的是静态 IP 地址,那么可根据下面的例子修改:
# nano -w /etc/network/interfaces
auto lo
iface lo inet loopback

auto wlan0
iface wlan0 inet static
address 192.168.159.62
network 192.168.0.0
netmask 255.255.255.0
broadcast 192.168.0.255
gateway 192.168.159.1
wpa-essid yourssid
wpa-psk yourpassword
其中 youssid 与 yourpassword 分别是无线网络标识与密码。若用无线网卡自动获得 IP 地址,则
# nano -w /etc/network/interfaces
auto lo
iface lo inet loopback

auto wlan0
iface wlan0 inet dhcp
除此而外,还需要安装相关的无线网卡驱动包与无线网络拨号工具。这里假设无线网卡驱动已经有Linux 内核提供了,只剩下安装无线网络工具
# apt-get install iw wpasupplicant wireless-tools

根据需要调整域名解析服务配置,这里只给出一个例子:
# nano -w /etc/resolv.conf
## A simple example /etc/resolv.conf:
nameserver 10.1.1.36
nameserver 192.168.9.100
 
接着再来配置主机名:
# echo "KALI" > /etc/hostname
本地主机名解析:
# echo "127.0.0.1 KALI" >> /etc/hosts
 
重启动网络服务
# invoke-rc.d networking restart
 
7、用户权限管理
修改 root 密码
# passwd
 
实现普通用户 sudo 功能
# apt-get install sudo
# nano -w /etc/sudoers
修改下面这一行(去掉前面的注释符号)
%sudo  ALL=(ALL:ALL) NOPASSWD: ALL
即可。注意前面这个%不可去掉,它表示组成员。
 
新建一个普通用户并将用户加入 sudo 管理员组,同时修改用户密码:
# adduser easior -a sudo
# passwd easior
 
8、把你的 fstab 内容加上吧,这部分内容你自己得会哦,举个例子吧:
# cat /etc/fstab
/dev/sda1   none    swap        sw                0 0
/dev/sda2   /       ext4        noatime           0 1
/dev/cdrom  /mnt/cdrom iso9660  noauto,ro 0 0
proc        /proc   proc        defaults          0 0
 
9、安装引导程序
一般引导程序选择 Grub,目前 Grub 已经升级成为 Grub2:
# apt-get install grub2
# grub2-install /dev/hda
# update-grub
 
10、退出 chroot 环境并重启机器:
# exit
# umount /mnt/kali/dev
# umount /mnt/kali/sys
# umount /mnt/kali/proc
# umount /mnt/kali
# swapoff
# reboot
记得从光驱中取走 Live CD,否则又要进入 Live CD 环境了。例如
$ VBoxManage storageattach "Kali Dev" --storagectl "SATA" --port 1 --device 0 --type dvddrive --medium none
$ VBoxManage closemedium dvd ~/Downloads/Fedora-18-x86_64-Live-Desktop.iso
 
F、在新装的 Kali Linux 中安装 Gnome 桌面环境
 
好了,重启系统后进入新安装的 Kali Linux/Debian 系统,不过目前只是命令行模式。先以普通用户 easior 登录系统:
login: easior
password: 
这样也方便测试 sudo 设置是否有效。
 
在安装 Linux 桌面之前,需要安装 X Window的核心:
$ sudo apt-get install xserver-xorg
如果需要精简 X-server 的话,可先运行 lspci 查看硬件配置
$ sudo apt-get install pciutils
$ lspci
然后根据自己的硬件情况安装,例如:
$ sudo apt-get install xserver-xorg-core xserver-xorg-video-intel xserver-xorg-input-evdev xserver-xorg-input-synpatic
精简的后果需要自己负责,可能造成 X Windows 的某个功能失效。
 
好了,可以安装 Kali Linux 定制的 GNOME 桌面,注意这里是定制的桌面。因此,Gnome 的部分安装的是 gnome-core,而不是安装整个 GNOME 环境:
$ sudo apt-get install gnome-core kali-defaults kali-root-login desktop-base
接着安装 GNOME 的启动管理工具
$ sudo apt-get install gdm3
根据自己需要选择Gnome的主题与icon主题:
$ sudo apt-get install gnome-icon-theme gnome-themes-standard
Kali Linux 默认的 Gnome 桌面环境是 Gnome 3,但默认运行在 fallback 模式。若想临时切换成 Gnome 3 的标准模式,请在终端输入:
$ gnome-shell --replace
gnome 3的标准模式支持一些桌面特效开启、还有很多gnome-shell插件。如果您觉得比较好用,请输入下面的命令使系统在启动时,自动进入gnome-shell的标准模式。
$ gsettings set org.gnome.desktop.session session-name gnome
若想还原默认的桌面请输入:
$ gsettings set org.gnome.desktop.session session-name gnome-fallback
注销或者重启之后进入桌面即可直接进入您要切换的模式。
 
安装文件管理器以及nautilus-open-terminal:
$ sudo apt-get install nautilus nautilus-open-terminal
 
声卡安装
$ sudo apt-get install alsa-utils gnome-media
 
网络配置工具
$ sudo apt-get install network-manager network-manager-gnome

需要注意,Linux 系统中有两套网络服务管理工具:由 ifupdown 提供的/etc/init.d/networking 以及由 network-manager 提供的 /etc/init.d/network-manager。前者常用于没有桌面环境的系统,后者应用于桌面环境,两套网络服务不能同时运行,但可以共存。前面已经由 /etc/init.d/networking 包接管了网络,若现在想换用 network-manager,请先停用它:

$ sudo invoke-rc.d networking stop
$ sudo update-rc.d networking disable

接着开启 /etc/init.d/network-manager:

$ sudo invoke-rc.d network-manager start

若想完全由 network-manager 接管网络服务,作如下配置

$ sudo nano -w /etc/NetworkManager/NetworkManager.conf
[ifupdwon]
manager=true

其中 manager 由原先的 false 改成了 true。并重启 /etc/init.d/network-manager 服务:

$ sudo invoke-rc.d network-manager restart

若觉得 ifupdown 包没有必要存在,可删除它

$ sudo apt-get remove ifupdown
 
Netspeed 可以显示当前网络上传下载速度的 GNOME applet:
$ sudo apt-get install netspeed
Alt+鼠标右键选择 Add to Panel。
 
Gnome 压缩文件管理工具:
$ sudo apt-get install file-roller
 
卸载Gnash,它是自由的 Flash 播放器
$ sudo apt-get remove --purge gnash
汉化浏iceweasel浏览器(Firefox)
$ sudo apt-get install iceweasel iceweasel-l10n-zh-cn
安装Flash插件:
$ sudo apt-get install flashplugin-nonfree
$ sudo update-flashplugin-nonfree --install
 
邮件阅读工具:
$ sudo apt-get install evolution
 
Deb包图形安装工具:
$ sudo apt-get install gdebi
Debian包管理图形工具
$ sudo apt-get install synaptic
安装Ubuntu软件中心Software Center:
$ sudo apt-get install software-center
跨Linux平台包管理工具
$ sudo apt-get install packagekit gnome-packagekit
 
如果使用的是笔记本,还可能需要安装这些软件
$ sudo apt-get install acpi acpid hibernate cpufreqd hotkeys
 
热拔插工具
$ sudo apt-get install hotplug usbutils discover
 
硬盘加速
$ sudo apt-get install hdparm 
 
服务管理工具
$ sudo apt-get install rcconf
 
prelink加速程序启动
$ sudo apt-get install prelink
当你安装完生启到新系统时用这个命令来运行
$ sudo prelink -am
 
好了,可以再次重启系统了
$ sudo reboot
让我们看看 Gnome 桌面环境能否正常工作?
 
G、桌面的进一步定制
 
如果一切顺利的,Kali Linux 重启之后便会出现 GDM 的图形登录界面,输入帐号、密码之后就能进入 Gnome 环境。不过,我们看到的 Gnome 环境可能是全英文的,无法输入中文,甚至可能出现中文字符无法显示。即使能显示的话,中文字体也不一定让我们满意。这就需要我们进一步定制 Gnome 环境。
 
Gnome3 的配置工具:
$ sudo apt-get install gnome-tweak-tool
 
安装中文字体:
$ sudo apt-get install tff-wqy-microhei tff-wqy-zenhei fonts-liberations ttf-mscorefonts-installer
安装额外字体
(1)、首先拷贝字体到用户家目录下,比如自行建立 ~/.fonts/truetype/ 目录:
$ mkdir -p ~/.fonts/truetype
当然,也可以考虑给其他用户使用,此时可以建立如下目录
$ sudo mkdir -p /usr/local/share/fonts/truetype
这里不建议用户随意修改 /usr/share/fonts 目录。接着就是复制一些字体到这些目录,可以考虑从授权的 MS Windows 或者 Apple Mac OS X 系统下找到需要的字体,比如复制中易六套字体,它们分别是 simhei.ttf、simyou.ttf、simkai.ttf、simfang.ttf、simli.ttf、simsun.ttc:
$ cp sim*.tt* ~/.fonts/truetype/
(2)、生成你字体的fonts.dir+fonts.scale文件
$ sudo apt-get install xfonts-utils
$ cd ~/.fonts/truetype/
$ mkfontscale
$ mkfontsdir
(3)、把字体路径加到 Xorg-server 的配置文件中,比如在 /etc/X11/Xorg.conf.d 新建一个文件:
$ sudo nano -w /etc/X11/Xorg.conf.d/10-fonts.conf
FontPath "/usr/share/fonts/truetype/"
FontPath "~/.fonts/truetype/"
其中 /usr/share/fonts/truetype/ 是系统安装的字体。可以根据字体安装的实际情况修改上述配置。
(4)、最后执行下述命令更新 xft 的字体缓存:
$ fc-cache -v -f
 
安装完成之后,打开网页
把你喜欢的字体优先级调到最高,然后点击”生成“保存成.fonts.conf文件放入用户名家目录下。最好 root 目录下也拷贝一份,因为有些程序是以 root 账户来运行的。
 
关于 Deiban 字体显示优化,可以看看这里:
如果通过以上设置的字体显示效果还无法满足你的需求,你可以折腾 Debian 的字体渲染 Infinality 补丁。
 
设置系统的 locale 为中文
$ su 
# cat << EOF > /etc/default/locale
LC_ALL="zh_CN.UTF-8"
LANG="zh_CN.UTF-8"
EOF
$ su easior
实际上,我们也可以在 ~/.xprofile 或者 ~/.bashrc 等用户级配置文件。例如在 ~/.xprofile 文件也加入
export LANG=zh_CN.GB18030
export G_FILENAME_ENCODING=@GB18030
export LC_ALL=zh_CN.GB18030
export G_BROKEN_FILENAMES=1
用户级的 locale 就被设置成了 zh_CN.GB18030。
 
安装中文手册
$ sudo apt-get install manpages-zh
 
安装编码转化工具(文件名编码 convmv、文件内容编码iconv、mp3标签easytag):
$ sudo apt-get install convmv iconv easytag
 
安装中文输入法
$ sudo apt-get install ibus ibus-rime
配置中文输入法
$ ibus-setup
 
由于我们是在虚拟机中安装 Kali Linux,因此还需要安装 VirtualBox-guest-additions。目前,该包是通过内核的 dkms 模块实现自动化模块编译,故而,安装它之前需要确认当前内核的头文件已被安装,也即
$ sudo apt-get install linux-headers-`uname -r` virtualbox-guest-dkms virtualbox-guest-x11
它可以实现 Virtualbox 与 X 之间的无缝切换、剪切板共享、文件的拖曳、文件夹的共享等功能。实际上,文件(夹)的拖曳、剪切板的共享的启用方法是在 VirtualBox 主机中执行:
$ VBoxManage modifyvm "Kali Dev" --clipboard bidirectional --draganddrop bidirectional
设置成功之后,可以试试在 VirtualBox 客户机与主机之间相互复制文件或者拖曳文件能否成功?不过对于移动非常大的文件,剪切板的功能可能不一定能够胜任,这就需要启用文件夹共享功能。具体来说,先要在 VirtualBox 中配置主机的共享文件夹路径,例如指定 ~/Downloads:
$ VBoxManage sharedfolder add "Kali Dev" --name "vbmeida" --hostpath "~/Downloads/"
这条命令将 VirtualBox 主机的文件夹 ~/Downloads 关联到客户机 Kali Dev 的 vbmedia 挂载点上。接着到 VirtualBox 的客户机中查看内核模块 vboxsf 是否加载:
$ lsmod | grep vboxsf
$ sudo modprobe vboxsf
如果想让该模块随机器启动自动加载,可做如下设置
$ su -c 'echo vboxsf >> /etc/modules'
接着再将用户 easior 加入到 vboxsf 组中:
$ sudo gpasswd -a easior vboxsf
现在可以尝试在客户机 Kali Dev 中设置共享文件夹的挂载点,并尝试挂载:
$ sudo mkdir /mnt/share/
$ sudo mount -t vboxsf vbmedia /mnt/share/
$ ls /mnt/share
如果觉得每次要手动挂载共享文件夹麻花的话,也可以在 /etc/fstab 中作如下设置
$ su -c "echo 'vbmedia /mnt/share default 0 0' >> /etc/fstab"
重启系统之后,便会自动挂载共享文件夹。
 
H、更多的桌面应用程序的安装
 
C/C++编译工具
$ sudo apt-get install build-essential gcc-4.8-multilib gcc-4.8-locales gcc-4.8-doc gdb automake libtool

安装更多的手册页 例如 C API 手册页、posix 函数以及开发文档的手册页、C API 手册页、标准类库手册页、C++ API 手册页:

$ sudo apt-get install manpages-dev manpages-posix manpages-posix-dev glibc-doc stl-manual libstdc++6-4.3-doc

C/C++ 的集成开发环境 Linux 下也有很多集成开发环境可以选择,例如 Code::Blocks、CodeLite、Eclipse+cdt 等,这里选择安装 Code::Blocks,最好连带安装上它插件需要的工具 valgrind、asytle、doxygen、cppcheck、cccc、cscope 等:

$ sudo apt-get install codeblocks valgrind asytle cppcheck cccc cscope doxygen

Java 运行环境或者开发工具

$ sudo apt-get default-jre

或者

$ sudo apt-get default-jdk

通常,默认安装是由 OpenJRE 或者 OpenJDK 提供的 Java。接着可以安装浏览器的 Java 插件了

$ sudo apt-get install icedtea-7-plugin

Java 集成开发环境

$ sudo apt-get install eclipse 
 
Python类工具需要:
$ sudo apt-get install python-dev python-vte python-appindicator

Python 的集成开发环境也有很多选择,例如 pycharm、Eclipse+pydev。通常选择前者,不过需要首先确认 Java 开发环境已经安装,然后便可以开始下载并安装它了

$ wget http://download-cf.jetbrains.com/python/pycharm-community-4.5.1.tar.gz
$ sudo tar zxvf pycharm-community-4.5.1.tar.gz -C /usr/local/
$ sudo sh -c 'cat > /etc/profile.d/pycharm-4.5.1.sh << EOF
/usr/local/pycharm/bin/
EOF'

第一次运行 PyCharm,需先执行

$ pycharm.sh

以后执行非常简单。

图形界面开发工具
若想使用 GTK+ 作为界面开发工具
$ sudo apt-get install libgtk2.0-dev libgtk-3.0-dev devhelp libgtk2.0-doc

若想使用 wxWidgets 作界面开发库,则

$ sudo apt-get install wx3.0-doc libwxgtk3.0-dev python-wxgtk3.0-dev

版本控制工具:

$ sudo apte-get install git gitg bzr subversion
 
安装常用的压缩解压工具
$ sudo apt-get install bzip2 zip unzip gzip p7zip unrar arj 
 
密匙、口令、密码缓存管理工具:
$ sudo apt-get install gnome-keyring seahorse pinentry-gtk2 keychain
 
跨平台密码(口令)管理工具:
$ sudo apt-get install keepassX
 
网络下载工具
$ sudo apt-get install amule transmission transmission-cli ftp gftp wget gwget
为了将 gwget 与 firefox 关联,请安装 firefox 的 flasgot 插件。
 
远程登录与远程桌面工具
$ sudo apt-get install openssh-client xtightvncviewer rdesktop
如果用户没有公网 IP 或者独立域名的话,可安装远程协同工具 teamviewer:
$ wget http://download.teamviewer.com/download/teamviewer_linux_x64.deb
$ sudo dpkg -i teamviewer_linux_x64.deb
 
网络上重要开源交流工具(IRC客户端Xchat、新闻组客户端Pan、RSS客户端liferea)
$ sudo apt-get install xchat pan liferea
当然,也可以安装商业交流工具 skype。不过,它只有 32 bit 的版本,因此,在 Kali 64 bit 中安装还需要做一些简单的处理。由于现在 Debian 已经开始采用多 CPU 架构的方式,参看 http://wiki.debian.org/Multiarch/HOWTO。因此,这里需要增加 i386 架构:
$ sudo dpkg --add-architecture i386
$ sudo apt-get update
接着便可到 skype 官方网站下载、安装它了:
$ wget http://skype.tom.com/download/linux/skype-debian_4.2.0.11-1_i386.deb
$ sudo dpkg -i skype-debian_4.2.0.11-1_i386.deb
如果安装过程出现问题,可尝试下述方式:
$ sudo apt-get upgrade
$ sudo apt-get install -f skype-debian
希望会有好运气。
 
BBS 论坛浏览工具
$ sudo apt-get install pcmanx-gtk2 qterm
 
文本编辑工具
$ sudo apt-get install nano emacs gedit
 
网页编辑工具
$ sudo apt-get install bluefish
 
PDF 查看工具
$ sudo apt-get install evince
如果想要安装 Adobe Read,请安装 http://www.deb-multimedia.org 提供的非官方 Debian 源:
$ su -c "echo 'deb http://www.deb-multimedia.org/ sid main non-free
        deb-src http://www.deb-multimedia.org/ sid main non-free' >> /etc/apt/sources.list"
$ sudo apt-get update
若碰到下述错误
W: GPG error: http://www.deb-multimedia.org sid InRelease: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 07DC563D1F41B907
请导入该服务器的 GPG 公匙:
$ sudo apt-key adv --keyserver pgp.mit.edu --recv-keys 07DC563D1F41B907
更新软件列表
$ sudo apt-get update
接着可以安装 Adobe Read 了:
$ sudo apt-get install acroread-chfonts acroread acroread-plugins
 
MS Word 文档编辑工具 WPS4Linux 的安装,它的官方主页位于 http://linux.wps.cn,现在开始下载
$ wget http://wdl.cache.ijinshan.com/wps/download/Linux/unstable/wps-office_8.1.0.3724~b1p2_i386.deb
不过需要注意,目前的 WPS4Linux 只有 32 bit 版本,因此,在 Kali 64 bit 中安装仍需像前面一样做一些简单的处理:
$ sudo dpkg --add-architecture i386
$ sudo apt-get update
如果前面已经处理过了,这里就不必重做一遍。好了,尝试安装下载好的 WPS4Linux 吧:
$ sudo dpkg -i wps-office_8.1.0.3724~b1p2_i386.deb
可能安装过程仍有其他依赖问题,自行摸索吧。
 
词典工具
$ sudo apt-get install stardict-langdao-ec-gb stardict-oxford-gb stardict-xdict-ec-gb stardict-xdict-ce-gb stardict-langdao-ce-gb sdcv
 
图片及处理工具
$ sudo apt-get install gimp imagemagick eog
 
CHM查看工具
$ sudo apt-get install xchm chmsee
 
影音播放工具
$ sudo apt-get install audacious mplayer smplayer gnome-mplayer 
视频编辑工具
$ sudo apt-get install avidemux cinelerra  lives pitivi winff ffmpeg
音频编辑工具
$ sudo apt-get install audacity mhwaveedit mencoder
光盘刻录工具
$ sudo apt-get install brasero
 
磁盘分区工具
$ sudo apt-get install gparted

安装 plymouth

Debian 默认的启动画面确实很酷,但是一行一行的文字滚动确实很丑陋,为了不给人留下 Dos 命令行的错觉,还是装一个splash,让开机变得漂亮一点。有两种 splash 的选择,一个是 splashy,一个是 plymouth。不过 splashy 似乎有些过时,对 KMS 支持的不好。于是安装 plymouth。

$ sudo apt-get install plymouth plymouth-themes-all

安装以后,需要进行配置。修改 /etc/initramfs-tools/modules 添加以下三行

$ sudo nano -w /etc/initramfs-tools/module
intel_agp
drm
i915 modeset=1

如果使用的是 nvidia 或者 ATI 的显卡,设置会有所不同,具体参考 /usr/share/doc/plymouth 下的文档。接着修改grub 的配置文件

$ sudo nano -w /etc/default/grub
#GRUB_GFXMODE=""
GRUB_CMDLINE_LINUX_DEFAULT="quiet"

修改为

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
GRUB_GFXMODE=1024x768

运行

$ sudo update-grub2

使上面的修改生效。请喝杯茶继续,革命还未成功。先列出已安装的所有主题

$ sudo plymouth-set-default-theme --list

设定主题

$ sudo plymouth-set-default-theme solar

重新生成 initramfs

$ sudo update-initramfs -u -k all

安装 Dropbox,首先添加 Debian 源

$ su -c "echo 'deb https://linux.dropbox.com/debian sid main
           deb-src https://linux.dropbox.com/debian sid main' >> /etc/apt/source.list"
由于dropbox采用了https协议,所以我们需要安装下面的软件:
$ sudo apt-get install apt-transport-https
接着注入 GPG 公匙:
$ wget https://linux.dropbox.com/fedora/rpm-public-key.asc
$ sudo apt-key add rpm-public-key.asc
$ rm rpm-public-key.asc
更新软件列表
$ sudo apt-get update
开始安装吧:
$ sudo apt-get install dropbox
有可能有依赖问题,需要自行安装python-gpgme:
$ sudo  apt-get install python-gpgme
 
若想安装 Google 提供的一些软件,例如 Google Chrome、Google Earth、Google Talk Plugin 等,请先添加 Google 源
$ su -c " echo 'deb http://dl.google.com/linux/chrome/deb/ stable main
                deb http://dl.google.com/linux/earth/deb/ stable main
                deb http://dl.google.com/linux/musicmanager/deb/ stable main
                deb http://dl.google.com/linux/talkplugin/deb/ stable main
                deb http://dl.google.com/linux/mod-pagespeed/deb/ stable main' >> /etc/apt-source.list"
接着注入 GPG 公匙:
$ wget https://dl-ssl.google.com/linux/linux_signing_key.pub
$ sudo apt-key add linux_signing_key.pub
$ rm linux_signing_key.pub
更新软件列表
$ sudo apt-get update
开始安装吧:
$ sudo apt-get install google-chrome google-earth google-musicmanage google-talkplugin
要注意,Google 只提供了稳定版本的包,请根据 Debian 适当调整设置。

有关 Debian 更多的第三方仓库,请看 https://wiki.debian.org/UnofficialRepositories 的介绍。

I、控制台下常用应用程序
对于那些在控制台下工作的狂人,以下工具肯定是必备的。不过在介绍这些工具之前,先要来说一下使用这些功能的先决条件,那就是在内核等相关位置开启 framebuffer 功能。首先,内核要支持 framebuffer,也即要在内核中开启下列参数
General setup  --->
    [*] Initial RAM filesystem and RAM disk (initramfs/initrd) support
    (/usr/share/v86d/initramfs) Initramfs source file(s)
Device Drivers ->
    Input Device Support --->
        <*> Event Interface
    <*> Connector - unified userspace <-> kernelspace linker  --->
    Graphics support  --->
        [*] Support for frame buffer devices  --->
            [*]   Enable firmware EDID
            <*>   Userspace VESA VGA graphics support
        Console display driver support --->
            [*] VGA text console
            [*]   Enable Scrollback Buffer in System RAM
            (64)    Scrollback Buffer Size (in KB)
            <*> Framebuffer Console support
            -*-   Map the console to the primary display device
            [ ]   Framebuffer Console Rotation
            [*]   Support for the Framebuffer Console Decorations
            [ ] Select compiled-in fonts
如果这些参数已经开启,那么不必重新编译内核;否则的话,请重新编译并安装内核。然后,查看内核模块
$ lsmod | grep fb
fbcon vesafb vga16b
加载这些模块
$ sudo modprobe fbcon vesafb vga16b
为了以后不需要再手动加载模块,可编辑下述文件
$ sudo nano -w /etc/modules
fbcon vesafb vga16b
好了,现在可以查看相关的 VGA 参数了:
$ sudo apt-get install hwinfo
$ hwinfo --framebuffer | grep Mode
根据控制台分辨率,通常是 1024x768,16位,按显示信息选择 VGA 参数。接着在 Grub 的内核参数结尾加入 framebuffer 分辨率参数:
vga=0x317
一切完成之后,重启客户机系统并用 Host+F1~F8(VirtualBox 主机是 Linux 时的按键)切换到 VirtualBox 的虚拟机控制台吧。
 
framebuffer 配置工具
$ sudo apt-get install fbset
控制台字体修改工具
$ sudo apt-get install console-setup console-data
中文显示以及中文输入
$ sudo apt-get install fbterm ibus-fbterm
开机打开数字键盘(即NUMLock)
$ sudo apt-get console-tools
文本浏览器
$ sudo apt-get install lynx links2 w3m w3m-img 
网络聊天工具
$ sudo apt-get install finch irssi
截图工具
$ sudo apt-get install fbcat
图片查看器
$ sudo apt-get install fbi
PDF 浏览器
$ sudo apt-get install fbida-fbgs
控制台下的鼠标支持
$ sudo apt-get install gpm
启动该服务
$ sudo /etc/init.d/gpm start
试试按住鼠标左键拖动选择复制区域,然后右键粘贴。
 

J、在 Kali Linux 中开启 SELinux 与 iptables 防火墙

配置 SELinux,需要确认 Linux 内核与文件系统是否支持。目前包括 btrfs、ext2、ext3、ext4、jfs 与 xfs 在内的文件系统都是支持 SELinux。其次,凡是基于 Debian 内核的 Linux 系统都是具备了运行 SELinux 的能力。但是,如果内核是自行编译的话,请务必确认内核选项 CONFIG_AUDIT 与 CONFIG_SECURITY_SELINUX 已经开启。如果不然,请重新编译内核。一切就绪之后就可以开始配置 SELinux 了。 先安装 SELinux 的基本工具集以及默认策略:

$ sudo apt-get install selinux-basics selinux-policy-default auditd
接着运行
$ sudo selinux-activate
配置 GRUB 与 PAM 并在根目录创建 /.autorelabel。重启系统并等待完成文件系统的标记直至系统再次重启。随后执行
$ sudo check-selinux-installation
检查系统是否正确执行设置并捕获一些 SELinux 的普通问题。例如,若出现 FSCKFIX is not enabled - not serious, but could prevent system from booting... 请检查 /etc/default/rcS 中的 FSCKFIX 配置,设置为 yes 即可。 若前述问题全部解决之后,一个可工作的 SELinux 系统准备好了,不过它还是处于 permissive 模式。这意味着 SELinux 策略不是强制执行的,但所有的 denials 信息会被记录到日志系统。执行
$ audit2why -al
可以查看所有可能的 denials 以及一些简短解释。如果系统日志里没有出现严重的 audit 错误,那么可以放心的使用 SELinux。可尝试临时启用 SELinux 的 enforcing 模式
$ sudo setenforce 1

或者可以在 /etc/default/grub 中增加 enforcing=1 参数到内核命令行然后重启系统永久生效。

防火墙服务有很多,这里以最简单的方式提供,先安装软件

$ sudo apt-get install iptables
创建防火墙脚本
$ sudo sh -c 'cat > /etc/iptables.rules << EOF
*filter

# Allows all loopback (lo0) traffic and drop all traffic to 127/8 that doesn't use lo0
-A INPUT -i lo -j ACCEPT
-A INPUT ! -i lo -d 127.0.0.0/8 -j REJECT

# Accepts all established inbound connections
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# Allows all outbound traffic
# You could modify this to only allow certain traffic
-A OUTPUT -j ACCEPT

# Allows HTTP and HTTPS connections from anywhere (the normal ports for websites)
-A INPUT -p tcp --dport 80 -j ACCEPT
-A INPUT -p tcp --dport 443 -j ACCEPT

# Allows SSH connections 
# The --dport number is the same as in /etc/ssh/sshd_config
-A INPUT -p tcp -m state --state NEW --dport 22 -j ACCEPT

# Now you should read up on iptables rules and consider whether ssh access 
# for everyone is really desired. Most likely you will only allow access from certain IPs.

# Allow ping
#  note that blocking other types of icmp packets is considered a bad idea by some
#  remove -m icmp --icmp-type 8 from this line to allow all kinds of icmp:
#  https://security.stackexchange.com/questions/22711
-A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT

# log iptables denied calls (access via 'dmesg' command)
-A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7

# Reject all other inbound - default deny unless explicitly allowed policy:
-A INPUT -j REJECT
-A FORWARD -j REJECT

COMMIT
EOF'
然后测试
$ sudo iptables-restore < /etc/iptables.rules
$ sudo iptables -L
$ netstat -nat
如无任何问题,将上述防火墙配置脚本放入网络启动服务
$ sudo sh -c 'cat > /etc/network/if-pre-up.d/iptables << EOF
#!/bin/bash

iptables-restore < /etc/iptables.rules
EOF'

防火墙服务配置完成。

K、最后,Kali Linux/Debian 的日常维护工作:

$ sudo apt-get update
$ sudo apt-get upgrade
$ sudo apt-get dist-upgrade
 
L、通过前面的介绍,我们了解了 Debian 系统的定制过程。实际上,如果熟悉 Gentoo 基本系统(stage 3)的安装过程的话,我们会发现它们之间有些共同之处,都是利用软件仓库中的包来搭建系统,大部分的步骤也是类似的。这可以说是 Linux 的共性,不仅 Gentoo、Debian 独有。比如,Fedora 系统也可以通过 febootstrap 实现类似的系统定制过程。不过相比 Gentoo 通过源码包编译实现的定制而言,Debian、Fedora 这些利用二进制包来搭建系统,有一些天然的短板。例如,打包好的 deb 包、rpm 包都是预先指定依赖关系的,虽然 Debian、Fedora 可以将二进制包分得很细、打得很小,但是这对于同一个包内的互斥特性是无能为力的。而 Gentoo 则不然,只要软件包的 Ebuild 写得好,那么它的 USE 标记不仅可以拿来控制包的某些依赖关系,也能拿来启用包的某些互斥特性,这使得我们可以随心所欲的调整包的功能。

 

Sep 6

cgit 是一款为 Git 服务器提供 Web 浏览界面的工具,与 gitweb 的功能类似。不过,cgit 的界面更加友好一些,速度更快一些。这里就来谈谈如何在 Fedora 19 中安装与配置 cgit,以及用它替代 gitweb 实现与 Gitolite 的整合。

cgit 的安装非常便当,仅需执行:

$ sudo yum install cgit
接着适当地调整 cgit 目录的访问权限,这里以 Apache 服务器为例:
$ sudo nano -w /etc/httpd/conf.d/cgit.conf
#
# cgit configuration for apache
#

ScriptAlias /cgit /var/www/cgi-bin/cgit
Alias /cgit-data /usr/share/cgit/

<Directory "/usr/share/cgit/">
   AllowOverride None
   Options None
  <IfModule mod_authz_core.c>
       # Apache 2.4
       Require all granted
   </IfModule>
   <IfModule !mod_authz_core.c>
       # Apache 2.2
       Order allow,deny
       Allow from all
   </IfModule>
</Directory>

<Directory "/var/www/cgi-bin"> 
  AllowOverride None 
  Options ExecCGI FollowSymlinks
  <IfModule mod_authz_core.c>
       # Apache 2.4
       Require all granted
   </IfModule>
   <IfModule !mod_authz_core.c>
       # Apache 2.2
       Order allow,deny
       Allow from all
   </IfModule>
</Directory>
注意,确保上述设置与 cgit 的一下配置一致,也即编辑 /etc/cgitrc 文件:
$ sudo nano -w /etc/cgitrc
查看下面几行
# cgit config

css=/cgit/cgit.css
logo=/cgit/cgit.png
如果不想被搜索引擎索引的话,还可往里添加一行:
# if you don't want that webcrawler (like google) index your site
robots=noindex, nofollow
修改完成之后,重启 Apache 服务器
$ sudo service httpd restart
如果Apache 服务器已经配置好了的话,可以测试一下 cgit 的功能是否正常工作。这只需在可以访问当该服务器器的电脑上打开网页浏览器,并在地址栏输入 http://serverIP/cgit。如果网页能够打开,那么表明 cgit 已经能够工作了。
 
需要注意,上面只是测试了 cgit 提供的 Web 界面是否工作,但是还没有涉及到 Git 服务器的部分。下面开始来谈论 cgit 如何关联到 Git 服务器。实际上,它是通过 /etc/cgitrc 配置文件来关联 Git 服务器的:
$ sudo nano -w /etc/cgitrc
根据具体情况编辑该配置文件,例如修改下面这些行:
#
# List of repositories.
# This list could be kept in a different file (e.g. '/etc/cgitrepos')
# and included like this:
#   include=/etc/cgitrepos

#repo.url=foo
#repo.path=/var/lib/git/foo.git
#repo.desc=the master foo repository
#repo.owner=fooman@example.com
#repo.readme=info/web/about.html

repo.url=MyRepo
repo.path=/var/lib/git/MyRepo.git
repo.desc=This is my git repository
实际上,真正与 Git 服务有关的只有最后三行,这三行给出了 Git 仓库的位置、名称以及扼要的描述。更多的 Git 仓库,均可按该格式添加至 cgit 的配置文件。现在在网页浏览器的地址栏再次输入 http://serverIP/cgit 测试一下,看看能不能访问到 Git 仓库信息。
 
为了更好地控制 Git 服务器的访问权限,一般 Git 服务部分都是通过 Gitolite 这样的工具实现的。Gitolite 的配置过程在前面已经描述过了。自然而然的,需要考虑如何以 cgit 替代 gitweb,将它与 Gitolite 整合在一起。解决这个问题的方法与实现 gitweb 的整合过程差不多。首先,修改 Gitolite 新建仓库的默认权限,这可通过修改 /var/lib/gitolite/.gitolite.rc 的 UMASK 实现:
$ sudo nano -w /var/lib/gitolite/.gitolite.rc
更改 UMASK 为 0022,也即
#$REPO_UMASK = 0077; # gets you 'rwx------'
#$REPO_UMASK = 0027; # gets you 'rwxr-x---'
$REPO_UMASK = 0022; # gets you 'rwxr-xr-x'
接着通过下述命令修改 Gitolite 中所有现有仓库的权限:
$ sudo find /path/to/the/repository/ -type d -exec chmod og+rx {} \;
$ sudo find /path/to/the/repository/ -type f -exec chmod og+r {} \;
最后,为了让 cgit 能够自动访问到 Gitolite 中仓库信息,仍需修改配置文件 /etc/cgitrc:
$ sudo nano -w /etc/cgitrc
提供类似于 gitweb 中所需要的 projects.list 等信息,例如:
#
# information related to gitolite 
#

enable-git-config=1
enable-gitweb-owner=1
remove-suffix=1
project-list=/var/lib/gitolite/projects.list
scan-path=/var/lib/gitolite/repositories
请注意最后这 5 行,它们包含了与 Gitolite 整合所需要的所有内容。至于 Gitolite 中的修改,完全与 gitweb 所需的修改一致,这里就不再重复了。
 
如果还想为 cgit 锦上添花的话,可安装 highlight 实现 cgit 访问的 Git 仓库中源代码的高亮:
$ sudo yum install highlight

不过这还需要 cgit 的配置,也即

$ sudo nano -w /etc/cgitrc

增加或去掉下面这一行的注释

source-filter=/usr/lib/cgit/filters/syntax-highlighting.sh
Jul 30

Gitolite 是一款由 Perl 语言开发的 Git 服务管理工具,通过 SSH 公钥对用户进行认证,并能够通过配置文件对版本库的写操作进行基于分支、标签以及文件路径等的权限控制。 gitweb 为 Gitolite 提供了版本库的 Web 界面,方便用户浏览版本库的变更与版本打包;另一方面,由于 Gitolite 并没有提供匿名用户的读权限,因此,需要借助 git-daemon 来弥补这一缺陷。

1、Gitolite 的安装与配置

Gitolite 的安装非常简单,执行下述命令即可:
$ sudo yum install gitolite
查看 Gitolite 的用户信息
$ cat /etc/passwd | grep -i gitolite
gitolite:x:976:971:git repository hosting:/var/lib/gitolite:/bin/sh
这表明 Fedora 中 Gitolite 的家目录位于 /var/lib/gitolite。
 
下面开始初始化 Gitolite。由于 Gitolite 采用的是 SSH 协议,因此在初始化开始之前必须注入 Gitolite 管理者的 SSH 公匙。这里不去谈论 SSH 密匙的生成过程了,直接假定拥有 SSH 密匙的用户 James 将成为 Gotolite 的管理者:
$ cp ~/.ssh/id_rsa.pub /tmp/james.pub
请注意公匙的命名方法,这是 Gitolite 区别各个用户的默认办法。另外,可能出于安全的考虑,我们可能修改过 ~/.ssh 目录下文件的权限。由于下面的操作需要用户 James 的公匙具有写权限,所以需要执行下面的命令行
$ chmod a+r /tmp/james.pub
还有一件事情需要指出,既然 Gitolite 使用的是 SSH 协议,因此它工作的前提是运行 sshd 系统服务,请查看它是否运行
$ systemctl status sshd

如果没有运行的话,请执行下述命令行,至于 SSH 端口之类的问题就不做赘述了:

$ sudo systemctl start sshd
$ sudo systemctl enable sshd
现在可以初始化 Gitolite 了:
$ sudo -u gitolite -H gl-setup /tmp/james.pub
 
好了,下面该让我们稍微解释一下 Gitolite 对 Git 服务器的管理方式了。 Gitolite 通过导入用户的 SSH 公匙的方式来实现对 GIT 服务器的用户管理。Gitolite 利用配置文件 /var/lib/gitolite/repositoreis/gitolite-admin.git/config/gitolite.conf 实现了用户权限的控制。非常有意思的是,Gitolite 以 GIT 版本库的形式在管理 gitolite.conf 与所有用户的 SSH 公匙。具体来说,Gitolite 中预设了两个版本库,即 gitolite-admin.git 与 testing.git:
$ sudo ls /var/lib/gitolite/repositories
gitolite-admin.git  testing.git
可能我们已经注意到,版本库目录中的版本库名字均是以 .git 结尾的,这是 Gitolite 的约定。Gitolite 的管理者正是通过 gitolite-admin.git 来管理版本库的,他可以以版本控制的方式管理它。而 Gitolie 会自动根据该版本库中的修改来产生新的配置。好了,让我们的管理者把 gitolite-admin.git 克隆到他的家目录中去吧:
$ cd
$ git clone gitolite@serverIP:gitolite-admin.git
$ cd gitolite-admin
$ cat conf/gitolite.conf
repo    gitolite-admin
        RW+     =   james

repo    testing
        RW+     =   @all
我们很容易看到 gitolite.conf 中奇特的语法。每一个版本库的授权均以 repo 指令开头。repo 后面紧跟的是版本库列表。版本库列表中的版本库名之间用空格分开,版本库名中可以含有相对路径名。根据 Gitolite 的默认规则,repo 后面的版本库名不需要以 .git 为后缀,因为 Gitolite 会自动添加该后缀名。另外,版本库列表里面还可以包括版本库组。版本库组就是一些以空格间隔的版本库名的合集,版本库组名以@开头,例如
@testings testing james/testing
repo @testings
repo 指令也可以紧跟以正则表达式定义的通配符版本库。需要注意通配符版本库在匹配时,会自动在通配符版本库的正则表达式前、后分别加上前缀 ^ 和后缀 $。例如
repo james/.+
要当心的是版本库名中的正则表达式过于简单,就可能引起歧义,让 Gitolite 以为它就是普通版本库名称。为了不必要的麻烦,可在正则表达式的前或后主动加上 ^ 或 $ 符号,例如
repo james/.+$
 
repo 指令后续的几行就是版本库的授权命令列表。每条授权指令有相同的缩进,且以 = 为标记分为前后两段,等号前面的是权限表达式,等号后面的是用户列表。授权指令的语法类似于
perms [regex ...] = user1 [user2 ...]
正如我们所看到的,授权指令中包含一个可选的 regex 列表。regex 列表有正则表达式给出,它们与 repo 所指定的版本库里的分支、标签甚至是文件名或路径进行匹配。具体说来,正则表达式 regex 可能与分支名匹配,也可能与分支组匹配。分支组名以@开头,它是一些有空格间隔的分支名的合集,例如
@mainstream master developing testing
regex 也可能与 refs/tags/ 中的标签名匹配;regex 还可能与版本库中的文件名或文件路径匹配。如果 regex 中的表达式不以 $ 结尾的话,那么它将匹配以该正则表达式开头的任意字符,相当于在表达式后面添加 .*$。如果授权指令中不包含任何 regex 列表,那么该授权将针对由 repo 指定整个的版本库。
 
perms 部分只能出现如下授权之一:-、C、R、RW、RW+、RWC、RW+C、RWD、RW+D、RWCD、RW+CD。它们的具体含义如下:
  • -:不能写入、但是可以读取;
  • C:仅在通配符版本库中可以使用。用于指定谁可以创建和通配符匹配的版本库。
  • R, RW, 和 RW+:R 为只读。RW 为读写权限。RW+ 含义为除了具有读写外,还可以对 rewind 的提交强制 PUSH。
  • RWC, RW+C:只有当授权指令中定义了 regex 列表才可以使用该授权指令。其中 C 的含义是允许创建与 regex 匹配的分支、标签、文件名或者路径。
  • RWD, RW+D:只有当授权指令中定义了 regex 列表才可以使用该授权指令。其中 D 的含义是允许删除与 regex 匹配的分支、标签、文件名或者路径。
  • RWCD, RW+CD:只有当授权指令中定义了 regex 列表才可以使用该授权指令。
Gitolie 中的用户通常是以公匙文件名来指定的,这是 Gitolite 中的用户的表示方法之一。另一种 Gitolite 用户的表示方法就是用户组,用户组的命名以@开头,例如
@myteam james alice
定义了一个名为 @myteam 的用户组,james、alice 都是属于 myteam 这个用户组。Gitolite 中有个特殊的用户组,即@all,用来表示所有的用户。
 
下面给出一个权限控制的示例
@admin james
@myteam james alice
@test alice

@testings james/testing alice/testing

@mainstream master developing

repo    james/.+$
        C                           =   @admin
        R       @mainstream         =   @test
        -                           =   bob
        RW                          =   @myteam bob

repo    testing @testings
        RW+                         =   @admin
        RW      master              =   bob
        RW      developing$         =   alice
        -                           =   bob
        RW      tmp/                =   @all
        RW      refs/tags/v[0-9]    =   alice
这里有一点需要指出,那就是当同一个用户或者组有多个授权时,Gitolite 将采用所有授权的并集。
 
为了将上面的介绍与实际应用相结合,不妨考虑为 Gitolite 增加一个版本库 myproj、两个用户组 @admin 与 @myteam,以及用户 Alice 并授予她 myproj.git 的读写权限与用户 Bob 但只给予 myproj.git 的读权限。先让 Gitolite 的管理者 James 执行下述命令:
$ cd ~/gitolite-admin
$ cp /path/to/alice.pub keydir/
$ cp /path/to/bob.pub keydir/
$ nano -w conf/gitolite.conf
@admin james
@myteam james alice

repo    gitolite-admin
        RW+     =   @admin

repo    testing
        RW+     =   @all

repo    myproj
        RW+     =   @myteam
        RW+CD   =   @admin
        R       =   bob
$ git add conf/gitolite.conf keydir/alice.pub keydir/bob.pub
$ git commit -m 'new user and repo created.'
$ git push origin master
接着再让 James 在自己的主机家目录下创建新项目 myproj 并推至服务器:
$ mkdir -p ~/myproj
$ cd ~/myproj
$ git init
$ echo "hello, Gitolite!" >> hello.txt
$ git add hello.txt
$ git commit -m 'initial commit.'
$ git remote add origin gitolite@serverIP:myproj.git
$ git push origin master
现在试试让 Alice 在自己的主机上克隆并做一次提交
$ cd ~
$ git clone gitolite@serverIP:myproj.git
$ cd myproj
$ echo "hi, I'm Alice." >> hello.txt
$ git add hello.txt
$ git commit  -m 'say hello to Git Server."
$ git push origin master

再来让 Bob 试试 GIT 服务器的情况:

$ cd ~
$ git clone gitolite@serverIP:gitolite-admin.git

正常情况,Bob 无法克隆该仓库;

$ git clone gitolite@serverIP:testing.git
$ cd testing
$ echo 1 > index.txt
$ git add index.txt
$ git commit -m 'write permission for testing repo.'
$ git push origin master

这表明 Bob 拥有 testing.git 的读写权限;再来看

$ cd
$ git clone gitolite@serverIP:myproj.git
$ myproj
$ echo "hello, I'm Bob." >> hello.txt
$ git add hello.txt
$ git commit -m 'say hello to Gitolite.'
$ git push origin master

这表明 Bob 只能读取 myproj 但没有写权限。这几个操作表明 Gitolite 比较完美的控制了用户操作 GIT 服务器的权限。

2、与 gitweb 的整合
 
最初 gitweb 是为 GIT 服务器的 http 协议提供 Web 界面的。这里正是借助这个功能,为 Gitolite 实现同样的功能。同时,Gitolite 也为 gitweb 提供了两个便利:为 gitweb 提供了设置版本库的描述信息途径,可用于在 gitweb 的项目列表页面显示;为 gitweb 自动生成项目的列表文件,避免 gitweb 使用效率低的目录递归搜索查找 Git 版本库列表。
 
安装 gitweb 与 highlight:
$ sudo yum install highlight gitweb
其中 highlight 是为了在网页中查看代码的时候可以高亮代码的语法。查看 gitweb 的配置文件所在的位置:
$ rpm -qc gitweb
/etc/gitweb.conf
/etc/httpd/conf.d/git.conf
/etc/httpd/conf.d/git.conf 是与 Apache 相关的配置。gitweb 本身的配置文件是 /etc/gitweb.conf,下面开始配置 gitweb:
$ sudo nano -w /etc/gitweb.conf
根据需要调整里面的内容,下面这几行的内容必须调整
our $projectroot="/var/lib/gitolite/repositories";
our $projects_list="/var/lib/gitolite/projects.list";
至于语法高亮,自己看着办
# Add highlighting at the end 
$feature{'highlight'}{'default'}= [1];
 
为了能够让 Apache 访问到 Gitolite 目录中的文件,需要将 apache 加入到 gitolite 组中,并修改相关文件的权限
$ sudo usermod -a -G gitolite apache
$ sudo chmod g+r /var/lib/gitolite/projects.list
$ sudo chmod -R g+rx /var/lib/gitolite/repositories
由于 Gitolite 中默认新建文件的权限是 0077,这意味着要让 Apache 访问之后新建版本库,必须对之后新建版本库权限作类似的修改。为了免去这一麻烦,这里利用 Gitolite 的配置文件 ~/.gitolite.rc 来指定新建文件的权限:
$ sudo nano -w /var/lib/gitolite/.gitolite.rc
根据自己的需要修改下面的行
#$REPO_UMASK = 0077; # gets you 'rwx------'
#$REPO_UMASK = 0027; # gets you 'rwxr-x---'
$REPO_UMASK = 0022; # gets you 'rwxr-xr-x'
好了,一切就绪了,重启 Apache 服务:
$ sudo service httpd restart
 
以上配置基本都是在告诉 Apache 一些 GIT 服务器的信息。不过,为了让 gitweb 工作,还需要让 Gitolite 知道哪些仓库启用了 gitweb。这可以通过下面这个例子来了解这个机制,让管理者再次修改 Gitolite 的配置文件
$ cd
$ cd gitolite-admin
$ nano -w conf/gitolite.conf
repo    gitolite-admin
        RW+     =   james

repo    testing
        testing "James" =   "Git repository for testing"
        RW+     =   @all
        R       =   gitweb
$ git add conf/gitolite.conf
$ git commit -m 'gitweb support for Gitolite.'
$ git push origin master

很明显,'R = gitweb' 这一行告诉 Gitolite 版本库 testing.git 启用 gitweb,这样 Gitolite 就会把 testing.git 写入 projects.list 文件;而 'testing "James" = "git repository for testing"' 这一行则是为了在网页中显示 testing 仓库的额外信息,也即仓库的创建者以及仓库的概述。其他版本库启用 gitweb 的设置完全类同,这里就不一一修改了。实际上,版本库的信息的设定也通过如下的命令来完成:

repo    testing
        config gitweb.owner         =   some person's name
        config gitweb.description   =   some description
        config gitweb.category      =   some category 
 
是时候打开网页浏览器开始测试了,在地址栏中输入 http://serverIP/git,正常情况应该出现下图。
 
3、与 git-daemon  的整合
 
最后,让我们利用 git-daemon 为 Gitolite 开启匿名访问功能。首先安装它:
$ sudo yum install git-daemon
需要注意的是,由 Fedora 19 中 git-daemon 的 RPM 包存在问题,详见 https://bugzilla.redhat.com/show_bug.cgi?id=980574。因此,如果要在 Fedora 19 中启动 git-daemon 的服务以配合 Gitolite,那么需要作如下的修改:
$ mv /usr/lib/systemd/system/git.service /usr/lib/systemd/system/git@.service
随后将它按如下方式修改:
$ cat /usr/lib/systemd/system/git@.service
[Unit]
Description=Git Repositories Server Daemon
Documentation=man:git-daemon(1)
Wants=git.socket

[Service]
User=nobody
ExecStart=-/usr/libexec/git-core/git-daemon --base-path=/var/lib/gitolite/repositories --export-all --user-path=public_git --syslog --inetd --verbose
StandardInput=socket
由该段代码可以看到,Fedora 19 中 git-daemon 包并没有创建新的用户组,而是以 nobody 用户启动了系统服务。但是,Gitolite 的目录则是赋予了 gitolite 组:
$ ls -ald /var/lib/gitolite
drwxr-xr-- 5 gitolite gitolite 4096 Jul 29 22:31 /var/lib/gitolite
因此,为了让 git-daemon 能够访问 Gitolite 的家目录,需要将 nobody 加入 gitolite 组并赋予 Gitolite 家目录以可读权限
$ sudo usermod -a -G gitolite nobody
$ sudo chmod g+r -R /var/lib/gitolite/repositories
现在启动 git-daemon 服务并让它随机器启动:
$ sudo systemctl start git.socket
$ sudo systemctl enable git.socket
git-daemon 默认端口是 9418,查看该端口是否打开
$ netstat -nat | grep 9418
如果没有打开的话,请编辑 /etc/sysconfig/iptables:
$ nano -w /etc/sysconfig/iptables
在 Drop 与 Reject 规则之前,增加一行
-A INPUT -p tcp -m conntrack --ctstate NEW -m tcp --dport 9418 -j ACCEPT
重启防火墙:
$ sudo service iptables restart
至此,git-daemon 已经知道 Gitolite 的工作目录了。不过,Gitolite 中的版本库还需要为 git-daemon 自动生成 git-daemon-export-ok 文件, 这便是下面的设置,仍需管理者运行:
$ cd 
$ cd gitolite-admin
$ nano -w conf/gitolite.conf
repo    gitolite-admin
        RW+     =   james

repo    testing
        RW+     =   @all
        R       =   daemon
$ git add conf/gitolite.conf
$ git commit -m 'git daemon support for Gitolite.'
$ git push origin master

'R=daemon' 这一行就是告诉 Gitolite 为 git-daemon 生成 git-daemon-export-ok 文件。

好了,现在让我们做简单的测试:

$ git clone git://serverIP/testing.git
一切正常。

 

Jul 22

虽然 Fedora 作为服务器来用不是上佳的选择,不过拿来练手倒是上上之选。因为 Fedora 中的大多数 Web 服务除去安全性等方面需要多加注意之外,基本上属于即装即用型的。Fedora 上的 Web 服务器的搭建也有很多选择,而且都是一些非常成熟的组合。反正不能免俗,不妨选择最常用的 LAMP 组合作为 Web 服务器的基础。不过话说回来,物换星移,Fedora 19 以 MariaDB 替换了 MySQL,也算是必然趋势。尽管如此,这些对于普通用户的影响并不大,mysqld 还是那个 mysqld。 作为普通用户,这里主要介绍的是与 LAMP 服务器相关的一些应用。至于 LAMP 服务本身相关的网站开发、优化等内容,暂时没有时间也没有能力触及了。

下面主要的测试环境是 Fedora 19。其他环境中 Web 服务器安装大同小异,很容易自行调整。当然,在开始之前最好关掉 SELinux,具体来说

$ sudo nano -w /etc/sysconfig/selinux
SELINUX=disable

修改完之后需重启机器才能有效。为了免去重启机器,可执行

$ sudo setenforce 0

即可即时生效。

一、LAMP 的安装与测试

1. Apache 服务器的安装

Apache 是世界上非常流行的 Web 服务器软件之一,类似的还有lighttpd、Nginx、Tomcat 等。不过,Apache 功能强大,一直深受建站爱好者的喜爱。它的安装非常容易:

$ sudo yum install httpd

Apache 的配置文件位于 /etc/httpd 目录,其中 /etc/httpd/conf/httpd.conf 是其默认配置文件,默认虚拟主机的目录位于 /var/www/html,与 Apache 相关的 Web 应用的配置目录可能位于 /etc/httpd/conf.d/。下面启动 Apache 服务并让它随机器一起启动:

$ sudo service httpd start
$ sudo chkconfig httpd on

为了看看 Apache 有没有正常工作,先做一下本地测试。打开本地的网页浏览器,在地址栏输入 http://localhost。正常情况应该出现如下的页面:

2. MariaDB 数据库的安装

Linux 中的 SQL 数据库很多,例如 MariaDB(MySQL)、PostgreSQL、SQLite、Firebird 等。不过这里就只安装 MariaDB:

$ sudo yum install mariadb mariadb-server

MariaBD 服务的开启方法与 MySQL 一样:

$ sudo service mysqld start
$ sudo chkconfig mysqld on

实际上,MariaDB 的用法也与 MySQL 别无二致。例如,MariaDB 数据的默认账户是 root,它与 Linux 系统的 root 账户没有什么联系。通常,MariaDB 的默认账户是没有密码的,这对于数据库的管理来说是不安全的。给它设置一个密码,例如toor:

$ sudo mysqladmin -u root password toor

现在尝试在本地登录 MariaDB 数据库:

$ sudo mysql -u root -p

数据库一切正常。

3. 网页开发语言 PHP 的安装

网页开发语言众多,例如PHP、JSP、ASP等。不过在 Linux 下面,PHP 整合的相对好一些:

$ sudo yum install php

测试一下 PHP 是否正常工作?首先,在本地的 /var/www/html 目录新建如下的文件:

$ su -c 'echo > /var/www/html/info.php << EOF

<?php
    phpinfo();
?>
EOF'

接着,在本地浏览器的地址栏中输入 http://localhost/info.php。如果出现如下的页面,就说明 PHP 工作正常!

4. 整合Apache与PHP
 
具体的整合可能涉及到很多优化方面的内容,这里只谈非常常见的几点。
$ sudo nano -w /etc/httpd/conf/httpd.conf
先在
AddType application/x-gzip .gz .tgz
所在行的下面添加
AddType application/x-httpd-php .php .phtml
AddType applicatoin/x-httpd-php-source .phps
接着再将
   DirectoryIndex index.html
改为
    DirectoryIndex index.html index.htm index.php
修改完成后保存退出。
 
为了提升 PHP 安全性,可在 /etc/php.ini 中进行作如下设置
$ sudo nano -w /etc/php.ini
将下面这一行
disable_functions =
修改为:
disable_functions = phpinfo,passthru,exec,system,chroot,scandir,chgrp,chown,shell_exec,proc_open,proc_get_status,ini_alter,ini_alter,ini_restore,dl,pfsockopen,openlog,syslog,readlink,symlink,popepassthru,stream_socket_server

5. 防火墙设置与 LAMP 的远程测试

Fedora 中默认防火墙的安全级别比较高,基本上关闭了所有的服务端口。为了让远程机器能够访问 LAMP 服务器,需要适当调整防火墙设置。Fedora 在程序菜单中提供了防火墙的图形界面工具,不过这里主要介绍防火墙的命令行设置方法。由于 iptables 的规则是有优先次序的,通常需要手动编辑 iptables 的配置文件 /etc/sysconfig/iptables。下面为了简单起见,直接清空防火墙的原先设置,完全重写了所有的 iptables 规则。因此,使用下面这些规则的时候要小心,例如与 SSH 相关的规则没有在里面。关于如何开启 SSH 端口,可自行查阅 iptables 规则的写法。

首先,停止所有的 iptables 服务:

$ sudo service iptables stop
清除所有的 iptables 规则表:
$ sudo iptables -F -t filter
$ sudo iptables -X
设定预设 iptables 规则:
$ sudo iptables -P INPUT DROP
$ sudo iptables -P OUTPUT ACCEPT
接受所有本地回环网络的数据:
$ sudo iptables -A INPUT -i lo -j ACCEPT
接受所有 Established 连接:
$ sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
设置 ICMP 服务(保证 
$ sudo iptables -A INPUT -p icmp -m limit --limit 1/s --limit-burst 10 -j ACCEPT
开启 Apache 服务的端口:
$ sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
开启 MariaDB 服务的端口:
$ sudo iptables -A INPUT -p tcp --dport 3306 -j ACCEPT
最后,保存所有 iptables 的规则并再次启动 iptables 服务
$ sudo service iptables save
$ sudo service iptables start

为了确认本地端口已经正常开启,请执行以下命令

$ netstat -nat

检查相应服务的端口是否被监听。如果一切正常的话,可以开始在远端主机测试 LAMP 服务器了。假设 LAMP 主机的 IP 地址为 ipaddr。首先测试 Apache 服务,打开网页浏览器,在地址栏输入 http://ipaddr 或者 http://ipaddr/info.php。如果出现图或中的页面,就说明 Apache 工作正常;接着测试 MariaDB 服务,请安装 MariaDB 的客户端,然后登录 MariaDB 主机进行测试:

$ sudo yum install mariadb
$ mysql -h http://ipaddr -u root -p
至此,LAMP 服务器的安装配置已经完成,后面将接着介绍它的应用。
Jul 20
我们知道 Gnu PG 是非常重要的加密工具,它可以帮助我们加密数据或者对使用的文件、文本进行签名以确保数据的真实性。Gnu PG 被广泛的应用于电子邮件传递、软件包打包等过程中。下面我们就来谈谈 Gnu PG 在 GIT 中的使用。
 
1、标签、提交等的签名
通常提交源码时,我们直接采用
$ git commit -m 'something added.'
对于这种提交方式,我们无法确认是否本人做了这些修改。为了防止这种情况发生,我们可以尝试
$ git commit -S <gpg-key-id> -m 'something added.' 
其中 <gpg-key-id> 就是用户的Gnu PG 的密匙ID。该命令执行时会提示用户输入该 <gpg-key-id> 的口令,随后对这次提交做了 GPG 签名,如此一来便可确信是本人做了这次递交。类似地情况也可运用到标签上来,例如
$ git tag v1.0 -s -u <gpg-key-id> -m 'tagged with important information.'
如果觉得每次手动指定 Gnu PG 密匙 ID 比较麻烦,可以通过下述方式自动指定
$ git config --global user.signingkey <gpg-key-id>
 
2、push/pull的口令缓存
我们在将版本库的修改同步到远程版本库时,通常需要输入账户与口令。如果版本库中有多次提交需要同步,那么账户、口令就需要输入多次。早期 GIT 版本库同步时,由于没有提供密码的缓存机制,为了免去重复输入账户名与口令,通常直接将密码明文的保存在.git/config文件之中。例如,
$ git remote add origin https://<username>:<password>@github.com/someone/repo
其中 <username> 与 <password> 就是账户与密码。很明显,以明文方式存储隐私信息是非常不可取的。因此新版的 GIT 中提供了新的办法,大体来说有两种:一、利用 git-credential;二、利用 ~/.netrc 或者 ~/.authinfo 等文件实现自动读取隐私信息。
 
credential 机制有点类似于 Gnu PG 代理,它能够缓存用户的密码,例如
$ git config --global credential.helper 'cache --timeout=3600'
如此设置之后,当我们输入完账户密码之后,GIT 就会缓存密码1个小时。实际上,credential 的机制还有好几个,有兴趣的朋友请自行阅读文档
$ man git-credential
 
另一方面,GIT 利用 ~/.netrc 等文件存取账户名与密码的方式与 ftp 的工作方式类似。例如,
$ cat ~/.netrc
machine github.com
  multilinetoken <hashnumber>
  login <username> password <password>
随后,我们便可以执行
$ git push origin master
此时 GIT 会自动读取 ~/.netrc 中账户信息将本地版本库修改同步远程端 GIT 服务器。这样一来,隐私信息的安全完全有赖于 ~/.netrc 文件权限了,通常,会对该文件的权限作如下设置
$ chmod 600 ~/.netrc
 
不过即使是这样,我们可能还是觉得安全性不够。例如用户登录电脑后有事需要离开一段时间,但没有及时开启密码屏保,这就难保 ~/.netrc 的信息不被泄漏。下面就来谈谈进一步的保密措施,那就是用 Gnu PG 加密 ~/.netrc 文件
$ gpg -o ~/.netrc.gpg -er <gpg-key-id> ~/.netrc
随后再对 GIT 做如下配置
$ git config --global credential.helper 'netrc -f ~/.netrc.gpg -d'
为了让 GIT 支持如上的修改,还需要开启 git-credential-netrc。在 Fedora 19 中,该文件位于 /usr/share/doc/git-<version>/contrib/credential/netrc 目录之中。需要将它置于 /usr/libexec/git-core 目录之下,并增加可执行权限
$ sudo cp /usr/share/doc/git-<version>/contrib/credential/netrc/git-credential-netrc /usr/libexec/git-core
$ sudo chmod +x /usr/libexec/git-core/git-credential-netrc
当然,用户也可以试试我的 Fedora 源中重新打包的 GIT。好了,现在再试试远程版本库的同步吧。
 
用 Gnu PG 加密 ~/.netrc 有个问题需要指出,那就是原先 ~/.netrc 的功能并不能被完全拓展到 ~/.netrc.gpg。换而言之,当我们执行 ftp 命令时,~/.netrc.gpg 并不能被解析。因此,我们需要适当分离 ~/.netrc 中内容以确保各个程序能够合理的工作。
 
3、版本库中文件的自动加密/解密
 
通常版本库中不太可能有什么隐私信息,不过随着很多人将 Linux 配置文件制成 GIT 版本库,隐私问题也就随之而来了。有些配置文件,例如 SSH 的私匙文件,再如 Emacs 的 GNUS 与 ERC 等,它们的密码有一部分只能以明文的方式保存的。如果将它们的配置发布到公开的 GIT 版本库中显然不是很合适。那么有没有办法将这些隐私文件以加密的形式保存到远程版本库,但本地工作目录中则仍以解密形式存在呢?答案仍是使用 GPG,主要是利用 GIT 的 filter 机制来配合 GPG 的使用。具体来说是这样的:
$ git config --local filter."gpg".smudge 'gpg -d --batch --no-tty -r <gpg-key-id>'
$ git config --local filter."gpg".clean 'clean = gpg -ea -q --batch --no-tty -r <gpg-key-id>'
$ git config --local diff."gpg".textconv decrypt
接着将需要将解密的文件名列表加入.gitattributes或者.git/info/attributes,例如
/path/to/id_rsa filter=gpg diff=gpg
/path/to/gnus.el filter=gpg diff=gpg
现在你可以尝试将id_rsa、gnus.el加入版本库了,当它们被加入到版本库时,GIT会利用 clean 所指定的方式进行加密。而当它被检出时,GIT 会调用 smudge 进行解密。需要注意的是,整个过程需要预先运行 gpg-agent。
 
用 GIT 管理配置文件的过程中,可能还会碰到一个特殊的文件需要加密,那就是 GIT 本身的配置文件。这个需求仍然与登录密码相关,最直接的例子就是 Github 的 token。很明显,直接加密整个 ~/.gitconfig 文件并不是很好的选择。这里提供一种方法,可以将需要加密的那部分配置分离出来。具体来说就是在 GIT 的配置文件中增加include部分,例如
$ git config --global include.path '~/.gitrepo'
并在 ~/.gitrepo 中加入与隐私相关的部分:
$ nano -w ~/.gitrepo
[github]
      username = <username>
      token = <hashnumber>
至于如何将 ~/.gitconfig、~/.gitrepo 纳入我们的配置文件版本库,这里就不多说。最后就是加密~/.gitrepo文件,这个非常简单。例如,~/.gitrepo 在版本库中的名字gitrepo,下面只需要再在.gitattributes中增加一行
/path/to/gitrepo filter=gpg diff=gpg

 

以上就是关于 GPG 与 GIT 的一些应用,希望对大家有用。
Mar 2

当系统的物理内存不够用的时候,就需要将物理内存中的一部分空间释放出来,以供当前运行的程序使用。那些被释放的空间可能来自一些很长时间没有什么操作的程序,这些被释放的空间被临时保存到 Swap 空间中,等到那些程序要运行时,再从 Swap 中恢复保存的数据到内存中。这样,系统总是在物理内存不够时,才进行 Swap 交换。这个是 Swap 交换分区的作用。

 
系统中交换分区的大小并不取决于物理内存的量,而是取决于系统中内存的负荷,所以在安装系统时要根据具体的业务来设置 Swap 的值。其实虚拟内存并不是等到物理内存用尽了才使用的,是否尽量的使用或不使用 Swap,在内核空间有一个参数控制:
# cat /proc/sys/vm/swappiness
60
表示默认的 swappiness 的值为60。换而言之,当 Swap 空间使用达到60%的时候,开始释放物理内存中的 cache/buffers。 swappiness=0 的时候表示最大限度使用物理内存,然后才是 Swap 空间; swappiness =100 的时候表示积极的使用 Swap 分区,并且把内存上的数据及时的搬运到 Swap 空间里面。
 
现在服务器的内存动不动就是上百 G,所以我们可以把这个参数值设置的低一些,让操作系统尽可能的使用物理内存,降低系统对 Swap 的使用,从而提高系统的性能。例如
# echo 10 > /proc/sys/vm/swappiness
或者
# sysctl vm.swappiness=10
vm.swappiness = 10
再来查看一下它的值:
# cat /proc/sys/vm/swappiness
10
这表明修改已经生效。但是如果我们重启了系统,它又会变成60。为了让我们的修改长久有效,可以修改配置文件/etc/sysctl.conf:
# echo 'vm.swappiness=10' >>/etc/sysctl.conf
为了让它即时生效,可执行:
# sysctl -p
重新载入配置文件。 
 
Red Hat(红帽官方)推荐交换分区的大小应当与系统物理内存的大小保持线性比例关系。不过在小于2GB物理内存的系统中,交换分区大小应该设置为内存大小的两倍,如果内存大小多于2GB,交换分区大小应该是物理内存大小加上2GB。其原因在于,系统中的物理内存越大, 对于内存的负荷可能也越大。但是,如果物理内存大小扩展到数百GB,这样做就没什么意义了。
 
最近,在Gentoo中编译webkit-gtk-1.10.2-r300,辛辛苦苦编译了几个小时,结果报错:
collect2: ld termiinated with signal 9 [Killed]
通过Google搜索,发现这是由于编译过程中机器的内存耗尽引起的。这就是说解决问题的办法是增加内存。不过加物理内存是远水,解不了近火。既然Linux中的交换分区也是内存的一部分,于是不妨尝试增加交换分区。 这又让我们想起了红帽官方对于交换分区的建议:Linux系统交换分区最适合的大小是物理内存的1-2倍。可是谁又会在分区的时候记得这些呢?不过由于Linux允许文件系统中存在多个交换分区或者交换分区文件,所以亡羊补牢、为时未晚。如果我们的磁盘空间还尚有空余没有划分,那么我们可以直接利用分区工具再分出一个交换分区。倘若你像我一样,所有空间都已经被划分完了,那么只剩一招了—使用交换分区文件。下面我们主要来说说如何利用交换分区文件扩大分区。
 
首先,需要制作交换分区文件。考虑到我的老机器已有的物理内存是1G、现有交换分区大小是500M。为了我们的编译过程顺利完成,不妨考虑交换分区文件的大小为1G。为此,执行下述命令:
$ sudo dd if=/dev/zero of=/var/tmp/swap bs=1k count=1024000
记录了1024000+0 的读入
记录了1024000+0 的写出
1048576000字节(1.0 GB)已复制,5.07655 秒,207 MB/秒

它将在/var/tmp路径创建一个名为swap、大小为1G的分区文件,该分区文件拥有1024000个扇区(block),每个扇区大小为1K。接着,再把这个分区文件格式化为交换分区格式:

$ sudo mkswap /var/tmp/swap

随后,将它挂载到文件系统:

$ sudo swapon /var/tmp/swap
如果想要确认交换分区是否挂载成功,可执行:
$ swapon -s 
Filename      Type      Size    Used  Priority
/dev/sda1     partition 511996  16192 −1
/var/tmp/swap file      1023996 0     −2
从显示结果来看,我们确实看到了文件格式交换分区被加载。如果还想要查看系统内存情况,只需执行:
$ free -m
       total       used free shared buffers cached
Mem:   995         935  60   0      6       551
-/+ buffers/cache: 376  618
Swap:  1499        15   1484
通过扩大swap区,可以正常将webkit-gtk-1.10.2-r300编译完。实际上,用top跟踪webkit-gtk-1.10.2-r300的编译过程,会发现整个编译过程所需要的内存大概在2G左右。而我们通过增加交换分区的大小,总获得了2.5G左右的内存空间。编译完之后,如果我们不再需要这一块交换分区文件,那么可以先卸载再删除它
$ sudo swapoff /var/tmp/swap
$ sudo rm -rf /var/tmp/swap
 
倘若我们仍希望交换分区文件为以后的编译提供便利,那么可以选择保留它。不过在使用它之前必须先挂载它,因为一旦重启,原先的挂载便会失效!若要让我们的交换分区文件随机器启动自动挂载,则可修改/etc/fstab文件,例如作如下设置:
$ cat /etc/fstab | grep -i swap
/dev/sda1     none swap sw       0 0
/var/tmp/swap swap swap defaults 0 0