Merge remote-tracking branch 'LCTT/master'

This commit is contained in:
wxy 2018-02-03 18:51:47 +08:00
commit c6cb192d2d
8 changed files with 394 additions and 395 deletions

View File

@ -0,0 +1,127 @@
怎样完整地离线更新并升级基于 Debian 的操作系统
======
![](https://www.ostechnix.com/wp-content/uploads/2017/11/Upgrade-Offline-Debian-based-Systems-2-720x340.png)
不久之前我已经向你展示了如何在任意离线的 [Ubuntu][1] 和 [Arch Linux][2] 操作系统上安装软件。 今天,我们将会看看如何完整地离线更新并升级基于 Debian 的操作系统。 和之前所述方法的不同之处在于,这次我们将会升级整个操作系统,而不是单个的软件包。这个方法在你没有网络链接或拥有的网络速度很慢的时候十分有用。
### 完整地离线更新并升级基于 Debian 的操作系统
首先假设你在单位拥有正在运行并配置有高速互联网链接的系统Windows 或者 Linux而在家有一个没有网络链接或网络很慢例如拨号网络的 Debian 或其衍生的操作系统。现在如果你想要离线更新你家里的操作系统怎么办?购买一个更加高速的网络链接?不,根本不需要!你仍然可以通过互联网离线更新升级你的操作系统。这正是 **Apt-Offline**工具可以帮助你做到的。
正如其名apt-offline 是一个为 Debian 及其衍生发行版(诸如 Ubuntu、Linux Mint 这样基于 APT 的操作系统)提供的离线 APT 包管理器。使用 apt-offline我们可以完整地更新/升级我们的 Debian 系统而不需要网络链接。这个程序是由 Python 编程语言写成的兼具 CLI 和图形界面的跨平台工具。
#### 准备工作
* 一个已经联网的操作系统Windows 或者 Linux。在这份指南中为了便于理解我们将之称为在线操作系统。
* 一个离线操作系统Debian 及其衍生版本)。我们称之为离线操作系统。
* 有足够空间容纳所有更新包的 USB 驱动器或者外接硬盘。
#### 安装
Apt-Offline 可以在 Debian 及其衍生版本的默认仓库中获得。如果你的在线操作系统是运行的 Debian、Ubuntu、Linux Mint及其它基于 DEB 的操作系统,你可以通过下面的命令安装 Apt-Offline
```
sudo apt-get install apt-offline
```
如果你的在线操作系统运行的是非 Debian 类的发行版,使用 `git clone` 获取 Apt-Offline 仓库:
```
git clone https://github.com/rickysarraf/apt-offline.git
```
切换到克隆的目录下并在此处运行:
```
cd apt-offline/
sudo ./apt-offline
```
#### 在离线操作系统(没有联网的操作系统)上的步骤
到你的离线操作系统上创建一个你想存储签名文件的目录:
```
mkdir ~/tmp
cd ~/tmp/
```
你可以自己选择使用任何目录。接下来,运行下面的命令生成签名文件:
```
sudo apt-offline set apt-offline.sig
```
示例输出如下:
```
Generating database of files that are needed for an update.
Generating database of file that are needed for operation upgrade
```
默认条件下apt-offline 将会生成需要更新和升级的相关文件的数据库。你可以使用 `--update` 或者 `--upgrade` 选项相应创建。
拷贝完整的 `tmp` 目录到你的 USB 驱动器或者或者外接硬盘上,然后换到你的在线操作系统(有网络链接的操作系统)。
#### 在在线操作系统上的步骤
插入你的 USB 驱动器然后进入 `tmp` 文件夹:
```
cd tmp/
```
然后,运行如下命令:
```
sudo apt-offline get apt-offline.sig --threads 5 --bundle apt-offline-bundle.zip
```
在这里的 `-threads 5` 代表着(并发连接的) APT 仓库的数目。如果你想要从更多的仓库下载软件包,你可以增加这里的数值。然后 `-bundle apt-offline-bundle.zip` 选项表示所有的软件包将会打包到一个叫做 `apt-offline-bundle.zip` 的单独存档中。这个存档文件将会被保存在你的当前工作目录中LCTT 译注:即 `tmp` 目录)。
上面的命令将会按照之前在离线操作系统上生成的签名文件下载数据。
![][4]
根据你的网络状况这个操作将会花费几分钟左右的时间。请记住apt-offline 是跨平台的,所以你可以在任何操作系统上使用它下载包。
一旦下载完成,拷贝 `tmp` 文件夹到你的 USB 或者外接硬盘上并且返回你的离线操作系统LCTT 译注:此处的复制操作似不必要,因为我们一直在 USB 存储器的 `tmp` 目录中操作)。千万保证你的 USB 驱动器上有足够的空闲空间存储所有的下载文件,因为所有的包都放在 `tmp` 文件夹里了。
#### 离线操作系统上的步骤
把你的设备插入你的离线操作系统,然后切换到你之前下载了所有包的 `tmp`目录下。
```
cd tmp
```
然后,运行下面的命令来安装所有下载好的包。
```
sudo apt-offline install apt-offline-bundle.zip
```
这个命令将会更新 APT 数据库,所以 APT 将会在 APT 缓冲里找所有需要的包。
**注意事项:** 如果在线和离线操作系统都在同一个局域网中,你可以通过 `scp` 或者其他传输应用程序将 `tmp` 文件传到离线操作系统中。如果两个操作系统在不同的位置LCTT 译注:意指在不同的局域网),那就使用 USB 设备来拷贝。
好了大伙儿,现在就这么多了。 希望这篇指南对你有用。还有更多好东西正在路上。敬请关注!
祝你愉快!
--------------------------------------------------------------------------------
via: https://www.ostechnix.com/fully-update-upgrade-offline-debian-based-systems/
作者:[SK][a]
译者:[leemeans](https://github.com/leemeans)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]:https://www.ostechnix.com/author/sk/
[1]:https://www.ostechnix.com/install-softwares-offline-ubuntu-16-04/
[2]:https://www.ostechnix.com/install-packages-offline-arch-linux/
[3]:data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7
[4]:http://www.ostechnix.com/wp-content/uploads/2017/11/apt-offline.png

View File

@ -1,65 +1,68 @@
为初学者准备的 MariaDB 管理命令
======
之前我们学过了[在 Centos/RHEL 7 上安装 MariaDB 服务器并保证其安全 ][1],使之成为了 RHEL/CentOS 7 的默认数据库。现在我们再来看看一些有用的 MariaDB 管理命令。这些都是些使用 MariaDB 最基础的命令,而且他们对 MySQL 也同样适合,因为 Mariadb 就是 MySQL 的一个分支而已。
之前我们学过了[在 Centos/RHEL 7 上安装 MariaDB 服务器并保证其安全][1],使之成为了 RHEL/CentOS 7 的默认数据库。现在我们再来看看一些有用的 MariaDB 管理命令。这些都是使用 MariaDB 最基础的命令,而且它们对 MySQL 也同样适合,因为 Mariadb 就是 MySQL 的一个分支而已。
**(推荐阅读:[在 RHEL/CentOS 上安装并配置 MongoDB][2])**
## MariaDB 管理命令
### MariaDB 管理命令
### 查看 MariaDB 安装的版本
#### 1、查看 MariaDB 安装的版本
要查看所安装数据库的当前版本,在终端中输入下面命令
要查看所安装数据库的当前版本,在终端中输入下面命令
```
$ mysql -version
```
该命令会告诉你数据库的当前版本。此外你也可以运行下面命令来查看版本的详细信息
该命令会告诉你数据库的当前版本。此外你也可以运行下面命令来查看版本的详细信息
```
$ mysqladmin -u root -p version
```
### 登陆 mariadb
#### 2、登录 MariaDB
要登陆 mariadb 服务器,运行
要登录 MariaDB 服务器,运行:
```
$ mysql -u root -p
```
然后输入密码登
然后输入密码登录。
### 列出所有的数据库
#### 3、列出所有的数据库
要列出 maridb 当前拥有的所有数据库,在你登陆到 mariadb 中后运行
要列出 MariaDB 当前拥有的所有数据库,在你登录到 MariaDB 中后运行:
```
$ show databases;
> show databases;
```
### 创建新数据库
LCTT 译注:`$` 这里代表 shell 的提示符,`>` 这里代表 MariaDB shell 的提示符。)
在 mariadb 中创建新数据库,登陆 mariabdb 后运行
#### 4、创建新数据库
在 MariaDB 中创建新数据库,登录 MariaDB 后运行:
```
$ create database dan;
> create database dan;
```
若想直接在终端创建数据库,则运行
若想直接在终端创建数据库,则运行
```
$ mysqladmin -u user -p create dan
```
这里,**dan** 就是新数据库的名词
这里,`dan` 就是新数据库的名称。
### 删除数据库
#### 5、删除数据库
要删除数据库,在已登陆的 mariadb 会话中运行
要删除数据库,在已登录的 MariaDB 会话中运行:
```
$ drop database dan;
> drop database dan;
```
此外你也可以运行,
@ -68,33 +71,33 @@ $ drop database dan;
$ mysqladmin -u root -p drop dan
```
**注意:-** 若在运行 mysqladmin 命令时提示 'access denied' 错误,这应该是由于我们没有给 root 授权。要对 root 授权,请参照第 7 点方法,只是要将用户改成 root。
**注意:** 若在运行 `mysqladmin` 命令时提示 “access denied” 错误,这应该是由于我们没有给 root 授权。要对 root 授权,请参照第 7 点方法,只是要将用户改成 root。
### 创建新用户
#### 6、创建新用户
为数据库创建新用户,运行
为数据库创建新用户,运行
```
$ CREATE USER 'dan'@'localhost' IDENTIFIED BY 'password';
> CREATE USER 'dan'@'localhost' IDENTIFIED BY 'password';
```
### 授权用户访问某个数据库
#### 7、授权用户访问某个数据库
授权用户访问某个数据库,运行
授权用户访问某个数据库,运行
```
$ GRANT ALL PRIVILEGES ON test。* to 'dan'@'localhost';
> GRANT ALL PRIVILEGES ON test.* to 'dan'@'localhost';
```
这会赋予用户 dan 对名为 test 的数据库完全操作的权限。我们也可以限定为用户只赋予 SELECTINSERTDELETE 权限。
这会赋予用户 `dan` 对名为 `test` 的数据库完全操作的权限。我们也可以限定为用户只赋予 `SELECT`、`INSERT`、`DELETE` 权限。
要赋予访问所有数据库的权限,将 test 替换成 * .像这样。
要赋予访问所有数据库的权限,将 `test` 替换成 `*` 。像这样:
```
$ GRANT ALL PRIVILEGES ON *。* to 'dan'@'localhost';
> GRANT ALL PRIVILEGES ON *.* to 'dan'@'localhost';
```
### 备份/导出 数据库
#### 8、备份/导出数据库
要创建单个数据库的备份,在终端窗口中运行下列命令,
@ -102,53 +105,53 @@ $ GRANT ALL PRIVILEGES ON *。* to 'dan'@'localhost';
$ mysqldump -u root -p database_name>db_backup.sql
```
若要一次性创建多个数据库的备份则运行
若要一次性创建多个数据库的备份则运行
```
$ mysqldump -u root -p - - databases db1 db2 > db12_backup.sql
$ mysqldump -u root -p --databases db1 db2 > db12_backup.sql
```
要一次性导出多个数据库,则运行
要一次性导出多个数据库,则运行
```
$ mysqldump -u root -p - - all-databases >all_dbs.sql
$ mysqldump -u root -p --all-databases > all_dbs.sql
```
### 从备份中恢复数据库
#### 9、从备份中恢复数据库
要从备份中恢复数据库,运行
要从备份中恢复数据库,运行
```
$ mysql -u root -p database_name<db_backup.sql
$ mysql -u root -p database_name < db_backup.sql
```
但这条命令成功的前提是预先没有存在同名的数据库。如果想要恢复数据库数据到已经存在的数据库中,则需要用到 'mysqlimport' 命令,
但这条命令成功的前提是预先没有存在同名的数据库。如果想要恢复数据库数据到已经存在的数据库中,则需要用到 `mysqlimport` 命令:
```
$ mysqlimport -u root -p database_name<db_backup.sql
$ mysqlimport -u root -p database_name < db_backup.sql
```
### 更改 mariadb 用户的密码
#### 10、更改 mariadb 用户的密码
本例中我们会修改 root 的密码,但修改其他用户的密码也是一样的过程,
本例中我们会修改 `root` 的密码,但修改其他用户的密码也是一样的过程。
陆 mariadb 并切换到 'mysql' 数据库,
录 mariadb 并切换到 'mysql' 数据库:
```
$ mysql -u root -p
$ use mysql;
> use mysql;
```
然后运行下面命令
然后运行下面命令
```
$ update user set password=PASSWORD( 'your_new_password_here') where User='root';
> update user set password=PASSWORD('your_new_password_here') where User='root';
```
下一步,重新加载权限
下一步,重新加载权限
```
$ flush privileges;
> flush privileges;
```
然后退出会话。
@ -160,9 +163,9 @@ $ flush privileges;
via: http://linuxtechlab.com/mariadb-administration-commands-beginners/
作者:[Shusain ][a]
作者:[Shusain][a]
译者:[lujun9972](https://github.com/lujun9972)
校对:[校对者ID](https://github.com/校对者ID)
校对:[wxy](https://github.com/wxy)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出

View File

@ -1,4 +1,4 @@
Linux Find Out Last System Reboot Time and Date Command
Linux Find Out Last System Reboot Time and Date Command
======
So, how do you find out your Linux or UNIX-like system was last rebooted? How do you display the system shutdown date and time? The last utility will either list the sessions of specified users, ttys, and hosts, in reverse time order, or list the users logged in at a specified date and time. Each line of output contains the user name, the tty from which the session was conducted, any hostname, the start and stop times for the session, and the duration of the session. To view Linux or Unix system reboot and shutdown date and time stamp using the following commands:

View File

@ -1,210 +0,0 @@
# Tutorial on how to write basic udev rules in Linux
Contents
* * [1. Objective][4]
* [2. Requirements][5]
* [3. Difficulty][6]
* [4. Conventions][7]
* [5. Introduction][8]
* [6. How rules are organized][9]
* [7. The rules syntax][10]
* [8. A test case][11]
* [9. Operators][12]
* * [9.1.1. == and != operators][1]
* [9.1.2. The assignment operators: = and :=][2]
* [9.1.3. The += and -= operators][3]
* [10. The keys we used][13]
### Objective
Understanding the base concepts behind udev, and learn how to write simple rules
### Requirements
* Root permissions
### Difficulty
MEDIUM
### Conventions
* **#** - requires given command to be executed with root privileges either directly as a root user or by use of `sudo` command
* **$** - given command to be executed as a regular non-privileged user
### Introduction
In a GNU/Linux system, while devices low level support is handled at the kernel level, the management of events related to them is managed in userspace by `udev`, and more precisely by the `udevd` daemon. Learning how to write rules to be applied on the occurring of those events can be really useful to modify the behavior of the system and adapt it to our needs.
### How rules are organized
Udev rules are defined into files with the `.rules` extension. There are two main locations in which those files can be placed: `/usr/lib/udev/rules.d` it's the directory used for system-installed rules, `/etc/udev/rules.d/`is reserved for custom made rules. 
The files in which the rules are defined are conventionally named with a number as prefix (e.g `50-udev-default.rules`) and are processed in lexical order independently of the directory they are in. Files installed in `/etc/udev/rules.d`, however, override those with the same name installed in the system default path.
### The rules syntax
The syntax of udev rules is not very complicated once you understand the logic behind it. A rule is composed by two main sections: the "match" part, in which we define the conditions for the rule to be applied, using a series of keys separated by a comma, and the "action" part, in which we perform some kind of action, when the conditions are met. 
### A test case
What a better way to explain possible options than to configure an actual rule? As an example, we are going to define a rule to disable the touchpad when a mouse is connected. Obviously the attributes provided in the rule definition, will reflect my hardware. 
We will write our rule in the `/etc/udev/rules.d/99-togglemouse.rules` file with the help of our favorite text editor. A rule definition can span over multiple lines, but if that's the case, a backslash must be used before the newline character, as a line continuation, just as in shell scripts. Here is our rule:
```
ACTION=="add" \
, ATTRS{idProduct}=="c52f" \
, ATTRS{idVendor}=="046d" \
, ENV{DISPLAY}=":0" \
, ENV{XAUTHORITY}="/run/user/1000/gdm/Xauthority" \
, RUN+="/usr/bin/xinput --disable 16"
```
Let's analyze it.
### Operators
First of all, an explanation of the used and possible operators:
#### == and != operators
The `==` is the equality operator and the `!=` is the inequality operator. By using them we establish that for the rule to be applied the defined keys must match, or not match the defined value respectively.
#### The assignment operators: = and :=
The `=` assignment operator, is used to assign a value to the keys that accepts one. We use the `:=` operator, instead, when we want to assign a value and we want to make sure that it is not overridden by other rules: the values assigned with this operator, in facts, cannot be altered.
#### The += and -= operators
The `+=` and `-=` operators are used respectively to add or to remove a value from the list of values defined for a specific key.
### The keys we used
Let's now analyze the keys we used in the rule. First of all we have the `ACTION` key: by using it, we specified that our rule is to be applied when a specific event happens for the device. Valid values are `add`, `remove` and `change` 
We then used the `ATTRS` keyword to specify an attribute to be matched. We can list a device attributes by using the `udevadm info` command, providing its name or `sysfs` path:
```
udevadm info -ap /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2/2-1.2:1.1/0003:046D:C52F.0010/input/input39
Udevadm info starts with the device specified by the devpath and then
walks up the chain of parent devices. It prints for every device
found, all possible attributes in the udev rules key format.
A rule to match, can be composed by the attributes of the device
and the attributes from one single parent device.
looking at device '/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2/2-1.2:1.1/0003:046D:C52F.0010/input/input39':
KERNEL=="input39"
SUBSYSTEM=="input"
DRIVER==""
ATTR{name}=="Logitech USB Receiver"
ATTR{phys}=="usb-0000:00:1d.0-1.2/input1"
ATTR{properties}=="0"
ATTR{uniq}==""
looking at parent device '/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2/2-1.2:1.1/0003:046D:C52F.0010':
KERNELS=="0003:046D:C52F.0010"
SUBSYSTEMS=="hid"
DRIVERS=="hid-generic"
ATTRS{country}=="00"
looking at parent device '/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2/2-1.2:1.1':
KERNELS=="2-1.2:1.1"
SUBSYSTEMS=="usb"
DRIVERS=="usbhid"
ATTRS{authorized}=="1"
ATTRS{bAlternateSetting}==" 0"
ATTRS{bInterfaceClass}=="03"
ATTRS{bInterfaceNumber}=="01"
ATTRS{bInterfaceProtocol}=="00"
ATTRS{bInterfaceSubClass}=="00"
ATTRS{bNumEndpoints}=="01"
ATTRS{supports_autosuspend}=="1"
looking at parent device '/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2':
KERNELS=="2-1.2"
SUBSYSTEMS=="usb"
DRIVERS=="usb"
ATTRS{authorized}=="1"
ATTRS{avoid_reset_quirk}=="0"
ATTRS{bConfigurationValue}=="1"
ATTRS{bDeviceClass}=="00"
ATTRS{bDeviceProtocol}=="00"
ATTRS{bDeviceSubClass}=="00"
ATTRS{bMaxPacketSize0}=="8"
ATTRS{bMaxPower}=="98mA"
ATTRS{bNumConfigurations}=="1"
ATTRS{bNumInterfaces}==" 2"
ATTRS{bcdDevice}=="3000"
ATTRS{bmAttributes}=="a0"
ATTRS{busnum}=="2"
ATTRS{configuration}=="RQR30.00_B0009"
ATTRS{devnum}=="12"
ATTRS{devpath}=="1.2"
ATTRS{idProduct}=="c52f"
ATTRS{idVendor}=="046d"
ATTRS{ltm_capable}=="no"
ATTRS{manufacturer}=="Logitech"
ATTRS{maxchild}=="0"
ATTRS{product}=="USB Receiver"
ATTRS{quirks}=="0x0"
ATTRS{removable}=="removable"
ATTRS{speed}=="12"
ATTRS{urbnum}=="1401"
ATTRS{version}==" 2.00"
[...]
```
Above is the truncated output received after running the command. As you can read it from the output itself, `udevadm` starts with the specified path that we provided, and gives us information about all the parent devices. Notice that attributes of the device are reported in singular form (e.g `KERNEL`), while the parent ones in plural form (e.g `KERNELS`). The parent information can be part of a rule but only one of the parents can be referenced at a time: mixing attributes of different parent devices will not work. In the rule we defined above, we used the attributes of one parent device: `idProduct` and `idVendor`. 
The next thing we have done in our rule, is to use the `ENV` keyword: it can be used to both set or try to match environment variables. We assigned a value to the `DISPLAY` and `XAUTHORITY` ones. Those variables are essential when interacting with the X server programmatically, to setup some needed information: with the `DISPLAY` variable, we specify on what machine the server is running, what display and what screen we are referencing, and with `XAUTHORITY` we provide the path to the file which contains Xorg authentication and authorization information. This file is usually located in the users "home" directory. 
Finally we used the `RUN` keyword: this is used to run external programs. Very important: this is not executed immediately, but the various actions are executed once all the rules have been parsed. In this case we used the `xinput` utility to change the status of the touchpad. I will not explain the syntax of xinput here, it would be out of context, just notice that `16` is the id of the touchpad. 
Once our rule is set, we can debug it by using the `udevadm test` command. This is useful for debugging but it doesn't really run commands specified using the `RUN` key:
```
$ udevadm test --action="add" /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2/2-1.2:1.1/0003:046D:C52F.0010/input/input39
```
What we provided to the command is the action to simulate, using the `--action` option, and the sysfs path of the device. If no errors are reported, our rule should be good to go. To run it in the real world, we must reload the rules:
```
# udevadm control --reload
```
This command will reload the rules files, however, will have effect only on new generated events. 
We have seen the basic concepts and logic used to create an udev rule, however we only scratched the surface of the many options and possible settings. The udev manpage provides an exhaustive list: please refer to it for a more in-depth knowledge.
--------------------------------------------------------------------------------
via: https://linuxconfig.org/tutorial-on-how-to-write-basic-udev-rules-in-linux
作者:[Egidio Docile ][a]
译者:[译者ID](https://github.com/译者ID)
校对:[校对者ID](https://github.com/校对者ID)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]:https://disqus.com/by/egidiodocile/
[1]:https://linuxconfig.org/tutorial-on-how-to-write-basic-udev-rules-in-linux#h9-1-1-and-operators
[2]:https://linuxconfig.org/tutorial-on-how-to-write-basic-udev-rules-in-linux#h9-1-2-the-assignment-operators-and
[3]:https://linuxconfig.org/tutorial-on-how-to-write-basic-udev-rules-in-linux#h9-1-3-the-and-operators
[4]:https://linuxconfig.org/tutorial-on-how-to-write-basic-udev-rules-in-linux#h1-objective
[5]:https://linuxconfig.org/tutorial-on-how-to-write-basic-udev-rules-in-linux#h2-requirements
[6]:https://linuxconfig.org/tutorial-on-how-to-write-basic-udev-rules-in-linux#h3-difficulty
[7]:https://linuxconfig.org/tutorial-on-how-to-write-basic-udev-rules-in-linux#h4-conventions
[8]:https://linuxconfig.org/tutorial-on-how-to-write-basic-udev-rules-in-linux#h5-introduction
[9]:https://linuxconfig.org/tutorial-on-how-to-write-basic-udev-rules-in-linux#h6-how-rules-are-organized
[10]:https://linuxconfig.org/tutorial-on-how-to-write-basic-udev-rules-in-linux#h7-the-rules-syntax
[11]:https://linuxconfig.org/tutorial-on-how-to-write-basic-udev-rules-in-linux#h8-a-test-case
[12]:https://linuxconfig.org/tutorial-on-how-to-write-basic-udev-rules-in-linux#h9-operators
[13]:https://linuxconfig.org/tutorial-on-how-to-write-basic-udev-rules-in-linux#h10-the-keys-we-used

View File

@ -1,3 +1,4 @@
Leemeans Translating
Fastest way to unzip a zip file in Python
======
So the context is this; a zip file is uploaded into a [web service][1] and Python then needs extract that and analyze and deal with each file within. In this particular application what it does is that it looks at the file's individual name and size, compares that to what has already been uploaded in AWS S3 and if the file is believed to be different or new, it gets uploaded to AWS S3.

View File

@ -1,3 +1,6 @@
#Being translated by YPBlib
======
Why you should use named pipes on Linux
======
@ -89,7 +92,6 @@ shs 80038 0.0 0.0 108488 764 pts/4 S 15:25 0:00 -bash
Named pipes are different enough from the more commonly used Unix/Linux pipes to warrant a different name, but "pipe" really invokes a good image of how they move data between processes, so "named pipe" fits pretty well. Maybe you'll come across a task that will benefit significantly from this very clever Unix/Linux feature.
--------------------------------------------------------------------------------
via: https://www.networkworld.com/article/3251853/linux/why-use-named-pipes-on-linux.html

View File

@ -1,134 +0,0 @@
怎样完整地更新并升级基于Debian的离线操作系统
======
![](https://www.ostechnix.com/wp-content/uploads/2017/11/Upgrade-Offline-Debian-based-Systems-2-720x340.png)
不久之前我已经向你展示了如何在任意[ **离线的Ubuntu**][1] 操作系统和任意 [**离线的Arch Linux**][2] 操作系统上安装软件。 今天我们将会看看如何完整地更新并升级基于Debian(Debian-based)的离线操作系统。 和之前所述方法的不同之处在于,(这次)我们将会升级整个操作系统(落后的软件包),而不是单个的软件包。这个方法在你没有没有网络链接或拥有的网络速度很慢的时候十分有用。
### 完整更新并升级基于Debian的离线操作系统
首先假设,你家里拥有正在运行并配置有高速互联网链接的系统(Windows或者Linux)和一个没有网络链接或网络很慢(例如拨号网络)的Debian或Debian的衍生版本系统。现在如果你想要更新你的离线家用操作系统怎么办购买一个更加高速的网络链接根本不需要你仍然可以通过互联网更新升级你的离线操作系统。这正是 **Apt-Offline**工具可以帮助你做到的。
正如其名apt-offline 是一个为Debian和Debian衍生发行版诸如UbuntuLinux Mint这样基于APT的操作系统提供的离线APT包管理器。使用apt-offline我们可以完整地更新/升级我们的Debian系统而不需要网络链接。这个程序是由Python编程语言写成的兼具CLI和图形接口的跨平台工具。
#### 准备工作
#### Requirements
* 一个已经联网的操作系统(Windows或者Linux)。在这份手册中,为了便于理解,我们将之称为在线操作系统(online system)。
* 一个离线操作系统(Debian或者Debian衍生版本)。我们称之为离线操作系统(offline system)。
* 有足够空间容纳所有更新包的USB驱动器或者外接硬盘。
#### Installation
#### 安装
Apt-Offline可以在Debian和其衍生版本的默认仓库中获得。如果你的在线操作系统是运行的DebianUbuntuLinux Mint和其他基于DEB的操作系统你可以通过下面的命令安装Apt-Offline:
```shell
sudo apt-get install apt-offline
```
如果你的在线操作系统运行的是非Debian类的发行版使用git clone获取Apt-Offline仓库:
```shell
git clone https://github.com/rickysarraf/apt-offline.git
```
切换到克隆的目录下并在此处运行。
```shell
cd apt-offline/
```
```shell
sudo ./apt-offline
```
#### 离线操作系统上的步骤(没有联网的操作系统)
到你的离线操作系统上创建一个你想存储签名文件的目录
```shell
mkdir ~/tmp
```
```shell
cd ~/tmp/
```
你可以自己选择使用任何目录。接下来,运行下面的命令生成签名文件:
```shell
sudo apt-offline set apt-offline.sig
```
示例输出如下:
```shell
Generating database of files that are needed for an update.
Generating database of file that are needed for operation upgrade
```
默认条件下apt-offline将会生成需要更新和升级的(相关)文件的数据库。你可以使用 **--` update`** 或者 **--upgrade ** 选项选择创建(升级或者更新相关文件的数据库)的其中之一。
拷贝完整的**tmp**目录到你的USB驱动器或者或者外接硬盘上然后换到你的在线操作系统(有网络链接的操作系统)。
Copy the entire **tmp** folder in an USB drive or external drive and go to your online system (Internet-enabled system).
#### 在线操作系统上的步骤
插入你的USB驱动器然后进入临时文件夹
```shell
cd tmp/
```
然后,运行如下命令:
```shell
sudo apt-offline get apt-offline.sig --threads 5 --bundle apt-offline-bundle.zip
```
在这里的"-threads 5"代表着APT仓库的数目.。如果你想要从更多的仓库下载软件包,你可以增加这里的数值。然后 "-bundle apt-offline-bundle.zip" 选项表示所有的软件包将会打包到一个叫做**apt-offline-bundle.zip**的单独存档中。这个存档文件将会被保存在当前的工作目录中。
上面的命令将会按照之前在离线操作系统上生成的签名文件下载数据。
[![][3]][4]
根据你的网络状况这个操作将会花费几分钟左右的时间。请记住apt-offline是跨平台的所以你可以在任何操作系统上使用它下载包。
一旦下载完成,拷贝**tmp**文件夹到你的USB 或者外接硬盘上并且返回你的离线操作系统。千万保证你的USB驱动器上有足够的空闲空间存储所有的下载文件因为所有的包都放在**tmp**文件夹里了。
#### 离线操作系统上的步骤
把你的设备插入你的离线操作系统,然后切换到你之前下载了所有包的**tmp**目录下。
```shell
cd tmp
```
然后,运行下面的命令来安装所有下载好的包。
```shell
sudo apt-offline install apt-offline-bundle.zip
```
这个命令将会更新APT数据库所以APT将会找到在APT缓冲里所有需要的包。
**注意事项:** 如果在线和离线操作系统都在同一个局域网中,你可以通过"scp"或者其他传输应用程序将**tmp**文件传到离线操作系统中。如果两个操作系统在不同的位置(译者注:意指在不同的局域网)那就使用USB设备来拷贝(就可以了)。
好了大伙儿,现在就这么多了。 希望这篇指南对你有用。还有更多好东西正在路上。敬请关注!
祝你愉快!
--------------------------------------------------------------------------------
via: https://www.ostechnix.com/fully-update-upgrade-offline-debian-based-systems/
作者:[SK][a]
译者:[Leemeans](https://github.com/leemeans)
校对:[校对者ID](https://github.com/校对者ID)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]:https://www.ostechnix.com/author/sk/
[1]:https://www.ostechnix.com/install-softwares-offline-ubuntu-16-04/
[2]:https://www.ostechnix.com/install-packages-offline-arch-linux/
[3]:data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7
[4]:http://www.ostechnix.com/wp-content/uploads/2017/11/apt-offline.png

View File

@ -0,0 +1,210 @@
#教程:在 Linux 中如何写一个基本的 udev 规则
### 目录
* * [1. 读者对象][4]
* [2. 要求][5]
* [3. 难度][6]
* [4. 约定][7]
* [5. 介绍][8]
* [6. 规则如何组织][9]
* [7. 规则语法][10]
* [8. 一个测试案例][11]
* [9. 操作符][12]
* * [9.1.1. == 和 != 操作][1]
* [9.1.2. 分配操作符 = 和 :=][2]
* [9.1.3. += 和 -= 操作符][3]
* [10. 我们使用的键][13]
### 读者对象
理解 udev 背后的基本概念,学习如何写简单的规则。
### 要求
* Root 权限
### 难度
中等
### 约定
* **#** - 要求给定的命令使用 root 权限或者直接以一个 root 用户或者使用 `sudo` 命令去运行。
* **$** - 要求给定的命令以一个普通的非特权用户运行。
### 介绍
在一个 GNU/Linux 系统中,虽然设备的低级别支持是在内核级中处理的,但是,它们相关的事件的管理是在用户空间中通过 `udev` 来管理的。确切地说是由 `udevd` 守护进程来完成的。学习如何去写一个规则,并应用到发生的这些事件上,将有助于我们修改系统的行为并使它适合我们的需要。
### 规则如何组织
Udev 规则是定义在一个以 `.rules` 为扩展名的文件中。那些文件主要放在两个位置:`/usr/lib/udev/rules.d`,这个目录用于存放系统安装的规则,`/etc/udev/rules.d/` 这个目录是保留给自定义规则的。
定义那些规则的文件的命名惯例是使用一个数字作为前缀(比如,`50-udev-default.rules`)并且以它们在目录中的词汇顺序进行处理的。在 `/etc/udev/rules.d` 中安装的文件,会覆盖安装在系统默认路径中的同名文件。
### 规则语法
如果你理解了 udev 规则的行为逻辑它的语法并不复杂。一个规则由两个主要的节构成“match” 部分,它使用一系列用逗号分隔的键定义了规则应用的条件,而 “action” 部分,是当条件满足时,我们执行一些动作。
### 一个测试案例
讲解可能的选项的最好方法莫过于配置一个真实的案例,因此,我们去定义一个规则作为演示,当鼠标被连接时禁用触摸板。显然,在规则定义中提供的属性将反映我的硬件。
我们将在 `/etc/udev/rules.d/99-togglemouse.rules` 文件中用我们喜欢的文本编辑器来写我们的规则。一个规则定义允许跨多个行,但是,如果是这种情况,必须在一个新行字符之前使用一个反斜线(\)表示这是上一行的后续部分,就和 shell 脚本一样,这是我们的规则:
```
ACTION=="add" \
, ATTRS{idProduct}=="c52f" \
, ATTRS{idVendor}=="046d" \
, ENV{DISPLAY}=":0" \
, ENV{XAUTHORITY}="/run/user/1000/gdm/Xauthority" \
, RUN+="/usr/bin/xinput --disable 16"
```
我们来分析一下这个规则。
### 操作符
首先,对已经使用以及将要使用的操作符解释如下:
#### == 和 != 操作符
`==` 是相等操作符,而 `!=` 是不等于操作符。通过使用它们,我们可以确认规则上应用的键是否匹配各自的值。
#### 分配操作符 = 和 :=
`=` 分配操作符,是用于为一个键分配一个值。当我们去分配一个值,并且想确保它不会被其它规则所覆盖,我们就需要使用 `:=` 操作符来代替,使用这个操作符分配的值,它确实不能被改变。
#### += 和 -= 操作符
`+=` 和 `-=` 操作符各自用于从一个指定的键中定义的值列表中增加或者移除一个值。
### 我们使用的键
现在,来分析一下在这个规则中我们使用的键。首先,我们有一个 `ACTION` 键:通过使用它,当在一个设备上发生了特定的事件,我们将指定我们要应用的规则的具体内容。有效的值有 `add`、`remove ` 以及 `change`。 
然后,我们使用 `ATTRS` 关键字去指定一个属性去匹配。我们可以使用 `udevadm info` 命令去列出一个设备属性,提供它的名字或者 `sysfs` 路径:
```
udevadm info -ap /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2/2-1.2:1.1/0003:046D:C52F.0010/input/input39
Udevadm info starts with the device specified by the devpath and then
walks up the chain of parent devices. It prints for every device
found, all possible attributes in the udev rules key format.
A rule to match, can be composed by the attributes of the device
and the attributes from one single parent device.
looking at device '/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2/2-1.2:1.1/0003:046D:C52F.0010/input/input39':
KERNEL=="input39"
SUBSYSTEM=="input"
DRIVER==""
ATTR{name}=="Logitech USB Receiver"
ATTR{phys}=="usb-0000:00:1d.0-1.2/input1"
ATTR{properties}=="0"
ATTR{uniq}==""
looking at parent device '/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2/2-1.2:1.1/0003:046D:C52F.0010':
KERNELS=="0003:046D:C52F.0010"
SUBSYSTEMS=="hid"
DRIVERS=="hid-generic"
ATTRS{country}=="00"
looking at parent device '/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2/2-1.2:1.1':
KERNELS=="2-1.2:1.1"
SUBSYSTEMS=="usb"
DRIVERS=="usbhid"
ATTRS{authorized}=="1"
ATTRS{bAlternateSetting}==" 0"
ATTRS{bInterfaceClass}=="03"
ATTRS{bInterfaceNumber}=="01"
ATTRS{bInterfaceProtocol}=="00"
ATTRS{bInterfaceSubClass}=="00"
ATTRS{bNumEndpoints}=="01"
ATTRS{supports_autosuspend}=="1"
looking at parent device '/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2':
KERNELS=="2-1.2"
SUBSYSTEMS=="usb"
DRIVERS=="usb"
ATTRS{authorized}=="1"
ATTRS{avoid_reset_quirk}=="0"
ATTRS{bConfigurationValue}=="1"
ATTRS{bDeviceClass}=="00"
ATTRS{bDeviceProtocol}=="00"
ATTRS{bDeviceSubClass}=="00"
ATTRS{bMaxPacketSize0}=="8"
ATTRS{bMaxPower}=="98mA"
ATTRS{bNumConfigurations}=="1"
ATTRS{bNumInterfaces}==" 2"
ATTRS{bcdDevice}=="3000"
ATTRS{bmAttributes}=="a0"
ATTRS{busnum}=="2"
ATTRS{configuration}=="RQR30.00_B0009"
ATTRS{devnum}=="12"
ATTRS{devpath}=="1.2"
ATTRS{idProduct}=="c52f"
ATTRS{idVendor}=="046d"
ATTRS{ltm_capable}=="no"
ATTRS{manufacturer}=="Logitech"
ATTRS{maxchild}=="0"
ATTRS{product}=="USB Receiver"
ATTRS{quirks}=="0x0"
ATTRS{removable}=="removable"
ATTRS{speed}=="12"
ATTRS{urbnum}=="1401"
ATTRS{version}==" 2.00"
[...]
```
上面截取了运行这个命令之后的输出的一部分。正如你从它的输出中看到的那样,`udevadm` 从我们提供的指定路径开始,并且提供了所有父级设备的信息。注意设备的属性都是以单数的形式报告的(比如,`KERNEL`),而它的父级是以复数形式出现的(比如,`KERNELS`)。父级信息可以做为规则的一部分,但是同一时间只能有一个父级可以被引用:不同父级设备的属性混合在一起是不能工作的。在上面我们定义的规则中,我们使用了一个父级设备属性:`idProduct` 和 `idVendor`。 
在我们的规则中接下来做的事情是,去使用 `ENV` 关键字:它既可以用于设置也可以用于去匹配环境变量。我们给 `DISPLAY` 和 `XAUTHORITY` 分配值。当我们使用 X server 程序进行交互时,这些变量是非常必要的,去设置一些需要的信息:使用 `DISPLAY` 变量,我们指定服务器运行的机器是哪个,显示什么,引用的屏幕是什么,使用 `XAUTHORITY` 它提供一个到文件的路径,它包含了 Xorg 认证和授权信息。这个文件一般位于用于的 "home" 目录中。 
最后,我们使用了 `RUN` 字:它用于去运行外部程序。非常重要:这里没有立即运行,但是一旦所有的规则被解析,将运行各种动作。在这个案例中,我们使用 `xinput` 实用程序去改变触摸板的状态。我不想增解释这里的 `xinput` 的语法,它超出了本文的范围,只需要注意这个触摸板的 ID 是 `16`。 
规则设置完成之后,我们可以通过使用 `udevadm test` 命令去调试它。这个命令对调试非常有用,它并不真实去运行 `RUN` 指定的命令:
```
$ udevadm test --action="add" /devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2/2-1.2:1.1/0003:046D:C52F.0010/input/input39
```
我们提供给命令的是使用 `--action` 选项,以及设备的 sysfs 路径的模拟动作。如果没有报告错误,说明我们的规则运行的很好。在真实的环境中去使用它,我们需要重新加载规则:
```
# udevadm control --reload
```
这个命令将重新加载规则文件,但是,它只对重新加载之后发生的事件有效果。
我们通过创建一个 udev 规则了解了基本的概念和逻辑,这只是 udev 规则中众多的选项和可能的设置中的一小部分。udev 手册页提供了一个详尽的列表:如果你想深入了解,请参考它。
--------------------------------------------------------------------------------
via: https://linuxconfig.org/tutorial-on-how-to-write-basic-udev-rules-in-linux
作者:[Egidio Docile ][a]
译者:[qhwdw](https://github.com/qhwdw)
校对:[校对者ID](https://github.com/校对者ID)
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
[a]:https://disqus.com/by/egidiodocile/
[1]:https://linuxconfig.org/tutorial-on-how-to-write-basic-udev-rules-in-linux#h9-1-1-and-operators
[2]:https://linuxconfig.org/tutorial-on-how-to-write-basic-udev-rules-in-linux#h9-1-2-the-assignment-operators-and
[3]:https://linuxconfig.org/tutorial-on-how-to-write-basic-udev-rules-in-linux#h9-1-3-the-and-operators
[4]:https://linuxconfig.org/tutorial-on-how-to-write-basic-udev-rules-in-linux#h1-objective
[5]:https://linuxconfig.org/tutorial-on-how-to-write-basic-udev-rules-in-linux#h2-requirements
[6]:https://linuxconfig.org/tutorial-on-how-to-write-basic-udev-rules-in-linux#h3-difficulty
[7]:https://linuxconfig.org/tutorial-on-how-to-write-basic-udev-rules-in-linux#h4-conventions
[8]:https://linuxconfig.org/tutorial-on-how-to-write-basic-udev-rules-in-linux#h5-introduction
[9]:https://linuxconfig.org/tutorial-on-how-to-write-basic-udev-rules-in-linux#h6-how-rules-are-organized
[10]:https://linuxconfig.org/tutorial-on-how-to-write-basic-udev-rules-in-linux#h7-the-rules-syntax
[11]:https://linuxconfig.org/tutorial-on-how-to-write-basic-udev-rules-in-linux#h8-a-test-case
[12]:https://linuxconfig.org/tutorial-on-how-to-write-basic-udev-rules-in-linux#h9-operators
[13]:https://linuxconfig.org/tutorial-on-how-to-write-basic-udev-rules-in-linux#h10-the-keys-we-used