蚊章汇 - 配置
type: channel
link: https://linuxcn.bwsl.wang/tag/%E9%85%8D%E7%BD%AE/
items: 使用 Java 解析 XML 文件
items: 如何解析 Bash 程序的配置文件
items: 7个管理家目录的 Git 技巧
items: ifdex： 一个由 ESR 出品的给代码考古学家的工具
items: 树莓派使用实例之：2 Pi R 第二篇：Web服务器
items: 戴文的Linux内核专题：18 配置内核 (14)
items: 戴文的Linux内核专题：15 配置内核 (11)
items: Debian/Ubuntu系统中安装和配置UFW－简单的防火墙
items: 每日Ubuntu小技巧：合上笔记本，系统不睡眠
items: 在openSUSE 13.1中配置FTP服务器

使用 Java 解析 XML 文件
type: item
date: 2022-03-22T17:16:00+08:00
description: 在你使用 Java 编写软件时实现持久化配置。当你编写一个应用时，你通常都会希望用户能够定制化他们和应用交互的方式，以及应用与系统进行交互的方式。这种方式通常被称为 “ 偏好 preference ” 或者 “ 设置 setting ”，它们被保存在一个 “偏好文件” 或者 “配置文件” 中，有时也直接简称为 “ 配置 config ”。配置文件可以有很多种格式，包括 INI、JSON、YAML 和 XML。每一种编程语言解析这些格式的方式都不同。本文主要讨论，当你在使用 Java 编程语言 来编写软件时，实现持久化配置的方式。选择一个格式编写配置文件是一件相当复杂的事情。我曾经试过把配置项使用逗号分隔保存在一个文本文件里，也试过把配置项保存在非常详细的 YAML 和 XML 中。对于配置文件来说，最重要是要有一致性和规律性，它们使你可以简单快速地编写代码，从配置文件中解析出数据；同时，当用户决定要做出修改时，很方便地保存和更新配置。目前有 几种流行的配置文件格式。对于大多数常见的配置文件格式，Java 都有对应的 库 library 。在本文中，我将使用 XML 格式。对于一些项目，你可能会选择使用 XML，因为它的一个突出特点是能够为包含的数据提供大量相关的元数据，而在另外一些项目中，你可能会因为 XML 的冗长而不选择它。在 Java 中使用 XML 是非常容易的，因为它默认包含了许多健壮的 XML 库。XML 基础讨论 XML 可是一个大话题。我有一本关于 XML 的书，它有超过 700 页的内容。幸运的是，使用 XML 并不需要非常了解它的诸多特性。就像 HTML 一样，XML 是一个带有开始和结束标记的分层标记语言，每一个标记（标签）内可以包含零个或更多数据。下面是一个 XML 的简单示例片段：<xml> <node> <element>Penguin</element> </node> </xml> 在这个 自我描述的 self-descriptive 例子中，XML 解析器使用了以下几个概念： 文档 Document ：<xml> 标签标志着一个 文档 的开始，</xml> 标签标志着这个文档的结束。 节点 Node ：<node> 标签代表了一个 节点。 元素 Element ：<element>Penguin</element> 中，从开头的 < 到最后的 > 表示了一个 元素。 内容 Content ： 在 <element> 元素里，字符串 Penguin 就是 内容。不管你信不信，只要了解了以上几个概念，你就可以开始编写、解析 XML 文件了。创建一个示例配置文件要学习如何解析 XML 文件，只需要一个极简的示例文件就够了。假设现在有一个配置文件，里面保存的是关于一个图形界面窗口的属性：<xml> <window> <theme>Dark</theme> <fullscreen>0</fullscreen> <icons>Tango</icons> </window> </xml> 创建一个名为 ~/.config/DemoXMLParser 的目录：$ mkdir ~/.config/DemoXMLParser 在 Linux 中，~/.config 目录是存放配置文件的默认位置，这是在 自由桌面工作组 的规范中定义的。如果你正在使用一个不遵守 自由桌面工作组 Freedesktop 标准的操作系统，你也仍然可以使用这个目录，只不过你需要自己创建这些目录了。 复制 XML 的示例配置文件，粘贴并保存为 ~/.config/DemoXMLParser/myconfig.xml 文件。使用 Java 解析 XML如果你是 Java 的初学者，你可以先阅读我写的 面向 Java 入门开发者的 7 个小技巧。一旦你对 Java 比较熟悉了，打开你最喜爱的集成开发工具（IDE），创建一个新工程。我会把我的新工程命名为 myConfigParser。刚开始先不要太关注依赖导入和异常捕获这些，你可以先尝试用 javax 和 java.io 包里的标准 Java 扩展来实例化一个解析器。如果你使用了 IDE，它会提示你导入合适的依赖。如果没有，你也可以在文章稍后的部分找到完整的代码，里面就有完整的依赖列表。Path configPath = Paths.get(System.getProperty("user.home"), ".config", "DemoXMLParser"); File configFile = new File(configPath.toString(), "myconfig.xml"); DocumentBuilderFactory factory = DocumentBuilderFac…

如何解析 Bash 程序的配置文件
type: item
date: 2021-07-09T00:36:38+08:00
description: 将配置文件与代码分离，使任何人都可以改变他们的配置，而不需要任何特殊的编程技巧。将程序配置与代码分离是很重要的。它使非程序员能够改变配置而不需要修改程序的代码。如果是编译好的二进制可执行文件，这对非程序员来说是不可能的，因为它不仅需要访问源文件（我们在开源程序中会这样），而且还需要程序员的技能组合。很少有人有这种能力，而且大多数人都不想学习它。对于像 Bash 这样的 shell 语言，由于 shell 脚本没有被编译成二进制格式，所以从定义上讲，源码是可以访问的。尽管有这种开放性，但对于非程序员来说，在 shell 脚本中钻研和修改它们并不是一个特别好的主意。即使是经验丰富的开发人员和系统管理员，也会意外地做出一些导致错误或更糟的改变。因此，将配置项放在容易维护的文本文件中，提供了分离，并允许非程序员编辑配置，而不会有对代码进行意外修改的危险。许多开发者对用编译语言编写的程序都是这样做的，因为他们并不期望用户是开发者。由于许多相同的原因，对解释型 shell 语言这样做也是有意义的。通常的方式和其他许多语言一样, 你可以为 Bash 程序编写代码，来读取并解析 ASCII 文本的配置文件、读取变量名称并在程序代码执行时设置值。例如，一个配置文件可能看起来像这样：var1=LinuxGeek46 var2=Opensource.com 程序将读取文件，解析每一行，并将值设置到每个变量中。源引Bash 使用一种更简单的方法来解析和设置变量, 叫做 源引 sourcing 。从一个可执行的 shell 程序中获取一个外部文件是一种简单的方法，可以将该文件的内容完整地引入 shell 程序中。在某种意义上，这很像编译语言的 include 语句，在运行时包括库文件。这样的文件可以包括任何类型的 Bash 代码，包括变量赋值。（LCTT 译注：对于使用 source 或 . 命令引入另外一个文件的行为，我们首倡翻译为“源引”。）像往常一样，演示比解释更容易。首先，创建一个 ~/bin 目录（如果它还不存在的话），并将其作为当前工作目录（PWD）。Linux 文件系统分层标准 将 ~/bin 定义为用户存储可执行文件的适当位置。在这个目录下创建一个新文件。将其命名为 main，并使其可执行：[dboth@david bin]$ touch main [dboth@david bin]$ chmod +x main [dboth@david bin]$ 在这个可执行文件中添加以下内容：#!/bin/bash Name="LinuxGeek" echo $Name 并执行这个 Bash 程序：[dboth@david bin]$ ./main LinuxGeek [dboth@david bin]$ 创建一个新的文件并命名为 ~/bin/data。这个文件不需要是可执行的。在其中添加以下信息：# Sourced code and variables echo "This is the sourced code from the data file." FirstName="David" LastName="Both" 在 main 程序中增加三行，看起来像这样：#!/bin/bash Name="LinuxGeek" echo $Name source ~/bin/data echo "First name: $FirstName" echo "LastName: $LastName" 重新运行该程序：[dboth@david bin]$ ./main LinuxGeek This is the sourced code from the data file. First name: David LastName: Both [dboth@david bin]$ 关于源引还有一件非常酷的事情要知道。你可以使用一个单点（.）作为 source 命令的快捷方式。改变 main 文件，用 . 代替 source。#!/bin/bash Name="LinuxGeek" echo $Name . ~/bin/data echo "First name: $FirstName" echo "LastName: $LastName" 并再次运行该程序。其结果应该与之前的运行完全相同。运行 Bash每一台使用 Bash 的 Linux 主机（几乎所有主机都是，因为 Bash 是所有发行版的默认 shell），都包括一些优秀的、内置的源引示例。每当 Bash shell 运行时，它的环境必须被配置成可以使用的样子。有五个主要文件和一个目录用于配置 Bash 环境。它们和它们的主要功能如下：/etc/profile: 系统级的环境和启动程序/etc/bash…

7个管理家目录的 Git 技巧
type: item
date: 2021-04-20T17:52:33+08:00
description: 这是我怎样设置 Git 来管理我的家目录的方法。我有好几台电脑。一台笔记本电脑用于工作，一台工作站放在家里，一台树莓派（或四台），一台 Pocket CHIP，一台 运行各种不同的 Linux 的 Chromebook，等等。我曾经在每台计算机上或多或少地按照相同的步骤设置我的用户环境，也经常告诉自己让每台计算机都略有不同。例如，我在工作中比在家里更经常使用 Bash 别名，并且我在家里使用的辅助脚本可能对工作没有用。这些年来，我对各种设备的期望开始相融，我会忘记我在家用计算机上建立的功能没有移植到我的工作计算机上，诸如此类。我需要一种标准化我的自定义工具包的方法。使我感到意外的答案是 Git。Git 是版本跟踪软件。它以既可以用在非常大的开源项目也可以用在极小的开源项目而闻名，甚至最大的专有软件公司也在用它。但是它是为源代码设计的，而不是用在一个装满音乐和视频文件、游戏、照片等的家目录。我听说过有人使用 Git 管理其家目录，但我认为这是程序员们进行的一项附带实验，而不是像我这样的现实生活中的用户。用 Git 管理我的家目录是一个不断发展的过程。随着时间的推移我一直在学习和适应。如果你决定使用 Git 管理家目录，则可能需要记住以下几点。1、文本和二进制位置当由 Git 管理时，除了配置文件之外，你的家目录对于所有内容而言都是“无人之地”。这意味着当你打开主目录时，除了可预见的目录的列表之外，你什么都看不到。不应有任何杂乱无章的照片或 LibreOffice 文档，也不应有 “我就在这里放一分钟” 的临时文件。原因很简单：使用 Git 管理家目录时，家目录中所有 未 提交的内容都会变成噪音。每次执行 git status 时，你都必须翻过去之前 Git 未跟踪的任何文件，因此将这些文件保存在子目录（添加到 .gitignore 文件中）至关重要。许多 Linux 发行版提供了一组默认目录：DocumentsDownloadsMusicPhotosTemplatesVideos如果需要，你可以创建更多。例如，我把创作的音乐（Music）和购买来聆听的音乐（Albums）区分开来。同样，我的电影（Cinema）目录包含了其他人的电影，而视频（Videos）目录包含我需要编辑的视频文件。换句话说，我的默认目录结构比大多数 Linux 发行版提供的默认设置更详细，但是我认为这样做有好处。如果没有适合你的目录结构，你更会将其存放在家目录中，因为没有更好的存放位置，因此请提前考虑并规划好适合你的工作目录。你以后总是可以添加更多，但是最好先开始擅长的。2、、设置最优的 .gitignore清理家目录后，你可以像往常一样将其作为 Git 存储库实例化：$ cd $ git init . 你的 Git 仓库中还没有任何内容，你的家目录中的所有内容均未被跟踪。你的第一项工作是筛选未跟踪文件的列表，并确定要保持未跟踪状态的文件。要查看未跟踪的文件：$ git status .AndroidStudio3.2/ .FBReader/ .ICEauthority .Xauthority .Xdefaults .android/ .arduino15/ .ash_history [...] 根据你使用家目录的时间长短，此列表可能很长。简单的是你在上一步中确定的目录。通过将它们添加到名为 .gitignore 的隐藏文件中，你告诉 Git 停止将它们列为未跟踪文件，并且永远不对其进行跟踪：$ \ls -lg | grep ^d | awk '{print $8}' >> ~/.gitignore 完成后，浏览 git status 所示的其余未跟踪文件，并确定是否有其他文件需要排除。这个过程帮助我发现了几个陈旧的配置文件和目录，这些文件和目录最终被我全部丢弃了，而且还发现了一些特定于一台计算机的文件和目录。我在这里非常严格，因为许多配置文件在自动生成时会表现得更好。例如，我从不提交我的 KDE 配置文件，因为许多文件包含了诸如最新文档之类的信息以及其他机器上不存在的其他元素。我会跟踪我的个性化配置文件、脚本和实用程序、配置文件和 Bash 配置，以及速查表和我经常引用的其他文本片段。如果有软件主要负责维护的文件，则将其忽略。当对一个文件不确定时，我将其忽略。你以后总是可以取消忽略它（通过从 .gitignore 文件中删除它）。3、了解你的数据我使用的是 KDE，因此我使用开源扫描程序 Filelight 来了解我的数据概况。Filelight 为你提供了一个图表，可让你查看每个目录的大小。你可以浏览每个目录以查看占用了空间的内容，然后回溯调查其他地方。这是一个令人着迷的系统视图，它使你可以以全新的方式看待你的文件。使用 Filelight 或类似的实用…

ifdex： 一个由 ESR 出品的给代码考古学家的工具
type: item
date: 2015-10-04T01:47:17+08:00
description: Eric Raymond 写了一个工具，用来帮助那些无畏的“代码考古学家们”理解“古代”代码的结构。它叫做 ifdex，它的背后有一段故事，拿起你的 Fedora 和赶牛的鞭子，让我讲给你听……在开发 NTPsec 早期， 我们就决定替换它的构建系统——它是如此的难于理解和修改——严重的拖慢了我们的开发进度。古老的 autoconf 构建方式就像一个恐怖的爬行动物，而 NTP 更是一个极端的例子。不完善的宏技术定义了太多的配置符号，为了掌握这些接口，即使你查看了 config.h 也无济于事。尤其是当你要做一些大的修改时，这更是一个问题！我们的一个伙计 Amar Takhar，是 waf 构建系统的专家，当他初步提出迁移的想法时得到了我的积极响应。几个月之后，他就做出了一些 waf 功能，虽然还未完成，但是已经至少可以生成用于实际测试的二进制了。这里我说“未完成”的意思是，代码里面还有一些 waf 构建绝不会设置的 #define 。很多人绝对不会碰那些 autoconf 构建的东西，而另外一些人则不。那些从来用不到的配置开关迷失在大堆的系统头文件和编译器设置的 #define 条件中。我这里说的不是几个或几十个，我最终统计出了有超过 670 个不同的 #define 用在 #if/#ifdef/#ifndef/#elif 条件中，而这些条件，如 John D. Bell 指出的那样，有 2430 个之多。我需要一些办法来检查它们并分成不同的类型：有的来自系统头文件、有的是配置开关，以及其它的……所以我写了一个分析器，它可以对代码树解析每个编译时条件的符号，然后将它们分成单纯的列表或 GCC 类的文件/行错误信息，你可以用 Emacs 的编译模式逐个分析。为了降低干扰，它掌握着一个条件符号的长列表（大概200个），这些可以忽略掉。比如像 \_\_GNUC\_\_ 符号是 GCC 预定义，而 O\_NONBLOCK 宏用于几种系统调用等等。这些符号分成几组，你可以使用命令行选项分别忽略它们。所以，如果你希望忽略列表中所有标准的 POSIX 宏而想看到操作系统相关的任何东西，那就可以做到了。另外一个重要的功能是你可以构造你自己的排除列表及注释。这样当我探索 NTP 编译条件的黑暗森林时，所构造的越来越大的排除列表就代表了我已经了解了的条件符号。最终（我希望）未知符号的报告将缩减为空，那么我就已经了解了所有配置开关的确切意义了。目前为止，我已经搞定了它们之中的 300 个，还有 373 个。这是我用我的漂亮工具在一周内完成的主要工作。噢，从来没有人说过代码考古是如此的容易。最后， ifdef 的主页是： http://www.catb.org/esr/ifdex/，代码库在这里：https://gitlab.com/esr/ifdex 。希望你用的上。

树莓派使用实例之：2 Pi R 第二篇：Web服务器
type: item
date: 2014-03-10T07:01:00+08:00
description: 在我的上一篇文章中讲过如何做一个高可用系统：两个树莓派布署上 GlusterFS 集群文件系统，就变成一个容错文件服务器了。在这篇文章中我们会基于这个高可用系统构建另一个容错服务：建立一个简单的 Web 服务器集群。可能你没有看过我的上一篇文章，那我就在这里简单回顾一下上次的内容。我有两个树莓派：Pi1 和 Pi2。Pi1 的 IP 地址为 192.168.0.121，Pi2 的 IP 地址为 192.168.0.122。我把它们组合成为 GlusterFS 集群系统，共享一个存储卷，卷名为 gv0。并且这个 gv0 被挂载在两个树莓派上，挂载点都是 /mnt/gluster1，这样一来，两个树莓派能同时访问到这个共享卷。最后我测试了下系统的容错性，将共享卷挂载到第三个物理机上，并执行共享卷上的一个简单的脚本：打印系统时间并输出到 gv0 上的一个文件内，然后轮着关掉两台树莓派，检测这个冗余系统是否还能用。现在我手上有这个经过检验的存储系统，我要做的是把这个系统做成有容错功能的 Web 服务器集群。树莓派的 CPU 处理速度和内存资源都不是很高，好在对付一个静态 Web 服务器已经是绰绰有余了。我故意把这个例子做得非常简单，因为我觉得如果你能摆平这个简单的例子，你也能处理复杂一点的问题了。安装 Nginx虽然我也比较喜欢 Apache，但在资源有限的情况下，像 Nginx 这样功能全、性能高、资源占用少的 Web 服务器是比较理想的选择。在 Raspbian 的默认源中存在 Nginx，所以我只要登入一台树莓派并且输入以下命令：$ sudo apt-get update $ sudo apt-get install nginx Nginx 安装好后，创建配置文件 /mnt/gluster1/cluster ，内容如下：server { root /mnt/gluster1/www; index index.html index.htm; server_name twopir twopir.example.com; location / { try_files $uri $uri/ /index.html; } } 注意：我这里把服务器命名为“twopir”，你可以根据自己爱好命名你的网站。另外我把 Web 服务器的根目录设置为 /mng/gluster1/www。这样，我就能把我的静态文件放在这个共享存储系统内，从而让两个树莓派主机都访问到它们。现在删除默认的 Nginx 配置文件，将上面配好的配置文件作为 Nginx 的配置文件。在 Debian 系统中，Nginx 将它的配置文件像 Apache 一样放在 sites-available 和 site-enabled 两个目录下面。虚拟主机配置文档放在 sites-available 中，而 sites-enabled 目录包含了你想生效的配置文件的软链接。$ cd /etc/nginx/sites-available $ sudo ln -s /mnt/gluster1/cluster . $ cd /etc/nginx/sites-enabled $ sudo rm default $ sudo ln -s /etc/nginx/sites-available/cluster . 现在我已经放好了配置文件，但系统还不存在上面所说的 Web 服务器根目录。下一步就是创建目录 /mnt/gluster1/www，并复制 index.html 文件进去。当然你也可以建立自己定义的 index.html 文件，但先复制一个已有的文件是个不错的选择：$ sudo mkdir /mnt/gluster1/www $ cp /usr/share/nginx/www/index.html /mnt/gluster1/www 重启 Nginx 服务：$ sudo /etc/init.d/nginx restart 现在去 DNS 服务器为192.168.0.121的树莓派配置记录。你可以根据自己的情况配置你自己的域名和 IP 地址。现在在浏览器上输入 http://twopir/ 然后出现默认的 Nginx 首页。如果你查看下 /var/log/nginx/access.log 文件，你可以看到点击网页留下的记录。Nginx 能正常工作后，配置第二个树莓派。因为我们已经将配置文件都放在 GlusterFS 共享目录下，我们现在要做的只是安装 Nginx，创建相关的软链接，重启 Nginx：$ sudo apt-get update $ sudo apt-get install nginx $ cd /etc/nginx/sites-available $ sudo ln -s /mnt/…

戴文的Linux内核专题：18 配置内核 (14)
type: item
date: 2014-01-30T16:13:00+08:00
description: 你好！ 准备好读另一篇很酷的Linux内核文章了么?接下来，在这个任务中，我们可以启用/禁用"Fusion MPT logging facility"。MPT代表"Message Passing Technology"(消息传递技术)。Fusion驱动是由LSI Logic公司开发。MPT一种进程间使用的特定消息策略。这个技术是同步的意味着进程将会等待所需的消息。在这之后，如果计算机处理拥有火线端口就应该启用"FireWire driver stack"。如果没有，那么就没有必要去启动一个不会使用到的火线驱动。火线很像USB。不过在协议、速度、物理形状和端口布局上不同。通常上，苹果设备使用火线和USB。一些PC有火线端口，但是不像USB口那样普及。一些火线控制器使用OHCI-1394规范(OHCI-1394 controllers)。如果是这样，启用这个驱动。为了使用火线存储设备，启用下一个驱动(Storage devices (SBP-2 protocol))。这个驱动提供了火线存储单元与火线总线通信的协议(the card with the attached FireWire ports)。一些火线扫描仪同样需要这个驱动。IPv4可以用在火线端口(IP networking over 1394)。IEEE 1394或者简单的"1394"就是火线。使用IPv4在火线多播有局限。"Nosy"是"FireWire PCILynx"卡上的流量监控(Nosy - a FireWire traffic sniffer for PCILynx cards)。下一步，可以支持I2O设备(I2O device support)。"Intelligent Input/Output (I2O)"(智能输入/输出)总线使用硬件和操作系统层的驱动。硬件驱动(hardware drivers (HDM))并不特定与任何操作系统而OS驱动(OS drivers (OSM))必须在目标操作系统上使用。OSM可以与任何HDM通信。I2O卡/总线有一个IOP- 输入/输出处理器(Input/Output Processor)。由于主CPU处理更少的数据，所以加速了系统。只在缺乏SUN I2O控制器的系统上启用"Enable LCT notification"。I2C SUN固件不支持LCT通知。 如果目标是RAID，Adaptec I2O控制器需要下一个驱动(Enable Adaptec extensions)。64位的直接内存访问可以在Adaptec I2O控制器上启用(Enable 64-bit DMA)。如果允许，可以配置I2O设备(I2O Configuration support)。这个特性主要用在RAID设定中。可以为I2O启用支持老的输入/输出控制(Enable ioctls (OBSOLETE))。可以启用I2O总线适配器的OSM软件(I2O Bus Adapter OSM)。这组OSM被用来寻找新的在其他适配器末端的I2O设备。下面，可以启用I2O块设备上的OSM(I2O Block OSM)。I2O硬件上的RAID控制器需要这个OSM。下面的OSM用于I2O控制器上的SCSI或者光纤通道设备。如果启用了(I2O /proc support)，可以通过/proc读取I2O设备的信息。在启用/禁用了I2O特性，我们可以继续其他的内核特性。下面，我们看到"Macintosh device drivers"。这只对苹果设备有用。PC的Linux内核不应该有任何这些驱动启用。然而，正如许多说法都有例外一样。一些PC用户可能会使用苹果鼠标、键盘和/或者一些其他的苹果设备。再说一次，最好彻底地理解需求和正在开发的内核。下一步，我们有一个用于网络的驱动(Network device support)。X11和其他的Linux软件不依赖于这个驱动，所以如果内核不会连接到另一台计算机、因特网、内联网或者网络，那么这个特性可以安全地禁用。下面的驱动就像上面，但是特定于核心驱动(Network core driver support)。这个驱动支持Etherchannel(Bonding driver support)。"bonding"是两条或者更多的以太网通道的融合。这也成为中继。使用这个驱动(Dummy net driver support)，可以在Linux中设置一个虚拟网络。虚拟网络(dummy network)就像网络中的/dev/null。任何发送给虚拟网络的数据都会永久消失，因为它会发往/dev/null。IP地址没有设置。用户可以定义他们的网络相当于/dev/null。下一步，可以支持和EQL(EQL (serial line load bal…

戴文的Linux内核专题：15 配置内核 (11)
type: item
date: 2014-01-21T17:22:00+08:00
description: 准备好配置更多的驱动了么？还有很多要做。Linux支持两种不同的康柏智能阵列控制器：(Compaq SMART2 support)和(Compaq Smart Array 5xxx support)。阵列控制器是将物理存储单元表现为逻辑单元的设备。这些控制可能同样实现了基于硬件的RAID。硬件和软件RIAD的不同是简单的。Linux管理并见到软件RIAD。Linux将硬件RAID视为另外的存储单元。这意味着Linux没有意识到设备就是RAID驱动器。硬件(阵列控制器)独立于内核管理着RAID系统。这对于系统的性能更好因为内核不必配置或者管理RAID。注意，不同的阵列控制器有不同的RAID能力。上面提到的阵列控制器可以通过这个驱动访问SCSI磁带(SCSI tape drive support for Smart Array 5xxx)。SCSI磁带是使用SCSI协议的磁带机。PCI RAID控制器Mylex DAC960、AcceleRAID和eXtremeRAID在这个驱动中支持(Mylex DAC960/DAC1100 PCI RAID Controller support)。PCI RAID控制器是一个连接到PCI卡的阵列控制器。RAID控制器是拥有RAID功能的阵列控制器。带电源备份的MM5415内存芯片在这个驱动中支持(Micro Memory MM5415 Battery Backed RAM support)。带后备电源内存芯片允许数据在切断电源后继续保存在内存设备中。这有助于保护数据。不然，当电源断开后，当前的计算机会话就会丢失。当启用这个特性后，可以将典型的文件(比如ISO文件)作为一个块设备并挂载它Loopback device support)。这对于从镜像文件中检索文件而不必把文件烧录到光盘或者解压出来。想像一下你从因特网上得到了一份包含了很多文件的ISO文件。如果你只需要包中的一个文件并且用户不希望烧写ISO到光盘上或者不想知道如何打开一个ISO文件。用户可以用挂载ISO来替代。Linux内核在初始化阶段会创建一些回路设备，所以一些回环设备已经准备好并创建了(Number of loop devices to pre-create at init time)。当一个文件(像ISO)或者虚拟设备(就像虚拟磁盘驱动器[vhd])被作为回环设备挂载时会节约一些时间。这个设定允许开发者选择内核可以预 创建多少回环设备。当"Cryptoloop Support"启用后就可以CryptoAPI创建密码。这个用于硬件驱动器加密。然而，并不是所有的文件系统都支持。下面用户可以启用"DRBD Distributed Replicated Block Device support"(译注：Linux上的分布存储系统)。这个就像网络RAID1。这些设备拥有设备文件/dev/drbdx。这些设备通常被用于集群，这里集群中的每台计算机都有一个从主单元镜像过来的存储单元。这意味着每台计算机的硬盘是位于组中心计算机硬盘的镜像拷贝。集群是一组计算机扮演着一台大型强力单元的角色。然而，每个集群都有一台控制计算机称为主节点。余下的计算机是从节点。DRBD支持用于测试IO错误处理的故障注射(DRBD fault injection)。记住，故障注射就是使设备/软件认为发生了一个错误，因此开发者可以测试硬件/软件如何处理错误如果内核要成为网络块设备的客户端，那么启用这个特性(Network block device support)。第一个设备文件是/dev/nd0。网络块设备是通过网络访问的远程存储单元。直接连接SSD到PCI或者PCIe需要这个驱动(NVM Express block device)。用这个特性允许将单独的SCSI OSD(object-based storage,基于对象的存储)对象作为块设备(OSD object-as-blkdev support)。下一个驱动是"Promise SATA SX8 support"。这个驱动用于Promise公司(Promise Technology Inc.)生产的SATA控制器。Linux允许将一部分内存作为块设备(RAM block device support)。这通常见与完全运行于内存上的Linux的live发行版。Linux的live发行版会卸载光盘并接着加载到内存中，所以在尝试一个新的操作系统或者修复另一个系统时不会伤害到已安装的系统。下一个选项允许用户输入"Default number of RAM disks"(默认RAM磁盘数量)。"Default RAM disk size"(默认RAM磁盘大小)可以以KB设置大小。内核可以支持在内存设备的XIP文件系统作为块设…

Debian/Ubuntu系统中安装和配置UFW－简单的防火墙
type: item
date: 2014-01-20T06:41:00+08:00
description: 自从计算机互连后，各种服务迅速发展。用户使用的电子邮件、社交媒体、在线商城、即时聊天甚至网络会议等服务如雨后春笋般涌现。但从另一方面来说，这些连接服务也具有双刃剑，比如它们当中的病毒、恶意软件、特洛伊木马等会向计算机发送恶意消息。安装 UFW 防火墙作为最大的计算机网络，互联网上可并不都是善意的用户。因此，为了确保我们的计算机或服务器安全，我们需要进行保护。在你的计算机或服务器上一个必须有的组件就是防火墙。在维基百科中，其定义是：防火墙是计算机中一款应用软件或基于硬件的网络安全系统。它根据应用配置的规则，分析数据包，然后决定是否允许此数据包通过，来控制整个系统的网络数据进出访问权限。iptables 是一款广泛使用于服务器的防火墙。它是一款应用程序，它会根据一系列规则来管理服务器上的进出数据流。一般来说，只有可信任的连接才允许进入服务器。但 iptables 是在控制台模式下运行，它非常的复杂。不熟悉 iptables 配置规则和命令的用户可以读读下面的文章，它描述了如何使用iptables防火墙。iptables 基础 (Linux 防火墙) 指南Debian/Ubuntu 系统中安装 UFW 防火墙为了降低 iptables 设置的复杂度，有许多对应的前端应用。如果你运行的是 Ubuntu linux 系统的话， UFW 就是一款默认的防火墙工具。我们开始来探讨 UFW 防火墙吧。什么是 UFWUFW (简单的防火墙) 是广泛使用的 iptables 防火墙 的前端应用，这是非常适合于基于主机的防火墙。UFW 即提供了一套管理网络过滤器的框架，又提供了控制防火墙的命令行界面接口。它给那些不熟悉防火墙概念的 Linux 新用户提供了友好、易使用的用户界面。同时，另一方面，它也提供了命令行界面，为系统管理员准备了一套复杂的命令，用来设置复杂的防火墙规则。UFW 对像 Debian、Ubuntu 和 Linux Mint 这些发布版本来说也是上上之选。UFW 基本用法首先，用如下命令来检查下系统上是否已经安装了 UFW 。$ sudo dpkg --get-selections | grep ufw 如还没有安装，可以使用 apt 命令来安装，如下所示：$ sudo apt-get install ufw 在使用前，你应该检查下 UFW 是否已经在运行。用下面的命令来检查。$ sudo ufw status 如果你发现状态是： inactive , 意思是没有被激活或不起作用。启用/禁用 UFW要启用它，你只需在终端下键入如下命令：$ sudo ufw enable 在系统启动时启用和激活防火墙要禁用，只需输入：$ sudo ufw disable 列出当前UFW规则在防火墙被激活后，你可以向里面添加你自己的规则。如果你想看看默认的规则，可以输入。$ sudo ufw status verbose 输出样例：Status: active Logging: on (low) Default: deny (incoming), allow (outgoing) New profiles: skip $ 添加UFW规则如你所见，默认是不允许所有外部访问连接的。如果你想远程连接你的机器，就得开放相应的端口。例如，你想用 ssh 来连接，下面是添加的命令。允许访问$ sudo ufw allow ssh [sudo] password for pungki : Rule added Rule added (v6) $ 再一次检查状态，会看到如下的一些输出。$ sudo ufw status To Action From -- ----------- ------ 22 ALLOW Anywhere 22 ALLOW Anywhere (v6) 如果你有很多条规则，想快速的在每条规则上加个序号数字的话，请使用 numbered 参数。$ sudo ufw status numbered To Action From ------ ----------- ------ [1] 22 ALLOW Anywhere [2] 22 ALLOW Anywhere (v6) 第一条规则的意思是所有通过22端口访问机器的 tcp 或 udp 数据包都是允许的。如果你希望仅允许 tcp 数据包访问应该怎么办？可以在服务端口后加个 tcp 参数。下面的示例及相应的输出。$ sudo ufw allow ssh/tcp To Action From ------ ----------- ------ 22/tcp ALLOW Anywhere 22/tcp ALLOW Anywhere (v6) 拒绝访问添加拒绝规则也是同样的招数。我们假设你想拒绝 ftp 访…

每日Ubuntu小技巧：合上笔记本，系统不睡眠
type: item
date: 2014-01-19T19:43:00+08:00
description: Ubuntu 是一个处在牛 A 和牛 C 之间的现代操作系统，全世界数百万用户和公司都在使用它。无论是充当工作台还是高级工程机器，Ubuntu 都游刃有余。如果你是 Ubuntu 初学者，使用过程还需要高手指导，那就关注本站吧。我们已经写了数百篇 Ubuntu 教程，足以带你入门。从安装 Ubuntu 到系统基本设置，我们都有涉猎。这篇简单的教程为你介绍当笔记本盖子合上时该干嘛还是干嘛，而不是进入睡眠模式或者直接关机。大多数现代操作系统（包括 Windows）会在笔记本合上时进入睡眠状态。Ubuntu 也是如此。如果你想让你的笔记本盖子合上时不睡眠，就跟着我们学习吧。要达到这个目的，Ubuntu 有两种方法。第一种是打开 System Settings –> Power（中文版是打开 系统设置 -> 电源），然后进行设置。一些用户设置后不会生效。另一个方法是直接编辑 Login Manager 的配置文件（logind.conf）。这个方法基本能生效，建议使用这个。要开始了，按下 Ctrl – Alt – T 组合键，打开终端。然后运行下面的命令打开 logind.conf 文件。你的所有修改都在这个文件内。sudo gedit /etc/systemd/logind.conf 打开文件后修改下面这行：#HandleLidSwitch=suspend 改成这样：HandleLidSwitch=ignore 保存文件，重启 Login Manager 服务：sudo restart systemd-logind 工作完成！配置文件的 “ignore” 值告诉 Ubuntu 当笔记本合上后不要睡眠或挂起。不要改动其它设置然后保存文件。via: http://www.liberiangeek.net/2013/12/daily-ubuntu-tips-do-nothing-when-laptop-lid-is-closed/译者：bazz2 校对：Caroline本文由 LCTT 原创翻译，Linux中国 荣誉推出

在openSUSE 13.1中配置FTP服务器
type: item
date: 2014-01-03T04:45:00+08:00
description: vsftpd （ 非常安全的文件传输协议守护进程） 是Unix/Linux系统中的一个安全快速的FTP服务器。 在这篇指导教程中，让我们看看在openSUSE 13.1中怎样使用vsftpd来配置一个基本的FTP服务器。安装 vsftpd作为root用户登录然后输入以下命令。# zypper in vsftpd 启动 vsftpd 服务然后通过设置使它在每次系统重启时自动启动。# systemctl enable vsftpd.service # systemctl start vsftpd.service 配置 vsftpd为ftp用户新建一个文件夹。# mkdir /srv/ftp 创建一个名为 ftp-users 的组。# groupadd ftp-users 让我们来创建一个叫unixmen的示例用户 并设置其主目录为 /srv/ftp 组为 ftp-users 。# useradd -g ftp-users -d /srv/ftp/ unixmen 为新用户设置密码。# passwd unixmen 使ftp主目录 /srv/ftp/ 可以被ftp用户所访问。# chmod 750 /srv/ftp/ # chown unixmen:ftp-users /srv/ftp/ 编辑 vsftpd.conf 文件# nano /etc/vsftpd.conf 设置如下的更改。[...] #Uncomment and Set YES to enable write. write_enable=YES [...] # Uncomment and Set banner name for your website ftpd_banner=Welcome to Unixmen FTP service. [...] # Uncomment ls_recurse_enable=YES [...] # Uncomment and set YES to allow local users to log in. local_enable=YES [...] # To disable anonymous access, set NO. anonymous_enable=NO [...] # Uncomment to enable ascii download and upload. ascii_upload_enable=YES ascii_download_enable=YES [...] ## Add at the end of this file ## use_localtime=YES 保存并退出文件。测试本地FTP服务器首先 让我们按如下步骤尝试登录FTP服务器# ftp localhost Trying ::1:21 ... Connected to localhost. 220 (vsFTPd 3.0.2) Name (localhost:root): unixmen 331 Please specify the password. Password: 230 Login successful. Remote system type is UNIX. Using binary mode to transfer files. ftp> 正如你在上面所输出的那样, 我们能够用unixmen用户登录到ftp服务器。测试远程FTP服务器默认 openSUSE 内置的防火墙不允许远程系统登录FTP。所以让我们允许vsftpd服务通过suse的防火墙。然后我们需要打开： Yast -> 安全性与用户 -> 防火墙.在防火墙界面，进入 允许服务. 在区域选择下拉框中，选择 外部区域 在服务允许下拉框中，选择 vsftpd 服务器 然后点击添加。单击下一步并关闭Yast控制中心现在尝试从远程系统连接FTP。我试着从我的ubuntu桌面系统登录FTP服务器。sk@sk:~$ ftp 192.168.1.53 Connected to 192.168.1.53. 220 (vsFTPd 3.0.2) Name (192.168.1.53:sk): unixmen 331 Please specify the password. Password: 230 Login successful. Remote system type is UNIX. Using binary mode to transfer files. ftp> 正如你在上面输出中所看到的，我能够连接到ftp服务器。如果不允许vsftpd服务通过防火墙，你将会得到一个连接超时的报错。从浏览器连接打开你的浏览器并导航到ftp://ip-address/。输入ftp用户名和密码。使用Fil…