Feb 19

一、简介

GTK+ 是一套跨平台的图形用户界面(Graphical User Interface)开发工具包,按 LGPL 许可协议发布的。虽然最初是为 GIMP(GNU Image Manipulation Program) 写的,但早已发展为一个功能强大、设计灵活的通用图形库。特别是在 GTK+ 被 Linux 桌面项目 GNOME 选中使得它广为流传,成为 Linux 下开发图形用户界面应用程序的主流开发工具之一。当然 GTK+ 应用程序开发与运行并不要求必须在 Linux 上,事实上,GTK+ 早已经被成功地移植到了 Mac OS X 以及 MS Windows 上。在开发早期的 GIMP 版本时,Peter Mattis 和 Spencer Kimball 创建了 GTK(GIMP Toolkit) 工具包,作为 Motif 工具包的替代,后者在那个时候不是免费的。当 GTK 开发工具包获得了面向对象特性和可扩展性之后,才在名称后面追加上了符号 "+",也即 GTK+。

二、GCC 工具链

GCC(GNU Compiler Collections) 是 Linux 系统中默认的开发工具、Autotools 是 Linux 中开发大型项目管理工具。Red Hat 系中这些开发工具的安装可执行

$ sudo dnf install "Development Tools"

Debian 系可执行

$ sudo apt-get install build-essential

Gentoo 由于本身的理念就是编译所有的包,因此系统已经自带了 GCC 工具链,无须额外安装其他 GCC 开发工具。

三、C/C++ 的手册页

在编程的过程中有时会记不得某个函数的用法,此时查找手册页是比较快的。为了能够用命令行 man 查看 C/C++ 的函数,需要安装相关的手册页及其工具。在 Red Hat 系中执行

$ sudo dnf install man-pages libstdc++-docs

Debian 系可执行

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

Gentoo 中安装稍微麻烦一点,可执行

$ sudo sh -c 'echo "sys-devel/gcc doc cxx " >> /etc/portage/package.use'
$ sudo emerge -av1 gcc
$ sudo emerge -av man-pages man-pages-posix

手册页的索引由 mandb 命令管理,有时在安装了新的手册页后,可能需要更新一下索引才能用 man kman f 查询到函数,也即

$ mandb c

然后就可以查看这些文档了。比如,查看 fopen 的手册页:

$ man fopen

四、GTK+ 库的概述

GTK+ 是基于以下库开发的:

  • glib:GTK+ 与 GNOME 的底层核心库,主要提供了 C 数据结构、可移植封装、运行时功能接口,譬如事件循环、多线程、动态装载和对象机制等。换而言之,Glib 是 GTK+ 能够“面向对象”的基础。GTK+ 中与界面无关的底层部分基本都被并入 glib。GLib 库还进一步分离成 GIO、GObject 等库。GIO 专门处理输入输出流。而 GObject 则维护着 GTK+ 所使用的一套对象系统。正是 GObject 提供的面向对象的机制,使得 GTK+ 可绑定很多种开发语言,例如 C++、Python、Perl、Java、C#、PHP 等其他高级语言。
  • pango:国际化文本陈列及渲染库,它是 GTK+ 的文本与字体处理核心;
  • atk:可访问接口库,它可以让 GTK+ 程序很方便地使用屏幕阅读器、放大镜以及一些输入设备等;
  • cairo:过去 cario 被称为 Xr 或 Xr/Xc,它是一个跨平台的开放源代码的矢量图形函数库,可以提供高质量的显示和打印输出。通过 Glitz 函数库, Cairo 能使用 OpenGL 或 X Render 扩展的硬件加速功能来绘制图像,这基于 Cairo 的应用能在现代化的 3D 显示硬件上获得益处。
  • gdk-pixbuf:GDK(GDK 是 GTK+ 从窗口系统细节中提取出来的一组接口,可以直接访问窗口细节。实际上,GDK 是 GTK+ 用户界面图形库提供的一些底层“图形实现”和“窗口实现”的方法,在 Linux 中,GDK 是对 Xlib 库提供接口的封装。)的一个部分,提供了一组位图函数,包括位图变换、位图文件读写等等,用于加载图像和维护图像“缓存”的(pixel buffer)。

要装 GTK+,先安装这写库,当然它们又依赖其它一些库,在 Linux 系统中可完全交由 Linux 的包管理器处理。还有一些库是 GTK+ 运行依赖的,下面是几个重要的:

  • gettext:它是国际化库,主要用于制作多语言程序。运行时 gettext 自动识别操作系统语言,然后从已有语言包中选择一个最合适用户的语言。当操作系统上没有 gettext() 函数的时候需要安装它。
  • libiconv:它是字符集转换库,通常操作系统上没有提供 iconv() 函数的时候才会安装它。GTK+ 内部使用 UTF-8 字符集,有时需要字符集转换。
  • freetype:它是一个操作字体的函数库,不但可以处理点阵字体,也可以处理多种矢量字体,包括 truetype 字体,为上层应用程序提供了一个统一的调用接口。
  • fontconfig:它提供系统范围内字体设置、定制和允许应用程序访问的函数库。实际上,GTK+ 的字体绘制是通过 pango、freetype 与 fontconfig 三者协作来完成的。其中,fontconfig 负责字体的管理和配置,freetype 负责单个字符的绘制,pango 则完成对文字的排版布局。
  • libjpeg:它提供了 JPEG 算法压缩文件图形文件供 GTK+ 程序读写 JPEG 格式的图形文件;
  • libtiff:它是用操作 TIFF 格式(标记图象文件格式)的图形文件并为 GTK+ 程序读写 TIFF 格式的图形文件的库;
  • libpng:它是用来创建与操作 PNG 格式的图形文件并为 GTK+ 程序提供读写 PNG 文件的库。PNG 格式的图形文件是被设计来替代 GIF 格式的,它对于更小范围的 TIFF 格式是来说,有了很多的进步和拓展并且减少了关于专利权的麻烦。

五、GTK+ 的 C 开发包

目前,GTK+ 开发包有三个版本:GTK+ 1、GTK+ 2 与 GTK+ 3,在 Linux 系统上是可以共存的,但由它们开发的程序需要对应的 GTK+ 开发包才能正常编译与运行。现在 GTK+ 2 是主流,但都在向 GTK+ 3 过度。根据自己的需要选择 GTK+ 版本,这里就以 GTK+ 2 为例。安装 GTK+ 开发环境,在 Red Hat 系中执行

$ sudo dnf install gtk2-devel gtk2-devel-docs

Debian 系可执行

$ sudo apt-get install libgtk2.0-dev libgtk2.0-doc

Gentoo 中执行

$ sudo sh -c 'echo "x11-libs/gdk-pixbuf doc \
                    dev-libs/glib doc \
                    x11-libs/pango doc \
                    x11-libs/cairo doc \
                    dev-libs/atk doc \
                    x11-libs/gtk+ doc" >> /etc/portage/package.use'
$ sudo emerge -av gtk+

若在开发过程中需整合 GNOME 环境,在 Red Hat 系中执行

$ sudo dnf install libgnome-devel gnome-devel-docs

Debian 系可执行

$ sudo apt-get install gnome-devel gnome-devel-docs

Gentoo 中执行

$ sudo emerge -av gnome-devel-docs

六、GTK+ 应用程序接口文档查看器

在 GNOME 桌面中,查看 GTK+ 应用程序接口文档的查看器是 DevHelp。安装它的方法很简单,在 Red Hat 系中执行

$ sudo dnf install devhelp

Debian 系可执行

$ sudo apt-get install devhelp

Gentoo 中执行

$ sudo emerge -av devhelp

通常,这些 API 文档会随着开发工具包的安装会被放入 /usr/share/gtk-doc/ 目录下。有了 DevHelp,查看它们非常容易,只需要在应用程序列表中点击 Devhelp 图标,或者在终端模拟器中执行

$ devhelp

八、pkg-config 的安装与使用

pkg-config 是编译器的辅助工具,可以帮助 GCC 找到所需要的头文件与库文件路径。它的安装非常简单。在 Red Hat 系中执行

$ sudo dnf install pkg-config

Debian 系可执行

$ sudo apt-get install pkg-config

Gentoo 中执行

$ sudo emerge -av dev-util/pkgconfig

现在试试 pkg-config,先查看 Linux 系统中是否安装 glib 库:

$ pkg-config --list-all | grep -i glib

若已安装,例如 glib-2.0,接着查看一下所安装的 glib 的具体版本:

$ pkg-config --modversion glib-2.0

再来列出 GCC 所需要的 glib-2.0 头文件所在目录

$ pkg-config --cflags glib-2.0

接着列出 GCC 所需要的 glib-2.0 库文件所在目录

$ pkg-config --libs glib-2.0

当然 pkg-config 无法智能到无所不知的地步,它是通过存放在标准目录 /usr/lib/pkgconfig 下的 .pc 文件来查找 GCC 所需头文件与库文件路径的。当然,也可以通过设置环境变量 PKG_CONFIG_PATH 让 pkg-config 找到非标准目录下的 .pc 文件,在这些文件里同样记录了 GCC 所需要的头文件和库文件所在的路径。例如

$ export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig
$ export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib

另外,值得提到一下 GTK+ 1 自带的工具 gtk-config,它与 pkg-config 的运作机制相像,但显然已被 pkg-config 取代。

九、GTK+ 的基本概念与约定

首先来解释 GTK+ 中几个基本的概念,以方便将来的分析。

  • 物件(GtkWidget):GTK+ 中每一个窗口里的组成要素都被视为一个物件,如按钮、文本等等,窗口本身也是一个物件。总之 GTK+ 的界面就是由物件构成的。注意,物件都使用指针来管理,物件外在表现就是一个特定类型的指针。
  • 容器(GtkContainer):物件里的一大类,容器的特点是其内部能够容纳其他物件。容器最基本的功能之一是将各种物件良好地组织起来。 GTK+ 的容器能在大小改变时自动调整内含物件的大小,这使得 GTK+ 能够很智能地相应窗口或其他物件的大小改变。这为我们提供了很大的方便,往往我们不需要指定某个物件的大小,只需说明他所在的容器位置, GTK+ 会把物件的实际位置和大小自动计算出来。
  • 继承、组合:虽然是 C 语言写的,但 GTK+ 灵活地运用了面向对象思想。 GTK+ 的物件体系中就有继承、组合这样的关系,如窗口(GtkWindow)是由容器(GtkContainer)派生出来的。
  • 类型转换宏:C 语言本身没有“继承”这个概念,那么,如果把派生的物件直接当做基物件使用,会出现一个编译警告,即“隐式指针类型转换”,但不会出错。为了消除这个警告,需要做指针类型转换。一般情况下类型转换使用类型转换宏。类型转换宏内部会检查物件的继承关系,确定能否进行转换,然后再做显式类型转换。
  • 事件(event):用户的操作,比如按下某个按钮或快捷键,被视为一个事件。
  • 信号(signal):GTK+ 是基于信号回调(signal-slot)机制的。信号捆绑了一个事件和一个函数,在用户触发这个事件时,这个函数会被调用一次。从这个角度来说, GTK+ 是基于物件的,即程序围绕物件属性、事件、方法进行。
  • 主循环(main loop):GTK+ 程序在一个主循环中运行。当一个事件被触发时,它将被插入队列中;在主循环中被触发的事件会被逐个处理(和这个事件绑定的函数被逐个调用);没有事件被触发时,程序就处于等待状态,等待下一个事件被用户触发。直到退出主循环的函数被调用,GTK+ 程序才结束。

GTK+ 拥有开源软件的很多特点,比如结构高度严谨、可读性甚好。现在介绍一下 GTK+ 的关键字命名方式也即 GTK+ 命名规范,以便阅读一段 GTK+ 程序。

  • 普通变量类型名:全小写写法。其中以 "g" 开头属于 GLib 库,如 "gint";
  • 物件类型名:驼峰写法(首字母大写),以 "Gtk" 开头,形如 "GtkWindow"。在 GTK+ 内部,类型是像下面这样定义的(以 GtkWindow 为例)。
    typedef _GtkWindow GtkWindow
  • 函数名:小写夹下划线写法,以 "gtk_"、"g_" 为前缀,形如 "gtk_main()"、"g_print()"。如果是针对某类物件的函数,则前缀中还有物件类型名,形如 "gtk_window_new()"。
  • 常量名:大写夹下划线写法,以 "GTK_" 为前缀,形如 "GTK_WINDOW_TOPLEVEL"。
  • 类型转换宏:大写夹下划线写法,以 "GTK_" 为前缀。一般来说,宏名字和类型名相仿,比如要把 GtkWindow* 类型的物件转换为 GtkContainer* 类型,就使用宏 "GTK_CONTAINER()"。

GTK+ 本身只负责界面组织,它提供的函数大致可分为三类,物件(Widget)、对象(Object)和其它工具函数。物件就不多说了,GTK+ 中的对象是一些功能更加复杂的不可见元素,它们和界面息息相关,比如 GtkBuilder。工具函数提供一些与界面关系密切的实用功能,比如剪贴板读写。

十、GTK+ 开发环境的简单测试

GTK+ 安装完成后,做个测试程序,代码如下

$ cat hellogtk.c

#include <gtk/gtk.h>

void hello(GtkWidget *widget,gpointer data)
{
    g_print("Hello GTK+!\n");
}

gint delete_event(GtkWidget *widget,GdkEvent *event,gpointer data)
{
    g_print ("delete event occurred\n");
    return(TRUE);
}

void destroy(GtkWidget *widget,gpointer data)
{
    gtk_main_quit();
}

int main( int argc, char *argv[] )
{
    GtkWidget *window;
    GtkWidget *button;
    gtk_init (&argc, &argv);
    window=gtk_window_new (GTK_WINDOW_TOPLEVEL);
    gtk_signal_connect (GTK_OBJECT(window),"delete_event",GTK_SIGNAL_FUNC(delete_event),NULL);
    gtk_signal_connect (GTK_OBJECT (window), "destroy",GTK_SIGNAL_FUNC (destroy), NULL);
    gtk_container_set_border_width (GTK_CONTAINER (window), 10);
    button = gtk_button_new_with_label ("Hello Ubuntu!");
    gtk_signal_connect (GTK_OBJECT (button), "clicked",GTK_SIGNAL_FUNC (hello), NULL);
    gtk_signal_connect_object (GTK_OBJECT (button), "clicked",
                                                 GTK_SIGNAL_FUNC(gtk_widget_destroy),GTK_OBJECT (window));
    gtk_container_add (GTK_CONTAINER (window), button);
    gtk_widget_show (button);
    gtk_widget_show (window);   /*显示一个窗口*/
    gtk_main();   /*进入主循环*/
    return(0);
}

用下面命令编译运行

$ gcc hellogtk.c -o hellogtk `pkgconfig --cflags --libs gtk+2.0`
$ ./hellogtk

会显示带有一个按钮的窗口,点击按钮以后窗口关闭,命令行显示 Hello GTK+!

十一、安装 GTK+ 界面快速设计工具

Glade 是 GTK+ 的界面辅助设计工具,可以通过拖放控件的方式快速设计出用户界面,这样的优势在于在设计的同时能直观地看到界面上的控件,并且可以随时调整界面上的设计。用 Glade 设计的图形用户界面是以 XML 格式的文件保存,它描述了控件的结构、每个控件的属性。用户可以动态加载这个界面文件。而且,界面和程序逻辑是完全分离,用户修改了界面,也不需要重新编译程序。Glade 有三个版本:基于 GTK+ 1 版本的 Glade、基于 GTK+ 2 及之后版本的 Glade2、Glade3。一般推荐使用 Glade3 设计 GTK+ 程序界面。

Glade 的布局文件有 2 种格式: Libglade、GtkBuilder。由于布局文件格式的不一样,最终使用的库函数不一样。选择 GtkBuilder 直接生成 XML 格式文件,但是后缀名仍是 .glade。如果选择 Libglade,可通过下述命令行

$ gtk-builder-convert

将它装换为 XML 格式文件。总的来说,推荐使用 GtkBuilder 格式的布局文件。

Glade 的安装很容易,不要要记住,若要使用 Libglade 格式的布局文件,需要安装 libglade 库。在 Red Hat 系中执行

$ sudo dnf install glade3 libglade2-devel

Debian 系可执行

$ sudo apt-get install glade libglade2-dev

Gentoo 中执行

$ sudo sh -c 'echo "dev-util/glade doc" >> /etc/portage/package.use'
$ sudo emerge -av dev-util/glade libglade

安装完成后,在应用程序列表中点击 Devhelp 图标,或者在终端模拟器中执行

$ glade

即可启动 Glade 工具。

1)Glade 画 UI,注意保存为 Libglade 格式,然后在下述 C 代码中使用该布局文件

$ cat libgladedemo.c

#include <glade/glade.h>
#include <gtk/gtk.h>

/**
 * 假设布局文件定义了一个名为 button1 的按钮,并且其 clicked 信号处理函数如下
 * 若是在 MS Windows 中,回调函数要加上修饰词 G_MODULE_EXPORT,也即
 */
/* G_MODULE_EXPORT */
void on_button1_clicked(GtkWidget* widget,gpointer data)
{
    g_print("hello, world!\n\r");
}

int main(int argc,char **argv)
{
    /* Libglade 类型,用于布局 */
    GladeXML *gxml;
    GtkWidget *window;
    gtk_init(&argc,&argv);

    /* 下面开始通过文件获取布局信息了 */
    gxml=glade_xml_new("glade.glade",NULL,NULL);
    /* 信号连接 */
    glade_xml_signal_autoconnect(gxml);

    /* 获取构件 */
    window=glade_xml_get_widget(gxml,"window1");  /* window1 是 glade3 中窗口的名字*/
    button = glade_xml_get_widget(gxml,"button1");  /* button1 是 glade3 中按钮的名字*/

    gtk_widget_show(window);
    gtk_main();
    return 0;
}

在编译代码时,加上 libglade-2.0,如:

$ gcc libgladedemo.c -o libgladedemo `pkg-config --cflags --libs gtk+-2.0 libglade-2.0`
$ ./libgladedemo

2)Glade 画 UI,注意保存为 GtkBuilder 格式,同样在 C 代码中使用该布局文件

$ cat gtkbuilderdemo.c

#include <gtk/gtk.h>

/**
 * 假设布局文件定义了一个名为 button1 的按钮,并且其 clicked 信号处理函数如下
 * 若是在 MS Windows 中,回调函数要加上修饰词 G_MODULE_EXPORT,也即
 */
/* G_MODULE_EXPORT */
void on_button1_clicked(GtkWidget* widget,gpointer data)
{
    g_print("Hello World !\r\n");
}

int main (int argc, char **argv)
{
    /* GtkBuilder 类型,用于布局 */
    GtkBuilder *gtkBuilder;
    GtkWidget *mainwin;
    /* Initialize the widget set */
    gtk_init (&argc, &argv);
    /* Create the main window */
    /* 通过 main.glade 建立布局 */
    gtkBuilder= gtk_builder_new();
    gtk_builder_add_from_file(gtkBuilder,"main.glade",NULL);

    /* 连接信号,信号名在布局文件中定义 */
    gtk_builder_connect_signals (gtkBuilder, NULL);

    /* 通过布局文件获得构件,此处为一个对话框型的窗体 */
    mainwin= GTK_WIDGET(gtk_builder_get_object(gtkBuilder,"dialog1"));
    button = GTK_WIDGET(gtk_builder_get_object (builder, "button1"));
    g_object_unref ( G_OBJECT(gtkBuilder) );
    /* Show the application window */
    gtk_widget_show_all ( mainwin );
    /* Enter the main event loop, and wait for user interaction */
    gtk_main ();
    /* The user lost interest */

    return 0;
}

在编译代码时,无须增加额外库,也即:

$ gcc gtkbuilderdemo.c -o gtkbuilderdemo `pkg-config --cflags --libs gtk+-2.0`
$ ./gtkbuilderdemo

十二、GTK+ 的其他语言开发包

将 GTK+ 与 C 语言的近亲 C++ 绑定,便是 GTKmm。Glade 还是 GTKmm 的界面快速构建工具,推荐使用 Glade3。若使用 libglade 格式的界面布局文件,需额外安装相应的库。在 Red Hat 系中执行

$ sudo dnf install gtkmm24-devel gtkmm24-docs libglademm24-devel

Debian 系可执行

$ sudo apt-get install libgtkmm-2.4-dev libgtkmm-2.4-doc libglademm-2.4-dev libglademm-2.4-doc

Gentoo 中执行

$ sudo sh -c 'echo "dev-cpp/libsigc++ \
                    dev-cpp/glibmm doc \
                    dev-cpp/pangomm doc \
                    dev-cpp/cairomm doc \
                    dev-cpp/atkmm doc \
                    dev-cpp/gtkmm doc \
                    dev-cpp/libglademm doc" >> /etc/portage/package.use'
$ sudo emerge -av gtkmm libglademm

测试一下 GTKmm 开发环境,下面是一个简单 Hello GTKmm 的例子

$ cat hellogtkmm.cpp

#include <gtkmm.h>
#include <libglademm/xml.h>         /* 访问Glade文件所需的头文件 */
#include <iostream>                  /* 输出错误信息到控制台 */
#include <assert.h>                  /* assert()断言 */
 
using namespace Gnome::Glade;
 
class HelloApp: public Gtk::Main {    /* 继承“Gtk::Main”类 */
public:
    HelloApp(int argc, char *argv[]):
        Gtk::Main(argc,argv),             /* 必须在初始化列表中调用父类的构造函数 */
        main_window(0)                     /* 为主窗口的指针赋初值 */
    {
        try
        {
            /* 从同目录下的GLADE文件创建“Gnome::Glade::Xml”对象 */
            ref_xml = Xml::create("helloapp.glade");
        }
        catch(const XmlError& ex)
        {
            /*   出错时错误信息输出到控制台,并返回 */
            std::cerr << ex.what() << std::endl;
            return;
        }
   
        /*
          取得主窗口的指针,存入main_window变量中,并确保成功。
          main_window为0值表示失败,多是因为指定的控件名称不正确或不存在。
          第一个参数就是Glade文件中定义的控件名称,是字符串型。
        */
        ref_xml->get_widget("main_window", main_window);
        assert(main_window);
    }
 
    ~HelloApp()
    {
        /* 由于采用了智能指针,我们不需要管理资源的释放 */
    }
 
    show_window()
    {
        /*
          如果取得主窗口的指针成功,就调用父类的run()函数显示它,
          并进入监听事件的循环状态,当主窗口关闭时返回。
        */
        if (main_window) {
            run( *main_window );
        }
    }
   
protected:
    /* 通过它访问Glade文件的内容,是一种智能指针,能自动释放占用的资源 */
    Glib::RefPtr<Gnome::Glade::Xml> ref_xml;
   
    Gtk::Window* main_window;         /* 存储主窗口的指针 */
};
 
int main (int argc, char *argv[])
{
    /*
      可以看到,这跟“最简单的Gtkmm程序”非常相似。HelloApp继承自
      “Gtk::Main”类,也需要通过 argc 和 argv 两个参数进行实例化。
    */
    HelloApp app(argc, argv);
   
    /*
      在这个函数中调用Gtk::Main::run函数来实现与上面相同的功能。   
      这里不需要窗口对象作参数,因为它已封装在HelloApp类中了。
    */
    app.show_window();
   
    return 0;
}

$ g++ hellogtkmm.cpp -o hellogtkmm `pkg-config --cxxflags --libs gtkmm-2.0`

$ ./hellogtkmm

将 GTK+ 与 Python 语言绑定,便是 PyGTK。Glade 仍是 PyGTK 的界面快速构建工具,若使用 libglade 格式的界面布局文件,需额外安装相应的库。在 Red Hat 系中执行

$ sudo dnf install pygtk2-devel pygtk2-docs pygtk2-libglade

Debian 系可执行

$ sudo apt-get install python-gtk2-dev python-gtk2-doc python-glade2

Gentoo 中执行

$ sudo sh -c 'echo "dev-python/pygtk doc \
                    dev-python/pygobject doc \
                    dev-python/pycairo doc" >> /etc/portage/package.use'
$ sudo emerge -av pygtk pygtk2-libglade

还需测试一下 PyGTK 开发环境,下面是一个简单 Hello PyGTK 的例子

$ cat hellopygtk.py

from gtk import * 
 
window = GtkWindow(WINDOW_TOPLEVEL) # 创建一个顶层窗口 
window.set_title("Hello, world!") 
window.connect("destroy", mainquit) # 将注销事件与mainquit处理连接 
 
window.show() # 显示主窗口 
mainloop() # 进入事件循环 

$ python hellopygtk.py

附录

作为跨平台的图形用户界面开发工具,GTK+ 程序在非 Unix/Linux 平台上并非原生样式。若有这种需要,wxWidgets 便是一个更好的选择,它是由 C++ 开发的跨平台的图形用户界面开发包。另外,基于 wxWidgets 工具包,还开发了 C/C++ 集成开发环境 Code::Blocks,它是跨平台的集成开发环境。该集成开发环境还为 wxWidgets 图形界面开发提供了快速开发插件 wxSmith。在 Linux 平台上,为了让图形用户界面显示 GTK+ 样式,wxWidgets 封装了 GTK+ 包,因此 wxWidgets 在 Linux 平台上也被命名为 wxGTK。好了,要在 Linux 平台上开发 wxWidgets 程序,安装所有的工具包了。在 Red Hat 系中执行

$ sudo dnf install wxGTK-devel wxGTK-docs codeblocks codeblocks-contrib

Debian 系可执行

$ sudo apt-get install libwxgtk3.0-dev wx3.0-doc wx3.0-headers wx3.0-i18n wx3.0-examples codeblocks codeblocks-contrib

Gentoo 中执行

$ sudo sh -c 'echo "dev-util/codeblocks doc contrib " >> /etc/portage/package.use'
$ sudo emerge -av wxGTK codeblocks

在 Gentoo 上使用 wxWidgets,还需要用 eselect 的选择合适的版本

$ sudo eselect list wxWidgets
$ sudo eselect wxWidgets set 1

在 Linux 使用 wxWidgets 的方法非常简单,它提供了 wx-config 工具帮助 GCC 查找头文件与库文件。例如

$ wx-config --cppflags
$ wx-config --libs

再来看一个编译 wxWidgets 程序的实例

$ g++ hellowx.cpp -o hellowx `wx-config --cppflags --libs`
$ ./hellowx

与 GTK+ 类似,wxWidgets 也有其他语言的绑定,这里介绍一下 wxWidgets 与 Python 的绑定,也即 wxPython 开发包,对应的界面快速设计工具是 wxGlade。它们的安装非常简单,Red Hat 系中执行

$ sudo dnf install wxpython wxpython-devel wxpython-docs wxGlade

Debian 系可执行

$ sudo apt-get install python-wxgtk3.0 python-wxtools python-wxversion python-wxglade

Gentoo 中执行

$ sudo emerge -av wxPython wxglade

测试一下 wxPython 开发环境,下面是一个简单 Hello wxPython 的例子

$ cat hellowxpy.py

import sys, os
from wxPython.wx import *
 
class main_window(wxFrame):
      def __init__(self, parent, id, title):
      	  wxFrame.__init__(self, parent, -1, title, size = (200, 100),style=wxDEFAULT_FRAME_STYLE|wxNO_FULL_REPAINT_ON_RESIZE)
      	  self.control = wxTextCtrl(self, -1, style=wxTE_MULTILINE)
      	  self.Show(true)
 
class App(wxApp):
      def OnInit(self):
      	  frame = main_window(None, -1, "wxPython: (A Demonstration)")
      	  self.SetTopWindow(frame)
      	  return true
 
app = App()
app.MainLoop()

$ python hellowxpy.py
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 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 标记不仅可以拿来控制包的某些依赖关系,也能拿来启用包的某些互斥特性,这使得我们可以随心所欲的调整包的功能。