分类 技术 下的文章

dpkg 意即 Debian 包管理器 Debian PacKaGe manager 。dpkg 是一个可以安装、构建、删除及管理 Debian 软件包的命令行工具。dpkg 将 Aptitude(首选而更用户友好)作为执行所有操作的前端界面。

其它的一些工具如 dpkg-deb 和 dpkg-query 等也使用 dpkg 作为执行某些操作的前端。

现在大多数系统管理员使用 Apt、Apt-Get 及 Aptitude 等工具,不用费心就可以轻松地管理软件。

尽管如此,必要的时候还是需要用 dpkg 来安装某些软件。其它的一些在 Linux 系统上广泛使用的包管理工具还有 yumdnfapt-getrpmZypper、pacman、urpmi 等等。

现在,我要在装有 Ubuntu 15.10 的机器上用一些实例讲解最常用的 dpkg 命令。

1) dpkg 常见命令的语法及 dpkg 文件位置

下面是 dpkg 常见命令的语法及 dpkg 相关文件的位置,如果想深入了解,这些对你肯定大有益处。

### dpkg 命令的语法
$ dpkg -[command] [.deb package name]

$ dpkg -[command] [package name]

### dpkg 相关文件的位置
$ /var/lib/dpkg

### 这个文件包含了被 dpkg 命令(install、remove 等)所修改的包的信息
$ /var/lib/dpkg/status

### 这个文件包含了可用包的列表
$ /var/lib/dpkg/status

2) 安装/升级软件

在基于 Debian 的系统里,比如 Debian、Mint、Ubuntu 和 elementryOS,用以下命令来安装/升级 .deb 软件包。这里我要用 atom-amd64.deb 文件安装 Atom。要是已经安装了 Atom,就会升级它。要么就会安装一个新的 Atom。

### 安装或升级 dpkg 软件包
$ sudo dpkg -i atom-amd64.deb
Selecting previously unselected package atom.
(Reading database ... 426102 files and directories currently installed.)
Preparing to unpack atom-amd64.deb ...
Unpacking atom (1.5.3) over (1.5.3) ...
Setting up atom (1.5.3) ...
Processing triggers for gnome-menus (3.13.3-6ubuntu1) ...
Processing triggers for bamfdaemon (0.5.2~bzr0+15.10.20150627.1-0ubuntu1) ...
Rebuilding /usr/share/applications/bamf-2.index...
Processing triggers for desktop-file-utils (0.22-1ubuntu3) ...
Processing triggers for mime-support (3.58ubuntu1) ...

3) 从文件夹里安装软件

在基于 Debian 的系统里,用下列命令从目录中逐个安装软件。这会安装 /opt/software 目录下的所有以 .deb 为后缀的软件。

$ sudo dpkg -iR /opt/software
Selecting previously unselected package atom.
(Reading database ... 423303 files and directories currently installed.)
Preparing to unpack /opt/software/atom-amd64.deb ...
Unpacking atom (1.5.3) ...
Setting up atom (1.5.3) ...
Processing triggers for gnome-menus (3.13.3-6ubuntu1) ...
Processing triggers for bamfdaemon (0.5.2~bzr0+15.10.20150627.1-0ubuntu1) ...
Rebuilding /usr/share/applications/bamf-2.index...
Processing triggers for desktop-file-utils (0.22-1ubuntu3) ...
Processing triggers for mime-support (3.58ubuntu1) ...

4) 显示已安装软件列表

以下命令可以列出 Debian 系的系统中所有已安装的软件,同时会显示软件版本和描述信息。

$ dpkg -l
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name                        Version                            Architecture Description
+++-===========================-==================================-============-================================================================
ii  account-plugin-aim          3.12.10-0ubuntu2                   amd64        Messaging account plugin for AIM
ii  account-plugin-facebook     0.12+15.10.20150723-0ubuntu1       all          GNOME Control Center account plugin for single signon - facebook
ii  account-plugin-flickr       0.12+15.10.20150723-0ubuntu1       all          GNOME Control Center account plugin for single signon - flickr
ii  account-plugin-google       0.12+15.10.20150723-0ubuntu1       all          GNOME Control Center account plugin for single signon
ii  account-plugin-jabber       3.12.10-0ubuntu2                   amd64        Messaging account plugin for Jabber/XMPP
ii  account-plugin-salut        3.12.10-0ubuntu2                   amd64        Messaging account plugin for Local XMPP (Salut)
.
.

5) 查看指定的已安装软件

用以下命令列出指定的一个已安装软件,同时会显示软件版本和描述信息。

$ dpkg -l atom
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name       Version   Architecture        Description
+++-==========-=========-===================-============================================
ii  atom       1.5.3     amd64               A hackable text editor for the 21st Century.

6) 查看软件安装目录

以下命令可以在基于 Debian 的系统上查看软件的安装路径。

$ dpkg -L atom
/.
/usr
/usr/bin
/usr/bin/atom
/usr/share
/usr/share/lintian
/usr/share/lintian/overrides
/usr/share/lintian/overrides/atom
/usr/share/pixmaps
/usr/share/pixmaps/atom.png
/usr/share/doc

7) 查看 deb 包内容

下列命令可以查看 deb 包内容。它会显示 .deb 包中的一系列文件。

$ dpkg -c atom-amd64.deb
drwxr-xr-x root/root         0 2016-02-13 02:13 ./
drwxr-xr-x root/root         0 2016-02-13 02:13 ./usr/
drwxr-xr-x root/root         0 2016-02-13 02:13 ./usr/bin/
-rwxr-xr-x root/root      3067 2016-02-13 02:13 ./usr/bin/atom
drwxr-xr-x root/root         0 2016-02-13 02:13 ./usr/share/
drwxr-xr-x root/root         0 2016-02-13 02:13 ./usr/share/lintian/
drwxr-xr-x root/root         0 2016-02-13 02:13 ./usr/share/lintian/overrides/
-rw-r--r-- root/root       299 2016-02-13 02:13 ./usr/share/lintian/overrides/atom
drwxr-xr-x root/root         0 2016-02-13 02:13 ./usr/share/pixmaps/
-rw-r--r-- root/root    643183 2016-02-13 02:13 ./usr/share/pixmaps/atom.png
drwxr-xr-x root/root         0 2016-02-13 02:13 ./usr/share/doc/
.
.

8) 显示软件的详细信息

以下命令可以显示软件的详细信息,如软件名、软件类别、版本、维护者、软件架构、依赖的软件、软件描述等等。

$ dpkg -s atom
Package: atom
Status: install ok installed
Priority: optional
Section: devel
Installed-Size: 213496
Maintainer: GitHub <[email protected]>Architecture: amd64
Version: 1.5.3
Depends: git, gconf2, gconf-service, libgtk2.0-0, libudev0 | libudev1, libgcrypt11 | libgcrypt20, libnotify4, libxtst6, libnss3, python, gvfs-bin, xdg-utils, libcap2
Recommends: lsb-release
Suggests: libgnome-keyring0, gir1.2-gnomekeyring-1.0
Description: A hackable text editor for the 21st Century.
 Atom is a free and open source text editor that is modern, approachable, and hackable to the core.</[email protected]> 

9) 查看文件属于哪个软件

用以下命令来查看文件属于哪个软件。

$ dpkg -S /usr/bin/atom
atom: /usr/bin/atom

10) 移除/删除软件

以下命令可以用来移除/删除一个已经安装的软件,但不删除配置文件。

$ sudo dpkg -r atom
(Reading database ... 426404 files and directories currently installed.)
Removing atom (1.5.3) ...
Processing triggers for gnome-menus (3.13.3-6ubuntu1) ...
Processing triggers for bamfdaemon (0.5.2~bzr0+15.10.20150627.1-0ubuntu1) ...
Rebuilding /usr/share/applications/bamf-2.index...
Processing triggers for desktop-file-utils (0.22-1ubuntu3) ...
Processing triggers for mime-support (3.58ubuntu1) ...

11) 清除软件

以下命令可以用来移除/删除包括配置文件在内的所有文件。

$ sudo dpkg -P atom
(Reading database ... 426404 files and directories currently installed.)
Removing atom (1.5.3) ...
Processing triggers for gnome-menus (3.13.3-6ubuntu1) ...
Processing triggers for bamfdaemon (0.5.2~bzr0+15.10.20150627.1-0ubuntu1) ...
Rebuilding /usr/share/applications/bamf-2.index...
Processing triggers for desktop-file-utils (0.22-1ubuntu3) ...
Processing triggers for mime-support (3.58ubuntu1) ...

12) 了解更多

用以下命令来查看更多关于 dpkg 的信息。

$ dpkg -help
或
$ man dpkg

开始体验 dpkg 吧。


via: http://www.2daygeek.com/dpkg-command-examples/

作者:MAGESH MARUTHAMUTHU 译者:GitFuture 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

通过几个点击即可在 “AWS 快速起步”和“Azure 市场”上高效搭建产品级 Docker 数据中心。

通过 AWS 快速起步的 CloudFormation 模板和在 Azure 市场上的预编译模板来部署 Docker 数据中心使得比以往在公有云基础设施下的部署企业级的 CaaS Docker 环境更加容易。

Docker 数据中心 CaaS 平台为各种规模的企业的敏捷应用部署提供了容器和集群的编排和管理,使之更简单、安全和可伸缩。使用新为 Docker 数据中心预编译的云模板,开发者和 IT 运维人员可以无缝的把容器化的应用迁移到亚马逊 EC2 或者微软的 Azure 环境而无需修改任何代码。现在,企业可以快速实现更高的计算和运营效率,可以通过短短几步操作实现支持 Docker 的容器管理和编排。

什么是 Docker 数据中心?

Docker 数据中心包括了 Docker 通用控制面板 Docker Universal Control Plane (UCP), Docker 可信注册库 Docker Trusted Registry (UTR)和 商用版 Docker 引擎 CS Docker Engine ,并带有与客户的应用服务等级协议相匹配的商业支持服务。

  • Docker 通用控制面板(UCP),一种企业级的集群管理方案,帮助客户通过单个管理面板管理整个集群
  • Docker 可信注册库(DTR), 一种镜像存储管理方案,帮助客户安全存储和管理 Docker 镜像
  • 商用版的 Docker 引擎

在 AWS 上快速布置 Docker 数据中心

秉承 Docker 与 AWS 最佳实践,参照 AWS 快速起步教程来,你可以在 AWS 云上快速部署 Docker 容器。Docker 数据中心快速起步基于模块化和可定制的 CloudFormation 模板,客户可以在其之上增加额外功能或者为自己的 Docker 部署修改模板。

架构

AWS Cloudformation 的安装过程始于创建 AWS 资源,这些 AWS 需要的资源包括:VPC、安全组、公有与私有子网、因特网网关、NAT 网关与 S3 bucket。

然后,AWS Cloudformation 启动第一个 UCP 控制器实例,紧接着,安装 Docker 引擎和 UCP 容器。它把第一个 UCP 控制器创建的根证书备份到 S3。一旦第一个 UCP 控制器成功运行,其他 UCP 控制器、UCP 集群节点和第一个 DTR 复制的进程就会被触发。和第一个 UCP 控制器节点类似,其他所有节点创建进程也都由商用版 Docker 引擎开始,然后安装并运行 UCP 和 DTR 容器以加入集群。两个弹性负载均衡器(ELB),一个分配给 UCP,另外一个为 DTR 服务,它们启动并自动完成配置来在两个可用区(AZ)之间提供弹性负载均衡。

除这些之外,如有需要,UCP 控制器和节点在 ASG 中启动并提供扩展功能。这种架构确保 UCP 和 DTR 两者都部署在两个 AZ 上以增强弹性与高可靠性。在公有或者私有 HostedZone 上,Route53 用来动态注册或者配置 UCP 和 DTR。

快速起步模板的核心功能如下:

  • 创建 VPC、不同 AZ 上的私有和公有子网、ELB、NAT 网关、因特网网关、自动伸缩组,它们全部基于 AWS 最佳实践
  • 为 DDC 创建一个 S3 bucket,其用于证书备份和 DTR 映像存储(DTR 需要额外配置)
  • 在客户的 VPC 范畴,跨多 AZ 部署 3 个 UCP 控制器
  • 创建预配置正常检测的 UCP ELB
  • 创建一个 DNS 记录并关联到 UCP ELB
  • 创建可伸缩的 UCP 节点集群
  • 在 VPC 范畴内,跨多 AZ 创建 3 个 DTR 副本
  • 创建一个预配置正常检测的 DTR
  • 创建一个 DNS 记录,并关联到 DTR ELB

在 AWS 使用 Docker 数据中心

  1. 登录 Docker Store 获取 30 天免费试用或者联系销售
  2. 确认之后,看到提示“Launch Stack”后,客户会被重定向到 AWS Cloudformation 入口
  3. 确认启动 Docker 的 AWS 区域
  4. 提供启动参数
  5. 确认并启动
  6. 启动完成之后,点击输出标签可以看到 UCP/DTR 的 URL、缺省用户名、密码和 S3 bucket 的名称

在 Azure 使用 Azure 市场的预编译模板部署

在 Azure 市场上,Docker 数据中心是一个预先编译的模板,客户可以在 Azure 横跨全球的数据中心即起即用。客户可以根据自己需求从 Azure 提供的各种 VM 中选择适合自己的 VM 部署 Docker 数据中心。

架构

Azure 部署过程始于输入一些基本用户信息,如 ssh 登录的管理员用户名(系统级管理员)和资源组名称。你可以把资源组理解为一组有生命周期和部署边界的资源集合。你可以在这个链接了解更多关于资源组的信息:<http://azure.microsoft.com/en-us/documentation/articles/resource-group-overview/> 。

下一步,输入集群详细信息,包括:UCP 控制器 VM 大小、控制器个数(缺省为 3 个)、UCP 节点 VM 大小、UCP 节点个数(缺省 1,最大值为 10)、DTR 节点 VM 大小、DTR 节点个数、虚拟网络名和地址(例如:10.0.0.1/19)。关于网络,客户可以配置 2 个子网:第一个子网分配给 UCP 控制器 ,第二个分配给 DTC 和 UCP 节点。

最后,点击 OK 完成部署。对于小集群,服务开通需要大约 15-19 分钟,大集群更久些。

如何在 Azure 部署

  1. 注册 Docker 数据中心 30 天试用许可或者联系销售
  2. 跳转到微软 Azure 市场的 Docker 数据中心
  3. 查看部署文档

通过注册获取 Docker 数据中心许可证开始,然后你就能够通过 AWS 或者 Azure 模板搭建自己的数据中心。

了解有关 Docker 的更多信息:


via: https://blog.docker.com/2016/06/docker-datacenter-aws-azure-cloud/

作者:Trisha McCanna 译者:firstadream 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

在这篇文章中,我们将会讲述什么是 TCP 封装器 TCP wrappers 以及如何在一台 Linux 服务器上配置他们来限制网络服务的权限。在开始之前,我们必须澄清 TCP 封装器并不能消除对于正确配置防火墙的需要。

就这一点而言,你可以把这个工具看作是一个基于主机的访问控制列表,而且并不能作为你的系统的终极安全措施。通过使用一个防火墙和 TCP 封装器,而不是只偏爱其中的一个,你将会确保你的服务不会被出现单点故障。

正确理解 hosts.allow 和 hosts.deny 文件

当一个网络请求到达你的主机的时候,TCP 封装器会使用 hosts.allowhosts.deny (按照这样的顺序)来决定客户端是否应该被允许使用一个提供的服务。.

在默认情况下,这些文件内容是空的,或者被注释掉,或者根本不存在。所以,任何请求都会被允许通过 TCP 过滤器而且你的系统被置于依靠防火墙来提供所有的保护。因为这并不是我们想要的。由于在一开始我们就介绍过的原因,清确保下面两个文件都存在:

# ls -l /etc/hosts.allow /etc/hosts.deny

两个文件的编写语法规则是一样的:

<services> : <clients> [: <option1> : <option2> : ...]

在文件中,

  1. services 指当前规则对应的服务,是一个逗号分割的列表。
  2. clients 指被规则影响的主机名或者 IP 地址,逗号分割的。下面的通配符也可以接受:

    1. ALL 表示所有事物,应用于clientsservices
    2. LOCAL 表示匹配在正式域名中没有完全限定主机名(FQDN)的机器,例如 localhost
    3. KNOWN 表示主机名,主机地址,或者用户是已知的(即可以通过 DNS 或其它服务解析到)。
    4. UNKNOWNKNOWN 相反。
    5. PARANOID 如果进行反向 DNS 查找彼此返回了不同的地址,那么连接就会被断开(首先根据 IP 去解析主机名,然后根据主机名去获得 IP 地址)。
  3. 最后,一个冒号分割的动作列表表示了当一个规则被触发的时候会采取什么操作。

你应该记住 /etc/hosts.allow 文件中允许一个服务接入的规则要优先于 /etc/hosts.deny 中的规则。另外还有,如果两个规则应用于同一个服务,只有第一个规则会被纳入考虑。

不幸的是,不是所有的网络服务都支持 TCP 过滤器,为了查看一个给定的服务是否支持他们,可以执行以下命令:

# ldd /path/to/binary | grep libwrap

如果以上命令执行以后得到了以下结果,那么它就可以支持 TCP 过滤器,sshdvsftpd 作为例子,输出如下所示。

Find Supported Services in TCP Wrapper

查找 TCP 过滤器支持的服务

如何使用 TCP 过滤器来限制服务的权限

当你编辑 /etc/hosts.allow/etc/hosts.deny 的时候,确保你在最后一个非空行后面通过回车键来添加一个新的行。

为了使得 SSH 和 FTP 服务只允许 localhost192.168.0.102 并且拒绝所有其他用户,在 /etc/hosts.deny 添加如下内容:

sshd,vsftpd : ALL
ALL : ALL

而且在 /etc/hosts.allow 文件中添加如下内容:

sshd,vsftpd : 192.168.0.102,LOCAL

这些更改会立刻生效并且不需要重新启动。

在下图中你会看到,在最后一行中删掉 LOCAL 后,FTP 服务器会对于 localhost 不可用。在我们添加了通配符以后,服务又变得可用了。

确认 FTP 权限

确认 FTP 权限

为了允许所有服务对于主机名中含有 example.com 都可用,在 hosts.allow 中添加如下一行:

ALL : .example.com

而为了禁止 10.0.1.0/24 的机器访问 vsftpd 服务,在 hosts.deny 文件中添加如下一行:

vsftpd : 10.0.1.

在最后的两个例子中,注意到客户端列表每行开头和结尾的。这是用来表示 “所有名字或者 IP 中含有那个字符串的主机或客户端”

这篇文章对你有用吗?你有什么问题或者评论吗?请你尽情在下面留言交流。


via: http://www.tecmint.com/secure-linux-tcp-wrappers-hosts-allow-deny-restrict-access/

作者:Gabriel Cánepa 译者:LinuxBars 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

当你有重要的敏感数据的时候,给你的文件和目录额外加一层保护是至关重要的,特别是当你需要通过网络与他人传输数据的时候。

由于这个原因,我在寻找一个可疑在 Linux 上加密及解密文件和目录的实用程序,幸运的是我找到了一个用 tar(Linux 的一个压缩打包工具)和 OpenSSL 来解决的方案。借助这两个工具,你真的可以毫不费力地创建和加密 tar 归档文件。

在这篇文章中,我们将了解如何使用 OpenSSL 创建和加密 tar 或 gz(gzip,另一种压缩文件)归档文件:

牢记使用 OpenSSL 的常规方式是:

# openssl command command-options arguments

在 Linux 中加密文件

要加密当前工作目录的内容(根据文件的大小,这可能需要一点时间):

# tar -czf - * | openssl enc -e -aes256 -out secured.tar.gz

上述命令的解释:

  1. enc - openssl 命令使用加密进行编码
  2. -e – 用来加密输入文件的 enc 命令选项,这里是指前一个 tar 命令的输出
  3. -aes256 – 加密用的算法
  4. -out – 用于指定输出文件名的 enc 命令选项,这里文件名是 secured.tar.gz

在 Linux 中解密文件

要解密上述 tar 归档内容,使用以下命令。

# openssl enc -d -aes256 -in secured.tar.gz | tar xz -C test

上述命令的解释:

  1. -d – 用于解密文件
  2. -C – 提取内容到 test 子目录

下图展示了加解密过程,以及当你尝试执行以下操作时会发生什么:

  1. 以传统方式提取 tar 包的内容
  2. 使用了错误的密码的时候
  3. 当你输入正确的密码的时候

在 Linux 中加密和解密 Tar 归档文件

在 Linux 中加密和解密 Tar 归档文件

当你在本地网络或因特网工作的时候,你可以随时通过加密来保护你和他人共享的重要文本或文件,这有助于降低将其暴露给恶意攻击者的风险。

我们研究了一种使用 OpenSSL(一个 openssl 命令行工具)加密 tar 包的简单技术,你可以参考它的 手册页 man page 来获取更多信息和有用的命令。


via: http://www.tecmint.com/encrypt-decrypt-files-tar-openssl-linux/

作者:Gabriel Cánepa 译者:OneNewLife 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

名词缩写:

  • API 应用程序接口 Application Program Interface
  • ABI 应用系统二进制接口 Application Binary Interface

设备驱动是操作系统的一部分,它能够通过一些特定的编程接口便于硬件设备的使用,这样软件就可以控制并且运行那些设备了。因为每个驱动都对应不同的操作系统,所以你就需要不同的 Linux、Windows 或 Unix 设备驱动,以便能够在不同的计算机上使用你的设备。这就是为什么当你雇佣一个驱动开发者或者选择一个研发服务商提供者的时候,查看他们为各种操作系统平台开发驱动的经验是非常重要的。

驱动开发的第一步是理解每个操作系统处理它的驱动的不同方式、底层驱动模型、它使用的架构、以及可用的开发工具。例如,Linux 驱动程序模型就与 Windows 非常不同。虽然 Windows 提倡驱动程序开发和操作系统开发分别进行,并通过一组 ABI 调用来结合驱动程序和操作系统,但是 Linux 设备驱动程序开发不依赖任何稳定的 ABI 或 API,所以它的驱动代码并没有被纳入内核中。每一种模型都有自己的优点和缺点,但是如果你想为你的设备提供全面支持,那么重要的是要全面的了解它们。

在本文中,我们将比较 Windows 和 Linux 设备驱动程序,探索不同的架构,API,构建开发和分发,希望让您比较深入的理解如何开始为每一个操作系统编写设备驱动程序。

1. 设备驱动架构

Windows 设备驱动程序的体系结构和 Linux 中使用的不同,它们各有优缺点。差异主要受以下原因的影响:Windows 是闭源操作系统,而 Linux 是开源操作系统。比较 Linux 和 Windows 设备驱动程序架构将帮助我们理解 Windows 和 Linux 驱动程序背后的核心差异。

1.1. Windows 驱动架构

虽然 Linux 内核分发时带着 Linux 驱动,而 Windows 内核则不包括设备驱动程序。与之不同的是,现代 Windows 设备驱动程序编写使用 Windows 驱动模型(WDM),这是一种完全支持即插即用和电源管理的模型,所以可以根据需要加载和卸载驱动程序。

处理来自应用的请求,是由 Windows 内核的中被称为 I/O 管理器的部分来完成的。I/O 管理器的作用是是转换这些请求到 I/O 请求数据包 IO Request Packets (IRP),IRP 可以被用来在驱动层识别请求并且传输数据。

Windows 驱动模型 WDM 提供三种驱动, 它们形成了三个层:

  • 过滤 Filter 驱动提供关于 IRP 的可选附加处理。
  • 功能 Function 驱动是实现接口和每个设备通信的主要驱动。
  • 总线 Bus 驱动服务不同的配适器和不同的总线控制器,来实现主机模式控制设备。

一个 IRP 通过这些层就像它们经过 I/O 管理器到达底层硬件那样。每个层能够独立的处理一个 IRP 并且把它们送回 I/O 管理器。在硬件底层中有硬件抽象层(HAL),它提供一个通用的接口到物理设备。

1.2. Linux 驱动架构

相比于 Windows 设备驱动,Linux 设备驱动架构根本性的不同就是 Linux 没有一个标准的驱动模型也没有一个干净分隔的层。每一个设备驱动都被当做一个能够自动的从内核中加载和卸载的模块来实现。Linux 为即插即用设备和电源管理设备提供一些方式,以便那些驱动可以使用它们来正确地管理这些设备,但这并不是必须的。

模式输出那些它们提供的函数,并通过调用这些函数和传入随意定义的数据结构来沟通。请求来自文件系统或网络层的用户应用,并被转化为需要的数据结构。模块能够按层堆叠,在一个模块进行处理之后,另外一个再处理,有些模块提供了对一类设备的公共调用接口,例如 USB 设备。

Linux 设备驱动程序支持三种设备:

  • 实现一个字节流接口的 字符 Character 设备。
  • 用于存放文件系统和处理多字节数据块 IO 的 Block 设备。
  • 用于通过网络传输数据包的 网络 Network 接口。

Linux 也有一个硬件抽象层(HAL),它实际扮演了物理硬件的设备驱动接口。

2. 设备驱动 API

Linux 和 Windows 驱动 API 都属于事件驱动类型:只有当某些事件发生的时候,驱动代码才执行——当用户的应用程序希望从设备获取一些东西,或者当设备有某些请求需要告知操作系统。

2.1. 初始化

在 Windows 上,驱动被表示为 DriverObject 结构,它在 DriverEntry 函数的执行过程中被初始化。这些入口点也注册一些回调函数,用来响应设备的添加和移除、驱动卸载和处理新进入的 IRP。当一个设备连接的时候,Windows 创建一个设备对象,这个设备对象在设备驱动后面处理所有应用请求。

相比于 Windows,Linux 设备驱动生命周期由内核模块的 module_initmodule_exit 函数负责管理,它们分别用于模块的加载和卸载。它们负责注册模块来通过使用内核接口来处理设备的请求。这个模块需要创建一个设备文件(或者一个网络接口),为其所希望管理的设备指定一个数字识别号,并注册一些当用户与设备文件交互的时候所使用的回调函数。

2.2. 命名和声明设备

在 Windows 上注册设备

Windows 设备驱动在新连接设备时是由回调函数 AddDevice 通知的。它接下来就去创建一个 设备对象 device object ,用于识别该设备的特定的驱动实例。取决于驱动的类型,设备对象可以是 物理设备对象 Physical Device Object (PDO), 功能设备对象 Function Device Object (FDO),或者 过滤设备对象 Filter Device Object (FIDO)。设备对象能够堆叠,PDO 在底层。

设备对象在这个设备连接在计算机期间一直存在。DeviceExtension 结构能够被用于关联到一个设备对象的全局数据。

设备对象可以有如下形式的名字 \Device\DeviceName,这被系统用来识别和定位它们。应用可以使用 CreateFile API 函数来打开一个有上述名字的文件,获得一个可以用于和设备交互的句柄。

然而,通常只有 PDO 有自己的名字。未命名的设备能够通过设备级接口来访问。设备驱动注册一个或多个接口,以 128 位全局唯一标识符(GUID)来标示它们。用户应用能够使用已知的 GUID 来获取一个设备的句柄。

在 Linux 上注册设备

在 Linux 平台上,用户应用通过文件系统入口访问设备,它通常位于 /dev 目录。在模块初始化的时候,它通过调用内核函数 register_chrdev 创建了所有需要的入口。应用可以发起 open 系统调用来获取一个文件描述符来与设备进行交互。这个调用后来被发送到回调函数,这个调用(以及将来对该返回的文件描述符的进一步调用,例如 readwriteclose)会被分配到由该模块安装到 file_operations 或者 block_device_operations这样的数据结构中的回调函数。

设备驱动模块负责分配和保持任何需要用于操作的数据结构。传送进文件系统回调函数的 file 结构有一个 private_data 字段,它可以被用来存放指向具体驱动数据的指针。块设备和网络接口 API 也提供类似的字段。

虽然应用使用文件系统的节点来定位设备,但是 Linux 在内部使用一个 主设备号 major numbers 次设备号 minor numbers 的概念来识别设备及其驱动。主设备号被用来识别设备驱动,而次设备号由驱动使用来识别它所管理的设备。驱动为了去管理一个或多个固定的主设备号,必须首先注册自己或者让系统来分配未使用的设备号给它。

目前,Linux 为 主次设备对 major-minor pairs 使用一个 32 位的值,其中 12 位分配主设备号,并允许多达 4096 个不同的设备。主次设备对对于字符设备和块设备是不同的,所以一个字符设备和一个块设备能使用相同的设备对而不导致冲突。网络接口是通过像 eth0 的符号名来识别,这些又是区别于主次设备的字符设备和块设备的。

2.3. 交换数据

Linux 和 Windows 都支持在用户级应用程序和内核级驱动程序之间传输数据的三种方式:

  • 缓冲型输入输出 Buffered Input-Output 它使用由内核管理的缓冲区。对于写操作,内核从用户空间缓冲区中拷贝数据到内核分配的缓冲区,并且把它传送到设备驱动中。读操作也一样,由内核将数据从内核缓冲区中拷贝到应用提供的缓冲区中。
  • 直接型输入输出 Direct Input-Output 它不使用拷贝功能。代替它的是,内核在物理内存中钉死一块用户分配的缓冲区以便它可以一直留在那里,以便在数据传输过程中不被交换出去。
  • 内存映射 Memory mapping 它也能够由内核管理,这样内核和用户空间应用就能够通过不同的地址访问同样的内存页。
Windows 上的驱动程序 I/O 模式

支持缓冲型 I/O 是 WDM 的内置功能。缓冲区能够被设备驱动通过在 IRP 结构中的 AssociatedIrp.SystemBuffer 字段访问。当需要和用户空间通讯的时候,驱动只需从这个缓冲区中进行读写操作。

Windows 上的直接 I/O 由 内存描述符列表 memory descriptor lists (MDL)介导。这种半透明的结构是通过在 IRP 中的 MdlAddress 字段来访问的。它们被用来定位由用户应用程序分配的缓冲区的物理地址,并在 I/O 请求期间钉死不动。

在 Windows 上进行数据传输的第三个选项称为 METHOD_NEITHER。 在这种情况下,内核需要传送用户空间的输入输出缓冲区的虚拟地址给驱动,而不需要确定它们有效或者保证它们映射到一个可以由设备驱动访问的物理内存地址。设备驱动负责处理这些数据传输的细节。

Linux 上的驱动程序 I/O 模式

Linux 提供许多函数例如,clear_usercopy_to_userstrncpy_from_user 和一些其它的用来在内核和用户内存之间进行缓冲区数据传输的函数。这些函数保证了指向数据缓存区指针的有效,并且通过在内存区域之间安全地拷贝数据缓冲区来处理数据传输的所有细节。

然而,块设备的驱动对已知大小的整个数据块进行操作,它可以在内核和用户地址区域之间被快速移动而不需要拷贝它们。这种情况是由 Linux 内核来自动处理所有的块设备驱动。块请求队列处理传送数据块而不用多余的拷贝,而 Linux 系统调用接口来转换文件系统请求到块请求中。

最终,设备驱动能够从内核地址区域分配一些存储页面(不可交换的)并且使用 remap_pfn_range 函数来直接映射这些页面到用户进程的地址空间。然后应用能获取这些缓冲区的虚拟地址并且使用它来和设备驱动交流。

3. 设备驱动开发环境

3.1. 设备驱动框架

Windows 驱动程序工具包

Windows 是一个闭源操作系统。Microsoft 提供 Windows 驱动程序工具包以方便非 Microsoft 供应商开发 Windows 设备驱动。工具包中包含开发、调试、检验和打包 Windows 设备驱动等所需的所有内容。

Windows 驱动模型 Windows Driver Model (WDM)为设备驱动定义了一个干净的接口框架。Windows 保持这些接口的源代码和二进制的兼容性。编译好的 WDM 驱动通常是前向兼容性:也就是说,一个较旧的驱动能够在没有重新编译的情况下在较新的系统上运行,但是它当然不能够访问系统提供的新功能。但是,驱动不保证后向兼容性。

Linux 源代码

和 Windows 相对比,Linux 是一个开源操作系统,因此 Linux 的整个源代码是用于驱动开发的 SDK。没有驱动设备的正式框架,但是 Linux 内核包含许多提供了如驱动注册这样的通用服务的子系统。这些子系统的接口在内核头文件中描述。

尽管 Linux 有定义接口,但这些接口在设计上并不稳定。Linux 不提供有关前向和后向兼容的任何保证。设备驱动对于不同的内核版本需要重新编译。没有稳定性的保证可以让 Linux 内核进行快速开发,因为开发人员不必去支持旧的接口,并且能够使用最好的方法解决手头的这些问题。

当为 Linux 写 树内 in-tree (指当前 Linux 内核开发主干)驱动程序时,这种不断变化的环境不会造成任何问题,因为它们作为内核源代码的一部分,与内核本身同步更新。然而,闭源驱动必须单独开发,并且在 树外 out-of-tree ,必须维护它们以支持不同的内核版本。因此,Linux 鼓励设备驱动程序开发人员在树内维护他们的驱动。

3.2. 为设备驱动构建系统

Windows 驱动程序工具包为 Microsoft Visual Studio 添加了驱动开发支持,并包括用来构建驱动程序代码的编译器。开发 Windows 设备驱动程序与在 IDE 中开发用户空间应用程序没有太大的区别。Microsoft 提供了一个企业 Windows 驱动程序工具包,提供了类似于 Linux 命令行的构建环境。

Linux 使用 Makefile 作为树内和树外系统设备驱动程序的构建系统。Linux 构建系统非常发达,通常是一个设备驱动程序只需要少数行就产生一个可工作的二进制代码。开发人员可以使用任何 IDE,只要它可以处理 Linux 源代码库和运行 make ,他们也可以很容易地从终端手动编译驱动程序。

3.3. 文档支持

Windows 对于驱动程序的开发有良好的文档支持。Windows 驱动程序工具包包括文档和示例驱动程序代码,通过 MSDN 可获得关于内核接口的大量信息,并存在大量的有关驱动程序开发和 Windows 底层的参考和指南。

Linux 文档不是描述性的,但整个 Linux 源代码可供驱动开发人员使用缓解了这一问题。源代码树中的 Documentation 目录描述了一些 Linux 的子系统,但是有几本书介绍了关于 Linux 设备驱动程序开发和 Linux 内核概览,它们更详细。

Linux 没有提供设备驱动程序的指定样本,但现有生产级驱动程序的源代码可用,可以用作开发新设备驱动程序的参考。

3.4. 调试支持

Linux 和 Windows 都有可用于追踪调试驱动程序代码的日志机制。在 Windows 上将使用 DbgPrint 函数,而在 Linux 上使用的函数称为 printk。然而,并不是每个问题都可以通过只使用日志记录和源代码来解决。有时断点更有用,因为它们允许检查驱动代码的动态行为。交互式调试对于研究崩溃的原因也是必不可少的。

Windows 通过其内核级调试器 WinDbg 支持交互式调试。这需要通过一个串行端口连接两台机器:一台计算机运行被调试的内核,另一台运行调试器和控制被调试的操作系统。Windows 驱动程序工具包包括 Windows 内核的调试符号,因此 Windows 的数据结构将在调试器中部分可见。

Linux 还支持通过 KDBKGDB 进行的交互式调试。调试支持可以内置到内核,并可在启动时启用。之后,可以直接通过物理键盘调试系统,或通过串行端口从另一台计算机连接到它。KDB 提供了一个简单的命令行界面,这是唯一的在同一台机器上来调试内核的方法。然而,KDB 缺乏源代码级调试支持。KGDB 通过串行端口提供了一个更复杂的接口。它允许使用像 GDB 这样标准的应用程序调试器来调试 Linux 内核,就像任何其它用户空间应用程序一样。

4. 设备驱动分发

4.1. 安装设备驱动

在 Windows 上安装的驱动程序,是由被称为为 INF 的文本文件描述的,通常存储在 C:\Windows\INF 目录中。这些文件由驱动供应商提供,并且定义哪些设备由该驱动程序服务,哪里可以找到驱动程序的二进制文件,和驱动程序的版本等。

当一个新设备插入计算机时,Windows 通过查看已经安装的驱动程序并且选择适当的一个加载。当设备被移除的时候,驱动会自动卸载它。

在 Linux 上,一些驱动被构建到内核中并且保持永久的加载。非必要的驱动被构建为内核模块,它们通常是存储在 /lib/modules/kernel-version 目录中。这个目录还包含各种配置文件,如 modules.dep,用于描述内核模块之间的依赖关系。

虽然 Linux 内核可以在自身启动时加载一些模块,但通常模块加载由用户空间应用程序监督。例如,init 进程可能在系统初始化期间加载一些模块,udev 守护程序负责跟踪新插入的设备并为它们加载适当的模块。

4.2. 更新设备驱动

Windows 为设备驱动程序提供了稳定的二进制接口,因此在某些情况下,无需与系统一起更新驱动程序二进制文件。任何必要的更新由 Windows Update 服务处理,它负责定位、下载和安装适用于系统的最新版本的驱动程序。

然而,Linux 不提供稳定的二进制接口,因此有必要在每次内核更新时重新编译和更新所有必需的设备驱动程序。显然,内置在内核中的设备驱动程序会自动更新,但是树外模块会产生轻微的问题。 维护最新的模块二进制文件的任务通常用 DKMS 来解决:这是一个当安装新的内核版本时自动重建所有注册的内核模块的服务。

4.3. 安全方面的考虑

所有 Windows 设备驱动程序在 Windows 加载它们之前必须被数字签名。在开发期间可以使用自签名证书,但是分发给终端用户的驱动程序包必须使用 Microsoft 信任的有效证书进行签名。供应商可以从 Microsoft 授权的任何受信任的证书颁发机构获取 软件出版商证书 Software Publisher Certificate 。然后,此证书由 Microsoft 交叉签名,并且生成的交叉证书用于在发行之前签署驱动程序包。

Linux 内核也能配置为在内核模块被加载前校验签名,并禁止不可信的内核模块。被内核所信任的公钥集在构建时是固定的,并且是完全可配置的。由内核执行的检查,这个检查严格性在构建时也是可配置的,范围从简单地为不可信模块发出警告,到拒绝加载有效性可疑的任何东西。

5. 结论

如上所示,Windows 和 Linux 设备驱动程序基础设施有一些共同点,例如调用 API 的方法,但更多的细节是相当不同的。最突出的差异源于 Windows 是由商业公司开发的封闭源操作系统这个事实。这使得 Windows 上有好的、文档化的、稳定的驱动 ABI 和正式框架,而在 Linux 上,更多的是源代码做了一个有益的补充。文档支持也在 Windows 环境中更加发达,因为 Microsoft 具有维护它所需的资源。

另一方面,Linux 不会使用框架来限制设备驱动程序开发人员,并且内核和产品级设备驱动程序的源代码可以在需要的时候有所帮助。缺乏接口稳定性也有其作用,因为它意味着最新的设备驱动程序总是使用最新的接口,内核本身承载较小的后向兼容性负担,这带来了更干净的代码。

了解这些差异以及每个系统的具体情况是为您的设备提供有效的驱动程序开发和支持的关键的第一步。我们希望这篇文章对 Windows 和 Linux 设备驱动程序开发做的对比,有助于您理解它们,并在设备驱动程序开发过程的研究中,将此作为一个伟大的起点。


via: http://xmodulo.com/linux-vs-windows-device-driver-model.html

作者:Dennis Turpitka 译者:FrankXinqi &YangYang 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

How To Setup A WiFi In Arch Linux Using Terminal

如果你使用的是其他 Linux 发行版 而不是 Arch CLI,那么可能会不习惯在终端里设置 WiFi。尽管整个过程有点简单,不过我还是要讲一下。在这篇文章里,我将带领新手们通过一步步的设置向导,把你们的 Arch Linux 接入到你的 WiFi 网络里。

在 Linux 里有很多程序来设置无线连接,我们可以用 ipiw 来配置因特网连接,但是对于新手来说有点复杂。所以我们会使用 netctl 命令,这是一个基于命令行的工具,用来通过配置文件来设置和管理网络连接。

注意:所有的设定都需要 root 权限,或者你也可以使用 sudo 命令来完成。

搜索网络

运行下面的命令来查看你的网络接口:

iwconfig

运行如下命令启用你的网络接口,如果没有启用的话:

ip link set &nbsp;interface&nbsp;up

运行下面的命令搜索可用的 WiFi 网络。可以向下翻页来查看。

iwlist interface scan | less

注意: 命令里的 interface 是之前用 iwconfig 获取到的实际网络接口。

扫描完,如果不使用该接口可以运行如下命令关闭:

ip link set interface down

使用 netctl 配置 Wi-Fi:

在使用 netctl 设置连接之前,你必须先检查一下你的网卡在 Linux 下的兼容性。

运行命令:

lspci -k

这条命令是用来检查内核是否加载了你的无线网卡驱动。输出必须是像这样的:

如果内核没有加载驱动,你就必须使用有线连接来安装一下。这里是 Linux 无线网络的官方维基页面:https://wireless.wiki.kernel.org/

如果你的无线网卡和 Linux 兼容,你可以使用 netctl configuration

netctl 使用配置文件,这是一个包含连接信息的文件。创建这个文件有简单和困难两种方式。

简单方式 – Wifi-menu

如果你想用 wifi-menu,必须安装 dialog

  1. 运行命令: wifi-menu
  2. 选择你的网络

wifi-menu to setup wifi in arch

  1. 输入正确的密码并等待

wifi-menu setup wifi password in arch

如果没有连接失败的信息,你可以用下面的命令确认下:

ping -c 3 www.google.com

哇!如果你看到正在 ping,意味着网络设置成功。你现在已经在 Arch Linux 下连上 WiFi 了。如果有任何问题,可以倒回去重来。也许漏了什么。

困难方式

比起上面的 wifi-menu 命令,这种方式会难一点点,所以我叫做困难方式。在上面的命令里,网络配置会自动生成。而在困难方式里,我们将手动修改配置文件。不过不要担心,也没那么难。那我们开始吧!

  1. 首先第一件事,你必须要知道网络接口的名字,通常会是 wlan0wlp2s0,但是也有很多例外。要确认你自己的网络接口,输入 iwconfig 命令并记下来。

scan wifi networks in arch linux cli

  1. 运行命令:
cd /etc/netctl/examples

在这个目录里,有很多不同的配置文件例子。

  1. 拷贝将用到的配置文件例子到 /etc/netctl/your_profile
cp /etc/netctl/examples/wireless-wpa /etc/netctl/your_profile
  1. 你可以用这个命令来查看配置文件内容: cat /etc/netctl/your_profile

view network profile in arch linux

  1. vi 或者 nano 编辑你的配置文件的下面几个部分:
nano /etc/netctl/your_profile
- `Interface`:比如说 `wlan0`
- `ESSID`:你的无线网络名字
- `key`:你的无线网络密码

注意:

如果你不知道怎么用 nano,打开文件后,编辑要修改的地方,完了按 ctrl+o,然后回车,然后按 ctrl+x

edit network profile in arch

运行 netctl

  1. 运行命令:
cd /etc/netctl
ls

你一定会看到 wifi-menu 生成的配置文件,比如 wlan0-SSID;或者你选择了困难方式,你一定会看到你自己创建的配置文件。

  1. 运行命令启动连接配置:netctl start your_profile
  2. 用下面的命令测试连接:
ping -c 3 www.google.com

输出看上去像这样: check internet connection in arch linux

  1. 最后,你必须运行下面的命令:netctl enable your_profile
netctl enable your_profile

这样将创建并激活一个 systemd 服务,然后开机时自动启动。然后欢呼吧!你在你的 Arch Linux 里配置好 wifi 网络啦。

其他工具

你还可以使用其他程序来设置无线连接:

iw:

  1. iw dev wlan0 link – 状态
  2. iw dev wlan0 scan – 搜索网络
  3. iw dev wlan0 connect your_essid – 连接到开放网络
  4. iw dev wlan0 connect your_essid key your_key - 使用 16 进制密钥连接到 WEP 加密的网络

wpa\_supplicant

Wicd

NetworkManager

总结

会了吧!我提供了在 Arch Linux 里接入 WiFI 网络的三种方式。这里有一件事我再强调一下,当你执行第一条命令的时候,请记住你的网络接口名字。在接下来搜索网络的命令里,请使用你的网络接口名字比如 wlan0wlp2s0(上一个命令里得到的),而不是用 interface 这个词。如果你碰到任何问题,可以在下面的评论区里直接留言给我。然后别忘了在你的朋友圈里和大家分享这篇文章哦。谢谢!


via: http://www.linuxandubuntu.com/home/how-to-setup-a-wifi-in-arch-linux-using-terminal

作者:Mohd Sohail 译者:zpl1025 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出