Jul 13

WebDAV(Web-based Distributed Authoring and Versioning)是基于 HTTP 1.1 的一个通信协议。它为 HTTP 1.1 添加了一些扩展(就是在 GET、POST、HEAD 等几个 HTTP 标准方法以外添加了一些新的方法),使得应用程序可以直接将文件写到 Web 服务器上,并且在写文件时候可以对文件加锁,写完后对文件解锁,还可以支持对文件所做的版本控制。现在主流的 Web 服务器一般都支持 WebDAV,如需了解更多有关 webDAV 的一些开源或商业项目,可访问 http://webdav.org/。

下面就来介绍一下在 Fedora 的 Apache 服务器中如何配置 WebDAV。首先,当然是安装 Apache 服务器

$ sudo yum install httpd

查看一下 Apache 服务器是否包含了 WebDAV 模块

$ cat /etc/httpd/conf.modules.d/00-dav.conf
LoadModule dav_module modules/mod_dav.so
LoadModule dav_fs_module modules/mod_dav_fs.so
LoadModule dav_lock_module modules/mod_dav_lock.so

确认完了 WebDAV 模块之后,该建立 WebDAV 目录了,这很简单:

$ sudo mkdir -p /var/www/webdav

安全起见,还需为 WebDAV 创建一些用户(当然不创建用户也行,不过记得修改后面的配置文件),可执行以下命令产生密码验证文件

$ sudo htpasswd -cm /var/www/webdav/.htpassword james

提示输入密码时输入该用户的密码;若还需要增加用户 tom,可执行以下命令

$ sudo htpasswd -m /var/www/webdav/.htpassword tom

删除某个用户,如 tom,可以使用下列指令:

$ sudo htpasswd -D /var/www/webdav/.htpassword tom

最后,还需在 Apache 的配置目录 /etc/httpd/conf.d/ 中新建一个名为 webdev.conf 的 WebDAV 配置文件,并输入以下内容

$ sudo nano -w /etc/httpd/conf.d/webdev.conf
<IfModule mod_dav_fs.c>
    DAVLockDB /var/lib/dav/lockdb
</ifmodule>

Alias /webdav "/var/www/webdav/"

<Directory "/var/www/webdav/">
   Options Indexes MultiViews
   IndexOptions FancyIndexing
   AddDefaultCharset UTF-8
   AllowOverride 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>

   Dav On # 开启 WebDAV
   AuthType Basic
   AuthName "WebDAV Server"
   AuthUserFile /var/www/webdav/.htpassword #密码验证文件
   Require valid-user
   <Limitexcept Get Options>
      Require user james
   </Limitexcept>
</Directory>

一切就绪了之后,重启 Apache 服务器

$ sudo service httpd restart

该测试一下 WebDAV 服务了,这只需在浏览器的地址栏中输入 http://localhost/webdav 来访问共享资源了;也可通过 MS Windows 的网上邻居访问。当然,GNU/Linux 也可使用命令行 cadaver 进入访问

$ sudo yum install cadaver
$ cadaver http://127.0.0.1/webdav/
Jun 19

Mac OS X 是由美国苹果公司开发的操作系统,通常它运行在如 MacBook、Mac 等个人电脑中。事实上,经过适当的配置以及软件的安装,也可以以 Mac OS X 为基础构建服务器。这里就来介绍一下如何在 Mac OS X 运行 Web 服务器。由于 Mac OS X 内置了 Apache 和 PHP,因此,几乎非常少的配置即可让 Web 服务运行在 Mac OS X 上。不过,这种非常少的配置是需要用户具有比较良好的 Unix 使用经验做基础的,后面的介绍也基本围绕着这种方式展开的。由于 Mac OS X 是一款非常优秀的操作系统,想要把 Web 服务的配置变得平易近人,也是非常容易的。OS X Server 就为用户提供了诸如 Web 服务、VPN 服务、FTP 服务等简明的图形化操作,有需要的用户可去 App Store 下载、安装 Server.app。除此而外,单就 Web 服务而言,另有 XAMPP、MAMP Pro 等已经打包好的开箱即用软件可供使用。

一、启动 Apache

在 Mac OS X 10.8 以前启动 Apache 很简单,只需在系统设置偏好(System Preferences)中设置 Web 共享(Web Sharing)即可。不过自 Mac OS X 10.8 以后,Web 共享(Web Sharing)取消了。因此,启动 Apache 需采用下述方法,先打开终端(Terminal.app),然后在终端运行

$ sudo apachectl start

再输入帐号密码,这样 Apache 就运行了。为了确认 Apache 是否正常工作,可在浏览器中输入 http://127.0.0.1 ,或者在终端输入

$ open http://127.0.0.1 &

正常情况下,就可以看到一个内容为 “It works!” 的页面,该页面对应 /Library/WebServer/Documents/index.html.en 文件。其中,/Library/WebServer/Documents/ 是 Apache 的默认(系统级)根目录。若想获知 Apache 的版本,可运行

$ apachectl -v
Server version: Apache/2.2.26 (Unix)
Server built:   Jun 20 2014 13:57:09

便会看到 Mac OS X 自带 Apache 版本信息。 为了更好的配置 Apache 服务,这里再来指出几个非常重要的文件与目录。第一个是 Apache 服务的配置文件目录,位于 /etc/apache2,里面包含了 Apache 服务的基本配置文件 httpd.conf。/etc/apache2 中还有很多其他文件和目录,在后面会陆续涉及到其中的一些。第二个是管理 Apache 服务的启动、停止等配置的文件,位于 /Library/LaunchDaemon/org.apache.plist。第三个是 Apache 的日志文件目录,位于 /var/log/apache2/,如果 Apache 启动后有任何问题,记得去这个地方看看,兴许就能找到解决问题的蛛丝马迹。

二、开启 PHP 支持

在终端中运行

$ sudo nano -w /etc/apache2/httpd.conf

打开 Apache 的配置文件,找到如下的行

#LoadModule php5_module libexec/apache2/libphp5.so

把前面的#号去掉,也即

LoadModule php5_module libexec/apache2/libphp5.so

保存 Apache 的配置文件。该来配置 PHP 了,首先查看 PHP 的配置文件 /etc/php.ini 是否存在,若没有的话,请运行

$ sudo cp /etc/php.ini.default /etc/php.ini

适当的调整一下配置,通过编辑 /etc/php.ini 文件,也即

$ sudo nano -w /etc/php.ini

来配置各种 PHP 功能。比如:

;调整时区
date.timezone = "Asia/Shanghai"
;通过 display_errors 来控制是否显示 PHP 程序的报错信息,这在调试 PHP 程序时非常有用
display_errors = Off

再来看一下 PHP 与 Apache 的整合配置文件:

$ sudo nano -w /etc/apache2/other/php5.conf
<IfModule php5_module>
    AddType application/x-httpd-php .php 
    AddType application/x-httpd-php-source .phps

    <IfModule dir_module>
        DirectoryIndex index.html index.php
    </IfModule>
</IfModule>

为了让所有的配置生效,需运行

$ sudo apachectl restart

重启 Apache,这样 PHP 就可以用了。

为了测试 Apache 服务器上的 PHP 是否正常工作,可在终端中运行

$ mkdir -p ~/Sites

来创建 Apache 的用户级根目录,随后再在用户级根目录中新建一个 info.php 文件

$ cat > info.php << EOF
<?php
    phpinfo();
?>
EOF

不妨假设 Mac OS X 系统用户 james 便是 Apache 服务的主要使用者,以上 Apache 的用户级根目录都是在 james 用户的家目录创建的。于是,在 Mac OS X 的浏览器 Safari 的地址栏中输入 http://127.0.0.1/~james/info.php,或者

$ open http://127.0.0.1/~james/info.php &

便会看到有关 PHP 的信息,比如 Mac OS X 10.9 中内置 PHP 版本号是 5.3.13。

三、安装 MySQL

由于 Mac OS X 没有内置 MySQL,所以需要手动安装,可从 MySQL 的官方网站 http://mysql.com/downloads/mysql/MySQL 下载。目前 MySQL 的最稳定版本是 5.6,选择合适版本,如这里选择了 mysql-5.6.16-osx10.7-x86_64.dmg。进入下载页面,会提示注册 Oracle 帐号或者以 Oracle 帐号登录;当然,也可选择 “No thanks, just start my download.” 直接下载,例如

$ curl -O http://dev.mysql.com/get/Downloads/MySQL-5.6/mysql-5.6.16-osx10.7-x86_64.dmg

打开下载的 dmg 文件,会发现里面有 4 个文件,分别是 mysql-5.6.16-osx10.7-x86_64.pkg、MySQLStartupItem.pkg、MySQL.prefPane 与 ReadMe.txt。首先点击安装 mysql-5.6.16-osx10.7-x86_64.pkg,这是 MySQL 主安装包。一般情况下,安装文件会自动把 MySQL 主程序安装到 /usr/local 下。为了让 MySQL 在 Mac OS X 开机时自动启动,安装包里提供了 MySQLStartupItem.pkg,安装它。有了它,可以在终端控制 MySQL 的运行、重启以及关闭之类,例如

$ sudo /Library/StartupItems/MySQLCOM/MySQLCOM start
$ sudo /Library/StartupItems/MySQLCOM/MySQLCOM restart
$ sudo /Library/StartupItems/MySQLCOM/MySQLCOM stop

若想以图形界面方式管理 MySQL 的启动,可安装包里的 MySQL.prefPane。安装它之后,就可在“系统设置偏好”中看到 MySQL 的图标,通过它就可以控制 MySQL 是否开启以及开机时是否自动运行。另外,使用 PHP 连接 MySQL 可能会报错

Can’t connect to local MySQL server through socket ‘/var/mysql/mysql.sock‘

或使用 localhost 无法连接 MySQL 而需要 127.0.0.1,原因是连接时 PHP 默认去找 /var/mysql/mysql.sock,但 MAC 版的 MySQL 改动了文件位置,放在 /tmp 下了。处理办法是按如下修改 php.ini:

$ nano -w /etc/php.ini
mysql.default_socket = /tmp/mysql.sock

到这里 MySQL 就基本安装完毕了。 通过运行

$ sudo echo /usr/local/mysql/bin >> /etc/paths.d/80-mysql

将 mysql 的路径加入系统环境变量 PATH 中;当然,也可以代之以用户级环境变量设置,例如

$ echo "export PATH=/usr/local/mysql/bin:\$PATH" >> ~/.bashrc'

这样就可以在终端中比较简单地通过命令进行相应的操作。 在 MySQL 没有启动时,直接运行 mysql 或 mysqladmin 命令会提示

Can’t connect to local MySQL server through socket ‘/tmp/mysql.sock’ (2)

这就需要我们先通过控制面板或者直接运行

$ sudo /usr/local/mysql/support-files/mysql.server start
$ sudo /usr/local/mysql/support-files/mysql.server restart

命令来启动 MySQL,之后再运行 mysql 或 mysqladmin 命令就正常了。比如安装完毕后,MySQL 的 root 默认密码为空,如果要设置密码可以在终端运行

$ mysqladmin -u root password "mysqlpassword"

来设置,其中 mysqlpassword 即 root 的密码。再如查看 MySQL 的版本

$ mysql -V

注意:Mac OS X 的升级或其他原因可能会导致 MySQL 启动或开机自动运行时,在 MySQL 操作面板上会提示 “Warning:The /usr/local/mysql/data directory is not owned by the ‘mysql’ or ‘_mysql’”,这应该是某种情况下导致 /usr/local/mysql/data 的宿主发生了改变,只需要运行

$ sudo chown -R _mysql /usr/local/mysql/data

即可。 MySQL 的默认日志位于它的数据目录,也即 /usr/local/mysql/data 之中。不过默认的错误日志文件名是主机名生成的,稍作配置

$ sudo nano -w /usr/local/mysql/my.cnf
[mysqld]
log-error=/usr/local/mysql/data/mysqld.log

由于它与系统目录分离,因此 mysql 不会自动清除日志,可以使用它自带的 mysql-log-rotate 脚本,例如

$ sudo /usr/local/mysql/support-files/mysql-log-rotate

或手动编写脚本清除旧日志。

四、MAMP 的简单应用

1、WordPress 的配置

先通过下述命令行为 WordPress 创建一个名为 db_wordpress 的数据库,并设置数据库用户 wordpress_user、密码为 654321 以及对 WordPress 数据库赋予所有权限:

$ sudo mysql -uroot -p
mysql> create database db_wordpress;
mysql> grant all privileges on db_wordpress.* to 'wordpress_user'@'127.0.0.1' identified by '123456';
mysql> FLUSH PRIVILEGES;
mysql> EXIT

数据库创建完成之后,开始安装

$ curl -O http://wordpress.org/latest.zip
$ sudo unzip latest.zip -d /Library/WebServer/Documents/
$ sudo mv /Library/WebServer/Documents/wordpress/wp-config-sample.php /Library/WebServer/Documents/wordpress/wp-config.php

接着根据前面创建的数据库信息配置 WordPress:

$ sudo nano -w /Library/WebServer/Documents/wordpress/wp-config.php

// ** MySQL settings – You can get this info from your web host ** //
/** The name of the database for WordPress */
define(‘DB_NAME’, ‘db_wordpress‘);

/** MySQL database username */
define(‘DB_USER’, ‘wordpress_user‘);

/** MySQL database password */
define(‘DB_PASSWORD’, ‘123456‘);

/** MySQL hostname */
define(‘DB_HOST’, ‘127.0.0.1‘);

为了让所有的 WordPress 设置生效,需重启 Apache

$ sudo apachectl restart

在浏览器输入 http://127.0.0.1/wordpress 进入 WordPress;或者

$ open http://127.0.0.1/wordpress &

第一次进入 WordPress 时,需要完成它的初始化安装。欢迎来到 WordPress 的世界,当然,还有后续的管理工作要做,例如

$ sudo nano -w /Library/WebServer/Documents/wordpress/.htaccess
Options +FollowSymLinks

有关这些的介绍,请查阅官网的相关介绍。

2、MediaWiki 的配置

先为 MediaWiki 创建一个数据库,也即

$ sudo mysql -uroot -p
mysql> create database db_mediawiki;
mysql> grant all privileges on db_mediawiki.* to 'mediawiki_user'@'127.0.0.1' identified by '654321';
mysql> FLUSH PRIVILEGES;
mysql> EXIT

创建了名为 db_mediawiki 的数据库,设置用户 mediawiki_user,密码为 654321,对 MediaWiki 数据库赋予所有权限。数据库创建完成之后,开始安装 MediaWiki:

$ curl -O http://releases.wikimedia.org/mediawiki/1.22/mediawiki-1.22.3.tar.gz
$ tar zxvf mediawiki-1.22.3.tar.gz -C ~/Sites/

重启 Apache

$ sudo apachectl restart

让所有的 MediaWiki 设置生效。由于 MediaWiki 是安装在 Apache 的用户级根目录中,需在浏览器中输入 http://127.0.0.1/~james/mediawiki,或者

$ open http://127.0.0.1/~james/mediawiki 

第一次打开 MediaWiki 会需要输入相关信息,并点击 Install/Upgrade Database 完成最后的安装。安装完成之后,会生成 Localsetting.php。将它下载到本地,再将它复制到 ~/Sites/mediawiki 目录,也即

$ cp /path/to/Localsetting.php ~/Sites/mediawiki

设置访问权限如下

$ sudo nano -w /etc/apache2/users/mediawiki.conf
 Alias /mediawiki "/Users/james/Sites/mediawiki"

 <directory "/Users/james/Sites/mediawiki/">
       Options Indexes MultiViews FollowSymLinks
       AllowOverride None
       Order allow,deny
       Allow from all

 <directory "/Users/james/Sites/mediawiki/upload/">
    AllowOverride None
    AddType text/plain .html .htm .shtml
 # php_admin_flag engine off  # This doesn't seem to work.

  RewriteEngine on
  RewriteRule ^/wiki/en/(.*)$ /mediawiki/wiki.phtml?title=$1

至此,MediaWiki 站点基本完工了。

3. phpBB3 的配置

先为 phpBB3 创建数据库
$ mysql -u root -p
mysql> create database db_phpdb3;
mysql> grant all privileges on db_phpbb3.* to 'phpbb3_user'@'127.0.0.1' identified by '654123';
mysql> FLUSH PRIVILEGES;
mysql> EXIT
现在开始搭建 phpBB 论坛,目前 phpBB 的稳定版本是 3.0.12:
$ curl -O -J -L http://prdownloads.sourceforge.net/phpbb/phpbb-3.0.12.tar.bz2
将解压的 phpBB3 目录放到 ~/Sites 下:
$ tar jxvf phpbb-3.0.12.tar.bz2 -C ~/Sites
$ chmod 644 ~/Sites/phpbb/config.php
$ open http://127.0.0.1/~james/phpbb &
填写所连接数据库以及用户信息等。填写完成后开始安装。完成最后的安装之前,别忘了先将 phpBB 下的 install 目录删除
$ rm -rf ~/Sites/phpbb/install
 
本地化 phpBB,先到官方网站下载并解压语言包,例如下载简体中文包
$ curl -O -J -L https://www.phpbb.com/customise/db/download/id_91456
$ tar jxvf mandarin_chinese_simpliefied_script_1.0.3.tar.bz2
$ cd mandarin_chinese_simpliefied_script_1.0.3/mandarin_chinese(simpliefied_script)_1.0.3
$ cp -r * ~/Sites/phpbb/
后续操作,请参考 https://www.phpbb.com/kb/article/how-to-install-a-language-pack。

Mar 19

一、网络设置相关

1、网卡的物理地址的动态重置

出于某些需求,例如网络中的 IP 地址或网络帐号与网卡物理地址绑定,使得多个设备无法切换上网,可尝试临时更改物理地址。不过,系统偏好设置是不能修改网卡物理地址的,这就是命令行的用武之地了。具体来说,若心中已有想修改的物理地址,例如 00:1f:3c:93:b5:99,可执行

$ sudo ifconfig en1 ether 00:1f:3c:93:b5:99

来临时修改网卡的物理地址;若没有物理地址,只是想临时启用尝试一下,可用 openssl 生成一个随机的物理地址:

$ openssl rand -hex 6 | sed 's/\(..\)/\1:/g; s/.$//'

当然,用 openssl 生成的物理地址可能会与网络中的网卡地址有冲突,在启用随机生成的网卡地址之前,最好先确认一下是否已有 IP 地址绑定该物理地址:

$ arp -a

2、主机名、计算机名的重置

默认的主机名让人非常无语,特别是出现了一些与 locale 有关的特殊字符。通常情况下,这些并不可见,但是,频繁使用终端时,就会被这些莫名其妙的主机名恶心到了。因此,修改主机名成了当务之急,不过修改的方法很简单。顺次点击左上角的苹果图标->系统偏好设置->共享,接着修改主机电脑名与局域网主机名即可。话说回来,Unix 的命令行是强大的,因此,主机名与计算机名的修改也可以通过命令行修改。

$ sudo scutil --set ComputerName newnameformacosx
$ sudo scutil --set HostName newhostnameformacosx

好了,查看一下修改是否成功:

$ scutil --get ComputerName
$ scutil --get HostName

将主机名放入 /etc/hosts 文件

$ echo 127.0.0.1 newhostnameformacosx >> /etc/hosts

重启网络服务让上述修改立马生效:

$ sudo dscacheutil -flushcache
$ sudo killall -HUP mDNSResponder

3、命令行下载工具的使用

众所周知,wget 是大多数 *nix 系统中标准的命令行下载工具。不过 Mac OS X 中并不自带 wget,取而代之的是命令行下载工具 curl。下面来介绍一下 curl 的基本用法,例如直接下载

$ curl -O http://wordpress.org/latest.zip

若想将下载文件重命名

$ curl -o wordpress-3.8.zip 'http://wordpress.org/latest.zip'

若想在下载过程中显示进度,可执行

$ curl -# -O http://wordpress.org/latest.zip

如果下载的 url 链接需要重定向,可试试下述方式

$ curl -L -o 'file.zip' 'http://example.com/download.php?fileID=foo'

若想节省带宽,可执行

$ curl -L -O --compressed 'http://example.com/large.report-tab.html'

若下载链接需要输入用户名与密码,可试试

$ curl -O ftp://james:123456@202.121.137.58:21/path/to/backup.tar.gz
$ curl -O http://james:123456@202.121.137.58/file/path/data.tar.gz

若下载的是带加密的链接,例如下载链接由 SSL/HTTPS/SFTP 提供,可试试

$ curl --ftp-ssl -u james:123456 -O ftp://202.121.137.58:21/backups/07/07/2012/mysql.blog.sql.tar.gz
$ curl -u james -O sftp://202.121.137.58/backups/data.tar.gz

实际上,curl 也可以上传文件,例如

$ curl -T wordpress.zip ftp://james:123456@202.121.137.58/path/to/backup/
$ curl -T data.tar.gz -u james sftp://202.121.137.58/

若想断点续传,可试试

$ curl -C - -u james -O sftp://202.121.137.58/backup.tar.gz
$ curl -C - -O http://202.121.137.58/file/path/data.tar.gz
$ curl -C - -u james -T data.tar.gz sftp://202.121.137.58/

4、系统更新与 Xcode.app 的命令行工具安装

通常,Mac OS X 上的软件更新是通过 App Store 完成,但是对于那些 geek 来说,可以试试下述命令:

$ sudo softwareupdate --list

会列出所有可能的更新,然后选择需要的更新进行安装

$ sudo softwareupdate --install SomeApp

若不想选择直接更新所有可能的更新,可执行

$ sudo softwareupdate -i -a

Xcode 是 Apple 推出的集成开发环境,它带有 Apple 改良过的 GCC 版本 llvm-gcc。安装它,非常容易,仅需去 App Store 下载 Xcode.app 即可。不过对于 Unix geek 来说,这是不能让人满意的。因为 Xcode.app 不自带命令行工具,需要单独安装它。在 Xcode 5.0 之前,命令行工具的安装非常简单,仅需打开 Xcode.app,然后点击偏好设置->下载->组件,然后选择 Xcode 命令行工具安装即可。但是自 Xcode 5.0 开始,安装 Xcode 的命令行工具,须在终端执行下述命令:

$ xcode-select --install

二、文件系统的相关操作

1、HFS+ 文件系统的扩展属性

在 Mac OS X 下的 HFS+ 文件系统上,文件经常会被附加上 Mac 专有的扩展属性。比如

$ ls -l
total 0
-rw-r--r--@ 1 daniel  staff  0 16 jul 19:28 1.txt
-rw-r--r--  1 daniel  staff  0 16 jul 19:28 2.txt

会有 @ 标志。这个属性是用户在 Finder 里对文件进行任意操作时就会附加上的。比如右键查看 Get Info,然后在 spotlight commands 里写上几个字再删掉,此时,该文件就会附带有 @ 属性。如果想手动去除掉文件的 @ 属性,可以使用命令 xattr。例如

$ xattr -l 1.txt
com.apple.metadata:kmditemfindercomment
$ xattr -d com.apple.metadata:kmditemfindercomment 1.txt
$ xattr -l 1.txt
$ ls -al 1.txt

此时就没有特殊属性了。

2、文件或文件夹的复制、打包与解包

由于 Mac OS X 文件系统中的扩展属性,若将 Mac OS X 系统中的文件直接用打包并释放到 Linux 系统中会造成莫名奇妙的错误,这就需要处理一下文件在复制、打包过程中的扩展属性。首先,Mac OS X 的 cp 命令有一个选项 -X,用它可在复制过程中忽略这些文件的扩展属性。因此,在打包前,先可复制出一份没有扩展属性的文件包,例如

$ cp -Xr /path/to/src - | tar czvf src.tar.gz -

当然,除去扩展属性之外,通常,文件直接打包作成中还会出现 Mac OS X 系统专有的隐藏文件,例如 _MACOSX、._Filename 与 .DS_Store 等。在打 zip 包时,可使用 -X 选项排除这些文件,例如

$ zip -r -X archive_name.zip folder_to_compress

不过,对于 *nix 系统中专有的打包命令 tar,可就没有 -X 选项这么好的东西了。好在 Mac OS X 还是提供了专门的方法,例如,在打 gzip 包时,可使用如下命令

$ COPYFILE_DISABLE=1 tar -zcvf archive_name.tar.gz folder_to_compress

打 bzip2 包也很简单:

$ COPYFILE_DISABLE=1 tar -jcvf archive_name.tar.bz2 folder_to_compress

对于其他格式的 tar 包照此处理。解包过程相对简单,这里附上一段与解包相关的 Bash 配置:

$ echo "# ignore useless invisible files or extended attributes on Mac OS X for cp and tar
export COPYFILE_DISABLE=true
# extract: Extract most know archives with one command
extract () {
    if [ -f $1 ] ; then
         case $1 in
            *.tar.bz2)   tar xjf $1     ;;
            *.tar.gz)    tar xzf $1     ;;
            *.bz2)       bunzip2 $1     ;;
            *.rar)       unrar e $1     ;;
            *.gz)        gunzip $1      ;;
            *.tar)       tar xf $1      ;;
            *.tbz2)      tar xjf $1     ;;
            *.tgz)       tar xzf $1     ;;
            *.zip)       unzip $1       ;;
            *.Z)         uncompress $1  ;;
            *.7z)        7z x $1        ;;
            *)     echo "'$1' cannot be extracted via extract()" ;;
         esac
    else
         echo "'$1' is not a valid file"
    fi
}" >> ~/.bashrc

3、DMG 格式文件的制作以及 ISO 转换互转

DMG 格式是 Mac OS X 中常用的打包格式,创建 DMG 格式的文件,可直接利用系统自带的磁盘工具(Disk Utils)完成。不过这里稍微介绍一下命令行 hdiutil 的用法。创建 DMG 格式的文件

$ hdiutil create -size 100M -stdinpass -format UDZO -srcfolder folder_to_compress archive_name.dmg

其中可以选用的 DMG 格式有 UDZO(压缩格式,默认)、UDRO(只读格式)、UDBZ(Better compressed image)、UDRW(可读写格式)UDTO(DVD 格式)。若想修改 DMG 文件的大小,可执行

$ hdiutil resize 150M /path/to/the/diskimage

若想修改 DMG 格式中的加密口令,可执行

$ hdiutil chpass /path/to/the/diskimage

挂载 DMG 格式的文件可用

$ hdiutil attach archive_name.dmg

它的挂载点在 /Volumes 目录的同名目录下

$ ls -lah /Volumes/archive_name/

卸载 DMG 文件的方法是:

$ hdiutil eject /Volumes/archive_name/

将 ISO 格式的文件转为 DMG 格式的文件

$ hdiutil convert /path/imagefile.iso -format UDRW -o /path/convertedimage.dmg

将 DMG 格式的文件转为 ISO 格式的文件

$ hdiutil convert /path/imagefile.dmg -format UDTO -o /path/convertedimage.cdr
$ hdiutil makehybrid /path/convertedimage.cdr -iso -joliet -o /path/convertedimage.iso

4、文件系统的挂载

大多数情况下,文件管理器 Finder 会自动发现诸如 USB 等外部设备,因此无须用户自行挂载分区;但是,有的时候,例如 Mac OS X 硬盘重新分区后,划出了 msdos 分区或者 ext4 等非 HFS 文件系统的分区,如果要读写这些分区,就需要手动挂载这些文件系统了。挂载文件系统的第一步是建立挂载点,例如

$ sudo mkdir /Volumes/Foo
$ sudo mkdir /Volumes/bar

接着查看有哪些设备需要手动挂载并挂载它们

$ ls /dev/disk*   
$ sudo mount -t msdos /dev/disk1s1 /Volumes/Foo
$ sudo mount -t hfs /dev/disk1s2 /Volumes/bar

最后,卸载这些不在需要的分区

$ diskutil eject /dev/disk1s1
$ diskutil eject /dev/disk1s2

4、文件或文件夹的隐藏属性

通常,为了保护 Mac OS X 系统中的文件不会被用户随意修改,文件管理器 Finder 是不会显示带隐藏属性的文件与系统文件。但是,有些时候,需要操作这些文件(夹), 此时就需要让 Finder 找到这些文件,方法也很简单。在 Finder 的菜单栏中点击 Go -> Go to folder,与之对应的,可使用快捷键 shift+command+G。 当然,如果对于 Mac OS X 自带的文件管理器不满意,可安装第三方文件管理器,例如 totalfinder。其实,单就隐藏文件来说,Mac OS X 还提供了其他方法,下面逐一介绍它们。

4.1 修改 Finder 配置文件

让 Finder 程序显示隐藏文件

$ defaults write com.apple.finder AppleShowAllExtensions TRUE

让 Finder 程序不显示隐藏文件

$ defaults write com.apple.finder AppleShowAllExtensions FALSE

Finder 的配置文件影响到整个文件系统,属于比较暴力的方法。

4.2、开启或关闭某些文件或文件夹的隐藏属性

用下面命令可以解除文件夹的隐藏属性:

$ chflags nohidden ~/Library

恢复文件夹的隐藏属性:

$ chflags hidden ~/Library

事实上,HFS+ 文件系统中文件和目录的隐藏属性也可通过 SetFile 命令来修改。例如,执行

$ mkdir -p ~/Sites
$ SetFile -a V ~/Sites

可开启文件夹 ~/Sites 的隐藏属性;而执行

$ SetFile -a v ~/Sites

可以关闭它的隐藏属性。

三、杂项

1、重置被遗忘的管理员密码

首先,在系统开机还未进入登录界面时按下 command+S 进入单用户模式。然后输入

$ mount -rw /

以读写方式挂载文件系统;接着重置管理员 james 的密码

$ passwd james

完成后,输入

$ reboot

重启开机即可。

2、重建 Spotlight 数据库

比较简单的办法是用鼠标顺次点击系统偏好-> Spotlight ->重建数据库;对于命令行发烧友来说,可以试试

$ sudo mdutil -E /

3、清理缓存

$ sudo purge

Mar 14

Mac OS X 中自带 emacs 与 vi 等编辑器,不过这些编辑器只是命令行模式的。换而言之,只能在打开 Terminal.app 等终端应用之后,输入命令行才能用。例如开启 emacs,在由 Terminal.app 提供终端中输入

$ emacs

启动的 Emacs 也只是以文本模式运行在终端环境中。但是对于习惯图形化操作的用户来说,必然会从例如 http://emacsformacosx.com 等网站下载安装 Emacs for Mac OS X 之类的图形化 Emacs,这些应用一般会提供一个名为 Emacs.app 的程序文件,只需要将该文件拖入 /Applications 文件夹即可完成安装。打开它们的办法如同打开 Terminal.app 一样,只需在 Launchpad 中点击 Emacs.app 对应的图标。 那么如何在命令行中开启图形化的 Emacs 呢?这就需要用到 Mac OS X 提供的命令行 open 了。更准确地说,若要在终端打开由 Emacs.app 提供的图形化 Emacs,可执行

$ open -a /Applications/Emacs.app

它本质上与

$ /Applications/Emacs.app/Contents/MacOS/Emacs

是一样的。此种方式打开的 Emacs 与在 Launchpad 中点击应用图标别无二致。另外,命令行 open 还能传递一些参数到 Emacs.app,例如很多时候,Emacs 的配置文件有问题,需要调试,通常需要将参数 --debug-init 传给 Emacs,若直接在终端执行

$ emacs --debug-init

恐怕启动的并非是我们需要的 Emacs.app。为此,可执行

$ open -a /Applications/Emacs.app --args --debug-init

当然,若不嫌弃繁复的命令,也可

$ /Applications/Emacs.app/Contents/MacOS/Emacs --debug-init

其实,open 还有更多的功能,例如,还想多打开一个图形化 Emacs 实例,可执行

$ open -n /Applications/Emacs.app

为了免去命令行中每次输入那么多参数才能启动图形化 Emacs 的麻烦,建立 alias 是一个方法,例如

$ echo alias emacs='open -a /Applications/Emacs.app "$@"' >> ~/.bashrc

但是缺点也是显而易见的。下面介绍另一种图形化 Emacs 的打开方法,能够弥补 alias 的不足。先在家目录下建一个可执行文件目录,例如 ~/.local/bin,然后做一个 Bash 封装脚本:

$ mkdir -p ~/.local/bin
$ echo "#!/bin/bash
exec /Applications/Emacs.app/Contents/MacOS/Emacs $*" > ~/.local/bin/emacs
$ echo "#!/bin/bash
exec /Applications/Emacs.app/Contents/MacOS/bin/emacsclient --alternative-editor='' $*" > ~/.local/bin/emacsclient
$ chmod +x ~/.local/bin/emacs{,client}

由于启动的是图形化程序,需要将 ~/.local/bin 路径加至 PATH 变量以及 ~/.MacOSX/enviroment.plist,例如

$ cat >> ~/.bash_profile << EOF
export PATH=~/.local/bin:$PATH

## Enviroment Variables for GUI Apps
if [ ! -e $HOME/.MacOSX/environment.plist ]; then
	if [ ! -d $HOME/.MacOSX ]; then
		mkdir -p $HOME/.MacOSX
	fi
	touch $HOME/.MacOSX/environment.plist
fi
defaults write $HOME/.MacOSX/environment.plist PATH "$PATH"
EOF

这样便实现了 Emacs.app 替代 Mac OS X 自带命令行 emacs,也能在其他应用中直接调用 Emacs.app。

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
一切正常。