mirror of
https://github.com/LCTT/TranslateProject.git
synced 2025-01-10 22:21:11 +08:00
commit
d5b98f13bd
@ -0,0 +1,297 @@
|
|||||||
|
[#]: collector: (lujun9972)
|
||||||
|
[#]: translator: (Starryi)
|
||||||
|
[#]: reviewer: (wxy)
|
||||||
|
[#]: publisher: (wxy)
|
||||||
|
[#]: url: (https://linux.cn/article-14159-1.html)
|
||||||
|
[#]: subject: (Create your own video streaming server with Linux)
|
||||||
|
[#]: via: (https://opensource.com/article/19/1/basic-live-video-streaming-server)
|
||||||
|
[#]: author: (Aaron J.Prisk https://opensource.com/users/ricepriskytreat)
|
||||||
|
|
||||||
|
使用 OBS 搭建视频流媒体服务器
|
||||||
|
======
|
||||||
|
|
||||||
|
> 在 Linux 或 BSD 操作系统上设置基本的实时流媒体服务器。
|
||||||
|
|
||||||
|
![](https://img.linux.net.cn/data/attachment/album/202201/08/102934r2qpr1rlkpjb1pwb.jpg)
|
||||||
|
|
||||||
|
实时视频流越来越流行。亚马逊的 Twitch 和谷歌的 YouTube 等平台拥有数百万用户,这些用户消磨了无数小时的来观看直播和录制视频。这些视频服务通常可以免费使用,但需要你拥有一个帐户,并且一般会将你的视频内容隐藏在广告中。有些人不希望他们的视频提供给大众观看,或者想更多地控制自己的视频内容。幸运的是,借助强大的开源软件,任何人都可以设置直播服务器。
|
||||||
|
|
||||||
|
### 入门
|
||||||
|
|
||||||
|
在本教程中,我将说明如何使用 Linux 或 BSD 操作系统设置基本的实时流媒体服务器。
|
||||||
|
|
||||||
|
搭建实时流媒体服务器不可避免地提到系统需求问题。这些需求多种多样,因为实时流媒体涉及许多因素,例如:
|
||||||
|
|
||||||
|
* **流媒体质量:** 你想以高清流媒体播放还是标清视频就可以满足你的需求?
|
||||||
|
* **收视率:** 你的视频预计有多少观众?
|
||||||
|
* **存储:** 你是否打算保留已保存的视频流副本?
|
||||||
|
* **访问:** 你的视频流是私有的还是向全世界开放的?
|
||||||
|
|
||||||
|
在硬件要求方面没有固定规则,因此我建议你进行测试,以便找到最适合你需求的配置。本项目中,我将服务器安装在配有 4GB 内存、20GB 硬盘空间和单个 Intel i7 处理器内核的虚拟机上。
|
||||||
|
|
||||||
|
本项目使用<ruby>实时消息传递协议<rt>Real-Time Messaging Protocol</rt></ruby>(RTMP)来处理音频和视频流。当然还有其他协议可用,但我选择 RTMP 是因为它具有广泛的支持。鉴于像 WebRTC 这样的开放标准变得更加兼容,我比较推荐这条路线。
|
||||||
|
|
||||||
|
同样重要的是,要明白“实时”并不总是意味着即时。视频流必须经过编码、传输、缓冲和显示,这通常会增大延迟。延迟可以被缩短或延长,具体取决于你创建的流类型及其属性。
|
||||||
|
|
||||||
|
### 设置 Linux 服务器
|
||||||
|
|
||||||
|
你可以使用许多不同的 Linux 发行版,但我更喜欢 Ubuntu,因此我下载了 [Ubuntu 服务器版][1] 作为我的操作系统。如果你希望你的服务器具有图形用户界面(GUI),请随意使用 [Ubuntu 桌面版][2] 或其多种风味版本之一。然后,我在我的计算机或虚拟机上启动了 Ubuntu 安装程序,并选择了最适合我的环境的设置。以下是我采取的步骤。
|
||||||
|
|
||||||
|
注意:因为这是一个服务器,你可能需要设置静态网络。
|
||||||
|
|
||||||
|
![](https://opensource.com/sites/default/files/uploads/stream-server_profilesetup.png)
|
||||||
|
|
||||||
|
安装程序完成并重新启动系统后,你会看到一个可爱的新 Ubuntu 系统。 与任何新安装的操作系统一样,安装任何可用的更新:
|
||||||
|
|
||||||
|
```
|
||||||
|
sudo apt update
|
||||||
|
sudo apt upgrade
|
||||||
|
```
|
||||||
|
|
||||||
|
这个流媒体服务器将使用非常强大通用的 Nginx 网络服务器,所以你需要安装它:
|
||||||
|
|
||||||
|
```
|
||||||
|
sudo apt install nginx
|
||||||
|
```
|
||||||
|
|
||||||
|
然后你需要获取 RTMP 模块,以便 Nginx 可以处理你的媒体流:
|
||||||
|
|
||||||
|
```
|
||||||
|
sudo add-apt-repository universe
|
||||||
|
sudo apt install libnginx-mod-rtmp
|
||||||
|
```
|
||||||
|
|
||||||
|
修改你的网页服务器配置,使其能够接受和传送你的媒体流。
|
||||||
|
|
||||||
|
```
|
||||||
|
sudo nano /etc/nginx/nginx.conf
|
||||||
|
```
|
||||||
|
|
||||||
|
滚动到配置文件的底部并添加以下代码:
|
||||||
|
|
||||||
|
```
|
||||||
|
rtmp {
|
||||||
|
server {
|
||||||
|
listen 1935;
|
||||||
|
chunk_size 4096;
|
||||||
|
|
||||||
|
application live {
|
||||||
|
live on;
|
||||||
|
record off;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
![](https://opensource.com/sites/default/files/uploads/stream-server_config.png)
|
||||||
|
|
||||||
|
保存配置。我是使用 [Nano][3] 来编辑配置文件的异端。在 Nano 中,你可以通过快捷键 `Ctrl+X`、`Y` 并按下回车来保存你的配置。
|
||||||
|
|
||||||
|
这么一个非常小的配置就可以创建一个可工作的流服务器。稍后你将添加更多内容到此配置中,但这是一个很好的起点。
|
||||||
|
|
||||||
|
在开始第一个流之前,你需要使用新配置重新启动 Nginx:
|
||||||
|
|
||||||
|
```
|
||||||
|
sudo systemctl restart nginx
|
||||||
|
```
|
||||||
|
|
||||||
|
### 设置 BSD 服务器
|
||||||
|
|
||||||
|
如果是“小恶魔”(LCTT 译者注:FreeBSD 的标志是一个拿着叉子的红色小恶魔)的信徒,那么建立并运行一个流媒体服务器也非常容易。
|
||||||
|
|
||||||
|
前往 [FreeBSD][4] 网站并下载最新版本。在你的计算机或虚拟机上启动 FreeBSD 安装程序,然后执行初始步骤并选择最适合你环境的设置。由于这是一个服务器,你可能需要设置静态网络。
|
||||||
|
|
||||||
|
在安装程序完成并重新启动系统后,你应该就拥有了一个闪亮的新 FreeBSD 系统。像任何其他新安装的系统一样,你可能希望更新所有内容(从这一步开始,请确保你以 root 身份登录):
|
||||||
|
|
||||||
|
```
|
||||||
|
pkg update
|
||||||
|
pkg upgrade
|
||||||
|
```
|
||||||
|
|
||||||
|
安装 [Nano][3] 来编辑配置文件:
|
||||||
|
|
||||||
|
```
|
||||||
|
pkg install nano
|
||||||
|
```
|
||||||
|
|
||||||
|
这个流媒体服务器将使用非常强大通用的 Nginx 网络服务器。 你可以使用 FreeBSD 所拥有的优秀 ports 系统来构建 Nginx。
|
||||||
|
|
||||||
|
首先,更新你的 ports 树:
|
||||||
|
|
||||||
|
```
|
||||||
|
portsnap fetch
|
||||||
|
portsnap extract
|
||||||
|
```
|
||||||
|
|
||||||
|
进入 Nginx ports 目录:
|
||||||
|
|
||||||
|
```
|
||||||
|
cd /usr/ports/www/nginx
|
||||||
|
```
|
||||||
|
|
||||||
|
运行如下命令开始构建 Nginx:
|
||||||
|
|
||||||
|
```
|
||||||
|
make install
|
||||||
|
```
|
||||||
|
|
||||||
|
你将看到一个屏幕,询问你的 Nginx 构建中要包含哪些模块。对于这个项目,你需要添加 RTMP 模块。向下滚动直到选中 RTMP 模块,并按下空格键。然后按回车键继续剩下的构建和安装。
|
||||||
|
|
||||||
|
Nginx 安装完成后,就该为它配置流式传输了。
|
||||||
|
|
||||||
|
首先,在 `/etc/rc.conf` 中添加一个条目以确保 Nginx 服务器在系统启动时启动:
|
||||||
|
|
||||||
|
```
|
||||||
|
nano /etc/rc.conf
|
||||||
|
```
|
||||||
|
|
||||||
|
将此文本添加到文件中:
|
||||||
|
|
||||||
|
```
|
||||||
|
nginx_enable="YES"
|
||||||
|
```
|
||||||
|
|
||||||
|
![](https://opensource.com/sites/default/files/uploads/stream-server_streamingconfig.png)
|
||||||
|
|
||||||
|
接下来,创建一个网站根目录,Nginx 将从中提供其内容。我自己的目录叫 `stream`:
|
||||||
|
|
||||||
|
```
|
||||||
|
cd /usr/local/www/
|
||||||
|
mkdir stream
|
||||||
|
chmod -R 755 stream/
|
||||||
|
```
|
||||||
|
|
||||||
|
现在你已经创建了你的流目录,通过编辑配置文件来配置 Nginx:
|
||||||
|
|
||||||
|
```
|
||||||
|
nano /usr/local/etc/nginx/nginx.conf
|
||||||
|
```
|
||||||
|
|
||||||
|
在文件顶部加载你的流媒体模块:
|
||||||
|
|
||||||
|
```
|
||||||
|
load_module /usr/local/libexec/nginx/ngx_stream_module.so;
|
||||||
|
load_module /usr/local/libexec/nginx/ngx_rtmp_module.so;
|
||||||
|
```
|
||||||
|
|
||||||
|
![](https://opensource.com/sites/default/files/uploads/stream-server_modules.png)
|
||||||
|
|
||||||
|
在 `Server` 部分下,更改 `root` 位置以匹配你之前创建的目录位置:
|
||||||
|
|
||||||
|
```nginx
|
||||||
|
Location / {
|
||||||
|
root /usr/local/www/stream
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
![](https://opensource.com/sites/default/files/uploads/stream-server_webroot.png)
|
||||||
|
|
||||||
|
最后,添加你的 RTMP 设置,以便 Nginx 知道如何处理你的媒体流:
|
||||||
|
|
||||||
|
```
|
||||||
|
rtmp {
|
||||||
|
server {
|
||||||
|
listen 1935;
|
||||||
|
chunk_size 4096;
|
||||||
|
|
||||||
|
application live {
|
||||||
|
live on;
|
||||||
|
record off;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
保存配置。在 Nano 中,你可以通过快捷键 `Ctrl+X`、`Y`,然后按回车键来执行此操作。
|
||||||
|
|
||||||
|
如你所见,这么一个非常小的配置将创建一个工作的流服务器。稍后,你将添加更多内容到此配置中,但这将为你提供一个很好的起点。
|
||||||
|
|
||||||
|
但是,在开始第一个流之前,你需要使用新配置重新启动 Nginx:
|
||||||
|
|
||||||
|
```
|
||||||
|
service nginx restart
|
||||||
|
```
|
||||||
|
|
||||||
|
### 设置你的流媒体软件
|
||||||
|
|
||||||
|
#### 使用 OBS 进行广播
|
||||||
|
|
||||||
|
现在你的服务器已准备好接受你的视频流,是时候设置你的流媒体软件了。本教程使用功能强大的开源的 Open Broadcast Studio(OBS)。
|
||||||
|
|
||||||
|
前往 [OBS 网站][5],找到适用于你的操作系统的版本并安装它。OBS 启动后,你应该会看到一个首次运行向导,该向导将帮助你使用最适合你的硬件的设置来配置 OBS。
|
||||||
|
|
||||||
|
![](https://opensource.com/sites/default/files/uploads/stream-server_autoconfig.png)
|
||||||
|
|
||||||
|
OBS 没有捕获任何内容,因为你没有为其提供源。在本教程中,你只需为流捕获桌面。单击“<ruby>来源<rt>Source</rt></ruby>”下的 “+” 按钮,选择“<ruby>显示捕获<rt>Screen Capture</rt></ruby>”,然后选择要捕获的桌面。
|
||||||
|
|
||||||
|
单击“<ruby>确定<rt>OK</rt></ruby>”,你应该会看到 OBS 镜像了你的桌面。
|
||||||
|
|
||||||
|
现在可以将你新配置的视频流发送到你的服务器了。在 OBS 中,单击“<ruby>文件 > 设置<rt>File > Settings</rt></ruby>”。 单击“<ruby>流<rt>Stream</rt></ruby>”部分,并将“<ruby>串流类型<rt>Stream Type</rt></ruby>” 设置为“<ruby>自定义流媒体服务器<rt>Custom Streaming Server</rt></ruby>”。
|
||||||
|
|
||||||
|
在 URL 框中,输入前缀 `rtmp://` 后跟流媒体服务器的 IP 地址,后跟 `/live`。例如,`rtmp://IP-ADDRESS/live`。
|
||||||
|
|
||||||
|
接下来,你可能需要输入“<ruby>串流密钥<rt>Stream key</rt></ruby>”,这是观看你的流所需的特殊标识符。 在“<ruby>串流密钥<rt>Stream key</rt></ruby>”框中输入你想要(并且可以记住)的任何关键词。
|
||||||
|
|
||||||
|
![](https://opensource.com/sites/default/files/uploads/stream-server_streamkey.png)
|
||||||
|
|
||||||
|
单击“<ruby>应用<rt>Apply</rt></ruby>”,然后单击“<ruby>确定<rt>OK</rt></ruby>”。
|
||||||
|
|
||||||
|
现在 OBS 已配置为将你的流发送到你的服务器,你可以开始你的第一个视频流。 单击“<ruby>开始推流<rt>Start Streaming</rt></ruby>”。
|
||||||
|
|
||||||
|
如果一切正常,你应该会看到按钮更改为“<ruby>停止推流<rt>Stop Streaming</rt></ruby>”,并且在 OBS 的底部将出现一些带宽指标。
|
||||||
|
|
||||||
|
![](https://opensource.com/sites/default/files/uploads/stream-server_metrics.png)
|
||||||
|
|
||||||
|
如果你收到错误消息,请仔细检查 OBS 中的流设置是否有拼写错误。如果一切看起来都不错,则可能是另一个问题阻止了它的工作。
|
||||||
|
|
||||||
|
### 观看你的视频流
|
||||||
|
|
||||||
|
如果没有人观看,就说明直播视频不是很好,所以请成为你的第一个观众!
|
||||||
|
|
||||||
|
有许多支持 RTMP 的开源媒体播放器,但最著名的可能是 [VLC 媒体播放器][6]。
|
||||||
|
|
||||||
|
安装并启动 VLC 后,通过单击“<ruby>媒体 > 打开网络串流<rt>Media > Open Network Stream</rt></ruby>” 打开你的流。输入你的流的路径,添加你在 OBS 中设置的串流密钥,然后单击“<ruby>播放<rt>Play</rt></ruby>”。 例如,`rtmp://IP-ADDRESS/live/SECRET-KEY`。
|
||||||
|
|
||||||
|
你现在应该可以看到自己的实时视频流了!
|
||||||
|
|
||||||
|
![](https://opensource.com/sites/default/files/uploads/stream-server_livevideo.png)
|
||||||
|
|
||||||
|
### 接下来要做什么?
|
||||||
|
|
||||||
|
本项目是一个非常简单的设置,可以让你开始工作。 以下是你可能想要使用的另外两个功能。
|
||||||
|
|
||||||
|
* **限制访问:** 你可能想要做的下一件事情是限制对你服务器的访问,因为默认设置允许任何人与服务器之间进行流传输。有多种设置方法,例如操作系统防火墙、[.htaccess 文件][7],甚至使用 [STMP 模块中的内置访问控制][8]。
|
||||||
|
* **录制流:** 这个简单的 Nginx 配置只会流传输而不会保存你的视频,但这很容易修改。在 Nginx 配置文件中的 RTMP 部分下,设置录制选项和要保存视频的位置。确保你设置的路径存在并且 Nginx 能够写入它。
|
||||||
|
|
||||||
|
```
|
||||||
|
application live {
|
||||||
|
live on;
|
||||||
|
record all;
|
||||||
|
record_path /var/www/html/recordings;
|
||||||
|
record_unique on;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
实时流媒体的世界在不断发展,如果你对更高级的用途感兴趣,可以在互联网上找到许多其他很棒的资源。祝你好运,直播快乐!
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
via: https://opensource.com/article/19/1/basic-live-video-streaming-server
|
||||||
|
|
||||||
|
作者:[Aaron J.Prisk][a]
|
||||||
|
选题:[lujun9972][b]
|
||||||
|
译者:[Starryi](https://github.com/Starryi)
|
||||||
|
校对:[wxy](https://github.com/wxy)
|
||||||
|
|
||||||
|
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||||
|
|
||||||
|
[a]: https://opensource.com/users/ricepriskytreat
|
||||||
|
[b]: https://github.com/lujun9972
|
||||||
|
[1]: https://www.ubuntu.com/download/server
|
||||||
|
[2]: https://www.ubuntu.com/download/desktop
|
||||||
|
[3]: https://www.nano-editor.org/
|
||||||
|
[4]: https://www.freebsd.org/
|
||||||
|
[5]: https://obsproject.com/
|
||||||
|
[6]: https://www.videolan.org/vlc/index.html
|
||||||
|
[7]: https://httpd.apache.org/docs/current/howto/htaccess.html
|
||||||
|
[8]: https://github.com/arut/nginx-rtmp-module/wiki/Directives#access
|
@ -0,0 +1,51 @@
|
|||||||
|
[#]: collector: (lujun9972)
|
||||||
|
[#]: translator: (CN-QUAN)
|
||||||
|
[#]: reviewer: (wxy)
|
||||||
|
[#]: publisher: (wxy)
|
||||||
|
[#]: url: (https://linux.cn/article-14162-1.html)
|
||||||
|
[#]: subject: (IoT offers a way to track COVID-19 via connected thermometers)
|
||||||
|
[#]: via: (https://www.networkworld.com/article/3539058/iot-offers-a-way-to-track-covid-19-via-connected-thermometers.html)
|
||||||
|
[#]: author: (Jon Gold https://www.networkworld.com/author/Jon-Gold/)
|
||||||
|
|
||||||
|
物联网提供了一种通过联网温度计跟踪 COVID-19 的方法
|
||||||
|
======
|
||||||
|
|
||||||
|
> COVID-19 大流行使一家联网温度计制造商 Kinsa 成为全国知名企业,因为它提供了一个可能了解疾病传播的窗口。
|
||||||
|
|
||||||
|
![][1]
|
||||||
|
|
||||||
|
一家名为 Kinsa 的公司正在利用 [物联网][2] 技术来创建一个连接温度计的网络,收集大量的匿名健康数据,这些数据可以为了解当前和未来的流行病提供帮助。
|
||||||
|
|
||||||
|
该公司创始人兼首席执行官 Inder Singh 表示,能够近乎实时地跟踪美国各地的发烧水平,对于广大公众以及医疗保健部门和政府的决策者来说,都可能是一条至关重要的信息。
|
||||||
|
|
||||||
|
该系统的联网技术相对简单 —— 温度计通过蓝牙连接到用户手机上的一个应用程序,该应用程序通过互联网将匿名数据报告给 Kinsa 的云。Singh 强调说,该公司只整理到县一级的数据,并声称通过 Kinsa 的数据识别个人几乎是不可能的。
|
||||||
|
|
||||||
|
“我们不提供个人身份信息,我们不提供识别数据,”他说。“这款应用程序只会引导你找到你需要的护理和服务。”
|
||||||
|
|
||||||
|
有了体温读数和一些关于体温测量者的基本人口统计信息以及他们的其他症状,这款应用程序可以提供基本的指导,比如是否需要去看医生,以及用户所在的区域是否出现了异常的发烧程度。
|
||||||
|
|
||||||
|
然而,真正的价值在于 Kinsa 在其 [美国健康天气地图][1] 上分析和细分的聚合数据,这些数据是从该公司生态系统中的 100 多万个温度计收集而来的。根据 Singh 的说法,这个想法是为了给公众提供一种方式,让他们对自己的健康做出更明智的决定。
|
||||||
|
|
||||||
|
“这是一个参与性很强的活动,”他说。“每个人都能得到数据,每个人都能做出反应。”
|
||||||
|
|
||||||
|
Kinsa 仍然直接向消费者销售温度计,但该公司正计划与地方政府、卫生部门甚至学区进行更密切的合作——辛格说,Kinsa 已经与美国两个州(他拒绝透露其名称)以及包括佛罗里达州的圣奥古斯丁在内的多个市政府合作。
|
||||||
|
|
||||||
|
他说:“我们的希望是,我们能够找出如何建立一个可扩展的模型 —— 我们永远不会只靠卖 20 美元的温度计就可以在全球范围内扩展。”。我们的目标是使该产品能够广泛应用,从而成为医疗保健部门有意义的早期预警系统。
|
||||||
|
|
||||||
|
------
|
||||||
|
via: https://www.networkworld.com/article/3539058/iot-offers-a-way-to-track-covid-19-via-connected-thermometers.html
|
||||||
|
|
||||||
|
作者:[Jon Gold][a]
|
||||||
|
选题:[lujun9972][b]
|
||||||
|
译者:[CN-QUAN](https://github.com/CN-QUAN)
|
||||||
|
校对:[wxy](https://github.com/wxy)
|
||||||
|
|
||||||
|
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||||
|
|
||||||
|
[a]: https://www.networkworld.com/author/Jon-Gold/
|
||||||
|
[b]: https://github.com/lujun9972
|
||||||
|
[1]: https://images.idgesg.net/images/article/2020/04/kinsa_influenza_map_2020-04-21_by_kinsa_leaflet_openstreetmap_carto_2400x1600-100839260-large.jpg?auto=webp&quality=85,70
|
||||||
|
[2]: https://www.networkworld.com/article/3207535/what-is-iot-the-internet-of-things-explained.html
|
||||||
|
[3]: https://www.networkworld.com/newsletters/signup.html
|
||||||
|
[4]: https://www.facebook.com/NetworkWorld/
|
||||||
|
[5]: https://www.linkedin.com/company/network-world
|
@ -0,0 +1,64 @@
|
|||||||
|
[#]: collector: (lujun9972)
|
||||||
|
[#]: translator: (CN-QUAN)
|
||||||
|
[#]: reviewer: (wxy)
|
||||||
|
[#]: publisher: (wxy)
|
||||||
|
[#]: url: (https://linux.cn/article-14171-1.html)
|
||||||
|
[#]: subject: (NIST aims to make frequency sharing more efficient for wireless networks)
|
||||||
|
[#]: via: (https://www.networkworld.com/article/3561618/nist-aims-to-make-frequency-sharing-more-efficient-for-wireless-networks.html)
|
||||||
|
[#]: author: (Patrick Nelson https://www.networkworld.com/author/Patrick-Nelson/)
|
||||||
|
|
||||||
|
NIST 的目标是使无线网络的频率共享更加有效
|
||||||
|
======
|
||||||
|
|
||||||
|
> 机器学习方案将帮助不同的无线电协议,如 Wi-Fi 和 LTE,在同一的无线频谱中更有效地协同工作。
|
||||||
|
|
||||||
|
![](https://img.linux.net.cn/data/attachment/album/202201/12/130824n8rkw1iwiveadcgr.jpg)
|
||||||
|
|
||||||
|
美国国家标准与技术研究所([NIST][1])开发的机器学习方案有可能显著改善 [5G][2] 和其他无线网络选择和共享通信频率的方式。研究人员声称,与试错法相比,NIST 的方案可以使共享通信频率的过程的效率提高多达 5000 倍。
|
||||||
|
|
||||||
|
NIST 系统的理念是,无线电设备可以从经验中学习其网络环境,而不是像现在这样,简单地根据试错法选择频率信道。
|
||||||
|
|
||||||
|
NIST 在 [其网站上的一篇文章][3] 中说,在特定的环境条件下,“该算法可以学习哪个信道提供最好的结果”。
|
||||||
|
|
||||||
|
该团队说:“该方案可以被编程到现实世界中许多 [不同] 类型网络的发射机软件中。”
|
||||||
|
|
||||||
|
从本质上讲,这个计算机模拟的算法是一个映射环境射频条件的先前经验的公式。例如,这些条件可以包括在一个信道(一组相邻的频率)内运行的发射机的数量。
|
||||||
|
|
||||||
|
文章说:“……如果发射机选择了一个未被占用的信道,那么成功传输的概率就会上升,从而导致更高的数据速率。”同样地,当发射机选择一个没有太多干扰的信道时,信号会更强,你也会得到更好的数据速率。发射机会记住哪个信道提供了最佳结果,并学会在下次需要清晰信号时学会选择那个位置。
|
||||||
|
|
||||||
|
这与今天的工作方式不同。也就是说,无线电只是试图找到一个开放频率,然后与类似协议的无线电进行通信。在复杂的情况下,使用诸如 Wi-Fi、跳频和 [波束成形][4] 等技术来优化信道。
|
||||||
|
|
||||||
|
研究人员解释说,NIST 的机器学习技术的亮点在于共享频谱,比如通过授权频谱辅助接入(LAA)共享 Wi-Fi。LAA 是非授权频谱中的 LTE 频谱,称为 LTE-U,频率为 5GHz。在相同频率下的 Wi-Fi 与 LAA 的组合中,协议是不同的:无线电之间不能相互通信以协调工作,而且频带越繁忙就可能出现混乱 —— 传输会遇到其他传输。但是,如果所有的无线电接收机都能更好地选择它们的占位,通过学习哪些有效,哪些无效,那么这将会更好。
|
||||||
|
|
||||||
|
NIST 工程师 Jason Coder 在文章中说:“这可能会使非授权频段的通信更加高效。”
|
||||||
|
|
||||||
|
事实上,NIST 声称,它“可以帮助 5G 和其他无线网络选择和共享通信频率,其效率大约是试错法的 5000 倍。”
|
||||||
|
|
||||||
|
这里的关键词是“共享”,因为为了在有限的频谱内增加通信,必须进行更多的共享 —— 物联网或媒体流等用户都在争夺同样的隐喻资产。随着物联网和数字技术的不断发展,非授权和授权频段的结合,就像 LAA 中的情况一样,可能会变得更加普遍。(非授权的频段是指那些没有分配给特定用户的频段,比如移动网络运营商;授权频段是在拍卖中中标并分配的。)
|
||||||
|
|
||||||
|
在 NIST 场景中,相互竞争的发射机“各自学习在不相互通信的情况下最大化网络数据速率”。因此,多种协议和数据类型,如视频或传感器数据,或 Wi-Fi 和移动网络,可以相互协作。
|
||||||
|
|
||||||
|
NIST 的方案大大简化了为发射机分配最佳信道的过程,根据这篇文章研究发现,穷尽努力 [使用试错法] 来确定最佳解决方案需要大约 45600 次试验,而这个方案只需要尝试 10 个渠道就可以选择类似的解决方案,仅仅付出 0.02% 的努力。”
|
||||||
|
|
||||||
|
NIST 的研究人员在 IEEE 第 91 届车辆技术会议上展示了他们的研究成果。
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
via: https://www.networkworld.com/article/3561618/nist-aims-to-make-frequency-sharing-more-efficient-for-wireless-networks.html
|
||||||
|
|
||||||
|
作者:[Patrick Nelson][a]
|
||||||
|
选题:[lujun9972][b]
|
||||||
|
译者:[CN-QUAN](https://github.com/CN-QUAN)
|
||||||
|
校对:[wxy](https://github.com/wxy)
|
||||||
|
|
||||||
|
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||||
|
|
||||||
|
[a]: https://www.networkworld.com/author/Patrick-Nelson/
|
||||||
|
[b]: https://github.com/lujun9972
|
||||||
|
[1]: https://www.nist.gov/
|
||||||
|
[2]: https://www.networkworld.com/article/3330603/5g-versus-4g-how-speed-latency-and-application-support-differ.html
|
||||||
|
[3]: https://www.nist.gov/news-events/news/2020/05/nist-formula-may-help-5g-wireless-networks-efficiently-share-communications
|
||||||
|
[4]: https://www.networkworld.com/article/3445039/beamforming-explained-how-it-makes-wireless-communication-faster.html
|
||||||
|
[5]: https://events.vtsociety.org/vtc2020-spring/conference-sessions/program/
|
||||||
|
[6]: https://www.facebook.com/NetworkWorld/
|
||||||
|
[7]: https://www.linkedin.com/company/network-world
|
@ -0,0 +1,74 @@
|
|||||||
|
[#]: collector: (lujun9972)
|
||||||
|
[#]: translator: (wxy)
|
||||||
|
[#]: reviewer: (wxy)
|
||||||
|
[#]: publisher: (wxy)
|
||||||
|
[#]: url: (https://linux.cn/article-14180-1.html)
|
||||||
|
[#]: subject: (A brief history of the Content Management System)
|
||||||
|
[#]: via: (https://opensource.com/article/20/7/history-content-management-system)
|
||||||
|
[#]: author: (Pierre Burgy https://opensource.com/users/pierreburgy)
|
||||||
|
|
||||||
|
内容管理系统(CMS)简史
|
||||||
|
======
|
||||||
|
|
||||||
|
> 从静态页面到 JAM 栈,CMS 的历史就是开源和 Web 变迁的核心。
|
||||||
|
|
||||||
|
![](https://img.linux.net.cn/data/attachment/album/202201/15/000116nzhufdu7h9w8wewj.jpg)
|
||||||
|
|
||||||
|
<ruby>内容管理系统<rt>Content Management System</rt></ruby>(CMS)是一个多产的软件类别,其涵盖了所有创建和修改数字内容的应用程序。因此,CMS 的历史可以追溯到由 [蒂姆-伯纳斯-李][2] 在 1990 年建立的历史上的第一个网站也就不足为奇了,该网站是以基于互联网的超文本系统 HTML 为模型,只包含了文本和链接。
|
||||||
|
|
||||||
|
![CMS 市场演变时间表][3]
|
||||||
|
|
||||||
|
万维网(WWW)的雏形是静态网站,无需后端数据库即可提供内容。它们消耗的计算资源很少,所以加载速度很快 —— 因为没有数据库查询、没有模板渲染、也没有客户端-服务器请求的处理。鉴于那时很少有人经常“上网冲浪”,特别是与今天相比,Web 流量也很少。
|
||||||
|
|
||||||
|
当然,促进了这种互操作性都是开源软件。事实上,开源在 CMS 的演变中一直扮演着重要的角色。
|
||||||
|
|
||||||
|
### CMS 的崛起
|
||||||
|
|
||||||
|
快进到九十年代中期,随着万维网的普及和网站对频繁更新的需求的增加 —— 这与它最初托管手册式的静态内容有所不同。这导致了大量的 CMS 产品的出现,如 FileNet、Vignette 的StoryBuilder、Documentum 和其他许多产品。这些都是专有的闭源产品,这在那个时期并不罕见。
|
||||||
|
|
||||||
|
然而,在 21 世纪初,开源的 CMS 替代品出现了,这包括 WordPress、Drupal 和 Joomla。WordPress 包含一个可扩展的插件架构,并提供了可用于建立网站的模板,而不要求用户具备 HTML 和 CSS 知识。WordPress CMS 软件安装在 Web 服务器上,通常与 MySQL 或 MariaDB 数据库(当然,两者都是开源的)配合。CMS 是开源的这一事实在一定程度上加速了向 WordPress 的重大转变。
|
||||||
|
|
||||||
|
即使在今天,仍有大约三分之一的网站是使用这些第一代内容管理系统建立的。这些传统的 CMS 是单体系统,包括后端用户界面、插件、前端模板、层叠样式表(CSS)、Web 服务器和数据库。每当用户请求一个网站页面时,服务器首先查询数据库,然后将结果与来自页面标记和插件的数据结合起来,在浏览器中生成一个 HTML 文档。
|
||||||
|
|
||||||
|
### 趋向于 LAMP 栈
|
||||||
|
|
||||||
|
开源 CMS 的出现与建立在 LAMP(Linux、Apache、MySQL 和 PHP/Perl/Python)栈上的基础设施是一致的。这种新的结构代表了单体 Web 开发的开始,它使动态网站的创建能够使用数据库查询,为不同的终端用户提供独特的内容。在这一点上,以前放在服务器上的静态网站模式真正开始消失。(静态网站模式是指由文本和链接组成的单个文件,如 HTML、CSS、JavaScript 等,以同样的方式传递给所有的终端用户。)
|
||||||
|
|
||||||
|
### 移动 Web 改变了一切
|
||||||
|
|
||||||
|
随着我们逐渐步入 2000 年代的第一个十年,早期的移动设备如 Palm 和黑莓提供了对 Web 内容的访问,然后在 2010 年左右推出的智能手机和平板电脑让越来越多的用户可以通过移动设备访问 Web 。2016 年,天平倾斜,全球 [来自移动设备和平板电脑的 Web 访问量超过了台式机][4]。
|
||||||
|
|
||||||
|
单体的 CMS 并不适合为这些不同类型的访问设备提供内容,这就需要不同版本的网站 —— 通常是针对移动用户的精简版网站。新的可以访问 WEB 的设备类型的出现,如智能手表、游戏机和语音助手(如 Alexa)[5],只是加剧了这个问题,对全渠道内容交付的需求变得很明显。
|
||||||
|
|
||||||
|
### 无头 CMS 和 JAM 栈的出现
|
||||||
|
|
||||||
|
无头 CMS 将后端(用来存储所有内容、数据库和文件)与前端解耦。通常,无头 CMS 使用 API,这样就可以访问数据库(SQL 和 NoSQL)和文件的内容,以便在网站、智能手机、甚至物联网(IoT)设备上显示。此外,无头 CMS 与前端框架无关,使其与各种静态网站生成器和前端框架(如 Gatsby.js、Next.js、Nuxt.js、Angular、React 和 Vue.js)兼容,这使开发人员可以自由选择他们喜欢的工具。
|
||||||
|
|
||||||
|
无头 CMS 特别适用于 JAM(Javascript、API 和 Markup)栈的 Web 开发架构,该架构正在成为一种流行的解决方案,因为它能提供更好的 Web 性能和 SEO 排名,以及强大的安全措施。JAM 栈不依赖于 Web 服务器,当有请求时可以立即提供静态文件。不需要查询数据库,因为文件已经被编译并提供给浏览器。
|
||||||
|
|
||||||
|
向无头 CMS 的转变是由新一轮的参与者推动的,他们有的采用 SaaS 方式,如 Contentful,有的采用自托管的开源替代品,如 [Strapi][6]。无头 CMS 也在颠覆电子商务行业,新的软件编辑器,如 Commerce Layer 和 [Saleor][7](也是开源的)提供了解决方案,以真正的全渠道方式管理多个 SKU、价格和库存数据。
|
||||||
|
|
||||||
|
### 总结
|
||||||
|
|
||||||
|
在 CMS 的整个演变过程中,由互联网上的信息消费方式驱动,开源软件也沿着同样的趋势发展,新技术不断出现以解决出现的需求。事实上,在内容管理系统、万维网和开源之间似乎存在着一种相互依赖的关系。管理越来越多的内容的需求不会很快消失。我们完全有理由期待在未来更广泛地采用开源软件。
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
via: https://opensource.com/article/20/7/history-content-management-system
|
||||||
|
|
||||||
|
作者:[Pierre Burgy][a]
|
||||||
|
选题:[lujun9972][b]
|
||||||
|
译者:[wxy](https://github.com/wxy)
|
||||||
|
校对:[wxy](https://github.com/wxy)
|
||||||
|
|
||||||
|
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||||
|
|
||||||
|
[a]: https://opensource.com/users/pierreburgy
|
||||||
|
[b]: https://github.com/lujun9972
|
||||||
|
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/browser_blue_text_editor_web.png?itok=lcf-m6N7 (Text editor on a browser, in blue)
|
||||||
|
[2]: https://www.w3.org/People/Berners-Lee/#:~:text=A%20graduate%20of%20Oxford%20University,refined%20as%20Web%20technology%20spread.
|
||||||
|
[3]: https://opensource.com/sites/default/files/uploads/timeline.market.png (timeline of CMS market evolution)
|
||||||
|
[4]: https://techcrunch.com/2016/11/01/mobile-internet-use-passes-desktop-for-the-first-time-study-finds/
|
||||||
|
[5]: https://opensource.com/article/20/6/open-source-voice-assistant
|
||||||
|
[6]: https://strapi.io/
|
||||||
|
[7]: https://saleor.io/
|
@ -0,0 +1,177 @@
|
|||||||
|
[#]: subject: (Linux for Education: Best Distributions for Kids, Teachers & Schools)
|
||||||
|
[#]: via: (https://itsfoss.com/educational-linux-distros/)
|
||||||
|
[#]: author: (Ankush Das https://itsfoss.com/author/ankush/)
|
||||||
|
[#]: collector: (lujun9972)
|
||||||
|
[#]: translator: (wxy)
|
||||||
|
[#]: reviewer: (wxy)
|
||||||
|
[#]: publisher: (wxy)
|
||||||
|
[#]: url: (https://linux.cn/article-14174-1.html)
|
||||||
|
|
||||||
|
给儿童、教师和学校的最佳 Linux 发行版
|
||||||
|
======
|
||||||
|
|
||||||
|
![](https://img.linux.net.cn/data/attachment/album/202201/13/082306ndfbc4wzblpjdncz.jpg)
|
||||||
|
|
||||||
|
孩子们可以使用 Linux 发行版吗?它又是否适合学校使用呢?
|
||||||
|
|
||||||
|
嗯,这取决于你有什么选择,以及你想选择的是什么。不管你是想给孩子还是学校老师用,都有不少选择。
|
||||||
|
|
||||||
|
因此,为了给你一个良好的开端,我们策划了一个为教育量身定做的 [最佳 Linux 发行版][1] 列表。
|
||||||
|
|
||||||
|
### 最适合儿童的 Linux 发行版
|
||||||
|
|
||||||
|
对于一个孩子来说,发行版必须提供一个用户友好的用户界面,而不是高级功能。
|
||||||
|
|
||||||
|
你可能会说,任何主流的、[像 Ubuntu][2]、Mint 或 Zorin 这样适合初学者的发行版都可以做到这一点。没错,但是如果一个发行版带有了 [基本工具][3] 并易于使用,孩子们会很快学会使用它并喜欢上它。
|
||||||
|
|
||||||
|
#### 1、Endless OS
|
||||||
|
|
||||||
|
![][4]
|
||||||
|
|
||||||
|
[Endless OS][5] 是一个流行的选择,是为教育量身定做的 Linux 发行版。
|
||||||
|
|
||||||
|
它以 Debian 为基础,使用 GNOME 桌面环境。尽管它限制了一年内在超过 500 台电脑上使用其操作系统,但它是免费下载的。
|
||||||
|
|
||||||
|
它的用户界面很容易使用,看起来很有吸引力,适合安装在现代电脑上。你可以得到各种预装的应用程序。因此,这对没有互联网接入的电脑来说是很方便的。
|
||||||
|
|
||||||
|
#### 2、Ubermix
|
||||||
|
|
||||||
|
![][6]
|
||||||
|
|
||||||
|
[Ubermix][8] 是一个基于 Ubuntu 的 Linux 发行版,旨在通过调整用户界面,摆脱不必要的应用程序,以及增加用于教育的必要工具/应用程序来降低复杂性。
|
||||||
|
|
||||||
|
它还提供了一种方法,在出现问题的情况下可以轻松地从系统问题中恢复。在内容过滤和 [屏幕时间控制][7] 方面有一个可选的家长控制功能,这确实很有用。
|
||||||
|
|
||||||
|
Ubermix 得到了积极的维护,并在其官方网站上提供了大量关于安装和故障排除的说明。
|
||||||
|
|
||||||
|
#### 3、Kano OS(用于树莓派)
|
||||||
|
|
||||||
|
![][9]
|
||||||
|
|
||||||
|
[Kano OS][16] 是为 6 至 14 岁的儿童教育而量身定做的计算套件。它就像高级版的树莓派,为年轻人提供了大量的 DIY 和编码活动。
|
||||||
|
|
||||||
|
Kano OS 也有基于 Debian 的 [用于树莓派的操作系统][14]。你不需要为此而购买 Kano 套件。你可以在你的树莓派上使用它。
|
||||||
|
|
||||||
|
它的目的是在与他们的计算机套件结合时,提供它所策划的教育的好处。从编码应用程序到游戏,应该有适合每个人的东西。
|
||||||
|
|
||||||
|
你还会发现有用的家长控制设置,可以为你的孩子限制/调整体验。如果需要更多的帮助,[官方帮助资源][15] 也会派上用场。
|
||||||
|
|
||||||
|
#### 4、AcademiX GNU/Linux
|
||||||
|
|
||||||
|
![][17]
|
||||||
|
|
||||||
|
[AcademiX][18] 是另一个基于 Debian 的发行版,主要用于学习。
|
||||||
|
|
||||||
|
不仅仅是初级教育,该操作系统中包含的程序对大学生也应该是有用的。它还包括虚拟互动实验室和虚拟显微镜。
|
||||||
|
|
||||||
|
**虽然它通过预装的实用程序使学习变得简单,但教师也可以用它来创建内容和发布。**
|
||||||
|
|
||||||
|
因此,它可以成为很多潜在的学习者和学校教师的一个全能选择。
|
||||||
|
|
||||||
|
#### 5、Sugar(使任何发行版都对儿童友好)
|
||||||
|
|
||||||
|
![][19]
|
||||||
|
|
||||||
|
[Sugar][21] 不是一个成熟的操作系统,而是一个学习平台(环境),它可以安装在任何 Linux 发行版之上,为学习而设置。
|
||||||
|
|
||||||
|
不仅仅是帮助你的孩子用一个易于使用的界面学习,它还有有助于协作、分享和学习而预装的软件工具。
|
||||||
|
|
||||||
|
它也可用于树莓派。而且提供了 [Flatpak 包][20],可以让你在任何 Linux 发行版中轻松安装它的一些学习活动。
|
||||||
|
|
||||||
|
#### 6、Li-f-e
|
||||||
|
|
||||||
|
Linux for education([Li-f-e][22])最初是 OpenSUSE 的一个项目,这是它的一个延续。
|
||||||
|
|
||||||
|
尽管它现在没有 OpenSUSE 的支持(我找不到任何参考资料),但它对孩子和学校来说可能是一个有用的选择。
|
||||||
|
|
||||||
|
这款软件基于 Ubuntu MATE,按照一些教科书的说法,它提供了几个内置的应用程序。它并没有提供什么特别的东西,而更像是 Ubuntu 教育版,在写这篇文章的时候,它正在积极维护。
|
||||||
|
|
||||||
|
### 最适合学校的 Linux 发行版
|
||||||
|
|
||||||
|
到目前为止,我提到的那些都是为孩子们的教育和学习而定制的。但教育有两个部分:学生和教师。
|
||||||
|
|
||||||
|
这就是为什么这个列表分为两部分。这第二部分列出了一些可能适合学校管理者、管理层和教师的选项。
|
||||||
|
|
||||||
|
当然,如果你想利用一个稳定可靠的 Linux 桌面操作系统来管理你的学校(或)内容创作,你总是可以使用 Linux Mint、elementary OS 或 Ubuntu。然而,有一些选项是为这种目的而定制的。
|
||||||
|
|
||||||
|
#### 1、Debian Edu/Skolelinux
|
||||||
|
|
||||||
|
![][23]
|
||||||
|
|
||||||
|
[Skolelinux][24] 是一个基于 Debian 的发行版,包含了一些适合学校师生使用的应用程序和网页服务。
|
||||||
|
|
||||||
|
它也被称为 Debian Edu。你可以通过下载所需的 ISO 或基本系统来选择离线安装,其余的可以在线安装。
|
||||||
|
|
||||||
|
尽管孩子们在安装后就可以使用它,但它需要一些学习过程来进行配置和维护。因此,这更倾向于学校管理人员或教师,而不是孩子。
|
||||||
|
|
||||||
|
#### 2、Linux Schools(Karoshi 服务器)
|
||||||
|
|
||||||
|
一个具有 Ubuntu LTS 优点的 Linux 发行版,为学校服务器而建。如果你想建立一个服务器并监视/控制一个连接的服务器网络,[Linux Schools][25](或 Karoshi 服务器)是一个很好的选择。
|
||||||
|
|
||||||
|
它可以让你使用网页界面管理一个服务器网络。你不需要 Linux 系统管理的深入知识来利用它。
|
||||||
|
|
||||||
|
#### 3、Escuelas Linux
|
||||||
|
|
||||||
|
![][26]
|
||||||
|
|
||||||
|
[Escuelas Linux][29] 是基于 Bodhi Linux 的。它内置了几个适合教育环境的应用程序。
|
||||||
|
|
||||||
|
它有自定义的工具,可以在几秒钟内将发行版重设为安装后的状态。也有恢复用户身份的选项。除此之外,它还带有在网络中分发教育材料、屏幕广播、镜像、远程命令执行、信息发送、屏幕锁定和对学生的计算机进行静音的应用程序。
|
||||||
|
|
||||||
|
考虑到它基于 Bodhi Linux,而 Bodhi Linux 是 [最好的轻量级 Linux 发行版][28] 之一,这对旧系统来说是个不错的选择。
|
||||||
|
|
||||||
|
如果你需要 NetBeans、Git、Android Studio 等高级工具,你还可以得到一个额外的开发者包,这是可选安装的。
|
||||||
|
|
||||||
|
除了这些选择之外,还有 [EduBOSS][30],这是 BOSS Linux 的教育版,是为印度学校量身定做的。
|
||||||
|
|
||||||
|
### 总结
|
||||||
|
|
||||||
|
虽然有一百多个 Linux 发行版,但只有少数几个是专门为教育而设计的。
|
||||||
|
|
||||||
|
对于学生、教师和学校管理来说,有一些可行的选择是件好事。
|
||||||
|
|
||||||
|
毕竟,Linux 可以到处使用,任何人都可以使用。我说的对吗?
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
via: https://itsfoss.com/educational-linux-distros/
|
||||||
|
|
||||||
|
作者:[Ankush Das][a]
|
||||||
|
选题:[lujun9972][b]
|
||||||
|
译者:[wxy](https://github.com/wxy)
|
||||||
|
校对:[wxy](https://github.com/wxy)
|
||||||
|
|
||||||
|
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||||
|
|
||||||
|
[a]: https://itsfoss.com/author/ankush/
|
||||||
|
[b]: https://github.com/lujun9972
|
||||||
|
[1]: https://itsfoss.com/best-linux-distributions/
|
||||||
|
[2]: https://itsfoss.com/best-linux-beginners/
|
||||||
|
[3]: https://itsfoss.com/essential-linux-applications/
|
||||||
|
[4]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/07/endless-os-distrowatch.png?resize=800%2C500&ssl=1
|
||||||
|
[5]: https://endlessos.com/home/
|
||||||
|
[6]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/07/ubermix-4-official.png?resize=800%2C452&ssl=1
|
||||||
|
[7]: https://itsfoss.com/activitywatch/
|
||||||
|
[8]: https://ubermix.org/download.html
|
||||||
|
[9]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/07/kano-os.png?resize=800%2C570&ssl=1
|
||||||
|
[10]: https://i1.wp.com/m.media-amazon.com/images/I/41-VaIktpgL._SL160_.jpg?ssl=1
|
||||||
|
[11]: https://www.amazon.com/dp/B073VTCS66?tag=chmod7mediate-20&linkCode=ogi&th=1&psc=1 (Kano Computer Kit – A Computer Anyone Can Make)
|
||||||
|
[12]: https://www.amazon.com/gp/prime/?tag=chmod7mediate-20 (Amazon Prime)
|
||||||
|
[13]: https://www.amazon.com/dp/B073VTCS66?tag=chmod7mediate-20&linkCode=ogi&th=1&psc=1 (Buy on Amazon)
|
||||||
|
[14]: https://itsfoss.com/raspberry-pi-os/
|
||||||
|
[15]: https://help.kano.me/hc/en-us/sections/360001083699-Kano-OS
|
||||||
|
[16]: https://kano.me/row/downloadable
|
||||||
|
[17]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/07/academix-edu.png?resize=800%2C450&ssl=1
|
||||||
|
[18]: https://academixproject.com/en/home/
|
||||||
|
[19]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/07/sugarlabs.jpg?resize=992%2C744&ssl=1
|
||||||
|
[20]: https://itsfoss.com/what-is-flatpak/
|
||||||
|
[21]: https://www.sugarlabs.org
|
||||||
|
[22]: https://sourceforge.net/projects/cyberorg-home/files/Li-f-e/
|
||||||
|
[23]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/07/skolelinux.png?resize=800%2C450&ssl=1
|
||||||
|
[24]: http://www.skolelinux.org
|
||||||
|
[25]: https://www.linuxschools.com/forum/index-main.php
|
||||||
|
[26]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/07/escuelas-linux.jpg?resize=800%2C450&ssl=1
|
||||||
|
[27]: https://itsfoss.com/escuelas-linux/
|
||||||
|
[28]: https://itsfoss.com/lightweight-linux-beginners/
|
||||||
|
[29]: https://escuelaslinux.sourceforge.io/english/index.html
|
||||||
|
[30]: https://bosslinux.in/eduboss
|
169
published/202108/20200107 5 ways to improve your Bash scripts.md
Normal file
169
published/202108/20200107 5 ways to improve your Bash scripts.md
Normal file
@ -0,0 +1,169 @@
|
|||||||
|
[#]: collector: "lujun9972"
|
||||||
|
[#]: translator: "fisherue"
|
||||||
|
[#]: reviewer: "wxy"
|
||||||
|
[#]: publisher: "wxy"
|
||||||
|
[#]: url: "https://linux.cn/article-13717-1.html"
|
||||||
|
[#]: subject: "5 ways to improve your Bash scripts"
|
||||||
|
[#]: via: "https://opensource.com/article/20/1/improve-bash-scripts"
|
||||||
|
[#]: author: "Alan Formy-Duval https://opensource.com/users/alanfdoss"
|
||||||
|
|
||||||
|
改进你的脚本程序的 5 个方法
|
||||||
|
======
|
||||||
|
|
||||||
|
> 巧用 Bash 脚本程序能帮助你完成很多极具挑战的任务。
|
||||||
|
|
||||||
|
![](https://img.linux.net.cn/data/attachment/album/202108/25/131347yblk4jg4r6blebmg.jpg)
|
||||||
|
|
||||||
|
系统管理员经常写脚本程序,不论长短,这些脚本可以完成某种任务。
|
||||||
|
|
||||||
|
你是否曾经查看过某个软件发行方提供的安装用的<ruby>脚本<rt>script</rt></ruby>程序?为了能够适应不同用户的系统配置,顺利完成安装,这些脚本程序经常包含很多函数和逻辑分支。多年来,我积累了一些改进脚本程序的一些技巧,这里分享几个,希望能对朋友们也有用。这里列出一组短脚本示例,展示给大家做脚本样本。
|
||||||
|
|
||||||
|
### 初步尝试
|
||||||
|
|
||||||
|
我尝试写一个脚本程序时,原始程序往往就是一组命令行,通常就是调用标准命令完成诸如更新网页内容之类的工作,这样可以节省时间。其中一个类似的工作是解压文件到 Apache 网站服务器的主目录里,我的最初脚本程序大概是下面这样:
|
||||||
|
|
||||||
|
```
|
||||||
|
cp january_schedule.tar.gz /usr/apache/home/calendar/
|
||||||
|
cd /usr/apache/home/calendar/
|
||||||
|
tar zvxf january_schedule.tar.gz
|
||||||
|
```
|
||||||
|
|
||||||
|
这帮我节省了时间,也减少了键入多条命令操作。时日久了,我掌握了另外的技巧,可以用 Bash 脚本程序完成更难的一些工作,比如说创建软件安装包、安装软件、备份文件系统等工作。
|
||||||
|
|
||||||
|
### 1、条件分支结构
|
||||||
|
|
||||||
|
和众多其他编程语言一样,脚本程序的条件分支结构同样是强大的常用技能。条件分支结构赋予了计算机程序逻辑能力,我的很多实例都是基于条件逻辑分支。
|
||||||
|
|
||||||
|
基本的条件分支结构就是 `if` 条件分支结构。通过判定是否满足特定条件,可以控制程序选择执行相应的脚本命令段。比如说,想要判断系统是否安装了 Java ,可以通过判断系统有没有一个 Java 库目录;如果找到这个目录,就把这个目录路径添加到可运行程序路径,也就可以调用 Java 库应用了。
|
||||||
|
|
||||||
|
```
|
||||||
|
if [ -d "$JAVA_HOME/bin" ] ; then
|
||||||
|
PATH="$JAVA_HOME/bin:$PATH"
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2、限定运行权限
|
||||||
|
|
||||||
|
你或许想只允许特定的用户才能执行某个脚本程序。除了 Linux 的权限许可管理,比如对用户和用户组设定权限、通过 SELinux 设定此类的保护权限等,你还可以在脚本里设置逻辑判断来设置执行权限。类似的情况可能是,你需要确保只有网站程序的所有者才能执行相应的网站初始化操作脚本。甚至你可以限定只有 root 用户才能执行某个脚本。这个可以通过在脚本程序里设置逻辑判断实现,Linux 提供的几个环境变量可以帮忙。其中一个是保存用户名称的变量 `$USER`, 另一个是保存用户识别码的变量 `$UID` 。在脚本程序里,执行用户的 UID 值就保存在 `$UID` 变量里。
|
||||||
|
|
||||||
|
#### 用户名判别
|
||||||
|
|
||||||
|
第一个例子里,我在一个带有几个应用服务器实例的多用户环境里指定只有用户 `jboss1` 可以执行脚本程序。条件 `if` 语句主要是判断,“要求执行这个脚本程序的用户不是 `jboss1` 吗?”当此条件为真时,就会调用第一个 `echo` 语句,接着是 `exit 1`,即退出这个脚本程序。
|
||||||
|
|
||||||
|
```
|
||||||
|
if [ "$USER" != 'jboss1' ]; then
|
||||||
|
echo "Sorry, this script must be run as JBOSS1!"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
echo "continue script"
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 根用户判别
|
||||||
|
|
||||||
|
接下来的例子是要求只有根用户才能执行脚本程序。根用户的用户识别码(UID)是 0,设置的条件判断采用大于操作符(`-gt`),所有 UID 值大于 0 的用户都被禁止执行该脚本程序。
|
||||||
|
|
||||||
|
```
|
||||||
|
if [ "$UID" -gt 0 ]; then
|
||||||
|
echo "Sorry, this script must be run as ROOT!"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
echo "continue script"
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3、带参数执行程序
|
||||||
|
|
||||||
|
可执行程序可以附带参数作为执行选项,命令行脚本程序也是一样,下面给出几个例子。在这之前,我想告诉你,能写出好的程序并不只是写出我们想要它执行什么的程序,程序还需要不执行我们不要它执行的操作。如果运行程序时没有提供参数造成程序缺少足够信息,我愿意脚本程序不要做任何破坏性的操作。因而,程序的第一步就是确认命令行是否提供了参数,判定的条件就是参数数量 `$#` 是否为 0 ,如果是(意味着没有提供参数),就直接终止脚本程序并退出操作。
|
||||||
|
|
||||||
|
|
||||||
|
```
|
||||||
|
if [ $# -eq 0 ]; then
|
||||||
|
echo "No arguments provided"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
echo "arguments found: $#"
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 多个运行参数
|
||||||
|
|
||||||
|
可以传递给脚本程序的参数不止一个。脚本使用内部变量指代这些参数,内部变量名用非负整数递增标识,也就是 `$1`、`$2`、`$3` 等等递增。我只是扩展前面的程序,并在下面一行输出显示用户提供的前三个参数。显然,要针对所有的每个参数有对应的响应需要更多的逻辑判断,这里的例子只是简单展示参数的使用。
|
||||||
|
|
||||||
|
```
|
||||||
|
echo $1 $2 $3
|
||||||
|
```
|
||||||
|
|
||||||
|
我们在讨论这些参数变量名,你或许有个疑问,“参数变量名怎么跳过了 `$0`,(而直接从`$1` 开始)?”
|
||||||
|
|
||||||
|
是的,是这样,这是有原因的。变量名 `$0` 确实存在,也非常有用,它储存的是被执行的脚本程序的名称。
|
||||||
|
|
||||||
|
```
|
||||||
|
echo $0
|
||||||
|
```
|
||||||
|
|
||||||
|
程序执行过程中有一个变量名指代程序名称,很重要的一个原因是,可以在生成的日志文件名称里包含程序名称,最简单的方式应该是调用一个 `echo` 语句。
|
||||||
|
|
||||||
|
```
|
||||||
|
echo test >> $0.log
|
||||||
|
```
|
||||||
|
|
||||||
|
当然,你或许要增加一些代码,确保这个日志文件存放在你希望的路径,日志名称包含你认为有用的信息。
|
||||||
|
|
||||||
|
### 4、交互输入
|
||||||
|
|
||||||
|
脚本程序的另一个好用的特性是可以在执行过程中接受输入,最简单的情况是让用户可以输入一些信息。
|
||||||
|
|
||||||
|
|
||||||
|
```
|
||||||
|
echo "enter a word please:"
|
||||||
|
read word
|
||||||
|
echo $word
|
||||||
|
```
|
||||||
|
|
||||||
|
这样也可以让用户在程序执行中作出选择。
|
||||||
|
|
||||||
|
```
|
||||||
|
read -p "Install Software ?? [Y/n]: " answ
|
||||||
|
if [ "$answ" == 'n' ]; then
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
echo "Installation starting..."
|
||||||
|
```
|
||||||
|
|
||||||
|
### 5、出错退出执行
|
||||||
|
|
||||||
|
几年前,我写了个脚本,想在自己的电脑上安装最新版本的 Java 开发工具包(JDK)。这个脚本把 JDK 文件解压到指定目录,创建更新一些符号链接,再做一下设置告诉系统使用这个最新的版本。如果解压过程出现错误,在执行后面的操作就会使整个系统上的 Java 破坏不能使用。因而,这种情况下需要终止程序。如果解压过程没有成功,就不应该再继续进行之后的更新操作。下面语句段可以完成这个功能。
|
||||||
|
|
||||||
|
```
|
||||||
|
tar kxzmf jdk-8u221-linux-x64.tar.gz -C /jdk --checkpoint=.500; ec=$?
|
||||||
|
if [ $ec -ne 0 ]; then
|
||||||
|
echo "Installation failed - exiting."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
```
|
||||||
|
|
||||||
|
下面的单行语句可以给你快速展示一下变量 `$?` 的用法。
|
||||||
|
|
||||||
|
```
|
||||||
|
ls T; ec=$?; echo $ec
|
||||||
|
```
|
||||||
|
|
||||||
|
先用 `touch T` 命令创建一个文件名为 `T` 的文件,然后执行这个单行命令,变量 `ec` 的值会是 0。然后,用 `rm T` 命令删除文件,再执行该单行命令,变量 `ec` 的值会是 2,因为文件 `T` 不存在,命令 `ls` 找不到指定文件报错。
|
||||||
|
|
||||||
|
在逻辑条件里利用这个出错标识,参照前文我使用的条件判断,可以使脚本文件按需完成设定操作。
|
||||||
|
|
||||||
|
### 结语
|
||||||
|
|
||||||
|
要完成复杂的功能,或许我们觉得应该使用诸如 Python、C 或 Java 这类的高级编程语言,然而并不尽然,脚本编程语言也很强大,可以完成类似任务。要充分发挥脚本的作用,有很多需要学习的,希望这里的几个例子能让你意识到脚本编程的强大。
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
via: https://opensource.com/article/20/1/improve-bash-scripts
|
||||||
|
|
||||||
|
作者:[Alan Formy-Duval][a]
|
||||||
|
选题:[lujun9972][b]
|
||||||
|
译者:[fisherue](https://github.com/fisherue)
|
||||||
|
校对:[wxy](https://github.com/wxy)
|
||||||
|
|
||||||
|
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||||
|
|
||||||
|
[a]: https://opensource.com/users/alanfdoss
|
||||||
|
[b]: https://github.com/lujun9972
|
||||||
|
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/rh_003784_02_os.comcareers_os_rh2x.png?itok=jbRfXinl "工作者图片"
|
@ -0,0 +1,421 @@
|
|||||||
|
[#]: collector: (lujun9972)
|
||||||
|
[#]: translator: (YungeG)
|
||||||
|
[#]: reviewer: (wxy)
|
||||||
|
[#]: publisher: (wxy)
|
||||||
|
[#]: url: (https://linux.cn/article-13720-1.html)
|
||||||
|
[#]: subject: (Understanding systemd at startup on Linux)
|
||||||
|
[#]: via: (https://opensource.com/article/20/5/systemd-startup)
|
||||||
|
[#]: author: (David Both https://opensource.com/users/dboth)
|
||||||
|
|
||||||
|
理解 systemd 启动时在做什么
|
||||||
|
======
|
||||||
|
|
||||||
|
> systemd 启动过程提供的重要线索可以在问题出现时助你一臂之力。
|
||||||
|
|
||||||
|
![](https://img.linux.net.cn/data/attachment/album/202108/26/110220piwnicwxvvc1s8io.jpg)
|
||||||
|
|
||||||
|
在本系列的第一篇文章《[学着爱上 systemd][2]》,我考察了 systemd 的功能和架构,以及围绕 systemd 作为古老的 SystemV 初始化程序和启动脚本的替代品的争论。在这第二篇文章中,我将开始探索管理 Linux 启动序列的文件和工具。我会解释 systemd 启动序列、如何更改默认的启动目标(即 SystemV 术语中的运行级别)、以及在不重启的情况下如何手动切换到不同的目标。
|
||||||
|
|
||||||
|
我还将考察两个重要的 systemd 工具。第一个 `systemctl` 命令是和 systemd 交互、向其发送命令的基本方式。第二个是 `journalctl`,用于访问 systemd 日志,后者包含了大量系统历史数据,比如内核和服务的消息(包括指示性信息和错误信息)。
|
||||||
|
|
||||||
|
务必使用一个非生产系统进行本文和后续文章中的测试和实验。你的测试系统需要安装一个 GUI 桌面(比如 Xfce、LXDE、Gnome、KDE 或其他)。
|
||||||
|
|
||||||
|
上一篇文章中我写道计划在这篇文章创建一个 systemd 单元并添加到启动序列。由于这篇文章比我预期中要长,这些内容将留到本系列的下一篇文章。
|
||||||
|
|
||||||
|
### 使用 systemd 探索 Linux 的启动
|
||||||
|
|
||||||
|
在观察启动序列之前,你需要做几件事情得使引导和启动序列开放可见。正常情况下,大多数发行版使用一个开机动画或者启动画面隐藏 Linux 启动和关机过程中的显示细节,在基于 Red Hat 的发行版中称作 Plymouth 引导画面。这些隐藏的消息能够向寻找信息以排除程序故障、或者只是学习启动序列的系统管理员提供大量有关系统启动和关闭的信息。你可以通过 GRUB(<ruby>大统一引导加载器<rt>Grand Unified Boot Loader</rt></ruby>)配置改变这个设置。
|
||||||
|
|
||||||
|
主要的 GRUB 配置文件是 `/boot/grub2/grub.cfg` ,但是这个文件在更新内核版本时会被覆盖,你不会想修改它的。相反,应该修改用于改变 `grub.cfg` 默认设置的 `/etc/default/grub` 文件。
|
||||||
|
|
||||||
|
首先看一下当前未修改的 `/etc/default/grub` 文件的版本:
|
||||||
|
|
||||||
|
```
|
||||||
|
[root@testvm1 ~]# cd /etc/default ; cat grub
|
||||||
|
GRUB_TIMEOUT=5
|
||||||
|
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
|
||||||
|
GRUB_DEFAULT=saved
|
||||||
|
GRUB_DISABLE_SUBMENU=true
|
||||||
|
GRUB_TERMINAL_OUTPUT="console"
|
||||||
|
GRUB_CMDLINE_LINUX="resume=/dev/mapper/fedora_testvm1-swap rd.lvm.
|
||||||
|
lv=fedora_testvm1/root rd.lvm.lv=fedora_testvm1/swap rd.lvm.lv=fedora_
|
||||||
|
testvm1/usr rhgb quiet"
|
||||||
|
GRUB_DISABLE_RECOVERY="true"
|
||||||
|
[root@testvm1 default]#
|
||||||
|
```
|
||||||
|
|
||||||
|
[GRUB 文档][3] 的第 6 章列出了 `/etc/default/grub` 文件的所有可用项,我只关注下面的部分:
|
||||||
|
|
||||||
|
* 我将 GRUB 菜单倒计时的秒数 `GRUB_TIMEOUT`,从 5 改成 10,以便在倒计时达到 0 之前有更多的时间响应 GRUB 菜单。
|
||||||
|
* `GRUB_CMDLINE_LINUX` 列出了引导阶段传递给内核的命令行参数,我删除了其中的最后两个参数。其中的一个参数 `rhgb` 代表 “<ruby>红帽图形化引导<rt>Red Hat Graphical Boot</rt></ruby>”,在内核初始化阶段显示一个小小的 Fedora 图标动画,而不是显示引导阶段的信息。另一个参数 `quiet`,屏蔽显示记录了启动进度和发生错误的消息。系统管理员需要这些信息,因此我删除了 `rhgb` 和 `quiet`。如果引导阶段发生了错误,屏幕上显示的信息可以指向故障的原因。
|
||||||
|
|
||||||
|
更改之后,你的 GRUB 文件将会像下面一样:
|
||||||
|
|
||||||
|
```
|
||||||
|
[root@testvm1 default]# cat grub
|
||||||
|
GRUB_TIMEOUT=10
|
||||||
|
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
|
||||||
|
GRUB_DEFAULT=saved
|
||||||
|
GRUB_DISABLE_SUBMENU=true
|
||||||
|
GRUB_TERMINAL_OUTPUT="console"
|
||||||
|
GRUB_CMDLINE_LINUX="resume=/dev/mapper/fedora_testvm1-swap rd.lvm.
|
||||||
|
lv=fedora_testvm1/root rd.lvm.lv=fedora_testvm1/swap rd.lvm.lv=fedora_
|
||||||
|
testvm1/usr"
|
||||||
|
GRUB_DISABLE_RECOVERY="false"
|
||||||
|
[root@testvm1 default]#
|
||||||
|
```
|
||||||
|
|
||||||
|
`grub2-mkconfig` 程序使用 `/etc/default/grub` 文件的内容生成 `grub.cfg` 配置文件,从而改变一些默认的 GRUB 设置。`grub2-mkconfig` 输出到 `STDOUT`,你可以使用程序的 `-o` 参数指明数据流输出的文件,不过使用重定向也同样简单。执行下面的命令更新 `/boot/grub2/grub.cfg` 配置文件:
|
||||||
|
|
||||||
|
```
|
||||||
|
[root@testvm1 grub2]# grub2-mkconfig > /boot/grub2/grub.cfg
|
||||||
|
Generating grub configuration file ...
|
||||||
|
Found linux image: /boot/vmlinuz-4.18.9-200.fc28.x86_64
|
||||||
|
Found initrd image: /boot/initramfs-4.18.9-200.fc28.x86_64.img
|
||||||
|
Found linux image: /boot/vmlinuz-4.17.14-202.fc28.x86_64
|
||||||
|
Found initrd image: /boot/initramfs-4.17.14-202.fc28.x86_64.img
|
||||||
|
Found linux image: /boot/vmlinuz-4.16.3-301.fc28.x86_64
|
||||||
|
Found initrd image: /boot/initramfs-4.16.3-301.fc28.x86_64.img
|
||||||
|
Found linux image: /boot/vmlinuz-0-rescue-7f12524278bd40e9b10a085bc82dc504
|
||||||
|
Found initrd image: /boot/initramfs-0-rescue-7f12524278bd40e9b10a085bc82dc504.img
|
||||||
|
done
|
||||||
|
[root@testvm1 grub2]#
|
||||||
|
```
|
||||||
|
|
||||||
|
重新启动你的测试系统查看本来会隐藏在 Plymouth 开机动画之下的启动信息。但是如果你没有关闭开机动画,又需要查看启动信息的话又该如何操作?或者你关闭了开机动画,而消息流过的速度太快,无法阅读怎么办?(实际情况如此。)
|
||||||
|
|
||||||
|
有两个解决方案,都涉及到日志文件和 systemd 日志 —— 两个都是你的好伙伴。你可以使用 `less` 命令查看 `/var/log/messages` 文件的内容。这个文件包含引导和启动信息,以及操作系统执行正常操作时生成的信息。你也可以使用不加任何参数的 `journalctl` 命令查看 systemd 日志,包含基本相同的信息:
|
||||||
|
|
||||||
|
```
|
||||||
|
[root@testvm1 grub2]# journalctl
|
||||||
|
-- Logs begin at Sat 2020-01-11 21:48:08 EST, end at Fri 2020-04-03 08:54:30 EDT. --
|
||||||
|
Jan 11 21:48:08 f31vm.both.org kernel: Linux version 5.3.7-301.fc31.x86_64 (mockbuild@bkernel03.phx2.fedoraproject.org) (gcc version 9.2.1 20190827 (Red Hat 9.2.1-1) (GCC)) #1 SMP Mon Oct >
|
||||||
|
Jan 11 21:48:08 f31vm.both.org kernel: Command line: BOOT_IMAGE=(hd0,msdos1)/vmlinuz-5.3.7-301.fc31.x86_64 root=/dev/mapper/VG01-root ro resume=/dev/mapper/VG01-swap rd.lvm.lv=VG01/root rd>
|
||||||
|
Jan 11 21:48:08 f31vm.both.org kernel: x86/fpu: Supporting XSAVE feature 0x001: 'x87 floating point registers'
|
||||||
|
Jan 11 21:48:08 f31vm.both.org kernel: x86/fpu: Supporting XSAVE feature 0x002: 'SSE registers'
|
||||||
|
Jan 11 21:48:08 f31vm.both.org kernel: x86/fpu: Supporting XSAVE feature 0x004: 'AVX registers'
|
||||||
|
Jan 11 21:48:08 f31vm.both.org kernel: x86/fpu: xstate_offset[2]: 576, xstate_sizes[2]: 256
|
||||||
|
Jan 11 21:48:08 f31vm.both.org kernel: x86/fpu: Enabled xstate features 0x7, context size is 832 bytes, using 'standard' format.
|
||||||
|
Jan 11 21:48:08 f31vm.both.org kernel: BIOS-provided physical RAM map:
|
||||||
|
Jan 11 21:48:08 f31vm.both.org kernel: BIOS-e820: [mem 0x0000000000000000-0x000000000009fbff] usable
|
||||||
|
Jan 11 21:48:08 f31vm.both.org kernel: BIOS-e820: [mem 0x000000000009fc00-0x000000000009ffff] reserved
|
||||||
|
Jan 11 21:48:08 f31vm.both.org kernel: BIOS-e820: [mem 0x00000000000f0000-0x00000000000fffff] reserved
|
||||||
|
Jan 11 21:48:08 f31vm.both.org kernel: BIOS-e820: [mem 0x0000000000100000-0x00000000dffeffff] usable
|
||||||
|
Jan 11 21:48:08 f31vm.both.org kernel: BIOS-e820: [mem 0x00000000dfff0000-0x00000000dfffffff] ACPI data
|
||||||
|
Jan 11 21:48:08 f31vm.both.org kernel: BIOS-e820: [mem 0x00000000fec00000-0x00000000fec00fff] reserved
|
||||||
|
Jan 11 21:48:08 f31vm.both.org kernel: BIOS-e820: [mem 0x00000000fee00000-0x00000000fee00fff] reserved
|
||||||
|
Jan 11 21:48:08 f31vm.both.org kernel: BIOS-e820: [mem 0x00000000fffc0000-0x00000000ffffffff] reserved
|
||||||
|
Jan 11 21:48:08 f31vm.both.org kernel: BIOS-e820: [mem 0x0000000100000000-0x000000041fffffff] usable
|
||||||
|
Jan 11 21:48:08 f31vm.both.org kernel: NX (Execute Disable) protection: active
|
||||||
|
Jan 11 21:48:08 f31vm.both.org kernel: SMBIOS 2.5 present.
|
||||||
|
Jan 11 21:48:08 f31vm.both.org kernel: DMI: innotek GmbH VirtualBox/VirtualBox, BIOS VirtualBox 12/01/2006
|
||||||
|
Jan 11 21:48:08 f31vm.both.org kernel: Hypervisor detected: KVM
|
||||||
|
Jan 11 21:48:08 f31vm.both.org kernel: kvm-clock: Using msrs 4b564d01 and 4b564d00
|
||||||
|
Jan 11 21:48:08 f31vm.both.org kernel: kvm-clock: cpu 0, msr 30ae01001, primary cpu clock
|
||||||
|
Jan 11 21:48:08 f31vm.both.org kernel: kvm-clock: using sched offset of 8250734066 cycles
|
||||||
|
Jan 11 21:48:08 f31vm.both.org kernel: clocksource: kvm-clock: mask: 0xffffffffffffffff max_cycles: 0x1cd42e4dffb, max_idle_ns: 881590591483 ns
|
||||||
|
Jan 11 21:48:08 f31vm.both.org kernel: tsc: Detected 2807.992 MHz processor
|
||||||
|
Jan 11 21:48:08 f31vm.both.org kernel: e820: update [mem 0x00000000-0x00000fff] usable ==> reserved
|
||||||
|
Jan 11 21:48:08 f31vm.both.org kernel: e820: remove [mem 0x000a0000-0x000fffff] usable
|
||||||
|
<snip>
|
||||||
|
```
|
||||||
|
|
||||||
|
由于数据流可能长达几十万甚至几百万行,我在这里截断了它。(我的主要工作站上列出的日志长度是 1,188,482 行。)请确保是在你的测试系统尝试的这个命令。如果系统已经运行了一段时间 —— 即使重启过很多次 —— 还是会显示大量的数据。查看这些日志数据,因为它包含了很多信息,在进行问题判断时可能非常有用。了解这个数据文件在正常的引导和启动过程中的模样,可以帮助你在问题出现时定位问题。
|
||||||
|
|
||||||
|
我将在本系列之后的文章讨论 systemd 日志、`journalctl` 命令、以及如何整理输出的日志数据来寻找更详细的信息。
|
||||||
|
|
||||||
|
内核被 GRUB 加载到内存后,必须先将自己从压缩后的文件中解压出来,才能执行任何有意义的操作。解压自己后,内核开始运行,加载 systemd 并转交控制权。
|
||||||
|
|
||||||
|
<ruby>引导<rt>boot</rt></ruby>阶段到此结束,此时 Linux 内核和 systemd 正在运行,但是无法为用户执行任何生产性任务,因为其他的程序都没有执行,没有命令行解释器提供命令行,没有后台进程管理网络和其他的通信链接,也没有任何东西能够控制计算机执行生产功能。
|
||||||
|
|
||||||
|
现在 systemd 可以加载所需的功能性单元以便将系统启动到选择的目标运行状态。
|
||||||
|
|
||||||
|
### 目标
|
||||||
|
|
||||||
|
一个 systemd <ruby>目标<rt>target</rt></ruby>代表一个 Linux 系统当前的或期望的运行状态。与 SystemV 启动脚本十分类似,目标定义了系统运行必须存在的服务,以及处于目标状态下必须激活的服务。图表 1 展示了使用 systemd 的 Linux 系统可能的运行状态目标。就像在本系列的第一篇文章以及 systemd 启动的手册页(`man bootup`)所看到的一样,有一些开启不同必要服务的其他中间目标,包括 `swap.target`、`timers.target`、`local-fs.target` 等。一些目标(像 `basic.target`)作为检查点使用,在移动到下一个更高级的目标之前保证所有需要的服务已经启动并运行。
|
||||||
|
|
||||||
|
除非开机时在 GRUB 菜单进行更改,systemd 总是启动 `default.target`。`default.target` 文件是指向真实的目标文件的符号链接。对于桌面工作站,`default.target` 通常是 `graphical.target`,等同于 SystemV 的运行等级 5。对于服务器,默认目标多半是 `multi-user.target`,就像 SystemV 的运行等级 3。`emergency.target` 文件类似单用户模式。目标和<ruby>服务<rt>service</rt></ruby>都是一种 systemd 单元。
|
||||||
|
|
||||||
|
下面的图表,包含在本系列的上一篇文章中,比较了 systemd 目标和古老的 SystemV 启动运行等级。为了向后兼容,systemd 提供了 systemd 目标别名,允许脚本和系统管理员使用像 `init 3` 一样的 SystemV 命令改变运行等级。当然,SystemV 命令被转发给 systemd 进行解释和执行。
|
||||||
|
|
||||||
|
**systemd 目标** | **SystemV 运行级别** | **目标别名** | **描述**
|
||||||
|
---|---|---|---
|
||||||
|
| `default.target` | | | 这个目标通常是一个符号链接,作为 `multi-user.target` 或 `graphical.target` 的别名。systemd 总是用 `default.target` 启动系统。`default.target** 不能作为 `halt.target`、`poweroff.target` 和 `reboot.target` 的别名。|
|
||||||
|
| `graphical.target` | 5 | `runlevel5.target` | 带有 GUI 的 `multi-user.target` 。|
|
||||||
|
| | 4 | `runlevel4.target` | 未使用。运行等级 4 和 SystemV 的运行等级 3 一致,可以创建这个目标并进行定制,用于启动本地服务,而不必更改默认的 `multi-user.target`。 |
|
||||||
|
| `multi-user.target` | 3 | `runlevel3.target` | 运行所有的服务,但是只有命令行界面(CLI) 。|
|
||||||
|
| | 2 | `runlevel2.target` | 多用户,没有 NFS,但是运行其他所有的非 GUI 服务
|
||||||
|
| `rescue.target` | 1 | `runlevel1.target` | 一个基本的系统,包括挂载文件系统,但是只运行最基础的服务,以及一个主控制台上的用于救援的命令行解释器。|
|
||||||
|
| `emergency.target` | S | | 单用户模式 —— 没有服务运行;文件系统没有挂载。这是最基础级的操作模式,只有一个运行在主控制台的用于紧急情况的命令行解释器,供用户和系统交互。 |
|
||||||
|
| `halt.target` | | | 不断电的情况下停止系统 |
|
||||||
|
| `reboot.target` | 6 | `runlevel6.target` | 重启 |
|
||||||
|
| `poweroff.target` | 0 | `runlevel0.target` | 停止系统并关闭电源 |
|
||||||
|
|
||||||
|
每个目标在配置文件中都描述了一组依赖关系。systemd 启动需要的依赖,即 Linux 主机运行在特定功能级别所需的服务。加载目标配置文件中列出的所有依赖并运行后,系统就运行在那个目标等级。如果愿意,你可以在本系列的第一篇文章《[学着爱上 systemd][2]》中回顾 systemd 的启动序列和运行时目标。
|
||||||
|
|
||||||
|
### 探索当前的目标
|
||||||
|
|
||||||
|
许多 Linux 发行版默认安装一个 GUI 桌面界面,以便安装的系统可以像工作站一样使用。我总是从 Fedora Live USB 引导驱动器安装 Xfce 或 LXDE 桌面。即使是安装一个服务器或者其他基础类型的主机(比如用于路由器和防火墙的主机),我也使用 GUI 桌面的安装方式。
|
||||||
|
|
||||||
|
我可以安装一个没有桌面的服务器(数据中心的典型做法),但是这样不满足我的需求。原因不是我需要 GUI 桌面本身,而是 LXDE 安装包含了许多其他默认的服务器安装没有提供的工具,这意味着初始安装之后我需要做的工作更少。
|
||||||
|
|
||||||
|
但是,仅仅因为有 GUI 桌面并不意味着我要使用它。我有一个 16 端口的 KVM,可以用于访问我的大部分 Linux 系统的 KVM 接口,但我和它们交互的大部分交互是通过从我的主要工作站建立的远程 SSH 连接。这种方式更安全,而且和 `graphical.target` 相比,运行 `multi-user.target` 使用更少的系统资源。
|
||||||
|
|
||||||
|
首先,检查默认目标,确认是 `graphical.target`:
|
||||||
|
|
||||||
|
```
|
||||||
|
[root@testvm1 ~]# systemctl get-default
|
||||||
|
graphical.target
|
||||||
|
[root@testvm1 ~]#
|
||||||
|
```
|
||||||
|
|
||||||
|
然后确认当前正在运行的目标,应该和默认目标相同。你仍可以使用老方法,输出古老的 SystemV 运行等级。注意,前一个运行等级在左边,这里是 `N`(意思是 None),表示主机启动后没有修改过运行等级。数字 5 是当前的目标,正如古老的 SystemV 术语中的定义:
|
||||||
|
|
||||||
|
```
|
||||||
|
[root@testvm1 ~]# runlevel
|
||||||
|
N 5
|
||||||
|
[root@testvm1 ~]#
|
||||||
|
```
|
||||||
|
|
||||||
|
注意,`runlevel` 的手册页指出运行等级已经被淘汰,并提供了一个转换表。
|
||||||
|
|
||||||
|
你也可以使用 systemd 方式,命令的输出有很多行,但确实用 systemd 术语提供了答案:
|
||||||
|
|
||||||
|
```
|
||||||
|
[root@testvm1 ~]# systemctl list-units --type target
|
||||||
|
UNIT LOAD ACTIVE SUB DESCRIPTION
|
||||||
|
basic.target loaded active active Basic System
|
||||||
|
cryptsetup.target loaded active active Local Encrypted Volumes
|
||||||
|
getty.target loaded active active Login Prompts
|
||||||
|
graphical.target loaded active active Graphical Interface
|
||||||
|
local-fs-pre.target loaded active active Local File Systems (Pre)
|
||||||
|
local-fs.target loaded active active Local File Systems
|
||||||
|
multi-user.target loaded active active Multi-User System
|
||||||
|
network-online.target loaded active active Network is Online
|
||||||
|
network.target loaded active active Network
|
||||||
|
nfs-client.target loaded active active NFS client services
|
||||||
|
nss-user-lookup.target loaded active active User and Group Name Lookups
|
||||||
|
paths.target loaded active active Paths
|
||||||
|
remote-fs-pre.target loaded active active Remote File Systems (Pre)
|
||||||
|
remote-fs.target loaded active active Remote File Systems
|
||||||
|
rpc_pipefs.target loaded active active rpc_pipefs.target
|
||||||
|
slices.target loaded active active Slices
|
||||||
|
sockets.target loaded active active Sockets
|
||||||
|
sshd-keygen.target loaded active active sshd-keygen.target
|
||||||
|
swap.target loaded active active Swap
|
||||||
|
sysinit.target loaded active active System Initialization
|
||||||
|
timers.target loaded active active Timers
|
||||||
|
|
||||||
|
LOAD = Reflects whether the unit definition was properly loaded.
|
||||||
|
ACTIVE = The high-level unit activation state, i.e. generalization of SUB.
|
||||||
|
SUB = The low-level unit activation state, values depend on unit type.
|
||||||
|
|
||||||
|
21 loaded units listed. Pass --all to see loaded but inactive units, too.
|
||||||
|
To show all installed unit files use 'systemctl list-unit-files'.
|
||||||
|
```
|
||||||
|
|
||||||
|
上面列出了当前加载的和激活的目标,你也可以看到 `graphical.target` 和 `multi-user.target`。`multi-user.target` 需要在 `graphical.target` 之前加载。这个例子中,`graphical.target` 是激活的。
|
||||||
|
|
||||||
|
### 切换到不同的目标
|
||||||
|
|
||||||
|
切换到 `multi-user.target` 很简单:
|
||||||
|
|
||||||
|
```
|
||||||
|
[root@testvm1 ~]# systemctl isolate multi-user.target
|
||||||
|
```
|
||||||
|
|
||||||
|
显示器现在应该从 GUI 桌面或登录界面切换到了一个虚拟控制台。登录并列出当前激活的 systemd 单元,确认 `graphical.target` 不再运行:
|
||||||
|
|
||||||
|
```
|
||||||
|
[root@testvm1 ~]# systemctl list-units --type target
|
||||||
|
```
|
||||||
|
|
||||||
|
务必使用 `runlevel` 确认命令输出了之前的和当前的“运行等级”:
|
||||||
|
|
||||||
|
```
|
||||||
|
[root@testvm1 ~]# runlevel
|
||||||
|
5 3
|
||||||
|
```
|
||||||
|
|
||||||
|
### 更改默认目标
|
||||||
|
|
||||||
|
现在,将默认目标改为 `multi-user.target`,以便系统总是启动进入 `multi-user.target`,从而使用控制台命令行接口而不是 GUI 桌面接口。使用你的测试主机的根用户,切换到保存 systemd 配置的目录,执行一次快速列出操作:
|
||||||
|
|
||||||
|
```
|
||||||
|
[root@testvm1 ~]# cd /etc/systemd/system/ ; ll
|
||||||
|
drwxr-xr-x. 2 root root 4096 Apr 25 2018 basic.target.wants
|
||||||
|
<snip>
|
||||||
|
lrwxrwxrwx. 1 root root 36 Aug 13 16:23 default.target -> /lib/systemd/system/graphical.target
|
||||||
|
lrwxrwxrwx. 1 root root 39 Apr 25 2018 display-manager.service -> /usr/lib/systemd/system/lightdm.service
|
||||||
|
drwxr-xr-x. 2 root root 4096 Apr 25 2018 getty.target.wants
|
||||||
|
drwxr-xr-x. 2 root root 4096 Aug 18 10:16 graphical.target.wants
|
||||||
|
drwxr-xr-x. 2 root root 4096 Apr 25 2018 local-fs.target.wants
|
||||||
|
drwxr-xr-x. 2 root root 4096 Oct 30 16:54 multi-user.target.wants
|
||||||
|
<snip>
|
||||||
|
[root@testvm1 system]#
|
||||||
|
```
|
||||||
|
|
||||||
|
为了强调一些有助于解释 systemd 如何管理启动过程的重要事项,我缩短了这个列表。你应该可以在虚拟机看到完整的目录和链接列表。
|
||||||
|
|
||||||
|
`default.target` 项是指向目录 `/lib/systemd/system/graphical.target` 的符号链接(软链接),列出那个目录查看目录中的其他内容:
|
||||||
|
|
||||||
|
```
|
||||||
|
[root@testvm1 system]# ll /lib/systemd/system/ | less
|
||||||
|
```
|
||||||
|
|
||||||
|
你应该在这个列表中看到文件、目录、以及更多链接,但是专门寻找一下 `multi-user.target` 和 `graphical.target`。现在列出 `default.target`(指向 `/lib/systemd/system/graphical.target` 的链接)的内容:
|
||||||
|
|
||||||
|
```
|
||||||
|
[root@testvm1 system]# cat default.target
|
||||||
|
# SPDX-License-Identifier: LGPL-2.1+
|
||||||
|
#
|
||||||
|
# This file is part of systemd.
|
||||||
|
#
|
||||||
|
# systemd is free software; you can redistribute it and/or modify it
|
||||||
|
# under the terms of the GNU Lesser General Public License as published by
|
||||||
|
# the Free Software Foundation; either version 2.1 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
|
||||||
|
[Unit]
|
||||||
|
Description=Graphical Interface
|
||||||
|
Documentation=man:systemd.special(7)
|
||||||
|
Requires=multi-user.target
|
||||||
|
Wants=display-manager.service
|
||||||
|
Conflicts=rescue.service rescue.target
|
||||||
|
After=multi-user.target rescue.service rescue.target display-manager.service
|
||||||
|
AllowIsolate=yes
|
||||||
|
[root@testvm1 system]#
|
||||||
|
```
|
||||||
|
|
||||||
|
`graphical.target` 文件的这个链接描述了图形用户接口需要的所有必备条件。我会在本系列的下一篇文章至少探讨其中的一些选项。
|
||||||
|
|
||||||
|
为了使主机启动到多用户模式,你需要删除已有的链接,创建一个新链接指向正确目标。如果你的 [PWD][5] 不是 `/etc/systemd/system`,切换过去:
|
||||||
|
|
||||||
|
```
|
||||||
|
[root@testvm1 system]# rm -f default.target
|
||||||
|
[root@testvm1 system]# ln -s /lib/systemd/system/multi-user.target default.target
|
||||||
|
```
|
||||||
|
|
||||||
|
列出 `default.target` 链接,确认其指向了正确的文件:
|
||||||
|
|
||||||
|
```
|
||||||
|
[root@testvm1 system]# ll default.target
|
||||||
|
lrwxrwxrwx 1 root root 37 Nov 28 16:08 default.target -> /lib/systemd/system/multi-user.target
|
||||||
|
[root@testvm1 system]#
|
||||||
|
```
|
||||||
|
|
||||||
|
如果你的链接看起来不一样,删除并重试。列出 `default.target` 链接的内容:
|
||||||
|
|
||||||
|
```
|
||||||
|
[root@testvm1 system]# cat default.target
|
||||||
|
# SPDX-License-Identifier: LGPL-2.1+
|
||||||
|
#
|
||||||
|
# This file is part of systemd.
|
||||||
|
#
|
||||||
|
# systemd is free software; you can redistribute it and/or modify it
|
||||||
|
# under the terms of the GNU Lesser General Public License as published by
|
||||||
|
# the Free Software Foundation; either version 2.1 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
|
||||||
|
[Unit]
|
||||||
|
Description=Multi-User System
|
||||||
|
Documentation=man:systemd.special(7)
|
||||||
|
Requires=basic.target
|
||||||
|
Conflicts=rescue.service rescue.target
|
||||||
|
After=basic.target rescue.service rescue.target
|
||||||
|
AllowIsolate=yes
|
||||||
|
[root@testvm1 system]#
|
||||||
|
```
|
||||||
|
|
||||||
|
`default.target`(这里其实是指向 `multi-user.target` 的链接)其中的 `[Unit]` 部分现在有不同的必需条件。这个目标不需要有图形显示管理器。
|
||||||
|
|
||||||
|
重启,你的虚拟机应该启动到虚拟控制台 1 的控制台登录,虚拟控制台 1 在显示器标识为 `tty1`。现在你已经知道如何修改默认的目标,使用所需的命令将默认目标改回 `graphical.target`。
|
||||||
|
|
||||||
|
首先检查当前的默认目标:
|
||||||
|
|
||||||
|
```
|
||||||
|
[root@testvm1 ~]# systemctl get-default
|
||||||
|
multi-user.target
|
||||||
|
[root@testvm1 ~]# systemctl set-default graphical.target
|
||||||
|
Removed /etc/systemd/system/default.target.
|
||||||
|
Created symlink /etc/systemd/system/default.target → /usr/lib/systemd/system/graphical.target.
|
||||||
|
[root@testvm1 ~]#
|
||||||
|
```
|
||||||
|
|
||||||
|
输入下面的命令直接切换到 `graphical.target` 和显示管理器的登录界面,不需要重启:
|
||||||
|
|
||||||
|
```
|
||||||
|
[root@testvm1 system]# systemctl isolate default.target
|
||||||
|
```
|
||||||
|
|
||||||
|
我不清楚为何 systemd 的开发者选择了术语 `isolate` 作为这个子命令。我的研究表明指的可能是运行指明的目标,但是“隔离”并终结其他所有启动该目标不需要的目标。然而,命令执行的效果是从一个运行的目标切换到另一个——在这个例子中,从多用户目标切换到图形目标。上面的命令等同于 SystemV 启动脚本和 `init` 程序中古老的 `init 5` 命令。
|
||||||
|
|
||||||
|
登录 GUI 桌面,确认能正常工作。
|
||||||
|
|
||||||
|
### 总结
|
||||||
|
|
||||||
|
本文探索了 Linux systemd 启动序列,开始探讨两个重要的 systemd 工具 `systemdctl` 和 `journalctl`,还说明了如何从一个目标切换到另一个目标,以及如何修改默认目标。
|
||||||
|
|
||||||
|
本系列的下一篇文章中将会创建一个新的 systemd 单元,并配置为启动阶段运行。下一篇文章还会查看一些配置选项,可以帮助确定某个特定的单元在序列中启动的位置,比如在网络启动运行后。
|
||||||
|
|
||||||
|
### 资源
|
||||||
|
|
||||||
|
关于 systemd 网络上有大量的信息,但大部分都简短生硬、愚钝、甚至令人误解。除了本文提到的资源,下面的网页提供了关于 systemd 启动更详细可靠的信息。
|
||||||
|
|
||||||
|
* Fedora 项目有一个优质实用的 [systemd 指南][6],几乎有你使用 systemd 配置、管理、维护一个 Fedora 计算机需要知道的一切。
|
||||||
|
* Fedora 项目还有一个好用的 [速查表][7],交叉引用了古老的 SystemV 命令和对应的 systemd 命令。
|
||||||
|
* 要获取 systemd 的详细技术信息和创立的原因,查看 [Freedesktop.org][8] 的 [systemd 描述][9]。
|
||||||
|
* Linux.com 上“systemd 的更多乐趣”提供了更高级的 systemd [信息和提示][11]。
|
||||||
|
|
||||||
|
还有一系列针对系统管理员的深层技术文章,由 systemd 的设计者和主要开发者 Lennart Poettering 所作。这些文章写于 2010 年 4 月到 2011 年 9 月之间,但在当下仍然像当时一样有价值。关于 systemd 及其生态的许多其他优秀的作品都是基于这些文章的。
|
||||||
|
|
||||||
|
* [Rethinking PID 1][12]
|
||||||
|
* [systemd for Administrators, Part I][13]
|
||||||
|
* [systemd for Administrators, Part II][14]
|
||||||
|
* [systemd for Administrators, Part III][15]
|
||||||
|
* [systemd for Administrators, Part IV][16]
|
||||||
|
* [systemd for Administrators, Part V][17]
|
||||||
|
* [systemd for Administrators, Part VI][18]
|
||||||
|
* [systemd for Administrators, Part VII][19]
|
||||||
|
* [systemd for Administrators, Part VIII][20]
|
||||||
|
* [systemd for Administrators, Part IX][21]
|
||||||
|
* [systemd for Administrators, Part X][22]
|
||||||
|
* [systemd for Administrators, Part XI][23]
|
||||||
|
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
via: https://opensource.com/article/20/5/systemd-startup
|
||||||
|
|
||||||
|
作者:[David Both][a]
|
||||||
|
选题:[lujun9972][b]
|
||||||
|
译者:[YungeG](https://github.com/YungeG)
|
||||||
|
校对:[wxy](https://github.com/wxy)
|
||||||
|
|
||||||
|
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||||
|
|
||||||
|
[a]: https://opensource.com/users/dboth
|
||||||
|
[b]: https://github.com/lujun9972
|
||||||
|
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/start_line.jpg?itok=9reaaW6m (People at the start line of a race)
|
||||||
|
[2]: https://opensource.com/article/20/4/systemd
|
||||||
|
[3]: http://www.gnu.org/software/grub/manual/grub
|
||||||
|
[4]: mailto:mockbuild@bkernel03.phx2.fedoraproject.org
|
||||||
|
[5]: https://en.wikipedia.org/wiki/Pwd
|
||||||
|
[6]: https://docs.fedoraproject.org/en-US/quick-docs/understanding-and-administering-systemd/index.html
|
||||||
|
[7]: https://fedoraproject.org/wiki/SysVinit_to_Systemd_Cheatsheet
|
||||||
|
[8]: http://Freedesktop.org
|
||||||
|
[9]: http://www.freedesktop.org/wiki/Software/systemd
|
||||||
|
[10]: http://Linux.com
|
||||||
|
[11]: https://www.linux.com/training-tutorials/more-systemd-fun-blame-game-and-stopping-services-prejudice/
|
||||||
|
[12]: http://0pointer.de/blog/projects/systemd.html
|
||||||
|
[13]: http://0pointer.de/blog/projects/systemd-for-admins-1.html
|
||||||
|
[14]: http://0pointer.de/blog/projects/systemd-for-admins-2.html
|
||||||
|
[15]: http://0pointer.de/blog/projects/systemd-for-admins-3.html
|
||||||
|
[16]: http://0pointer.de/blog/projects/systemd-for-admins-4.html
|
||||||
|
[17]: http://0pointer.de/blog/projects/three-levels-of-off.html
|
||||||
|
[18]: http://0pointer.de/blog/projects/changing-roots
|
||||||
|
[19]: http://0pointer.de/blog/projects/blame-game.html
|
||||||
|
[20]: http://0pointer.de/blog/projects/the-new-configuration-files.html
|
||||||
|
[21]: http://0pointer.de/blog/projects/on-etc-sysinit.html
|
||||||
|
[22]: http://0pointer.de/blog/projects/instances.html
|
||||||
|
[23]: http://0pointer.de/blog/projects/inetd.html
|
@ -0,0 +1,173 @@
|
|||||||
|
[#]: collector: (lujun9972)
|
||||||
|
[#]: translator: (unigeorge)
|
||||||
|
[#]: reviewer: (wxy)
|
||||||
|
[#]: publisher: (wxy)
|
||||||
|
[#]: url: (https://linux.cn/article-13726-1.html)
|
||||||
|
[#]: subject: (A beginner’s guide to SSH for remote connection on Linux)
|
||||||
|
[#]: via: (https://opensource.com/article/20/9/ssh)
|
||||||
|
[#]: author: (Seth Kenlon https://opensource.com/users/seth)
|
||||||
|
|
||||||
|
Linux 远程连接之 SSH 新手指南
|
||||||
|
======
|
||||||
|
|
||||||
|
> 学会使用安全外壳协议连接远程计算机。
|
||||||
|
|
||||||
|
![](https://img.linux.net.cn/data/attachment/album/202108/28/105409ztj7akfjpcluwjp3.jpg)
|
||||||
|
|
||||||
|
使用 Linux,你只需要在键盘上输入命令,就可以巧妙地使用计算机(甚至这台计算机可以在世界上任何地方),这正是 Linux 最吸引人的特性之一。有了 OpenSSH,[POSIX][2] 用户就可以在有权限连接的计算机上打开安全外壳协议,然后远程使用。这对于许多 Linux 用户来说可能不过是日常任务,但从没操作过的人可能就会感到很困惑。本文介绍了如何配置两台计算机的 <ruby>安全外壳协议<rt>secure shell</rt></ruby>(简称 SSH)连接,以及如何在没有密码的情况下安全地从一台计算机连接到另一台计算机。
|
||||||
|
|
||||||
|
### 相关术语
|
||||||
|
|
||||||
|
在讨论多台计算机时,如何将不同计算机彼此区分开可能会让人头疼。IT 社区拥有完善的术语来描述计算机联网的过程。
|
||||||
|
|
||||||
|
* <ruby>服务<rt>service</rt></ruby>:
|
||||||
|
服务是指在后台运行的软件,因此它不会局限于仅供安装它的计算机使用。例如,Web 服务器通常托管着 Web 共享 _服务_。该术语暗含(但非绝对)它是没有图形界面的软件。
|
||||||
|
* <ruby>主机<rt>host</rt></ruby>:
|
||||||
|
主机可以是任何计算机。在 IT 中,任何计算机都可以称为 _主机_,因为从技术上讲,任何计算机都可以<ruby>托管<rt>host</rt></ruby>对其他计算机有用的应用程序。你可能不会把自己的笔记本电脑视为 **主机**,但其实上面可能正运行着一些对你、你的手机或其他计算机有用的服务。
|
||||||
|
* <ruby>本地<rt>local</rt></ruby>:
|
||||||
|
本地计算机是指用户或某些特定软件正在使用的计算机。例如,每台计算机都会把自己称为 `localhost`。
|
||||||
|
* <ruby>远程<rt>remote</rt></ruby>:
|
||||||
|
远程计算机是指你既没在其面前,也没有在实际使用的计算机,是真正意义上在 _远程_ 位置的计算机。
|
||||||
|
|
||||||
|
现在术语已经明确好,我们可以开始了。
|
||||||
|
|
||||||
|
### 在每台主机上激活 SSH
|
||||||
|
|
||||||
|
要通过 SSH 连接两台计算机,每个主机都必须安装 SSH。SSH 有两个组成部分:本地计算机上使用的用于启动连接的命令,以及用于接收连接请求的 _服务器_。有些计算机可能已经安装好了 SSH 的一个或两个部分。验证 SSH 是否完全安装的命令因系统而异,因此最简单的验证方法是查阅相关配置文件:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ file /etc/ssh/ssh_config
|
||||||
|
/etc/ssh/ssh_config: ASCII text
|
||||||
|
```
|
||||||
|
|
||||||
|
如果返回 `No such file or directory` 错误,说明没有安装 SSH 命令。
|
||||||
|
|
||||||
|
SSH 服务的检测与此类似(注意文件名中的 `d`):
|
||||||
|
|
||||||
|
```
|
||||||
|
$ file /etc/ssh/sshd_config
|
||||||
|
/etc/ssh/sshd_config: ASCII text
|
||||||
|
```
|
||||||
|
|
||||||
|
根据缺失情况选择安装两个组件:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ sudo dnf install openssh-clients openssh-server
|
||||||
|
```
|
||||||
|
|
||||||
|
在远程计算机上,使用 systemd 命令启用 SSH 服务:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ sudo systemctl enable --now sshd
|
||||||
|
```
|
||||||
|
|
||||||
|
你也可以在 GNOME 上的 **系统设置** 或 macOS 上的 **系统首选项** 中启用 SSH 服务。在 GNOME 桌面上,该设置位于 **共享** 面板中:
|
||||||
|
|
||||||
|
![在 GNOME 系统设置中激活 SSH][3]
|
||||||
|
|
||||||
|
### 开启安全外壳协议
|
||||||
|
|
||||||
|
现在你已经在远程计算机上安装并启用了 SSH,可以尝试使用密码登录作为测试。要访问远程计算机,你需要有用户帐户和密码。
|
||||||
|
|
||||||
|
远程用户不必与本地用户相同。只要拥有相应用户的密码,你就可以在远程机器上以任何用户的身份登录。例如,我在我的工作计算机上的用户是 `sethkenlon` ,但在我的个人计算机上是 `seth`。如果我正在使用我的个人计算机(即作为当前的本地计算机),并且想通过 SSH 连接到我的工作计算机,我可以通过将自己标识为 `sethkenlon` 并使用我的工作密码来实现连接。
|
||||||
|
|
||||||
|
要通过 SSH 连接到远程计算机,你必须知道其 IP 地址或可解析的主机名。在远程计算机上使用 `ip` 命令可以查看该机器的 IP 地址:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ ip addr show | grep "inet "
|
||||||
|
inet 127.0.0.1/8 scope host lo
|
||||||
|
inet 10.1.1.5/27 brd 10.1.1.31 [...]
|
||||||
|
```
|
||||||
|
|
||||||
|
如果远程计算机没有 `ip` 命令,可以尝试使用 `ifconfig` 命令(甚至可以试试 Windows 上通用的 `ipconfig` 命令)。
|
||||||
|
|
||||||
|
`127.0.0.1` 是一个特殊的地址,它实际上是 `localhost` 的地址。这是一个<ruby>环回<rt>loopback</rt></ruby>地址,系统使用它来找到自己。这在登录远程计算机时并没有什么用,因此在此示例中,远程计算机的正确 IP 地址为 `10.1.1.5`。在现实生活中,我的本地网络正在使用 `10.1.1.0` 子网,进而可得知前述正确的 IP 地址。如果远程计算机在不同的网络上,那么 IP 地址几乎可能是任何地址(但绝不会是 `127.0.0.1`),并且可能需要一些特殊的路由才能通过各种防火墙到达远程。如果你的远程计算机在同一个网络上,但想要访问比自己的网络更远的计算机,请阅读我之前写的关于 [在防火墙中打开端口][5] 的文章。
|
||||||
|
|
||||||
|
如果你能通过 IP 地址 _或_ 主机名 `ping` 到远程机器,并且拥有登录帐户,那么就可以通过 SSH 接入远程机器:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ ping -c1 10.1.1.5
|
||||||
|
PING 10.1.1.5 (10.1.1.5) 56(84) bytes of data.
|
||||||
|
64 bytes from 10.1.1.5: icmp_seq=1 ttl=64 time=4.66 ms
|
||||||
|
$ ping -c1 akiton.local
|
||||||
|
PING 10.1.1.5 (10.1.1.5) 56(84) bytes of data.
|
||||||
|
```
|
||||||
|
|
||||||
|
至此就成功了一小步。再试试使用 SSH 登录:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ whoami
|
||||||
|
seth
|
||||||
|
$ ssh sethkenlon@10.1.1.5
|
||||||
|
bash$ whoami
|
||||||
|
sethkenlon
|
||||||
|
```
|
||||||
|
|
||||||
|
测试登录有效,下一节会介绍如何激活无密码登录。
|
||||||
|
|
||||||
|
### 创建 SSH 密钥
|
||||||
|
|
||||||
|
要在没有密码的情况下安全地登录到另一台计算机,登录者必须拥有 SSH 密钥。可能你的机器上已经有一个 SSH 密钥,但再多创建一个新密钥也没有什么坏处。SSH 密钥的生命周期是在本地计算机上开始的,它由两部分组成:一个是永远不会与任何人或任何东西共享的私钥,一个是可以复制到任何你想要无密码访问的远程机器上的公钥。
|
||||||
|
|
||||||
|
有的人可能会创建一个 SSH 密钥,并将其用于从远程登录到 GitLab 身份验证的所有操作,但我会选择对不同的任务组使用不同的密钥。例如,我在家里使用一个密钥对本地机器进行身份验证,使用另一个密钥对我维护的 Web 服务器进行身份验证,再一个单独的密钥用于 Git 主机,以及又一个用于我托管的 Git 存储库,等等。在此示例中,我将只创建一个唯一密钥,以在局域网内的计算机上使用。
|
||||||
|
|
||||||
|
使用 `ssh-keygen` 命令创建新的 SSH 密钥:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ ssh-keygen -t ed25519 -f ~/.ssh/lan
|
||||||
|
```
|
||||||
|
|
||||||
|
`-t` 选项代表 _类型_ ,上述代码设置了一个高于默认值的密钥加密级别。`-f` 选项代表 _文件_,指定了密钥的文件名和位置。运行此命令后会生成一个名为 `lan` 的 SSH 私钥和一个名为 `lan.pub` 的 SSH 公钥。
|
||||||
|
|
||||||
|
使用 `ssh-copy-id` 命令把公钥发送到远程机器上,在此之前要先确保具有远程计算机的 SSH 访问权限。如果你无法使用密码登录远程主机,也就无法设置无密码登录:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ ssh-copy-id -i ~/.ssh/lan.pub sethkenlon@10.1.1.5
|
||||||
|
```
|
||||||
|
|
||||||
|
过程中系统会提示你输入远程主机上的登录密码。
|
||||||
|
|
||||||
|
操作成功后,使用 `-i` 选项将 SSH 命令指向对应的密钥(在本例中为 `lan`)再次尝试登录:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ ssh -i ~/.ssh/lan sethkenlon@10.1.1.5
|
||||||
|
bash$ whoami
|
||||||
|
sethkenlon
|
||||||
|
```
|
||||||
|
|
||||||
|
对局域网上的所有计算机重复此过程,你就将能够无密码访问这个局域网上的每台主机。实际上,一旦你设置了无密码认证,你就可以编辑 `/etc/ssh/sshd_config` 文件来禁止密码认证。这有助于防止其他人使用 SSH 对计算机进行身份验证,除非他们拥有你的私钥。要想达到这个效果,可以在有 `sudo` 权限的文本编辑器中打开 `/etc/ssh/sshd_config` 并搜索字符串 `PasswordAuthentication`,将默认行更改为:
|
||||||
|
|
||||||
|
```
|
||||||
|
PasswordAuthentication no
|
||||||
|
```
|
||||||
|
|
||||||
|
保存并重启 SSH 服务器:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ sudo systemctl restart sshd && echo "OK"
|
||||||
|
OK
|
||||||
|
$
|
||||||
|
```
|
||||||
|
|
||||||
|
### 日常使用 SSH
|
||||||
|
|
||||||
|
OpenSSH 改变了人们对操作计算机的看法,使用户不再被束缚在面前的计算机上。使用 SSH,你可以访问家中的任何计算机,或者拥有帐户的服务器,甚至是移动和物联网设备。充分利用 SSH 也意味着解锁 Linux 终端的更多用途。如果你还没有使用过 SSH,请试一下它吧。试着适应 SSH,创建一些适当的密钥,以此更安全地使用计算机,打破必须与计算机面对面的局限性。
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
via: https://opensource.com/article/20/9/ssh
|
||||||
|
|
||||||
|
作者:[Seth Kenlon][a]
|
||||||
|
选题:[lujun9972][b]
|
||||||
|
译者:[unigeorge](https://github.com/unigeorge)
|
||||||
|
校对:[wxy](https://github.com/wxy)
|
||||||
|
|
||||||
|
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||||
|
|
||||||
|
[a]: https://opensource.com/users/seth
|
||||||
|
[b]: https://github.com/lujun9972
|
||||||
|
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/lenovo-thinkpad-laptop-window-focus.png?itok=g0xPm2kD (young woman working on a laptop)
|
||||||
|
[2]: https://opensource.com/article/19/7/what-posix-richard-stallman-explains
|
||||||
|
[3]: https://opensource.com/sites/default/files/uploads/gnome-activate-remote-login.png (Activate SSH in GNOME System Settings)
|
||||||
|
[4]: https://creativecommons.org/licenses/by-sa/4.0/
|
||||||
|
[5]: https://opensource.com/article/20/8/open-ports-your-firewall
|
@ -0,0 +1,116 @@
|
|||||||
|
[#]: subject: (How to Know if Your System Uses MBR or GPT Partitioning [on Windows and Linux])
|
||||||
|
[#]: via: (https://itsfoss.com/check-mbr-or-gpt/)
|
||||||
|
[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/)
|
||||||
|
[#]: collector: (lujun9972)
|
||||||
|
[#]: translator: (alim0x)
|
||||||
|
[#]: reviewer: (wxy)
|
||||||
|
[#]: publisher: (wxy)
|
||||||
|
[#]: url: (https://linux.cn/article-13727-1.html)
|
||||||
|
|
||||||
|
如何在 Windows 和 Linux 上确定系统使用的是 MBR 还是 GPT 分区
|
||||||
|
======
|
||||||
|
|
||||||
|
![](https://img.linux.net.cn/data/attachment/album/202108/28/165508gqjyigp3yz3gy6yy.jpg)
|
||||||
|
|
||||||
|
在你安装 Linux 或任何其他系统的时候,了解你的磁盘的正确分区方案是非常关键的。
|
||||||
|
|
||||||
|
目前有两种流行的分区方案,老一点的 MBR 和新一些的 GPT。现在大多数的电脑使用 GPT。
|
||||||
|
|
||||||
|
在制作临场镜像或可启动 USB 设备时,一些工具(比如 [Rufus][1])会问你在用的磁盘分区情况。如果你在 MBR 分区的磁盘上选择 GPT 方案的话,制作出来的可启动 USB 设备可能会不起作用。
|
||||||
|
|
||||||
|
在这个教程里,我会展示若干方法,来在 Windows 和 Linux 系统上检查磁盘分区方案。
|
||||||
|
|
||||||
|
### 在 Windows 上检查系统使用的是 MBR 还是 GPT
|
||||||
|
|
||||||
|
尽管在 Windows 上包括命令行在内有不少方法可以检查磁盘分区方案,这里我还是使用图形界面的方式查看。
|
||||||
|
|
||||||
|
按下 Windows 按键然后搜索“disk”,然后点击“**创建并格式化硬盘分区**”。
|
||||||
|
|
||||||
|
![][2]
|
||||||
|
|
||||||
|
在这里,**右键点击**你想要检查分区方案的磁盘。在右键菜单里**选择属性**。
|
||||||
|
|
||||||
|
![右键点击磁盘并选择属性][3]
|
||||||
|
|
||||||
|
在属性窗口,切换到**卷**标签页,寻找**磁盘分区形式**属性。
|
||||||
|
|
||||||
|
![在卷标签页寻找磁盘分区形式属性][4]
|
||||||
|
|
||||||
|
正如你在上面截图所看到的,磁盘正在使用 GPT 分区方案。对于一些其他系统,它可能显示的是 MBR 或 MSDOS 分区方案。
|
||||||
|
|
||||||
|
现在你知道如何在 Windows 下检查磁盘分区方案了。在下一部分,你会学到如何在 Linux 下进行检查。
|
||||||
|
|
||||||
|
### 在 Linux 上检查系统使用的是 MBR 还是 GPT
|
||||||
|
|
||||||
|
在 Linux 上也有不少方法可以检查磁盘分区方案使用的是 MBR 还是 GPT。既有命令行方法也有图形界面工具。
|
||||||
|
|
||||||
|
让我先给你演示一下命令行方法,然后再看看一些图形界面的方法。
|
||||||
|
|
||||||
|
#### 在 Linux 使用命令行检查磁盘分区方案
|
||||||
|
|
||||||
|
命令行的方法应该在所有 Linux 发行版上都有效。
|
||||||
|
|
||||||
|
打开终端并使用 `sudo` 运行下列命令:
|
||||||
|
|
||||||
|
```
|
||||||
|
sudo parted -l
|
||||||
|
```
|
||||||
|
|
||||||
|
上述命令实际上是一个基于命令行的 [Linux 分区管理器][5]。命令参数 `-l` 会列出系统中的所有磁盘以及它们的详情,里面包含了分区方案信息。
|
||||||
|
|
||||||
|
在命令输出中,寻找以 **Partition Table**(分区表)开头的行:
|
||||||
|
|
||||||
|
![][6]
|
||||||
|
|
||||||
|
在上面的截图中,磁盘使用的是 GPT 分区方案。如果是 **MBR**,它会显示为 **msdos**。
|
||||||
|
|
||||||
|
你已经学会了命令行的方式。但如果你不习惯使用终端,你还可以使用图形界面工具。
|
||||||
|
|
||||||
|
#### 使用 GNOME Disks 工具检查磁盘信息
|
||||||
|
|
||||||
|
Ubuntu 和一些其它基于 GNOME 的发行版内置了叫做 Disks 的图形工具,你可以用它管理系统中的磁盘。
|
||||||
|
|
||||||
|
你也可以使用它来获取磁盘的分区类型。
|
||||||
|
|
||||||
|
![][7]
|
||||||
|
|
||||||
|
#### 使用 Gparted 图形工具检查磁盘信息
|
||||||
|
|
||||||
|
如果你没办法使用 GNOME Disks 工具,别担心,还有其它工具可以使用。
|
||||||
|
|
||||||
|
其中一款流行的工具是 Gparted。你应该可以在大多数 Linux 发行版的软件源中找到它。如果系统中没有安装的话,使用你的发行版的软件中心或 [包管理器][9] 来 [安装 Gparted][8]。
|
||||||
|
|
||||||
|
在 Gparted 中,通过菜单选择 **View->Device Information**(查看—>设备信息)。它会在左下区域显示磁盘信息,这些信息中包含分区方案信息。
|
||||||
|
|
||||||
|
![][10]
|
||||||
|
|
||||||
|
看吧,也不是太复杂,对吗?现在你了解了好几种途径来确认你的系统使用的是 GPT 还是 MBR 分区方案。
|
||||||
|
|
||||||
|
同时我还要提一下,有时候磁盘还会有 [混合分区方案][11]。这不是很常见,大多数时候分区不是 MBR 就是 GPT。
|
||||||
|
|
||||||
|
有任何问题或建议,请在下方留下评论。
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
via: https://itsfoss.com/check-mbr-or-gpt/
|
||||||
|
|
||||||
|
作者:[Abhishek Prakash][a]
|
||||||
|
选题:[lujun9972][b]
|
||||||
|
译者:[alim0x](https://github.com/alim0x)
|
||||||
|
校对:[wxy](https://github.com/wxy)
|
||||||
|
|
||||||
|
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||||
|
|
||||||
|
[a]: https://itsfoss.com/author/abhishek/
|
||||||
|
[b]: https://github.com/lujun9972
|
||||||
|
[1]: https://rufus.ie/en_US/
|
||||||
|
[2]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/03/disc-management-windows.png?resize=800%2C561&ssl=1
|
||||||
|
[3]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/07/gpt-check-windows-1.png?resize=800%2C603&ssl=1
|
||||||
|
[4]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/07/gpt-check-windows-2-1.png?resize=800%2C600&ssl=1
|
||||||
|
[5]: https://itsfoss.com/partition-managers-linux/
|
||||||
|
[6]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/07/check-if-mbr-or-gpt-in-Linux.png?resize=800%2C446&ssl=1
|
||||||
|
[7]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/07/check-if-mbr-or-gpt-in-Linux-gui.png?resize=800%2C548&ssl=1
|
||||||
|
[8]: https://itsfoss.com/gparted/
|
||||||
|
[9]: https://itsfoss.com/package-manager/
|
||||||
|
[10]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/07/check-disk-partitioning-scheme-linux-gparted.jpg?resize=800%2C555&ssl=1
|
||||||
|
[11]: https://www.rodsbooks.com/gdisk/hybrid.html
|
@ -0,0 +1,121 @@
|
|||||||
|
[#]: subject: (Use VS Code to develop in containers)
|
||||||
|
[#]: via: (https://opensource.com/article/21/7/vs-code-remote-containers-podman)
|
||||||
|
[#]: author: (Brant Evans https://opensource.com/users/branic)
|
||||||
|
[#]: collector: (lujun9972)
|
||||||
|
[#]: translator: (wxy)
|
||||||
|
[#]: reviewer: (wxy)
|
||||||
|
[#]: publisher: (wxy)
|
||||||
|
[#]: url: (https://linux.cn/article-13708-1.html)
|
||||||
|
|
||||||
|
使用 VS Code 在容器中开发
|
||||||
|
======
|
||||||
|
|
||||||
|
> 一致性可以避免当你有多个开发人员开发同一个项目时出现问题。
|
||||||
|
|
||||||
|
![](https://img.linux.net.cn/data/attachment/album/202108/22/090306jlkzyrw8cytcatw8.jpg)
|
||||||
|
|
||||||
|
当你有多个不同开发环境的开发人员在一个项目上工作时,编码和测试的不一致性是一种风险。[Visual Studio Code][2](VS Code)是一个集成开发环境(IDE),可以帮助减少这些问题。它可以和容器结合起来,为每个应用程序提供独立的开发环境,同时提供一个一致的开发环境。
|
||||||
|
|
||||||
|
VS Code 的 [“Remote - Containers” 扩展][3] 使你能够创建一个容器定义,使用该定义来构建一个容器,并在容器内进行开发。这个容器定义可以和应用程序代码一起被签入到源代码库中,这使得所有的开发人员可以使用相同的定义在容器中进行构建和开发。
|
||||||
|
|
||||||
|
默认情况下,“Remote - Containers” 扩展使用 Docker 来构建和运行容器,但使用 [Podman][4] 的容器运行环境环境也很容易,它可以让你使用 [免 root 容器][5]。
|
||||||
|
|
||||||
|
本文将带领你完成设置,通过 Podman 在免 root 容器内使用 VS Code 和 “Remote - Containers” 扩展进行开发。
|
||||||
|
|
||||||
|
### 初始配置
|
||||||
|
|
||||||
|
在继续之前,请确保你的红帽企业 Linux(RHEL)或 Fedora 工作站已经更新了最新的补丁,并且安装了 VS Code 和 “Remote - Containers” 扩展。(参见 [VS Code 网站][2]了解更多安装信息)
|
||||||
|
|
||||||
|
接下来,用一个简单的 `dnf install` 命令来安装 Podman 和它的支持包:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ sudo dnf install -y podman
|
||||||
|
```
|
||||||
|
|
||||||
|
安装完 Podman 后,配置 VS Code 以使用 Podman 的可执行文件(而不是 Docker)与容器进行交互。在 VS Code 中,导航到 “文件 > 首选项 > 设置”,点击 “扩展” 旁边的 “>” 图标。在出现的下拉菜单中,选择 “Remote - Containers”,并向下滚动找到 “Remote - Containers: Docker Path” 选项。在文本框中,用 “podman” 替换 “docker”。
|
||||||
|
|
||||||
|
![在文本框中输入 “podman”][6]
|
||||||
|
|
||||||
|
现在配置已经完成,在 VS Code 中为该项目创建一个新的文件夹或打开现有的文件夹。
|
||||||
|
|
||||||
|
### 定义容器
|
||||||
|
|
||||||
|
本教程以创建 Python 3 开发的容器为例。
|
||||||
|
|
||||||
|
“Remote - Containers” 扩展可以在项目文件夹中添加必要的基本配置文件。要添加这些文件,通过在键盘上输入 `Ctrl+Shift+P` 打开命令面板,搜索 “Remote-Containers: Add Development Container Configuration Files”,并选择它。
|
||||||
|
|
||||||
|
![Remote-Containers: Add Development Container Configuration Files][8]
|
||||||
|
|
||||||
|
在接下来的弹出窗口中,定义你想设置的开发环境的类型。对于这个例子的配置,搜索 “Python 3” 定义并选择它。
|
||||||
|
|
||||||
|
![选择 Python 3 定义][9]
|
||||||
|
|
||||||
|
接下来,选择将在容器中使用的 Python 的版本。选择 “3 (default)” 选项以使用最新的版本。
|
||||||
|
|
||||||
|
![选择 “3 (default)” 选项][10]
|
||||||
|
|
||||||
|
Python 配置也可以安装 Node.js,但在这个例子中,取消勾选 “Install Node.js”,然后点击 “OK”。
|
||||||
|
|
||||||
|
![取消勾选 “Install Node.js"][11]
|
||||||
|
|
||||||
|
它将创建一个 `.devcontainer` 文件夹,包含文件`devcontainer.json`和`Dockerfile`。VS Code 会自动打开`devcontainer.json` 文件,这样你就可以对它进行自定义。
|
||||||
|
|
||||||
|
### 启用免 root 容器
|
||||||
|
|
||||||
|
除了明显的安全优势外,以免 root 方式运行容器的另一个原因是,在项目文件夹中创建的所有文件将由容器外的正确用户 ID(UID)拥有。要将开发容器作为免 root 容器运行,请修改 `devcontainer.json` 文件,在它的末尾添加以下几行:
|
||||||
|
|
||||||
|
```
|
||||||
|
"workspaceMount": "source=${localWorkspaceFolder},target=/workspace,type=bind,Z",
|
||||||
|
"workspaceFolder": "/workspace",
|
||||||
|
|
||||||
|
"runArgs": ["--userns=keep-id"],
|
||||||
|
"containerUser": "vscode"
|
||||||
|
```
|
||||||
|
|
||||||
|
这些选项告诉 VS Code 用适当的 SELinux 上下文挂载工作区,创建一个用户命名空间,将你的 UID 和 GID 原样映射到容器内,并在容器内使用 `vscode` 作为你的用户名。`devcontainer.json` 文件应该是这样的(别忘了行末的逗号,如图所示):
|
||||||
|
|
||||||
|
![更新后的 devcontainer.json 文件][12]
|
||||||
|
|
||||||
|
现在你已经设置好了容器的配置,你可以构建容器并打开里面的工作空间。重新打开命令调板(用 `Ctrl+Shift+P`),并搜索 “Remote-Containers: Rebuild and Reopen in Container”。点击它,VS Code 将开始构建容器。现在是休息一下的好时机(拿上你最喜欢的饮料),因为构建容器可能需要几分钟时间:
|
||||||
|
|
||||||
|
![构建容器][13]
|
||||||
|
|
||||||
|
一旦容器构建完成,项目将在容器内打开。在容器内创建或编辑的文件将反映在容器外的文件系统中,并对这些文件应用适当的用户权限。现在,你可以在容器内进行开发了。VS Code 甚至可以把你的 SSH 密钥和 Git 配置带入容器中,这样提交代码就会像在容器外编辑时那样工作。
|
||||||
|
|
||||||
|
### 接下来的步骤
|
||||||
|
|
||||||
|
现在你已经完成了基本的设置和配置,你可以进一步加强配置的实用性。比如说:
|
||||||
|
|
||||||
|
* 修改 Dockerfile 以安装额外的软件(例如,所需的 Python 模块)。
|
||||||
|
* 使用一个定制的容器镜像。例如,如果你正在进行 Ansible 开发,你可以使用 Quay.io 的 [Ansible Toolset][14]。(确保通过 Dockerfile 将 `vscode` 用户添加到容器镜像中)
|
||||||
|
* 将 `.devcontainer` 目录下的文件提交到源代码库,以便其他开发者可以利用容器的定义进行开发工作。
|
||||||
|
|
||||||
|
在容器内开发有助于防止不同项目之间的冲突,因为隔离了不同项目的依赖关系及代码。你可以使用 Podman 在免 root 环境下运行容器,从而提高安全性。通过结合 VS Code、“Remote - Containers” 扩展和 Podman,你可以轻松地为多个开发人员建立一个一致的环境,减少设置时间,并以安全的方式减少开发环境的差异带来的错误。
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
via: https://opensource.com/article/21/7/vs-code-remote-containers-podman
|
||||||
|
|
||||||
|
作者:[Brant Evans][a]
|
||||||
|
选题:[lujun9972][b]
|
||||||
|
译者:[wxy](https://github.com/wxy)
|
||||||
|
校对:[wxy](https://github.com/wxy)
|
||||||
|
|
||||||
|
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||||
|
|
||||||
|
[a]: https://opensource.com/users/branic
|
||||||
|
[b]: https://github.com/lujun9972
|
||||||
|
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/collab-team-pair-programming-code-keyboard2.png?itok=WnKfsl-G (Women programming)
|
||||||
|
[2]: https://code.visualstudio.com/
|
||||||
|
[3]: https://code.visualstudio.com/docs/remote/containers
|
||||||
|
[4]: https://podman.io/
|
||||||
|
[5]: https://www.redhat.com/sysadmin/rootless-podman-makes-sense
|
||||||
|
[6]: https://opensource.com/sites/default/files/uploads/vscode-remote_podman.png (Enter "podman" in the text box)
|
||||||
|
[7]: https://creativecommons.org/licenses/by-sa/4.0/
|
||||||
|
[8]: https://opensource.com/sites/default/files/uploads/adddevelopmentcontainerconfigurationfiles.png (Remote-Containers: Add Development Container Configuration Files)
|
||||||
|
[9]: https://opensource.com/sites/default/files/uploads/python3.png (Select Python 3 definition)
|
||||||
|
[10]: https://opensource.com/sites/default/files/uploads/python3default.png (Select the 3 \(default\) option)
|
||||||
|
[11]: https://opensource.com/sites/default/files/uploads/unchecknodejs.png (Uncheck "Install Node.js")
|
||||||
|
[12]: https://opensource.com/sites/default/files/uploads/newdevcontainerjson.png (Updated devcontainer.json file)
|
||||||
|
[13]: https://opensource.com/sites/default/files/uploads/buildingcontainer.png (Building the container)
|
||||||
|
[14]: https://quay.io/repository/ansible/toolset
|
@ -0,0 +1,235 @@
|
|||||||
|
[#]: subject: (Brave vs. Firefox: Your Ultimate Browser Choice for Private Web Experience)
|
||||||
|
[#]: via: (https://itsfoss.com/brave-vs-firefox/)
|
||||||
|
[#]: author: (Ankush Das https://itsfoss.com/author/ankush/)
|
||||||
|
[#]: collector: (lujun9972)
|
||||||
|
[#]: translator: (wxy)
|
||||||
|
[#]: reviewer: (wxy)
|
||||||
|
[#]: publisher: (wxy)
|
||||||
|
[#]: url: (https://linux.cn/article-13736-1.html)
|
||||||
|
|
||||||
|
Brave vs. Firefox:你的私人网络体验的终极浏览器选择
|
||||||
|
======
|
||||||
|
|
||||||
|
![](https://img.linux.net.cn/data/attachment/album/202108/30/223133tqzkg4pjpwwb8u4g.jpg)
|
||||||
|
|
||||||
|
Web 浏览器经过多年的发展,从下载文件到访问成熟的 Web 应用程序,已经有了长足的发展。
|
||||||
|
|
||||||
|
对于很多用户来说,Web 浏览器是他们如今完成工作的唯一需要。
|
||||||
|
|
||||||
|
因此,选择合适的浏览器就成为了一项重要的任务,它可以帮助改善你多年来的工作流程。
|
||||||
|
|
||||||
|
### Brave vs. Firefox
|
||||||
|
|
||||||
|
Brave 和 Mozilla Firefox 是两个最受到关注隐私的用户和开源爱好者欢迎的 Web 浏览器。
|
||||||
|
|
||||||
|
考虑到两者都非常注重隐私和安全,让我们看看它们到底能提供什么,以帮助你决定应该选择哪一个。
|
||||||
|
|
||||||
|
以下是我所使用的比较指标:
|
||||||
|
|
||||||
|
### 用户界面
|
||||||
|
|
||||||
|
用户界面是使用浏览器时的工作流程和体验的最大区别。
|
||||||
|
|
||||||
|
当然,你会有你的个人偏好,但它看起来越容易使用、越轻快、越干净,就越好。
|
||||||
|
|
||||||
|
![Brave 浏览器][12]
|
||||||
|
|
||||||
|
首先,Brave 与 Chrome 和微软 Edge 有着相似的外观和感受。它提供了一种简洁的体验,具有精简的 UI 元素,所有的基本选项都可以通过浏览器菜单访问。
|
||||||
|
|
||||||
|
它也提供了一个暗色主题。恰到好处的动画使得互动成为一种愉快的体验。
|
||||||
|
|
||||||
|
要定制它,你可以选择使用 Chrome Web 商店中的主题。
|
||||||
|
|
||||||
|
说到 Mozilla Firefox,多年来它经历了几次重大的重新设计,其最新的用户界面试图提供与 Chrome 更接近的体验。
|
||||||
|
|
||||||
|
![Firefox 浏览器][13]
|
||||||
|
|
||||||
|
Firefox 浏览器的设计看起来令人印象深刻,并提供了干净利落的用户体验。如果需要的话,你还可以选择一个暗色主题,此外还有其它几个主题可供下载使用。
|
||||||
|
|
||||||
|
这两个 Web 浏览器都能提供良好的用户体验。
|
||||||
|
|
||||||
|
如果你想要一个熟悉的体验,但又具有一丝独特之处,Mozilla Firefox 是一个不错的选择。
|
||||||
|
|
||||||
|
但是,如果你想获得更快捷的体验、更好的动画感受,Brave 更有优势。
|
||||||
|
|
||||||
|
### 性能
|
||||||
|
|
||||||
|
实际上,我发现 Brave 加载网页的速度更快,整体的用户体验感觉很轻快。
|
||||||
|
|
||||||
|
Firefox 浏览器倒不是非常慢,但它绝对感觉比 Brave 慢。
|
||||||
|
|
||||||
|
为了给你一些参考,我还利用 [Basemark][14] 运行了一个基准测试,看看事实上是否真的如此。
|
||||||
|
|
||||||
|
你可以使用其他的浏览器基准测试工具来测试一下,但我用 Basemark 进行了各种测试,所以我们在这篇文章中会用它。
|
||||||
|
|
||||||
|
![Firefox 基准得分][15]
|
||||||
|
|
||||||
|
![Brave 基准得分][16]
|
||||||
|
|
||||||
|
Firefox 浏览器成功获得了 **630** 的得分,而 Brave 以大约 **792** 的得分取得了更好的成绩。
|
||||||
|
|
||||||
|
请注意,这些基准测试是在没有安装任何浏览器扩展程序的情况下,以默认的浏览器设置进行的。
|
||||||
|
|
||||||
|
当然,你的分数可能会有所不同,这取决于你在后台进行的工作和你系统的硬件配置。
|
||||||
|
|
||||||
|
这是我在 **i5-7400、16GB 内存和 GTX 1050ti GPU** 配置的桌面电脑上得到的结果。
|
||||||
|
|
||||||
|
一般来说,与大多数流行的浏览器相比,Brave 浏览器是一个快速的浏览器。
|
||||||
|
|
||||||
|
这两者都占用了相当大的系统资源,而且在一定程度上随着标签数量、访问的网页类型和使用的拦截扩展的种类而变化。
|
||||||
|
|
||||||
|
例如,Brave 在默认情况下会主动阻止广告,但 Firefox 在默认情况下不会阻止显示广告。而且,这也影响了系统资源的使用。
|
||||||
|
|
||||||
|
### 浏览器引擎
|
||||||
|
|
||||||
|
Firefox 浏览器在自己的 Gecko 引擎基础上,使用来自 [servo 研究项目][17] 的组件来进行改进。
|
||||||
|
|
||||||
|
目前,它基本上是一个改进的 Gecko 引擎,其项目名称是随着 Firefox Quantum 的发布而推出的 “Quantum”。
|
||||||
|
|
||||||
|
另一方面,Brave 使用 Chromium 的引擎。
|
||||||
|
|
||||||
|
虽然两者都有足够的能力处理现代 Web 体验,但基于 Chromium 的引擎更受欢迎,Web 开发人员通常会在基于 Chrome 的浏览器上定制他们的网站以获得最佳体验。
|
||||||
|
|
||||||
|
另外,有些服务恰好只支持基于 Chrome 的浏览器。
|
||||||
|
|
||||||
|
### 广告 & 追踪器阻止功能
|
||||||
|
|
||||||
|
![][18]
|
||||||
|
|
||||||
|
正如我之前提到的,Brave 在阻止跟踪器和广告方面非常积极。默认情况下,它已经启用了屏蔽功能。
|
||||||
|
|
||||||
|
Firefox 浏览器也默认启用了增强的隐私保护功能,但并不阻止显示广告。
|
||||||
|
|
||||||
|
如果你想摆脱广告,你得选择火狐浏览器的 “严格隐私保护模式”。
|
||||||
|
|
||||||
|
也就是说,火狐浏览器执行了一些独特的跟踪保护技术,包括“全面 Cookie 保护”,可以为每个网站隔离 Cookie 并防止跨站 Cookie 跟踪。
|
||||||
|
|
||||||
|
![][19]
|
||||||
|
|
||||||
|
这是在 [Firefox 86][20] 中引入的技术,要使用它,你需要启用 “严格隐私保护模式”。
|
||||||
|
|
||||||
|
总的来说,Brave 可能看起来是一个更好的选择,而 Mozilla Firefox 提供了更好的隐私保护功能。
|
||||||
|
|
||||||
|
### 容器
|
||||||
|
|
||||||
|
当你访问 Facebook 时,Firefox 还提供了一种借助容器来隔离网站活动的方法。换句话说,它可以防止 Facebook 跟踪你的站外活动。
|
||||||
|
|
||||||
|
你还可以使用容器来组织你的标签,并在需要时分离会话。
|
||||||
|
|
||||||
|
Brave 没有提供任何类似的功能,但它本身可以阻止跨站追踪器和 cookie。
|
||||||
|
|
||||||
|
### 奖励
|
||||||
|
|
||||||
|
![][21]
|
||||||
|
|
||||||
|
与 Firefox 不同,Brave 通过屏蔽网络上的其他广告来提供自己的广告网络。
|
||||||
|
|
||||||
|
当你选择显示 Brave 的隐私友好型广告时,你会得到可以放到加密货币钱包里的通证奖励,而你可以用这些通证来回馈你喜欢的网站。
|
||||||
|
|
||||||
|
虽然这是摆脱主流广告的一个很好的商业策略,但对于不想要任何形式的广告的用户来说,这可能没有用。
|
||||||
|
|
||||||
|
因此,Brave 以奖励的形式提供了一个替代方案,即使你屏蔽了广告,也可以帮助网站发展。如果这是你欣赏的东西,Brave 将是你的一个好选择。
|
||||||
|
|
||||||
|
### 跨平台可用性
|
||||||
|
|
||||||
|
你会发现 Brave 和 Firefox 都有 Linux、Windows 和 macOS 版本,也有用于 iOS 和 Android 的移动应用程序。
|
||||||
|
|
||||||
|
对于 Linux 用户来说,Firefox 浏览器捆绑在大多数的 Linux 发行版中。而且,你也可以在软件中心里找到它。除此之外,还有一个 [Flatpak][22] 包可用。
|
||||||
|
|
||||||
|
Brave 不能通过默认的软件库和软件中心获得。因此,你需要按照官方的说明来添加私有仓库,然后 [把 Brave 安装在你的 Linux 发行版中][23]。
|
||||||
|
|
||||||
|
### 同步
|
||||||
|
|
||||||
|
通过 Mozilla Firefox,你可以创建一个 Firefox 账户来跨平台同步你的所有数据。
|
||||||
|
|
||||||
|
![][24]
|
||||||
|
|
||||||
|
Brave 也可以让你跨平台同步,但你需要能访问其中一个设备才行。
|
||||||
|
|
||||||
|
![][25]
|
||||||
|
|
||||||
|
因此,Firefox 的同步更方便。
|
||||||
|
|
||||||
|
另外,你可以通过 Firefox 的账户访问它的“虚拟专用网络”、数据泄露监控器、电子邮件中继,以及密码管理器。
|
||||||
|
|
||||||
|
### 服务集成
|
||||||
|
|
||||||
|
从一开始 Firefox 就提供了更多的服务集成,包括 Pocket、“虚拟私有网络”、密码管理器,还有一些新产品,如 Firefox 中继。
|
||||||
|
|
||||||
|
如果你想通过你的浏览器访问这些服务,Firefox 将是你的方便选择。
|
||||||
|
|
||||||
|
虽然 Brave 确实提供了加密货币钱包,但它并不适合所有人。
|
||||||
|
|
||||||
|
![][26]
|
||||||
|
|
||||||
|
同样,如果你喜欢使用 [Brave Search][27],在使用 Brave 浏览器时,由于用户体验的原因,你可能体验会更顺滑。
|
||||||
|
|
||||||
|
### 可定制性 & 安全性
|
||||||
|
|
||||||
|
Firefox 浏览器在可定制性方面大放异彩。你可以通过众多选项来调整体验,也可以控制你的浏览器的隐私/安全。
|
||||||
|
|
||||||
|
自定义的能力使你可以让 Firefox 比 Brave 浏览器更安全。
|
||||||
|
|
||||||
|
而加固 Firefox 浏览器是一个我们将讨论的单独话题。略举一例,[Tor 浏览器][28] 只是一个定制的 Firefox 浏览器。
|
||||||
|
|
||||||
|
然而,这并不意味着 Brave 的安全性更低。总的来说,它是一个安全的浏览器,但你确实可以通过 Firefox 浏览器获得更多的选择。
|
||||||
|
|
||||||
|
### 扩展支持
|
||||||
|
|
||||||
|
毫无疑问,Chrome Web 商店提供了更多的扩展。
|
||||||
|
|
||||||
|
因此,如果你是一个使用大量扩展(或不断尝试新扩展)的人,Brave 明显比 Firefox 更有优势。
|
||||||
|
|
||||||
|
可能 Firefox 的扩展清单不是最大的,但它确实支持大多数的扩展。对于常见的使用情况,你很少能找到一个 Firefox 中没有的扩展。
|
||||||
|
|
||||||
|
### 你应该选择那个?
|
||||||
|
|
||||||
|
如果你希望尽量兼容现代的 Web 体验,并希望有更多的扩展,Brave 浏览器似乎更合适。
|
||||||
|
|
||||||
|
另一方面,Firefox 浏览器是日常浏览的绝佳选择,它具有业界首创的隐私功能,并为不懂技术的用户提供了方便的同步选项。
|
||||||
|
|
||||||
|
在选择它们中的任何一个时会有一些取舍。因此,你需要优先考虑你最想要的东西。
|
||||||
|
|
||||||
|
请在下面的评论中告诉我你的最终选择!
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
via: https://itsfoss.com/brave-vs-firefox/
|
||||||
|
|
||||||
|
作者:[Ankush Das][a]
|
||||||
|
选题:[lujun9972][b]
|
||||||
|
译者:[wxy](https://github.com/wxy)
|
||||||
|
校对:[wxy](https://github.com/wxy)
|
||||||
|
|
||||||
|
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||||
|
|
||||||
|
[a]: https://itsfoss.com/author/ankush/
|
||||||
|
[b]: https://github.com/lujun9972
|
||||||
|
[1]: tmp.5yJseRG2rb#ui
|
||||||
|
[2]: tmp.5yJseRG2rb#perf
|
||||||
|
[3]: tmp.5yJseRG2rb#engine
|
||||||
|
[4]: tmp.5yJseRG2rb#ad
|
||||||
|
[5]: tmp.5yJseRG2rb#container
|
||||||
|
[6]: tmp.5yJseRG2rb#reward
|
||||||
|
[7]: tmp.5yJseRG2rb#cp
|
||||||
|
[8]: tmp.5yJseRG2rb#sync
|
||||||
|
[9]: tmp.5yJseRG2rb#service
|
||||||
|
[10]: tmp.5yJseRG2rb#customise
|
||||||
|
[11]: tmp.5yJseRG2rb#extensions
|
||||||
|
[12]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/07/brave-ui-new.jpg?resize=800%2C450&ssl=1
|
||||||
|
[13]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/07/firefox-ui.jpg?resize=800%2C450&ssl=1
|
||||||
|
[14]: https://web.basemark.com
|
||||||
|
[15]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/07/firefox-basemark.png?resize=800%2C598&ssl=1
|
||||||
|
[16]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/07/basemark-brave.png?resize=800%2C560&ssl=1
|
||||||
|
[17]: https://servo.org
|
||||||
|
[18]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/07/brave-blocker.png?resize=800%2C556&ssl=1
|
||||||
|
[19]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/07/firefox-blocker.png?resize=800%2C564&ssl=1
|
||||||
|
[20]: https://news.itsfoss.com/firefox-86-release/
|
||||||
|
[21]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/07/brave-rewards.png?resize=800%2C560&ssl=1
|
||||||
|
[22]: https://itsfoss.com/what-is-flatpak/
|
||||||
|
[23]: https://itsfoss.com/brave-web-browser/
|
||||||
|
[24]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/07/firefox-sync.png?resize=800%2C651&ssl=1
|
||||||
|
[25]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/07/brave-sync.png?resize=800%2C383&ssl=1
|
||||||
|
[26]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/07/brave-crypto-wallet.png?resize=800%2C531&ssl=1
|
||||||
|
[27]: https://itsfoss.com/brave-search-features/
|
||||||
|
[28]: https://itsfoss.com/install-tar-browser-linux/
|
@ -3,36 +3,40 @@
|
|||||||
[#]: author: (Onuralp SEZER https://fedoramagazine.org/author/thunderbirdtr/)
|
[#]: author: (Onuralp SEZER https://fedoramagazine.org/author/thunderbirdtr/)
|
||||||
[#]: collector: (lujun9972)
|
[#]: collector: (lujun9972)
|
||||||
[#]: translator: (geekpi)
|
[#]: translator: (geekpi)
|
||||||
[#]: reviewer: ( )
|
[#]: reviewer: (wxy)
|
||||||
[#]: publisher: ( )
|
[#]: publisher: (wxy)
|
||||||
[#]: url: ( )
|
[#]: url: (https://linux.cn/article-13698-1.html)
|
||||||
|
|
||||||
在 Fedora Linux 上使用 OpenCV ‒ 第一部分
|
在 Fedora Linux 上使用 OpenCV(一)
|
||||||
======
|
======
|
||||||
|
|
||||||
![][1]
|
![][1]
|
||||||
|
|
||||||
封面图片选自[文森特-凡高][2]的《星空》,公共领域,通过维基共享资源发布
|
*封面图片选自[文森特·梵高][2]的《星空》,公共领域,通过维基共享资源发布*
|
||||||
|
|
||||||
技术世界每天都在变化,对计算机视觉、人工智能和机器学习的需求也在增加。让计算机和手机能够看到周围环境的技术被称为[计算机视觉][3]。重新创造人眼的工作始于 50 年代。从那时起,计算机视觉技术有了长足的发展。计算机视觉已经通过不同的应用进入了我们的手机。这篇文章将介绍 Fedora Linux 上的[OpenCV][4]。
|
技术世界每天都在变化,对计算机视觉、人工智能和机器学习的需求也在增加。让计算机和手机能够看到周围环境的技术被称为 [计算机视觉][3]。这个重新创造人眼的工作始于 50 年代。从那时起,计算机视觉技术有了长足的发展。计算机视觉已经通过不同的应用进入了我们的手机。这篇文章将介绍 Fedora Linux 上的 [OpenCV][4]。
|
||||||
|
|
||||||
### **什么是 OpenCV?**
|
### 什么是 OpenCV?
|
||||||
|
|
||||||
> OpenCV (开源计算机视觉库)是一个开源的计算机视觉和机器学习软件库。OpenCV 的建立是为了给计算机视觉应用提供一个通用的基础设施,并加速机器感知在商业产品中的应用。它有超过 2500 种优化算法,其中包括一套全面的经典和最先进的计算机视觉和机器学习算法。这些算法可用于检测和识别人脸,识别物体,对视频中的人类行为进行分类,并建立标记,将其与增强现实叠加等等。
|
> OpenCV(<ruby>开源计算机视觉库<rt>Open Source Computer Vision Library</rt></ruby>)是一个开源的计算机视觉和机器学习软件库。OpenCV 的建立是为了给计算机视觉应用提供一个通用的基础设施,并加速机器感知在商业产品中的应用。它有超过 2500 种优化后的算法,其中包括一套全面的经典和最先进的计算机视觉和机器学习算法。这些算法可用于检测和识别人脸、识别物体、对视频中的人类行为进行分类,并建立标记,将其与增强现实叠加等等。
|
||||||
>
|
>
|
||||||
> [opencv.org – about][5]
|
> [opencv.org – about][5]
|
||||||
|
|
||||||
### 在 Fedora Linux 上安装 OpenCV
|
### 在 Fedora Linux 上安装 OpenCV
|
||||||
|
|
||||||
要开始使用 OpenCV,请从 Fedora Linux 仓库中安装它。
|
要开始使用 OpenCV,请从 Fedora Linux 仓库中安装它:
|
||||||
|
|
||||||
```
|
```
|
||||||
$ sudo dnf install opencv opencv-contrib opencv-doc python3-opencv python3-matplotlib python3-numpy
|
$ sudo dnf install opencv opencv-contrib opencv-doc python3-opencv python3-matplotlib python3-numpy
|
||||||
```
|
```
|
||||||
|
|
||||||
**注意:**在 Fedora Silverblue 或 CoreOs 上,Python 3.9 是核心提交的一部分。用以下方法安装 OpenCV 和所需工具:_rpm-ostree install opencv opencv-doc python3-opencv python3-matplotlib python3-numpy_。
|
**注意:** 在 Fedora Silverblue 或 CoreOS 上,Python 3.9 是核心提交的一部分。用以下方法安装 OpenCV 和所需工具:
|
||||||
|
|
||||||
接下来,在终端输入以下命令,以验证 OpenCV 是否已经安装(用户输入的内容以粗体显示)。
|
```
|
||||||
|
rpm-ostree install opencv opencv-doc python3-opencv python3-matplotlib python3-numpy
|
||||||
|
```
|
||||||
|
|
||||||
|
接下来,在终端输入以下命令,以验证 OpenCV 是否已经安装:
|
||||||
|
|
||||||
```
|
```
|
||||||
$ python
|
$ python
|
||||||
@ -45,20 +49,20 @@ Type "help", "copyright", "credits" or "license" for more information.
|
|||||||
>>> exit()
|
>>> exit()
|
||||||
```
|
```
|
||||||
|
|
||||||
当你输入 _print_ 命令时,应该显示当前的 OpenCV 版本,如上图所示。这表明 OpenCV 和 Python-OpenCV 库已经成功安装。
|
当你输入 `print` 命令时,应该显示当前的 OpenCV 版本,如上图所示。这表明 OpenCV 和 Python-OpenCV 库已经成功安装。
|
||||||
|
|
||||||
此外,如果你想用 Jupyter Notebook 做笔记和写代码,并了解更多关于数据科学工具的信息,请查看早期的 Fedora Magazine 文章:[_Fedora 中的 Jupyter 和数据科学_][6]。
|
此外,如果你想用 Jupyter Notebook 做笔记和写代码,并了解更多关于数据科学工具的信息,请查看早期的 Fedora Magazine 文章:[Fedora 中的 Jupyter 和数据科学][6]。
|
||||||
|
|
||||||
### 开始使用 OpenCV
|
### 开始使用 OpenCV
|
||||||
|
|
||||||
安装完成后,使用 Python 和 OpenCV 库加载一个样本图像(按 **S** 键以 _png_ 格式保存图像的副本并完成程序):
|
安装完成后,使用 Python 和 OpenCV 库加载一个样本图像(按 `S` 键以 png 格式保存图像的副本并完成程序):
|
||||||
|
|
||||||
```
|
```
|
||||||
$ cp /usr/share/opencv4/samples/data/starry_night.jpg .
|
$ cp /usr/share/opencv4/samples/data/starry_night.jpg .
|
||||||
$ python starry_night.py
|
$ python starry_night.py
|
||||||
```
|
```
|
||||||
|
|
||||||
_starry_night.py_ 的内容:
|
`starry_night.py` 的内容:
|
||||||
|
|
||||||
```
|
```
|
||||||
import cv2 as cv
|
import cv2 as cv
|
||||||
@ -74,7 +78,7 @@ if k == ord("s"):
|
|||||||
|
|
||||||
![][7]
|
![][7]
|
||||||
|
|
||||||
通过在 _cv.imread_ 函数中添加参数 **0**,对图像进行灰度处理,如下所示。
|
通过在 `cv.imread` 函数中添加参数 `0`,对图像进行灰度处理,如下所示。
|
||||||
|
|
||||||
```
|
```
|
||||||
img = cv.imread(cv.samples.findFile("starry_night.jpg"),0)
|
img = cv.imread(cv.samples.findFile("starry_night.jpg"),0)
|
||||||
@ -82,13 +86,11 @@ img = cv.imread(cv.samples.findFile("starry_night.jpg"),0)
|
|||||||
|
|
||||||
![][8]
|
![][8]
|
||||||
|
|
||||||
这些是一些可以用于 _cv.imread_ 函数的第二个参数的替代值。
|
这些是一些可以用于 `cv.imread` 函数的第二个参数的替代值:
|
||||||
|
|
||||||
* **cv2.IMREAD_GRAYSCALE** 或 **0:** 以灰度模式加载图像。
|
|
||||||
* **cv2.IMREAD_COLOR** 或 **1:** 以彩色模式载入图像。图像中的任何透明度将被移除。这是默认的。
|
|
||||||
* **cv2.IMREAD_UNCHANGED** 或 **-1:**载入未经修改的图像。包括 alpha 通道。
|
|
||||||
|
|
||||||
|
|
||||||
|
* `cv2.IMREAD_GRAYSCALE` 或 `0`:以灰度模式加载图像。
|
||||||
|
* `cv2.IMREAD_COLOR** 或 `1`:以彩色模式载入图像。图像中的任何透明度将被移除。这是默认的。
|
||||||
|
* `cv2.IMREAD_UNCHANGED** 或 `-1`:载入未经修改的图像。包括 alpha 通道。
|
||||||
|
|
||||||
#### 使用 OpenCV 显示图像属性
|
#### 使用 OpenCV 显示图像属性
|
||||||
|
|
||||||
@ -121,10 +123,8 @@ Image 2D numpy array
|
|||||||
...
|
...
|
||||||
```
|
```
|
||||||
|
|
||||||
* **img.shape:** 返回一个行数、列数和通道数的元组(如果是彩色图像)。
|
* `img.shape`:返回一个行数、列数和通道数的元组(如果是彩色图像)。
|
||||||
* **img.dtype:** 返回图像的数据类型。
|
* `img.dtype`:返回图像的数据类型。
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
接下来用 Matplotlib 显示图像:
|
接下来用 Matplotlib 显示图像:
|
||||||
|
|
||||||
@ -140,7 +140,7 @@ plt.show()
|
|||||||
|
|
||||||
#### 发生了什么?
|
#### 发生了什么?
|
||||||
|
|
||||||
该图像是作为灰度图像读入的,但是当使用 Matplotlib 的 _imshow_ 函数时,它不一定会以灰度显示。这是因为 _imshow_ 函数默认使用不同的颜色映射。要指定使用灰度颜色映射,请将 _imshow_ 函数的第二个参数设置为 _cmap='gray'_,如下所示。
|
该图像是作为灰度图像读入的,但是当使用 Matplotlib 的 `imshow` 函数时,它不一定会以灰度显示。这是因为 `imshow` 函数默认使用不同的颜色映射。要指定使用灰度颜色映射,请将 `imshow` 函数的第二个参数设置为 `cmap='gray'`,如下所示:
|
||||||
|
|
||||||
```
|
```
|
||||||
plt.imshow(img,cmap='gray')
|
plt.imshow(img,cmap='gray')
|
||||||
@ -192,16 +192,14 @@ plt.show()
|
|||||||
|
|
||||||
![][12]
|
![][12]
|
||||||
|
|
||||||
* **cv2.split:**将一个多通道数组分割成几个单通道数组。
|
* `cv2.split`:将一个多通道数组分割成几个单通道数组。
|
||||||
* **cv2.merge:** 将几个数组合并成一个多通道数组。所有的输入矩阵必须具有相同的大小。
|
* `cv2.merge`:将几个数组合并成一个多通道数组。所有的输入矩阵必须具有相同的大小。
|
||||||
|
|
||||||
|
**注意:** 白色较多的图像具有较高的颜色密度。相反,黑色较多的图像,其颜色密度较低。在上面的例子中,红色的密度是最低的。
|
||||||
|
|
||||||
**注意:**白色较多的图像具有较高的颜色密度。相反,黑色较多的图像,其颜色密度较低。在上面的例子中,红色的密度是最低的。
|
|
||||||
|
|
||||||
#### 转换到不同的色彩空间
|
#### 转换到不同的色彩空间
|
||||||
|
|
||||||
_cv2.cvtColor_ 函数将一个输入图像从一个颜色空间转换到另一个颜色空间。在 RGB 和 BGR 色彩空间之间转换时,应明确指定通道的顺序(_RGB2BGR_ 或 _BGR2RGB_)。**注意,OpenCV 中的默认颜色格式通常被称为 RGB,但它实际上是 BGR(字节是相反的)。**因此,标准(24 位)彩色图像的第一个字节将是一个 8 位蓝色分量,第二个字节是绿色,第三个字节是红色。然后第四、第五和第六个字节将是第二个像素(蓝色,然后是绿色,然后是红色),以此类推。
|
`cv2.cvtColor` 函数将一个输入图像从一个颜色空间转换到另一个颜色空间。在 RGB 和 BGR 色彩空间之间转换时,应明确指定通道的顺序(`RGB2BGR` 或 `BGR2RGB`)。**注意,OpenCV 中的默认颜色格式通常被称为 RGB,但它实际上是 BGR(字节是相反的)。** 因此,标准(24 位)彩色图像的第一个字节将是一个 8 位蓝色分量,第二个字节是绿色,第三个字节是红色。然后第四、第五和第六个字节将是第二个像素(蓝色、然后是绿色,然后是红色),以此类推。
|
||||||
|
|
||||||
```
|
```
|
||||||
import cv2 as cv
|
import cv2 as cv
|
||||||
@ -218,7 +216,7 @@ plt.show()
|
|||||||
|
|
||||||
关于 OpenCV 的更多细节可以在[在线文档][14]中找到。
|
关于 OpenCV 的更多细节可以在[在线文档][14]中找到。
|
||||||
|
|
||||||
谢谢。
|
感谢阅读。
|
||||||
|
|
||||||
--------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
@ -227,7 +225,7 @@ via: https://fedoramagazine.org/use-opencv-on-fedora-linux-part-1/
|
|||||||
作者:[Onuralp SEZER][a]
|
作者:[Onuralp SEZER][a]
|
||||||
选题:[lujun9972][b]
|
选题:[lujun9972][b]
|
||||||
译者:[geekpi](https://github.com/geekpi)
|
译者:[geekpi](https://github.com/geekpi)
|
||||||
校对:[校对者ID](https://github.com/校对者ID)
|
校对:[wxy](https://github.com/wxy)
|
||||||
|
|
||||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||||
|
|
175
published/202108/20210804 Install OpenVPN on your Linux PC.md
Normal file
175
published/202108/20210804 Install OpenVPN on your Linux PC.md
Normal file
@ -0,0 +1,175 @@
|
|||||||
|
[#]: subject: "Install OpenVPN on your Linux PC"
|
||||||
|
[#]: via: "https://opensource.com/article/21/7/openvpn-router"
|
||||||
|
[#]: author: "D. Greg Scott https://opensource.com/users/greg-scott"
|
||||||
|
[#]: collector: "lujun9972"
|
||||||
|
[#]: translator: "perfiffer"
|
||||||
|
[#]: reviewer: "wxy"
|
||||||
|
[#]: publisher: "wxy"
|
||||||
|
[#]: url: "https://linux.cn/article-13702-1.html"
|
||||||
|
|
||||||
|
如何在免费 WiFi 中保护隐私(二)
|
||||||
|
======
|
||||||
|
|
||||||
|
> 安装完服务器之后,下一步就是安装和配置 0penVPN。
|
||||||
|
|
||||||
|
![](https://img.linux.net.cn/data/attachment/album/202108/20/123417yn554549p92ujt54.jpg)
|
||||||
|
|
||||||
|
0penVPN 在两点之间创建一个加密通道,阻止第三方访问你的网络流量数据。通过设置你的 “虚拟专用网络” 服务,你可以成为你自己的 “虚拟专用网络” 服务商。许多流行的 “虚拟专用网络” 服务都使用 [0penVPN][2],所以当你可以掌控自己的网络时,为什么还要将你的网络连接绑定到特定的提供商呢?
|
||||||
|
|
||||||
|
本系列的 [第一篇文章][3] 展示了如何安装和配置一台作为你的 0penVPN 服务器的 Linux 计算机。同时也讲述了如何配置你的路由器以便你可以在外部网络连接到你的服务器。
|
||||||
|
|
||||||
|
第二篇文章将演示根据 [0penVPN wiki][4] 给定的步骤安装一个 0penVPN 服务软件。
|
||||||
|
|
||||||
|
### 安装 0penVPN
|
||||||
|
|
||||||
|
首先,使用包管理器安装 0penVPN 和 `easy-rsa` 应用程序(帮助你在服务器上设置身份验证)。本例使用的是 Fedora Linux,如果你选择了不同的发行版,请选用合适的命令。
|
||||||
|
|
||||||
|
```
|
||||||
|
$ sudo dnf install openvpn easy-rsa
|
||||||
|
```
|
||||||
|
|
||||||
|
此操作会创建一些空目录:
|
||||||
|
|
||||||
|
* `/etc/openvpn`
|
||||||
|
* `/etc/openvpn/client`
|
||||||
|
* `/etc/openvpn/server`
|
||||||
|
|
||||||
|
如果这些目录在安装的过程中没有创建,请手动创建它们。
|
||||||
|
|
||||||
|
### 设置身份验证
|
||||||
|
|
||||||
|
0penVPN 依赖于 `easy-rsa` 脚本,并且应该有自己的副本。复制 `easy-rsa` 脚本和文件:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ sudo mkdir /etc/openvpn/easy-rsa
|
||||||
|
$ sudo cp -rai /usr/share/easy-rsa/3/* /etc/openvpn/easy-rsa/
|
||||||
|
```
|
||||||
|
|
||||||
|
身份验证很重要,0penVPN 非常重视它。身份验证的理论是,如果 Alice 需要访问 Bob 公司内部的私人信息,那么 Bob 确保 Alice 真的是 Alice 就至关重要。同样的,Alice 也必须确保 Bob 是真正的 Bob。我们称之为相互认证。
|
||||||
|
|
||||||
|
现有的最佳实践是从三个可能因素中的选择两个检查属性:
|
||||||
|
|
||||||
|
* 你拥有的
|
||||||
|
* 你知道的
|
||||||
|
* 你是谁
|
||||||
|
|
||||||
|
选择有很多。0penVPN 安装使用如下:
|
||||||
|
|
||||||
|
* **证书**:客户端和服务端都拥有的东西
|
||||||
|
* **证书口令**:某人知道的东西
|
||||||
|
|
||||||
|
Alice 和 Bob 需要帮助彼此来验证身份。由于他们都相信 Cathy,Cathy 承担了称为 <ruby>证书颁发机构<rt>certificate authority</rt></ruby>(CA)的角色。Cathy 证明 Alice 和 Bob 都是他们自己。因为 Alice 和 Bob 都信任 Cathy,现在他们也相互信任了。
|
||||||
|
|
||||||
|
但是是什么让 Cathy 相信 Alice 和 Bob 是真的 Alice 和 Bob?Cathy 在社区的声誉取决于如何正确处理这件事,因此如果她希望 Denielle、Evan、Fiona、Greg 和其他人也信任她,她就需要严格测试 Alice 和 Bob 的宣称内容。当 Alice 和 Bob 向 Cathy 证明了他们是真的 Alice 和 Bob 之后,Cathy 将向 Alice 和 Bob 签署证书,让他们彼此和全世界分享。
|
||||||
|
|
||||||
|
Alice 和 Bob 如何知道是 Cathy 签署了证书,而不是某个人冒充她签发了证书?他们使用一项叫做**公钥加密**的技术:
|
||||||
|
|
||||||
|
* 找到一种用一个密钥加密并用另一个密钥解密的加密算法。
|
||||||
|
* 将其中一个设为私钥,将另外一个设为公钥。
|
||||||
|
* Cathy 与全世界分享她的公钥和她的签名的明文副本。
|
||||||
|
* Cathy 用她的私钥加密她的签名,任何人都可以用她分享的公钥解密。
|
||||||
|
* 如果 Cathy 的签名解密后与明文副本匹配,Alice 和 Bob 就可以相信 Cathy 确实签署了它。
|
||||||
|
|
||||||
|
每次在线购买商品和服务时,使用的就是这种技术。
|
||||||
|
|
||||||
|
### 认证实现
|
||||||
|
|
||||||
|
0penVPN 的 [文档][5] 建议在单独的系统上或者至少在 0penVPN 服务器的单独目录上设置 CA。该文档还建议分别从服务端和客户端生成各自的证书。因为这是一个简单的演示设置,你可以使用 0penVPN 服务器设置 CA,并将证书和密钥放入服务器上的指定目录中。
|
||||||
|
|
||||||
|
从服务端生成证书,并将证书拷贝到各个客户端,避免客户端再次设置。
|
||||||
|
|
||||||
|
此实现使用自签名证书。这是因为服务器信任自己,而客户端信任服务器。因此,服务器是签署证书的最佳 CA。
|
||||||
|
|
||||||
|
在 0penVPN 服务器上设置 CA:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ sudo mkdir /etc/openvpn/ca
|
||||||
|
$ cd /etc/openvpn/ca
|
||||||
|
$ sudo /etc/openvpn/easy-rsa/easyrsa init-pki
|
||||||
|
$ sudo /etc/openvpn/easy-rsa/easyrsa build-ca
|
||||||
|
```
|
||||||
|
|
||||||
|
使用一个易记难猜的密码。
|
||||||
|
|
||||||
|
设置服务器密钥对和认证请求:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ cd /etc/openvpn/server
|
||||||
|
$ sudo /etc/openvpn/easy-rsa/easyrsa init-pki
|
||||||
|
$ sudo /etc/openvpn/easy-rsa/easyrsa gen-req OVPNserver2020 nopass
|
||||||
|
```
|
||||||
|
|
||||||
|
在此例中,`OVPNServer2020` 是你在本系列第一篇文章中为 0penVPN 服务器设置的主机名。
|
||||||
|
|
||||||
|
### 生成和签署证书
|
||||||
|
|
||||||
|
现在你必须向 CA 发送服务器请求并生成和签署服务器证书。
|
||||||
|
|
||||||
|
此步骤实质上是将请求文件从 `/etc/openvpn/server/pki/reqs/OVPNserver2020.req` 复制到 `/etc/openvpn/ca/pki/reqs/OVPNserver2020.req` 以准备审查和签名:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ cd /etc/openvpn/ca
|
||||||
|
$ sudo /etc/openvpn/easy-rsa/easyrsa \
|
||||||
|
import-req /etc/openvpn/server/pki/reqs/OVPNserver2020.req OVPNserver2020
|
||||||
|
```
|
||||||
|
|
||||||
|
### 审查并签署请求
|
||||||
|
|
||||||
|
你已经生成了一个请求,所以现在你必须审查并签署证书:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ cd /etc/openvpn/ca
|
||||||
|
$ sudo /etc/openvpn/easy-rsa/easyrsa \
|
||||||
|
show-req OVPNserver2020
|
||||||
|
```
|
||||||
|
|
||||||
|
以服务器身份签署请求:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ cd /etc/openvpn/ca
|
||||||
|
$ sudo /etc/openvpn/easy-rsa/easyrsa \
|
||||||
|
sign-req server OVPNserver2020
|
||||||
|
```
|
||||||
|
|
||||||
|
将服务器和 CA 证书的副本放在它们所属的位置,以便配置文件获取它们:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ sudo cp /etc/openvpn/ca/pki/issued/OVPNserver2020.crt \
|
||||||
|
/etc/openvpn/server/pki/
|
||||||
|
$ sudo cp /etc/openvpn/ca/pki/ca.crt \
|
||||||
|
/etc/openvpn/server/pki/
|
||||||
|
```
|
||||||
|
|
||||||
|
接下来,生成 [Diffie-Hellman][6] 参数,以便客户端和服务器可以交换会话密钥:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ cd /etc/openvpn/server
|
||||||
|
$ sudo /etc/openvpn/easy-rsa/easyrsa gen-dh
|
||||||
|
```
|
||||||
|
|
||||||
|
### 快完成了
|
||||||
|
|
||||||
|
本系列的下一篇文章将演示如何配置和启动你刚刚构建的 0penVPN 服务器。
|
||||||
|
|
||||||
|
本文的部分内容改编自 D. Greg Scott 的博客,并经许可重新发布。
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
via: https://opensource.com/article/21/7/openvpn-router
|
||||||
|
|
||||||
|
作者:[D. Greg Scott][a]
|
||||||
|
选题:[lujun9972][b]
|
||||||
|
译者:[perfiffer](https://github.com/perfiffer)
|
||||||
|
校对:[wxy](https://github.com/wxy)
|
||||||
|
|
||||||
|
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||||
|
|
||||||
|
[a]: https://opensource.com/users/greg-scott
|
||||||
|
[b]: https://github.com/lujun9972
|
||||||
|
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/openwires_fromRHT_520_0612LL.png?itok=PqZi55Ab (Open ethernet cords.)
|
||||||
|
[2]: https://openvpn.net/
|
||||||
|
[3]: https://linux.cn/article-13680-1.html
|
||||||
|
[4]: https://community.openvpn.net/openvpn/wiki
|
||||||
|
[5]: https://openvpn.net/community-resources/
|
||||||
|
[6]: https://en.wikipedia.org/wiki/Diffie%E2%80%93Hellman_key_exchange
|
||||||
|
[7]: https://www.dgregscott.com/how-to-build-a-vpn-in-four-easy-steps-without-spending-one-penny/
|
@ -3,61 +3,57 @@
|
|||||||
[#]: author: "D. Greg Scott https://opensource.com/users/greg-scott"
|
[#]: author: "D. Greg Scott https://opensource.com/users/greg-scott"
|
||||||
[#]: collector: "lujun9972"
|
[#]: collector: "lujun9972"
|
||||||
[#]: translator: "geekpi"
|
[#]: translator: "geekpi"
|
||||||
[#]: reviewer: " "
|
[#]: reviewer: "turbokernel"
|
||||||
[#]: publisher: " "
|
[#]: publisher: "wxy"
|
||||||
[#]: url: " "
|
[#]: url: "https://linux.cn/article-13707-1.html"
|
||||||
|
|
||||||
在 Linux 上配置你的 OpenVPN 服务器
|
如何在免费 WiFi 中保护隐私(三)
|
||||||
======
|
======
|
||||||
在你安装了 OpenVPN 之后,是时候配置它了。
|
|
||||||
![Lock][1]
|
|
||||||
|
|
||||||
OpenVPN 在两点之间建立一个加密的隧道,防止第三方访问你的网络流量。通过设置你的虚拟私人网络(VPN)服务器,你就成为你自己的 VPN 供应商。许多流行的 VPN 服务已经使用 [OpenVPN][2],所以当你可以完全控制时,为什么要把你的连接绑定到一个特定的供应商?
|
> 在你安装了 0penVPN 之后,是时候配置它了。
|
||||||
|
|
||||||
本系列中的[第一篇][3]设置了一个 VPN 服务器,[第二篇][4]演示了如何安装和配置 OpenVPN 服务器软件。这第三篇文章展示了如何在认证到位的情况下启动 OpenVPN。
|
![](https://img.linux.net.cn/data/attachment/album/202108/22/081708mvgwwzv8f58vgwqz.jpg)
|
||||||
|
|
||||||
要设置一个 OpenVPN 服务器,你必须:
|
0penVPN 在两点之间建立一条加密的隧道,阻止第三方访问你的网络流量。通过设置你的 “虚拟专用网络” 服务,你就成为你自己的 “虚拟专用网络” 供应商。许多流行的 “虚拟专用网络” 服务已支持 [0penVPN][2],所以当你可以掌控自己的网络时,为什么还要将你的网络连接绑定到特定的提供商呢?
|
||||||
|
|
||||||
|
本系列中的 [第一篇][3] 展示了如何安装和配置一台作为你的 0penVPN 服务器的 Linux 计算机。,[第二篇][4] 演示了如何安装和配置 0penVPN 服务器软件。这第三篇文章演示了如何在认证成功的情况下启动 0penVPN。
|
||||||
|
|
||||||
|
要设置一个 0penVPN 服务器,你必须:
|
||||||
|
|
||||||
* 创建一个配置文件。
|
* 创建一个配置文件。
|
||||||
* 设置 `sysctl` 值 `net.ipv4.ip_forward = 1` 以启用路由。
|
* 使用 `sysctl` 设置`net.ipv4.ip_forward = 1` 以启用路由。
|
||||||
* 为所有的配置和认证文件设置适当的所有权,以便在一个非 root 账户下运行 OpenVPN 服务器守护程序。
|
* 为所有的配置和认证文件设置适当的所有权,以便使用非 root 账户运行 0penVPN 服务器守护程序。
|
||||||
* 设置 OpenVPN 以适当的配置文件启动。
|
* 设置 0penVPN 加载适当的配置文件启动。
|
||||||
* 配置你的防火墙。
|
* 配置你的防火墙。
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
### 配置文件
|
### 配置文件
|
||||||
|
|
||||||
你必须在 `/etc/openvpn/server/` 中创建一个服务器配置文件。如果你想的话,你可以从头开始,OpenVPN 包括了几个样本配置文件,可以作为开始。看看 `/usr/share/doc/openvpn/sample/sample-config-files/` 就知道了。
|
你必须在 `/etc/openvpn/server/` 中创建一个服务器配置文件。如果你想的话,你可以从头开始,0penVPN 包括了几个配置示例示例文件,可以以此作为开始。看看 `/usr/share/doc/openvpn/sample/sample-config-files/` 就知道了。
|
||||||
|
|
||||||
如果你想手工建立一个配置文件,从 `server.conf` 或 `roadwarrior-server.conf` 开始(视情况而定),并将你的配置文件放在 `/etc/openvpn/server` 中。这两个文件都有大量的注释,所以请阅读注释并决定哪一个适用你的情况。
|
如果你想手工建立一个配置文件,可以从 `server.conf` 或 `roadwarrior-server.conf` 开始(视情况而定),并将你的配置文件放在 `/etc/openvpn/server` 中。这两个文件都有大量的注释,所以请阅读注释并根据你的情况作出决定。
|
||||||
|
|
||||||
你可以通过使用我预先建立的服务器和客户端配置文件模板和 `sysctl` 文件来打开网络路由,从而节省时间和麻烦。这个配置还包括自定义记录连接和断开的情况。它在 OpenVPN 服务器的 `/etc/openvpn/server/logs` 中保存日志。
|
你可以使用我预先建立的服务器和客户端配置文件模板和 `sysctl` 文件来打开网络路由,从而节省时间和麻烦。这个配置还包括自定义记录连接和断开的情况。它在 0penVPN 服务器的 `/etc/openvpn/server/logs` 中保存日志。
|
||||||
|
|
||||||
如果你使用我的模板,你将需要编辑它们以使用你的 IP 地址和主机名。
|
如果你使用我的模板,你需要使用你的 IP 地址和主机名编辑它们。
|
||||||
|
|
||||||
要使用我的预建配置模板、脚本和 `sysctl` 来打开 IP 转发,请下载我的脚本:
|
要使用我的预建配置模板、脚本和 `sysctl` 来打开 IP 转发,请下载我的脚本:
|
||||||
|
|
||||||
|
|
||||||
```
|
```
|
||||||
$ curl \
|
$ curl \
|
||||||
<https://www.dgregscott.com/ovpn/OVPNdownloads.sh> > \
|
https://www.dgregscott.com/ovpn/OVPNdownloads.sh > \
|
||||||
OVPNdownloads.sh
|
OVPNdownloads.sh
|
||||||
```
|
```
|
||||||
|
|
||||||
阅读该脚本,了解它的工作内容。下面是它的行为概述:
|
阅读该脚本,了解它的工作内容。下面是它的运行概述:
|
||||||
|
|
||||||
* 在你的 OpenVPN 服务器上创建适当的目录
|
* 在你的 0penVPN 服务器上创建适当的目录
|
||||||
* 从我的网站下载服务器和客户端的配置文件模板
|
* 从我的网站下载服务器和客户端的配置文件模板
|
||||||
* 下载我的自定义脚本,并以正确的权限把它们放到正确的目录中。
|
* 下载我的自定义脚本,并以正确的权限把它们放到正确的目录中
|
||||||
* 下载 `99-ipforward.conf` 并把它放到 `/etc/sysctl.d` 中,以便在下次启动时打开 IP 转发功能。
|
* 下载 `99-ipforward.conf` 并把它放到 `/etc/sysctl.d` 中,以便在下次启动时打开 IP 转发功能
|
||||||
* 为 `/etc/openvpn` 中的所有内容设置了所有权
|
* 为 `/etc/openvpn` 中的所有内容设置了所有权
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
当你确定你理解了这个脚本的作用,就使它可执行并运行它:
|
当你确定你理解了这个脚本的作用,就使它可执行并运行它:
|
||||||
|
|
||||||
|
|
||||||
```
|
```
|
||||||
$ chmod +x OVPNdownloads.sh
|
$ chmod +x OVPNdownloads.sh
|
||||||
$ sudo ./OVPNdownloads.sh
|
$ sudo ./OVPNdownloads.sh
|
||||||
@ -65,7 +61,6 @@ $ sudo ./OVPNdownloads.sh
|
|||||||
|
|
||||||
下面是它复制的文件(注意文件的所有权):
|
下面是它复制的文件(注意文件的所有权):
|
||||||
|
|
||||||
|
|
||||||
```
|
```
|
||||||
$ ls -al -R /etc/openvpn
|
$ ls -al -R /etc/openvpn
|
||||||
/etc/openvpn:
|
/etc/openvpn:
|
||||||
@ -104,7 +99,6 @@ drwxr-xr-x. 4 openvpn openvpn 56 Apr 6 20:35 ..
|
|||||||
|
|
||||||
下面是 `99-ipforward.conf` 文件:
|
下面是 `99-ipforward.conf` 文件:
|
||||||
|
|
||||||
|
|
||||||
```
|
```
|
||||||
# Turn on IP forwarding. OpenVPN servers need to do routing
|
# Turn on IP forwarding. OpenVPN servers need to do routing
|
||||||
net.ipv4.ip_forward = 1
|
net.ipv4.ip_forward = 1
|
||||||
@ -114,8 +108,7 @@ net.ipv4.ip_forward = 1
|
|||||||
|
|
||||||
### 文件所有权
|
### 文件所有权
|
||||||
|
|
||||||
如果你使用了我网站上的自动脚本,文件所有权就已经到位了。如果没有,你必须确保你的系统有一个叫 `openvpn` 的用户,并且是 `openvpn` 组的成员。你必须将 `/etc/openvpn` 中的所有内容的所有权设置为该用户和组。如果你不确定该用户和组是否已经存在,这样做是安全的,因为 `useradd` 会拒绝创建一个与已经存在的用户同名的用户:
|
如果你使用了我网站上的自动脚本,文件所有权就已经到位了。如果没有,你必须确保你的系统有一个叫 `openvpn` 的用户,并且是 `openvpn` 组的成员。你必须将 `/etc/openvpn` 中的所有内容的所有权设置为该用户和组。如果你不确定该用户和组是否已经存在,这样做也是安全的,因为 `useradd` 会拒绝创建一个与已经存在的用户同名的用户:
|
||||||
|
|
||||||
|
|
||||||
```
|
```
|
||||||
$ sudo useradd openvpn
|
$ sudo useradd openvpn
|
||||||
@ -124,8 +117,7 @@ $ sudo chown -R openvpn.openvpn /etc/openvpn
|
|||||||
|
|
||||||
### 防火墙
|
### 防火墙
|
||||||
|
|
||||||
如果你在步骤 1 中决定不禁用 firewalld 服务,那么你的服务器的防火墙服务可能默认不允许 VPN 流量。使用 [`firewall-cmd` 命令][5],你可以启用 OpenVPN 服务,它可以打开必要的端口并根据需要路由流量:
|
如果你在步骤 1 中启用 firewalld 服务,那么你的服务器的防火墙服务可能默认不允许 “虚拟专用网络” 流量。使用 [firewall-cmd 命令][5],你可以启用 0penVPN 服务,它可以打开必要的端口并按需路由流量:
|
||||||
|
|
||||||
|
|
||||||
```
|
```
|
||||||
$ sudo firewall-cmd --add-service openvpn --permanent
|
$ sudo firewall-cmd --add-service openvpn --permanent
|
||||||
@ -136,19 +128,15 @@ $ sudo firewall-cmd --reload
|
|||||||
|
|
||||||
### 启动你的服务器
|
### 启动你的服务器
|
||||||
|
|
||||||
现在你可以启动你的 OpenVPN 服务器了。为了让它在重启后自动启动,使用 `systemctl` 的 `enable` 子命令:
|
现在你可以启动 0penVPN 服务器了。为了让它在重启后自动运行,使用 `systemctl` 的 `enable` 子命令:
|
||||||
|
|
||||||
|
|
||||||
```
|
```
|
||||||
`systemctl enable --now openvpn-server@OVPNserver2020.service`
|
systemctl enable --now openvpn-server@OVPNserver2020.service
|
||||||
```
|
```
|
||||||
|
|
||||||
### 最后的步骤
|
### 最后的步骤
|
||||||
|
|
||||||
本文的第四篇也是最后一篇文章将演示如何设置客户端,以便从远处连接到你的 OpenVPN。
|
本文的第四篇也是最后一篇文章将演示如何设置客户端,以便远程连接到你的 0penVPN。
|
||||||
|
|
||||||
|
|
||||||
* * *
|
|
||||||
|
|
||||||
_本文基于 D.Greg Scott 的[博客][6],经许可后重新使用。_
|
_本文基于 D.Greg Scott 的[博客][6],经许可后重新使用。_
|
||||||
|
|
||||||
@ -159,7 +147,7 @@ via: https://opensource.com/article/21/7/openvpn-firewall
|
|||||||
作者:[D. Greg Scott][a]
|
作者:[D. Greg Scott][a]
|
||||||
选题:[lujun9972][b]
|
选题:[lujun9972][b]
|
||||||
译者:[geekpi](https://github.com/geekpi)
|
译者:[geekpi](https://github.com/geekpi)
|
||||||
校对:[校对者ID](https://github.com/校对者ID)
|
校对:[turbokernel](https://github.com/turbokernel)
|
||||||
|
|
||||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||||
|
|
||||||
@ -167,7 +155,7 @@ via: https://opensource.com/article/21/7/openvpn-firewall
|
|||||||
[b]: https://github.com/lujun9972
|
[b]: https://github.com/lujun9972
|
||||||
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/security-lock-password.jpg?itok=KJMdkKum (Lock)
|
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/security-lock-password.jpg?itok=KJMdkKum (Lock)
|
||||||
[2]: https://openvpn.net/
|
[2]: https://openvpn.net/
|
||||||
[3]: https://opensource.com/article/21/7/vpn-openvpn-part-1
|
[3]: https://linux.cn/article-13680-1.html
|
||||||
[4]: https://opensource.com/article/21/7/vpn-openvpn-part-2
|
[4]: https://linux.cn/article-13702-1.html
|
||||||
[5]: https://www.redhat.com/sysadmin/secure-linux-network-firewall-cmd
|
[5]: https://www.redhat.com/sysadmin/secure-linux-network-firewall-cmd
|
||||||
[6]: https://www.dgregscott.com/how-to-build-a-vpn-in-four-easy-steps-without-spending-one-penny/
|
[6]: https://www.dgregscott.com/how-to-build-a-vpn-in-four-easy-steps-without-spending-one-penny/
|
@ -0,0 +1,130 @@
|
|||||||
|
[#]: subject: "Access OpenVPN from a client computer"
|
||||||
|
[#]: via: "https://opensource.com/article/21/7/openvpn-client"
|
||||||
|
[#]: author: "D. Greg Scott https://opensource.com/users/greg-scott"
|
||||||
|
[#]: collector: "lujun9972"
|
||||||
|
[#]: translator: "perfiffer"
|
||||||
|
[#]: reviewer: "wxy"
|
||||||
|
[#]: publisher: "wxy"
|
||||||
|
[#]: url: "https://linux.cn/article-13714-1.html"
|
||||||
|
|
||||||
|
如何在免费 WiFi 中保护隐私(四)
|
||||||
|
======
|
||||||
|
|
||||||
|
> 在 Linux 上安装好“虚拟专用网络” 之后,是时候使用它了。
|
||||||
|
|
||||||
|
![](https://img.linux.net.cn/data/attachment/album/202108/24/101214ng2afee2gmefgj5z.jpg)
|
||||||
|
|
||||||
|
0penVPN 在两点之间创建了一个加密通道,以阻止第三方访问你的网络流量数据。通过设置你的 “虚拟专用网络” 服务,你可以成为你自己的 “虚拟专用网络” 服务商。许多流行的 “虚拟专用网络” 服务都使用 0penVPN,所以当你可以掌控自己的网络时,为什么还要将你的网络连接绑定到特定的提供商呢?
|
||||||
|
|
||||||
|
本系列的 [第一篇文章][3] 安装了一个“虚拟专用网络” 的服务器,[第二篇文章][4] 介绍了如何安装和配置一个 0penVPN 服务软件,[第三篇文章][5] 解释了如何配置防火墙并启动你的 0penVPN 服务。第四篇也是最后一篇文章将演示如何从客户端计算机使用你的 0penVPN 服务器。这就是你做了前三篇文章中所有工作的原因!
|
||||||
|
|
||||||
|
### 创建客户端证书
|
||||||
|
|
||||||
|
请记住,0penVPN 的身份验证方法要求服务器和客户端都拥有某些东西(证书)并知道某些东西(口令)。是时候设置它了。
|
||||||
|
|
||||||
|
首先,为你的客户端计算机创建一个客户端证书和一个私钥。在你的 0penVPN 服务器上,生成证书请求。它会要求你输入密码;确保你记住它:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ cd /etc/openvpn/ca
|
||||||
|
$ sudo /etc/openvpn/easy-rsa/easyrsa \
|
||||||
|
gen-req greglaptop
|
||||||
|
```
|
||||||
|
|
||||||
|
本例中,`greglaptop` 是创建证书的客户端计算机主机名。
|
||||||
|
|
||||||
|
无需将请求导入证书颁发机构(CA),因为它已经存在。审查它以确保请求存在:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ cd /etc/openvpn/ca
|
||||||
|
$ /etc/openvpn/easy-rsa/easyrsa \
|
||||||
|
show-req greglaptop
|
||||||
|
```
|
||||||
|
|
||||||
|
你也可以以客户端身份签署请求:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ /etc/openvpn/easy-rsa/easyrsa \
|
||||||
|
sign-req client greglaptop
|
||||||
|
```
|
||||||
|
|
||||||
|
### 安装 0penVPN 客户端软件
|
||||||
|
|
||||||
|
在 Linux 系统上,网络管理器可能已经包含了一个 0penVPN 客户端。如果没有,你可以安装插件:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ sudo dnf install NetworkManager-openvpn
|
||||||
|
```
|
||||||
|
|
||||||
|
在 Windows 系统上,你必须从 0penVPN 下载网页下载和安装 0penVPN 客户端。启动安装程序并按照提示操作。
|
||||||
|
|
||||||
|
### 复制证书和私钥到客户端
|
||||||
|
|
||||||
|
现在你的客户端需要你为其生成的身份验证凭据。你在服务器上生成了这些,因此你必须将它们传输到你的客户端。我推荐使用 SSH 来完成传输。在 Linux 系统上,通过 `scp` 命令实现。在 Windows 系统上,你可以以管理员身份运行 [WinSCP][6] 来推送证书和密钥。
|
||||||
|
|
||||||
|
假设客户端名称为 `greglaptop`,那么证书和私钥的文件名以及服务的位置如下:
|
||||||
|
|
||||||
|
```
|
||||||
|
/etc/openvpn/ca/pki/issued/greglaptop.crt
|
||||||
|
/etc/openvpn/ca/pki/private/greglaptop.key
|
||||||
|
/etc/openvpn/ca/pki/issued/ca.crt
|
||||||
|
```
|
||||||
|
|
||||||
|
在 Linux 系统上,复制这些文件到 `/etc/pki/tls/certs` 目录。在 Windows 系统上,复制它们到 `C:\Program Files\OpenVPN\config` 目录。
|
||||||
|
|
||||||
|
### 复制和自定义客户端配置文件
|
||||||
|
|
||||||
|
在 Linux 系统上,你可以复制服务器上的 `/etc/openvpn/client/OVPNclient2020.ovpn` 文件到 `/etc/NetworkManager/system-connections/` 目录,或者你也可以导航到系统设置中的网络管理器添加一个“虚拟专用网络” 连接。
|
||||||
|
|
||||||
|
连接类型选择“<ruby>证书(TLS)<rt>Certificates(TLS)</rt></ruby>”。告知网络管理器你从服务器上复制的证书和密钥。
|
||||||
|
|
||||||
|
![VPN displayed in Network Manager][7]
|
||||||
|
|
||||||
|
在 Windows 系统上,以管理员身份运行 WinSCP,将服务器上的客户端配置模板 `/etc/openvpn/client/OVPNclient2020.ovpn` 文件复制到客户端上的 `C:\Program Files\OpenVPN\config` 目录。然后:
|
||||||
|
|
||||||
|
* 重命名它以匹配上面的证书。
|
||||||
|
* 更改 CA 证书、客户端证书和密钥的名称以匹配上面从服务器复制的名称。
|
||||||
|
* 修改 IP 信息,以匹配你的网络。
|
||||||
|
|
||||||
|
你需要超级管理员权限来编辑客户端配置文件。最简单的方式就是以管理员身份启动一个 CMD 窗口,然后从管理员 CMD 窗口启动记事本来编辑此文件。
|
||||||
|
|
||||||
|
### 将你的客户端连接到服务器
|
||||||
|
|
||||||
|
在 Linux 系统上,网络管理器会显示你的 “虚拟专用网络” 连接。选择它进行连接。
|
||||||
|
|
||||||
|
![Add a connection in Network Manager][9]
|
||||||
|
|
||||||
|
在 Windows 系统上,启动 0penVPN 图形用户界面。它会在任务栏右侧的 Windows 系统托盘中生成一个图标,通常位于 Windows 桌面的右下角。右键单击图标以连接、断开连接或查看状态。
|
||||||
|
|
||||||
|
对于第一次连接,编辑客户端配置文件的 `remote` 行以使用 0penVPN 服务器的内部 IP 地址。通过右键单击 Windows 系统托盘中的 0penVPN 图标并单击“<ruby>连接<rt>Connect</rt></ruby>”,从办公室网络内部连接到服务器。调试此连接,这应该可以找到并解决问题,而不会出现任何防火墙问题,因为客户端和服务器都在防火墙的同一侧。
|
||||||
|
|
||||||
|
接下来,编辑客户端配置文件的 `remote` 行以使用 0penVPN 服务器的公共 IP 地址。将 Windows 客户端连接到外部网络并进行连接。调试有可能的问题。
|
||||||
|
|
||||||
|
### 安全连接
|
||||||
|
|
||||||
|
恭喜!你已经为其他客户端系统准备好了 0penVPN 网络。对其余客户端重复设置步骤。你甚至可以使用 Ansible 来分发证书和密钥并使其保持最新。
|
||||||
|
|
||||||
|
本文基于 D.Greg Scott 的 [博客][10],经许可后重新使用。
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
via: https://opensource.com/article/21/7/openvpn-client
|
||||||
|
|
||||||
|
作者:[D. Greg Scott][a]
|
||||||
|
选题:[lujun9972][b]
|
||||||
|
译者:[perfiffer](https://github.com/perfiffer)
|
||||||
|
校对:[wxy](https://github.com/wxy)
|
||||||
|
|
||||||
|
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||||
|
|
||||||
|
[a]: https://opensource.com/users/greg-scott
|
||||||
|
[b]: https://github.com/lujun9972
|
||||||
|
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/programming-code-keyboard-laptop-music-headphones.png?itok=EQZ2WKzy (Woman programming)
|
||||||
|
[2]: https://openvpn.net/
|
||||||
|
[3]: https://linux.cn/article-13680-1.html
|
||||||
|
[4]: https://linux.cn/article-13702-1.html
|
||||||
|
[5]: https://linux.cn/article-13707-1.html
|
||||||
|
[6]: https://winscp.net/eng/index.php
|
||||||
|
[7]: https://opensource.com/sites/default/files/uploads/network-manager-profile.jpg (VPN displayed in Network Manager)
|
||||||
|
[8]: https://creativecommons.org/licenses/by-sa/4.0/
|
||||||
|
[9]: https://opensource.com/sites/default/files/uploads/network-manager-connect.jpg (Add a“虚拟专用网络” connection in Network Manager)
|
||||||
|
[10]: https://www.dgregscott.com/how-to-build-a-vpn-in-four-easy-steps-without-spending-one-penny/
|
@ -0,0 +1,183 @@
|
|||||||
|
[#]: subject: "Change your Linux Desktop Wallpaper Every Hour [Here’s How]"
|
||||||
|
[#]: via: "https://www.debugpoint.com/2021/08/change-wallpaper-every-hour/"
|
||||||
|
[#]: author: "Arindam https://www.debugpoint.com/author/admin1/"
|
||||||
|
[#]: collector: "lujun9972"
|
||||||
|
[#]: translator: "geekpi"
|
||||||
|
[#]: reviewer: "wxy"
|
||||||
|
[#]: publisher: "wxy"
|
||||||
|
[#]: url: "https://linux.cn/article-13701-1.html"
|
||||||
|
|
||||||
|
如何每小时改变你的 Linux 桌面壁纸
|
||||||
|
======
|
||||||
|
|
||||||
|
![](https://img.linux.net.cn/data/attachment/album/202108/19/223054ga6b8a8paa61u31u.jpg)
|
||||||
|
|
||||||
|
这个 shell 脚本 `styli.sh` 可以帮助你每小时自动改变你的 Linux 桌面壁纸,并且有几个选项。
|
||||||
|
|
||||||
|
用一张漂亮的壁纸来开始你的一天,你的桌面让人耳目一新。但寻找壁纸,然后保存,最终设置为壁纸,是非常麻烦的。所有这些步骤都可以通过这个叫做 [styli.sh][1] 的脚本完成。
|
||||||
|
|
||||||
|
### styli.sh - 每小时改变你的 Linux 桌面壁纸
|
||||||
|
|
||||||
|
这是一个 shell 脚本,你可以从 GitHub 上下载。当运行时,它从 Reddit 的热门版块中获取壁纸并将其设置为你的壁纸。
|
||||||
|
|
||||||
|
该脚本适用于所有流行的桌面环境,如 GNOME、KDE Plasma、Xfce 和 Sway 窗口管理器。
|
||||||
|
|
||||||
|
它有很多功能,你可以通过 crontab 来运行这个脚本,并在特定的时间间隔内得到一张新的壁纸。
|
||||||
|
|
||||||
|
### 下载并安装、运行
|
||||||
|
|
||||||
|
打开一个终端,并克隆 GitHub 仓库。如果没有安装的话,你需要安装 [feh][2] 和 git。
|
||||||
|
|
||||||
|
```
|
||||||
|
git clone https://github.com/thevinter/styli.sh
|
||||||
|
cd styli.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
要设置随机壁纸,根据你的桌面环境运行以下内容。
|
||||||
|
|
||||||
|
![Change your Linux Desktop Wallpaper Every Hour using styli.sh][3]
|
||||||
|
|
||||||
|
GNOME:
|
||||||
|
|
||||||
|
```
|
||||||
|
./styli.sh -g
|
||||||
|
```
|
||||||
|
|
||||||
|
Xfce:
|
||||||
|
|
||||||
|
```
|
||||||
|
./styli.sh -x
|
||||||
|
```
|
||||||
|
|
||||||
|
KDE Plasma:
|
||||||
|
|
||||||
|
```
|
||||||
|
./styli.sh -k
|
||||||
|
```
|
||||||
|
|
||||||
|
Sway:
|
||||||
|
|
||||||
|
```
|
||||||
|
./styli.sh -y
|
||||||
|
```
|
||||||
|
|
||||||
|
### 每小时改变一次
|
||||||
|
|
||||||
|
要每小时改变背景,请运行以下命令:
|
||||||
|
|
||||||
|
```
|
||||||
|
crontab -e
|
||||||
|
```
|
||||||
|
|
||||||
|
并在打开的文件中加入以下内容。不要忘记改变脚本路径。
|
||||||
|
|
||||||
|
```
|
||||||
|
@hourly script/path/styli.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
### 改变版块
|
||||||
|
|
||||||
|
在源目录中,有一个名为 `subreddits` 的文件。它填满了一些标准的版块。如果你想要更多一些,只需在文件末尾添加版块名称。
|
||||||
|
|
||||||
|
### 更多配置选项
|
||||||
|
|
||||||
|
壁纸的类型、大小,也可以设置。以下是这个脚本的一些独特的配置选项。
|
||||||
|
|
||||||
|
设置一个随机的 1920×1080 背景:
|
||||||
|
|
||||||
|
```
|
||||||
|
./styli.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
指定一个所需的宽度或高度:
|
||||||
|
|
||||||
|
```
|
||||||
|
./styli.sh -w 1080 -h 720
|
||||||
|
./styli.sh -w 2560
|
||||||
|
./styli.sh -h 1440
|
||||||
|
```
|
||||||
|
|
||||||
|
根据搜索词设置壁纸:
|
||||||
|
|
||||||
|
```
|
||||||
|
./styli.sh -s island
|
||||||
|
./styli.sh -s “sea sunset”
|
||||||
|
./styli.sh -s sea -w 1080
|
||||||
|
```
|
||||||
|
|
||||||
|
从设定的一个版块中获得一个随机壁纸:
|
||||||
|
|
||||||
|
注意:宽度/高度/搜索参数对 reddit 不起作用。
|
||||||
|
|
||||||
|
```
|
||||||
|
./styli.sh -l reddit
|
||||||
|
```
|
||||||
|
|
||||||
|
从一个自定义的版块获得随机壁纸:
|
||||||
|
|
||||||
|
```
|
||||||
|
./styli.sh -r
|
||||||
|
./styli.sh -r wallpaperdump
|
||||||
|
```
|
||||||
|
|
||||||
|
使用内置的 `feh -bg` 选项:
|
||||||
|
|
||||||
|
```
|
||||||
|
./styli.sh -b
|
||||||
|
./styli.sh -b bg-scale -r widescreen-wallpaper
|
||||||
|
```
|
||||||
|
|
||||||
|
添加自定义的 feh 标志:
|
||||||
|
|
||||||
|
```
|
||||||
|
./styli.sh -c
|
||||||
|
./styli.sh -c –no-xinerama -r widescreen-wallpaper
|
||||||
|
```
|
||||||
|
|
||||||
|
自动设置终端的颜色:
|
||||||
|
|
||||||
|
```
|
||||||
|
./styli.sh -p
|
||||||
|
```
|
||||||
|
|
||||||
|
使用 nitrogen 而不是 feh:
|
||||||
|
|
||||||
|
```
|
||||||
|
./styli.sh -n
|
||||||
|
```
|
||||||
|
|
||||||
|
使用 nitrogen 更新多个屏幕:
|
||||||
|
|
||||||
|
```
|
||||||
|
./styli.sh -n -m
|
||||||
|
```
|
||||||
|
|
||||||
|
从一个目录中选择一个随机的背景:
|
||||||
|
|
||||||
|
```
|
||||||
|
./styli.sh -d /path/to/dir
|
||||||
|
```
|
||||||
|
|
||||||
|
### 最后说明
|
||||||
|
|
||||||
|
这是一个独特且方便的脚本,内存占用小,可以直接在一个时间间隔内比如一个小时获取图片。让你的桌面看起来 [新鲜且高效][4]。如果你不喜欢这些壁纸,你可以简单地从终端再次运行脚本来循环使用。
|
||||||
|
|
||||||
|
你喜欢这个脚本吗?或者你知道有什么像这样的壁纸切换器吗?请在下面的评论栏里告诉我。
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
via: https://www.debugpoint.com/2021/08/change-wallpaper-every-hour/
|
||||||
|
|
||||||
|
作者:[Arindam][a]
|
||||||
|
选题:[lujun9972][b]
|
||||||
|
译者:[geekpi](https://github.com/geekpi)
|
||||||
|
校对:[wxy](https://github.com/wxy)
|
||||||
|
|
||||||
|
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||||
|
|
||||||
|
[a]: https://www.debugpoint.com/author/admin1/
|
||||||
|
[b]: https://github.com/lujun9972
|
||||||
|
[1]: https://github.com/thevinter/styli.sh
|
||||||
|
[2]: https://feh.finalrewind.org/
|
||||||
|
[3]: https://www.debugpoint.com/blog/wp-content/uploads/2021/08/Change-your-Linux-Desktop-Wallpaper-Every-Hour-using-styli.sh_.jpg
|
||||||
|
[4]: https://www.debugpoint.com/category/themes
|
@ -0,0 +1,188 @@
|
|||||||
|
[#]: subject: "Monitor your Linux system in your terminal with procps-ng"
|
||||||
|
[#]: via: "https://opensource.com/article/21/8/linux-procps-ng"
|
||||||
|
[#]: author: "Seth Kenlon https://opensource.com/users/seth"
|
||||||
|
[#]: collector: "lujun9972"
|
||||||
|
[#]: translator: "geekpi"
|
||||||
|
[#]: reviewer: "wxy"
|
||||||
|
[#]: publisher: "wxy"
|
||||||
|
[#]: url: "https://linux.cn/article-13713-1.html"
|
||||||
|
|
||||||
|
在终端监控你的 Linux 系统
|
||||||
|
======
|
||||||
|
|
||||||
|
> 如何找到一个程序的进程 ID(PID)。最常见的 Linux 工具是由 procps-ng 包提供的,包括 `ps`、`pstree`、`pidof` 和 `pgrep` 命令。
|
||||||
|
|
||||||
|
![](https://img.linux.net.cn/data/attachment/album/202108/24/092948gyyv6nvbn77x7y6o.jpg)
|
||||||
|
|
||||||
|
在 [POSIX][2] 术语中,<ruby>进程<rt>process</rt></ruby>是一个正在进行的事件,由操作系统的内核管理。当你启动一个应用时就会产生一个进程,尽管还有许多其他的进程在你的计算机后台运行,包括保持系统时间准确的程序、监测新的文件系统、索引文件,等等。
|
||||||
|
|
||||||
|
大多数操作系统都有某种类型的系统活动监视器,因此你可以了解在任何特定时刻有哪些进程在运行。Linux 有一些供你选择,包括 GNOME 系统监视器和 KSysGuard。这两个软件在桌面环境都很有用,但 Linux 也提供了在终端监控系统的能力。不管你选择哪一种,对于那些积极管理自己电脑的人来说,检查一个特定的进程是一项常见的任务。
|
||||||
|
|
||||||
|
在这篇文章中,我演示了如何找到一个程序的进程 ID(PID)。最常见的工具是由 [procps-ng][3] 包提供的,包括 `ps`、`pstree`、`pidof` 和 `pgrep` 命令。
|
||||||
|
|
||||||
|
### 查找一个正在运行的程序的 PID
|
||||||
|
|
||||||
|
有时你想得到一个你知道正在运行的特定程序的进程 ID(PID)。`pidof` 和 `pgrep` 命令可以通过命令名称查找进程。
|
||||||
|
|
||||||
|
`pidof` 命令返回一个命令的 PID,它按名称搜索确切的命令:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ pidof bash
|
||||||
|
1776 5736
|
||||||
|
```
|
||||||
|
|
||||||
|
`pgrep` 命令允许使用正则表达式:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ pgrep .sh
|
||||||
|
1605
|
||||||
|
1679
|
||||||
|
1688
|
||||||
|
1776
|
||||||
|
2333
|
||||||
|
5736
|
||||||
|
$ pgrep bash
|
||||||
|
5736
|
||||||
|
```
|
||||||
|
|
||||||
|
### 通过文件查找 PID
|
||||||
|
|
||||||
|
你可以用 `fuser` 命令找到使用特定文件的进程的 PID。
|
||||||
|
|
||||||
|
```
|
||||||
|
$ fuser --user ~/example.txt
|
||||||
|
/home/tux/example.txt: 3234(tux)
|
||||||
|
```
|
||||||
|
|
||||||
|
### 通过 PID 获得进程名称
|
||||||
|
|
||||||
|
如果你有一个进程的 PID 编号,但没有生成它的命令,你可以用 `ps` 做一个“反向查找”:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ ps 3234
|
||||||
|
PID TTY STAT TIME COMMAND
|
||||||
|
5736 pts/1 Ss 0:00 emacs
|
||||||
|
```
|
||||||
|
|
||||||
|
### 列出所有进程
|
||||||
|
|
||||||
|
`ps` 命令列出进程。你可以用 `-e` 选项列出你系统上的每一个进程:
|
||||||
|
|
||||||
|
```
|
||||||
|
PID TTY TIME CMD
|
||||||
|
1 ? 00:00:03 systemd
|
||||||
|
2 ? 00:00:00 kthreadd
|
||||||
|
3 ? 00:00:00 rcu_gp
|
||||||
|
4 ? 00:00:00 rcu_par_gp
|
||||||
|
6 ? 00:00:00 kworker/0:0H-events_highpri
|
||||||
|
[...]
|
||||||
|
5648 ? 00:00:00 gnome-control-c
|
||||||
|
5656 ? 00:00:00 gnome-terminal-
|
||||||
|
5736 pts/1 00:00:00 bash
|
||||||
|
5791 pts/1 00:00:00 ps
|
||||||
|
5792 pts/1 00:00:00 less
|
||||||
|
(END)
|
||||||
|
```
|
||||||
|
|
||||||
|
### 只列出你的进程
|
||||||
|
|
||||||
|
`ps -e` 的输出可能会让人不知所措,所以使用 `-U` 来查看一个用户的进程:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ ps -U tux | less
|
||||||
|
PID TTY TIME CMD
|
||||||
|
3545 ? 00:00:00 systemd
|
||||||
|
3548 ? 00:00:00 (sd-pam)
|
||||||
|
3566 ? 00:00:18 pulseaudio
|
||||||
|
3570 ? 00:00:00 gnome-keyring-d
|
||||||
|
3583 ? 00:00:00 dbus-daemon
|
||||||
|
3589 tty2 00:00:00 gdm-wayland-ses
|
||||||
|
3592 tty2 00:00:00 gnome-session-b
|
||||||
|
3613 ? 00:00:00 gvfsd
|
||||||
|
3618 ? 00:00:00 gvfsd-fuse
|
||||||
|
3665 tty2 00:01:03 gnome-shell
|
||||||
|
[...]
|
||||||
|
```
|
||||||
|
|
||||||
|
这样就减少了 200 个(可能是 100 个,取决于你运行的系统)需要分类的进程。
|
||||||
|
|
||||||
|
你可以用 `pstree` 命令以不同的格式查看同样的输出:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ pstree -U tux -u --show-pids
|
||||||
|
[...]
|
||||||
|
├─gvfsd-metadata(3921)─┬─{gvfsd-metadata}(3923)
|
||||||
|
│ └─{gvfsd-metadata}(3924)
|
||||||
|
├─ibus-portal(3836)─┬─{ibus-portal}(3840)
|
||||||
|
│ └─{ibus-portal}(3842)
|
||||||
|
├─obexd(5214)
|
||||||
|
├─pulseaudio(3566)─┬─{pulseaudio}(3640)
|
||||||
|
│ ├─{pulseaudio}(3649)
|
||||||
|
│ └─{pulseaudio}(5258)
|
||||||
|
├─tracker-store(4150)─┬─{tracker-store}(4153)
|
||||||
|
│ ├─{tracker-store}(4154)
|
||||||
|
│ ├─{tracker-store}(4157)
|
||||||
|
│ └─{tracker-store}(4178)
|
||||||
|
└─xdg-permission-(3847)─┬─{xdg-permission-}(3848)
|
||||||
|
└─{xdg-permission-}(3850)
|
||||||
|
```
|
||||||
|
|
||||||
|
### 列出进程的上下文
|
||||||
|
|
||||||
|
你可以用 `-u` 选项查看你拥有的所有进程的额外上下文。
|
||||||
|
|
||||||
|
```
|
||||||
|
$ ps -U tux -u
|
||||||
|
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
|
||||||
|
tux 3545 0.0 0.0 89656 9708 ? Ss 13:59 0:00 /usr/lib/systemd/systemd --user
|
||||||
|
tux 3548 0.0 0.0 171416 5288 ? S 13:59 0:00 (sd-pam)
|
||||||
|
tux 3566 0.9 0.1 1722212 17352 ? S<sl 13:59 0:29 /usr/bin/pulseaudio [...]
|
||||||
|
tux 3570 0.0 0.0 664736 8036 ? SLl 13:59 0:00 /usr/bin/gnome-keyring-daemon [...]
|
||||||
|
[...]
|
||||||
|
tux 5736 0.0 0.0 235628 6036 pts/1 Ss 14:18 0:00 bash
|
||||||
|
tux 6227 0.0 0.4 2816872 74512 tty2 Sl+14:30 0:00 /opt/firefox/firefox-bin [...]
|
||||||
|
tux 6660 0.0 0.0 268524 3996 pts/1 R+ 14:50 0:00 ps -U tux -u
|
||||||
|
tux 6661 0.0 0.0 219468 2460 pts/1 S+ 14:50 0:00 less
|
||||||
|
```
|
||||||
|
|
||||||
|
### 用 PID 排除故障
|
||||||
|
|
||||||
|
如果你在某个特定的程序上有问题,或者你只是好奇某个程序在你的系统上还使用了什么资源,你可以用 `pmap` 查看运行中的进程的内存图。
|
||||||
|
|
||||||
|
```
|
||||||
|
$ pmap 1776
|
||||||
|
5736: bash
|
||||||
|
000055f9060ec000 1056K r-x-- bash
|
||||||
|
000055f9063f3000 16K r---- bash
|
||||||
|
000055f906400000 40K rw--- [ anon ]
|
||||||
|
00007faf0fa67000 9040K r--s- passwd
|
||||||
|
00007faf1033b000 40K r-x-- libnss_sss.so.2
|
||||||
|
00007faf10345000 2044K ----- libnss_sss.so.2
|
||||||
|
00007faf10545000 4K rw--- libnss_sss.so.2
|
||||||
|
00007faf10546000 212692K r---- locale-archive
|
||||||
|
00007faf1d4fb000 1776K r-x-- libc-2.28.so
|
||||||
|
00007faf1d6b7000 2044K ----- libc-2.28.so
|
||||||
|
00007faf1d8ba000 8K rw--- libc-2.28.so
|
||||||
|
[...]
|
||||||
|
```
|
||||||
|
|
||||||
|
### 处理进程 ID
|
||||||
|
|
||||||
|
procps-ng 软件包有你需要的所有命令,以调查和监控你的系统在任何时候的使用情况。无论你是对 Linux 系统中各个分散的部分如何结合在一起感到好奇,还是要对一个错误进行调查,或者你想优化你的计算机的性能,学习这些命令都会为你了解你的操作系统提供一个重要的优势。
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
via: https://opensource.com/article/21/8/linux-procps-ng
|
||||||
|
|
||||||
|
作者:[Seth Kenlon][a]
|
||||||
|
选题:[lujun9972][b]
|
||||||
|
译者:[geekpi](https://github.com/geekpi)
|
||||||
|
校对:[wxy](https://github.com/wxy)
|
||||||
|
|
||||||
|
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||||
|
|
||||||
|
[a]: https://opensource.com/users/seth
|
||||||
|
[b]: https://github.com/lujun9972
|
||||||
|
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/system-monitor-splash.png?itok=0UqsjuBQ (System monitor)
|
||||||
|
[2]: https://opensource.com/article/19/7/what-posix-richard-stallman-explains
|
||||||
|
[3]: https://gitlab.com/procps-ng
|
@ -3,58 +3,54 @@
|
|||||||
[#]: author: "Kenneth Aaron https://opensource.com/users/flyingrhino"
|
[#]: author: "Kenneth Aaron https://opensource.com/users/flyingrhino"
|
||||||
[#]: collector: "lujun9972"
|
[#]: collector: "lujun9972"
|
||||||
[#]: translator: "geekpi"
|
[#]: translator: "geekpi"
|
||||||
[#]: reviewer: " "
|
[#]: reviewer: "wxy"
|
||||||
[#]: publisher: " "
|
[#]: publisher: "wxy"
|
||||||
[#]: url: " "
|
[#]: url: "https://linux.cn/article-13704-1.html"
|
||||||
|
|
||||||
用 LVM 安装 Linux
|
在 LVM 上安装 Linux Mint
|
||||||
======
|
======
|
||||||
一个关于让 Linux Mint 20.2 与逻辑卷管理器(LVM)一起工作的教程。
|
|
||||||
![Linux keys on the keyboard for a desktop computer][1]
|
|
||||||
|
|
||||||
几周前,[Linux Mint][2] 的人员发布了他们的开源操作系统的 20.2 版本。Live ISO 中内置的安装程序非常好,只需要点击几下就可以安装操作系统。如果你想定制你的分区,你甚至有一个内置的分区器。
|
> 一个关于让 Linux Mint 20.2 与逻辑卷管理器(LVM)一起工作的教程。
|
||||||
|
|
||||||
安装程序主要集中在简单的安装上:定义你的分区并安装到这些分区。对于那些想要更灵活的设置的人来说,[逻辑卷管理器][3] (LVM)是个不错的选择,你可以通过设置卷组并在其中定义你的逻辑卷。
|
![](https://img.linux.net.cn/data/attachment/album/202108/21/104418yg111cba52caalc5.jpg)
|
||||||
|
|
||||||
LVM 是一个硬盘管理系统,允许你在多个物理驱动器上创建存储空间。换句话说,你可以把几个小驱动器“拴”在一起,这样你的操作系统就会把它们当作一个驱动器。除此之外,它还有实时调整大小、文件系统快照和更多的优点。这篇文章并不是关于 LVM 的教程(网上已经有很多[这方面不错的信息][4]了)。 相反,我的目标是保持这个页面的主题,只关注让 Linux Mint 20.2 与 LVM 一起工作。
|
几周前,[Linux Mint][2] 的人员发布了他们的开源操作系统的 20.2 版本。Live ISO 中内置的安装程序非常好,只需要点击几下就可以安装操作系统。如果你想定制你的分区,你甚至有一个内置的分区软件。
|
||||||
|
|
||||||
作为一个桌面操作系统,安装程序很简单,在 LVM 上安装 LM 20.2 略微复杂一些,但不会太复杂。如果你在安装程序中选择了 LVM,你会得到一个由 Linux Mint 开发者定义的设置,而且你在安装时无法控制各个卷。
|
安装程序重点关注在简单的安装上:定义你的分区并安装到这些分区。对于那些想要更灵活的设置的人来说,<ruby>[逻辑卷管理器][3]<rt>logical volume manager</rt></ruby>(LVM)是个不错的选择,你可以通过设置卷组(VG)并在其中定义你的逻辑卷(LV)。
|
||||||
|
|
||||||
然而,有一个解决方案:在 Live ISO 中,该方案只需要在终端中的几个命令来设置 LVM,然后你继续使用常规安装程序来完成工作。
|
LVM 是一个硬盘管理系统,允许你在多个物理驱动器上创建存储空间。换句话说,你可以把几个小驱动器“拴”在一起,这样你的操作系统就会把它们当作一个驱动器。除此之外,它还有实时调整大小、文件系统快照和更多的优点。这篇文章并不是关于 LVM 的教程(网上已经有很多 [这方面不错的信息][4]了)。相反,我的目标是贴合这篇文章的主题,只关注让 Linux Mint 20.2 与 LVM 一起工作。
|
||||||
|
|
||||||
我安装了 Linux Mint 20.2 和 [XFCE 桌面][5],但其他 LM 桌面的过程也类似。
|
作为一个桌面操作系统,其安装程序致力于简单化,在 LVM 上安装 Linux Mint 20.2 会略微复杂一些,但不会太复杂。如果你在安装程序中选择了 LVM,你会得到一个由 Linux Mint 开发者定义的设置,而且你在安装时无法控制各个卷。
|
||||||
|
|
||||||
|
然而,有一个解决方案:在临场 ISO 中,该方案只需要在终端中使用几个命令来设置 LVM,然后你可以继续使用常规安装程序来完成工作。
|
||||||
|
|
||||||
|
我安装了 Linux Mint 20.2 和 [XFCE 桌面][5],但其他 Linux Mint 桌面的过程也类似。
|
||||||
|
|
||||||
### 分区驱动器
|
### 分区驱动器
|
||||||
|
|
||||||
在 Linux Mint live ISO 中,你可以通过终端和 GUI 工具访问 Linux 命令行工具。如果你需要做任何分区工作,你可以使用命令行 `fdisk` 或 `parted` 命令,或者 GUI 应用 `gparted`。我想让这些说明简单到任何人都能遵循,所以我会在可能的情况下使用 GUI 工具,在必要时使用命令行工具。
|
在 Linux Mint 临场 ISO 中,你可以通过终端和 GUI 工具访问 Linux 命令行工具。如果你需要做任何分区工作,你可以使用命令行 `fdisk` 或 `parted` 命令,或者 GUI 应用 `gparted`。我想让这些操作简单到任何人都能遵循,所以我会在可能的情况下使用 GUI 工具,在必要时使用命令行工具。
|
||||||
|
|
||||||
首先,为安装创建几个分区。
|
首先,为安装创建几个分区。
|
||||||
|
|
||||||
使用 `gparted` (从菜单中启动),完成以下工作:
|
使用 `gparted`(从菜单中启动),完成以下工作:
|
||||||
|
|
||||||
首先,创建一个 512MB 的分区,类型为 **FAT32**(这是用来确保系统可启动)。512MB 对大多数人来说是多余的,你可以用 256MB 甚至更少,但在今天的大磁盘中,即使分配 512MB 也不是什么大问题。
|
首先,创建一个 512MB 的分区,类型为 FAT32(这是用来确保系统可启动)。512MB 对大多数人来说是富余的,你可以用 256MB 甚至更少,但在今天的大容量磁盘中,即使分配 512MB 也不是什么大问题。
|
||||||
|
|
||||||
![Creating a boot partition][6]
|
![Creating a boot partition][6]
|
||||||
|
|
||||||
CC BY-SA Seth Kenlon
|
接下来,在磁盘的其余部分创建一个 `lvm2 pv` 类型(LVM 2 物理卷)的分区(这是你的 LVM 的位置)。
|
||||||
|
|
||||||
接下来,在磁盘的其余部分创建一个 `lvm2 pv` 类型的分区(这是你的 LVM 的位置)。
|
|
||||||
|
|
||||||
![Partition layout][7]
|
![Partition layout][7]
|
||||||
|
|
||||||
CC BY-SA Seth Kenlon
|
|
||||||
|
|
||||||
现在打开一个终端窗口,并将你的权限提升到 root:
|
现在打开一个终端窗口,并将你的权限提升到 root:
|
||||||
|
|
||||||
|
|
||||||
```
|
```
|
||||||
$ sudo -s
|
$ sudo -s
|
||||||
# whoami
|
# whoami
|
||||||
root
|
root
|
||||||
```
|
```
|
||||||
|
|
||||||
接下来,你必须找到你之前创建的 LVM 成员(大分区)。使用下列命令之一: `lsblk -f` 或 `pvs` 或 `pvscan`。
|
接下来,你必须找到你之前创建的 LVM 成员(那个大分区)。使用下列命令之一:`lsblk -f` 或 `pvs` 或 `pvscan`。
|
||||||
|
|
||||||
|
|
||||||
```
|
```
|
||||||
# pvs
|
# pvs
|
||||||
@ -64,42 +60,37 @@ PV VG Fmt [...]
|
|||||||
|
|
||||||
在我的例子中,该分区位于 `/dev/sda2`,但你应该用你的输出中得到的内容来替换它。
|
在我的例子中,该分区位于 `/dev/sda2`,但你应该用你的输出中得到的内容来替换它。
|
||||||
|
|
||||||
现在你知道了你的分区有哪些设备,你可以在那里创建一个 LVM 卷组:
|
现在你知道了你的分区有哪些设备,你可以在那里创建一个 LVM 卷组(VG):
|
||||||
|
|
||||||
|
|
||||||
```
|
```
|
||||||
`# vgcreate vg /dev/sda2`
|
# vgcreate vg /dev/sda2
|
||||||
```
|
```
|
||||||
|
|
||||||
你可以使用 `vgs` 或 `vgscan` 看到你创建的卷组的细节。
|
你可以使用 `vgs` 或 `vgscan` 看到你创建的卷组的细节。
|
||||||
|
|
||||||
创建你想在安装时使用的逻辑卷。为了简单,我分别创建了根分区(`/`)和 `swap` 分区,但是你可以根据需要创建更多的分区(例如,为 `/home` 创建一个单独的分区)。
|
创建你想在安装时使用的逻辑卷(LV)。为了简单,我分别创建了 `root` 根分区(`/`)和 `swap` 交换分区,但是你可以根据需要创建更多的分区(例如,为 `/home` 创建一个单独的分区)。
|
||||||
|
|
||||||
|
|
||||||
```
|
```
|
||||||
# lvcreate -L 80G -n root vg
|
# lvcreate -L 80G -n root vg
|
||||||
# lvcreate -L 16G -n swap vg
|
# lvcreate -L 16G -n swap vg
|
||||||
```
|
```
|
||||||
|
|
||||||
我的例子中的分区大小是任意的,是基于我可用的。使用对你的硬盘有意义的分区大小。
|
我的例子中的分区大小是任意的,是基于我可用的空间。使用对你的硬盘有意义的分区大小。
|
||||||
|
|
||||||
你可以用 `lvs` 或 `lvdisplay` 查看逻辑卷。
|
你可以用 `lvs` 或 `lvdisplay` 查看逻辑卷。
|
||||||
|
|
||||||
终端到这就结束了。
|
终端操作到这就结束了。
|
||||||
|
|
||||||
### 安装 Linux
|
### 安装 Linux
|
||||||
|
|
||||||
现在从桌面上的图标启动安装程序:
|
现在从桌面上的图标启动安装程序:
|
||||||
|
|
||||||
* 进入 **Installation type**,选择 **Something else**。
|
* 进入 “Installation type”,选择 “Something else”。
|
||||||
* 编辑 512Mb 的分区并将其改为 `EFI`。
|
* 编辑 512Mb 的分区并将其改为 `EFI`。
|
||||||
* 编辑根 LV,将其改为 `ext4`(或一个你选择的文件系统)。选择将其挂载为根目录,并选择将其格式化。
|
* 编辑根逻辑卷,将其改为 `ext4`(或一个你选择的文件系统)。选择将其挂载为根目录(`/`),并选择将其格式化。
|
||||||
* 编辑交换分区并将其设置为`swap`。
|
* 编辑 `swap` 分区并将其设置为交换分区。
|
||||||
* 继续正常的安装过程。Linux Mint 安装程序会将文件放在正确的位置并为你创建挂载点。
|
* 继续正常的安装过程。Linux Mint 安装程序会将文件放在正确的位置并为你创建挂载点。
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
完成了。在你的 Linux Mint 安装中享受 LVM 的强大。
|
完成了。在你的 Linux Mint 安装中享受 LVM 的强大。
|
||||||
|
|
||||||
如果你需要调整分区大小或在系统上做任何高级工作,你会感谢选择 LVM。
|
如果你需要调整分区大小或在系统上做任何高级工作,你会感谢选择 LVM。
|
||||||
@ -111,7 +102,7 @@ via: https://opensource.com/article/21/8/install-linux-mint-lvm
|
|||||||
作者:[Kenneth Aaron][a]
|
作者:[Kenneth Aaron][a]
|
||||||
选题:[lujun9972][b]
|
选题:[lujun9972][b]
|
||||||
译者:[geekpi](https://github.com/geekpi)
|
译者:[geekpi](https://github.com/geekpi)
|
||||||
校对:[校对者ID](https://github.com/校对者ID)
|
校对:[wxy](https://github.com/wxy)
|
||||||
|
|
||||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||||
|
|
@ -3,14 +3,16 @@
|
|||||||
[#]: author: "Seth Kenlon https://opensource.com/users/seth"
|
[#]: author: "Seth Kenlon https://opensource.com/users/seth"
|
||||||
[#]: collector: "lujun9972"
|
[#]: collector: "lujun9972"
|
||||||
[#]: translator: "unigeorge"
|
[#]: translator: "unigeorge"
|
||||||
[#]: reviewer: " "
|
[#]: reviewer: "wxy"
|
||||||
[#]: publisher: " "
|
[#]: publisher: "wxy"
|
||||||
[#]: url: " "
|
[#]: url: "https://linux.cn/article-13699-1.html"
|
||||||
|
|
||||||
使用 commons-cli 解析 Java 中的命令行选项
|
使用 commons-cli 解析 Java 中的命令行选项
|
||||||
======
|
======
|
||||||
让用户学会用命令行选项调整你的 Java 应用程序运行方式。
|
|
||||||
![Learning and studying technology is the key to success][1]
|
> 让用户用命令行选项调整你的 Java 应用程序运行方式。
|
||||||
|
|
||||||
|
![](https://img.linux.net.cn/data/attachment/album/202108/19/115907lvjwc1ce5avumaau.jpg)
|
||||||
|
|
||||||
通常向终端中输入命令时,无论是启动 GUI 应用程序还是仅启动终端应用程序,都可以使用
|
通常向终端中输入命令时,无论是启动 GUI 应用程序还是仅启动终端应用程序,都可以使用
|
||||||
<ruby>
|
<ruby>
|
||||||
@ -22,13 +24,13 @@ Java 中有若干种解析选项的方法,其中我最喜欢用的是 [Apache
|
|||||||
|
|
||||||
### 安装 commons-cli
|
### 安装 commons-cli
|
||||||
|
|
||||||
如果你使用类似 [Maven][5] 之类的项目管理系统以及集成开发环境(Integrated Development Environment,简称IDE),可以在项目属性(比如 `pom.xml` 配置文件或者 Eclipse 和 NetBeans 的配置选项卡)中安装 Apache Commons CLI 库。
|
如果你使用类似 [Maven][5] 之类的项目管理系统以及<ruby>集成开发环境<rt>Integrated Development Environment</rt></ruby>(简称 IDE),可以在项目属性(比如 `pom.xml` 配置文件或者 Eclipse 和 NetBeans 的配置选项卡)中安装 Apache Commons CLI 库。
|
||||||
|
|
||||||
而如果你采用手动方式管理库,则可以从 Apache 网站下载 [该库的最新版本][6]。下载到本地的是几个捆绑在一起的 JAR 文件,你只需要其中的一个文件 `commons-cli-X.Y.jar`(其中 X 和 Y 代指最新版本号)。把这个 JAR 文件或手动或使用 IDE 添加到项目,就可以在代码中使用了。
|
而如果你采用手动方式管理库,则可以从 Apache 网站下载 [该库的最新版本][6]。下载到本地的是几个捆绑在一起的 JAR 文件,你只需要其中的一个文件 `commons-cli-X.Y.jar`(其中 X 和 Y 代指最新版本号)。把这个 JAR 文件或手动或使用 IDE 添加到项目,就可以在代码中使用了。
|
||||||
|
|
||||||
### 将库导入至 Java 代码
|
### 将库导入至 Java 代码
|
||||||
|
|
||||||
在使用 **commons-cli** 库之前,必须首先导入它。对于本次选项解析的简单示例而言,可以先在 `Main.java` 文件中简单写入以下标准代码:
|
在使用 `commons-cli` 库之前,必须首先导入它。对于本次选项解析的简单示例而言,可以先在 `Main.java` 文件中简单写入以下标准代码:
|
||||||
|
|
||||||
```
|
```
|
||||||
package com.opensource.myoptparser;
|
package com.opensource.myoptparser;
|
||||||
@ -36,7 +38,7 @@ package com.opensource.myoptparser;
|
|||||||
import org.apache.commons.cli.*;
|
import org.apache.commons.cli.*;
|
||||||
|
|
||||||
public class Main {
|
public class Main {
|
||||||
public static void main([String][7][] args) {
|
public static void main(String[] args) {
|
||||||
// code
|
// code
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -55,20 +57,20 @@ public class Main {
|
|||||||
Options options = new Options();
|
Options options = new Options();
|
||||||
```
|
```
|
||||||
|
|
||||||
接下来,通过列出短选项(即选项名简写)、长选项(即全写)、默认布尔值(译注:设置是否需要选项参数,指定为 false 时此选项不带参,即为布尔选项)和帮助信息来定义选项,然后设置该选项是否为必需项(译注:下方创建 `alpha` 对象的代码中未手动设置此项),最后将该选项添加到包含所有选项的 `options` 组对象中。在下面几行代码中,我只创建了一个选项,命名为 `alpha`:
|
接下来,通过列出短选项(即选项名简写)、长选项(即全写)、默认布尔值(LCTT 译注:设置是否需要选项参数,指定为 `false` 时此选项不带参,即为布尔选项)和帮助信息来定义选项,然后设置该选项是否为必需项(LCTT 译注:下方创建 `alpha` 对象的代码中未手动设置此项),最后将该选项添加到包含所有选项的 `options` 组对象中。在下面几行代码中,我只创建了一个选项,命名为 `alpha`:
|
||||||
|
|
||||||
```
|
```
|
||||||
//define options
|
//define options
|
||||||
[Option][8] alpha = new [Option][8]("a", "alpha", false, "Activate feature alpha");
|
Option alpha = new Option("a", "alpha", false, "Activate feature alpha");
|
||||||
options.addOption(alpha);
|
options.addOption(alpha);
|
||||||
```
|
```
|
||||||
|
|
||||||
### 在 Java 中定义带参选项
|
### 在 Java 中定义带参选项
|
||||||
|
|
||||||
有时用户需要通过选项提供 **true** 或 **false** 以外的信息,比如给出配置文件、输入文件或诸如日期、颜色这样的设置项值。这种情况可以使用 `builder` 方法,根据选项名简写为其创建属性(例如,`-c` 是短选项,`--config` 是长选项)。完成定义后,再将定义好的选项添加到 `options` 组中:
|
有时用户需要通过选项提供 `true` 或 `false` 以外的信息,比如给出配置文件、输入文件或诸如日期、颜色这样的设置项值。这种情况可以使用 `builder` 方法,根据选项名简写为其创建属性(例如,`-c` 是短选项,`--config` 是长选项)。完成定义后,再将定义好的选项添加到 `options` 组中:
|
||||||
|
|
||||||
```
|
```
|
||||||
[Option][8] config = [Option][8].builder("c").longOpt("config")
|
Option config = Option.builder("c").longOpt("config")
|
||||||
.argName("config")
|
.argName("config")
|
||||||
.hasArg()
|
.hasArg()
|
||||||
.required(true)
|
.required(true)
|
||||||
@ -76,11 +78,11 @@ public class Main {
|
|||||||
options.addOption(config);
|
options.addOption(config);
|
||||||
```
|
```
|
||||||
|
|
||||||
`builder`函数可以用来设置短选项、长选项、是否为必需项(本段代码中必需项设置为 **true**,也就意味着用户启动程序时必须提供此选项,否则应用程序无法运行)、帮助信息等。
|
`builder` 函数可以用来设置短选项、长选项、是否为必需项(本段代码中必需项设置为 `true`,也就意味着用户启动程序时必须提供此选项,否则应用程序无法运行)、帮助信息等。
|
||||||
|
|
||||||
### 使用 Java 解析选项
|
### 使用 Java 解析选项
|
||||||
|
|
||||||
定义并添加所有可能用到的选项后,需要对用户提供的参数进行迭代处理,检测是否有参数同预设的有效短选项列表中的内容相匹配。为此要创建 **CommandLine** 命令行本身的一个实例,其中包含用户提供的所有参数(包含有效选项和无效选项)。为了处理这些参数,还要创建一个 **CommandLineParser** 对象,我在代码中将其命名为 `parser`。最后,还可以创建一个 **HelpFormatter** 对象(我将其命名为 `helper`),当参数中缺少某些必需项或者用户使用 `--help` 或 `-h` 选项时,此对象可以自动向用户提供一些有用的信息。
|
定义并添加所有可能用到的选项后,需要对用户提供的参数进行迭代处理,检测是否有参数同预设的有效短选项列表中的内容相匹配。为此要创建命令行 `CommandLine` 本身的一个实例,其中包含用户提供的所有参数(包含有效选项和无效选项)。为了处理这些参数,还要创建一个 `CommandLineParser` 对象,我在代码中将其命名为 `parser`。最后,还可以创建一个 `HelpFormatter` 对象(我将其命名为 `helper`),当参数中缺少某些必需项或者用户使用 `--help` 或 `-h` 选项时,此对象可以自动向用户提供一些有用的信息。
|
||||||
|
|
||||||
```
|
```
|
||||||
// define parser
|
// define parser
|
||||||
@ -93,23 +95,23 @@ public class Main {
|
|||||||
|
|
||||||
```
|
```
|
||||||
try {
|
try {
|
||||||
cmd = parser.parse(options, args);
|
cmd = parser.parse(options, args);
|
||||||
if(cmd.hasOption("a")) {
|
if(cmd.hasOption("a")) {
|
||||||
[System][9].out.println("Alpha activated");
|
System.out.println("Alpha activated");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cmd.hasOption("c")) {
|
if (cmd.hasOption("c")) {
|
||||||
[String][7] opt_config = cmd.getOptionValue("config");
|
String opt_config = cmd.getOptionValue("config");
|
||||||
[System][9].out.println("Config set to " + opt_config);
|
System.out.println("Config set to " + opt_config);
|
||||||
}
|
}
|
||||||
} catch ([ParseException][10] e) {
|
} catch (ParseException e) {
|
||||||
[System][9].out.println(e.getMessage());
|
System.out.println(e.getMessage());
|
||||||
helper.printHelp("Usage:", options);
|
helper.printHelp("Usage:", options);
|
||||||
[System][9].exit(0);
|
System.exit(0);
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
解析过程有可能会产生错误,因为有时可能缺少某些必需项如本例中的 `-c` 或 `--config` 选项。这时程序会打印一条帮助信息,并立即结束运行。考虑到此错误(Java 术语中称为 _exception_,异常),在 main 方法的开头要添加语句声明可能的异常:
|
解析过程有可能会产生错误,因为有时可能缺少某些必需项如本例中的 `-c` 或 `--config` 选项。这时程序会打印一条帮助信息,并立即结束运行。考虑到此错误(Java 术语中称为异常),在 `main` 方法的开头要添加语句声明可能的异常:
|
||||||
|
|
||||||
|
|
||||||
```
|
```
|
||||||
@ -146,53 +148,52 @@ Config set to foo
|
|||||||
|
|
||||||
以下是完整的演示代码,供读者参考:
|
以下是完整的演示代码,供读者参考:
|
||||||
|
|
||||||
|
|
||||||
```
|
```
|
||||||
package com.opensource.myapp;
|
package com.opensource.myapp;
|
||||||
|
|
||||||
import org.apache.commons.cli.*;
|
import org.apache.commons.cli.*;
|
||||||
|
|
||||||
public class Main {
|
public class Main {
|
||||||
|
|
||||||
/**
|
|
||||||
* @param args the command line arguments
|
|
||||||
* @throws org.apache.commons.cli.ParseException
|
|
||||||
*/
|
|
||||||
public static void main([String][7][] args) throws [ParseException][10] {
|
|
||||||
// define options
|
|
||||||
Options options = new Options();
|
|
||||||
|
|
||||||
[Option][8] alpha = new [Option][8]("a", "alpha", false, "Activate feature alpha");
|
|
||||||
options.addOption(alpha);
|
|
||||||
|
|
||||||
[Option][8] config = [Option][8].builder("c").longOpt("config")
|
|
||||||
.argName("config")
|
|
||||||
.hasArg()
|
|
||||||
.required(true)
|
|
||||||
.desc("Set config file").build();
|
|
||||||
options.addOption(config);
|
|
||||||
|
|
||||||
// define parser
|
|
||||||
CommandLine cmd;
|
|
||||||
CommandLineParser parser = new BasicParser();
|
|
||||||
HelpFormatter helper = new HelpFormatter();
|
|
||||||
|
|
||||||
try {
|
/**
|
||||||
cmd = parser.parse(options, args);
|
* @param args the command line arguments
|
||||||
if(cmd.hasOption("a")) {
|
* @throws org.apache.commons.cli.ParseException
|
||||||
[System][9].out.println("Alpha activated");
|
*/
|
||||||
}
|
public static void main(String[] args) throws ParseException {
|
||||||
|
// define options
|
||||||
if (cmd.hasOption("c")) {
|
Options options = new Options();
|
||||||
[String][7] opt_config = cmd.getOptionValue("config");
|
|
||||||
[System][9].out.println("Config set to " + opt_config);
|
Option alpha = new Option("a", "alpha", false, "Activate feature alpha");
|
||||||
}
|
options.addOption(alpha);
|
||||||
} catch ([ParseException][10] e) {
|
|
||||||
[System][9].out.println(e.getMessage());
|
Option config = Option.builder("c").longOpt("config")
|
||||||
helper.printHelp("Usage:", options);
|
.argName("config")
|
||||||
[System][9].exit(0);
|
.hasArg()
|
||||||
}
|
.required(true)
|
||||||
}
|
.desc("Set config file").build();
|
||||||
|
options.addOption(config);
|
||||||
|
|
||||||
|
// define parser
|
||||||
|
CommandLine cmd;
|
||||||
|
CommandLineParser parser = new BasicParser();
|
||||||
|
HelpFormatter helper = new HelpFormatter();
|
||||||
|
|
||||||
|
try {
|
||||||
|
cmd = parser.parse(options, args);
|
||||||
|
if(cmd.hasOption("a")) {
|
||||||
|
System.out.println("Alpha activated");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cmd.hasOption("c")) {
|
||||||
|
String opt_config = cmd.getOptionValue("config");
|
||||||
|
System.out.println("Config set to " + opt_config);
|
||||||
|
}
|
||||||
|
} catch (ParseException e) {
|
||||||
|
System.out.println(e.getMessage());
|
||||||
|
helper.printHelp("Usage:", options);
|
||||||
|
System.exit(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
@ -207,7 +208,7 @@ via: https://opensource.com/article/21/8/java-commons-cli
|
|||||||
作者:[Seth Kenlon][a]
|
作者:[Seth Kenlon][a]
|
||||||
选题:[lujun9972][b]
|
选题:[lujun9972][b]
|
||||||
译者:[unigeorge](https://github.com/unigeorge)
|
译者:[unigeorge](https://github.com/unigeorge)
|
||||||
校对:[校对者ID](https://github.com/校对者ID)
|
校对:[wxy](https://github.com/wxy)
|
||||||
|
|
||||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||||
|
|
@ -4,8 +4,8 @@
|
|||||||
[#]: collector: "lujun9972"
|
[#]: collector: "lujun9972"
|
||||||
[#]: translator: "wxy"
|
[#]: translator: "wxy"
|
||||||
[#]: reviewer: "wxy"
|
[#]: reviewer: "wxy"
|
||||||
[#]: publisher: " "
|
[#]: publisher: "wxy"
|
||||||
[#]: url: " "
|
[#]: url: "https://linux.cn/article-13695-1.html"
|
||||||
|
|
||||||
新发布的 Debian 11 “Bullseye” Linux 发行版的 7 大亮点
|
新发布的 Debian 11 “Bullseye” Linux 发行版的 7 大亮点
|
||||||
======
|
======
|
@ -0,0 +1,161 @@
|
|||||||
|
[#]: subject: "Schedule a task with the Linux at command"
|
||||||
|
[#]: via: "https://opensource.com/article/21/8/linux-at-command"
|
||||||
|
[#]: author: "Seth Kenlon https://opensource.com/users/seth"
|
||||||
|
[#]: collector: "lujun9972"
|
||||||
|
[#]: translator: "geekpi"
|
||||||
|
[#]: reviewer: "wxy"
|
||||||
|
[#]: publisher: "wxy"
|
||||||
|
[#]: url: "https://linux.cn/article-13710-1.html"
|
||||||
|
|
||||||
|
用 Linux 的 at 命令来安排一个任务
|
||||||
|
======
|
||||||
|
|
||||||
|
> at 命令是一种在特定时间和日期安排一次性任务的 Linux 终端方法。
|
||||||
|
|
||||||
|
![](https://img.linux.net.cn/data/attachment/album/202108/23/144542rmmyzwxsnanm4wpj.jpg)
|
||||||
|
|
||||||
|
计算机擅长 [自动化][2],但不是每个人都知道如何使自动化工作。不过,能够在特定的时间为电脑安排一个任务,然后忘记它,这确实是一种享受。也许你有一个文件要在特定的时间上传或下载,或者你需要处理一批还不存在但可以保证在某个时间存在的文件,或者需要监控设置,或者你只是需要一个友好的提醒,在下班回家的路上买上面包和黄油。
|
||||||
|
|
||||||
|
这就是 `at` 命令的用处。
|
||||||
|
|
||||||
|
### 什么是 Linux at 命令?
|
||||||
|
|
||||||
|
`at` 命令是在 Linux 终端让你在特定时间和日期安排一次性工作的方法。它是一种自发的自动化,在终端上很容易实现。
|
||||||
|
|
||||||
|
### 安装 at
|
||||||
|
|
||||||
|
在 Linux 上,`at` 命令可能已经安装了。你可以使用 `at -V` 命令来验证它是否已经安装。只要返回一个版本号,就说明你已经安装了 `at`。
|
||||||
|
|
||||||
|
```
|
||||||
|
$ at -V
|
||||||
|
at version x.y.z
|
||||||
|
```
|
||||||
|
|
||||||
|
如果你试图使用 `at`,但没有找到该命令,大多数现代的 Linux 发行版会为你提供缺少的 `at` 软件包。
|
||||||
|
|
||||||
|
你可能还需要启动 `at` 守护程序,称为 `atd`。在大多数 Linux 系统中,你可以使用 `systemctl` 命令来启用该服务,并将它们设置为从现在开始自动启动:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ sudo systemctl enable --now atd
|
||||||
|
```
|
||||||
|
|
||||||
|
### 用 at 交互式地安排一个作业
|
||||||
|
|
||||||
|
当你使用 `at` 命令并加上你希望任务运行的时间,会打开一个交互式 `at` 提示符。你可以输入你想在指定时间运行的命令。
|
||||||
|
|
||||||
|
做个比喻,你可以把这个过程看作是一个日历应用,就像你在你的手机上使用的那样。首先,你在某一天的某个时间创建一个事件,然后指定你想要发生什么。
|
||||||
|
|
||||||
|
例如,可以试试创建一个未来几分钟的任务,来给自己计划一个备忘录。这里运行一个简单的任务,以减少失败的可能性。要退出 `at` 提示符,请按键盘上的 `Ctrl+D`。
|
||||||
|
|
||||||
|
```
|
||||||
|
$ at 11:20 AM
|
||||||
|
warning: commands will be executed using /bin/sh
|
||||||
|
at> echo "hello world" > ~/at-test.txt
|
||||||
|
at> <EOT>
|
||||||
|
job 3 at Mon Jul 26 11:20:00 2021
|
||||||
|
```
|
||||||
|
|
||||||
|
正如你所看到的,`at` 使用直观和自然的时间定义。你不需要用 24 小时制的时钟,也不需要把时间翻译成 UTC 或特定的 ISO 格式。一般来说,你可以使用你自然想到的任何符号,如 `noon`、`1:30 PM`、`13:37` 等等,来描述你希望一个任务发生的时间。
|
||||||
|
|
||||||
|
等待几分钟,然后在你创建的文件上运行 `cat` 或者 `tac` 命令,验证你的任务是否已经运行:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ cat ~/at-test.txt
|
||||||
|
hello world
|
||||||
|
```
|
||||||
|
|
||||||
|
### 用 at 安排一个任务
|
||||||
|
|
||||||
|
你不必使用 `at` 交互式提示符来安排任务。你可以使用 `echo` 或 `printf` 向它传送命令。在这个例子中,我使用了 `now` 符号,以及我希望任务从现在开始延迟多少分钟:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ echo "echo 'hello again' >> ~/at-test.txt" | at now +1 minute
|
||||||
|
```
|
||||||
|
|
||||||
|
一分钟后,验证新的命令是否已被执行:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ cat ~/at-test.txt
|
||||||
|
hello world
|
||||||
|
hello again
|
||||||
|
```
|
||||||
|
|
||||||
|
### 时间表达式
|
||||||
|
|
||||||
|
`at` 命令在解释时间时是非常宽容的。你可以在许多格式中选择,这取决于哪一种对你来说最方便:
|
||||||
|
|
||||||
|
* `YYMMDDhhmm[.ss]`(两位的年份、月、日、小时、分钟,及可选的秒)
|
||||||
|
* `CCYYMMDDhhmm[.ss]`(四位的年份、月、日、时、分钟,及可选的秒)
|
||||||
|
* `now`(现在)
|
||||||
|
* `midnight`(午夜 00:00)
|
||||||
|
* `noon`(中午 12:00)
|
||||||
|
* `teatime`(下午 16 点)
|
||||||
|
* `AM`(上午)
|
||||||
|
* `PM`(下午)
|
||||||
|
|
||||||
|
时间和日期可以是绝对时间,也可以加一个加号(`+`),使其与 `now` 相对。当指定相对时间时,你可以使用你可能用过的词语:
|
||||||
|
|
||||||
|
* `minutes`(分钟)
|
||||||
|
* `hours`(小时)
|
||||||
|
* `days`(天)
|
||||||
|
* `weeks`(星期)
|
||||||
|
* `months`(月)
|
||||||
|
* `years`(年)
|
||||||
|
|
||||||
|
### 时间和日期语法
|
||||||
|
|
||||||
|
`at` 命令对时间的输入相比日期不那么宽容。时间必须放在第一位,接着是日期,尽管日期默认为当前日期,并且只有在为未来某天安排任务时才需要。
|
||||||
|
|
||||||
|
这些是一些有效表达式的例子:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ echo "rsync -av /home/tux me@myserver:/home/tux/" | at 3:30 AM tomorrow
|
||||||
|
$ echo "/opt/batch.sh ~/Pictures" | at 3:30 AM 08/01/2022
|
||||||
|
$ echo "echo hello" | at now + 3 days
|
||||||
|
```
|
||||||
|
|
||||||
|
### 查看你的 at 队列
|
||||||
|
|
||||||
|
当你爱上了 `at`,并且正在安排任务,而不是在桌子上的废纸上乱写乱画,你可能想查看一下你是否有任务还在队列中。
|
||||||
|
|
||||||
|
要查看你的 `at` 队列,使用 `atq` 命令:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ atq
|
||||||
|
10 Thu Jul 29 12:19:00 2021 a tux
|
||||||
|
9 Tue Jul 27 03:30:00 2021 a tux
|
||||||
|
7 Tue Jul 27 00:00:00 2021 a tux
|
||||||
|
```
|
||||||
|
|
||||||
|
要从队列中删除一个任务,使用 `atrm` 命令和任务号。例如,要删除任务 7:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ atrm 7
|
||||||
|
$ atq
|
||||||
|
10 Thu Jul 29 12:19:00 2021 a tux
|
||||||
|
9 Tue Jul 27 03:30:00 2021 a tux
|
||||||
|
```
|
||||||
|
|
||||||
|
要看一个计划中的任务的实际内容,你需要查看 `/var/spool/at` 下的内容。只有 root 用户可以查看该目录的内容,所以你必须使用 `sudo` 来查看或 `cat` 任何任务的内容。
|
||||||
|
|
||||||
|
### 用 Linux at 安排任务
|
||||||
|
|
||||||
|
`at` 系统是一个很好的方法,可以避免忘记在一天中晚些时候运行一个作业,或者在你离开时让你的计算机为你运行一个作业。与 `cron` 不同的是,它不像 `cron` 那样要求任务必须从现在起一直按计划运行到永远,因此它的语法比 `cron` 简单得多。
|
||||||
|
|
||||||
|
等下次你有一个希望你的计算机记住并管理它的小任务,试试 `at` 命令。
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
via: https://opensource.com/article/21/8/linux-at-command
|
||||||
|
|
||||||
|
作者:[Seth Kenlon][a]
|
||||||
|
选题:[lujun9972][b]
|
||||||
|
译者:[geekpi](https://github.com/geekpi)
|
||||||
|
校对:[wxy](https://github.com/wxy)
|
||||||
|
|
||||||
|
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||||
|
|
||||||
|
[a]: https://opensource.com/users/seth
|
||||||
|
[b]: https://github.com/lujun9972
|
||||||
|
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/checklist_todo_clock_time_team.png?itok=1z528Q0y (Team checklist)
|
||||||
|
[2]: https://opensource.com/article/20/11/orchestration-vs-automation
|
72
published/202108/20210817 4 alternatives to cron in Linux.md
Normal file
72
published/202108/20210817 4 alternatives to cron in Linux.md
Normal file
@ -0,0 +1,72 @@
|
|||||||
|
[#]: subject: "4 alternatives to cron in Linux"
|
||||||
|
[#]: via: "https://opensource.com/article/21/7/alternatives-cron-linux"
|
||||||
|
[#]: author: "Seth Kenlon https://opensource.com/users/seth"
|
||||||
|
[#]: collector: "lujun9972"
|
||||||
|
[#]: translator: "unigeorge"
|
||||||
|
[#]: reviewer: "wxy"
|
||||||
|
[#]: publisher: "wxy"
|
||||||
|
[#]: url: "https://linux.cn/article-13716-1.html"
|
||||||
|
|
||||||
|
Linux 中 cron 系统的 4 种替代方案
|
||||||
|
======
|
||||||
|
|
||||||
|
> 在 Linux 系统中有一些其他开源项目可以结合或者替代 cron 系统使用。
|
||||||
|
|
||||||
|
![](https://img.linux.net.cn/data/attachment/album/202108/25/104033ro6lasn54lq25r2l.jpg)
|
||||||
|
|
||||||
|
[Linux cron 系统][2] 是一项经过时间检验的成熟技术,然而在任何情况下它都是最合适的系统自动化工具吗?答案是否定的。有一些开源项目就可以用来与 cron 结合或者直接代替 cron 使用。
|
||||||
|
|
||||||
|
### at 命令
|
||||||
|
|
||||||
|
cron 适用于长期重复任务。如果你设置了一个工作任务,它会从现在开始定期运行,直到计算机报废为止。但有些情况下你可能只想设置一个一次性命令,以备不在计算机旁时该命令可以自动运行。这时你可以选择使用 `at` 命令。
|
||||||
|
|
||||||
|
`at` 的语法比 cron 语法简单和灵活得多,并且兼具交互式和非交互式调度方法。(只要你想,你甚至可以使用 `at` 作业创建一个 `at` 作业。)
|
||||||
|
|
||||||
|
```
|
||||||
|
$ echo "rsync -av /home/tux/ me@myserver:/home/tux/" | at 1:30 AM
|
||||||
|
```
|
||||||
|
|
||||||
|
该命令语法自然且易用,并且不需要用户清理旧作业,因为它们一旦运行后就完全被计算机遗忘了。
|
||||||
|
|
||||||
|
阅读有关 [at 命令][3] 的更多信息并开始使用吧。
|
||||||
|
|
||||||
|
### systemd
|
||||||
|
|
||||||
|
除了管理计算机上的进程外,`systemd` 还可以帮你调度这些进程。与传统的 cron 作业一样,systemd 计时器可以在指定的时间间隔触发事件,例如 shell 脚本和命令。时间间隔可以是每月特定日期的一天一次(例如在星期一的时候触发),或者在 09:00 到 17:00 的工作时间内每 15 分钟一次。
|
||||||
|
|
||||||
|
此外 systemd 里的计时器还可以做一些 cron 作业不能做的事情。
|
||||||
|
|
||||||
|
例如,计时器可以在一个事件 _之后_ 触发脚本或程序来运行特定时长,这个事件可以是开机,可以是前置任务的完成,甚至可以是计时器本身调用的服务单元的完成!
|
||||||
|
|
||||||
|
如果你的系统运行着 systemd 服务,那么你的机器就已经在技术层面上使用 systemd 计时器了。默认计时器会执行一些琐碎的任务,例如滚动日志文件、更新 mlocate 数据库、管理 DNF 数据库等。创建自己的计时器很容易,具体可以参阅 David Both 的文章 [使用 systemd 计时器来代替 cron][4]。
|
||||||
|
|
||||||
|
### anacron 命令
|
||||||
|
|
||||||
|
cron 专门用于在特定时间运行命令,这适用于从不休眠或断电的服务器。然而对笔记本电脑和台式工作站而言,时常有意或无意地关机是很常见的。当计算机处于关机状态时,cron 不会运行,因此设定在这段时间内的一些重要工作(例如备份数据)也就会跳过执行。
|
||||||
|
|
||||||
|
anacron 系统旨在确保作业定期运行,而不是按计划时间点运行。这就意味着你可以将计算机关机几天,再次启动时仍然靠 anacron 来运行基本任务。anacron 与 cron 协同工作,因此严格来说前者不是后者的替代品,而是一种调度任务的有效可选方案。许多系统管理员配置了一个 cron 作业来在深夜备份远程工作者计算机上的数据,结果却发现该作业在过去六个月中只运行过一次。anacron 确保重要的工作在 _可执行的时候_ 发生,而不是必须在安排好的 _特定时间点_ 发生。
|
||||||
|
|
||||||
|
点击参阅关于 [使用 anacron 获得更好的 crontab 效果][5] 的更多内容。
|
||||||
|
|
||||||
|
### 自动化
|
||||||
|
|
||||||
|
计算机和技术旨在让人们的生活更美好,工作更轻松。Linux 为用户提供了许多有用的功能,以确保完成重要的操作系统任务。查看这些可用的功能,然后试着将这些功能用于你自己的工作任务吧。(LCTT 译注:作者本段有些语焉不详,读者可参阅譬如 [Ansible 自动化工具安装、配置和快速入门指南](https://linux.cn/article-13142-1.html) 等关于 Linux 自动化的文章)
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
via: https://opensource.com/article/21/7/alternatives-cron-linux
|
||||||
|
|
||||||
|
作者:[Seth Kenlon][a]
|
||||||
|
选题:[lujun9972][b]
|
||||||
|
译者:[unigeorge](https://github.com/unigeorge)
|
||||||
|
校对:[wxy](https://github.com/wxy)
|
||||||
|
|
||||||
|
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||||
|
|
||||||
|
[a]: https://opensource.com/users/seth
|
||||||
|
[b]: https://github.com/lujun9972
|
||||||
|
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/clocks_time.png?itok=_ID09GDk (Alarm clocks with different time)
|
||||||
|
[2]: https://opensource.com/article/21/7/cron-linux
|
||||||
|
[3]: https://opensource.com/article/21/7/intro-command
|
||||||
|
[4]: https://opensource.com/article/20/7/systemd-timers
|
||||||
|
[5]: https://opensource.com/article/21/2/linux-automation
|
@ -0,0 +1,89 @@
|
|||||||
|
[#]: subject: "Automatically Synchronize Subtitle With Video Using SubSync"
|
||||||
|
[#]: via: "https://itsfoss.com/subsync/"
|
||||||
|
[#]: author: "Abhishek Prakash https://itsfoss.com/author/abhishek/"
|
||||||
|
[#]: collector: "lujun9972"
|
||||||
|
[#]: translator: "geekpi"
|
||||||
|
[#]: reviewer: "turbokernel"
|
||||||
|
[#]: publisher: "wxy"
|
||||||
|
[#]: url: "https://linux.cn/article-13722-1.html"
|
||||||
|
|
||||||
|
使用 SubSync 自动同步视频字幕
|
||||||
|
======
|
||||||
|
|
||||||
|
![](https://img.linux.net.cn/data/attachment/album/202108/27/100003ts3j0odw05j0ooy3.jpg)
|
||||||
|
|
||||||
|
让我分享一个场景:当你想要观看一部电影或视频,而又需要字幕时,在你下载字幕后,却发现字幕没有正确同步,也没有其他更好的字幕可用。现在该怎么做?
|
||||||
|
|
||||||
|
你可以 [在 VLC 中按 G 或 H 键来同步字幕][1]。它可以为字幕增加延迟。如果字幕在整个视频中的时间延迟相同,这可能会起作用。但如果不是这种情况,就需要 SubSync 出场了。
|
||||||
|
|
||||||
|
### SubSync: 字幕语音同步器
|
||||||
|
|
||||||
|
[SubSync][2] 是一款实用的开源工具,可用于 Linux、macOS 和 Windows。
|
||||||
|
|
||||||
|
它通过监听音轨来同步字幕,这就是它的神奇之处。即使音轨和字幕使用的是不同的语言,它也能发挥作用。如果有必要,它也支持翻译,但我没有测试过这个功能。
|
||||||
|
|
||||||
|
我播放一个视频不同步的字幕进行了一个简单的测试。令我惊讶的是,它工作得很顺利,我得到了完美的同步字幕。
|
||||||
|
|
||||||
|
使用 SubSync 很简单。启动这个应用,它会让你添加字幕文件和视频文件。
|
||||||
|
|
||||||
|
![SubSync 用户界面][3]
|
||||||
|
|
||||||
|
你需要在界面上选择字幕和视频的语言。它可能会根据选择的语言下载额外的资源。
|
||||||
|
|
||||||
|
![SubSync 可下载附加语言支持包][4]
|
||||||
|
|
||||||
|
请记住,同步字幕需要一些时间,这取决于视频和字幕的长度。在等待过程完成时,你可以喝杯茶/咖啡或啤酒。
|
||||||
|
|
||||||
|
你可以看到正在进行同步的状态,甚至可以在完成之前保存它。
|
||||||
|
|
||||||
|
![SubSync 同步中][5]
|
||||||
|
|
||||||
|
同步完成后,你就可以点击保存按钮,把修改的内容保存到原文件中,或者把它保存为新的字幕文件。
|
||||||
|
|
||||||
|
![同步完成][6]
|
||||||
|
|
||||||
|
我不能保证所有情况下都能正常工作,但在我运行的样本测试中它是正常的。
|
||||||
|
|
||||||
|
### 安装 SubSync
|
||||||
|
|
||||||
|
SubSync 是一个跨平台的应用,你可以从它的 [下载页面][7] 获得 Windows 和 MacOS 的安装文件。
|
||||||
|
|
||||||
|
对于 Linux 用户,SubSync 是作为一个 Snap 包提供的。如果你的发行版已经提供了 Snap 支持,使用下面的命令来安装 SubSync:
|
||||||
|
|
||||||
|
```
|
||||||
|
sudo snap install subsync
|
||||||
|
```
|
||||||
|
|
||||||
|
请记住,下载 SubSync Snap 包将需要一些时间。所以要有一个稳定的网络连接或足够的耐心。
|
||||||
|
|
||||||
|
### 最后
|
||||||
|
|
||||||
|
就我个人而言,我很依赖字幕。即使我在 Netflix 上看英文电影,我也会把字幕打开。它有助于我清楚地理解每段对话,特别是在有强烈口音的情况下。如果没有字幕,我永远无法理解 [电影 Snatch 中 Mickey O'Neil(由 Brad Pitt 扮演)的一句话][8]。
|
||||||
|
|
||||||
|
使用 SubSync 比 [Subtitle Editor][9] 同步字幕要容易得多。对于像我这样在整个互联网上搜索不同国家的冷门或推荐(神秘)电影的人来说,除了 [企鹅字幕播放器][10],这是另一个很棒的工具。
|
||||||
|
|
||||||
|
如果你是一个“字幕用户”,你会喜欢这个工具。如果你使用过它,请在评论区分享你的使用经验。
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
via: https://itsfoss.com/subsync/
|
||||||
|
|
||||||
|
作者:[Abhishek Prakash][a]
|
||||||
|
选题:[lujun9972][b]
|
||||||
|
译者:[geekpi](https://github.com/geekpi)
|
||||||
|
校对:[turbokernel](https://github.com/turbokernel)
|
||||||
|
|
||||||
|
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||||
|
|
||||||
|
[a]: https://itsfoss.com/author/abhishek/
|
||||||
|
[b]: https://github.com/lujun9972
|
||||||
|
[1]: https://itsfoss.com/how-to-synchronize-subtitles-with-movie-quick-tip/
|
||||||
|
[2]: https://subsync.online/
|
||||||
|
[3]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/08/subsync-interface.png?resize=593%2C280&ssl=1
|
||||||
|
[4]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/08/subsync-subtitle-synchronize.png?resize=522%2C189&ssl=1
|
||||||
|
[5]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/08/subsync-subtitle-synchronize-1.png?resize=424%2C278&ssl=1
|
||||||
|
[6]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/08/subsync-subtitle-synchronize-2.png?resize=424%2C207&ssl=1
|
||||||
|
[7]: https://subsync.online/en/download.html
|
||||||
|
[8]: https://www.youtube.com/watch?v=tGDO-9hfaiI
|
||||||
|
[9]: https://itsfoss.com/subtitld/
|
||||||
|
[10]: https://itsfoss.com/penguin-subtitle-player/
|
@ -0,0 +1,140 @@
|
|||||||
|
[#]: subject: "Build a JAR file with fastjar and gjar"
|
||||||
|
[#]: via: "https://opensource.com/article/21/8/fastjar"
|
||||||
|
[#]: author: "Seth Kenlon https://opensource.com/users/seth"
|
||||||
|
[#]: collector: "lujun9972"
|
||||||
|
[#]: translator: "geekpi"
|
||||||
|
[#]: reviewer: "wxy"
|
||||||
|
[#]: publisher: "wxy"
|
||||||
|
[#]: url: "https://linux.cn/article-13723-1.html"
|
||||||
|
|
||||||
|
用 fastjar 和 gjar 构建一个 JAR 文件
|
||||||
|
======
|
||||||
|
|
||||||
|
> fastjar、gjar 和 jar 等工具可以帮助你手动或以编程方式构建 JAR 文件,而其他工具链,如 Maven 和 Gradle 提供了依赖性管理的功能。
|
||||||
|
|
||||||
|
![](https://img.linux.net.cn/data/attachment/album/202108/27/105207oj4f44t4vbkkv4iq.jpg)
|
||||||
|
|
||||||
|
根据我的经验,Java 的许多优点之一是它能够以整齐方便的包(称为 JAR,或 Java 归档)来提供应用程序。JAR 文件使用户很容易下载并启动他们想尝试的应用,很容易将该应用从一台计算机转移到另一台计算机(而且 Java 是跨平台的,所以可以鼓励自由分享),而且对于新的程序员来说,查看 JAR 文件的内容,以找出使 Java 应用运行的原因是很容易理解的。
|
||||||
|
|
||||||
|
创建 JAR 文件的方法有很多,包括 Maven 和 Gradle 等工具链解决方案,以及 IDE 中的一键构建功能。然而,也有一些独立的命令,如 `jarfast`、`gjar` 和普通的 `jar`,它们对于快速和简单的构建是很有用的,并且可以演示 JAR 文件运行所需要的东西。
|
||||||
|
|
||||||
|
### 安装
|
||||||
|
|
||||||
|
在 Linux 上,你可能已经有了 `fastjar`、`gjar` 或作为 OpenJDK 包或 GCJ(GCC-Java)的一部分的 `jar` 命令。你可以通过输入不带参数的命令来测试这些命令是否已经安装:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ fastjar
|
||||||
|
Try 'fastjar --help' for more information.
|
||||||
|
$ gjar
|
||||||
|
jar: must specify one of -t, -c, -u, -x, or -i
|
||||||
|
jar: Try 'jar --help' for more information
|
||||||
|
$ jar
|
||||||
|
Usage: jar [OPTION...] [ [--release VERSION] [-C dir] files] ...
|
||||||
|
Try `jar --help' for more information.
|
||||||
|
```
|
||||||
|
|
||||||
|
我安装了所有这些命令,但你只需要一个。所有这些命令都能够构建一个 JAR。
|
||||||
|
|
||||||
|
在 Fedora 等现代 Linux 系统上,输入一个缺失的命令你的操作系统提示安装它。
|
||||||
|
|
||||||
|
另外,你可以直接从 [AdoptOpenJDK.net][3] 为 Linux、MacOS 和 Windows [安装 Java][2]。
|
||||||
|
|
||||||
|
### 构建 JAR
|
||||||
|
|
||||||
|
首先,你需要构建一个 Java 应用。
|
||||||
|
|
||||||
|
为了简单起见,在一个名为 `hello.java` 的文件中创建一个基本的 “hello world” 应用:
|
||||||
|
|
||||||
|
```
|
||||||
|
class Main {
|
||||||
|
public static void main(String[] args) {
|
||||||
|
System.out.println("Hello Java World");
|
||||||
|
}}
|
||||||
|
```
|
||||||
|
|
||||||
|
这是一个简单的应用,在某种程度上淡化了管理外部依赖关系在现实世界中的重要性。不过,这也足以让你开始了解创建 JAR 所需的基本概念了。
|
||||||
|
|
||||||
|
接下来,创建一个清单文件。清单文件描述了 JAR 的 Java 环境。在这个例子里,最重要的信息是识别主类,这样执行 JAR 的 Java 运行时就知道在哪里可以找到应用的入口点。
|
||||||
|
|
||||||
|
```
|
||||||
|
$ mdir META-INF
|
||||||
|
$ echo "Main-Class: Main" > META-INF/MANIFEST.MF
|
||||||
|
```
|
||||||
|
|
||||||
|
### 编译 Java 字节码
|
||||||
|
|
||||||
|
接下来,把你的 Java 文件编译成 Java 字节码。
|
||||||
|
|
||||||
|
```
|
||||||
|
$ javac hello.java
|
||||||
|
```
|
||||||
|
|
||||||
|
另外,你也可以使用 GCC 的 Java 组件来编译:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ gcj -C hello.java
|
||||||
|
```
|
||||||
|
|
||||||
|
无论哪种方式,都会产生文件 `Main.class`:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ file Main.class
|
||||||
|
Main.class: compiled Java class data, version XX.Y
|
||||||
|
```
|
||||||
|
|
||||||
|
### 创建 JAR
|
||||||
|
|
||||||
|
你有了所有需要的组件,这样你就可以创建 JAR 文件了。
|
||||||
|
|
||||||
|
我经常包含 Java 源码给好奇的用户参考,这只需 `META-INF` 目录和类文件即可。
|
||||||
|
|
||||||
|
`fastjar` 命令使用类似于 [tar 命令][6]的语法。
|
||||||
|
|
||||||
|
```
|
||||||
|
$ fastjar cvf hello.jar META-INF Main.class
|
||||||
|
```
|
||||||
|
|
||||||
|
另外,你也可以用 `gjar`,方法大致相同,只是 `gjar` 需要你明确指定清单文件:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ gjar cvf world.jar Main.class -m META-INF/MANIFEST.MF
|
||||||
|
```
|
||||||
|
|
||||||
|
或者你可以使用 `jar` 命令。注意这个命令不需要清单文件,因为它会自动为你生成一个,但为了安全起见,我明确定义了主类:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ jar --create --file hello.jar --main-class=Main Main.class
|
||||||
|
```
|
||||||
|
|
||||||
|
测试你的应用:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ java -jar hello.jar
|
||||||
|
Hello Java World
|
||||||
|
```
|
||||||
|
|
||||||
|
### 轻松打包
|
||||||
|
|
||||||
|
像 `fastjar`、`gjar` 和 `jar` 这样的工具可以帮助你手动或以编程方式构建 JAR 文件,而其他工具链如 Maven 和 Gradle 则提供了依赖性管理的功能。一个好的 IDE 可能会集成这些功能中的一个或多个。
|
||||||
|
|
||||||
|
无论你使用什么解决方案,Java 都为分发你的应用代码提供了一个简单而统一的目标。
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
via: https://opensource.com/article/21/8/fastjar
|
||||||
|
|
||||||
|
作者:[Seth Kenlon][a]
|
||||||
|
选题:[lujun9972][b]
|
||||||
|
译者:[geekpi](https://github.com/geekpi)
|
||||||
|
校对:[wxy](https://github.com/wxy)
|
||||||
|
|
||||||
|
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||||
|
|
||||||
|
[a]: https://opensource.com/users/seth
|
||||||
|
[b]: https://github.com/lujun9972
|
||||||
|
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/build_structure_tech_program_code_construction.png?itok=nVsiLuag (Someone wearing a hardhat and carrying code )
|
||||||
|
[2]: https://opensource.com/article/19/11/install-java-linux
|
||||||
|
[3]: https://adoptopenjdk.net/
|
||||||
|
[4]: http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+string
|
||||||
|
[5]: http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+system
|
||||||
|
[6]: https://opensource.com/article/17/7/how-unzip-targz-file
|
@ -0,0 +1,145 @@
|
|||||||
|
[#]: subject: "Check free disk space in Linux with ncdu"
|
||||||
|
[#]: via: "https://opensource.com/article/21/8/ncdu-check-free-disk-space-linux"
|
||||||
|
[#]: author: "Seth Kenlon https://opensource.com/users/seth"
|
||||||
|
[#]: collector: "lujun9972"
|
||||||
|
[#]: translator: "geekpi"
|
||||||
|
[#]: reviewer: "wxy"
|
||||||
|
[#]: publisher: "wxy"
|
||||||
|
[#]: url: "https://linux.cn/article-13729-1.html"
|
||||||
|
|
||||||
|
用 ncdu 检查 Linux 中的可用磁盘空间
|
||||||
|
======
|
||||||
|
|
||||||
|
> 用 ncdu Linux 命令获得关于磁盘使用的交互式报告。
|
||||||
|
|
||||||
|
![](https://img.linux.net.cn/data/attachment/album/202108/29/095819e87oz4ox6p40t6q0.jpg)
|
||||||
|
|
||||||
|
计算机用户多年来往往积累了大量的数据,无论是重要的个人项目、数码照片、视频、音乐还是代码库。虽然现在的硬盘往往相当大,但有时你必须退一步,评估一下你在硬盘上实际存储了什么。经典的 Linux 命令 [df][2] 和 [du][3] 是快速了解硬盘上的内容的方法,它们提供了一个可靠的报告,易于解析和处理。这对脚本和处理来说是很好的,但人的大脑对数百行的原始数据并不总是反应良好。认识到这一点,`ncdu` 命令旨在提供一份关于你在硬盘上使用的空间的交互式报告。
|
||||||
|
|
||||||
|
### 在 Linux 上安装 ncdu
|
||||||
|
|
||||||
|
在 Linux 上,你可以从你的软件仓库安装 `ncdu`。例如,在 Fedora 或 CentOS 上:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ sudo dnf install ncdu
|
||||||
|
```
|
||||||
|
|
||||||
|
在 BSD 上,你可以使用 [pkgsrc][4]。
|
||||||
|
|
||||||
|
在 macOS 上,你可以从 [MacPorts][5] 或 [HomeBrew][6] 安装。
|
||||||
|
|
||||||
|
另外,你也可以 [从源码编译 ncdu][7]。
|
||||||
|
|
||||||
|
### 使用 ncdu
|
||||||
|
|
||||||
|
`ncdu` 界面使用 ncurses 库,它将你的终端窗口变成一个基本的图形应用,所以你可以使用方向键来浏览菜单。
|
||||||
|
|
||||||
|
![ncdu interface][8]
|
||||||
|
|
||||||
|
这是 `ncdu` 的主要吸引力之一,也是它与最初的 `du` 命令不同的地方。
|
||||||
|
|
||||||
|
要获得一个目录的完整列表,启动 `ncdu`。它默认为当前目录。
|
||||||
|
|
||||||
|
```
|
||||||
|
$ ncdu
|
||||||
|
ncdu 1.16 ~ Use the arrow keys to navigate, press ? for help
|
||||||
|
--- /home/tux -----------------------------------------------
|
||||||
|
22.1 GiB [##################] /.var
|
||||||
|
19.0 GiB [############### ] /Iso
|
||||||
|
10.0 GiB [######## ] /.local
|
||||||
|
7.9 GiB [###### ] /.cache
|
||||||
|
3.8 GiB [### ] /Downloads
|
||||||
|
3.6 GiB [## ] /.mail
|
||||||
|
2.9 GiB [## ] /Code
|
||||||
|
2.8 GiB [## ] /Documents
|
||||||
|
2.3 GiB [# ] /Videos
|
||||||
|
[...]
|
||||||
|
```
|
||||||
|
|
||||||
|
这个列表首先显示了最大的目录(在这个例子中,那是 `~/.var` 目录,塞满了很多的 flatpak 包)。
|
||||||
|
|
||||||
|
使用键盘上的方向键,你可以浏览列表,深入到一个目录,这样你就可以更好地了解什么东西占用了最大的空间。
|
||||||
|
|
||||||
|
### 获取一个特定目录的大小
|
||||||
|
|
||||||
|
你可以在启动 `ncdu` 时提供任意一个文件夹的路径:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ ncdu ~/chromiumos
|
||||||
|
```
|
||||||
|
|
||||||
|
### 排除目录
|
||||||
|
|
||||||
|
默认情况下,`ncdu` 包括一切可以包括的东西,包括符号链接和伪文件系统,如 procfs 和 sysfs。你可以用 `--exclude-kernfs` 来排除这些。
|
||||||
|
|
||||||
|
你可以使用 `--exclude` 选项排除任意文件和目录,并在后面加上一个匹配模式。
|
||||||
|
|
||||||
|
```
|
||||||
|
$ ncdu --exclude ".var"
|
||||||
|
19.0 GiB [##################] /Iso
|
||||||
|
10.0 GiB [######### ] /.local
|
||||||
|
7.9 GiB [####### ] /.cache
|
||||||
|
3.8 GiB [### ] /Downloads
|
||||||
|
[...]
|
||||||
|
```
|
||||||
|
|
||||||
|
另外,你可以在文件中列出要排除的文件和目录,并使用 `--exclude-from` 选项来引用该文件:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ ncdu --exclude-from myexcludes.txt /home/tux
|
||||||
|
10.0 GiB [######### ] /.local
|
||||||
|
7.9 GiB [####### ] /.cache
|
||||||
|
3.8 GiB [### ] /Downloads
|
||||||
|
[...]
|
||||||
|
```
|
||||||
|
|
||||||
|
### 颜色方案
|
||||||
|
|
||||||
|
你可以用 `--color dark` 选项给 `ncdu` 添加一些颜色。
|
||||||
|
|
||||||
|
![ncdu color scheme][9]
|
||||||
|
|
||||||
|
### 包括符号链接
|
||||||
|
|
||||||
|
`ncdu` 输出按字面意思处理符号链接,这意味着一个指向 9GB 文件的符号链接只占用 40 个字节。
|
||||||
|
|
||||||
|
```
|
||||||
|
$ ncdu ~/Iso
|
||||||
|
9.3 GiB [##################] CentOS-Stream-8-x86_64-20210427-dvd1.iso
|
||||||
|
@ 0.0 B [ ] fake.iso
|
||||||
|
```
|
||||||
|
|
||||||
|
你可以用 `--follow-symlinks` 选项强制 ncdu 跟踪符号链接:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ ncdu --follow-symlinks ~/Iso
|
||||||
|
9.3 GiB [##################] fake.iso
|
||||||
|
9.3 GiB [##################] CentOS-Stream-8-x86_64-20210427-dvd1.iso
|
||||||
|
```
|
||||||
|
|
||||||
|
### 磁盘使用率
|
||||||
|
|
||||||
|
磁盘空间用完并不有趣,所以监控你的磁盘使用情况很重要。`ncdu` 命令使它变得简单和互动。下次当你对你的电脑上存储的东西感到好奇时,或者只是想以一种新的方式探索你的文件系统时,不妨试试 `ncdu`。
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
via: https://opensource.com/article/21/8/ncdu-check-free-disk-space-linux
|
||||||
|
|
||||||
|
作者:[Seth Kenlon][a]
|
||||||
|
选题:[lujun9972][b]
|
||||||
|
译者:[geekpi](https://github.com/geekpi)
|
||||||
|
校对:[wxy](https://github.com/wxy)
|
||||||
|
|
||||||
|
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||||
|
|
||||||
|
[a]: https://opensource.com/users/seth
|
||||||
|
[b]: https://github.com/lujun9972
|
||||||
|
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/du-splash.png?itok=nRLlI-5A (Check disk usage)
|
||||||
|
[2]: https://opensource.com/article/21/7/check-disk-space-linux-df
|
||||||
|
[3]: https://opensource.com/article/21/7/check-disk-space-linux-du
|
||||||
|
[4]: https://opensource.com/article/19/11/pkgsrc-netbsd-linux
|
||||||
|
[5]: https://opensource.com/article/20/11/macports
|
||||||
|
[6]: https://opensource.com/article/20/6/homebrew-mac
|
||||||
|
[7]: https://dev.yorhel.nl/ncdu
|
||||||
|
[8]: https://opensource.com/sites/default/files/ncdu.jpg (ncdu interface)
|
||||||
|
[9]: https://opensource.com/sites/default/files/ncdu-dark.jpg (ncdu color scheme)
|
@ -0,0 +1,104 @@
|
|||||||
|
[#]: subject: "Zorin OS 16 Released with Stunning New Look and Array of Updates"
|
||||||
|
[#]: via: "https://www.debugpoint.com/2021/08/zorin-os-16-release-announcement/"
|
||||||
|
[#]: author: "Arindam https://www.debugpoint.com/author/admin1/"
|
||||||
|
[#]: collector: "lujun9972"
|
||||||
|
[#]: translator: "zd200572"
|
||||||
|
[#]: reviewer: "wxy"
|
||||||
|
[#]: publisher: "wxy"
|
||||||
|
[#]: url: "https://linux.cn/article-13705-1.html"
|
||||||
|
|
||||||
|
Zorin OS 16 发布:惊艳的新外观和一系列更新
|
||||||
|
======
|
||||||
|
|
||||||
|
![](https://img.linux.net.cn/data/attachment/album/202108/21/121757gvsasswbt28085r6.jpg)
|
||||||
|
|
||||||
|
Zorin 团队宣布发布了全新的 Zorin OS 16,带来了许多急需的更新和改进。 我们在这篇文章中对这个版本进行了总结。
|
||||||
|
|
||||||
|
![Zorin OS 16 桌面版][1]
|
||||||
|
|
||||||
|
开源而赏心悦目的 Linux 发行版 Zorin OS 发布了它的最新稳定的第 16 个版本,这个版本会在 2025 年前提供增强和更新支持。该团队在确保性能不会下降的同时,提供了一些独特和有用的特性。
|
||||||
|
|
||||||
|
Zorin OS 使用自有的软件参考,同时也可以使用 Ubuntu 的软件仓库。
|
||||||
|
|
||||||
|
让我们看下重要的新特性。
|
||||||
|
|
||||||
|
### Zorin OS 16 – 新特性
|
||||||
|
|
||||||
|
最新的 Zorin OS 16 建立在 Linux 内核 5.11(hwe 栈)的支持上,该版本基于 Ubuntu 20.04 LTS。
|
||||||
|
|
||||||
|
这个版本最主要的变化是在 Zorin 中 **默认包括了 Flathub 软件仓库**。由此,Zorin 应用商店成为了 Linux 发行版中最大的应用程序集合之一。因为它可以支持 Flathub,另外还有早前支持的 Snap 商店、Ubuntu 软件仓库、Zorin 自有仓库,和对 AppImage 的支持。
|
||||||
|
|
||||||
|
Zorin 主要因其外观而闻名,在这个版本中,有一系列改进,这是一个简要的总结:
|
||||||
|
|
||||||
|
* 新的图标和色彩方案,默认主题更加精致。
|
||||||
|
* 预装了新的设计和壁纸。
|
||||||
|
* 锁屏现在可以展示自选壁纸的模糊效果,给你一个更简洁的视觉效果。
|
||||||
|
|
||||||
|
任务栏图标启用了活动指示器,以及带有计数的通知气泡。这意味着你可以在任务栏图标中获取信息 App 的未读消息计数等信息。任务栏还有一些基本特性,比如自动隐藏、透明度和移动图标等等。
|
||||||
|
|
||||||
|
![新的任务栏通知气泡][2]
|
||||||
|
|
||||||
|
新版有许多内部提升,细节尚不清楚,但根据团队的意见,所有 Zorin 风格的整体桌面体验比其前身 [Zorin 15][3] 有了很大改进。
|
||||||
|
|
||||||
|
此版本中引入两个新应用,首次安装后可以用一个 Tour 应用概览 Zorin 桌面,另一个引入的是新的录音应用。
|
||||||
|
|
||||||
|
如果你使用笔记本,在应用和工作区间切换变得更加快捷和简便。Zorin OS 16 带来了多点触控手势,开箱即用。现在你可以通过上下滑动 4 个手指,以流畅的 1:1 动作在工作区之间切换。 用 3 个手指在触摸板撮合,可以打开活动概述,看到你工作区中运行的每个应用程序。
|
||||||
|
|
||||||
|
Zorin OS 16 现在支持高分辨率显示器的分数缩放。
|
||||||
|
|
||||||
|
安装器程序现在包含了 NVIDIA 驱动,可以在首次用临场盘启动时选择,它也支持加密。
|
||||||
|
|
||||||
|
详细的更新日志在 [这里][4]。
|
||||||
|
|
||||||
|
### Zorin OS 16 最低系统要求
|
||||||
|
|
||||||
|
Zorin OS Core、Education 和 Pro
|
||||||
|
|
||||||
|
* CPU – 1 GHz 双核处理器,Intel/AMD 64 位处理器
|
||||||
|
* RAM – 2 GB
|
||||||
|
* 存储 – 15 GB(Core & Education)或 30 GB(Pro)
|
||||||
|
* 显示器 – 800 × 600 分辨率
|
||||||
|
|
||||||
|
Zorin OS LITE
|
||||||
|
|
||||||
|
* CPU – 700 MHz 单核,Intel/AMD 64 或 32 位处理器
|
||||||
|
* RAM – 512 MB
|
||||||
|
* 存储 – 10 GB
|
||||||
|
* 显示器 – 640 × 480 分辨率
|
||||||
|
|
||||||
|
### 下载 Zorin OS 16
|
||||||
|
|
||||||
|
值得一提的是 Zorin 发布了一个 PRO 版本,售价大约 $39,有类似 Windows 11 风格等额外特性。可是,你仍然可以随时下载免费版本:Zorin OS 16 Core 和 Zorin OS 16 LITE(用于低配电脑)。你可能想看下它们的功能 [比较][5]。
|
||||||
|
|
||||||
|
你可以从以下链接下载最新的 .iso 文件。然后,你可以使用 [Etcher][6] 或其他工具来创建临场 USB 启动盘来安装。
|
||||||
|
|
||||||
|
- [下载 zorin os 16][7]
|
||||||
|
|
||||||
|
### 从 Zorin 15.x 升级
|
||||||
|
|
||||||
|
现在还没有从 Zorin OS 15 升级的路径,不过据该团队称,未来将会有升级到最新版本的简单方法。
|
||||||
|
|
||||||
|
### 结束语
|
||||||
|
|
||||||
|
Zorin 的最佳特性之一是它独特的应用生态处理方式。它可能是唯一提供开箱即用体验的 Linux 桌面发行版,可以通过它的软件商店从 Flathub、Snap 商店、AppImage、Ubuntu / 自有软件仓库来搜索和安装应用。你不需要为 Snap 或者 Flatpak 手动配置系统。也就是说,它仍然是一个带有附加项目的 GNOME 修改版。可能有些人不喜欢 Zorin,可能会因为它预装了所有这些功能而感到臃肿。从某种意义上说,它是 Linux 桌面新用户的理想发行版之一,这些用户需要拥有类似 Windows/macOS 系统感觉的现成的 Linux 功能。
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
via: https://www.debugpoint.com/2021/08/zorin-os-16-release-announcement/
|
||||||
|
|
||||||
|
作者:[Arindam][a]
|
||||||
|
选题:[lujun9972][b]
|
||||||
|
译者:[zd200572](https://github.com/zd200572)
|
||||||
|
校对:[wxy](https://github.com/wxy)
|
||||||
|
|
||||||
|
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||||
|
|
||||||
|
[a]: https://www.debugpoint.com/author/admin1/
|
||||||
|
[b]: https://github.com/lujun9972
|
||||||
|
[1]: https://www.debugpoint.com/blog/wp-content/uploads/2021/08/Zorin-OS-16-Desktop-1024x576.jpg
|
||||||
|
[2]: https://www.debugpoint.com/blog/wp-content/uploads/2021/08/New-Taskbar-Notification-Bubbles.png
|
||||||
|
[3]: https://www.debugpoint.com/2020/09/zorin-os-15-3-release/
|
||||||
|
[4]: https://blog.zorin.com/2021/08/17/2021-08-17-zorin-os-16-is-released/
|
||||||
|
[5]: https://zorin.com/os/pro/#compare
|
||||||
|
[6]: https://www.debugpoint.com/2021/01/etcher-bootable-usb-linux/
|
||||||
|
[7]: https://zorin.com/os/download/
|
@ -0,0 +1,121 @@
|
|||||||
|
[#]: subject: "How to Monitor Log Files in Real Time in Linux [Desktop and Server]"
|
||||||
|
[#]: via: "https://www.debugpoint.com/2021/08/monitor-log-files-real-time/"
|
||||||
|
[#]: author: "Arindam https://www.debugpoint.com/author/admin1/"
|
||||||
|
[#]: collector: "lujun9972"
|
||||||
|
[#]: translator: "geekpi"
|
||||||
|
[#]: reviewer: "wxy"
|
||||||
|
[#]: publisher: "wxy"
|
||||||
|
[#]: url: "https://linux.cn/article-13733-1.html"
|
||||||
|
|
||||||
|
如何在 Linux 中实时监控日志文件
|
||||||
|
======
|
||||||
|
|
||||||
|
> 本教程解释了如何实时监控 Linux 日志文件(桌面、服务器或应用),以进行诊断和故障排除。
|
||||||
|
|
||||||
|
![](https://img.linux.net.cn/data/attachment/album/202108/30/082607bmf6nlud6sdy49rm.jpg)
|
||||||
|
|
||||||
|
当你在你的 Linux 桌面、服务器或任何应用中遇到问题时,你会首先查看各自的日志文件。日志文件通常是来自应用的文本和信息流,上面有一个时间戳。它可以帮助你缩小具体的实例,并帮助你找到任何问题的原因。它也可以帮助从网络上获得援助。
|
||||||
|
|
||||||
|
一般来说,所有的日志文件都位于 `/var/log` 中。这个目录包含以 `.log` 为扩展名的特定应用、服务的日志文件,它还包含单独的其他目录,这些目录包含其日志文件。
|
||||||
|
|
||||||
|
![log files in var-log][1]
|
||||||
|
|
||||||
|
所以说,如果你想监控一堆日志文件或特定的日志文件。这里有一些你可以做到方法。
|
||||||
|
|
||||||
|
### 实时监控 Linux 日志文件
|
||||||
|
|
||||||
|
#### 使用 tail 命令
|
||||||
|
|
||||||
|
使用 `tail` 命令是实时跟踪日志文件的最基本方法。特别是,如果你所在的服务器只有一个终端,没有 GUI。这是很有帮助的。
|
||||||
|
|
||||||
|
比如:
|
||||||
|
|
||||||
|
```
|
||||||
|
tail /path/to/log/file
|
||||||
|
```
|
||||||
|
|
||||||
|
![Monitoring multiple log files via tail][2]
|
||||||
|
|
||||||
|
使用开关 `-f` 来跟踪日志文件,它是实时更新的。例如,如果你想跟踪 `syslog`,你可以使用以下命令:
|
||||||
|
|
||||||
|
```
|
||||||
|
tail -f /var/log/syslog
|
||||||
|
```
|
||||||
|
|
||||||
|
你可以用一个命令监控多个日志文件,使用:
|
||||||
|
|
||||||
|
```
|
||||||
|
tail -f /var/log/syslog /var/log/dmesg
|
||||||
|
```
|
||||||
|
|
||||||
|
如果你想监控 http 或 sftp 或任何服务器,你也可以在这个命令中监控它们各自的日志文件。
|
||||||
|
|
||||||
|
记住,上述命令需要管理员权限。
|
||||||
|
|
||||||
|
#### 使用 lnav(日志文件浏览器)
|
||||||
|
|
||||||
|
![lnav Running][3]
|
||||||
|
|
||||||
|
`lnav` 是一个很好的工具,你可以用它来通过彩色编码的信息以更有条理的方式监控日志文件。在 Linux 系统中,它不是默认安装的。你可以用下面的命令来安装它:
|
||||||
|
|
||||||
|
```
|
||||||
|
sudo apt install lnav ### Ubuntu
|
||||||
|
sudo dnf install lnav ### Fedora
|
||||||
|
```
|
||||||
|
|
||||||
|
好的是,如果你不想安装它,你可以直接下载其预编译的可执行文件,然后在任何地方运行。甚至从 U 盘上也可以。它不需要设置,而且有很多功能。使用 `lnav`,你可以通过 SQL 查询日志文件,以及其他很酷的功能,你可以在它的 [官方网站][4] 上了解。
|
||||||
|
|
||||||
|
一旦安装,你可以简单地用管理员权限从终端运行 `lnav`,它将默认显示 `/var/log` 中的所有日志并开始实时监控。
|
||||||
|
|
||||||
|
#### 关于 systemd 的 journalctl 说明
|
||||||
|
|
||||||
|
今天所有的现代 Linux 发行版大多使用 systemd。systemd 提供了运行 Linux 操作系统的基本框架和组件。systemd 通过 `journalctl` 提供日志服务,帮助管理所有 systemd 服务的日志。你还可以通过以下命令实时监控各个 systemd 服务和日志。
|
||||||
|
|
||||||
|
```
|
||||||
|
journalctl -f
|
||||||
|
```
|
||||||
|
|
||||||
|
下面是一些具体的 `journalctl` 命令,可以在一些情况下使用。你可以将这些命令与上面的 `-f` 开关结合起来,开始实时监控。
|
||||||
|
|
||||||
|
* 对紧急系统信息,使用:
|
||||||
|
```
|
||||||
|
journalctl -p 0
|
||||||
|
```
|
||||||
|
* 显示带有解释的错误:
|
||||||
|
```
|
||||||
|
journalctl -xb -p 3
|
||||||
|
```
|
||||||
|
* 使用时间控制来过滤输出:
|
||||||
|
```
|
||||||
|
journalctl --since "2020-12-04 06:00:00"
|
||||||
|
journalctl --since "2020-12-03" --until "2020-12-05 03:00:00"
|
||||||
|
journalctl --since yesterday
|
||||||
|
journalctl --since 09:00 --until "1 hour ago"
|
||||||
|
```
|
||||||
|
|
||||||
|
如果你想了解更多关于 `journalctl` 的细节,我已经写了一个 [指南][6]。
|
||||||
|
|
||||||
|
### 结束语
|
||||||
|
|
||||||
|
我希望这些命令和技巧能帮助你找出桌面或服务器问题/错误的根本原因。对于更多的细节,你可以随时参考手册,摆弄各种开关。如果你对这篇文章有什么意见或看法,请在下面的评论栏告诉我。
|
||||||
|
|
||||||
|
加油。
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
via: https://www.debugpoint.com/2021/08/monitor-log-files-real-time/
|
||||||
|
|
||||||
|
作者:[Arindam][a]
|
||||||
|
选题:[lujun9972][b]
|
||||||
|
译者:[geekpi](https://github.com/geekpi)
|
||||||
|
校对:[wxy](https://github.com/wxy)
|
||||||
|
|
||||||
|
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||||
|
|
||||||
|
[a]: https://www.debugpoint.com/author/admin1/
|
||||||
|
[b]: https://github.com/lujun9972
|
||||||
|
[1]: https://www.debugpoint.com/blog/wp-content/uploads/2021/08/log-files-in-var-log-1024x312.jpeg
|
||||||
|
[2]: https://www.debugpoint.com/blog/wp-content/uploads/2021/08/Monitoring-multiple-log-files-via-tail-1024x444.jpeg
|
||||||
|
[3]: https://www.debugpoint.com/blog/wp-content/uploads/2021/08/lnav-Running-1024x447.jpeg
|
||||||
|
[4]: https://lnav.org/features
|
||||||
|
[6]: https://www.debugpoint.com/2020/12/systemd-journalctl/
|
126
published/202108/20210822 Linux Phones- Here are Your Options.md
Normal file
126
published/202108/20210822 Linux Phones- Here are Your Options.md
Normal file
@ -0,0 +1,126 @@
|
|||||||
|
[#]: subject: "Linux Phones: Here are Your Options"
|
||||||
|
[#]: via: "https://itsfoss.com/linux-phones/"
|
||||||
|
[#]: author: "Ankush Das https://itsfoss.com/author/ankush/"
|
||||||
|
[#]: collector: "lujun9972"
|
||||||
|
[#]: translator: "wxy"
|
||||||
|
[#]: reviewer: "wxy"
|
||||||
|
[#]: publisher: "wxy"
|
||||||
|
[#]: url: "https://linux.cn/article-13711-1.html"
|
||||||
|
|
||||||
|
如何选择一台 Linux 手机
|
||||||
|
======
|
||||||
|
|
||||||
|
![](https://img.linux.net.cn/data/attachment/album/202108/23/155159e5s33xo63tz5jddz.jpg)
|
||||||
|
|
||||||
|
> 未来取代安卓或 iOS 的可能是 Linux 手机,但如今,有哪些选择可以尝试一下呢?
|
||||||
|
|
||||||
|
虽然安卓是基于 Linux 内核的,但它经过了大量修改。因此,这意味着它不是一个完全意义上的基于 Linux 的操作系统。
|
||||||
|
|
||||||
|
谷歌正在努力使安卓内核更接近主线 Linux 内核,但这仍然是一个遥远的梦想。
|
||||||
|
|
||||||
|
那么,在这种情况下,如果你正在寻找一款 Linux 手机、一款由 Linux 操作系统驱动的智能手机,有哪些可以选择呢?
|
||||||
|
|
||||||
|
这并不是一个容易做出的决定,因为你的选择非常有限。因此,我试图推荐一些最好的、不同于主流选择的 Linux 手机。
|
||||||
|
|
||||||
|
### 如今你可以使用的顶级 Linux 手机
|
||||||
|
|
||||||
|
值得注意的是,这里提到的 Linux 手机或许无法取代你的安卓或 iOS 设备。因此,在做出购买决定之前,请确保你做了一些背景研究。
|
||||||
|
|
||||||
|
**注意:** 你需要仔细检查这些 Linux 手机是否可以购买到、预期的发货日期和使用风险。它们大多数只适合于发烧友或早期试用者。
|
||||||
|
|
||||||
|
#### 1、PinePhone
|
||||||
|
|
||||||
|
![][1]
|
||||||
|
|
||||||
|
[PinePhone][2] 是最有性价比和最受欢迎的选择之一,我觉得它是一个有前途的 Linux 手机。
|
||||||
|
|
||||||
|
它并不局限于单一的操作系统。你可以尝试使用带有 Plasma mobile OS 的 Manjaro、UBports、Sailfish OS 等系统。PinePhone 的配置不错,它包括一个四核处理器和 2G 或3G 的内存。它支持使用可启动的 microSD 卡来帮助你安装系统,还可选 16/32GB eMMC 存储。
|
||||||
|
|
||||||
|
其显示屏是一个基本的 1440×720p IPS 屏幕。你还可以得到特殊的隐私保护,如蓝牙、麦克风和摄像头的断路开关。
|
||||||
|
|
||||||
|
PinePhone 还为你提供了使用六个可用的 pogo 引脚添加自定义的硬件扩展的方式。
|
||||||
|
|
||||||
|
其基本版(2GB 内存和 16GB 存储)默认加载了 Manjaro,价格为 149 美元;而融合版(3GB 内存和 32GB 存储)价格为 199 美元。
|
||||||
|
|
||||||
|
#### 2、Fairphone
|
||||||
|
|
||||||
|
![][3]
|
||||||
|
|
||||||
|
与这个清单上的其他选择相比,[Fairphone][6] 在商业上是成功的。它不是一款 Linux 智能手机,但它具有定制版的安卓系统,即 Fairphone OS,并且可以选择 [开源安卓系统替代品][5] 之一 [/e/ OS][4]。如果你想使用 Linux 操作系统,也有一些社区移植版本,但可能有点碰运气。
|
||||||
|
|
||||||
|
Fairphone 有两个不同的版本,提供了一些不错的配置规格。你会发现 Fairphone 3+ 有一个 4800 万像素的相机传感器和一个全高清显示屏。另外,你还会发现先进的高通处理器为该设备提供了动力。
|
||||||
|
|
||||||
|
他们专注于制造可持续发展的智能手机,并使用了一定量的回收塑料制造。这也为了方便维修。
|
||||||
|
|
||||||
|
因此,它不仅是一个非主流智能手机的选择,而且如果你选择了它,你也将为保护环境出了力。
|
||||||
|
|
||||||
|
### 3、Librem 5
|
||||||
|
|
||||||
|
![][7]
|
||||||
|
|
||||||
|
[Librem 5][9] 是一款非常注重用户隐私的智能手机,同时它采用了开源的操作系统,即 PureOS,并非基于安卓。
|
||||||
|
|
||||||
|
它所提供的配置规格还不错,有 3GB 内存和四核 Cortex A53 芯片组。但是,这无法与主流选择相竞争。因此,你可能不会觉得它物美价廉。
|
||||||
|
|
||||||
|
它的目标是那些对尊重隐私的智能手机感兴趣的发烧友。
|
||||||
|
|
||||||
|
与其他产品类似,Librem 5 也专注于通过提供用户可更换的电池使手机易于维修。
|
||||||
|
|
||||||
|
在隐私方面,你会注意到有蓝牙、相机和麦克风的断路开关。他们还承诺了未来几年的安全更新。
|
||||||
|
|
||||||
|
### 4、Pro 1X
|
||||||
|
|
||||||
|
![][10]
|
||||||
|
|
||||||
|
[Pro 1X][11] 是一款有趣的智能手机,同时支持 Ubuntu Touch、Lineage OS 和安卓。
|
||||||
|
|
||||||
|
它不仅是一款 Linux 智能手机,而且是一款带有独立 QWERTY 键盘的手机,这在现在是很罕见的。
|
||||||
|
|
||||||
|
Pro 1 X 的配置规格不错,包括了一个骁龙 662 处理器和 6GB 内存。它还带有一块不错的 AMOLED 全高清显示屏。
|
||||||
|
|
||||||
|
它的相机不是特别强大,但在大多数情况下应该是足够了。
|
||||||
|
|
||||||
|
### 5、Volla Phone
|
||||||
|
|
||||||
|
![][12]
|
||||||
|
|
||||||
|
[Volla Phone][13] 是一个有吸引力的产品,运行在 UBports 的 Ubuntu Touch。
|
||||||
|
|
||||||
|
它配备了预制的 “虚拟专用网络” ,并专注于简化用户体验。它的操作系统是定制的,因此,可以快速访问所有重要的东西,而无需自己组织。
|
||||||
|
|
||||||
|
它的配置规格令人印象深刻,包括了一个八核联发科处理器和 4700 毫安时的电池。你会得到类似于一些最新的智能手机上的设计。
|
||||||
|
|
||||||
|
### 总结
|
||||||
|
|
||||||
|
Linux 智能手机不是到处都能买到的,当然也还不适合大众使用。
|
||||||
|
|
||||||
|
因此,如果你是一个发烧友,或者想支持这种手机的发展,你可以考虑购买一台。
|
||||||
|
|
||||||
|
你已经拥有一台这种智能手机了吗?请不要犹豫,在下面的评论中分享你的经验。
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
via: https://itsfoss.com/linux-phones/
|
||||||
|
|
||||||
|
作者:[Ankush Das][a]
|
||||||
|
选题:[lujun9972][b]
|
||||||
|
译者:[wxy](https://github.com/wxy)
|
||||||
|
校对:[wxy](https://github.com/wxy)
|
||||||
|
|
||||||
|
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||||
|
|
||||||
|
[a]: https://itsfoss.com/author/ankush/
|
||||||
|
[b]: https://github.com/lujun9972
|
||||||
|
[1]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/08/PinePhone-3.jpg?resize=800%2C800&ssl=1
|
||||||
|
[2]: https://www.pine64.org/pinephone/
|
||||||
|
[3]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/08/fairphone.png?resize=360%2C600&ssl=1
|
||||||
|
[4]: https://itsfoss.com/e-os-review/
|
||||||
|
[5]: https://itsfoss.com/open-source-alternatives-android/
|
||||||
|
[6]: https://shop.fairphone.com/en/
|
||||||
|
[7]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/08/librem-5.png?resize=800%2C450&ssl=1
|
||||||
|
[8]: https://itsfoss.com/librem-linux-phone/
|
||||||
|
[9]: https://puri.sm/products/librem-5/
|
||||||
|
[10]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/08/pro1x.jpg?resize=800%2C542&ssl=1
|
||||||
|
[11]: https://www.fxtec.com/pro1x
|
||||||
|
[12]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/08/volla-smartphone.jpg?resize=695%2C391&ssl=1
|
||||||
|
[13]: https://www.indiegogo.com/projects/volla-phone-free-your-mind-protect-your-privacy#/
|
@ -0,0 +1,105 @@
|
|||||||
|
[#]: subject: "Access your iPhone on Linux with this open source tool"
|
||||||
|
[#]: via: "https://opensource.com/article/21/8/libimobiledevice-iphone-linux"
|
||||||
|
[#]: author: "Don Watkins https://opensource.com/users/don-watkins"
|
||||||
|
[#]: collector: "lujun9972"
|
||||||
|
[#]: translator: "geekpi"
|
||||||
|
[#]: reviewer: "wxy"
|
||||||
|
[#]: publisher: "wxy"
|
||||||
|
[#]: url: "https://linux.cn/article-13737-1.html"
|
||||||
|
|
||||||
|
用这个开源工具在 Linux 上访问你的 iPhone
|
||||||
|
======
|
||||||
|
|
||||||
|
> 通过使用 Libimobiledevice 从 Linux 与 iOS 设备进行通信。
|
||||||
|
|
||||||
|
![](https://img.linux.net.cn/data/attachment/album/202108/31/092907bc26qep3ekc73czl.jpg)
|
||||||
|
|
||||||
|
iPhone 和 iPad 绝不是开源的,但它们是流行的设备。许多拥有 iOS 备的人恰好也在使用大量的开源软件,包括 Linux。Windows 和 macOS 的用户可以通过使用苹果公司提供的软件与 iOS 设备通信,但苹果公司不支持 Linux 用户。开源程序员早在 2007 年(就在 iPhone 发布一年后)就以 Libimobiledevice(当时叫 libiphone)来拯救了人们,这是一个与 iOS 通信的跨平台解决方案。它可以在 Linux、Android、Arm 系统(如树莓派)、Windows、甚至 macOS 上运行。
|
||||||
|
|
||||||
|
Libimobiledevice 是用 C 语言编写的,使用原生协议与 iOS 设备上运行的服务进行通信。它不需要苹果公司的任何库,所以它完全是自由而开源的。
|
||||||
|
|
||||||
|
Libimobiledevice 是一个面向对象的 API,它捆绑了许多便于你使用的终端工具。该库支持苹果从最早到其最新的型号的 iOS 设备。这是多年来研究和开发的结果。该项目中的应用包括 `usbmuxd`、`ideviceinstaller`、`idevicerestore`、`ifuse`、`libusbmuxd`、`libplist`、`libirecovery` 和 `libideviceactivation`。
|
||||||
|
|
||||||
|
### 在 Linux 上安装 Libimobiledevice
|
||||||
|
|
||||||
|
在 Linux 上,你可能已经默认安装了 `libimobiledevice`。你可以通过你的软件包管理器或应用商店找到,或者通过运行项目中包含的一个命令:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ ifuse --help
|
||||||
|
```
|
||||||
|
|
||||||
|
你可以用你的包管理器安装 `libimobiledevice`。例如,在 Fedora 或 CentOS 上:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ sudo dnf install libimobiledevice ifuse usbmuxd
|
||||||
|
```
|
||||||
|
|
||||||
|
在 Debian 和 Ubuntu 上:
|
||||||
|
|
||||||
|
|
||||||
|
```
|
||||||
|
$ sudo apt install usbmuxd libimobiledevice6 libimobiledevice-utils
|
||||||
|
```
|
||||||
|
|
||||||
|
或者,你可以从源代码 [下载][2] 并安装 `libimobiledevice`。
|
||||||
|
|
||||||
|
### 连接你的设备
|
||||||
|
|
||||||
|
当你安装了所需的软件包,将你的 iOS 设备连接到你的电脑。
|
||||||
|
|
||||||
|
为你的 iOS 设备建立一个目录作为挂载点。
|
||||||
|
|
||||||
|
```
|
||||||
|
$ mkdir ~/iPhone
|
||||||
|
```
|
||||||
|
|
||||||
|
接下来,挂载设备:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ ifuse ~/iPhone
|
||||||
|
```
|
||||||
|
|
||||||
|
你的设备提示你,是否信任你用来访问它的电脑。
|
||||||
|
|
||||||
|
![iphone prompts to trust the computer][3]
|
||||||
|
|
||||||
|
*图 1:iPhone 提示你要信任该电脑。*
|
||||||
|
|
||||||
|
信任问题解决后,你会在桌面上看到新的图标。
|
||||||
|
|
||||||
|
![iphone icons appear on desktop][4]
|
||||||
|
|
||||||
|
*图 2:iPhone 的新图标出现在桌面上。*
|
||||||
|
|
||||||
|
点击 “iPhone” 图标,显示出你的 iPhone 的文件夹结构。
|
||||||
|
|
||||||
|
![iphone folder structure displayed][5]
|
||||||
|
|
||||||
|
*图 3:显示了 iPhone 的文件夹结构。*
|
||||||
|
|
||||||
|
我通常最常访问的文件夹是 `DCIM`,那里存放着我的 iPhone 照片。有时我在写文章时使用这些照片,有时有一些照片我想用 GIMP 等开源应用来增强。可以直接访问这些图片,而不是通过电子邮件把它们发给我自己,这是使用 `libimobiledevice` 工具的好处之一。我可以把这些文件夹中的任何一个复制到我的 Linux 电脑上。我也可以在 iPhone 上创建文件夹并删除它们。
|
||||||
|
|
||||||
|
### 发现更多
|
||||||
|
|
||||||
|
[Martin Szulecki][6] 是该项目的首席开发者。该项目正在寻找开发者加入他们的 [社区][7]。Libimobiledevice 可以改变你使用外设的方式,而无论你在什么平台上。这是开源的又一次胜利,这意味着它是所有人的胜利。
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
via: https://opensource.com/article/21/8/libimobiledevice-iphone-linux
|
||||||
|
|
||||||
|
作者:[Don Watkins][a]
|
||||||
|
选题:[lujun9972][b]
|
||||||
|
译者:[geekpi](https://github.com/geekpi)
|
||||||
|
校对:[wxy](https://github.com/wxy)
|
||||||
|
|
||||||
|
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||||
|
|
||||||
|
[a]: https://opensource.com/users/don-watkins
|
||||||
|
[b]: https://github.com/lujun9972
|
||||||
|
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/idea_innovation_mobile_phone.png?itok=RqVtvxkd (A person looking at a phone)
|
||||||
|
[2]: https://github.com/libimobiledevice/libimobiledevice/
|
||||||
|
[3]: https://opensource.com/sites/default/files/1trust_0.png
|
||||||
|
[4]: https://opensource.com/sites/default/files/2docks.png
|
||||||
|
[5]: https://opensource.com/sites/default/files/2iphoneicon.png
|
||||||
|
[6]: https://github.com/FunkyM
|
||||||
|
[7]: https://libimobiledevice.org/#community
|
@ -0,0 +1,105 @@
|
|||||||
|
[#]: subject: "KDE Plasma 5.23 – New Features and Release Dates"
|
||||||
|
[#]: via: "https://www.debugpoint.com/2021/08/kde-plasma-5-23/"
|
||||||
|
[#]: author: "Arindam https://www.debugpoint.com/author/admin1/"
|
||||||
|
[#]: collector: "lujun9972"
|
||||||
|
[#]: translator: "imgradeone"
|
||||||
|
[#]: reviewer: "wxy"
|
||||||
|
[#]: publisher: "wxy"
|
||||||
|
[#]: url: "https://linux.cn/article-13719-1.html"
|
||||||
|
|
||||||
|
KDE Plasma 5.23 的新功能和发布日期
|
||||||
|
======
|
||||||
|
|
||||||
|
![](https://img.linux.net.cn/data/attachment/album/202108/25/222802zwhmvv1vwzusevzw.jpg)
|
||||||
|
|
||||||
|
> 我们在这篇文章中总结了 KDE Plasma 5.23(即将到来)的新功能,包括主要特点、下载和 测试说明。
|
||||||
|
|
||||||
|
KDE Plasma 桌面是当今最流行、最顶级的 Linux 桌面环境,而 KDE Plasma 的热度之高主要得益于其适应能力强、迭代发展迅速,以及性能不断提高。[KDE Plasma 5.22][1] 发布以来,KDE 团队一直忙于为即将到来的 KDE Plasma 5.23 合并更改和测试新功能。目前 KDE Plasma 5.23 仍在开发中,如下是暂定的时间表。
|
||||||
|
|
||||||
|
### KDE Plasma 5.23 发布时间表
|
||||||
|
|
||||||
|
KDE Plasma 5.23 将于 2021 年 10 月 7 日发布,以下是时间表:
|
||||||
|
|
||||||
|
* Beta 公测 – 2021 年 9 月 16 日
|
||||||
|
* 最终发布 – 2021 年 10 月 7 日
|
||||||
|
|
||||||
|
正如每个 Plasma 版本更新一样,本次更新也同样承诺对核心 Plasma Shell 和 KDE 应用进行大幅更改、代码清理、性能改进、数百个 bug 修复、Wayland 优化等。我们在本篇文章中收集了一些重要的功能,让你对即将发布的新功能有基本了解。下面就让我们看看。
|
||||||
|
|
||||||
|
### KDE Plasma 5.23 – 新功能
|
||||||
|
|
||||||
|
* 本次版本更新基于 Qt 5.15 版本,KDE 框架 5.86 版本。
|
||||||
|
|
||||||
|
#### Plasma Shell 和应用程序更新
|
||||||
|
|
||||||
|
* 本次 KDE Plasma 的 Kickoff 程序启动器将有大幅更新,包括 bug 修复、减少内存占用、视觉更新、键鼠导航优化。
|
||||||
|
* Kickoff 程序启动器菜单允许使用固定按钮固定在桌面上,保持开启状态。
|
||||||
|
* Kickoff 的标签不会在你滚动时切换(从应用标签到位置标签)。
|
||||||
|
* Kickoff 里可以使用 `CTRL+F` 快捷键直接聚焦到搜索栏。
|
||||||
|
* Kickoff 中的操作按钮(如关机等)可以设置为仅显示图标。
|
||||||
|
* 现在可以针对所有 Kickoff 项目选择使用网格或列表视图(而不仅仅局限于收藏夹)。
|
||||||
|
|
||||||
|
![KDE Plasma 5.23 中 Kickoff 程序启动器新增的选项][2]
|
||||||
|
|
||||||
|
![Kickoff 程序启动器的更改][3]
|
||||||
|
|
||||||
|
* 新增基于 QML 的全新概览视图(类似 GNOME 3.38 的工作区视图),用于展示所有打开的窗口(详见如下视频)。目前我找不到关于此合并请求的更多详情,而且这个新视图也很不稳定。
|
||||||
|
|
||||||
|
![](https://www.debugpoint.com/blog/wp-content/uploads/2021/08/New-Overview-effect-in-KDE-Plasma-5.23.mp4)
|
||||||
|
|
||||||
|
_视频作者:KDE 团队_
|
||||||
|
|
||||||
|
* 该概览效果将替代现有的“展现窗口”特效和“虚拟桌面平铺网格”特效(计划中)。
|
||||||
|
* 未连接触控板时将展示更易察觉的“未找到触摸板”提示。
|
||||||
|
* “电源配置方案”设置现在呈现于 Plasma UI(电池和亮度窗口)中。电源配置方案功能从 Linux 内核 5.12 版本开始已经登陆戴尔和联想的笔记本电脑了。因此,如果你拥有这些品牌的较新款笔记本电脑,你可以将电源配置方案设置为高性能或省电模式。_[注:Fedora 35(很大可能)会在 GNOME 41 中增加该功能]_
|
||||||
|
|
||||||
|
![新的“电源配置方案”设置][4]
|
||||||
|
|
||||||
|
* 如果你有多屏幕设置,包括垂直和横向屏幕,那么登录屏幕现在可以正确同步和对齐。这个功能的需求度很高。
|
||||||
|
* 新的 Breeze 主题预计会有风格上的更新。
|
||||||
|
* 如前序版本一样,预计会有全新的壁纸(目前壁纸大赛仍在进行中)。
|
||||||
|
* 新增当硬件从笔记本模式切换到平板模式时是否缩放系统托盘图标的设置。
|
||||||
|
* 你可以选择在登录时的蓝牙状态:总是启用、总是禁用、记住上一次的状态。该状态在版本升级后仍可保留。
|
||||||
|
* 用户现在可以更改传感器的显示名称。
|
||||||
|
* Breeze 风格的滚动条现在比之前版本的更宽。
|
||||||
|
* Dolphin 文件管理器提供在文件夹前之前优先显示隐藏文件的新选项。
|
||||||
|
* 你现在可以使用 `DEL` 键删除剪贴板弹窗中选中的项目。
|
||||||
|
* KDE 现在允许你直接从 Plasma 桌面,向 store.kde.org 提交你制作的图标和主题。
|
||||||
|
|
||||||
|
#### Wayland 更新
|
||||||
|
|
||||||
|
* 在 Wayland 会话中,运行程序时光标旁也会展示图标反馈动画。
|
||||||
|
* 现在可以从通知中复制文字。
|
||||||
|
* 中键单击粘贴功能现在可以在 Wayland 和 XWayland 应用程序中正常使用。
|
||||||
|
|
||||||
|
请务必牢记,每个版本都有数以百计的 bug 修复和改进。本文仅仅包括了我收集的表面层次的东西。因此,如果想了解应用程序和 Plasma Shell 的变更详情,请访问 GitLab 或 KDE Planet 社区。
|
||||||
|
|
||||||
|
### 不稳定版本下载
|
||||||
|
|
||||||
|
你现在可以通过下方的链接下载 KDE neon 的不稳定版本来体验上述全部功能。直接下载 .iso 文件,然后安装测试即可。请务必在发现 bug 后及时反馈。该不稳定版本不适合严肃场合及生产力设备使用。
|
||||||
|
|
||||||
|
- [下载 KDE neon 不稳定版本][5]
|
||||||
|
|
||||||
|
### 结束语
|
||||||
|
|
||||||
|
KDE Plasma 5.23 每次发布都在改进底层、增加新功能。虽然这个版本不是大更新,但一切优化、改进最终都将累积成稳定性、适应性和更好的用户体验。当然,还有更多的 Wayland 改进(讲真,Wayland 兼容看上去一直都处在“正在进行中”的状态 - 就像十年过去了,却还在制作那样。当然这是另一个话题了)。
|
||||||
|
|
||||||
|
再会。
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
via: https://www.debugpoint.com/2021/08/kde-plasma-5-23/
|
||||||
|
|
||||||
|
作者:[Arindam][a]
|
||||||
|
选题:[lujun9972][b]
|
||||||
|
译者:[imgradeone](https://github.com/imgradeone)
|
||||||
|
校对:[wxy](https://github.com/wxy)
|
||||||
|
|
||||||
|
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||||
|
|
||||||
|
[a]: https://www.debugpoint.com/author/admin1/
|
||||||
|
[b]: https://github.com/lujun9972
|
||||||
|
[1]: https://www.debugpoint.com/2021/06/kde-plasma-5-22-release/
|
||||||
|
[2]: https://www.debugpoint.com/blog/wp-content/uploads/2021/08/New-Kickoff-Options-in-KDE-Plasma-5.23.jpeg
|
||||||
|
[3]: https://www.debugpoint.com/blog/wp-content/uploads/2021/08/Changes-in-kickoff.jpeg
|
||||||
|
[4]: https://www.debugpoint.com/blog/wp-content/uploads/2021/08/New-power-profiles.jpeg
|
||||||
|
[5]: https://neon.kde.org/download
|
@ -0,0 +1,173 @@
|
|||||||
|
[#]: subject: "How to include options in your Bash shell scripts"
|
||||||
|
[#]: via: "https://opensource.com/article/21/8/option-parsing-bash"
|
||||||
|
[#]: author: "Seth Kenlon https://opensource.com/users/seth"
|
||||||
|
[#]: collector: "lujun9972"
|
||||||
|
[#]: translator: "unigeorge"
|
||||||
|
[#]: reviewer: "wxy"
|
||||||
|
[#]: publisher: "wxy"
|
||||||
|
[#]: url: "https://linux.cn/article-13730-1.html"
|
||||||
|
|
||||||
|
如何在 Bash shell 脚本中解析命令行选项
|
||||||
|
======
|
||||||
|
|
||||||
|
> 给你的 shell 脚本添加选项。
|
||||||
|
|
||||||
|
![](https://img.linux.net.cn/data/attachment/album/202108/29/110849lvhr1bjg1r43sfcx.jpg)
|
||||||
|
|
||||||
|
终端命令通常具有 [选项或开关][2],用户可以使用它们来修改命令的执行方式。关于命令行界面的 [POSIX 规范][3] 中就对选项做出了规范,这也是最早的 UNIX 应用程序建立的一个由来已久的惯例,因此你在创建自己的命令时,最好知道如何将选项包含进 [Bash 脚本][4] 中。
|
||||||
|
|
||||||
|
与大多数语言一样,有若干种方法可以解决 Bash 中解析选项的问题。但直到今天,我最喜欢的方法仍然是我从 Patrick Volkerding 的 Slackware 构建脚本中学到的方法,当我第一次发现 Linux 并敢于冒险探索操作系统所附带的纯文本文件时,这些脚本就是我的 shell 脚本的引路人。
|
||||||
|
|
||||||
|
### Bash 中的选项解析
|
||||||
|
|
||||||
|
在 Bash 中解析选项的策略是循环遍历所有传递给 shell 脚本的参数,确定它们是否是一个选项,然后转向下一个参数。重复这个过程,直到没有选项为止。
|
||||||
|
|
||||||
|
```
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
while [ True ]; do
|
||||||
|
if [ "$1" = "--alpha" -o "$1" = "-a" ]; then
|
||||||
|
ALPHA=1
|
||||||
|
shift 1
|
||||||
|
else
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
echo $ALPHA
|
||||||
|
```
|
||||||
|
|
||||||
|
在这段代码中,我创建了一个 `while` 循环,它会一直进行循环操作,直到处理完所有参数。`if` 语句会试着将在第一个位置(`$1`)中找到的参数与 `--alpha` 或 `-a` 匹配。(此处的待匹配项是任意选项名称,并没有特殊意义。在实际的脚本中,你可以使用 `--verbose` 和 `-v` 来触发详细输出)。
|
||||||
|
|
||||||
|
`shift` 关键字会使所有参数位移一位,这样位置 2(`$2`)的参数移动到位置 1(`$1`)。处理完所有参数后会触发 `else` 语句,进而中断 `while` 循环。
|
||||||
|
|
||||||
|
在脚本的末尾,`$ALPHA` 的值会输出到终端。
|
||||||
|
|
||||||
|
测试一下这个脚本:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ bash ./test.sh --alpha
|
||||||
|
1
|
||||||
|
$ bash ./test.sh
|
||||||
|
|
||||||
|
$ bash ./test.sh -a
|
||||||
|
1
|
||||||
|
```
|
||||||
|
|
||||||
|
可以看到,选项被正确地检测到了。
|
||||||
|
|
||||||
|
### 在 Bash 中检测参数
|
||||||
|
|
||||||
|
但上面的脚本还有一个问题:多余的参数被忽略了。
|
||||||
|
|
||||||
|
```
|
||||||
|
$ bash ./test.sh --alpha foo
|
||||||
|
1
|
||||||
|
$
|
||||||
|
```
|
||||||
|
|
||||||
|
要想捕获非选项名的参数,可以将剩余的参数转储到 [Bash 数组][5] 中。
|
||||||
|
|
||||||
|
```
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
while [ True ]; do
|
||||||
|
if [ "$1" = "--alpha" -o "$1" = "-a" ]; then
|
||||||
|
ALPHA=1
|
||||||
|
shift 1
|
||||||
|
else
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
echo $ALPHA
|
||||||
|
|
||||||
|
ARG=( "${@}" )
|
||||||
|
for i in ${ARG[@]}; do
|
||||||
|
echo $i
|
||||||
|
done
|
||||||
|
```
|
||||||
|
|
||||||
|
测试一下新版的脚本:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ bash ./test.sh --alpha foo
|
||||||
|
1
|
||||||
|
foo
|
||||||
|
$ bash ./test.sh foo
|
||||||
|
|
||||||
|
foo
|
||||||
|
$ bash ./test.sh --alpha foo bar
|
||||||
|
1
|
||||||
|
foo
|
||||||
|
bar
|
||||||
|
```
|
||||||
|
|
||||||
|
### 带参选项
|
||||||
|
|
||||||
|
有一些选项需要传入参数。比如,你可能希望允许用户设置诸如颜色或图形分辨率之类的属性,或者将应用程序指向自定义配置文件。
|
||||||
|
|
||||||
|
要在 Bash 中实现这一点,你仍然可以像使用布尔开关一样使用 `shift` 关键字,但参数需要位移两位而不是一位。
|
||||||
|
|
||||||
|
```
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
while [ True ]; do
|
||||||
|
if [ "$1" = "--alpha" -o "$1" = "-a" ]; then
|
||||||
|
ALPHA=1
|
||||||
|
shift 1
|
||||||
|
elif [ "$1" = "--config" -o "$1" = "-c" ]; then
|
||||||
|
CONFIG=$2
|
||||||
|
shift 2
|
||||||
|
else
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
|
||||||
|
echo $ALPHA
|
||||||
|
echo $CONFIG
|
||||||
|
|
||||||
|
ARG=( "${@}" )
|
||||||
|
|
||||||
|
for i in ${ARG[@]}; do
|
||||||
|
echo $i
|
||||||
|
done
|
||||||
|
```
|
||||||
|
|
||||||
|
在这段代码中,我添加了一个 `elif` 子句来将每个参数与 `--config` 和 `-c` 进行比较。如果匹配,名为 `CONFIG` 的变量的值就设置为下一个参数的值(这就表示 `--config` 选项需要一个参数)。所有参数都位移两位:其中一位是跳过 `--config` 或 `-c`,另一位是跳过其参数。与上节一样,循环重复直到没有匹配的参数。
|
||||||
|
|
||||||
|
下面是新版脚本的测试:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ bash ./test.sh --config my.conf foo bar
|
||||||
|
my.conf
|
||||||
|
foo
|
||||||
|
bar
|
||||||
|
$ bash ./test.sh -a --config my.conf baz
|
||||||
|
1
|
||||||
|
my.conf
|
||||||
|
baz
|
||||||
|
```
|
||||||
|
|
||||||
|
### Bash 让选项解析变得简单
|
||||||
|
|
||||||
|
还有一些其他方法也可以解析 Bash 中的选项。你可以替换使用 `case` 语句或 `getopt` 命令。无论使用什么方法,给你的用户提供选项都是应用程序的重要功能,而 Bash 让解析选项成为了一件简单的事。
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
via: https://opensource.com/article/21/8/option-parsing-bash
|
||||||
|
|
||||||
|
作者:[Seth Kenlon][a]
|
||||||
|
选题:[lujun9972][b]
|
||||||
|
译者:[unigeorge](https://github.com/unigeorge)
|
||||||
|
校对:[wxy](https://github.com/wxy)
|
||||||
|
|
||||||
|
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||||
|
|
||||||
|
[a]: https://opensource.com/users/seth
|
||||||
|
[b]: https://github.com/lujun9972
|
||||||
|
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/terminal-commands_1.png?itok=Va3FdaMB (Terminal commands)
|
||||||
|
[2]: https://opensource.com/article/21/8/linux-terminal#options
|
||||||
|
[3]: https://opensource.com/article/19/7/what-posix-richard-stallman-explains
|
||||||
|
[4]: https://opensource.com/downloads/bash-scripting-ebook
|
||||||
|
[5]: https://opensource.com/article/18/5/you-dont-know-bash-intro-bash-arrays
|
@ -0,0 +1,70 @@
|
|||||||
|
[#]: subject: "30 things you didn't know about the Linux kernel"
|
||||||
|
[#]: via: "https://opensource.com/article/21/8/linux-kernel"
|
||||||
|
[#]: author: "Seth Kenlon https://opensource.com/users/seth"
|
||||||
|
[#]: collector: "lujun9972"
|
||||||
|
[#]: translator: "wxy"
|
||||||
|
[#]: reviewer: "wxy"
|
||||||
|
[#]: publisher: "wxy"
|
||||||
|
[#]: url: "https://linux.cn/article-13724-1.html"
|
||||||
|
|
||||||
|
关于 Linux 内核的 30 件你不知道的事
|
||||||
|
======
|
||||||
|
|
||||||
|
> Linux 内核今年 30 岁了。
|
||||||
|
|
||||||
|
![](https://img.linux.net.cn/data/attachment/album/202108/27/150006o152rdghq0zqr02f.jpg)
|
||||||
|
|
||||||
|
Linux 内核今年 30 岁了。这开创性的开源软件的三个十年,让用户能够运行自由软件,让他们能从运行的应用程序中学习,让他们能与朋友分享他们所学到的知识。有人认为,如果没有 Linux 内核,我们如今所享受的 [开源文化][2] 和自由软件的累累硕果,可能就不会应时而出现。如果没有 Linux 作为催化剂,苹果、微软和谷歌所开源的那些就不可能开源。Linux 作为一种现象,对开源文化、软件开发和用户体验的影响,是怎么强调都不为过的,但所有这一切,都滥觞于一个 Linux 内核。
|
||||||
|
|
||||||
|
Linux 内核是启动计算机、并识别和确保计算机内外所连接的所有组件之间通信的软件。这些对于大多数用户从未想过,更不用说能理解的代码,Linux 内核有很多令人惊讶的地方。以下是 Linux 内核在其三十年生命中每一年的一件事。顺序无关。
|
||||||
|
|
||||||
|
1. Linux 是第一个具有 USB 3.0 驱动的操作系统。Sarah Sharp 在 2009 年 6 月 7 日宣布她的 USB 3.0 设备的驱动程序可以使用了,她的代码被包含在内核 2.6.31 版本中。
|
||||||
|
2. 当某些事件发生时,内核会将自己标记为“受污染”,这在以后的故障排除中可能有用。运行一个“被污染”的内核并不是什么问题。但如果出现错误,首先要做的是在一个没有被污染的内核上重现该问题。
|
||||||
|
3. 你可以指定一个主机名或域名作为 `ip=` 内核命令行选项的一部分,Linux 会保留它,而不是用 DHCP 或 BOOTP 提供的主机名或域名来覆盖它。例如,`ip=::::myhostname::dhcp` 设置主机名 `myhostname`。
|
||||||
|
4. 在文本启动过程中,可以选择显示黑白的、16 色的或 224 色的 Tux 徽标之一。
|
||||||
|
5. 在娱乐业中,DRM 是一种用来防止访问媒介的技术。然而,在 Linux 内核中,DRM 指的是<ruby>直接渲染管理器<rt>Direct Rendering Manager</rt></ruby>,它指的是用于与对接显卡的 GPU 的库(`libdrm`)和驱动程序。
|
||||||
|
6. 能够在不重启的情况下给 Linux 内核打补丁。
|
||||||
|
7. 如果你自己编译内核,你可以将文本控制台配置为超过 80 列宽。
|
||||||
|
8. Linux 内核提供了内置的 FAT、exFAT 和 NTFS(读和写)支持。
|
||||||
|
9. Wacom 平板电脑和许多类似设备的驱动程序都内置在内核中。
|
||||||
|
10. 大多数内核高手使用 `git send-email` 来提交补丁。
|
||||||
|
11. 内核使用一个叫做 [Sphinx][3] 的文档工具链,它是用 Python 编写的。
|
||||||
|
12. Hamlib 提供了具有标准化 API 的共享库,可以通过你的 Linux 电脑控制业余无线电设备。
|
||||||
|
13. 我们鼓励硬件制造商帮助开发 Linux 内核,以确保兼容性。这样就可以直接处理硬件,而不必从制造商那里下载驱动程序。直接成为内核一部分的驱动程序也会自动从新版本内核的性能和安全改进中受益。
|
||||||
|
14. 内核中包含了许多树莓派模块(Pi Hats)的驱动程序。
|
||||||
|
15. netcat 乐队发布了一张只能作为 [Linux 内核模块][4] 播放的专辑。
|
||||||
|
16. 受 netcat 发布专辑的启发,人们又开发了一个 [把你的内核变成一个音乐播放器][5] 的模块。
|
||||||
|
17. Linux 内核的功能支持许多 CPU 架构:ARM、ARM64、IA-64、 m68k、MIPS、Nios II、PA-RISC、OpenRISC、PowerPC、s390、 Sparc、x86、Xtensa 等等。
|
||||||
|
18. 2001 年,Linux 内核成为第一个 [以长模式运行的 x86-64 CPU 架构][6]。
|
||||||
|
19. Linux 3.4 版引入了 x32 ABI,允许开发者编译在 64 位模式下运行的代码,而同时只使用 32 位指针和数据段。
|
||||||
|
20. 内核支持许多不同的文件系统,包括 Ext2、Ext3、Ext4、JFS、XFS、GFS2、GCFS2、BtrFS、NILFS2、NFS、Overlay FS、UDF 等等。
|
||||||
|
21. <ruby>虚拟文件系统<rt>Virtual File System</rt></ruby>(VFS)是 Linux 内核中的一个软件层,为用户运行的应用程序提供文件系统接口。它也是内核的一个抽象层,以便不同的文件系统实现可以共存。
|
||||||
|
22. Linux 内核包括一个实体的盲文输出设备的驱动程序。
|
||||||
|
23. 在 2.6.29 版本的内核中,启动时的 Tux 徽标被替换为 “Tuz”,以提高人们对当时影响澳大利亚的<ruby>塔斯马尼亚魔鬼<rt>Tasmanian Devil</rt></ruby>(即袋獾)种群的一种侵袭性癌症的认识。
|
||||||
|
24. <ruby>控制组<rt>Control Groups</rt></ruby>(cgroups)是容器(Docker、Podman、Kubernetes 等的基础技术)能够存在的原因。
|
||||||
|
25. 曾经花了大量的法律行动来解放 CIFS,以便将其纳入内核中,而今天,CIFS 模块已被内置于内核,以实现对 SMB 的支持。这使得 Linux 可以挂载微软的远程共享和基于云的文件共享。
|
||||||
|
26. 对于计算机来说,产生一个真正的随机数是出了名的困难(事实上,到目前为止是不可能的)。`hw_random` 框架可以利用你的 CPU 或主板上的特殊硬件功能,尽量改进随机数的生成。
|
||||||
|
27. _操作系统抖动_ 是应用程序遇到的干扰,它是由后台进程的调度方式和系统处理异步事件(如中断)的方式的冲突引起的。像这些问题在内核文档中都有详细的讨论,可以帮助面向 Linux 开发的程序员写出更聪明的代码。
|
||||||
|
28. `make menuconfig` 命令可以让你在编译前使用 GUI 来配置内核。`Kconfig` 语言定义了内核配置选项。
|
||||||
|
29. 对于基本的 Linux 服务器,可以实施一个 _看门狗_ 系统来监控服务器的健康状况。在健康检查间隔中,`watchdog` 守护进程将数据写入一个特殊的 `watchdog` 内核设备,以防止系统重置。如果看门狗不能成功记录,系统就会被重置。有许多看门狗硬件的实现,它们对远程任务关键型计算机(如发送到火星上的计算机)至关重要。
|
||||||
|
30. 在火星上有一个 Linux 内核的副本,虽然它是在地球上开发的。
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
via: https://opensource.com/article/21/8/linux-kernel
|
||||||
|
|
||||||
|
作者:[Seth Kenlon][a]
|
||||||
|
选题:[lujun9972][b]
|
||||||
|
译者:[wxy](https://github.com/wxy)
|
||||||
|
校对:[wxy](https://github.com/wxy)
|
||||||
|
|
||||||
|
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||||
|
|
||||||
|
[a]: https://opensource.com/users/seth
|
||||||
|
[b]: https://github.com/lujun9972
|
||||||
|
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/kernel-30.png?itok=xmwX2pCQ (30 years)
|
||||||
|
[2]: https://opensource.com/article/18/1/creative-commons-real-world
|
||||||
|
[3]: https://opensource.com/article/19/11/document-python-sphinx
|
||||||
|
[4]: https://github.com/usrbinnc/netcat-cpi-kernel-module
|
||||||
|
[5]: https://github.com/FlaviaR/Netcat-Music-Kernel-Expansion
|
||||||
|
[6]: http://www.x86-64.org/pipermail/announce/2001-June/000020.html
|
@ -0,0 +1,444 @@
|
|||||||
|
[#]: collector: (lujun9972)
|
||||||
|
[#]: translator: (zpl1025)
|
||||||
|
[#]: reviewer: (wxy)
|
||||||
|
[#]: publisher: (wxy)
|
||||||
|
[#]: url: (https://linux.cn/article-13796-1.html)
|
||||||
|
[#]: subject: (13 of the best React JavaScript frameworks)
|
||||||
|
[#]: via: (https://opensource.com/article/20/1/react-javascript-frameworks)
|
||||||
|
[#]: author: (Amit Dua https://opensource.com/users/amitdua)
|
||||||
|
|
||||||
|
13 个最好的 React JavaScript 框架
|
||||||
|
======
|
||||||
|
|
||||||
|
> 如果你正在用 React.js 或 React Native 来开发用户界面的话,试试这些框架。
|
||||||
|
|
||||||
|
![](https://img.linux.net.cn/data/attachment/album/202109/18/095748k48eskmjpzuhyzuj.jpg)
|
||||||
|
|
||||||
|
React.js 和 React Native 都是用来开发用户界面(UI)的很受欢迎的开源平台。在 StackOverflow 2019 年度开发者调查里,两个框架的可取性和使用情况都排名靠前。React.js 是 Facebook 在 2011 年开发的一个 JavaScript 库,来实现跨平台,动态以及高性能的 UI 设计需求;而 React Native 则是 Facebook 在 2015 年发布的框架,目的是使用 JavaScript 构建原生应用。
|
||||||
|
|
||||||
|
下面介绍 13 个最好的 React JavaScript 框架,都是开源项目。前 11 个(和 React 一样)都使用 MIT 许可证授权,后面两个使用 Apache 2.0 许可证。
|
||||||
|
|
||||||
|
### 1、Create React App
|
||||||
|
|
||||||
|
这个 Facebook 开发的命令行工具是 React Native 项目一定要用的。因为 [Create React App][2] 使用很简单,还可以避免你自己手动设定和配置应用,因此能节省大量的时间和精力。仅仅使用给一个简单的命令,就可以为你准备好创建 React 原生项目所需的一切。你可以用它来创建分类和文件,而且该框架还自带了工具用来构建,测试和启动应用。
|
||||||
|
|
||||||
|
```
|
||||||
|
# 安装软件包
|
||||||
|
$ npm install -g create-react-native-web-app
|
||||||
|
|
||||||
|
# 运行 create-react-native-web-app <项目目录>
|
||||||
|
$ create-react-native-web-app myApp
|
||||||
|
|
||||||
|
# 切换到创建的 <项目目录>
|
||||||
|
$ cd myApp
|
||||||
|
|
||||||
|
# 运行 Web/Ios/Android 调试
|
||||||
|
# Web
|
||||||
|
$ npm run web
|
||||||
|
|
||||||
|
# IOS(模拟)
|
||||||
|
$ npm run ios
|
||||||
|
|
||||||
|
# Android(实际连接的设备)
|
||||||
|
$ npm run android
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 为什么选择 Create React App
|
||||||
|
|
||||||
|
1. 使用配置包、转码器,以及测试运行器进行开发的一流工具
|
||||||
|
2. 在应用架构里不需要配置以及没有额外文件
|
||||||
|
3. 确定的开发栈
|
||||||
|
4. 高效快速的开发工具
|
||||||
|
|
||||||
|
### 2、Material Kit React
|
||||||
|
|
||||||
|
[Material Kit React][3] 是受谷歌的 Material Design 系统启发开发的,很适合用来创建 React UI 组件。这个库最大的优点是提供了大量的组件,可以互相搭配做出非常好的效果。有超过一千个完全编码的组件,每一个都有用文件夹组织起来的独立层。这样你就可以有上千个选项可以选择。它同时也包含一些示例页面,方便你从中寻找灵感,或者向别人分享你的点子或创意。
|
||||||
|
|
||||||
|
#### 安装 Material Kit
|
||||||
|
|
||||||
|
```
|
||||||
|
$ npm install @material-ui/core
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 使用
|
||||||
|
|
||||||
|
```
|
||||||
|
import React from 'react';
|
||||||
|
import Button from '@material-ui/core/Button';
|
||||||
|
|
||||||
|
const App = () => (
|
||||||
|
<Button variant="contained" color="primary">
|
||||||
|
Hello World
|
||||||
|
</Button>
|
||||||
|
);
|
||||||
|
```
|
||||||
|
|
||||||
|
Material-UI 组件不需要其他额外设置,也不会干扰全局变量空间。
|
||||||
|
|
||||||
|
#### 优点
|
||||||
|
|
||||||
|
这个 React 组件支持简易快速的网页开发。你可以用它创建自己的设计系统,或者直接开始 Material Design。
|
||||||
|
|
||||||
|
### 3、Shards React
|
||||||
|
|
||||||
|
这个现代的 React UI 工具为了追求高效率,是从最底层开始构建的。它拥有现代的设计系统,可以让你按自己的想法任意定制。你甚至可以下载源文件,然后从代码级别定制。另外,它用来设计样式的 SCSS 语法提高了开发体验。
|
||||||
|
|
||||||
|
[Shards React][4] 基于 Shards,使用了 React Datepicker、React Popper(一个定位引擎)和 noUISlider。还带有非常优秀的 Material Design 图标。还有很多设计好的版本,可以帮你寻找灵感或上手。
|
||||||
|
|
||||||
|
#### 用 Yarn 或 NPM 安装 Shards
|
||||||
|
|
||||||
|
```
|
||||||
|
# Yarn
|
||||||
|
yarn add shards-react
|
||||||
|
|
||||||
|
# NPM
|
||||||
|
npm i shards-react
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 优点
|
||||||
|
|
||||||
|
1. Shards 是一个轻量级的脚本,压缩后大概 13kb
|
||||||
|
2. Shards 默认支持响应式,图层可以适配任意大小屏幕
|
||||||
|
3. Shards 有完整的文档,可以快速开始构建漂亮的界面
|
||||||
|
|
||||||
|
### 4、Styled Components
|
||||||
|
|
||||||
|
这个高效的 CSS 工具可以用来为应用的可视界面创建小型可重用的组件。使用传统的 CSS,你可能会不小心覆盖掉网站其他位置的选择器,但 [Styled Components][5] 通过使用直接内嵌到组件里的 CSS 语法,可以完全避免这个问题。
|
||||||
|
|
||||||
|
#### 安装
|
||||||
|
|
||||||
|
```
|
||||||
|
npm install --save styled-components
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 使用
|
||||||
|
|
||||||
|
```
|
||||||
|
const Button = styled.button`
|
||||||
|
background: background_type;
|
||||||
|
border-radius: radius_value;
|
||||||
|
border: abc;
|
||||||
|
color: name_of_color;
|
||||||
|
Margin: margin_value;
|
||||||
|
padding: value`;
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 优点
|
||||||
|
|
||||||
|
1. 让组件有更好的可读性
|
||||||
|
2. 组件样式依赖 JavaScript
|
||||||
|
3. 创建定制 CSS 组件
|
||||||
|
4. 内嵌样式
|
||||||
|
5. 简单地调用 `styled()` 可以将组件甚至是自定义组件转换成样式组件
|
||||||
|
|
||||||
|
### 5、Redux
|
||||||
|
|
||||||
|
[Redux][6] 是一个为 JavaScript 应用提供状态管理的方案。常用于 React.js,也可以用在其他类 React 框架里。
|
||||||
|
|
||||||
|
#### 安装
|
||||||
|
|
||||||
|
```
|
||||||
|
sudo npm install redux
|
||||||
|
sudo npm install react-redux
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 使用
|
||||||
|
|
||||||
|
```
|
||||||
|
import { createStore } from "redux";
|
||||||
|
import rotateReducer from "reducers/rotateReducer";
|
||||||
|
|
||||||
|
function configureStore(state = { rotating: value}) {
|
||||||
|
return createStore(rotateReducer,state);
|
||||||
|
}
|
||||||
|
|
||||||
|
export default configureStore;
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 优点
|
||||||
|
|
||||||
|
1. 可预计的状态更新有助于定义应用里的数据流
|
||||||
|
2. 逻辑上测试更简单,使用 reducer 函数进行时间旅行调试也更容易
|
||||||
|
3. 统一管理状态
|
||||||
|
|
||||||
|
### 6、React Virtualized
|
||||||
|
|
||||||
|
这个 React Native JavaScript 框架帮助渲染 large-list 和 tabular-data。使用 [React Virtualized][7],你可以限制请求和文档对象模型(DOM)元素的数量,从而提高 React 应用的性能。
|
||||||
|
|
||||||
|
#### 安装
|
||||||
|
|
||||||
|
```
|
||||||
|
npm install react-virtualized
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 使用
|
||||||
|
|
||||||
|
```
|
||||||
|
import 'react-virtualized/styles.css'
|
||||||
|
import { Column, Table } from 'react-virtualized'
|
||||||
|
import AutoSizer from 'react-virtualized/dist/commonjs/AutoSizer'
|
||||||
|
import List from 'react-virtualized/dist/commonjs/List'
|
||||||
|
{
|
||||||
|
alias: {
|
||||||
|
'react-virtualized/List': 'react-virtualized/dist/es/List',
|
||||||
|
},
|
||||||
|
...等等
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 优点
|
||||||
|
|
||||||
|
1. 高效展示大量数据
|
||||||
|
2. 渲染超大数据集
|
||||||
|
3. 使用一系列组件实现虚拟渲染
|
||||||
|
|
||||||
|
### 7、React DnD
|
||||||
|
|
||||||
|
[React DnD][8] 用来创建复杂的拖放界面。拖放控件库有很多,选用 React DnD 是因为它是基于 HTML5 的拖放 API 的,创建界面更简单。
|
||||||
|
|
||||||
|
#### 安装
|
||||||
|
|
||||||
|
```
|
||||||
|
npm install react-dnd-preview
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 使用
|
||||||
|
|
||||||
|
```
|
||||||
|
import Preview from 'react-dnd-preview';
|
||||||
|
|
||||||
|
const generatePreview = ({itemType, item, style}) => {
|
||||||
|
return <div class="item-list" style={style}>{itemType}</div>;
|
||||||
|
};
|
||||||
|
|
||||||
|
class App extends React.Component {
|
||||||
|
...
|
||||||
|
render() {
|
||||||
|
return (
|
||||||
|
<DndProvider backend={MyBackend}>
|
||||||
|
<ItemList />
|
||||||
|
<Preview generator={generatePreview} />
|
||||||
|
// or
|
||||||
|
<Preview>{generatePreview}</Preview>
|
||||||
|
</DndProvider>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 优点
|
||||||
|
|
||||||
|
1. 漂亮自然的控件移动
|
||||||
|
2. 强大的键盘和屏幕阅读支持
|
||||||
|
3. 极限性能
|
||||||
|
4. 强大整洁的接口
|
||||||
|
5. 标准浏览器支持非常好
|
||||||
|
6. 中性样式
|
||||||
|
7. 没有额外创建 DOM 节点
|
||||||
|
|
||||||
|
### 8、React Bootstrap
|
||||||
|
|
||||||
|
这个 UI 库将 Bootstrap 的 JavaScript 替换成了 React,可以更好地控制每个组件的功能。每个组件都构建成能轻易访问,因此 [React Bootstrap][9] 有利于构建前端框架。有上千种 bootstrap 主题可以选择。
|
||||||
|
|
||||||
|
#### 安装
|
||||||
|
|
||||||
|
```
|
||||||
|
npm install react-bootstrap bootstrap
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 使用
|
||||||
|
|
||||||
|
```
|
||||||
|
import 'bootstrap/dist/css/bootstrap.min.css';
|
||||||
|
import React from 'react';
|
||||||
|
import ReactDOM from 'react-dom';
|
||||||
|
import './index.css';
|
||||||
|
import App from './App';
|
||||||
|
import registerServiceWorker from './registerServiceWorker';
|
||||||
|
|
||||||
|
ReactDOM.render(<App />, document.getElementById('root'));
|
||||||
|
registerServiceWorker();
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 优点
|
||||||
|
|
||||||
|
1. 可以简单导入所需的代码/组件
|
||||||
|
2. 通过压缩 Bootstrap 节省了输入和问题
|
||||||
|
3. 通过压缩 Bootstrap 减少了输入工作和冲突
|
||||||
|
4. 使用简单
|
||||||
|
5. 使用元素封装
|
||||||
|
|
||||||
|
### 9、React Suite
|
||||||
|
|
||||||
|
[React Suite][10] 是另一个高效的 React.js 框架,包含了大量组件库,方便开发企业级产品。支持所有主流浏览器和平台,适用于任何系统。还支持服务器端渲染。
|
||||||
|
|
||||||
|
#### 安装
|
||||||
|
|
||||||
|
```
|
||||||
|
npm i rsuite --save
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 使用
|
||||||
|
|
||||||
|
```
|
||||||
|
import { Button } from 'rsuite';
|
||||||
|
import 'rsuite/styles/less/index.less';
|
||||||
|
ReactDOM.render(<Button>Button</Button>, mountNode);
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 优点
|
||||||
|
|
||||||
|
1. 通过全局访问特性轻松管理应用
|
||||||
|
2. 使用 Redux 库集中管理系统状态
|
||||||
|
3. Redux 库有灵活的 UI 层,以及广泛的生态
|
||||||
|
4. Redux 库减少系统复杂度,并提供了全局访问特性
|
||||||
|
|
||||||
|
### 10、PrimeReact
|
||||||
|
|
||||||
|
[PrimeReact][11] 最值得推荐的是它提供了几乎覆盖所有基本 UI 需求的组件,比如输入选项,菜单,数据展示,消息,等等。这个框架还优化了移动体验,帮助你设计触摸优化的元素。
|
||||||
|
|
||||||
|
#### 安装
|
||||||
|
|
||||||
|
```
|
||||||
|
npm install primereact --save
|
||||||
|
npm install primeicons --save
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 使用
|
||||||
|
|
||||||
|
```
|
||||||
|
import {Dialog} from 'primereact/dialog';
|
||||||
|
import {Accordion,AccordionTab} from 'primereact/accordion';
|
||||||
|
dependencies: {
|
||||||
|
"react": "^16.0.0",
|
||||||
|
"react-dom": "^16.0.0",
|
||||||
|
"react-transition-group": "^2.2.1",
|
||||||
|
"classnames": "^2.2.5",
|
||||||
|
"primeicons": "^2.0.0"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 优点
|
||||||
|
|
||||||
|
1. 简单而高效
|
||||||
|
2. 容易使用
|
||||||
|
3. Spring 应用
|
||||||
|
4. 创建复杂用户界面
|
||||||
|
5. 好用而简单
|
||||||
|
|
||||||
|
### 11、React Router
|
||||||
|
|
||||||
|
[React Router][12] 在 React Native 开发社区很受欢迎,因为它上手很容易。只需要你在电脑上安装 Git 和 npm 包管理工具,有 React 的基础知识,以及好学的意愿。没什么特别难的地方。
|
||||||
|
|
||||||
|
#### 安装
|
||||||
|
|
||||||
|
```
|
||||||
|
$ npm install --save react-router
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 使用
|
||||||
|
|
||||||
|
```
|
||||||
|
import { Router, Route, Switch } from "react-router";
|
||||||
|
|
||||||
|
// 使用 CommonJS 模块
|
||||||
|
var Router = require("react-router").Router;
|
||||||
|
var Route = require("react-router").Route;
|
||||||
|
var Switch = require("react-router").Switch;
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 优点
|
||||||
|
|
||||||
|
1. 动态路由匹配
|
||||||
|
2. 在导航时支持不同页面的 CSS 切换
|
||||||
|
3. 统一的应用结构和行为
|
||||||
|
|
||||||
|
### 12、Grommet
|
||||||
|
|
||||||
|
[Grommet][13] 常用于开发响应式、可访问的移动网页应用。这个用 Apache 2.0 许可证授权的 JavaScript 框架最大的优点是用很小的包提供了可访问性、模块化、响应式以及主题功能。这可能是它被一些公司广泛使用的主要原因,比如奈飞、通用电气、优步以及波音。
|
||||||
|
|
||||||
|
#### 安装 for yarn and npm
|
||||||
|
|
||||||
|
```
|
||||||
|
$ npm install grommet styled-components --save
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 使用
|
||||||
|
|
||||||
|
```
|
||||||
|
"grommet-controls/chartjs": {
|
||||||
|
"transform": "grommet-controls/es6/chartjs/${member}",
|
||||||
|
"preventFullImport": true,
|
||||||
|
"skipDefaultConversion": true
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 优点
|
||||||
|
|
||||||
|
1. 创建一个工具包来打包
|
||||||
|
2. 把开放政策发挥到极致
|
||||||
|
3. 重构有助于影响已成立的组织
|
||||||
|
|
||||||
|
### 13、Onsen UI
|
||||||
|
|
||||||
|
[Onsen UI][14] 另一个使用 HTML5 和 JavaScript 的手机应用开发框架,集成了 Angular、Vue 和 React,使用 Apache 2.0 许可证授权。
|
||||||
|
|
||||||
|
Onsen 提供了标签、侧边栏、堆栈导航以及其他组件。这个框架最好的地方是,它所有的组件都支持 iOS 和安卓 Material Design 自动适配,会根据不同的平台切换应用的外观。
|
||||||
|
|
||||||
|
#### 安装
|
||||||
|
|
||||||
|
```
|
||||||
|
npm install onsenui
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 使用
|
||||||
|
|
||||||
|
```
|
||||||
|
(function() {
|
||||||
|
'use strict';
|
||||||
|
var module = angular.module('app', ['onsen']);
|
||||||
|
|
||||||
|
module.controller('AppController', function($scope) {
|
||||||
|
// more to come here
|
||||||
|
});
|
||||||
|
|
||||||
|
})();
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 优点
|
||||||
|
|
||||||
|
1. Onsen UI 基于自由而开源代码
|
||||||
|
2. 不强制基于它开发的应用使用任何形式的 DRM
|
||||||
|
3. 内置了 JavaScript 和 HTML5 代码
|
||||||
|
4. 给最终用户带来原生体验
|
||||||
|
|
||||||
|
* * *
|
||||||
|
|
||||||
|
你最喜欢哪个 React JavaScript 框架?请在评论区分享。
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
via: https://opensource.com/article/20/1/react-javascript-frameworks
|
||||||
|
|
||||||
|
作者:[Amit Dua][a]
|
||||||
|
选题:[lujun9972][b]
|
||||||
|
译者:[zpl1025](https://github.com/zpl1025)
|
||||||
|
校对:[wxy](https://github.com/wxy)
|
||||||
|
|
||||||
|
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||||
|
|
||||||
|
[a]: https://opensource.com/users/amitdua
|
||||||
|
[b]: https://github.com/lujun9972
|
||||||
|
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/code_javascript.jpg?itok=60evKmGl (Javascript code close-up with neon graphic overlay)
|
||||||
|
[2]: https://github.com/facebook/create-react-app
|
||||||
|
[3]: https://github.com/creativetimofficial/material-kit-react
|
||||||
|
[4]: https://github.com/DesignRevision/shards-react
|
||||||
|
[5]: https://github.com/styled-components/styled-components
|
||||||
|
[6]: https://github.com/reduxjs/redux
|
||||||
|
[7]: https://github.com/bvaughn/react-virtualized
|
||||||
|
[8]: https://github.com/react-dnd/react-dnd/
|
||||||
|
[9]: https://github.com/react-bootstrap/react-bootstrap
|
||||||
|
[10]: https://github.com/rsuite/rsuite
|
||||||
|
[11]: https://github.com/primefaces/primereact
|
||||||
|
[12]: https://github.com/ReactTraining/react-router
|
||||||
|
[13]: https://github.com/grommet/grommet
|
||||||
|
[14]: https://github.com/OnsenUI/OnsenUI
|
317
published/202109/20200211 Using external libraries in Java.md
Normal file
317
published/202109/20200211 Using external libraries in Java.md
Normal file
@ -0,0 +1,317 @@
|
|||||||
|
[#]: collector: (lujun9972)
|
||||||
|
[#]: translator: (unigeorge)
|
||||||
|
[#]: reviewer: (wxy)
|
||||||
|
[#]: publisher: (wxy)
|
||||||
|
[#]: url: (https://linux.cn/article-13769-1.html)
|
||||||
|
[#]: subject: (Using external libraries in Java)
|
||||||
|
[#]: via: (https://opensource.com/article/20/2/external-libraries-java)
|
||||||
|
[#]: author: (Chris Hermansen https://opensource.com/users/clhermansen)
|
||||||
|
|
||||||
|
在 Java 中使用外部库
|
||||||
|
======
|
||||||
|
|
||||||
|
> 外部库填补了 Java 核心库中的一些功能空白。
|
||||||
|
|
||||||
|
![](https://img.linux.net.cn/data/attachment/album/202109/10/075749s65x89uzxj8x5kq9.jpg)
|
||||||
|
|
||||||
|
Java 自带有一组核心库,其中包含了定义常用数据类型和相关行为的库(例如 `String` 和 `Date`)、与主机操作系统交互的实用程序(例如 `System` 和 `File`),以及一些用来管理安全性、处理网络通信、创建或解析 XML的有用的子系统。鉴于核心库的丰富性,程序员通常很容易在其中找到有用的组件,以减少需要编写的代码量。
|
||||||
|
|
||||||
|
即便如此,核心库仍有一些功能上的不足,因此发现这些不足的程序员们还额外创建了很多有趣的 Java 库。例如,[Apache Commons][2]“是一个专注于可重用 Java 组件所有方面的 Apache 项目”,提供了大约 43 个开源库的集合(截至撰写本文时),涵盖了 Java 核心库之外的一系列功能 (例如 [geometry][3] 或 [statistics][4]),并增强或替换了 Java 核心库中的原有功能(例如 [math][5] 或 [numbers][6])。
|
||||||
|
|
||||||
|
另一种常见的 Java 库类型是系统组件的接口(例如数据库系统接口),本文会着眼于使用此类接口连接到 [PostgreSQL][7] 数据库,并得到一些有趣的信息。首先,我们来回顾一下库的重要部分。
|
||||||
|
|
||||||
|
### 什么是库?
|
||||||
|
|
||||||
|
<ruby>库<rt>library</rt></ruby>里自然包含的是一些有用的代码。但为了发挥用处,代码需要以特定方式进行组织,特定的方式使 Java 程序员可以访问其中组件来解决手头问题。
|
||||||
|
|
||||||
|
可以说,一个库最重要的部分是它的应用程序编程接口(API)文档。这种文档很多人都熟悉,通常是由 [Javadoc][8] 生成的。Javadoc 读取代码中的结构化注释并以 HTML 格式输出文档,通常 API 的 <ruby>包<rt>package</rt></ruby> 在页面左上角的面板中显示,<ruby>类<rt>class</rt></ruby> 在左下角显示,同时右侧会有库、包或类级别的详细文档(具体取决于在主面板中选择的内容)。例如,[Apache Commons Math 的顶级 API 文档][9] 如下所示:
|
||||||
|
|
||||||
|
![API documentation for Apache Commons Math][10]
|
||||||
|
|
||||||
|
单击主面板中的包会显示该包中定义的 Java 类和接口。例如,[org.apache.commons.math4.analysis.solvers][11] 显示了诸如 `BisectionSolver` 这样的类,该类用于使用二分算法查找单变量实函数的零点。单击 [BisectionSolver][12] 链接会列出 `BisectionSolver` 类的所有方法。
|
||||||
|
|
||||||
|
这类文档可用作参考文档,不适合作为学习如何使用库的教程。比如,如果你知道什么是单变量实函数并查看包 `org.apache.commons.math4.analysis.function`,就可以试着使用该包来组合函数定义,然后使用 `org.apache.commons.math4.analysis.solvers` 包来查找刚刚创建的函数的零点。但如果你不知道,就可能需要更多学习向的文档,也许甚至是一个实际例子,来读懂参考文档。
|
||||||
|
|
||||||
|
这种文档结构还有助于阐明 <ruby>包<rt>package</rt></ruby>(相关 Java 类和接口定义的集合)的含义,并显示特定库中捆绑了哪些包。
|
||||||
|
|
||||||
|
这种库的代码通常是在 [.jar 文件][13] 中,它基本上是由 Java 的 `jar` 命令创建的 .zip 文件,其中还包含一些其他有用的信息。.jar 文件通常被创建为构建过程的端点,该构建过程编译了所定义包中的所有 .java 文件。
|
||||||
|
|
||||||
|
要访问外部库提供的功能,有两个主要步骤:
|
||||||
|
|
||||||
|
1. 确保通过类路径(或者命令行中的 `-cp` 参数或者 `CLASSPATH` 环境变量),库可用于 Java 编译步骤([javac][14])和执行步骤(`java`)。
|
||||||
|
2. 使用恰当的 `import` 语句访问程序源代码中的包和类。
|
||||||
|
|
||||||
|
其余的步骤就与使用 `String` 等 Java核心类相同,使用库提供的类和接口定义来编写代码。很简单对吧?不过也没那么简单。首先,你需要了解库组件的预期使用模式,然后才能编写代码。
|
||||||
|
|
||||||
|
### 示例:连接 PostgreSQL 数据库
|
||||||
|
|
||||||
|
在数据库系统中访问数据的典型使用步骤是:
|
||||||
|
|
||||||
|
1. 访问正在使用的特定数据库软件代码。
|
||||||
|
2. 连接到数据库服务器。
|
||||||
|
3. 构建查询字符串。
|
||||||
|
4. 执行查询字符串。
|
||||||
|
5. 针对返回的结果,做需要的处理。
|
||||||
|
6. 断开与数据库服务器的连接。
|
||||||
|
|
||||||
|
所有这些面向程序员的部分由接口包 [java.sql][15] 提供,它独立于数据库,定义了核心客户端 Java 数据库连接(JDBC)API。`java.sql` 包是 Java 核心库的一部分,因此无需提供 .jar 文件即可编译。但每个数据库提供者都会创建自己的 `java.sql` 接口实现(例如 `Connection` 接口),并且必须在运行步骤中提供这些实现。
|
||||||
|
|
||||||
|
接下来我们使用 PostgreSQL,看看这一过程是如何进行的。
|
||||||
|
|
||||||
|
#### 访问特定数据库的代码
|
||||||
|
|
||||||
|
以下代码使用 [Java 类加载器][16](`Class.forName()` 调用)将 PostgreSQL 驱动程序代码加载到正在执行的虚拟机中:
|
||||||
|
|
||||||
|
```
|
||||||
|
import java.sql.*;
|
||||||
|
|
||||||
|
public class Test1 {
|
||||||
|
|
||||||
|
public static void main(String args[]) {
|
||||||
|
|
||||||
|
// Load the driver (jar file must be on class path) [1]
|
||||||
|
|
||||||
|
try {
|
||||||
|
Class.forName("org.postgresql.Driver");
|
||||||
|
System.out.println("driver loaded");
|
||||||
|
} catch (Exception e1) {
|
||||||
|
System.err.println("couldn't find driver");
|
||||||
|
System.err.println(e1);
|
||||||
|
System.exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
// If we get here all is OK
|
||||||
|
|
||||||
|
System.out.println("done.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
因为类加载器可能失败,失败时会抛出异常,所以将对 `Class.forName()` 的调用放在 `try-catch` 代码块中。
|
||||||
|
|
||||||
|
如果你使用 `javac` 编译上面的代码,然后用 `java` 运行,会报异常:
|
||||||
|
|
||||||
|
```
|
||||||
|
me@mymachine:~/Test$ javac Test1.java
|
||||||
|
me@mymachine:~/Test$ java Test1
|
||||||
|
couldn't find driver
|
||||||
|
java.lang.ClassNotFoundException: org.postgresql.Driver
|
||||||
|
me@mymachine:~/Test$
|
||||||
|
```
|
||||||
|
|
||||||
|
类加载器要求类路径中有包含 PostgreSQL JDBC 驱动程序实现的 .jar 文件:
|
||||||
|
|
||||||
|
```
|
||||||
|
me@mymachine:~/Test$ java -cp ~/src/postgresql-42.2.5.jar:. Test1
|
||||||
|
driver loaded
|
||||||
|
done.
|
||||||
|
me@mymachine:~/Test$
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 连接到数据库服务器
|
||||||
|
|
||||||
|
以下代码实现了加载 JDBC 驱动程序和创建到 PostgreSQL 数据库的连接:
|
||||||
|
|
||||||
|
```
|
||||||
|
import java.sql.*;
|
||||||
|
|
||||||
|
public class Test2 {
|
||||||
|
|
||||||
|
public static void main(String args[]) {
|
||||||
|
|
||||||
|
// Load the driver (jar file must be on class path) [1]
|
||||||
|
|
||||||
|
try {
|
||||||
|
Class.forName("org.postgresql.Driver");
|
||||||
|
System.out.println("driver loaded");
|
||||||
|
} catch (Exception e1) {
|
||||||
|
System.err.println("couldn't find driver");
|
||||||
|
System.err.println(e1);
|
||||||
|
System.exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set up connection properties [2]
|
||||||
|
|
||||||
|
java.util.Properties props = new java.util.Properties();
|
||||||
|
props.setProperty("user","me");
|
||||||
|
props.setProperty("password","mypassword");
|
||||||
|
String database = "jdbc:postgresql://myhost.org:5432/test";
|
||||||
|
|
||||||
|
// Open the connection to the database [3]
|
||||||
|
|
||||||
|
try (Connection conn = DriverManager.getConnection(database, props)) {
|
||||||
|
System.out.println("connection created");
|
||||||
|
} catch (Exception e2) {
|
||||||
|
System.err.println("sql operations failed");
|
||||||
|
System.err.println(e2);
|
||||||
|
System.exit(2);
|
||||||
|
}
|
||||||
|
System.out.println("connection closed");
|
||||||
|
|
||||||
|
// If we get here all is OK
|
||||||
|
|
||||||
|
System.out.println("done.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
编译并运行上述代码:
|
||||||
|
|
||||||
|
```
|
||||||
|
me@mymachine:~/Test$ javac Test2.java
|
||||||
|
me@mymachine:~/Test$ java -cp ~/src/postgresql-42.2.5.jar:. Test2
|
||||||
|
driver loaded
|
||||||
|
connection created
|
||||||
|
connection closed
|
||||||
|
done.
|
||||||
|
me@mymachine:~/Test$
|
||||||
|
```
|
||||||
|
|
||||||
|
关于上述的一些注意事项:
|
||||||
|
|
||||||
|
* 注释 `[2]` 后面的代码使用系统属性来设置连接参数(在本例中参数为 PostgreSQL 用户名和密码)。代码也可以从 Java 命令行获取这些参数并将所有参数作为参数包传递,同时还有一些其他 `Driver.getConnection()` 选项可用于单独传递参数。
|
||||||
|
* JDBC 需要一个用于定义数据库的 URL,它在上述代码中被声明为 `String database` 并与连接参数一起传递给 `Driver.getConnection()` 方法。
|
||||||
|
* 代码使用 `try-with-resources` 语句,它会在 `try-catch` 块中的代码完成后自动关闭连接。[Stack Overflow][23] 上对这种方法进行了长期的讨论。
|
||||||
|
* `try-with-resources` 语句提供对 `Connection` 实例的访问,并可以在其中执行 SQL 语句;所有错误都会被同一个 `catch` 语句捕获。
|
||||||
|
|
||||||
|
#### 用数据库的连接处理一些有趣的事情
|
||||||
|
|
||||||
|
日常工作中,我经常需要知道为给定的数据库服务器实例定义了哪些用户,这里我使用这个 [简便的 SQL][24] 来获取所有用户的列表:
|
||||||
|
|
||||||
|
```
|
||||||
|
import java.sql.*;
|
||||||
|
|
||||||
|
public class Test3 {
|
||||||
|
|
||||||
|
public static void main(String args[]) {
|
||||||
|
|
||||||
|
// Load the driver (jar file must be on class path) [1]
|
||||||
|
|
||||||
|
try {
|
||||||
|
Class.forName("org.postgresql.Driver");
|
||||||
|
System.out.println("driver loaded");
|
||||||
|
} catch (Exception e1) {
|
||||||
|
System.err.println("couldn't find driver");
|
||||||
|
System.err.println(e1);
|
||||||
|
System.exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set up connection properties [2]
|
||||||
|
|
||||||
|
java.util.Properties props = new java.util.Properties();
|
||||||
|
props.setProperty("user","me");
|
||||||
|
props.setProperty("password","mypassword");
|
||||||
|
String database = "jdbc:postgresql://myhost.org:5432/test";
|
||||||
|
|
||||||
|
// Open the connection to the database [3]
|
||||||
|
|
||||||
|
try (Connection conn = DriverManager.getConnection(database, props)) {
|
||||||
|
System.out.println("connection created");
|
||||||
|
|
||||||
|
// Create the SQL command string [4]
|
||||||
|
|
||||||
|
String qs = "SELECT " +
|
||||||
|
" u.usename AS \"User name\", " +
|
||||||
|
" u.usesysid AS \"User ID\", " +
|
||||||
|
" CASE " +
|
||||||
|
" WHEN u.usesuper AND u.usecreatedb THEN " +
|
||||||
|
" CAST('superuser, create database' AS pg_catalog.text) " +
|
||||||
|
" WHEN u.usesuper THEN " +
|
||||||
|
" CAST('superuser' AS pg_catalog.text) " +
|
||||||
|
" WHEN u.usecreatedb THEN " +
|
||||||
|
" CAST('create database' AS pg_catalog.text) " +
|
||||||
|
" ELSE " +
|
||||||
|
" CAST('' AS pg_catalog.text) " +
|
||||||
|
" END AS \"Attributes\" " +
|
||||||
|
"FROM pg_catalog.pg_user u " +
|
||||||
|
"ORDER BY 1";
|
||||||
|
|
||||||
|
// Use the connection to create a statement, execute it,
|
||||||
|
// analyze the results and close the result set [5]
|
||||||
|
|
||||||
|
Statement stat = conn.createStatement();
|
||||||
|
ResultSet rs = stat.executeQuery(qs);
|
||||||
|
System.out.println("User name;User ID;Attributes");
|
||||||
|
while (rs.next()) {
|
||||||
|
System.out.println(rs.getString("User name") + ";" +
|
||||||
|
rs.getLong("User ID") + ";" +
|
||||||
|
rs.getString("Attributes"));
|
||||||
|
}
|
||||||
|
rs.close();
|
||||||
|
stat.close();
|
||||||
|
|
||||||
|
} catch (Exception e2) {
|
||||||
|
System.err.println("connecting failed");
|
||||||
|
System.err.println(e2);
|
||||||
|
System.exit(1);
|
||||||
|
}
|
||||||
|
System.out.println("connection closed");
|
||||||
|
|
||||||
|
// If we get here all is OK
|
||||||
|
|
||||||
|
System.out.println("done.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
在上述代码中,一旦有了 `Connection` 实例,它就会定义一个查询字符串(上面的注释 `[4]`),创建一个 `Statement` 实例并用其来执行查询字符串,然后将其结果放入一个 `ResultSet` 实例。程序可以遍历该 `ResultSet` 实例来分析返回的结果,并以关闭 `ResultSet` 和 `Statement` 实例结束(上面的注释 `[5]`)。
|
||||||
|
|
||||||
|
编译和执行程序会产生以下输出:
|
||||||
|
|
||||||
|
```
|
||||||
|
me@mymachine:~/Test$ javac Test3.java
|
||||||
|
me@mymachine:~/Test$ java -cp ~/src/postgresql-42.2.5.jar:. Test3
|
||||||
|
driver loaded
|
||||||
|
connection created
|
||||||
|
User name;User ID;Attributes
|
||||||
|
fwa;16395;superuser
|
||||||
|
vax;197772;
|
||||||
|
mbe;290995;
|
||||||
|
aca;169248;
|
||||||
|
connection closed
|
||||||
|
done.
|
||||||
|
me@mymachine:~/Test$
|
||||||
|
```
|
||||||
|
|
||||||
|
这是在一个简单的 Java 应用程序中使用 PostgreSQL JDBC 库的(非常简单的)示例。要注意的是,由于 `java.sql` 库的设计方式,它不需要在代码中使用像 `import org.postgresql.jdbc.*;` 这样的 Java 导入语句,而是使用 Java 类加载器在运行时引入 PostgreSQL 代码的方式,也正因此无需在代码编译时指定类路径。
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
via: https://opensource.com/article/20/2/external-libraries-java
|
||||||
|
|
||||||
|
作者:[Chris Hermansen][a]
|
||||||
|
选题:[lujun9972][b]
|
||||||
|
译者:[unigeorge](https://github.com/unigeorge)
|
||||||
|
校对:[wxy](https://github.com/wxy)
|
||||||
|
|
||||||
|
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||||
|
|
||||||
|
[a]: https://opensource.com/users/clhermansen
|
||||||
|
[b]: https://github.com/lujun9972
|
||||||
|
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/books_library_reading_list.jpg?itok=O3GvU1gH (books in a library, stacks)
|
||||||
|
[2]: https://commons.apache.org/
|
||||||
|
[3]: https://commons.apache.org/proper/commons-geometry/
|
||||||
|
[4]: https://commons.apache.org/proper/commons-statistics/
|
||||||
|
[5]: https://commons.apache.org/proper/commons-math/
|
||||||
|
[6]: https://commons.apache.org/proper/commons-numbers/
|
||||||
|
[7]: https://opensource.com/article/19/11/getting-started-postgresql
|
||||||
|
[8]: https://en.wikipedia.org/wiki/Javadoc
|
||||||
|
[9]: https://commons.apache.org/proper/commons-math/apidocs/index.html
|
||||||
|
[10]: https://opensource.com/sites/default/files/uploads/api-documentation_apachecommonsmath.png (API documentation for Apache Commons Math)
|
||||||
|
[11]: https://commons.apache.org/proper/commons-math/apidocs/org/apache/commons/math4/analysis/solvers/package-summary.html
|
||||||
|
[12]: https://commons.apache.org/proper/commons-math/apidocs/org/apache/commons/math4/analysis/solvers/BisectionSolver.html
|
||||||
|
[13]: https://en.wikipedia.org/wiki/JAR_(file_format)
|
||||||
|
[14]: https://en.wikipedia.org/wiki/Javac
|
||||||
|
[15]: https://docs.oracle.com/javase/8/docs/api/java/sql/package-summary.html
|
||||||
|
[16]: https://en.wikipedia.org/wiki/Java_Classloader
|
||||||
|
[17]: http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+string
|
||||||
|
[18]: http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+system
|
||||||
|
[19]: http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+exception
|
||||||
|
[20]: http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+properties
|
||||||
|
[21]: http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+connection
|
||||||
|
[22]: http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+drivermanager
|
||||||
|
[23]: https://stackoverflow.com/questions/8066501/how-should-i-use-try-with-resources-with-jdbc
|
||||||
|
[24]: https://www.postgresql.org/message-id/1121195544.8208.242.camel@state.g2switchworks.com
|
||||||
|
[25]: http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+statement
|
||||||
|
[26]: http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+resultset
|
||||||
|
[27]: http://www.google.com/search?hl=en&q=allinurl%3Adocs.oracle.com+javase+docs+api+attributes
|
@ -0,0 +1,274 @@
|
|||||||
|
[#]: collector: (lujun9972)
|
||||||
|
[#]: translator: (chunibyo-wly)
|
||||||
|
[#]: reviewer: (wxy)
|
||||||
|
[#]: publisher: (wxy)
|
||||||
|
[#]: url: (https://linux.cn/article-13744-1.html)
|
||||||
|
[#]: subject: (Deploy a deep learning model on Kubernetes)
|
||||||
|
[#]: via: (https://opensource.com/article/20/9/deep-learning-model-kubernetes)
|
||||||
|
[#]: author: (Chaimaa Zyani https://opensource.com/users/chaimaa)
|
||||||
|
|
||||||
|
在 Kubernetes 上部署一个深度学习模型
|
||||||
|
======
|
||||||
|
|
||||||
|
> 了解如何使用 Kubermatic Kubernetes 平台来部署、扩展与管理图像识别预测的深度学习模型。
|
||||||
|
|
||||||
|
![](https://img.linux.net.cn/data/attachment/album/202109/01/233417ryy87hyza7jmgy33.jpg)
|
||||||
|
|
||||||
|
随着企业增加了对人工智能(AI)、机器学习(ML)与深度学习(DL)的使用,出现了一个关键问题:如何将机器学习的开发进行规模化与产业化?这些讨论经常聚焦于机器学习模型本身;然而,模型仅仅只是完整解决方案的其中一环。为了达到生产环境的应用和规模,模型的开发过程必须还包括一个可以说明开发前后关键活动以及可公用部署的可重复过程。
|
||||||
|
|
||||||
|
本文演示了如何使用 [Kubermatic Kubernetes 平台][2] 对图像识别预测的深度学习模型进行部署、扩展与管理。
|
||||||
|
|
||||||
|
Kubermatic Kubernetes 平台是一个生产级的开源 Kubernetes 集群管理工具,提供灵活性和自动化,与机器学习/深度学习工作流程整合,具有完整的集群生命周期管理。
|
||||||
|
|
||||||
|
### 开始
|
||||||
|
|
||||||
|
这个例子部署了一个用于图像识别的深度学习模型。它使用了 [CIFAR-10][3] 数据集,包含了 60,000 张分属 10 个类别的 32x32 彩色图,同时使用了 [Apache MXNet][5] 的 [Gluon][4] 与 NVIDIA GPU 进行加速计算。如果你希望使用 CIFAR-10 数据集的预训练模型,可以查阅其 [入门指南][6]。
|
||||||
|
|
||||||
|
使用训练集中的样本对模型训练 200 次,只要训练误差保持缓慢减少,就可以保证模型不会过拟合。下方图展示了训练的过程:
|
||||||
|
|
||||||
|
![深度学习模型训练 loss 图][7]
|
||||||
|
|
||||||
|
训练结束后,必须保存模型训练所得到的参数,以便稍后可以加载它们:
|
||||||
|
|
||||||
|
```
|
||||||
|
file_name = "net.params"
|
||||||
|
net.save_parameters(file_name)
|
||||||
|
```
|
||||||
|
|
||||||
|
一旦你的模型训练好了,就可以用 Flask 服务器来封装它。下方的程序演示了如何接收请求中的一张图片作为参数,并在响应中返回模型的预测结果:
|
||||||
|
|
||||||
|
```
|
||||||
|
from gluoncv.model_zoo import get_model
|
||||||
|
import matplotlib.pyplot as plt
|
||||||
|
from mxnet import gluon, nd, image
|
||||||
|
from mxnet.gluon.data.vision import transforms
|
||||||
|
from gluoncv import utils
|
||||||
|
from PIL import Image
|
||||||
|
import io
|
||||||
|
import flask
|
||||||
|
app = flask.Flask(__name__)
|
||||||
|
|
||||||
|
@app.route("/predict",methods=["POST"])
|
||||||
|
def predict():
|
||||||
|
if flask.request.method == "POST":
|
||||||
|
if flask.request.files.get("img"):
|
||||||
|
img = Image.open(io.BytesIO(flask.request.files["img"].read()))
|
||||||
|
transform_fn = transforms.Compose([
|
||||||
|
transforms.Resize(32),
|
||||||
|
transforms.CenterCrop(32),
|
||||||
|
transforms.ToTensor(),
|
||||||
|
transforms.Normalize([0.4914, 0.4822, 0.4465], [0.2023, 0.1994, 0.2010])])
|
||||||
|
img = transform_fn(nd.array(img))
|
||||||
|
net = get_model('cifar_resnet20_v1', classes=10)
|
||||||
|
net.load_parameters('net.params')
|
||||||
|
pred = net(img.expand_dims(axis=0))
|
||||||
|
class_names = ['airplane', 'automobile', 'bird', 'cat', 'deer',
|
||||||
|
'dog', 'frog', 'horse', 'ship', 'truck']
|
||||||
|
ind = nd.argmax(pred, axis=1).astype('int')
|
||||||
|
prediction = 'The input picture is classified as [%s], with probability %.3f.'%
|
||||||
|
(class_names[ind.asscalar()], nd.softmax(pred)[0][ind].asscalar())
|
||||||
|
return prediction
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
app.run(host='0.0.0.0')
|
||||||
|
```
|
||||||
|
|
||||||
|
### 容器化模型
|
||||||
|
|
||||||
|
在将模型部署到 Kubernetes 前,你需要先安装 Docker 并使用你的模型创建一个镜像。
|
||||||
|
|
||||||
|
1. 下载、安装并启动 Docker:
|
||||||
|
|
||||||
|
```
|
||||||
|
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
|
||||||
|
sudo yum-config-manager --add-repo <https://download.docker.com/linux/centos/docker-ce.repo>
|
||||||
|
sudo yum install docker-ce
|
||||||
|
sudo systemctl start docker
|
||||||
|
```
|
||||||
|
|
||||||
|
2. 创建一个你用来管理代码与依赖的文件夹:
|
||||||
|
|
||||||
|
```
|
||||||
|
mkdir kubermatic-dl
|
||||||
|
cd kubermatic-dl
|
||||||
|
```
|
||||||
|
|
||||||
|
3. 创建 `requirements.txt` 文件管理代码运行时需要的所有依赖:
|
||||||
|
|
||||||
|
```
|
||||||
|
flask
|
||||||
|
gluoncv
|
||||||
|
matplotlib
|
||||||
|
mxnet
|
||||||
|
requests
|
||||||
|
Pillow
|
||||||
|
```
|
||||||
|
|
||||||
|
4. 创建 `Dockerfile`,Docker 将根据这个文件创建镜像:
|
||||||
|
|
||||||
|
```
|
||||||
|
FROM python:3.6
|
||||||
|
WORKDIR /app
|
||||||
|
COPY requirements.txt /app
|
||||||
|
RUN pip install -r ./requirements.txt
|
||||||
|
COPY app.py /app
|
||||||
|
CMD ["python", "app.py"]
|
||||||
|
```
|
||||||
|
|
||||||
|
这个 `Dockerfile` 主要可以分为三个部分。首先,Docker 会下载 Python 的基础镜像。然后,Docker 会使用 Python 的包管理工具 `pip` 安装 `requirements.txt` 记录的包。最后,Docker 会通过执行 `python app.py` 来运行你的脚本。
|
||||||
|
|
||||||
|
5. 构建 Docker 容器:
|
||||||
|
|
||||||
|
```
|
||||||
|
sudo docker build -t kubermatic-dl:latest .
|
||||||
|
```
|
||||||
|
这条命令使用 `kubermatic-dl` 镜像为你当前工作目录的代码创建了一个容器。
|
||||||
|
|
||||||
|
6. 使用
|
||||||
|
|
||||||
|
```
|
||||||
|
sudo docker run -d -p 5000:5000 kubermatic-dl
|
||||||
|
```
|
||||||
|
|
||||||
|
命令检查你的容器可以在你的主机上正常运行。
|
||||||
|
|
||||||
|
7. 使用
|
||||||
|
|
||||||
|
```
|
||||||
|
sudo docker ps -a
|
||||||
|
```
|
||||||
|
命令查看你本地容器的运行状态:
|
||||||
|
|
||||||
|
![查看容器的运行状态][9]
|
||||||
|
|
||||||
|
### 将你的模型上传到 Docker Hub
|
||||||
|
|
||||||
|
在向 Kubernetes 上部署模型前,你的镜像首先需要是公开可用的。你可以通过将你的模型上传到 [Docker Hub][10] 来将它公开。(如果你没有 Docker Hub 的账号,你需要先创建一个)
|
||||||
|
|
||||||
|
1. 在终端中登录 Docker Hub 账号:
|
||||||
|
|
||||||
|
```
|
||||||
|
sudo docker login
|
||||||
|
```
|
||||||
|
|
||||||
|
2. 给你的镜像打上标签,这样你的模型上传到 Docker Hub 后也能拥有版本信息:
|
||||||
|
|
||||||
|
```
|
||||||
|
sudo docker tag <your-image-id> <your-docker-hub-name>/<your-app-name>
|
||||||
|
|
||||||
|
sudo docker push <your-docker-hub-name>/<your-app-name>
|
||||||
|
```
|
||||||
|
|
||||||
|
![给镜像打上 tag][11]
|
||||||
|
|
||||||
|
3. 使用
|
||||||
|
|
||||||
|
```
|
||||||
|
sudo docker images
|
||||||
|
```
|
||||||
|
|
||||||
|
命令检查你的镜像的 ID。
|
||||||
|
|
||||||
|
### 部署你的模型到 Kubernetes 集群
|
||||||
|
|
||||||
|
1. 首先在 Kubermatic Kubernetes 平台创建一个项目, 然后根据 [快速开始][12] 创建一个 Kubernetes 集群。
|
||||||
|
|
||||||
|
![创建一个 Kubernetes 集群][13]
|
||||||
|
|
||||||
|
2. 下载用于访问你的集群的 `kubeconfig`,将它放置在下载目录中,并记得设置合适的环境变量,使得你的环境能找到它:
|
||||||
|
|
||||||
|
![Kubernetes 集群示例][14]
|
||||||
|
|
||||||
|
3. 使用 `kubectl` 命令检查集群信息,例如,需要检查 `kube-system` 是否在你的集群正常启动了就可以使用命令 `kubectl cluster-info`:
|
||||||
|
|
||||||
|
![查看集群信息][15]
|
||||||
|
|
||||||
|
4. 为了在集群中运行容器,你需要创建一个部署用的配置文件(`deployment.yaml`),再运行 `apply` 命令将其应用于集群中:
|
||||||
|
|
||||||
|
```
|
||||||
|
apiVersion: apps/v1
|
||||||
|
kind: Deployment
|
||||||
|
metadata:
|
||||||
|
name: kubermatic-dl-deployment
|
||||||
|
spec:
|
||||||
|
selector:
|
||||||
|
matchLabels:
|
||||||
|
app: kubermatic-dl
|
||||||
|
replicas: 3
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
app: kubermatic-dl
|
||||||
|
spec:
|
||||||
|
containers:
|
||||||
|
- name: kubermatic-dl
|
||||||
|
image: kubermatic00/kubermatic-dl:latest
|
||||||
|
imagePullPolicy: Always
|
||||||
|
ports:
|
||||||
|
- containerPort: 8080
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
```
|
||||||
|
kubectl apply -f deployment.yaml`
|
||||||
|
```
|
||||||
|
|
||||||
|
5. 为了将你的部署开放到公网环境,你需要一个能够给你的容器创建外部可达 IP 地址的服务:
|
||||||
|
|
||||||
|
```
|
||||||
|
kubectl expose deployment kubermatic-dl-deployment --type=LoadBalancer --port 80 --target-port 5000`
|
||||||
|
```
|
||||||
|
|
||||||
|
6. 就快大功告成了!首先检查你布署的服务的状态,然后通过 IP 请求的你图像识别 API:
|
||||||
|
|
||||||
|
```
|
||||||
|
kubectl get service
|
||||||
|
```
|
||||||
|
|
||||||
|
![获取请求图像识别 API 的 IP 地址][16]
|
||||||
|
|
||||||
|
7. 最后根据你的外部 IP 使用以下两张图片对你的图像识别服务进行测试:
|
||||||
|
|
||||||
|
![马][17]
|
||||||
|
|
||||||
|
![狗][18]
|
||||||
|
|
||||||
|
![测试 API][19]
|
||||||
|
|
||||||
|
### 总结
|
||||||
|
|
||||||
|
在这篇教程中,你可以创建一个深度学习模型,并且使用 Flask 提供 [REST API][20] 服务。它介绍了如何将应用放在 Docker 容器中,如何将这个镜像上传到 Docker Hub 中,以及如何使用 Kubernetes 部署你的服务。只需几个简单的命令,你就可以使用 Kubermatic Kubernetes 平台部署该应用程序,并且开放服务给别人使用。
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
via: https://opensource.com/article/20/9/deep-learning-model-kubernetes
|
||||||
|
|
||||||
|
作者:[Chaimaa Zyani][a]
|
||||||
|
选题:[lujun9972][b]
|
||||||
|
译者:[chunibyo-wly](https://github.com/chunibyo-wly)
|
||||||
|
校对:[wxy](https://github.com/wxy)
|
||||||
|
|
||||||
|
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||||
|
|
||||||
|
[a]: https://opensource.com/users/chaimaa
|
||||||
|
[b]: https://github.com/lujun9972
|
||||||
|
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/brain_computer_solve_fix_tool.png?itok=okq8joti (Brain on a computer screen)
|
||||||
|
[2]: https://www.loodse.com/products/kubermatic/
|
||||||
|
[3]: https://www.cs.toronto.edu/~kriz/cifar.html
|
||||||
|
[4]: https://gluon.mxnet.io/
|
||||||
|
[5]: https://mxnet.apache.org/
|
||||||
|
[6]: https://gluon-cv.mxnet.io/build/examples_classification/demo_cifar10.html
|
||||||
|
[7]: https://opensource.com/sites/default/files/uploads/trainingplot.png (Deep learning model training plot)
|
||||||
|
[8]: https://creativecommons.org/licenses/by-sa/4.0/
|
||||||
|
[9]: https://opensource.com/sites/default/files/uploads/containerstatus.png (Checking the container's status)
|
||||||
|
[10]: https://hub.docker.com/
|
||||||
|
[11]: https://opensource.com/sites/default/files/uploads/tagimage.png (Tagging the image)
|
||||||
|
[12]: https://docs.kubermatic.com/kubermatic/v2.13/installation/install_kubermatic/_installer/
|
||||||
|
[13]: https://opensource.com/sites/default/files/uploads/kubernetesclusterempty.png (Create a Kubernetes cluster)
|
||||||
|
[14]: https://opensource.com/sites/default/files/uploads/kubernetesexamplecluster.png (Kubernetes cluster example)
|
||||||
|
[15]: https://opensource.com/sites/default/files/uploads/clusterinfo.png (Checking the cluster info)
|
||||||
|
[16]: https://opensource.com/sites/default/files/uploads/getservice.png (Get the IP address to call your image recognition API)
|
||||||
|
[17]: https://opensource.com/sites/default/files/uploads/horse.jpg (Horse)
|
||||||
|
[18]: https://opensource.com/sites/default/files/uploads/dog.jpg (Dog)
|
||||||
|
[19]: https://opensource.com/sites/default/files/uploads/testapi.png (Testing the API)
|
||||||
|
[20]: https://www.redhat.com/en/topics/api/what-is-a-rest-api
|
69
published/202109/20210228 What is GNU-Linux Copypasta.md
Normal file
69
published/202109/20210228 What is GNU-Linux Copypasta.md
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
[#]: subject: (What is GNU/Linux Copypasta?)
|
||||||
|
[#]: via: (https://itsfoss.com/gnu-linux-copypasta/)
|
||||||
|
[#]: author: (Abhishek Prakash https://itsfoss.com/author/abhishek/)
|
||||||
|
[#]: collector: (lujun9972)
|
||||||
|
[#]: translator: (wxy)
|
||||||
|
[#]: reviewer: (wxy)
|
||||||
|
[#]: publisher: (wxy)
|
||||||
|
[#]: url: (wxy)
|
||||||
|
|
||||||
|
谈谈 GNU/Linux 口水话
|
||||||
|
======
|
||||||
|
|
||||||
|
![](https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/02/gnu-linux-copypasta.png)
|
||||||
|
|
||||||
|
作为一个 Linux 用户,你可能遇到过以这样开头的一大段文字:“我想插一句话。你所说的 Linux,实际上是指 GNU/Linux。”
|
||||||
|
|
||||||
|
这让一些人对什么是 “Linux” 和什么是 “GNU/Linux” 感到困惑。对此,我在关于 [Linux 发行版的概念][1] 的文章中已经解释过。
|
||||||
|
|
||||||
|
基本上,[Linux 是一个内核][2],加上 [GNU 软件][3],它就可以以操作系统的形式使用。
|
||||||
|
|
||||||
|
许多纯粹主义者和拥趸们不希望人们忘记 GNU 对基于 Linux 的操作系统的贡献。因此,他们经常在各种论坛和社区发布这篇长文(被称为 GNU Linux <ruby>口水话<rt>copypaste</rt></ruby>)。
|
||||||
|
|
||||||
|
我不清楚这些 GNU/Linux 口水话的起源,也不清楚它是从什么时候开始出现的。有些人把它归功于 Richard Stallman 的 [2011 年在 GNU 博客上的文章][4]。我无法证实或否认这一点。
|
||||||
|
|
||||||
|
### 完整的 GNU/Linux 口水话
|
||||||
|
|
||||||
|
> 我只想插一句话。你所说的 Linux,实际上是 GNU/Linux,或者正如我最近所称,是 GNU + Linux。Linux 本身并不是一个操作系统,而是功能齐全的 GNU 系统的另一个自由组件,这个系统是由 GNU 核心库、shell 实用程序和重要的系统组件组成的、按 POSIX 定义构成的完整操作系统。
|
||||||
|
>
|
||||||
|
> 许多计算机用户每天都在运行着一个修改过的 GNU 系统,却没有意识到这一点。通过一个奇特的转折,这个今天被广泛使用的 GNU 版本通常被称为 Linux,而它的许多用户并不知道它基本上是由 GNU 项目开发的 GNU 系统。
|
||||||
|
>
|
||||||
|
> Linux 倒也真的是存在,这些人也在使用它,但它只是他们使用的系统的一部分罢了。Linux 是内核:在系统中该程序将机器的资源分配给你运行的其他程序。内核是操作系统的一个重要部分,但它本身是无用的;它只能在一个完整的操作系统的环境下发挥作用。Linux 通常与 GNU 操作系统结合使用:整个系统基本上是添加了 Linux 的 GNU,或者叫 GNU/Linux。所有所谓的 Linux 发行版实际上都是 GNU/Linux 的发行版!
|
||||||
|
|
||||||
|
### 到底什么是口水话?
|
||||||
|
|
||||||
|
![][7]
|
||||||
|
|
||||||
|
你是否注意到,我使用了“Copypasta”(LCTT 译注:译者选择翻译为“口水话”,或许有更贴合中文的译法,请大家指正)这个术语。它与<ruby>意大利面<rt>pasta</rt></ruby>毫无关系。
|
||||||
|
|
||||||
|
[口水话][8] 是在互联网上复制和粘贴的文本块,通常是为了嘲弄或取笑别人。它是“<ruby>复制-粘贴<rt>copy-paste</rt></ruby>”一词的变种。
|
||||||
|
|
||||||
|
口水话也被认为是垃圾内容,因为它们被重复了一次又一次。以 GNU Linux 口水话为例。如果每次有人在讨论区中使用 Linux 这个词而不是 GNU/Linux 时,总会有几个人不断地粘贴这些大段的文本,那么就会惹恼其他成员。
|
||||||
|
|
||||||
|
### 你有没有贴过 GNU/Linux 口水话?
|
||||||
|
|
||||||
|
就个人而言,我从来没有这样做过。但是,说实话,当我还是一个新的 Linux 用户,在浏览一些 Linux 论坛时,我就是这样知道 GNU/Linux 这个术语的。
|
||||||
|
|
||||||
|
你呢?你有没有在 Linux 论坛上复制粘贴过“我想插一句话……”?你认为它是“嘲弄”工具,还是让人们了解 GNU 项目的必要之举?
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
via: https://itsfoss.com/gnu-linux-copypasta/
|
||||||
|
|
||||||
|
作者:[Abhishek Prakash][a]
|
||||||
|
选题:[lujun9972][b]
|
||||||
|
译者:[wxy](https://github.com/wxy)
|
||||||
|
校对:[wxy](https://github.com/wxy)
|
||||||
|
|
||||||
|
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||||
|
|
||||||
|
[a]: https://itsfoss.com/author/abhishek/
|
||||||
|
[b]: https://github.com/lujun9972
|
||||||
|
[1]: https://itsfoss.com/what-is-linux-distribution/
|
||||||
|
[2]: https://itsfoss.com/what-is-linux/
|
||||||
|
[3]: https://www.gnu.org/
|
||||||
|
[4]: https://www.gnu.org/gnu/linux-and-gnu.html
|
||||||
|
[5]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/09/what-is-foss.png?fit=800%2C450&ssl=1
|
||||||
|
[6]: https://itsfoss.com/what-is-foss/
|
||||||
|
[7]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/02/copypasta.png?resize=800%2C450&ssl=1
|
||||||
|
[8]: https://www.makeuseof.com/what-is-a-copypasta/
|
@ -0,0 +1,123 @@
|
|||||||
|
[#]: subject: (Can We Recommend Linux for Gaming in 2021?)
|
||||||
|
[#]: via: (https://news.itsfoss.com/linux-for-gaming-opinion/)
|
||||||
|
[#]: author: (Ankush Das https://news.itsfoss.com/author/ankush/)
|
||||||
|
[#]: collector: (lujun9972)
|
||||||
|
[#]: translator: (perfiffer)
|
||||||
|
[#]: reviewer: (wxy)
|
||||||
|
[#]: publisher: (wxy)
|
||||||
|
[#]: url: (https://linux.cn/article-13826-1.html)
|
||||||
|
|
||||||
|
2021 年了,我们能推荐使用 Linux 来玩游戏吗?
|
||||||
|
======
|
||||||
|
|
||||||
|
> 每天,Linux 都在进行不断进步,以支持具有适当图形支持的现代游戏。但是,我们能推荐 Linux 用于游戏吗?
|
||||||
|
|
||||||
|
![](https://i0.wp.com/news.itsfoss.com/wp-content/uploads/2021/04/Gaming-On-Linux.jpg?w=1200&ssl=1)
|
||||||
|
|
||||||
|
你经常会听到 Linux 爱好者称赞 Linux 上改进的游戏功能。是的,考虑到在 Linux 桌面上支持现代游戏所取得的进步,Linux 已经在游戏方面获得了很大的提升。
|
||||||
|
|
||||||
|
甚至 Lutris 的创造者在我们的采访中也提到 [Linux 在游戏方面取得的进步简直令人难以置信][1]。
|
||||||
|
|
||||||
|
但是,这有什么值得大肆宣传的吗?我们能向游戏玩家推荐 Linux 吗? Linux 适合玩游戏吗?
|
||||||
|
|
||||||
|
此文中,我想分享一些关于在 Linux 系统上玩游戏的的事情,并分享我对它的看法。
|
||||||
|
|
||||||
|
### 你可以在 Linux 上玩游戏吗?是的!
|
||||||
|
|
||||||
|
如果有人曾经告诉过你,不能在 Linux 上玩游戏,**那是不对的**。
|
||||||
|
|
||||||
|
你可以在 Linux 上玩各种游戏而不会出现任何大的障碍。而且,在大多数情况下,它是可玩的,并且会提供很好的游戏体验。
|
||||||
|
|
||||||
|
事实上,如果你不知道从哪里开始,我们有一份 [Linux 游戏终极指南][2] 提供给你。
|
||||||
|
|
||||||
|
### 需要一个特定的 Linux 发行版才能玩游戏吗?
|
||||||
|
|
||||||
|
并非如此。这取决于你想获得多么方便的体验。
|
||||||
|
|
||||||
|
例如,如果你希望 Linux 发行版能够与你的图形驱动程序很好地配合,并获得最新的硬件支持,那么有一些发行版可以做到。同样,如果你只是想用集成的 GPU 玩原生的 Linux 独立游戏,任何发行版都可以。
|
||||||
|
|
||||||
|
因此,在你开启 Linux 游戏之旅的同时,会有一些因素影响你对发行版的选择。
|
||||||
|
|
||||||
|
不用担心,为了帮助你,我们提供了一份有用的 [最佳 Linux 游戏发行版列表][3]。
|
||||||
|
|
||||||
|
### Linux 上的虚拟现实游戏,唉……
|
||||||
|
|
||||||
|
![][4]
|
||||||
|
|
||||||
|
我确信 VR 游戏还没有完全普及。但是,如果你想要在 VR 头盔上获得激动人心的体验,那么**选择 Linux 作为你的首选平台可能不是一个好主意**。
|
||||||
|
|
||||||
|
你没有在 Linux 上获得便利体验所需的驱动程序或应用程序。没有任何发行版可以帮助你解决此问题。
|
||||||
|
|
||||||
|
如果你想了解有关虚拟现实状态的详细信息,可以看看 [Boiling Steam][5] 上的博客文章和 [GamingOnLinux][6] 上的使用 Valve 的 VR 头盔的有趣体验。
|
||||||
|
|
||||||
|
我已经提供了这些博客文章的链接以供参考,但总而言之 —— 如果你想体验 VR 游戏,请避免使用 Linux(如果你实在太闲,请随意尝试)。
|
||||||
|
|
||||||
|
### 可以在 Linux 上玩 Windows 系统的游戏吗?
|
||||||
|
|
||||||
|
可以,也不可以。
|
||||||
|
|
||||||
|
你可以使用 [Steam Play 来玩 Windows 专属的游戏][7],但是它也存在一些问题,并不是每个游戏都可以运行。
|
||||||
|
|
||||||
|
例如,我最终还是使用 Windows 来玩《[地平线 4][8]》。如果你喜欢汽车模拟或赛车游戏,这是一款你可能不想错过的杰作。
|
||||||
|
|
||||||
|
或许我们在不久的将来可以看到它通过 Steam Play 完美的运行,谁知道呢?
|
||||||
|
|
||||||
|
因此,可以肯定的是,你会遇到许多类似的游戏,可能根本无法运行。这是残酷的事实。
|
||||||
|
|
||||||
|
而且,要知道该游戏是否可以在 Linux 上运行,请前往 [ProtonDB][9] 并搜索该游戏,看看它是否至少具有 “**黄金**” 状态。
|
||||||
|
|
||||||
|
### 带有反作弊引擎的多人游戏可以吗?
|
||||||
|
|
||||||
|
![][10]
|
||||||
|
|
||||||
|
许多游戏玩家更喜欢玩多人游戏,如《[Apex Legends][11]》、《[彩虹六号:围攻][12]》和《[堡垒之夜][13]》。
|
||||||
|
|
||||||
|
然而,一些依赖于反作弊引擎的流行游戏还不能在 Linux 上运行。它仍然是一项进行中的工作,可能在未来的 Linux 内核版本中实现 —— 但目前还没有。
|
||||||
|
|
||||||
|
请注意,像 《[反恐精英:全球攻势][14]》、《Dota 2》、《军团要塞 2》、《[英灵神殿][15]》等多人游戏提供原生 Linux 支持并且运行良好!
|
||||||
|
|
||||||
|
### 我会推荐使用 Linux 来玩游戏吗?
|
||||||
|
|
||||||
|
![][16]
|
||||||
|
|
||||||
|
考虑到你可以玩很多 Windows 专属的游戏、原生的独立游戏,以及 Linux 原生支持的各种 AAA 游戏,我能推荐初次使用者尝试在 Linux 上玩游戏。
|
||||||
|
|
||||||
|
但是,需要**注意**的是 —— 我建议你列出你想玩的游戏列表,以确保它在 Linux 上运行没有任何问题。否则,你最终都可能浪费大量时间进行故障排除而没有结果。
|
||||||
|
|
||||||
|
不要忘记,我相信 Linux 上的 VR 游戏是一个很大的问题。
|
||||||
|
|
||||||
|
而且,如果你想探索所有最新最好的游戏,我建议你坚持使用 Windows 的游戏电脑。
|
||||||
|
|
||||||
|
**虽然我应该鼓励更多的用户采用 Linux 作为游戏平台,但我不会忽视为什么普通消费者仍然喜欢使用 Windows 机器来玩游戏的客观事实。**
|
||||||
|
|
||||||
|
你怎么认为呢?你同意我的想法吗?欢迎在下方的评论区分享你的想法!
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
via: https://news.itsfoss.com/linux-for-gaming-opinion/
|
||||||
|
|
||||||
|
作者:[Ankush Das][a]
|
||||||
|
选题:[lujun9972][b]
|
||||||
|
译者:[perfiffer](https://github.com/perfiffer)
|
||||||
|
校对:[wxy](https://github.com/wxy)
|
||||||
|
|
||||||
|
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||||
|
|
||||||
|
[a]: https://news.itsfoss.com/author/ankush/
|
||||||
|
[b]: https://github.com/lujun9972
|
||||||
|
[1]: https://news.itsfoss.com/lutris-creator-interview/
|
||||||
|
[2]: https://itsfoss.com/linux-gaming-guide/
|
||||||
|
[3]: https://itsfoss.com/linux-gaming-distributions/
|
||||||
|
[4]: https://i0.wp.com/news.itsfoss.com/wp-content/uploads/2021/04/linux-gaming-vr.jpg?w=1200&ssl=1
|
||||||
|
[5]: https://boilingsteam.com/the-state-of-virtual-reality-on-linux/
|
||||||
|
[6]: https://www.gamingonlinux.com/2020/08/my-experiences-of-valves-vr-on-linux
|
||||||
|
[7]: https://itsfoss.com/steam-play/
|
||||||
|
[8]: https://forzamotorsport.net/en-US/games/fh4
|
||||||
|
[9]: https://www.protondb.com/
|
||||||
|
[10]: https://i1.wp.com/news.itsfoss.com/wp-content/uploads/2021/04/linux-gaming-illustration.jpg?w=1200&ssl=1
|
||||||
|
[11]: https://www.ea.com/games/apex-legends
|
||||||
|
[12]: https://www.ubisoft.com/en-us/game/rainbow-six/siege
|
||||||
|
[13]: https://www.epicgames.com/fortnite/en-US/home
|
||||||
|
[14]: https://store.steampowered.com/app/730/CounterStrike_Global_Offensive/
|
||||||
|
[15]: https://store.steampowered.com/app/892970/Valheim/
|
||||||
|
[16]: https://i1.wp.com/news.itsfoss.com/wp-content/uploads/2021/04/gaming-on-linux-support.jpg?w=1200&ssl=1
|
174
published/202109/20210622 What is a config file.md
Normal file
174
published/202109/20210622 What is a config file.md
Normal file
@ -0,0 +1,174 @@
|
|||||||
|
[#]: subject: (What is a config file?)
|
||||||
|
[#]: via: (https://opensource.com/article/21/6/what-config-files)
|
||||||
|
[#]: author: (Seth Kenlon https://opensource.com/users/seth)
|
||||||
|
[#]: collector: (lujun9972)
|
||||||
|
[#]: translator: (unigeorge)
|
||||||
|
[#]: reviewer: (wxy)
|
||||||
|
[#]: publisher: (wxy)
|
||||||
|
[#]: url: (https://linux.cn/article-13832-1.html)
|
||||||
|
|
||||||
|
浅谈配置文件格式
|
||||||
|
======
|
||||||
|
|
||||||
|
> 流行的配置文件格式有若干种,每种都有其自身优势。从中找到最适合你的格式吧!
|
||||||
|
|
||||||
|
![](https://img.linux.net.cn/data/attachment/album/202109/29/134955py5ypl58dgplyx4x.jpg)
|
||||||
|
|
||||||
|
计算机上有数以千计的配置文件。你可能永远不会直接与其中的大部分文件打交道,但它们确实散落在你的 `/etc` 以及 `~/.config`、`~/.local`、`/usr` 文件夹中。还有一些可能在 `/var`,甚至 `/opt` 文件夹中。如果无意中打开过或更改过它们,你就可能会有疑问:为什么有些配置文件看起来是某一种格式,而另一些则是看起来完全不同的格式?
|
||||||
|
|
||||||
|
存储配置是一项很灵活的任务,因为只要开发人员知道他们的代码是如何将数据存入文件的,他们就可以轻松编写代码来根据需要提取数据。然而,科技行业非常青睐有详细文档的标准化事物,因此多年来出现了几种比较普遍的格式用来简化配置任务。
|
||||||
|
|
||||||
|
### 为什么我们需要配置文件
|
||||||
|
|
||||||
|
配置文件对于现代计算来说很重要。它们使你能够自定义与应用程序交互的方式,或自定义应用程序与系统内其他程序的交互方式。有了配置文件,每当你启动某个应用程序时,它都会有“记忆”,记录了你喜欢如何去使用该程序。
|
||||||
|
|
||||||
|
配置文件的结构可以很简单,而且通常确实也很简单。例如,如果你要编写一个应用程序,程序唯一需要知道的是其用户的偏好名字,那么它的唯一配置文件就可以只包含一个词:用户名。就像下面这样:
|
||||||
|
|
||||||
|
```
|
||||||
|
Tux
|
||||||
|
```
|
||||||
|
|
||||||
|
但通常应用程序需要追踪的不仅仅是一条信息,因此配置文件通常会有一个键和一个值:
|
||||||
|
|
||||||
|
```
|
||||||
|
NAME='Tux'
|
||||||
|
SPECIES='Penguin'
|
||||||
|
```
|
||||||
|
|
||||||
|
即使没有编程经验,你也可以想象出代码如何解析这些数据。这里有两个简单的例子,一个使用 [awk 命令][2],另一个使用 [grep 命令][3]。两个例子都是只关注包含 `NAME` “键”的行,并返回出现在等号 (`=`) 之后的“值”:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ awk -F'=' '/NAME/ { print $2; }' myconfig.ini
|
||||||
|
'Tux'
|
||||||
|
$ grep NAME fake.txt | cut -d'=' -f2
|
||||||
|
'Tux'
|
||||||
|
```
|
||||||
|
|
||||||
|
同样的原则适用于任何编程语言和任何配置文件。只要你有统一的数据结构,就可以在需要的时候编写简单的代码来提取和解析它。
|
||||||
|
|
||||||
|
### 选择格式
|
||||||
|
|
||||||
|
为了保证普遍有效性,配置文件最重要的一点是它们是一致的和可预测的。你绝对不会想做这样的事:以保存用户首选项的名义,将信息随意存储到文件中,然后花好几天时间逆向工程,来找到最终出现在文件中的随机信息。
|
||||||
|
|
||||||
|
流行的配置文件格式有若干种,每种格式都有自己的优势。
|
||||||
|
|
||||||
|
#### INI
|
||||||
|
|
||||||
|
INI 文件采用了键值对的格式:
|
||||||
|
|
||||||
|
```
|
||||||
|
[example]
|
||||||
|
name=Tux
|
||||||
|
style=widgety,fidgety
|
||||||
|
enabled=1
|
||||||
|
```
|
||||||
|
|
||||||
|
这种简单的配置风格很直观,只要你别选择使用糟糕的键名(比如用 `unampref` 这样的神秘键名来代替 `name`)就好。这些键值对很容易解析和编辑。
|
||||||
|
|
||||||
|
除了键和值之外,INI 格式还可以分 <ruby>节<rt>section</rt></ruby>。在下列示例代码中,`[example]` 和 `[demo]` 就是配置文件中的两个节:
|
||||||
|
|
||||||
|
```
|
||||||
|
[example]
|
||||||
|
name=Tux
|
||||||
|
style=widgety,fidgety
|
||||||
|
enabled=1
|
||||||
|
|
||||||
|
[demo]
|
||||||
|
name=Beastie
|
||||||
|
fullscreen=1
|
||||||
|
```
|
||||||
|
|
||||||
|
这几个配置语句解析起来有点复杂,因为有两个 `name` 键。想象一下,一个粗心的程序员在这个配置文件中查询 `name`,结果总是返回 `Beastie`,因为这是文件中对 `name` 的最后一个定义值。在解析这样的文件时,开发人员必须加倍小心地在各节中搜索键,这可能会很棘手,具体取决于用来解析该文件的语言。然而,它仍然是一种很流行的格式,大多数语言都会有一个现成的库来帮助程序员解析 INI 文件。
|
||||||
|
|
||||||
|
#### YAML
|
||||||
|
|
||||||
|
[YAML 文件][4] 是结构化列表,可以包含值或者键值对:
|
||||||
|
|
||||||
|
```
|
||||||
|
---
|
||||||
|
Example:
|
||||||
|
Name: 'Tux'
|
||||||
|
Style:
|
||||||
|
- 'widgety'
|
||||||
|
- 'fidgety'
|
||||||
|
Enabled: 1
|
||||||
|
```
|
||||||
|
|
||||||
|
YAML 格式很流行,部分原因是它看起来很整洁。数据要放置到相对其上层数据的特定位置,除此之外没有太多其他语法。然而,对于某些人来说的这种特色,在其他人眼中可能就是一个问题。许多开发人员不愿使用 YAML,正是因为它很看重本质上 _不存在_ 的东西。如果你在 YAML 中缩进错误,YAML 解析器可能会将你的文件视为无效文件,即使不视为无效,返回的数据也可能是错误的。
|
||||||
|
|
||||||
|
大多数语言都有 YAML 解析器,并且有很好的开源 YAML linters(验证语法的应用程序)来帮你确保 YAML 文件的完整性。
|
||||||
|
|
||||||
|
#### JSON
|
||||||
|
|
||||||
|
JSON 文件在技术上来说是 YAML 的子集,因此其数据结构是相同的,尽管其语法完全不同:
|
||||||
|
|
||||||
|
```
|
||||||
|
{
|
||||||
|
"Example": {
|
||||||
|
"Name": [
|
||||||
|
"Tux"
|
||||||
|
],
|
||||||
|
"Style": [
|
||||||
|
"widgety",
|
||||||
|
"fidgety"
|
||||||
|
],
|
||||||
|
"Enabled": 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
JSON 在 JavaScript 程序员中很流行,这并不奇怪,因为 JSON 全称为<ruby>JavaScript 对象符号<rt>JavaScript Object Notation</rt></ruby>。由于与 Web 开发密切相关,JSON 是 Web API 的常见输出格式。大多数编程语言都有解析 JSON 的库。
|
||||||
|
|
||||||
|
#### XML
|
||||||
|
|
||||||
|
XML 使用标签作为键,将配置值围绕起来:
|
||||||
|
|
||||||
|
```
|
||||||
|
<example>
|
||||||
|
<name>Tux</name>
|
||||||
|
<style priority="user">widgety</style>
|
||||||
|
<style priority="fallback">fidgety</style>
|
||||||
|
<enabled>1</enabled>
|
||||||
|
</example>
|
||||||
|
```
|
||||||
|
|
||||||
|
XML 经常被 Java 程序员使用,Java 有一套丰富的 XML 解析器。虽然 XML 以非常严格而著称,但同时也非常灵活。与有一系列特定标签的 HTML 不同,XML 中可以随意发明自己的标签。只要始终坚持相同的构建规则,并有一个良好的库来解析它,你就可以准确而轻松地提取数据。
|
||||||
|
|
||||||
|
有一些很好的开源 linter 可以帮你验证 XML 文件,并且大多数编程语言都提供用于解析 XML 的库。
|
||||||
|
|
||||||
|
#### 二进制格式
|
||||||
|
|
||||||
|
Linux 以纯文本配置为傲。这样做的优点是可以使用 [cat][5] 等基本工具查看配置数据,甚至可以使用你 [最喜欢的文本编辑器][6] 来编辑配置。
|
||||||
|
|
||||||
|
但是,某些应用程序使用二进制格式配置,就意味着数据以某种非自然语言的格式进行编码。这些文件通常需要一个特殊的应用程序(通常是它们要配置的应用程序)来解释它们的数据。你无法查看这些文件,至少无法以任何有意义的方式查看,并且无法在其宿主应用程序之外编辑它们。选用二进制格式的一些原因如下:
|
||||||
|
|
||||||
|
* **速度:** 程序员可以使用自定义符号在二进制配置文件中的某些点注册特定的信息位。提取数据时不涉及搜索,因为所有内容都已标注了索引。
|
||||||
|
* **大小:** 文本文件可能会变大,如果选择压缩文本文件,实际上是在将其转换为二进制格式。二进制文件可以通过编码技巧变得更小(文本文件也是如此,但在某些时候,你的优化会使数据变得晦涩,以至于文件也成了二进制文件)。
|
||||||
|
* **晦涩:** 一些程序员甚至不希望人们查看他们的配置文件,因此将它们编码为二进制数据。这通常只会让用户感到沮丧,并不是使用二进制格式的好理由。
|
||||||
|
|
||||||
|
如果必须使用二进制格式进行配置,请使用已作为开放标准存在的格式,例如 [NetCDF][7]。
|
||||||
|
|
||||||
|
### 找到有效的配置格式
|
||||||
|
|
||||||
|
配置格式帮助开发人员存储应用程序所需的数据,并帮助用户存储他们希望应用程序如何操作的偏好项。对于应该使用什么格式的问题,可能没有错误的答案,只要你觉得所使用的语言能很好地支持就可以。在开发应用程序时,查看可用格式,用一些样例数据建模,查看和评估你的编程语言提供的库和实用程序,然后选择你觉得最合适的一种格式吧。
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
via: https://opensource.com/article/21/6/what-config-files
|
||||||
|
|
||||||
|
作者:[Seth Kenlon][a]
|
||||||
|
选题:[lujun9972][b]
|
||||||
|
译者:[unigeorge](https://github.com/unigeorge)
|
||||||
|
校对:[wxy](https://github.com/wxy)
|
||||||
|
|
||||||
|
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||||
|
|
||||||
|
[a]: https://opensource.com/users/seth
|
||||||
|
[b]: https://github.com/lujun9972
|
||||||
|
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/browser_screen_windows_files.png?itok=kLTeQUbY (Computer screen with files or windows open)
|
||||||
|
[2]: https://opensource.com/article/20/9/awk-ebook
|
||||||
|
[3]: https://opensource.com/downloads/grep-cheat-sheet
|
||||||
|
[4]: https://www.redhat.com/sysadmin/yaml-beginners
|
||||||
|
[5]: https://opensource.com/article/19/2/getting-started-cat-command
|
||||||
|
[6]: https://opensource.com/article/21/2/open-source-text-editors
|
||||||
|
[7]: https://www.unidata.ucar.edu/software/netcdf/
|
@ -0,0 +1,116 @@
|
|||||||
|
[#]: subject: (Apps for daily needs part 2: office suites)
|
||||||
|
[#]: via: (https://fedoramagazine.org/apps-for-daily-needs-part-2-office-suites/)
|
||||||
|
[#]: author: (Arman Arisman https://fedoramagazine.org/author/armanwu/)
|
||||||
|
[#]: collector: (lujun9972)
|
||||||
|
[#]: translator: (wxy)
|
||||||
|
[#]: reviewer: (wxy)
|
||||||
|
[#]: publisher: (wxy)
|
||||||
|
[#]: url: (https://linux.cn/article-13755-1.html)
|
||||||
|
|
||||||
|
满足日常需求的应用(二):办公套件
|
||||||
|
======
|
||||||
|
|
||||||
|
![][1]
|
||||||
|
|
||||||
|
今天,几乎每个家庭都有一台台式电脑或笔记本电脑。这是因为计算机已经成为一个非常重要的要求。此外,不管是为了工作还是学习,许多人需要创建电子版的文档和演示文稿。因此,办公套件是几乎所有计算机上的必备应用程序。本文将介绍一些你可以在 Fedora Linux 上使用的开源办公套件。这些软件你可能需要安装。如果你不熟悉如何在 Fedora Linux 中添加软件包,请参阅我之前的文章 [安装 Fedora 34 工作站后要做的事情][4]。下面是满足日常需求的办公套件类的应用程序列表。
|
||||||
|
|
||||||
|
### LibreOffice
|
||||||
|
|
||||||
|
LibreOffice 是 GNU/Linux 用户中最流行的办公套件。它的用户界面和用户体验类似于微软 Office。这使得 LibreOffice 对于那些刚刚从微软 Office 迁移过来的人来说很容易学习。LibreOffice 有完整的功能,可以满足你在文档和演示方面的工作需要。它由六个应用程序组成:Writer、Calc、Impress、Draw、Math 和 Base。
|
||||||
|
|
||||||
|
第一个应用程序是 Writer,用于创建各种类型的文档,如信件、传真、议程、会议记录等。它是一个全功能的文字处理和桌面出版工具。第二个应用程序是 Calc,它是一个电子表格程序,非常适合以表格形式呈现数据和记录数据。Calc 可以创建简单的表格或进行专业的数据分析。第三个应用程序是 Impress,它是一个易于使用的演示应用程序。你可以很容易地选择你在演示幻灯片中想要的功能,如文本、图像、表格、图表等。
|
||||||
|
|
||||||
|
![LibreOffice Writer][5]
|
||||||
|
|
||||||
|
![LibreOffice Calc][6]
|
||||||
|
|
||||||
|
![LibreOffice Impress][7]
|
||||||
|
|
||||||
|
前面提到的三个 LibreOffice 应用程序是创建文档和演示文稿中最常用的应用程序。然而,LibreOffice 提供的其他三个应用程序也非常有用。第一个是 Draw,它可以用来创建从简单到复杂的图纸和图表。下一个应用程序是 Math,它可以帮助我们做出完美格式的数学和科学公式。最后一个是 Base,这是一个用于处理数据库的应用程序。
|
||||||
|
|
||||||
|
![LibreOffice Draw][8]
|
||||||
|
|
||||||
|
![LibreOffice Math][9]
|
||||||
|
|
||||||
|
![LibreOffice Base][10]
|
||||||
|
|
||||||
|
更多信息请见此链接:<https://www.libreoffice.org/>
|
||||||
|
|
||||||
|
### ONLYOFFICE
|
||||||
|
|
||||||
|
ONLYOFFICE 是一款与微软 Office 高度兼容的办公套件应用程序。因此,我们与使用微软 Office 的同事协作时就不必担心了,因为它可以读取各种文件格式,如 docx、xlsx 和 pptx。
|
||||||
|
|
||||||
|
ONLYOFFICE 提供了三种具有简洁和现代外观的应用程序。我们可以很容易地找到我们需要的功能和工具。虽然功能没有 LibreOffice 那么齐全,但也足以帮助我们创建良好的文档和演示文稿。
|
||||||
|
|
||||||
|
第一个应用程序是文档编辑器,它的功能与 LibreOffice 的 Writer 相同。它具有文字处理器所需的所有基本功能,如管理字体和样式、格式化文本、调整行距和段距、插入页眉和页脚、自定义页面布局和设置页边距。第二个应用程序是电子表格编辑器,它是一个用于处理数据并将其创建为表格格式的文件的应用程序。它是一个具有与 Calc 相同功能的应用程序。最后一个是演示文稿编辑器,它是一个演示文稿应用程序,其功能类似于 Impress。
|
||||||
|
|
||||||
|
不幸的是,ONLYOFFICE 在官方的 Fedora Linux 软件库中并没有提供。但是你仍然可以使用 Flatpak 或 Appimages 在 Fedora Linux 上安装它。
|
||||||
|
|
||||||
|
![ONLYOFFICE Documents Editor][11]
|
||||||
|
|
||||||
|
![ONLYOFFICE Spreadsheets Editor][12]
|
||||||
|
|
||||||
|
![ONLYOFFICE Presentations Editor][13]
|
||||||
|
|
||||||
|
更多信息请见此链接:<https://www.onlyoffice.com/desktop.aspx>
|
||||||
|
|
||||||
|
### Calligra
|
||||||
|
|
||||||
|
Calligra 是一个由 KDE 创建的办公套件。因此,这个应用程序实际上更适合于 KDE Plasma 桌面环境的用户。但它仍然可以在其他桌面环境中良好运行,例如使用 GNOME 的 Fedora 工作站。
|
||||||
|
|
||||||
|
Calligra 提供的几个应用程序的外观与 LibreOffice 或 ONLYOFFICE 略有不同。对于那些习惯于主流办公套件应用程序的人来说,可能需要一些适应。然而,Calligra 仍然是一个可靠的办公套件,足以支持我们的日常需求。
|
||||||
|
|
||||||
|
第一个应用程序是 Words,它是一个具有桌面出版功能的直观的文字处理器。它具有帮助我们进行文档创作的全面功能。第二个应用程序是 Sheets,它具有与 Calc 和电子表格编辑器相同的功能,是一个功能齐全的电子表格应用程序。第三个应用程序是 Stage,它可以帮助我们制作演示幻灯片。
|
||||||
|
|
||||||
|
![Calligra Words][14]
|
||||||
|
|
||||||
|
![Calligra Sheets][15]
|
||||||
|
|
||||||
|
![Calligra Stage][16]
|
||||||
|
|
||||||
|
这三个 Calligra 应用程序是创建文档和演示文稿最常用的应用程序。另外还有三个应用程序也非常有用。第一个是 Karbon,它可以用来创建从简单到复杂的图纸和图表。下一个应用程序是 Plan,这是一个项目管理应用程序,可以帮助管理具有多种资源的中等规模的项目。最后一个是 KEXI,它是一个可视化数据库应用程序的创建器。
|
||||||
|
|
||||||
|
![Calligra Karbon][17]
|
||||||
|
|
||||||
|
![Calligra Plan][18]
|
||||||
|
|
||||||
|
![Calligra Kexi][19]
|
||||||
|
|
||||||
|
更多信息请见此链接:<https://calligra.org/>
|
||||||
|
|
||||||
|
### 总结
|
||||||
|
|
||||||
|
这篇文章介绍了 3 个可以在 Fedora Linux 上使用的办公套件,以满足你的日常需要。如果你想拥有具有一套完整功能的办公套件,那么 LibreOffice 可能是正确的选择。如果想与微软 Office 有良好的兼容性,那么你可以选择 ONLYOFFICE。然而,如果你想要一个不同的用户界面和创建文档和演示文稿的体验,你可以试试 Calligra。希望这篇文章能帮助你选择合适的办公套件。如果你有使用这些应用程序的经验,请在评论中分享你的经验。
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
via: https://fedoramagazine.org/apps-for-daily-needs-part-2-office-suites/
|
||||||
|
|
||||||
|
作者:[Arman Arisman][a]
|
||||||
|
选题:[lujun9972][b]
|
||||||
|
译者:[wxy](https://github.com/wxy)
|
||||||
|
校对:[wxy](https://github.com/wxy)
|
||||||
|
|
||||||
|
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||||
|
|
||||||
|
[a]: https://fedoramagazine.org/author/armanwu/
|
||||||
|
[b]: https://github.com/lujun9972
|
||||||
|
[1]: https://fedoramagazine.org/wp-content/uploads/2021/07/FedoraMagz-Apps-2-Office-816x345.jpg
|
||||||
|
[2]: https://unsplash.com/@brookecagle?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText
|
||||||
|
[3]: https://unsplash.com/s/photos/meeting-on-cafe-computer?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText
|
||||||
|
[4]: https://fedoramagazine.org/things-to-do-after-installing-fedora-34-workstation/
|
||||||
|
[5]: https://fedoramagazine.org/wp-content/uploads/2021/07/office-libre-writer-1-1024x575.png
|
||||||
|
[6]: https://fedoramagazine.org/wp-content/uploads/2021/07/office-libre-calc-1-1024x575.png
|
||||||
|
[7]: https://fedoramagazine.org/wp-content/uploads/2021/07/office-libre-impress-1-1024x575.png
|
||||||
|
[8]: https://fedoramagazine.org/wp-content/uploads/2021/07/office-libre-draw-1-1024x575.png
|
||||||
|
[9]: https://fedoramagazine.org/wp-content/uploads/2021/07/office-libre-math-1-1024x575.png
|
||||||
|
[10]: https://fedoramagazine.org/wp-content/uploads/2021/07/office-libre-base-1-1024x575.png
|
||||||
|
[11]: https://fedoramagazine.org/wp-content/uploads/2021/07/office-only-doc-1024x575.png
|
||||||
|
[12]: https://fedoramagazine.org/wp-content/uploads/2021/07/office-only-sheet-1024x575.png
|
||||||
|
[13]: https://fedoramagazine.org/wp-content/uploads/2021/07/office-only-presentation-1024x575.png
|
||||||
|
[14]: https://fedoramagazine.org/wp-content/uploads/2021/07/office-calligra-words-1024x575.png
|
||||||
|
[15]: https://fedoramagazine.org/wp-content/uploads/2021/07/office-calligra-sheets-1024x575.png
|
||||||
|
[16]: https://fedoramagazine.org/wp-content/uploads/2021/07/office-calligra-stage-1024x575.png
|
||||||
|
[17]: https://fedoramagazine.org/wp-content/uploads/2021/07/office-calligra-karbon-1-1024x575.png
|
||||||
|
[18]: https://fedoramagazine.org/wp-content/uploads/2021/07/office-calligra-plan-1024x575.png
|
||||||
|
[19]: https://fedoramagazine.org/wp-content/uploads/2021/07/office-calligra-kexi-1024x575.png
|
@ -0,0 +1,389 @@
|
|||||||
|
[#]: subject: (Analyze the Linux kernel with ftrace)
|
||||||
|
[#]: via: (https://opensource.com/article/21/7/linux-kernel-ftrace)
|
||||||
|
[#]: author: (Gaurav Kamathe https://opensource.com/users/gkamathe)
|
||||||
|
[#]: collector: (lujun9972)
|
||||||
|
[#]: translator: (mengxinayan)
|
||||||
|
[#]: reviewer: (wxy)
|
||||||
|
[#]: publisher: (wxy)
|
||||||
|
[#]: url: (https://linux.cn/article-13752-1.html)
|
||||||
|
|
||||||
|
通过 ftrace 来分析 Linux 内核
|
||||||
|
======
|
||||||
|
|
||||||
|
> 通过 `ftrace` 来了解 Linux 内核内部工作方式是一个好方法。
|
||||||
|
|
||||||
|
![](https://img.linux.net.cn/data/attachment/album/202109/05/151954cb5z5rg7zqa9lbzu.jpg)
|
||||||
|
|
||||||
|
操作系统的内核是最难以理解的软件之一。自从你的系统启动后,它会一直在后台运行。尽管每个用户都不与内核直接交互,但他们在内核的帮助下完成自己的计算任务。与内核的交互发生在调用系统调用或者用户日常使用的各种库或应用间接调用了系统调用。
|
||||||
|
|
||||||
|
在之前的文章里我介绍了如何使用 [strace][6] 来追踪系统调用。然而,使用 `strace` 时你的视野是有限的。它允许你查看特定参数的系统调用。并在工作完成后,看到其返回值或状态,以表明是成功还是失败。但是你无法知道内核在这段时间内发生了什么。除了系统调用外,还有很多其他活动内核中发生,而你却视而不见。
|
||||||
|
|
||||||
|
### ftrace 介绍
|
||||||
|
|
||||||
|
本文的旨在通过使用一个名为 `ftrace` 的机制来阐明追踪内核函数的一些情况。它使得任何 Linux 用户可以轻松地追踪内核,并且了解更多关于 Linux 内核内部如何工作。
|
||||||
|
|
||||||
|
`ftrace` 默认产生的输出往往是巨大的,因为内核总是忙碌的。为了节省空间,很多情况下我会通过截断来给出尽量小的输出。
|
||||||
|
|
||||||
|
我使用 Fedora 来演示下面的例子,但是它们应该在其他最新的 Linux 发行版上同样可以运行。
|
||||||
|
|
||||||
|
### 启用 ftrace
|
||||||
|
|
||||||
|
`ftrace` 现在已经是内核中的一部分了,你不再需要事先安装它了。也就是说,如果你在使用最近的 Linux 系统,那么 `ftrace` 是已经启用了的。为了验证 `ftrace` 是否可用,运行 `mount` 命令并查找 `tracefs`。如果你看到类似下面的输出,表示 `ftrace` 已经启用,你可以轻松地尝试本文中下面的例子。下面有些命令需要在 root 用户下使用(用 `sudo` 执行是不够的)。
|
||||||
|
|
||||||
|
```
|
||||||
|
# mount | grep tracefs
|
||||||
|
none on /sys/kernel/tracing type tracefs (rw,relatime,seclabel)
|
||||||
|
```
|
||||||
|
|
||||||
|
要想使用 `ftrace`,你首先需要进入上面 `mount` 命令中找到的特定目录中,在那个目录下运行文章中的其他命令。
|
||||||
|
|
||||||
|
```
|
||||||
|
# cd /sys/kernel/tracing
|
||||||
|
```
|
||||||
|
|
||||||
|
### 一般的工作流程
|
||||||
|
|
||||||
|
首先,你需要理解捕捉踪迹和获取输出的一般流程。如果你直接运行 `ftrace`,不会运行任何特定的 `ftrace` 命令。相反的,基本操作是通过标准 Linux 命令来写入或读取一些文件。
|
||||||
|
|
||||||
|
一般的步骤如下:
|
||||||
|
|
||||||
|
1. 通过写入一些特定文件来启用/结束追踪
|
||||||
|
2. 通过写入一些特定文件来设置/取消追踪时的过滤规则
|
||||||
|
3. 从文件中读取基于第 1 和 2 步的追踪输出
|
||||||
|
4. 从文件中清除早期输出或缓冲区
|
||||||
|
5. 缩小到你的特定用例(你要追踪的内核函数),重复 1、2、3、4 步
|
||||||
|
|
||||||
|
### 可用的追踪器类型
|
||||||
|
|
||||||
|
有多种不同的追踪器可供使用。之前提到,在运行任何命令前,你需要进入一个特定的目录下,因为需要的文件在这些目录下。我在我的例子中使用了相对路径(而不是绝对路径)。
|
||||||
|
|
||||||
|
你可以查看 `available_tracers` 文件内容来查看所有可用的追踪器类型。你可以看下面列出了几个。不需要担心这些:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ pwd
|
||||||
|
/sys/kernel/tracing
|
||||||
|
|
||||||
|
$ sudo cat available_tracers
|
||||||
|
hwlat blk mmiotrace function_graph wakeup_dl wakeup_rt wakeup function nop
|
||||||
|
```
|
||||||
|
|
||||||
|
在所有输出的追踪器中,我会聚焦于下面三个特殊的:启用追踪的 `function` 和 `function_graph`,以及停止追踪的 `nop`。
|
||||||
|
|
||||||
|
### 确认当前的追踪器
|
||||||
|
|
||||||
|
通常情况默认的追踪器设定为 `nop`。即在特殊文件中 `current_tracer` 中的 “无操作”,这意味着追踪目前是关闭的:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ pwd
|
||||||
|
/sys/kernel/tracing
|
||||||
|
|
||||||
|
$ sudo cat current_tracer
|
||||||
|
nop
|
||||||
|
```
|
||||||
|
|
||||||
|
### 查看追踪输出
|
||||||
|
|
||||||
|
在启用任何追踪功能之前,请你看一下保存追踪输出的文件。你可以用 [cat][2] 命令查看名为 `trace` 的文件的内容:
|
||||||
|
|
||||||
|
```
|
||||||
|
# cat trace
|
||||||
|
|
||||||
|
# tracer: nop
|
||||||
|
#
|
||||||
|
# entries-in-buffer/entries-written: 0/0 #P:8
|
||||||
|
#
|
||||||
|
# _-----=> irqs-off
|
||||||
|
# / _----=> need-resched
|
||||||
|
# | / _---=> hardirq/softirq
|
||||||
|
# || / _--=> preempt-depth
|
||||||
|
# ||| / delay
|
||||||
|
# TASK-PID CPU# |||| TIMESTAMP FUNCTION
|
||||||
|
# | | | |||| | |
|
||||||
|
```
|
||||||
|
|
||||||
|
### 启用 function 追踪器
|
||||||
|
|
||||||
|
你可以通过向 `current_tracer` 文件写入 `function` 来启用第一个追踪器 `function`(文件原本内容为 `nop`,意味着追踪是关闭的)。把这个操作看成是启用追踪的一种方式:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ pwd
|
||||||
|
/sys/kernel/tracing
|
||||||
|
|
||||||
|
$ sudo cat current_tracer
|
||||||
|
nop
|
||||||
|
$ echo function > current_tracer
|
||||||
|
$
|
||||||
|
$ cat current_tracer
|
||||||
|
function
|
||||||
|
```
|
||||||
|
|
||||||
|
### 查看 function 追踪器的更新追踪输出
|
||||||
|
|
||||||
|
现在你已启用追踪,是时候查看输出了。如果你查看 `trace` 文件内容,你将会看到许多被连续写入的内容。我通过管道只展示了文件内容的前 20 行。根据左边输出的标题,你可以看到在某个 CPU 上运行的任务和进程 ID。根据右边输出的内容,你可以看到具体的内核函数和其父函数。中间显示了时间戳信息:
|
||||||
|
|
||||||
|
```
|
||||||
|
# sudo cat trace | head -20
|
||||||
|
|
||||||
|
# tracer: function
|
||||||
|
#
|
||||||
|
# entries-in-buffer/entries-written: 409936/4276216 #P:8
|
||||||
|
#
|
||||||
|
# _-----=> irqs-off
|
||||||
|
# / _----=> need-resched
|
||||||
|
# | / _---=> hardirq/softirq
|
||||||
|
# || / _--=> preempt-depth
|
||||||
|
# ||| / delay
|
||||||
|
# TASK-PID CPU# |||| TIMESTAMP FUNCTION
|
||||||
|
# | | | |||| | |
|
||||||
|
<idle>-0 [000] d... 2088.841739: tsc_verify_tsc_adjust <-arch_cpu_idle_enter
|
||||||
|
<idle>-0 [000] d... 2088.841739: local_touch_nmi <-do_idle
|
||||||
|
<idle>-0 [000] d... 2088.841740: rcu_nocb_flush_deferred_wakeup <-do_idle
|
||||||
|
<idle>-0 [000] d... 2088.841740: tick_check_broadcast_expired <-do_idle
|
||||||
|
<idle>-0 [000] d... 2088.841740: cpuidle_get_cpu_driver <-do_idle
|
||||||
|
<idle>-0 [000] d... 2088.841740: cpuidle_not_available <-do_idle
|
||||||
|
<idle>-0 [000] d... 2088.841741: cpuidle_select <-do_idle
|
||||||
|
<idle>-0 [000] d... 2088.841741: menu_select <-do_idle
|
||||||
|
<idle>-0 [000] d... 2088.841741: cpuidle_governor_latency_req <-menu_select
|
||||||
|
```
|
||||||
|
|
||||||
|
请记住当追踪打开后,这意味着追踪结果会被一直连续写入直至你关闭追踪。
|
||||||
|
|
||||||
|
### 关闭追踪
|
||||||
|
|
||||||
|
关闭追踪是简单的。你只需要在 `current_tracer` 文件中用 `nop` 替换 `function` 追踪器即可:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ sudo cat current_tracer
|
||||||
|
function
|
||||||
|
|
||||||
|
$ sudo echo nop > current_tracer
|
||||||
|
|
||||||
|
$ sudo cat current_tracer
|
||||||
|
nop
|
||||||
|
```
|
||||||
|
|
||||||
|
### 启用 function_graph 追踪器
|
||||||
|
|
||||||
|
现在尝试第二个名为 `function_graph` 的追踪器。你可以使用和上面相同的步骤:在 `current_tracer` 文件中写入 `function_graph`:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ sudo echo function_graph > current_tracer
|
||||||
|
|
||||||
|
$ sudo cat current_tracer
|
||||||
|
function_graph
|
||||||
|
```
|
||||||
|
|
||||||
|
### function_tracer 追踪器的追踪输出
|
||||||
|
|
||||||
|
注意到目前 `trace` 文件的输出格式已经发生变化。现在,你可以看到 CPU ID 和内核函数的执行时长。接下来,一个花括号表示一个函数的开始,以及它内部调用了哪些其他函数:
|
||||||
|
|
||||||
|
```
|
||||||
|
# cat trace | head -20
|
||||||
|
|
||||||
|
# tracer: function_graph
|
||||||
|
#
|
||||||
|
# CPU DURATION FUNCTION CALLS
|
||||||
|
# | | | | | | |
|
||||||
|
6) | n_tty_write() {
|
||||||
|
6) | down_read() {
|
||||||
|
6) | __cond_resched() {
|
||||||
|
6) 0.341 us | rcu_all_qs();
|
||||||
|
6) 1.057 us | }
|
||||||
|
6) 1.807 us | }
|
||||||
|
6) 0.402 us | process_echoes();
|
||||||
|
6) | add_wait_queue() {
|
||||||
|
6) 0.391 us | _raw_spin_lock_irqsave();
|
||||||
|
6) 0.359 us | _raw_spin_unlock_irqrestore();
|
||||||
|
6) 1.757 us | }
|
||||||
|
6) 0.350 us | tty_hung_up_p();
|
||||||
|
6) | mutex_lock() {
|
||||||
|
6) | __cond_resched() {
|
||||||
|
6) 0.404 us | rcu_all_qs();
|
||||||
|
6) 1.067 us | }
|
||||||
|
```
|
||||||
|
|
||||||
|
### 启用追踪的设置来增加追踪的深度
|
||||||
|
|
||||||
|
你可以使用下面的步骤来调整追踪器以看到更深层次的函数调用。完成之后,你可以查看 `trace` 文件的内容并发现输出变得更加详细了。为了文章的可读性,这个例子的输出被省略了:
|
||||||
|
|
||||||
|
```
|
||||||
|
# cat max_graph_depth
|
||||||
|
0
|
||||||
|
|
||||||
|
# echo 1 > max_graph_depth ## or:
|
||||||
|
# echo 2 > max_graph_depth
|
||||||
|
|
||||||
|
# sudo cat trace
|
||||||
|
```
|
||||||
|
|
||||||
|
### 查找要追踪的函数
|
||||||
|
|
||||||
|
上面的步骤足以让你开始追踪。但是它产生的输出内容是巨大的,当你想试图找到自己感兴趣的内容时,往往会很困难。通常你更希望能够只追踪特定的函数,而忽略其他函数。但如果你不知道它们确切的名称,你怎么知道要追踪哪些进程?有一个文件可以帮助你解决这个问题 —— `available_filter_functions` 文件提供了一个可供追踪的函数列表:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ sudo wc -l available_filter_functions
|
||||||
|
63165 available_filter_functions
|
||||||
|
```
|
||||||
|
|
||||||
|
### 查找一般的内核函数
|
||||||
|
|
||||||
|
现在试着搜索一个你所知道的简单内核函数。用户空间由 `malloc` 函数用来分配内存,而内核由 `kmalloc` 函数,它提供类似的功能。下面是所有与 `kmalloc` 相关的函数:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ sudo grep kmalloc available_filter_functions
|
||||||
|
debug_kmalloc
|
||||||
|
mempool_kmalloc
|
||||||
|
kmalloc_slab
|
||||||
|
kmalloc_order
|
||||||
|
kmalloc_order_trace
|
||||||
|
kmalloc_fix_flags
|
||||||
|
kmalloc_large_node
|
||||||
|
__kmalloc
|
||||||
|
__kmalloc_track_caller
|
||||||
|
__kmalloc_node
|
||||||
|
__kmalloc_node_track_caller
|
||||||
|
[...]
|
||||||
|
```
|
||||||
|
|
||||||
|
### 查找内核模块或者驱动相关函数
|
||||||
|
|
||||||
|
在 `available_filter_functions` 文件的输出中,你可以看到一些以括号内文字结尾的行,例如下面的例子中的 `[kvm_intel]`。这些函数与当前加载的内核模块 `kvm_intel` 有关。你可以运行 `lsmod` 命令来验证:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ sudo grep kvm available_filter_functions | tail
|
||||||
|
__pi_post_block [kvm_intel]
|
||||||
|
vmx_vcpu_pi_load [kvm_intel]
|
||||||
|
vmx_vcpu_pi_put [kvm_intel]
|
||||||
|
pi_pre_block [kvm_intel]
|
||||||
|
pi_post_block [kvm_intel]
|
||||||
|
pi_wakeup_handler [kvm_intel]
|
||||||
|
pi_has_pending_interrupt [kvm_intel]
|
||||||
|
pi_update_irte [kvm_intel]
|
||||||
|
vmx_dump_dtsel [kvm_intel]
|
||||||
|
vmx_dump_sel [kvm_intel]
|
||||||
|
|
||||||
|
$ lsmod | grep -i kvm
|
||||||
|
kvm_intel 335872 0
|
||||||
|
kvm 987136 1 kvm_intel
|
||||||
|
irqbypass 16384 1 kvm
|
||||||
|
```
|
||||||
|
|
||||||
|
### 仅追踪特定的函数
|
||||||
|
|
||||||
|
为了实现对特定函数或模式的追踪,你可以利用 `set_ftrace_filter` 文件来指定你要追踪上述输出中的哪些函数。这个文件也接受 `*` 模式,它可以扩展到包括具有给定模式的其他函数。作为一个例子,我在我的机器上使用 ext4 文件系统。我可以用下面的命令指定 ext4 的特定内核函数来追踪:
|
||||||
|
|
||||||
|
```
|
||||||
|
# mount | grep home
|
||||||
|
/dev/mapper/fedora-home on /home type ext4 (rw,relatime,seclabel)
|
||||||
|
|
||||||
|
# pwd
|
||||||
|
/sys/kernel/tracing
|
||||||
|
|
||||||
|
# cat set_ftrace_filter
|
||||||
|
|
||||||
|
#### all functions enabled ####
|
||||||
|
$
|
||||||
|
$ echo ext4_* > set_ftrace_filter
|
||||||
|
$
|
||||||
|
$ cat set_ftrace_filter
|
||||||
|
ext4_has_free_clusters
|
||||||
|
ext4_validate_block_bitmap
|
||||||
|
ext4_get_group_number
|
||||||
|
ext4_get_group_no_and_offset
|
||||||
|
ext4_get_group_desc
|
||||||
|
[...]
|
||||||
|
```
|
||||||
|
|
||||||
|
现在当你可以看到追踪输出时,你只能看到与内核函数有关的 `ext4` 函数,而你之前已经为其设置了一个过滤器。所有其他的输出都被忽略了:
|
||||||
|
|
||||||
|
```
|
||||||
|
# cat trace |head -20
|
||||||
|
|
||||||
|
## tracer: function
|
||||||
|
#
|
||||||
|
# entries-in-buffer/entries-written: 3871/3871 #P:8
|
||||||
|
#
|
||||||
|
# _-----=> irqs-off
|
||||||
|
# / _----=> need-resched
|
||||||
|
# | / _---=> hardirq/softirq
|
||||||
|
# || / _--=> preempt-depth
|
||||||
|
# ||| / delay
|
||||||
|
# TASK-PID CPU# |||| TIMESTAMP FUNCTION
|
||||||
|
# | | | |||| | |
|
||||||
|
cupsd-1066 [004] .... 3308.989545: ext4_file_getattr <-vfs_fstat
|
||||||
|
cupsd-1066 [004] .... 3308.989547: ext4_getattr <-ext4_file_getattr
|
||||||
|
cupsd-1066 [004] .... 3308.989552: ext4_file_getattr <-vfs_fstat
|
||||||
|
cupsd-1066 [004] .... 3308.989553: ext4_getattr <-ext4_file_getattr
|
||||||
|
cupsd-1066 [004] .... 3308.990097: ext4_file_open <-do_dentry_open
|
||||||
|
cupsd-1066 [004] .... 3308.990111: ext4_file_getattr <-vfs_fstat
|
||||||
|
cupsd-1066 [004] .... 3308.990111: ext4_getattr <-ext4_file_getattr
|
||||||
|
cupsd-1066 [004] .... 3308.990122: ext4_llseek <-ksys_lseek
|
||||||
|
cupsd-1066 [004] .... 3308.990130: ext4_file_read_iter <-new_sync_read
|
||||||
|
```
|
||||||
|
|
||||||
|
### 排除要被追踪的函数
|
||||||
|
|
||||||
|
你并不总是知道你想追踪什么,但是,你肯定知道你不想追踪什么。因此,有一个 `set_ftrace_notrace` —— 请注意其中的 “no”。你可以在这个文件中写下你想要的模式,并启用追踪。这样除了所提到的模式外,任何其他东西都会被追踪到。这通常有助于删除那些使我们的输出变得混乱的普通功能:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ sudo cat set_ftrace_notrace
|
||||||
|
#### no functions disabled ####
|
||||||
|
```
|
||||||
|
|
||||||
|
### 具有目标性的追踪
|
||||||
|
|
||||||
|
到目前为止,你一直在追踪内核中发生的一切。但是,它无法帮助你追踪与某个特定命令有关的事件。为了达到这个目的,你可以按需打开和关闭跟踪,并且在它们之间,运行我们选择的命令,这样你就不会在跟踪输出中得到额外的输出。你可以通过向 `tracing_on` 写入 `1` 来启用跟踪,写 `0` 来关闭跟踪。
|
||||||
|
|
||||||
|
```
|
||||||
|
# cat tracing_on
|
||||||
|
0
|
||||||
|
|
||||||
|
# echo 1 > tracing_on
|
||||||
|
|
||||||
|
# cat tracing_on
|
||||||
|
1
|
||||||
|
|
||||||
|
### Run some specific command that we wish to trace here ###
|
||||||
|
|
||||||
|
# echo 0 > tracing_on
|
||||||
|
|
||||||
|
# cat tracing_on
|
||||||
|
0
|
||||||
|
```
|
||||||
|
|
||||||
|
### 追踪特定的 PID
|
||||||
|
|
||||||
|
如果你想追踪与正在运行的特定进程有关的活动,你可以将该 PID 写入一个名为 `set_ftrace_pid` 的文件,然后启用追踪。这样一来,追踪就只限于这个 PID,这在某些情况下是非常有帮助的。
|
||||||
|
|
||||||
|
```
|
||||||
|
$ sudo echo $PID > set_ftrace_pid
|
||||||
|
```
|
||||||
|
|
||||||
|
### 总结
|
||||||
|
|
||||||
|
`ftrace` 是一个了解 Linux 内核内部工作的很好方式。通过一些练习,你可以学会对 `ftrace` 进行调整以缩小搜索范围。要想更详细地了解 `ftrace` 和它的高级用法,请看 `ftrace` 的核心作者 Steven Rostedt 写的这些优秀文章。
|
||||||
|
|
||||||
|
* [调试 Linux 内核,第一部分][3]
|
||||||
|
* [调试 Linux 内核,第二部分][4]
|
||||||
|
* [调试 Linux 内核,第三部分][5]
|
||||||
|
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
via: https://opensource.com/article/21/7/linux-kernel-ftrace
|
||||||
|
|
||||||
|
作者:[Gaurav Kamathe][a]
|
||||||
|
选题:[lujun9972][b]
|
||||||
|
译者:[萌新阿岩](https://github.com/mengxinayan)
|
||||||
|
校对:[wxy](https://github.com/wxy)
|
||||||
|
|
||||||
|
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||||
|
|
||||||
|
[a]: https://opensource.com/users/gkamathe
|
||||||
|
[b]: https://github.com/lujun9972
|
||||||
|
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/linux_keyboard_desktop.png?itok=I2nGw78_ (Linux keys on the keyboard for a desktop computer)
|
||||||
|
[2]: https://opensource.com/article/19/2/getting-started-cat-command
|
||||||
|
[3]: https://lwn.net/Articles/365835/
|
||||||
|
[4]: https://lwn.net/Articles/366796/
|
||||||
|
[5]: https://lwn.net/Articles/370423/
|
||||||
|
[6]: https://linux.cn/article-11545-1.html
|
@ -0,0 +1,79 @@
|
|||||||
|
[#]: subject: "Apps for daily needs part 3: image editors"
|
||||||
|
[#]: via: "https://fedoramagazine.org/apps-for-daily-needs-part-3-image-editors/"
|
||||||
|
[#]: author: "Arman Arisman https://fedoramagazine.org/author/armanwu/"
|
||||||
|
[#]: collector: "lujun9972"
|
||||||
|
[#]: translator: "wxy"
|
||||||
|
[#]: reviewer: "wxy"
|
||||||
|
[#]: publisher: "wxy"
|
||||||
|
[#]: url: "https://linux.cn/article-13761-1.html"
|
||||||
|
|
||||||
|
满足日常需求的应用(三):图像编辑器
|
||||||
|
======
|
||||||
|
|
||||||
|
![][1]
|
||||||
|
|
||||||
|
图像编辑器是许多人喜欢和需要的应用程序,从专业的设计师、学生,或那些有某些爱好的人。特别是在这个数字时代,越来越多的人因为各种原因需要图像编辑器。本文将介绍一些你可以在 Fedora Linux 上使用的开源图像编辑器。你可能需要安装提到的软件。如果你不熟悉如何在 Fedora Linux 中添加软件包,请参阅我之前的文章 [安装 Fedora 34 工作站后要做的事情][4]。这里列出了图像编辑器类的一些日常需求的应用程序。
|
||||||
|
|
||||||
|
### GIMP
|
||||||
|
|
||||||
|
GIMP(<ruby>GNU 图像处理程序<rt>GNU Image Manipulation Program</rt></ruby>)是一个光栅图像(位图)编辑器,用于照片修饰、图像合成和图像创作。它的功能几乎与 Adobe Photoshop 相同。你可以用 GIMP 做很多你可以用 Photoshop 做的事情。正因为如此,GIMP 作为 Adobe Photoshop 的开源替代品,已经成为最受欢迎的应用程序。
|
||||||
|
|
||||||
|
GIMP 有很多图像处理的功能,特别是针对光栅图像。你可以用 GIMP 修复或改变照片的颜色。你可以选择图像的一部分,裁剪它,然后与图像的其他部分合并。GIMP 还有许多你可以应用于你的图像的效果,包括模糊、阴影、噪音等等。许多人用 GIMP 来修复损坏的照片,提高图像质量,裁剪图像中不需要的部分,制作海报和各种图形设计作品,等等。此外,你还可以在 GIMP 中添加插件和脚本,使其功能更加全面。
|
||||||
|
|
||||||
|
![][5]
|
||||||
|
|
||||||
|
更多信息请见此链接:: <https://www.gimp.org/>
|
||||||
|
|
||||||
|
### Inkscape
|
||||||
|
|
||||||
|
Inkscape 是一个流行的开源应用程序,用于创建和编辑矢量图。它是一个功能丰富的矢量图形编辑器,这使它可以与其他类似的专有应用程序(如 Adobe Illustrator 和 Corel Draw)相竞争。正因为如此,许多专业插画师使用它来创建基于矢量的艺术作品。
|
||||||
|
|
||||||
|
你可以用 Inkscape 制作艺术和技术插图,如标志、图表、图标、桌面壁纸、流程图、漫画等等。此外,Inkscape 可以处理各种图形文件格式。此外,你还可以添加附加组件,使你的工作更容易。
|
||||||
|
|
||||||
|
![][6]
|
||||||
|
|
||||||
|
更多信息请见此链接: <https://inkscape.org/>
|
||||||
|
|
||||||
|
### Krita
|
||||||
|
|
||||||
|
Krita 乍一看像 GIMP 或 Inkscape。但实际上,它是一个完全不同的应用程序,尽管它有一些类似的功能。Krita 是一款用于创作像艺术家那样的数字绘画的应用程序。你可以用 Krita 来制作概念艺术、插图、漫画、纹理和哑光画。
|
||||||
|
|
||||||
|
Krita 有 100 多个预装的专业画笔。它还有一个画笔稳定器功能,有 3 种不同的方式来平滑和稳定你的画笔笔触。此外,你可以用 9 种以上的独特画笔引擎来定制你的画笔。Krita 是那些喜欢进行数字绘画的人的合适应用。
|
||||||
|
|
||||||
|
![][7]
|
||||||
|
|
||||||
|
更多信息可在此链接获得:<https://krita.org/en/>
|
||||||
|
|
||||||
|
### darktable
|
||||||
|
|
||||||
|
darktable 是摄影师或那些想提高照片质量的人的完美选择。darktable 更侧重于图像编辑,特别是对 RAW 图像的非破坏性后期制作。因此,它提供专业的色彩管理,支持自动检测显示配置文件。此外,你还可以用 darktable 过滤和排序多张图片。所以你可以通过标签、评级、颜色标签等来搜索你的收藏。它可以导入各种图像格式,如 JPEG、CR2、NEF、HDR、PFM、RAF 等。
|
||||||
|
|
||||||
|
![][8]
|
||||||
|
|
||||||
|
更多信息可在此链接中获得:<https://www.darktable.org/>
|
||||||
|
|
||||||
|
### 总结
|
||||||
|
|
||||||
|
这篇文章介绍了四个图像编辑器,你可以在 Fedora Linux 上使用它们满足你日常需求。每个应用程序都代表了图像编辑器应用程序的一个子类别。实际上,还有许多其他的图像编辑器可以在 Fedora Linux 上使用。你也可以使用 RawTherapee 或 Photivo 作为 dartkable 替代品。此外,还有 Pinta 作为 GIMP 的替代品,以及 MyPaint 作为 Krita 的替代品。希望这篇文章能帮助你选择正确的图像编辑器。如果你有使用这些应用程序的经验,请在评论中分享你的经验。
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
via: https://fedoramagazine.org/apps-for-daily-needs-part-3-image-editors/
|
||||||
|
|
||||||
|
作者:[Arman Arisman][a]
|
||||||
|
选题:[lujun9972][b]
|
||||||
|
译者:[wxy](https://github.com/wxy)
|
||||||
|
校对:[wxy](https://github.com/wxy)
|
||||||
|
|
||||||
|
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||||
|
|
||||||
|
[a]: https://fedoramagazine.org/author/armanwu/
|
||||||
|
[b]: https://github.com/lujun9972
|
||||||
|
[1]: https://fedoramagazine.org/wp-content/uploads/2021/07/FedoraMagz-Apps-3-Graphics-816x345.jpg
|
||||||
|
[2]: https://unsplash.com/@brookecagle?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText
|
||||||
|
[3]: https://unsplash.com/s/photos/meeting-on-cafe-computer?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText
|
||||||
|
[4]: https://fedoramagazine.org/things-to-do-after-installing-fedora-34-workstation/
|
||||||
|
[5]: https://fedoramagazine.org/wp-content/uploads/2021/07/image-gimp-1024x576.png
|
||||||
|
[6]: https://fedoramagazine.org/wp-content/uploads/2021/07/image-inkscape-1024x575.png
|
||||||
|
[7]: https://fedoramagazine.org/wp-content/uploads/2021/07/image-krita-1024x592.png
|
||||||
|
[8]: https://fedoramagazine.org/wp-content/uploads/2021/07/image-darktable-1024x583.png
|
@ -0,0 +1,70 @@
|
|||||||
|
[#]: subject: "A guide to understanding your team's implicit values and needs"
|
||||||
|
[#]: via: "https://opensource.com/open-organization/21/8/leadership-cultural-social-norms"
|
||||||
|
[#]: author: "Ron McFarland https://opensource.com/users/ron-mcfarland"
|
||||||
|
[#]: collector: "lujun9972"
|
||||||
|
[#]: translator: "zz-air"
|
||||||
|
[#]: reviewer: "wxy"
|
||||||
|
[#]: publisher: "wxy"
|
||||||
|
[#]: url: "https://linux.cn/article-13765-1.html"
|
||||||
|
|
||||||
|
了解团队隐含价值观和需求的指南
|
||||||
|
======
|
||||||
|
|
||||||
|
> 为了增强团队动力,开放式领导可以研究指导成员行为和决策的隐性社会规范。
|
||||||
|
|
||||||
|
![](https://img.linux.net.cn/data/attachment/album/202109/08/142831uj5zz2shqr1pybr2.jpg)
|
||||||
|
|
||||||
|
文化在 [开放式组织][2] 很重要。但“文化”似乎是一个如此庞大而复杂的概念。我们该如何帮助开放式组织去理解它呢?
|
||||||
|
|
||||||
|
一个解决方案可能来自于《[Rule Makers, Rule Breakers][4]》的作者 [Michele J. Gelfand][3]:紧密和松散的文化以及指导我们生活的秘密信号。Gelfand 把所有的国家和文化分成简单的两类:一类是“紧密的”文化,另一类是“松散的”。然后,她解释了两者的特点和社会规范,提供了它们的相对优势和劣势。通过研究两者,我们可以克服团队、组织和国家之间的分歧和冲突。
|
||||||
|
|
||||||
|
在这个分为两篇的《Rule Makers, Rule Breakers》的点评中, 我将解释 Gelfand 的论点,并讨论它对在开放性组织中工作的人们有用的方式。
|
||||||
|
|
||||||
|
### 了解你的社会规范
|
||||||
|
|
||||||
|
Gelfand 认为,我们的行为很大程度上取决于我们是生活在“紧密的”还是“松散的”社区文化中,因为每一种文化都有不同于其他文化的社会规范。这些规范 ——— 以及强制执行的严格程度 ——— 将决定我们在社会中的行为。它们给了我们身份,它们帮助我们彼此协调。简而言之,这些价值使社区团结在一起。
|
||||||
|
|
||||||
|
它们也会影响我们的世界观,影响我们构造环境的方式,甚至影响我们大脑的处理过程。 Gelfand 写道:“无数研究表明,社会规范对于将社区团结成合作、协调良好的团体,从而实现伟大成就至关重要。” 纵观历史,社区让其公民参加看似最疯狂的仪式,除了维持群体凝聚力和合作外,别无其他原因。 这些仪式产生了更紧密的联系,使人们得以生存(特别是在狩猎、觅食和战争时期)。
|
||||||
|
|
||||||
|
社会规范包括我们所有人都会自动遵守的规则, Gelfand 称之为一种 “规范性自动驾驶仪”。 这些是我们不需要思考就能做的事情————例如,在图书馆、电影院、电梯或飞机上保持安静。 我们会自动的做这些事。 “从表面看,” Gelfand 说, “我们的社会规范通常看起来很奇怪。但在内心深处,我们认为这是理所当然的。” 她解释到,社会规范可以被编入法规和法律(“遵守停车标志”和“不要偷窃”)。还有一些基本上是不言而喻的(“不要盯着火车上的人看”或“打喷嚏时捂住嘴”)。当然,它们因环境而异。
|
||||||
|
|
||||||
|
挑战在于大多数社会规范都是无形的,我们不知道这些社会规范在多大程度上控制着我们。在不知不觉中,我们常常只是跟随周围的人群。这被称为“群体思维”,在这种思维中,人们会跟随他们认同的群体,即使这个群体是错误的。他们不想站出来。
|
||||||
|
|
||||||
|
### 组织,有松有紧
|
||||||
|
|
||||||
|
Gelfand 将社会规范组织成不同的组别。她认为,一些规范具有“紧密”文化的特征,而另一些规范则具有“松散”文化的特征。为此, Gelfand 对来自五大洲 30 多个国家的约 7000 人进行了研究和抽样,他们具有广泛的职业、性别、年龄、宗教、教派,以及社会阶层,以了解这些社区将自己定位在何处(以及他们的社会规范在官方和社区/社区总体上的执行力度)。 紧密和松散文化之间的差异在国家之间、国家内部(如美国及其各个地区)、组织内部、社会阶层内部甚至家庭内部都有所不同。
|
||||||
|
|
||||||
|
因为组织有文化,它们也有自己的社会规范(毕竟,如果一个组织无法协调其成员并影响其行为,它将无法存在)。 因此,组织也可以反映和灌输 Gelfand 所描述的“紧密”或“松散”的文化特征。 并且如果我们有很强的能力识别这些差异,我们就能更成功地预测和解决冲突。然后,在对这些社会规范有了更高认识的情况下,我们可以将开放式组织原则付诸实践。
|
||||||
|
|
||||||
|
Gelfand 这样描述紧密和松散文化的区别:
|
||||||
|
|
||||||
|
> 从广义上讲,松散的文化倾向于开放,但它们也更加无序。另一方面,紧密的文化有令人欣慰的秩序和可预测性,但它们的容忍度较低。这就是紧与松的权衡:一个领域的优势与另一个领域的劣势并存。
|
||||||
|
|
||||||
|
她总结说,紧密的社会保持着严格的社会秩序、同步性和自律性;宽松的社会以高度宽容、富有创造力和对变化持开放态度而自豪。
|
||||||
|
|
||||||
|
虽然并非所有情况都是如此,但紧密和松散的文化通常会表现出一些权衡;每个人都有自己的长处和短处。参见下面的图 1 。
|
||||||
|
|
||||||
|
![][5]
|
||||||
|
|
||||||
|
在这两种环境中成功应用五项开放式组织原则的工作可能会有很大的不同。要取得成功,社区承诺至关重要,如果社会规范不同,承诺的理由也会不同。组织领导者必须知道社区的价值观是什么。只有这样,这个人才能充分激励他人。
|
||||||
|
|
||||||
|
在本点评的下一部分中,我将更彻底地解释紧密文化和松散文化的特征,以便领导者能够更好地了解如何将开放式组织原则运用到团队中。
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
via: https://opensource.com/open-organization/21/8/leadership-cultural-social-norms
|
||||||
|
|
||||||
|
作者:[Ron McFarland][a]
|
||||||
|
选题:[lujun9972][b]
|
||||||
|
译者:[zz-air](https://github.com/zz-air)
|
||||||
|
校对:[wxy](https://github.com/wxy)
|
||||||
|
|
||||||
|
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||||
|
|
||||||
|
[a]: https://opensource.com/users/ron-mcfarland
|
||||||
|
[b]: https://github.com/lujun9972
|
||||||
|
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/leader-team-laptops-conference-meeting.png?itok=ztoA0E6f (Working meetings can be effective meetings)
|
||||||
|
[2]: https://theopenorganization.org/definition/
|
||||||
|
[3]: https://www.michelegelfand.com/
|
||||||
|
[4]: https://www.michelegelfand.com/rule-makers-rule-breakers
|
||||||
|
[5]: https://opensource.com/sites/default/files/images/open-org/rule-makers-breakers-1.png
|
@ -0,0 +1,184 @@
|
|||||||
|
[#]: subject: "Debian vs Ubuntu: What’s the Difference? Which One Should You Use?"
|
||||||
|
[#]: via: "https://itsfoss.com/debian-vs-ubuntu/"
|
||||||
|
[#]: author: "Abhishek Prakash https://itsfoss.com/author/abhishek/"
|
||||||
|
[#]: collector: "lujun9972"
|
||||||
|
[#]: translator: "perfiffer"
|
||||||
|
[#]: reviewer: "wxy"
|
||||||
|
[#]: publisher: "wxy"
|
||||||
|
[#]: url: "https://linux.cn/article-13746-1.html"
|
||||||
|
|
||||||
|
Debian 和 Ubuntu:有什么不同?应该选择哪一个?
|
||||||
|
======
|
||||||
|
|
||||||
|
![](https://img.linux.net.cn/data/attachment/album/202109/02/230706mpahrwpwjjm2jkpu.jpg)
|
||||||
|
|
||||||
|
在 Debian 和 Ubuntu 系统中,你都可以 [使用 apt-get 命令][1] 来管理应用。你也可以在这两个发行版中安装 DEB 安装包。很多时候,你会在这两个发行版中发现同样的包安装命令。
|
||||||
|
|
||||||
|
它们两者是如此的相似,那么,它们两者之间有什么区别呢?
|
||||||
|
|
||||||
|
Debian 和 Ubuntu 属于同一系列的发行版。Debian 是由 Ian Murdock 在 1993 年创建的最初的发行版。Ubuntu 是 Mark Shuttleworth 在 2004 年基于 Debian 创建的发行版。
|
||||||
|
|
||||||
|
### Ubuntu 基于 Debian:这意味着什么?
|
||||||
|
|
||||||
|
Linux 发行版虽然有数百个,但其中只有少数是从零开始的独立发行版。 [Debian][2]、Arch、Red Hat 是其中几个不派生于其它发行版的使用最广的发行版。
|
||||||
|
|
||||||
|
Ubuntu 源自 Debian。这意味着 Ubuntu 使用与 Debian 相同的 APT 包管理系统,并共享来自 Debian 库中的大量包和库。它建立在 Debian 基础架构上。
|
||||||
|
|
||||||
|
![Ubuntu uses Debian as base][3]
|
||||||
|
|
||||||
|
这就是大多数“衍生”发行版所做的。它们使用相同的包管理器,并与基础发行版共享包。但它们也做了一些改变,添加了一些自己的包。这就是 Ubuntu 和 Debian 的不同之处,尽管它是从 Debian 衍生而来的。
|
||||||
|
|
||||||
|
### Ubuntu 和 Debian 的不同之处
|
||||||
|
|
||||||
|
因此,Ubuntu 构建在 Debian 架构和基础设施上,也与 Debian 一样是用 .DEB 格式的软件包。
|
||||||
|
|
||||||
|
这意味着使用 Ubuntu 和使用 Debian 是一样的吗?并不完全如此。有很多因素可以用来区分两个不同的发行版。
|
||||||
|
|
||||||
|
让我逐一讨论这些因素来比较 Ubuntu 和 Debian。请记住,有些比较适用于桌面版本,而有些比较适用于服务器版本。
|
||||||
|
|
||||||
|
![][4]
|
||||||
|
|
||||||
|
#### 1、发布周期
|
||||||
|
|
||||||
|
Ubuntu 有两种发布版本:LTS(长期支持)和常规版本。[Ubuntu LTS 版本][5] 每两年发布一次,并且会提供五年的支持。你可以选择升级到下一个可用的 LTS 版本。LTS 版本被认为更稳定。
|
||||||
|
|
||||||
|
还有一个非 LTS 版本,每六个月发布一次。这些版本仅仅提供九个月的支持,但是它们会有一些新的软件版本和功能。在当前的版本到达维护年限时,你应当升级到下一个 Ubuntu 版本。
|
||||||
|
|
||||||
|
所以基本上,你可以根据这些版本在稳定性和新特性之间进行选择。
|
||||||
|
|
||||||
|
另一方面,Debian 有三个不同的版本:稳定版、测试版和非稳定版。非稳定版是为了实际测试,应该避免使用。
|
||||||
|
|
||||||
|
测试版不是那么不稳定。它是用来为下一个稳定版做准备。有一些 Debian 用户更倾向于使用测试版来获取新的特性。
|
||||||
|
|
||||||
|
然后是稳定版。这是 Debian 的主要版本。Debian 稳定版可能没有最新的软件和功能,但在稳定性方面毋庸置疑。
|
||||||
|
|
||||||
|
每两年 Debian 会发布一个稳定版,并且会提供三年的支持。此后,你应当升级到下一个可用的稳定版。
|
||||||
|
|
||||||
|
#### 2、软件更新
|
||||||
|
|
||||||
|
![][6]
|
||||||
|
|
||||||
|
Debian 更关注稳定性,这意味着它并不总是使用最新版本的软件。例如,最新的 Debian 11 用的 GNOME 版本为 3.38,并不是最新版的 GNOME 3.40。
|
||||||
|
|
||||||
|
对于 GIMP、LibreOffice 等其它软件也是如此。这是你必须对 Debian 做出的妥协。这就是“Debian stable = Debian stale”笑话在 Linux 社区流行的原因。
|
||||||
|
|
||||||
|
Ubuntu LTS 版本也关注稳定性。但是它们通常拥有较新版本的常见软件。
|
||||||
|
|
||||||
|
你应该注意,对于某些软件,从开发者的仓库安装也是一种选择。例如,如果你想要安装最新版的 Docker,你可以在 Debian 和 Ubuntu 中添加 Docker 仓库。
|
||||||
|
|
||||||
|
总体来说,相比较于 Ubuntu ,Debian 稳定版的软件版本会更旧。
|
||||||
|
|
||||||
|
#### 3、软件可用性
|
||||||
|
|
||||||
|
Debian 和 Ubuntu 都拥有一个巨大的软件仓库。然而,[Ubuntu 还有 PPA][7](<ruby>个人软件包存档<rt>Personal Package Archive</rt></ruby>)。通过 PPA,安装更新版本的软件或者获取最新版本的软件都将会变的更容易。
|
||||||
|
|
||||||
|
![][8]
|
||||||
|
|
||||||
|
你可以在 Debian 中尝试使用 PPA,但是体验并不好。大多数时候你都会遇到问题。
|
||||||
|
|
||||||
|
#### 4、支持的平台
|
||||||
|
|
||||||
|
Ubuntu 可以在 64 位的 x86 和 ARM 平台上使用。它不再提供 32 位的镜像。
|
||||||
|
|
||||||
|
另一方面,Debian 支持 32 位和 64 位架构。除此之外,Debian 还支持 64 位 ARM(arm64)、ARM EABI(armel)、ARMv7(EABI hard-float ABI,armhf)、小端 MIPS(mipsel)、64 位小端 MIPS(mips64el)、64 位小端 PowerPC(ppc64el) 和 IBM System z(s390x)。
|
||||||
|
|
||||||
|
所以它也被称为 “<ruby>通用操作系统<rt>universal operating system</rt></ruby>”。
|
||||||
|
|
||||||
|
#### 5、安装
|
||||||
|
|
||||||
|
[安装 Ubuntu][9] 比安装 Debian 容易得多。我并不是在开玩笑。即使对于有经验的 Linux 用户,Debian 也可能令人困惑。
|
||||||
|
|
||||||
|
当你下载 Debian 的时候,它默认提供的是最小化镜像。此镜像没有非自由(非开源)的固件。如果你继续安装它,你就可能会发现你的网络适配器和其它硬件将无法识别。
|
||||||
|
|
||||||
|
有一个单独的包含固件的非自由镜像,但它是隐藏的,如果你不知道,你可能会大吃一惊。
|
||||||
|
|
||||||
|
![Getting non-free firmware is a pain in Debian][10]
|
||||||
|
|
||||||
|
Ubuntu 在默认提供的镜像中包含专有驱动程序和固件时要宽容的多。
|
||||||
|
|
||||||
|
此外,Debian 安装程序看起来很旧,而 Ubuntu 安装程序看起来就比较现代化。Ubuntu 安装程序还可以识别磁盘上其它已安装的操作系统,并为你提供将 Ubuntu 与现有操作系统一起安装的选项(双引导)。但我在测试时并没有注意到 Debian 有此选项。
|
||||||
|
|
||||||
|
![Installing Ubuntu is smoother][11]
|
||||||
|
|
||||||
|
#### 6、开箱即用的硬件支持
|
||||||
|
|
||||||
|
就像之前提到的,Debian 主要关注 [FOSS][12](自由和开源软件)。这意味着 Debian 提供的内核不包括专有驱动程序和固件。
|
||||||
|
|
||||||
|
这并不是说你无法使其工作,而是你必须添加/启动额外的存储库并手动安装。这可能令人沮丧,特别是对于初学者来说。
|
||||||
|
|
||||||
|
Ubuntu 并不完美,但在提供开箱即用的驱动程序和固件方面,它比 Debian 好得多。这意味着更少的麻烦和更完整的开箱即用体验。
|
||||||
|
|
||||||
|
#### 7、桌面环境选择
|
||||||
|
|
||||||
|
Ubuntu 默认使用定制的 GNOME 桌面环境。你可以在其上安装 [其它桌面环境][13],或者选择 [各种不同桌面风格的 Ubuntu][14],如 Kubuntu(使用 KDE 桌面)、Xubuntu(使用 Xfce 桌面)等。
|
||||||
|
|
||||||
|
Debian 也默认安装了 GNOME 桌面。但是它会让你在安装的过程中选择你要安装的桌面环境。
|
||||||
|
|
||||||
|
![][15]
|
||||||
|
|
||||||
|
你还可以从其网站获取 [特定桌面环境的 ISO 镜像][16]。
|
||||||
|
|
||||||
|
#### 8、游戏性
|
||||||
|
|
||||||
|
由于 Stream 及其 Proton 项目,Linux 上的游戏总体上有所改善。尽管如此,游戏在很大程度上取决于硬件。
|
||||||
|
|
||||||
|
在硬件兼容性上,Ubuntu 比 Debian 在支持专有驱动程序方面要好。
|
||||||
|
|
||||||
|
并不是说在 Debian 中不能做到这一点,而是需要一些时间和精力来实现。
|
||||||
|
|
||||||
|
#### 9、性能
|
||||||
|
|
||||||
|
性能部分没有明显的“赢家”,无论是在服务器版本还是在桌面版本。 Debian 和 Ubuntu 作为桌面和服务器操作系统都很受欢迎。
|
||||||
|
|
||||||
|
性能取决于你系统的硬件和你所使用的软件组件。你可以在你的操作系统中调整和控制你的系统。
|
||||||
|
|
||||||
|
#### 10、社区和支持
|
||||||
|
|
||||||
|
Debian 是一个真正的社区项目。此项目的一切都由其社区成员管理。
|
||||||
|
|
||||||
|
Ubuntu 由 [Canonical][17] 提供支持。然而,它并不是一个真正意义上的企业项目。它确实有一个社区,但任何事情的最终决定权都掌握在 Canonical 手中。
|
||||||
|
|
||||||
|
就支持而言,Ubuntu 和 Debian 都有专门的论坛,用户可以在其中寻求帮助和提出建议。
|
||||||
|
|
||||||
|
Canonical 还为其企业客户提供收费的专业支持。Debian 则没有这样的功能。
|
||||||
|
|
||||||
|
### 结论
|
||||||
|
|
||||||
|
Debian 和 Ubuntu 都是桌面或服务器操作系统的可靠选择。 APT 包管理器和 DEB 包对两者都是通用的,因此提供了一些相似的体验。
|
||||||
|
|
||||||
|
然而,Debian 仍然需要一定程度的专业知识,特别是在桌面方面。如果你是 Linux 新手,坚持使用 Ubuntu 将是你更好的选择。在我看来,你应该积累一些经验,熟悉了一般的 Linux,然后再尝试使用 Debian。
|
||||||
|
|
||||||
|
并不是说你不能从一开始就使用 Debian,但对于 Linux 初学者来说,这并不是一种很好的体验。
|
||||||
|
|
||||||
|
欢迎你对这场 Debian 与 Ubuntu 辩论发表意见。
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
via: https://itsfoss.com/debian-vs-ubuntu/
|
||||||
|
|
||||||
|
作者:[Abhishek Prakash][a]
|
||||||
|
选题:[lujun9972][b]
|
||||||
|
译者:[perfiffer](https://github.com/perfiffer)
|
||||||
|
校对:[wxy](https://github.com/wxy)
|
||||||
|
|
||||||
|
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||||
|
|
||||||
|
[a]: https://itsfoss.com/author/abhishek/
|
||||||
|
[b]: https://github.com/lujun9972
|
||||||
|
[1]: https://itsfoss.com/apt-get-linux-guide/
|
||||||
|
[2]: https://www.debian.org/
|
||||||
|
[3]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/08/Debian-ubuntu-upstream.png?resize=800%2C400&ssl=1
|
||||||
|
[4]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/08/debian-vs-ubuntu.png?resize=800%2C450&ssl=1
|
||||||
|
[5]: https://itsfoss.com/long-term-support-lts/
|
||||||
|
[6]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/10/apt-cache-policy.png?resize=795%2C456&ssl=1
|
||||||
|
[7]: https://itsfoss.com/ppa-guide/
|
||||||
|
[8]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2019/03/ffmpeg_add_ppa.jpg?resize=800%2C222&ssl=1
|
||||||
|
[9]: https://itsfoss.com/install-ubuntu/
|
||||||
|
[10]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/08/Debian-firmware.png?resize=800%2C600&ssl=1
|
||||||
|
[11]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/03/choose-something-else-installing-ubuntu.png?resize=800%2C491&ssl=1
|
||||||
|
[12]: https://itsfoss.com/what-is-foss/
|
||||||
|
[13]: https://itsfoss.com/best-linux-desktop-environments/
|
||||||
|
[14]: https://itsfoss.com/which-ubuntu-install/
|
||||||
|
[15]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/08/debian-install-desktop-environment.png?resize=640%2C479&ssl=1
|
||||||
|
[16]: https://cdimage.debian.org/debian-cd/current-live/amd64/iso-hybrid/
|
||||||
|
[17]: https://canonical.com/
|
@ -0,0 +1,113 @@
|
|||||||
|
[#]: subject: "Check file status on Linux with the stat command"
|
||||||
|
[#]: via: "https://opensource.com/article/21/8/linux-stat-file-status"
|
||||||
|
[#]: author: "Seth Kenlon https://opensource.com/users/seth"
|
||||||
|
[#]: collector: "lujun9972"
|
||||||
|
[#]: translator: "New-World-2019"
|
||||||
|
[#]: reviewer: "turbokernel"
|
||||||
|
[#]: publisher: "wxy"
|
||||||
|
[#]: url: "https://linux.cn/article-13768-1.html"
|
||||||
|
|
||||||
|
在 Linux 上使用 stat 命令查看文件状态
|
||||||
|
======
|
||||||
|
|
||||||
|
> 获取到任何文件或文件系统的所有信息,仅需要一条 Linux 命令。
|
||||||
|
|
||||||
|
![](https://img.linux.net.cn/data/attachment/album/202109/10/072912ouo04jchatqazq53.jpg)
|
||||||
|
|
||||||
|
在 GNU `coreutils` 软件包中包含 `stat` 命令,它提供了关于文件和文件系统包括文件大小、节点位置、访问权限和 SELinux 上下文,以及创建和修改时间等各种元数据。通常情况下,你需要多个不同命令获取的信息,而这一个命令就可以实现。
|
||||||
|
|
||||||
|
### 在 Linux 上安装 stat 命令
|
||||||
|
|
||||||
|
在 Linux 系统中,可能已经预装了 `stat` 命令,因为它属于核心功能软件包,通常默认包含在 Linux 发行版里。
|
||||||
|
|
||||||
|
如果系统中没有安装 `stat` 命令,你可以使用包管理器安装 `coreutils` 软件包。
|
||||||
|
|
||||||
|
另外,你可以 [通过源码编译安装 coreutils 包][2]。
|
||||||
|
|
||||||
|
### 获取文件状态
|
||||||
|
|
||||||
|
运行 `stat` 命令可以获取指定文件或目录易读的状态信息。
|
||||||
|
|
||||||
|
```
|
||||||
|
$ stat planets.xml
|
||||||
|
File: planets.xml
|
||||||
|
Size: 325 Blocks: 8 IO Block: 4096 regular file
|
||||||
|
Device: fd03h/64771d Inode: 140217 Links: 1
|
||||||
|
Access: (0664/-rw-rw-r--) Uid: (1000/tux) Gid: (100/users)
|
||||||
|
Context: unconfined_u:object_r:user_home_t:s0
|
||||||
|
Access: 2021-08-17 18:26:57.281330711 +1200
|
||||||
|
Modify: 2021-08-17 18:26:58.738332799 +1200
|
||||||
|
Change: 2021-08-17 18:26:58.738332799 +1200
|
||||||
|
Birth: 2021-08-17 18:26:57.281330711 +1200
|
||||||
|
```
|
||||||
|
|
||||||
|
输出的信息易懂,但是包含了很多的信息,这里是 `stat` 所包含的项:
|
||||||
|
|
||||||
|
* `File`:文件名
|
||||||
|
* `Size`:文件大小,以字节表示
|
||||||
|
* `Blocks`:在硬盘驱动器上为文件保留的数据块的数量
|
||||||
|
* `IO Block`:文件系统块大小
|
||||||
|
* `regular file`:文件类型(普通文件、目录、文件系统)
|
||||||
|
* `Device`:文件所在的设备
|
||||||
|
* `Inode`:文件所在的 Inode 号
|
||||||
|
* `Links`:文件的链接数
|
||||||
|
* `Access`、`UID`、`GID`:文件权限、用户和组的所有者
|
||||||
|
* `Context`:SELinux 上下文
|
||||||
|
* `Access`、`Modify`、`Change`、`Birth`:文件被访问、修改、更改状态以及创建时的时间戳
|
||||||
|
|
||||||
|
### 精简输出
|
||||||
|
|
||||||
|
对于精通输出或者想要使用其它工具(例如:[awk][3])解析输出的人,这里可以使用 `--terse`(短参数为 `-t`)参数,实现没有标题或换行符的格式化输出。
|
||||||
|
|
||||||
|
```
|
||||||
|
$ stat --terse planets.xml
|
||||||
|
planets.xml 325 8 81b4 100977 100 fd03 140217 1 0 0 1629181617 1629181618 1629181618 1629181617 4096 unconfined_u:object_r:user_home_t:s0
|
||||||
|
```
|
||||||
|
|
||||||
|
### 自定义格式
|
||||||
|
|
||||||
|
你可以使用 `--printf` 参数以及与 [printf][4] 类似的语法定义自己的输出格式。`stat` 的每一个属性都有一个格式序列(`%C` 表示 SELinux 上下文,`%n` 表示文件名等等),所以,你可以定义输出格式。
|
||||||
|
|
||||||
|
```
|
||||||
|
$ stat --printf="%n\n%C\n" planets.xml
|
||||||
|
planets.xml
|
||||||
|
unconfined_u:object_r:user_home_t:s0
|
||||||
|
$ $ stat --printf="Name: %n\nModified: %y\n" planets.xml
|
||||||
|
Name: planets.xml
|
||||||
|
Modified: 2021-08-17 18:26:58.738332799 +1200
|
||||||
|
```
|
||||||
|
|
||||||
|
下面是一些常见的格式序列:
|
||||||
|
|
||||||
|
* `%a` 访问权限
|
||||||
|
* `%F` 文件类型
|
||||||
|
* `%n` 文件名
|
||||||
|
* `%U` 用户名
|
||||||
|
* `%u` 用户 ID
|
||||||
|
* `%g` 组 ID
|
||||||
|
* `%w` 创建时间
|
||||||
|
* `%y` 修改时间
|
||||||
|
|
||||||
|
在 `stat` 手册和 `coreutils` 信息页中都有完整的格式化序列列表。
|
||||||
|
|
||||||
|
### 文件信息
|
||||||
|
|
||||||
|
如果你曾尝试解析过 `ls -l` 的输出,那么,你会很喜欢 `stat` 命令的灵活性。你并不是每次都需要 `stat` 提供的所有信息,但是,当你需要其中一些或全部的时候它是非常有用的。不管你是读取默认输出,还是你自己创建的查询输出,`stat` 命令都可以查看所需的数据。
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
via: https://opensource.com/article/21/8/linux-stat-file-status
|
||||||
|
|
||||||
|
作者:[Seth Kenlon][a]
|
||||||
|
选题:[lujun9972][b]
|
||||||
|
译者:[New-World-2019](https://github.com/New-World-2019)
|
||||||
|
校对:[turbokernel](https://github.com/turbokernel)
|
||||||
|
|
||||||
|
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||||
|
|
||||||
|
[a]: https://opensource.com/users/seth
|
||||||
|
[b]: https://github.com/lujun9972
|
||||||
|
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/yearbook-haff-rx-linux-file-lead_0.png?itok=-i0NNfDC (Hand putting a Linux file folder into a drawer)
|
||||||
|
[2]: https://www.gnu.org/software/coreutils/
|
||||||
|
[3]: https://opensource.com/article/20/9/awk-ebook
|
||||||
|
[4]: https://opensource.com/article/20/8/printf
|
@ -0,0 +1,116 @@
|
|||||||
|
[#]: subject: "How to Download Audio Only Using youtube-dl"
|
||||||
|
[#]: via: "https://itsfoss.com/youtube-dl-audio-only/"
|
||||||
|
[#]: author: "Abhishek Prakash https://itsfoss.com/author/abhishek/"
|
||||||
|
[#]: collector: "lujun9972"
|
||||||
|
[#]: translator: "geekpi"
|
||||||
|
[#]: reviewer: "wxy"
|
||||||
|
[#]: publisher: "wxy"
|
||||||
|
[#]: url: "https://linux.cn/article-13753-1.html"
|
||||||
|
|
||||||
|
如何使用 youtube-dl 只下载音频
|
||||||
|
======
|
||||||
|
|
||||||
|
![](https://img.linux.net.cn/data/attachment/album/202109/05/153110dkamc1kv0173ggc3.jpg)
|
||||||
|
|
||||||
|
[youtube-dl][1] 是一个多功能的命令行工具,用于从 YouTube 和许多其他网站下载视频。我用它来做我自己的 YouTube 视频的备份。
|
||||||
|
|
||||||
|
默认情况下,你会 [使用 youtube-dl 下载视频][2]。用 youtube-dl 只提取音频怎么样? 其实很简单。让我告诉你步骤。
|
||||||
|
|
||||||
|
> **注意**
|
||||||
|
>
|
||||||
|
> 从网站下载视频可能违反他们的政策。这取决于你是否选择下载视频或音频。
|
||||||
|
|
||||||
|
### 使用 youtube-dl 只下载音频
|
||||||
|
|
||||||
|
请确保你已经在你的 Linux 发行版上安装了 `youtube-dl`。
|
||||||
|
|
||||||
|
```
|
||||||
|
sudo snap install youtube-dl
|
||||||
|
```
|
||||||
|
|
||||||
|
如果你只想从 YouTube 视频中下载音频,你可以使用 `youtube-dl` 的 `-x` 选项。这个提取音频的选项将视频文件转换为纯音频文件。
|
||||||
|
|
||||||
|
```
|
||||||
|
youtube-dl -x video_URL
|
||||||
|
```
|
||||||
|
|
||||||
|
该文件被保存在你运行 `youtube-dl` 命令的同一目录下。
|
||||||
|
|
||||||
|
这是我下载 Zorin OS 16 评论视频的画外音的示例:
|
||||||
|
|
||||||
|
```
|
||||||
|
youtube-dl -x https://www.youtube.com/watch?v=m_PmLG7HqbQ
|
||||||
|
[youtube] m_PmLG7HqbQ: Downloading webpage
|
||||||
|
[download] Destination: Zorin OS 16 Review - It's a Visual Masterpiece-m_PmLG7HqbQ.m4a
|
||||||
|
[download] 100% of 4.26MiB in 00:03
|
||||||
|
[ffmpeg] Correcting container in "Zorin OS 16 Review - It's a Visual Masterpiece-m_PmLG7HqbQ.m4a"
|
||||||
|
[ffmpeg] Post-process file Zorin OS 16 Review - It's a Visual Masterpiece-m_PmLG7HqbQ.m4a exists, skipping
|
||||||
|
```
|
||||||
|
|
||||||
|
你注意到音频格式了吗?它是 .m4a 格式。你可以把音频格式指定为你所选择的格式。
|
||||||
|
|
||||||
|
比如你想提取 MP3 格式的音频。你可以像这样使用它:
|
||||||
|
|
||||||
|
```
|
||||||
|
youtube-dl -x --audio-format mp3 video_URL
|
||||||
|
```
|
||||||
|
|
||||||
|
下面是我之前展示的同一个例子。你可以看到它 [使用 ffmpeg 转换][3] m4a 文件为 mp3:
|
||||||
|
|
||||||
|
```
|
||||||
|
youtube-dl -x --audio-format mp3 https://www.youtube.com/watch?v=m_PmLG7HqbQ
|
||||||
|
[youtube] m_PmLG7HqbQ: Downloading webpage
|
||||||
|
[download] Zorin OS 16 Review - It's a Visual Masterpiece-m_PmLG7HqbQ.m4a has already been downloaded
|
||||||
|
[download] 100% of 4.26MiB
|
||||||
|
[ffmpeg] Correcting container in "Zorin OS 16 Review - It's a Visual Masterpiece-m_PmLG7HqbQ.m4a"
|
||||||
|
[ffmpeg] Destination: Zorin OS 16 Review - It's a Visual Masterpiece-m_PmLG7HqbQ.mp3
|
||||||
|
Deleting original file Zorin OS 16 Review - It's a Visual Masterpiece-m_PmLG7HqbQ.m4a (pass -k to keep)
|
||||||
|
```
|
||||||
|
|
||||||
|
### 以 MP3 格式下载整个 YouTube 播放列表
|
||||||
|
|
||||||
|
是的,你完全可以这样做。最主要的是要在这里得到播放列表的 URL。它通常是以下格式:
|
||||||
|
|
||||||
|
```
|
||||||
|
https://www.youtube.com/playlist?list=XXXXXXXXXXXXXXXXXXX
|
||||||
|
```
|
||||||
|
|
||||||
|
要获得一个播放列表的 URL,当播放列表显示在右边栏时,点击其名称。
|
||||||
|
|
||||||
|
![Click on the playlist title][4]
|
||||||
|
|
||||||
|
它将带你到播放列表页面,你可以在这里复制 URL。
|
||||||
|
|
||||||
|
![Grab the playlist URL][5]
|
||||||
|
|
||||||
|
现在你有了播放列表的 URL,你可以用它来下载 MP3 格式的音频文件,方法如下:
|
||||||
|
|
||||||
|
```
|
||||||
|
youtube-dl --extract-audio --audio-format mp3 -o "%(title)s.%(ext)s" playlist_URL
|
||||||
|
```
|
||||||
|
|
||||||
|
那个看起来很可怕的 `-o "%(title)s.%(ext)s"` 指定了输出文件(选项 `-o`),并指示它使用视频的标题和扩展名(本例为 mp3)来命名音频文件。
|
||||||
|
|
||||||
|
![][6]
|
||||||
|
|
||||||
|
我希望你觉得这个技巧对你有帮助。享受音频文件吧。
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
via: https://itsfoss.com/youtube-dl-audio-only/
|
||||||
|
|
||||||
|
作者:[Abhishek Prakash][a]
|
||||||
|
选题:[lujun9972][b]
|
||||||
|
译者:[geekpi](https://github.com/geekpi)
|
||||||
|
校对:[wxy](https://github.com/wxy)
|
||||||
|
|
||||||
|
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||||
|
|
||||||
|
[a]: https://itsfoss.com/author/abhishek/
|
||||||
|
[b]: https://github.com/lujun9972
|
||||||
|
[1]: https://github.com/ytdl-org/youtube-dl
|
||||||
|
[2]: https://itsfoss.com/download-youtube-linux/
|
||||||
|
[3]: https://itsfoss.com/ffmpeg/
|
||||||
|
[4]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/08/getting-youtube-playlist-url.png?resize=797%2C366&ssl=1
|
||||||
|
[5]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/08/youtube-playlist-url.png?resize=800%2C388&ssl=1
|
||||||
|
[6]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/08/downloading-youtube-playlist-audio.png?resize=800%2C559&ssl=1
|
@ -0,0 +1,172 @@
|
|||||||
|
[#]: subject: "10 Things to Do After Installing elementary OS 6 “Odin”"
|
||||||
|
[#]: via: "https://www.debugpoint.com/2021/08/10-things-to-do-after-install-elementary-os-6/"
|
||||||
|
[#]: author: "Arindam https://www.debugpoint.com/author/admin1/"
|
||||||
|
[#]: collector: "lujun9972"
|
||||||
|
[#]: translator: "anine09"
|
||||||
|
[#]: reviewer: "wxy"
|
||||||
|
[#]: publisher: "wxy"
|
||||||
|
[#]: url: "https://linux.cn/article-13749-1.html"
|
||||||
|
|
||||||
|
安装 elementary OS 6 “Odin” 后要做的 10 件事
|
||||||
|
======
|
||||||
|
|
||||||
|
> 一个精心准备的在安装 elementary OS 6 “Odin” 后要做的事情的列表。
|
||||||
|
|
||||||
|
![](https://img.linux.net.cn/data/attachment/album/202109/04/081345bf9co7ot40szdytg.jpg)
|
||||||
|
|
||||||
|
在经过两年多的开发后 [elementary OS 6 “Odin”][1] 于不久前发布,此次版本更新在核心模块、 Pantheon 桌面、原生应用方面带来了一大批新特性。elementary OS 6 “Odin” 是基于 Ubuntu 20.04 LTS 的。
|
||||||
|
|
||||||
|
如果你完成了安装,你可能想要尝试通过一些特定的设置来使你的系统更加的个性化。这里描述的选项是通用的,在某些情况下可能对你没有用,但是我们觉得有必要列出一些基本的东西,让你有合适的方式来探索这个漂亮的 elementary OS。
|
||||||
|
|
||||||
|
### 安装完 elementary OS 6 “Odin” 后要做的事情
|
||||||
|
|
||||||
|
准备步骤:
|
||||||
|
|
||||||
|
首先确保你已经连上了互联网,你可以在顶部的通知区域查看可用的网络列表
|
||||||
|
|
||||||
|
#### 1、更改主机名
|
||||||
|
|
||||||
|
这可能不是你想做的第一件事。但是我不知道为什么在安装过程中没有给出更改主机名的选项。例如,见下图的终端提示, 这个主机名是 elementary OS 的默认硬件配置。在我看来这一点都不好。
|
||||||
|
|
||||||
|
![主机名修改之前][2]
|
||||||
|
|
||||||
|
打开终端并运行下列命令以更改主机名:
|
||||||
|
|
||||||
|
```
|
||||||
|
hostnamectl set-hostname your-new-hostname
|
||||||
|
```
|
||||||
|
|
||||||
|
示例:
|
||||||
|
|
||||||
|
![修改主机名][3]
|
||||||
|
|
||||||
|
![主机名修改之后][4]
|
||||||
|
|
||||||
|
#### 2、升级你的系统
|
||||||
|
|
||||||
|
在安装任何 Linux 发行版后,你应该做的第一件事就是确保系统处于最新的软件包和安全更新状态。
|
||||||
|
|
||||||
|
你可以通过打开应用中心来检查或者安装更新。
|
||||||
|
|
||||||
|
或者打开终端运行下列命令:
|
||||||
|
|
||||||
|
```
|
||||||
|
sudo apt update
|
||||||
|
sudo apt upgrade
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 3、安装 Pantheon Tweaks
|
||||||
|
|
||||||
|
Pantheon Tweaks 是 elementary OS 的必备应用。它提供了一些无法通过系统原生设置程序修改的额外的设置和配置选项,请打开终端并运行以下命令以安装 Pantheon Tweaks。注意:先前版本的 Tweak 工具叫做 elementary Tweaks,从 Odin 版本开始更名为 Pantheon Tweaks。
|
||||||
|
|
||||||
|
```
|
||||||
|
sudo apt install software-properties-common
|
||||||
|
sudo add-apt-repository -y ppa:philip.scott/pantheon-tweaks
|
||||||
|
sudo apt install -y pantheon-tweaks
|
||||||
|
```
|
||||||
|
|
||||||
|
安装后打开系统设置,你可以在那里找到 “<ruby>调整<rt>Tweaks</rt></ruby>” 选项。
|
||||||
|
|
||||||
|
[这里][5] 提供了更详细的安装指南(如果你需要了解更多信息)。
|
||||||
|
|
||||||
|
### 4、配置 Dock
|
||||||
|
|
||||||
|
Dock 是整个桌面的中心。老实说,Dock 中默认包含的应用并不常用,因此你可以通过以下步骤配置 Dock 中的项目。
|
||||||
|
|
||||||
|
* 移除:右键单击并取消 “<ruby>在 Dock 中驻留<rt>Keep in Dock</rt></ruby>” 选项。
|
||||||
|
* 添加新的项目:单击顶部的应用程序。然后右键单击你想要放在 Dock 的应用图标。选择 “<ruby>添加到 Dock<rt>Add to Dock</rt></ruby>”。
|
||||||
|
|
||||||
|
在我看来,你应该至少把文件管理、截图工具、Firefox 、计算器,以及其他的一些应用添加到 Dock。然后移除 Dock 上那些你不需要的应用。
|
||||||
|
|
||||||
|
#### 5、更改外观
|
||||||
|
|
||||||
|
elementary OS 6 Odin 改进了桌面的整体外观,为整个桌面和应用程序提供了自带的强调色和原生的夜间模式,同时,系统自带了许多漂亮的壁纸。你可以通过 “应用 > 系统设置 > 桌面” 来定制壁纸、外观、面板和多任务视图。
|
||||||
|
|
||||||
|
![elementary OS 6 Odin 桌面设置界面][6]
|
||||||
|
|
||||||
|
按照你希望的样子来配置你系统的外观。
|
||||||
|
|
||||||
|
你也可以基于日出和日落的时间来设置夜间模式。
|
||||||
|
|
||||||
|
#### 6、安装其他的应用
|
||||||
|
|
||||||
|
自带的应用中心非常适合这个系统,我发现它是 Linux 桌面最好的应用商店之一。然而,有时候需要安装没有预装的必要应用(大多数是知名的应用)。下面是个新系统推荐安装的软件列表。(说真的,为什么 LibreOffice 没有预装?)
|
||||||
|
|
||||||
|
* firefox
|
||||||
|
* gimp
|
||||||
|
* gedit
|
||||||
|
* inkscape
|
||||||
|
* obs-studio
|
||||||
|
* libreoffice
|
||||||
|
|
||||||
|
#### 7、一些针对笔记本电脑的省电贴士
|
||||||
|
|
||||||
|
有许多方法可以配置你的 elementary OS(或者一般的 Linux 桌面),以达到延长电池寿命的目的。记住,电池寿命取决于你的笔记本硬件,以及电池和笔记本的使用年限。所以,遵循下面的一些建议,最大限度的利用你的笔记本电池。
|
||||||
|
|
||||||
|
* 安装 [tlp][8]。`tlp` 是一个简单易用的命令行程序,用来帮你在 Linux 上延长电池寿命。你只需要安装它,默认情况下,它会处理好其他的设置。安装命令:
|
||||||
|
|
||||||
|
```
|
||||||
|
sudo add-apt-repository ppa:linrunner/tlp
|
||||||
|
sudo apt update
|
||||||
|
sudo apt-get install tlp
|
||||||
|
sudo tlp start
|
||||||
|
```
|
||||||
|
|
||||||
|
* 关闭蓝牙,默认情况下,蓝牙是开启状态。在需要的时候再启动它。
|
||||||
|
|
||||||
|
* 通过下面的命令安装 `thermald`。这个实用程序(实际是个守护进程)控制着你的 CPU 的 P-States 和 T-States 的温度以及 CPU 发热。
|
||||||
|
|
||||||
|
```
|
||||||
|
sudo apt install thermald
|
||||||
|
```
|
||||||
|
|
||||||
|
* 根据你的需要将亮度调到最小。
|
||||||
|
|
||||||
|
#### 8、安装磁盘实用程序
|
||||||
|
|
||||||
|
在很多情况下,你发现你需要格式化 USB 或者向 USB 中写入一些东西。默认情况下,系统没有安装任何相关的应用。你可以安装以下这些易用的应用。
|
||||||
|
|
||||||
|
* gnome-disk-utility
|
||||||
|
* gparted
|
||||||
|
|
||||||
|
#### 9、启用最大化和最小化选项
|
||||||
|
|
||||||
|
许多用户喜欢在窗口标题栏左边或者右边使用最大化、最小化的按钮,elementary OS 默认只提供关闭和恢复两个选项。这没什么问题,因为这就是它的设计理念。然而你可以通过使用 Pantheon Tweaks 来开启最大化和最小化按钮,具体的方式是:“调整 > 外观 > 窗口控制”。
|
||||||
|
|
||||||
|
![在 elementary OS 中启动最大化和最小化设置][9]
|
||||||
|
|
||||||
|
#### 10、在 Odin 中学习新的多点触控手势
|
||||||
|
|
||||||
|
如果你是笔记本用户,并且使用 elementary OS “Odin”,那么你一定要看看这些超酷的新触控手势。三根手指向上滑动,就会平滑的打开多任务视图,展示打开的应用程序和工作空间。用三根手指向左或向右滑动,就能在动态工作空间之间流畅的切换,使任务之间的切换更快。
|
||||||
|
|
||||||
|
用两根手指也可以在原生应用中实现类似的功能。
|
||||||
|
|
||||||
|
### 结束语
|
||||||
|
|
||||||
|
我希望这篇安装 elementary OS 6 “Odin” 后要做的 10 件事能帮助到你,让你可以上手使用 elementary OS 6 “Odin”,尽管这些事情完全是用户的偏好,因此这些事情有可能适合你也有可能不适用于你,但总的来说,这些都是一般用户喜欢的预期调整。
|
||||||
|
|
||||||
|
如果你觉得有更多的东西应该添加到列表中,请在下面的评论中告诉我。
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
via: https://www.debugpoint.com/2021/08/10-things-to-do-after-install-elementary-os-6/
|
||||||
|
|
||||||
|
作者:[Arindam][a]
|
||||||
|
选题:[lujun9972][b]
|
||||||
|
译者:[anine09](https://github.com/anine09)
|
||||||
|
校对:[wxy](https://github.com/wxy)
|
||||||
|
|
||||||
|
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||||
|
|
||||||
|
[a]: https://www.debugpoint.com/author/admin1/
|
||||||
|
[b]: https://github.com/lujun9972
|
||||||
|
[1]: https://www.debugpoint.com/2021/08/elementary-os-6/
|
||||||
|
[2]: https://www.debugpoint.com/blog/wp-content/uploads/2021/08/hostname-change-before.jpeg
|
||||||
|
[3]: https://www.debugpoint.com/blog/wp-content/uploads/2021/08/changing-hostname.jpeg
|
||||||
|
[4]: https://www.debugpoint.com/blog/wp-content/uploads/2021/08/changed-hostname.jpeg
|
||||||
|
[5]: https://www.debugpoint.com/2021/07/elementary-tweaks-install/
|
||||||
|
[6]: https://www.debugpoint.com/blog/wp-content/uploads/2021/08/elementary-OS-6-Odin-settings-window-Desktop.jpeg
|
||||||
|
[7]: https://www.debugpoint.com/2020/09/elementary-os-6-odin-new-features-release-date/
|
||||||
|
[8]: https://linrunner.de/tlp/
|
||||||
|
[9]: https://www.debugpoint.com/blog/wp-content/uploads/2021/08/enable-minimize-maximize-buttons-elementary-OS-1024x501.png
|
||||||
|
|
@ -0,0 +1,99 @@
|
|||||||
|
[#]: subject: "How to set up your printer on Linux"
|
||||||
|
[#]: via: "https://opensource.com/article/21/8/add-printer-linux"
|
||||||
|
[#]: author: "Seth Kenlon https://opensource.com/users/seth"
|
||||||
|
[#]: collector: "lujun9972"
|
||||||
|
[#]: translator: "fisherue"
|
||||||
|
[#]: reviewer: "wxy"
|
||||||
|
[#]: publisher: "wxy"
|
||||||
|
[#]: url: "https://linux.cn/article-13740-1.html"
|
||||||
|
|
||||||
|
如何在 Linux 系统设置打印机
|
||||||
|
======
|
||||||
|
|
||||||
|
> 如果系统没有自动检测到你的打印机,这篇文章教你如何在 Linux 系统手动添加打印机。
|
||||||
|
|
||||||
|
![](https://img.linux.net.cn/data/attachment/album/202109/01/104541gvvxvriei677o76v.jpg)
|
||||||
|
|
||||||
|
即使未来已来,<ruby>电子墨水<rt>e-ink</rt></ruby>和 AR 技术可以现实应用,我们还是会用到打印机的。打印机制造商还不能做到让自己的专利打印机可以与各种计算机完全标准化传递信息,以至于我们需要各种打印机驱动程序,在任何操作系统上都是如此。电子电气工程师协会信息科学与技术处(IEEE-ISTO)下属的打印机工作组(PWG)和开放打印技术组织(OpenPrinting.org)长期合作致力于让人们可以(使用任何型号打印机)轻松打印。带来的便利就是,很多打印机可以不需要用户进行配置就可以自动被识别使用。
|
||||||
|
|
||||||
|
如果系统没有自动检测到你的打印机,你可以在这篇文章中找到如何在 Linux 系统手动添加打印机。文中假定你使用的是 GNOME 图形桌面系统,其设置流程同样适用于 KDE 或其他大多数桌面系统。
|
||||||
|
|
||||||
|
### 打印机驱动程序
|
||||||
|
|
||||||
|
在你尝试用打印机打印文件时,要先确认你的 Linux 系统上是不是已经安装了更新的打印机驱动程序。
|
||||||
|
|
||||||
|
可以尝试安装的打印机驱动程序有三大类:
|
||||||
|
|
||||||
|
* 作为安装包提供的,捆绑在你的 Linux 系统上的开源 [Gutenprint 驱动程序][2]
|
||||||
|
* 打印机制造商提供的专用驱动程序
|
||||||
|
* 第三方开发提供的打印机驱动程序
|
||||||
|
|
||||||
|
开源打印机驱动程序库可以驱动 700 多种打印机,值得安装,这里面可能就有你的打印机的驱动,说不定可以自动设置好你的打印机(,你就可以使用它了)。
|
||||||
|
|
||||||
|
### 安装开源驱动程序包(库)
|
||||||
|
|
||||||
|
有些 Linux 发行版已经预装了开源打印机驱动程序包,如果没有,你可以用包管理器来安装。比如说,在 Fedora、CentOS、Magela 等类似发行版的 Linux 系统上,执行下面命令来安装:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ sudo dnf install gutenprint
|
||||||
|
```
|
||||||
|
|
||||||
|
惠普(HP)系列的打印机,还需要安装惠普的 Linux 图形及打印系统软件包(HPLIP)。如在 Debian、Linux Mint 等类似的系统上,可以使用下面的命令:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ sudo apt install hplip
|
||||||
|
```
|
||||||
|
|
||||||
|
### 安装制造商提供的驱动程序
|
||||||
|
|
||||||
|
很多时候因为打印机制造商使用了非标准的接口协议,这种情况开源打印机驱动程序就不能驱动打印机。另外的情况就是,开源驱动程序可以驱动打印机工作,但是会缺少供应商特有的某些性能。这些情况,你需要访问制造商的网站,找到适合你的打印机型号的 Linux 平台驱动。安装过程各异,仔细阅读安装指南逐步安装。
|
||||||
|
|
||||||
|
如果你的打印机根本不被厂商支持,你或许也只能尝试第三方提供的该型号打印机的驱动软件了。这类第三方驱动程序不是开源的,但大多数打印机的专用驱动程序也不是。如果你需要额外花费从供应商那里获取帮助服务才能安装好驱动并使用你的打印机,那是很心疼,或者你索性把这台打印机扔掉,至少你知道下次再也不会购买这个品牌的打印机了。
|
||||||
|
|
||||||
|
### 通用打印驱动系统(CUPS)
|
||||||
|
|
||||||
|
<ruby>通用打印驱动系统<rt>Common Unix Printing System</rt></ruby>(CUPS)是由 Easy Software Products 公司于 1997 年开发的,2007 年被苹果公司收购。这是 Linux 平台打印的开源基础软件包,大多数现代发行版都为它提供了一个定制化的界面。得益于 CUPS 技术,你可以发现通过 USB 接口连接到电脑的打印机,甚至连接在同一网络的共享打印机。
|
||||||
|
|
||||||
|
一旦你安装了需要的驱动程序包,你就能手工添加你的打印机了。首先,把打印机连接到运行的电脑上,并打开打印机电源。然后从“活动”屏幕或者应用列表中找到并打开“打印机”设置。
|
||||||
|
|
||||||
|
![printer settings][4]
|
||||||
|
|
||||||
|
基于你已经安装的驱动包,你的 Linux 系统有可能自动检测识别到你的打印机型号,不需要额外的设置就可以使用你的打印机了。
|
||||||
|
|
||||||
|
![printer settings][5]
|
||||||
|
|
||||||
|
一旦你在列表中找到你的打印机型号,设置使用这个驱动,恭喜你就可以在 Linux 系统上用它打印了。
|
||||||
|
|
||||||
|
(如果你的打印机没有被自动识别,)你需要自行添加打印机。在“打印机”设置界面,点击右上角的解锁按钮,输入管理用户密码,按钮转换成“添加打印机”按钮。
|
||||||
|
|
||||||
|
然后点击这个“添加打印机”按钮,电脑会搜索已经连接的本地打印机型号并匹配相应驱动程序。如果要添加网络共享打印机,在搜索框输入打印机或者其服务器机的 IP 地址。
|
||||||
|
|
||||||
|
![searching for a printer][6]
|
||||||
|
|
||||||
|
选中你想添加的打印机型号,点击“添加”按钮把打印机驱动加入系统,就可以使用它了。
|
||||||
|
|
||||||
|
### 在 Linux 系统上打印
|
||||||
|
|
||||||
|
在 Linux 系统上打印很容易,不管你是在使用本地打印机还是网络打印机。如果你计划购买打印机,建议查看开放打印技术组织的(可支持打印机)数据库([OpenPrinting.org][7]),看看你想购买的打印机是不是有相应的开源驱动程序。如果你已经拥有一台打印机,你现在也知道怎样在你的 Linux 系统上使用你的打印机了。
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
via: https://opensource.com/article/21/8/add-printer-linux
|
||||||
|
|
||||||
|
作者:[Seth Kenlon][a]
|
||||||
|
选题:[lujun9972][b]
|
||||||
|
译者:[fisherue](https://github.com/fisherue)
|
||||||
|
校对:[wxy](https://github.com/wxy)
|
||||||
|
|
||||||
|
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||||
|
|
||||||
|
[a]: https://opensource.com/users/seth
|
||||||
|
[b]: https://github.com/lujun9972
|
||||||
|
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/happy-printer.png?itok=9J44YaDs "printing on Linux"
|
||||||
|
[2]: http://gimp-print.sourceforge.net/
|
||||||
|
[3]: https://www.turboprint.info/
|
||||||
|
[4]: https://opensource.com/sites/default/files/system-settings-printer_0.png "printer settings"
|
||||||
|
[5]: https://opensource.com/sites/default/files/settings-printer.png "printer settings"
|
||||||
|
[6]: https://opensource.com/sites/default/files/printer-search.png "searching for a printer"
|
||||||
|
[7]: http://www.openprinting.org/printers/
|
||||||
|
|
@ -0,0 +1,77 @@
|
|||||||
|
[#]: subject: "Apps for daily needs part 4: audio editors"
|
||||||
|
[#]: via: "https://fedoramagazine.org/apps-for-daily-needs-part-4-audio-editors/"
|
||||||
|
[#]: author: "Arman Arisman https://fedoramagazine.org/author/armanwu/"
|
||||||
|
[#]: collector: "lujun9972"
|
||||||
|
[#]: translator: "geekpi"
|
||||||
|
[#]: reviewer: "turbokernel"
|
||||||
|
[#]: publisher: "wxy"
|
||||||
|
[#]: url: "https://linux.cn/article-13771-1.html"
|
||||||
|
|
||||||
|
满足日常需求的应用(四):音频编辑器
|
||||||
|
======
|
||||||
|
|
||||||
|
![][1]
|
||||||
|
|
||||||
|
在过去,音频编辑应用或<ruby>数字音频工作站<rt>digital audio workstation</rt></ruby>(DAW)只提供给专业人士使用,如唱片制作人、音响工程师和音乐家。但现在很多不是专业人士的人也需要它们。这些工具被用于演示文稿解说、视频博客,甚至只是作为一种爱好。现在尤其如此,因为有这么多的在线平台,方便大家分享音频作品,如音乐、歌曲、播客等。本文将介绍一些你可以在 Fedora Linux 上使用的开源音频编辑器或 DAW。你可能需要安装提到的软件。如果你不熟悉如何在 Fedora Linux 中添加软件包,请参阅我之前的文章[安装 Fedora 34 工作站后要做的事情][4]。这里列出了音频编辑器或 DAW 类的一些日常需求的应用。
|
||||||
|
|
||||||
|
### Audacity
|
||||||
|
|
||||||
|
我相信很多人已经知道 Audacity 了。它是一个流行的多轨音频编辑器和录音机,可用于对所有类型的音频进行后期处理。大多数人使用 Audacity 来记录他们的声音,然后进行编辑,使其成品更好。其成品可以作为播客或视频博客的解说词。此外,人们还用 Audacity 来创作音乐和歌曲。你可以通过麦克风或调音台录制现场音频。它还支持 32 位的声音质量。
|
||||||
|
|
||||||
|
Audacity 有很多功能,可以支持你的音频作品。它有对插件的支持,你甚至可以自己编写插件。Audacity 提供了许多内置效果,如降噪、放大、压缩、混响、回声、限制器等。你可以利用实时预览功能在直接聆听音频的同时尝试这些效果。内置的插件管理器可以让你管理经常使用的插件和效果。
|
||||||
|
|
||||||
|
![][5]
|
||||||
|
|
||||||
|
详情请参考此链接: <https://www.audacityteam.org/>
|
||||||
|
|
||||||
|
### LMMS
|
||||||
|
|
||||||
|
LMMS(即 <ruby>Linux 多媒体工作室<rt>Linux MultiMedia Studio</rt></ruby>)是一个全面的音乐创作应用。你可以从头使用 LMMS 用你的电脑开始制作你的音乐。你可以根据自己的创意创造旋律和节拍,并通过选择声音乐器和各种效果使其更加完美。有几个与乐器和效果有关的内置功能,如 16 个内置合成器、嵌入式 ZynAddSubFx、支持插入式 VST 效果插件、捆绑图形和参数均衡器、内置分析器等等。LMMS 还支持 MIDI 键盘和其他音频外围设备。
|
||||||
|
|
||||||
|
![][6]
|
||||||
|
|
||||||
|
详情请参考此链接: <https://lmms.io/>
|
||||||
|
|
||||||
|
### Ardour
|
||||||
|
|
||||||
|
Ardour 作为一个全面的音乐创作应用,其功能与 LMMS 相似。它在其网站上说,Ardour 是一个 DAW 应用,是来自世界各地的音乐家、程序员和专业录音工程师合作的结果。Ardour 拥有音频工程师、音乐家、配乐编辑和作曲家需要的各种功能。
|
||||||
|
|
||||||
|
Ardour 提供了完整的录音、编辑、混音和输出功能。它有无限的多声道音轨、无限撤销/重做的非线性编辑器、一个全功能的混音器、内置插件等。Ardour 还包含视频播放工具,所以使用它为视频项目创建和编辑配乐也很有帮助。
|
||||||
|
|
||||||
|
![][7]
|
||||||
|
|
||||||
|
详情请参考此链接: <https://ardour.org/>
|
||||||
|
|
||||||
|
### TuxGuitar
|
||||||
|
|
||||||
|
TuxGuitar 是一款指法谱和乐谱编辑器。它配备了指法编辑器、乐谱查看器、多轨显示、拍号管理和速度管理。它包括弯曲、滑动、颤音等各种效果。虽然 TuxGuitar 专注于吉他,但它也可以为其他乐器写乐谱。它也能够作为一个基本的 MIDI 编辑器。你需要对指法谱和乐谱有一定的了解才能使用它。
|
||||||
|
|
||||||
|
![][8]
|
||||||
|
|
||||||
|
详情请参考此链接: <http://www.tuxguitar.com.ar/>
|
||||||
|
|
||||||
|
### 总结
|
||||||
|
|
||||||
|
本文章介绍了四款音频编辑器,可以满足你在 Fedora Linux 上日常使用的需求。其实,在 Fedora Linux 上还有很多音频编辑器或者 DAW 供你选择。你也可以使用 Mixxx、Rosegarden、Kwave、Qtractor、MuseScore、musE 等等。希望本文为你调查和选择合适的音频编辑器或者 DAW 提供帮助。如你有使用这些应用的经验,请在评论中分享你的经验。
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
via: https://fedoramagazine.org/apps-for-daily-needs-part-4-audio-editors/
|
||||||
|
|
||||||
|
作者:[Arman Arisman][a]
|
||||||
|
选题:[lujun9972][b]
|
||||||
|
译者:[geekpi](https://github.com/geekpi)
|
||||||
|
校对:[turbokernel](https://github.com/turbokernel)
|
||||||
|
|
||||||
|
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||||
|
|
||||||
|
[a]: https://fedoramagazine.org/author/armanwu/
|
||||||
|
[b]: https://github.com/lujun9972
|
||||||
|
[1]: https://fedoramagazine.org/wp-content/uploads/2021/07/FedoraMagz-Apps-4-Audio-816x345.jpg
|
||||||
|
[2]: https://unsplash.com/@brookecagle?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText
|
||||||
|
[3]: https://unsplash.com/s/photos/meeting-on-cafe-computer?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText
|
||||||
|
[4]: https://fedoramagazine.org/things-to-do-after-installing-fedora-34-workstation/
|
||||||
|
[5]: https://fedoramagazine.org/wp-content/uploads/2021/08/audio-audacity-1024x575.png
|
||||||
|
[6]: https://fedoramagazine.org/wp-content/uploads/2021/08/audio-lmms-1024x575.png
|
||||||
|
[7]: https://fedoramagazine.org/wp-content/uploads/2021/08/audio-ardour-1024x592.png
|
||||||
|
[8]: https://fedoramagazine.org/wp-content/uploads/2021/08/audio-tuxguitar-1024x575.png
|
@ -0,0 +1,124 @@
|
|||||||
|
[#]: subject: "Ulauncher: A Super Useful Application Launcher for Linux"
|
||||||
|
[#]: via: "https://itsfoss.com/ulauncher/"
|
||||||
|
[#]: author: "Ankush Das https://itsfoss.com/author/ankush/"
|
||||||
|
[#]: collector: "lujun9972"
|
||||||
|
[#]: translator: "geekpi"
|
||||||
|
[#]: reviewer: "wxy"
|
||||||
|
[#]: publisher: "wxy"
|
||||||
|
[#]: url: "https://linux.cn/article-13743-1.html"
|
||||||
|
|
||||||
|
Ulauncher:一个超级实用的 Linux 应用启动器
|
||||||
|
======
|
||||||
|
|
||||||
|
> Ulauncher 是一个快速应用启动器,支持扩展和快捷方式,帮助你在 Linux 中快速访问应用和文件。
|
||||||
|
|
||||||
|
应用启动器可以让你快速访问或打开一个应用,而无需在应用菜单图标上徘徊。
|
||||||
|
|
||||||
|
在默认情况下,我发现 Pop!_OS 的应用启动器超级方便。但是,并不是每个 Linux 发行版都提供开箱即用的应用启动器。
|
||||||
|
|
||||||
|
幸运的是,有一个你可以在大多数流行的发行版中添加应用启动器的方案。
|
||||||
|
|
||||||
|
### Ulauncher:开源应用启动器
|
||||||
|
|
||||||
|
![][1]
|
||||||
|
|
||||||
|
Ulauncher 是一个使用 Python 还有 GTK+ 构建的快速应用启动器。
|
||||||
|
|
||||||
|
它提供了相当数量的自定义和控制选项来进行调整。总的来说,你可以调整它的行为和体验以适应你的喜好。
|
||||||
|
|
||||||
|
让我来说一下你可以期待它的一些功能。
|
||||||
|
|
||||||
|
### Ulauncher 功能
|
||||||
|
|
||||||
|
Ulauncher 中的选项非常非常易于访问且易于定制。一些关键的亮点包括:
|
||||||
|
|
||||||
|
* 模糊搜索算法可以让你即使拼错了,也能找到应用
|
||||||
|
* 可以记住你在同一会话中最后搜索的应用
|
||||||
|
* 显示经常使用的应用(可选)
|
||||||
|
* 自定义颜色主题
|
||||||
|
* 预设颜色主题,包括一个黑暗主题
|
||||||
|
* 召唤启动器的快捷方式可以轻松定制
|
||||||
|
* 浏览文件和目录
|
||||||
|
* 支持扩展,以获得额外的功能(表情符号、天气、速度测试、笔记、密码管理器等)
|
||||||
|
* 浏览谷歌、维基百科和 Stack Overflow 等网站的快捷方式
|
||||||
|
|
||||||
|
它几乎提供了你在一个应用启动器中所期望的所有有用的能力,甚至更好。
|
||||||
|
|
||||||
|
### 如何在 Linux 中使用 Ulauncher?
|
||||||
|
|
||||||
|
默认情况下,首次从应用菜单中打开应用启动器后,你需要按 `Ctrl + Space` 打开应用启动器。
|
||||||
|
|
||||||
|
输入以搜索一个应用。如果你正在寻找一个文件或目录,输入以 `~` 或者 `/` 开始。
|
||||||
|
|
||||||
|
![][2]
|
||||||
|
|
||||||
|
有一些默认的快捷键,如 `g XYZ`,其中 “XYZ” 是你想在谷歌中搜索的搜索词。
|
||||||
|
|
||||||
|
![][3]
|
||||||
|
|
||||||
|
同样,你可以通过 `wiki` 和 `so` 快捷键,直接在维基百科或 Stack Overflow 搜索。
|
||||||
|
|
||||||
|
在没有任何扩展的情况下,你也可以直接计算内容,并将结果直接复制到剪贴板。
|
||||||
|
|
||||||
|
![][4]
|
||||||
|
|
||||||
|
这在快速计算时应该很方便,不需要单独启动计算器应用。
|
||||||
|
|
||||||
|
你可以前往它的 [扩展页面][5],浏览有用的扩展,以及指导你如何使用它的截图。
|
||||||
|
|
||||||
|
要改变它的工作方式,启用显示经常使用的应用,并调整主题,请点击启动器右侧的齿轮图标。
|
||||||
|
|
||||||
|
![][6]
|
||||||
|
|
||||||
|
你可以把它设置为自动启动。但是,如果它在你的支持 Systemd 的发行版上不工作,你可以参考它的 GitHub 页面,把它添加到服务管理器中。
|
||||||
|
|
||||||
|
这些选项是非常直观,且易于定制,如下图所示。
|
||||||
|
|
||||||
|
![][7]
|
||||||
|
|
||||||
|
### 在 Linux 中安装 Ulauncher
|
||||||
|
|
||||||
|
Ulauncher 为基于 Debian 或 Ubuntu 的发行版提供了一个 deb 包。如果你是 Linux 新手,你可以了解一下 [如何安装 Deb 文件][8] 。
|
||||||
|
|
||||||
|
在这两种情况下,你也可以添加它的 PPA,并通过终端按照下面的命令来安装它:
|
||||||
|
|
||||||
|
```
|
||||||
|
sudo add-apt-repository ppa:agornostal/ulauncher
|
||||||
|
sudo apt update
|
||||||
|
sudo apt install ulauncher
|
||||||
|
```
|
||||||
|
|
||||||
|
你也可以在 [AUR][9] 中找到它,用于 Arch 和 Fedora 的默认仓库。
|
||||||
|
|
||||||
|
对于更多信息,你可以前往其官方网站或 [GitHub 页面][10]。
|
||||||
|
|
||||||
|
- [Ulauncher][11]
|
||||||
|
|
||||||
|
Ulauncher 应该是任何 Linux 发行版中一个令人印象深刻的补充。特别是,如果你想要一个像 Pop!_OS 提供的快速启动器的功能,这是一个值得考虑的奇妙选择。
|
||||||
|
|
||||||
|
你试过 Ulauncher了吗?欢迎你就如何帮助你快速完成工作分享你的想法。
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
via: https://itsfoss.com/ulauncher/
|
||||||
|
|
||||||
|
作者:[Ankush Das][a]
|
||||||
|
选题:[lujun9972][b]
|
||||||
|
译者:[geekpi](https://github.com/geekpi)
|
||||||
|
校对:[wxy](https://github.com/wxy)
|
||||||
|
|
||||||
|
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||||
|
|
||||||
|
[a]: https://itsfoss.com/author/ankush/
|
||||||
|
[b]: https://github.com/lujun9972
|
||||||
|
[1]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/08/ulauncher.png?resize=800%2C512&ssl=1
|
||||||
|
[2]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/08/ulauncher-directory.png?resize=800%2C503&ssl=1
|
||||||
|
[3]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/08/ulauncher-google.png?resize=800%2C449&ssl=1
|
||||||
|
[4]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/08/ulauncher-calculator.png?resize=800%2C429&ssl=1
|
||||||
|
[5]: https://ext.ulauncher.io
|
||||||
|
[6]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/08/ulauncher-gear-icon.png?resize=800%2C338&ssl=1
|
||||||
|
[7]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/08/ulauncher-settings.png?resize=800%2C492&ssl=1
|
||||||
|
[8]: https://itsfoss.com/install-deb-files-ubuntu/
|
||||||
|
[9]: https://itsfoss.com/aur-arch-linux/
|
||||||
|
[10]: https://github.com/Ulauncher/Ulauncher/
|
||||||
|
[11]: https://ulauncher.io
|
@ -0,0 +1,82 @@
|
|||||||
|
[#]: subject: "Elementary OS 6 Odin Review – Late Arrival but a Solid One"
|
||||||
|
[#]: via: "https://www.debugpoint.com/2021/08/elementary-os-6-odin-review/"
|
||||||
|
[#]: author: "Arindam https://www.debugpoint.com/author/admin1/"
|
||||||
|
[#]: collector: "lujun9972"
|
||||||
|
[#]: translator: "imgradeone"
|
||||||
|
[#]: reviewer: "wxy"
|
||||||
|
[#]: publisher: "wxy"
|
||||||
|
[#]: url: "https://linux.cn/article-13739-1.html"
|
||||||
|
|
||||||
|
elementary OS 6 Odin 评测:迟到的新版本,但也实至名归
|
||||||
|
======
|
||||||
|
|
||||||
|
> 这篇 elementary OS 6 的评测将为你呈现该系统在旧款测试设备上的表现。
|
||||||
|
|
||||||
|
![](https://img.linux.net.cn/data/attachment/album/202109/01/095116zk73wcc4g5clnvq8.jpg)
|
||||||
|
|
||||||
|
elementary OS 的粉丝们焦急等待 elementary OS 6 Odin 发布已经将近两年了。如此焦急的原因,主要在于早期版本 elementary OS 5.1 的内核和软件包在 2021 年来说过于陈旧。而且,这一旧版本基于 Ubuntu 18.04 LTS 构建。因此,用户都急切地等待着基于 Ubuntu 20.04 LTS 的全新版本 —— 最重要的是,Ubutnu 20.04 LTS 已经发布一年,接下来也将有下一个 LTS 版本发布。
|
||||||
|
|
||||||
|
你应该也明白的,过长的等待时间,很可能导致用户跳槽到其他发行版。
|
||||||
|
|
||||||
|
但即便如此,新版本终于还是 [在 8 月发布了][1],它在用户和粉丝群体很受欢迎。
|
||||||
|
|
||||||
|
于是,我在一周前为一台旧设备(我知道新设备的体验会更好)安装了 elementary OS 6 Odin,下面就是测评。
|
||||||
|
|
||||||
|
![elementary OS 6 Odin 的桌面][2]
|
||||||
|
|
||||||
|
### elementary OS 6 Odin 测评
|
||||||
|
|
||||||
|
测试设备:
|
||||||
|
|
||||||
|
* CPU – Intel Core i3,4 GB 运行内存
|
||||||
|
* 硬盘 – SSD 固态硬盘
|
||||||
|
* 显卡 – Nvidia GeForce(340)
|
||||||
|
|
||||||
|
#### 安装
|
||||||
|
|
||||||
|
在这一版本中,elementary 团队针对他们自制的 elementary OS 安装器做了易用性优化。新安装器减少了安装前的准备步骤,虽然它还是需要依赖 GParted 进行分区操作(当然 GParted 本身是一款不错的工具)。
|
||||||
|
|
||||||
|
在前述测试设备中,安装过程大约花费了 10 分钟,没有任何报错。安装完之后,GRUB 也正常更新,没有任何意外。这是一个安装在老式 BIOS 上多引导系统。
|
||||||
|
|
||||||
|
#### 初见印象
|
||||||
|
|
||||||
|
如果你刚听说 elementary OS 和 Pantheon 桌面,或者从其他传统的菜单型桌面环境迁移过来,你可能需要一两天时间来适应这款桌面。当然,如果你已经是 elementary OS 的老用户的话,那么你将获得一致的体验,外加性能和外观的优化。
|
||||||
|
|
||||||
|
你应该可以察觉到一些明显可见的 [elementary OS 6 的新特性][3],像是强调色、原生暗黑模式,以及一组不错的新壁纸。
|
||||||
|
|
||||||
|
#### 稳定性与性能
|
||||||
|
|
||||||
|
我已经使用 elementary OS 6 Odin 超过一周的时间。在日常使用后,我只能说,它很稳定,没有突然的崩溃和意外。其他(通过 `apt` 单独安装的)额外软件也运作正常,性能也没有降低。
|
||||||
|
|
||||||
|
在近乎闲置的情况下,CPU 使用率处在 5%-10% 之间,内存占用约为 900 MB。CPU / 内存的消耗主要分配在 Gala(Pantheon 的窗口管理器)、Wingpanel(顶栏)和应用中心。
|
||||||
|
|
||||||
|
![elementary OS 6 的系统性能][5]
|
||||||
|
|
||||||
|
考虑到系统的视觉效果,我认为这些占用数据也十分合理。不过,当你打开更多软件,例如 LibreOffice、Chrome、Kdenlive 之后,消耗的资源肯定会更多。
|
||||||
|
|
||||||
|
#### 应用程序与应用中心
|
||||||
|
|
||||||
|
elementary OS 的应用程序列表经过精选,几乎所有类型的软件都可以从应用中心获取,包括 Flatpak 应用。不过,elementary OS 默认并没有预装一些重要的应用程序,像是 Firefox、LibreOffice、Torrent 客户端、硬盘分区工具、照片编辑器之类 —— 这些重要的程序需要在安装系统后再自行安装。我认为预装软件这一块有很大的改进空间。
|
||||||
|
|
||||||
|
### 结束语
|
||||||
|
|
||||||
|
在这一周的测试中,我也多次遇到了一个 bug,Wi-Fi 有时会突然断开,不过这完全是上游 Ubuntu 20.04 的问题 —— 多年以来,它一直有奇怪的 Wi-Fi 问题。抛开这个问题,elementary OS 确实是一款稳定、优秀的 Linux 发行版。如果 elementary OS 有滚动更新的版本,也许会更好。因此,这是一款值得推荐的发行版,尤其适合那些从 macOS 迁移过来的人。
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
via: https://www.debugpoint.com/2021/08/elementary-os-6-odin-review/
|
||||||
|
|
||||||
|
作者:[Arindam][a]
|
||||||
|
选题:[lujun9972][b]
|
||||||
|
译者:[imgradeone](https://github.com/imgradeone)
|
||||||
|
校对:[wxy](https://github.com/wxy)
|
||||||
|
|
||||||
|
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||||
|
|
||||||
|
[a]: https://www.debugpoint.com/author/admin1/
|
||||||
|
[b]: https://github.com/lujun9972
|
||||||
|
[1]: https://blog.elementary.io/elementary-os-6-odin-released/
|
||||||
|
[2]: https://www.debugpoint.com/blog/wp-content/uploads/2021/08/elementary-OS-6-ODIN-Desktop-1024x576.jpeg
|
||||||
|
[3]: https://www.debugpoint.com/2021/08/elementary-os-6/
|
||||||
|
[4]: https://www.debugpoint.com/2020/09/elementary-os-6-odin-new-features-release-date/
|
||||||
|
[5]: https://www.debugpoint.com/blog/wp-content/uploads/2021/08/System-performance-of-elementary-OS-6.jpeg
|
250
published/202109/20210827 How to Easily Install Debian Linux.md
Normal file
250
published/202109/20210827 How to Easily Install Debian Linux.md
Normal file
@ -0,0 +1,250 @@
|
|||||||
|
[#]: subject: "How to Easily Install Debian Linux"
|
||||||
|
[#]: via: "https://itsfoss.com/install-debian-easily/"
|
||||||
|
[#]: author: "Abhishek Prakash https://itsfoss.com/author/abhishek/"
|
||||||
|
[#]: collector: "lujun9972"
|
||||||
|
[#]: translator: "guevaraya"
|
||||||
|
[#]: reviewer: "wxy"
|
||||||
|
[#]: publisher: "wxy"
|
||||||
|
[#]: url: "https://linux.cn/article-13789-1.html"
|
||||||
|
|
||||||
|
如何轻松安装 Debian Linux 系统
|
||||||
|
======
|
||||||
|
|
||||||
|
![](https://img.linux.net.cn/data/attachment/album/202109/16/123647x9uz7zjjqrq0qwkk.jpg)
|
||||||
|
|
||||||
|
安装 Debian 的轻松程度依赖于选择什么镜像。
|
||||||
|
|
||||||
|
如果你使用 Debain 官网的默认 ISO 镜像,安装 Debian 就比较费劲。你会卡在这种界面,让你从外部可移动介质上安装网络驱动。
|
||||||
|
|
||||||
|
![对于新用户来说,从默认的 ISO 中安装 Debian 是有问题的][1]
|
||||||
|
|
||||||
|
当然你可以花时间去排除这个故障,但这让事情变得没有必要的复杂。
|
||||||
|
|
||||||
|
不用担心,让我来展示如何轻松地简单安装 Debian。
|
||||||
|
|
||||||
|
### 轻松安装 Debian 桌面系统的方法
|
||||||
|
|
||||||
|
在你查看这些步骤之前,请确认以下准备工作:
|
||||||
|
|
||||||
|
* 一个至少 4GB 大小的 USB 盘。
|
||||||
|
* 一个连接了互联网的系统(可以是要安装 Debian 的同一个机器)。
|
||||||
|
* 一个要安装的 Debian 的机器。它将会清理掉系统上所有数据,因此请复制重要数据到其他外部磁盘
|
||||||
|
|
||||||
|
你需要为 Debian 准备什么样配置的机器?这取决于你想用什么类型的 [桌面环境][2]。例如,GNOME 桌面系统可以在 4GB 内存上运行,但在 8GB 内存上更流畅一些。如果你只有 4GB 或更少的内存,还是建议尝试 KDE、Cinnamon 或 Xfce 桌面系统。
|
||||||
|
|
||||||
|
Debian 支持 [32 位和 64 位的指令架构][3]。你需要根据你的 CPU 指令架构选择对应的 Debian ISO 镜像。
|
||||||
|
|
||||||
|
你的系统应该至少要有 25GB 可用的硬盘空间。越多越好。
|
||||||
|
|
||||||
|
> **警告!**
|
||||||
|
>
|
||||||
|
> 这个方法会移除磁盘上所有其他操作系统及其数据。
|
||||||
|
>
|
||||||
|
> 你可以保存你后面还需要用的个人信息、文档、照片等到外部 USB 盘或云存储中。
|
||||||
|
|
||||||
|
在这个教程中,我将展示安装带有 GNOME 桌面环境的 Debian 11 Bullseye 的步骤。即使你选择其他的桌面环境,步骤也应该是一样的。
|
||||||
|
|
||||||
|
这个教程是在 GPT 分区的 UEFI 系统上测试的。如果你的系统是 [MBR 而不是 GPT][4],或是 [传统的 BIOS 而不是 UEFI][5],那么创建<ruby>临场<rt>Live</rt></ruby> USB 盘的步骤有一点不同。
|
||||||
|
|
||||||
|
#### 步骤 1:获取正确的 Debian ISO 镜像
|
||||||
|
|
||||||
|
在安装 Debian 过程中,选择正确的 ISO 镜像就已经成功一半了。令人惊讶的是,对于一个新的 Debian 用户来说,要浏览 Debian 的网站并找到最轻松好用的 ISO 真的很困难。
|
||||||
|
|
||||||
|
如果你点击 Debian 官网的下载按钮,它会下载一个最小化的网络安装文件,这对普通用户来说是非常复杂的。请 **不要** 使用这个。
|
||||||
|
|
||||||
|
反而,你应该用<ruby>临场<rt>Live</rt></ruby> ISO。但这里要注意,有一些单独的含有非自由软件(以包括网络硬件的驱动程序)的版本。
|
||||||
|
|
||||||
|
你应该下载这个非自由版的临场 ISO 镜像。不过另一个问题是,你不会在网站的显著位置注意到它,而且有各种架构的 BT 种子或直接下载的 URL。
|
||||||
|
|
||||||
|
让我把这些链接放在这里:
|
||||||
|
|
||||||
|
- [32 位和 64 位的主仓地址][7]
|
||||||
|
- [Debian 11 官方下载][8]
|
||||||
|
- [Debian 11 种子地址][9]
|
||||||
|
|
||||||
|
你会看到几个文件,文件名中提到了桌面环境。选择一种你要的桌面环境。直接下载的话,直接点击 .iso 结尾的链接即可。
|
||||||
|
|
||||||
|
![下载非自由版的临场 Debian ISO][10]
|
||||||
|
|
||||||
|
一旦你有了对应的 ISO 下载包,剩下就是和其他 Linux 发行版一样的标准安装流程了。
|
||||||
|
|
||||||
|
#### 步骤 2: 创建一个 Debian 的临场 USB 盘
|
||||||
|
|
||||||
|
将 USB 盘插入你的系统。在用之前最好格式化一下,反正它最终也会被格式化的。
|
||||||
|
|
||||||
|
你可以根据你的选择使用任何临场 USB 创建工具。如果你使用 Windows,可以使用 Rufus。我们在这里使用 Etcher,因为这个工具在 Windows 和 Linux 都可以用。
|
||||||
|
|
||||||
|
从它的官网下载 Etcher。
|
||||||
|
|
||||||
|
- [下载 Etcher][11]
|
||||||
|
|
||||||
|
我专门写过一篇 [在 Linux 下使用 Etcher 的教程][12],因此这里我就不深入介绍了。只要运行下载的可执行程序,浏览找到 Debian 的 ISO 镜像,确认选择正确的 USB 盘,然后点击 “Flash” 按钮即可。
|
||||||
|
|
||||||
|
![用 Etcher 创建 Debian 的临场 USB 盘][13]
|
||||||
|
|
||||||
|
不一会就创建好临场 USB 盘了。创建好之后,就可以开机引导了。
|
||||||
|
|
||||||
|
#### 步骤 3:从临场 USB 盘引导启动
|
||||||
|
|
||||||
|
重启你要安装 Debian 的机器。当显示制造商标识的时候,按下 `F2`、`F10` 或 `F12` 等键进入开机引导设置界面。你也可以从 Windows [进入到 UEFI 固件设置界面][14]。
|
||||||
|
|
||||||
|
有些机器如果启用了<ruby>安全启动<rt>secure boot</rt></ruby>功能,就不允许从临场 USB 盘引导。如果是这种情况,请 [从 BIOS 设置里禁用安全启动][15]
|
||||||
|
|
||||||
|
不同的的制造商在界面上会有一些差异。
|
||||||
|
|
||||||
|
![][16]
|
||||||
|
|
||||||
|
你在 BIOS 里做了修改之后,按下 `F10` 保存并退出。你的系统将会重新启动。
|
||||||
|
|
||||||
|
再一次,当看到制造商的标识后按下 `F2`、`F10` 或 `F12` 查看引导配置。你应该可以看到从 USB 引导的选项,然后选中它。
|
||||||
|
|
||||||
|
![][17]
|
||||||
|
|
||||||
|
一会儿就会看到如下图的显示界面,选择第一个选项。
|
||||||
|
|
||||||
|
![Debian 启动界面][18]
|
||||||
|
|
||||||
|
#### 步骤 4: 开始安装 Debian
|
||||||
|
|
||||||
|
当你进入临场 Debian 会话,如果你使用 GNONE 桌面,它呈现一个欢迎界面,可以在此选择你的键盘和语言。当你看到这些界面时,只需要点击下一步。
|
||||||
|
|
||||||
|
![Debian 临场欢迎界面][19]
|
||||||
|
|
||||||
|
欢迎界面之后,按下 `Windows` / `Super` 键进入活动区。你应该可以看到 Debian 的安装按钮。
|
||||||
|
|
||||||
|
![开始安装 Debian][20]
|
||||||
|
|
||||||
|
它会打开一个友好的 [Calamares 图形安装器][21]。从这里开始事情就比较简单了,
|
||||||
|
|
||||||
|
![Debian 11 Calamares 图形安装器][22]
|
||||||
|
|
||||||
|
它会让你选择你的地理位置和时区。
|
||||||
|
|
||||||
|
![选择你的地理位置和时区][23]
|
||||||
|
|
||||||
|
下一个界面,会让你选择键盘类型。这儿请 **注意**。你的键盘会根据你所选的位置自动选择。例如,我的位置是印度,它会自动默认选择印度键盘和印地语。我需要将其改为印度英语。
|
||||||
|
|
||||||
|
![选择键盘类型][24]
|
||||||
|
|
||||||
|
下一个界面是关于磁盘分区和要安装 Debian 的地方。在本文中,把 Debian 作为你电脑上唯一的操作系统来安装。
|
||||||
|
|
||||||
|
最简单的方法是直接选择 “<ruby>擦除磁盘<rt>Erase Disk</rt></ruby>”。除了必须的 ESP 分区和交换分区外,Debian 会把其他所有东西都放在根挂载点(`/`)上。实际上,下面显示了你所选的安装方式后的磁盘布局。
|
||||||
|
|
||||||
|
![磁盘分区][25]
|
||||||
|
|
||||||
|
如果你想把事情掌握在自己手中,你也可以选择手动分区,选择分配给 `/`、`/home`、`/boot` 或交换分区的大小。只有在你知道自己在做什么时,才可以这样做。
|
||||||
|
|
||||||
|
下一界面,你需要提供用户名和密码。但它不会设置 root 的密码,并将其保持为空。
|
||||||
|
|
||||||
|
![设置用户名和密码][26]
|
||||||
|
|
||||||
|
这也意味着你可以用新创建的用户使用 `sudo` 。在“复杂的 Debian 安装”中,你也可以设置 root 密码,但这样你就必须手动将普通用户添加到 `sudoer` 列表。看看,这种安装过程是不是对新手来说很容易?
|
||||||
|
|
||||||
|
在继续实际安装之前,它会呈现你所做的选择的汇总信息。如果没有问题,就可以点击“<ruby>安装<rt>Install</rt></ruby>”按钮。
|
||||||
|
|
||||||
|
![安装配置的汇总信息][27]
|
||||||
|
|
||||||
|
现在只需要等待安装完成。
|
||||||
|
|
||||||
|
![安装 Debian][28]
|
||||||
|
|
||||||
|
几分钟后就会完成安装。当安装完成,它会提示重启。
|
||||||
|
|
||||||
|
![完成 Debian 安装][29]
|
||||||
|
|
||||||
|
重启系统后如果一切顺利,你应该可以看到 Debian 的 GRUB 界面。
|
||||||
|
|
||||||
|
![Debian 启动画面][30]
|
||||||
|
|
||||||
|
### 疑难解答(如果系统没有启动到 Debian)
|
||||||
|
|
||||||
|
我遇到情况是,我的 Dell 系统不能识别任何要引导的操作系统。这很奇怪,我看见 Debian 经创建了一个 ESP 分区。
|
||||||
|
|
||||||
|
如果你也是同样的情况,进去 BIOS 配置里。检查<ruby>启动顺序<rt>Boot Sequence</rt></ruby>,如果你看不到任何东西,就点击“<ruby>新增引导选项<rt>Add Boot Option</rt></ruby>”。
|
||||||
|
|
||||||
|
![增加新的启动选项][31]
|
||||||
|
|
||||||
|
它会提供一个增加 EFI 文件的选项。
|
||||||
|
|
||||||
|
![选择 EFI 文件][32]
|
||||||
|
|
||||||
|
由于在安装过程中 Debian 创建了 ESP 分区,因此一个包含必要文件的 `EFI` 目录已经创建好了。
|
||||||
|
|
||||||
|
![选择 EFI 目录][33]
|
||||||
|
|
||||||
|
它会显示一个 `Debian` 目录及其他目录。选择 `Debian` 目录。
|
||||||
|
|
||||||
|
![选择 Debian 目录][34]
|
||||||
|
|
||||||
|
在 `Debian` 目录,你将看到 `grubx64.efi`、`shimx64.efi` 等文件。请选择 `shimx64.efi`。
|
||||||
|
|
||||||
|
![选择 shimx64.efi][35]
|
||||||
|
|
||||||
|
你需要给这个文件一个合适的名字。最后的界面应该如下:
|
||||||
|
|
||||||
|
![增加 efi 文件的新启动选项][36]
|
||||||
|
|
||||||
|
现在你应该有了这个启动选项。因为我命名为 `Debian`,它显示了两个 `Debian` 引导选项(我猜其中一个是从 efi 文件来的)。按下 `F10` 保存退出 BIOS 的配置。
|
||||||
|
|
||||||
|
![新增的启动选项][37]
|
||||||
|
|
||||||
|
现在启动你的系统,你可以看到带有 Debian 启动选项的 GRUB 界面了。你现在可以体验 Debian 了。
|
||||||
|
|
||||||
|
![][30]
|
||||||
|
|
||||||
|
### 你能安装 Debian 吗?
|
||||||
|
|
||||||
|
我写这篇文章的目的是让事情变得轻松点。并不是说你不能从默认的网络安装程序 ISO 来安装,只是它需要花更多的精力。
|
||||||
|
|
||||||
|
这个教程对你安装 Debian 有帮助吗?你如果还是有问题,请在下面留言给我,我会尽力提供帮助。
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
via: https://itsfoss.com/install-debian-easily/
|
||||||
|
|
||||||
|
作者:[Abhishek Prakash][a]
|
||||||
|
选题:[lujun9972][b]
|
||||||
|
译者:[巴龙](https://github.com/guevaraya)
|
||||||
|
校对:[wxy](https://github.com/wxy)
|
||||||
|
|
||||||
|
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||||
|
|
||||||
|
[a]: https://itsfoss.com/author/abhishek/
|
||||||
|
[b]: https://github.com/lujun9972
|
||||||
|
[1]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/08/Debian-firmware.png?resize=800%2C600&ssl=1
|
||||||
|
[2]: https://itsfoss.com/what-is-desktop-environment/
|
||||||
|
[3]: https://itsfoss.com/32-bit-64-bit-ubuntu/
|
||||||
|
[4]: https://itsfoss.com/check-mbr-or-gpt/
|
||||||
|
[5]: https://itsfoss.com/check-uefi-or-bios/
|
||||||
|
[6]: https://www.debian.org/
|
||||||
|
[7]: https://cdimage.debian.org/images/unofficial/non-free/images-including-firmware/11.0.0-live+nonfree/
|
||||||
|
[8]: https://cdimage.debian.org/images/unofficial/non-free/images-including-firmware/11.0.0-live+nonfree/amd64/iso-hybrid/
|
||||||
|
[9]: https://cdimage.debian.org/images/unofficial/non-free/images-including-firmware/11.0.0-live+nonfree/amd64/bt-hybrid/
|
||||||
|
[10]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/08/downloading-Debian-live-non-free-iso.png?resize=800%2C490&ssl=1
|
||||||
|
[11]: https://www.balena.io/etcher/
|
||||||
|
[12]: https://itsfoss.com/install-etcher-linux/
|
||||||
|
[13]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/08/creating-live-debian-usb-with-etcher-800x518.png?resize=800%2C518&ssl=1
|
||||||
|
[14]: https://itsfoss.com/access-uefi-settings-windows-10/
|
||||||
|
[15]: https://itsfoss.com/disable-secure-boot-windows/
|
||||||
|
[16]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2014/05/Disable_Secure_Boot_Windows8.jpg?resize=700%2C525&ssl=1
|
||||||
|
[17]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/04/boot-from-windows-disk-ventoy.jpg?resize=800%2C611&ssl=1
|
||||||
|
[18]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/08/debian-live-boot-screen.png?resize=617%2C432&ssl=1
|
||||||
|
[19]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/08/debian-live-welcome-screen.png?resize=800%2C450&ssl=1
|
||||||
|
[20]: https://itsfoss.com/wp-content/uploads/2021/08/start-Debian-installation-800x473.webp
|
||||||
|
[21]: https://calamares.io/
|
||||||
|
[22]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/08/Installing-Debian-1.png?resize=800%2C441&ssl=1
|
||||||
|
[23]: https://itsfoss.com/wp-content/uploads/2021/08/Installing-Debian-2-800x441.webp
|
||||||
|
[24]: https://itsfoss.com/wp-content/uploads/2021/08/Installing-Debian-4-800x441.webp
|
||||||
|
[25]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/08/Installing-Debian-5.png?resize=800%2C441&ssl=1
|
||||||
|
[26]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/08/Installing-Debian-6.png?resize=800%2C441&ssl=1
|
||||||
|
[27]: https://itsfoss.com/wp-content/uploads/2021/08/Installing-Debian-7-800x500.webp
|
||||||
|
[28]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/08/Installing-Debian-8.png?resize=800%2C500&ssl=1
|
||||||
|
[29]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/08/Installing-Debian-9.png?resize=800%2C500&ssl=1
|
||||||
|
[30]: https://itsfoss.com/wp-content/uploads/2021/08/debian-boot-screen.webp
|
||||||
|
[31]: https://itsfoss.com/wp-content/uploads/2021/08/add-new-boot-option.webp
|
||||||
|
[32]: https://itsfoss.com/wp-content/uploads/2021/08/add-efi-file-for-boot-option.webp
|
||||||
|
[33]: https://itsfoss.com/wp-content/uploads/2021/08/select-efi-file-boot-option.webp
|
||||||
|
[34]: https://itsfoss.com/wp-content/uploads/2021/08/select-debian-folder-for-uefi.webp
|
||||||
|
[35]: https://itsfoss.com/wp-content/uploads/2021/08/select-shim-boot.webp
|
||||||
|
[36]: https://itsfoss.com/wp-content/uploads/2021/08/new-boot-option.webp
|
||||||
|
[37]: https://itsfoss.com/wp-content/uploads/2021/08/new-boot-option-added.webp
|
@ -0,0 +1,135 @@
|
|||||||
|
[#]: subject: "Linux kernel modules we can't live without"
|
||||||
|
[#]: via: "https://opensource.com/article/21/8/linux-kernel-module"
|
||||||
|
[#]: author: "Jen Wike Huger https://opensource.com/users/jen-wike"
|
||||||
|
[#]: collector: "lujun9972"
|
||||||
|
[#]: translator: "geekpi"
|
||||||
|
[#]: reviewer: "wxy"
|
||||||
|
[#]: publisher: "wxy"
|
||||||
|
[#]: url: "https://linux.cn/article-13747-1.html"
|
||||||
|
|
||||||
|
我们离不开的 Linux 内核模块
|
||||||
|
======
|
||||||
|
|
||||||
|
> 开源爱好者们对他们所喜爱的 Linux 内核模块进行了评价。
|
||||||
|
|
||||||
|
![](https://img.linux.net.cn/data/attachment/album/202109/03/065649hik5hjiiy3htj589.jpg)
|
||||||
|
|
||||||
|
Linux 内核今年就要满 30 岁了! 如果你像我们一样对此特别重视,那么让我们本周用几个特别的文章来庆祝 Linux。
|
||||||
|
|
||||||
|
今天,我们先来看看来自社区对“**你不能没有哪个 Linux 内核模块?为什么?**”的回答,让我们听听这 10 位爱好者是怎么说的。
|
||||||
|
|
||||||
|
### #1
|
||||||
|
|
||||||
|
我猜一些内核开发者听到我的回答后会尖叫着跑开。不过,我还是在这里列出了两个最具争议性的模块:
|
||||||
|
|
||||||
|
* 第一个是 NVIDIA,因为我的工作笔记本和个人台式机上都有 NVIDIA 显卡。
|
||||||
|
* 另一个可能产生的仇恨较少。VMware 的 VMNET 和 VMMON 模块,以便能够运行 VMware Workstation。
|
||||||
|
|
||||||
|
— [Peter Czanik][2]
|
||||||
|
|
||||||
|
### #2
|
||||||
|
|
||||||
|
我最喜欢的是 [zram][3] 模块。它在内存中创建了一个压缩块设备,然后它可以作为交换分区使用。在内存有限的情况下(例如,在虚拟机上),还有如果你担心频繁的 I/O 操作会磨损你的 SSD 或者甚至更糟糕的基于闪存的存储,那么使用基于 zram 的交换分区是非常理想的。
|
||||||
|
|
||||||
|
— [Stephan Avenwedde][4]
|
||||||
|
|
||||||
|
### #3
|
||||||
|
|
||||||
|
最有用的内核模块无疑是 snd-hda-intel,因为它支持大多数集成声卡。我可以一边听音乐,一边在 Linux 桌面上编码一个音频编曲器。
|
||||||
|
|
||||||
|
— [Joël Krähemann][5]
|
||||||
|
|
||||||
|
### #4
|
||||||
|
|
||||||
|
如果没有我用 Broadcom 文件生成的 kmod-wl,我的笔记本就没有价值了。我有时会收到关于内核污染的信息,但没有无线网络的笔记本电脑有什么用呢?
|
||||||
|
|
||||||
|
— [Gregory Pittman][6]
|
||||||
|
|
||||||
|
### #5
|
||||||
|
|
||||||
|
我不能没有蓝牙。没有它,我的鼠标、键盘、扬声器和耳机除了用来挡住门板还有啥用?
|
||||||
|
|
||||||
|
— [Gary Smith][7]
|
||||||
|
|
||||||
|
### #6
|
||||||
|
|
||||||
|
我要冒昧地说 _全_ 都是。 说真的,我们已经到了随机拿一块硬件,插入它,它就可以工作的地步。
|
||||||
|
|
||||||
|
* USB 串行适配器能正常工作
|
||||||
|
* 显卡可以使用(尽管可能不是最好的)
|
||||||
|
* 网卡正常工作
|
||||||
|
* 声卡正常工作
|
||||||
|
|
||||||
|
所有这些模块整体带来大量可以工作的驱动程序,令人印象深刻。我记得在过去那些糟糕的日子里,我们曾经大喊 xrandr 魔法字符串才能来使投影仪工作。而现在,是的,当设备基本不能正常工作时,才真的罕见。
|
||||||
|
|
||||||
|
如果我不得不把它归结为一个,那就是 raid6。
|
||||||
|
|
||||||
|
— [John 'Warthog9' Hawley][8]
|
||||||
|
|
||||||
|
### #7
|
||||||
|
|
||||||
|
对于这个问题,我想回到 20 世纪 90 年代末。我是一家小公司的 Unix 系统管理员(兼任 IS 经理)。我们的磁带备份系统死了,由于“小公司”预算有限,我们没有急于更换或现场维修。所以我们必须得把它送去维修。
|
||||||
|
|
||||||
|
在那两个星期里,我们没有办法进行磁带备份。没有一个系统管理员愿意处于这种境地。
|
||||||
|
|
||||||
|
但后来我想起了读过的 [如何使用软盘磁带机][9],我们刚好有一台刚换下来的塔式电脑,它有一个软盘磁带机。
|
||||||
|
|
||||||
|
于是我用 Linux 重新安装了它,设置了 ftape 内核驱动模块,进行了一些备份/恢复测试,然后将我们最重要的备份运行到 QIC 磁带上。在这两个星期里,我们依靠 ftape 备份重要数据。
|
||||||
|
|
||||||
|
所以,对于那些让软盘磁带机在 1990 年代的 Linux 上工作的无名英雄,你真是太厉害了!
|
||||||
|
|
||||||
|
— [Jim Hall][10]
|
||||||
|
|
||||||
|
### #8
|
||||||
|
|
||||||
|
嗯,这很简单。是 kvm 内核模块。就个人而言,我无法想象在没有虚拟机的情况下完成日常工作。我愿意相信我们大多数人都是这样。kvm 模块在使 Linux 成为云战略的核心方面也发挥了很大作用。
|
||||||
|
|
||||||
|
— [Gaurav Kamathe][11]
|
||||||
|
|
||||||
|
### #9
|
||||||
|
|
||||||
|
对我来说,是 dm-crypt,它是用于 LUKS 的。参见:
|
||||||
|
|
||||||
|
* <https://www.redhat.com/sysadmin/disk-encryption-luks>
|
||||||
|
* <https://manpages.debian.org/unstable/cryptsetup-bin/cryptsetup.8.en.html>
|
||||||
|
|
||||||
|
知道别人无法看到你的磁盘上的内容是非常棒的,例如,如果你的笔记本丢失或被盗时。
|
||||||
|
|
||||||
|
— [Maximilian Kolb][12]
|
||||||
|
|
||||||
|
### #10
|
||||||
|
|
||||||
|
对于密码学基础,很难超越 crypto 模块和它的 C API,它是如此简洁明了。
|
||||||
|
|
||||||
|
在日常生活中,还有什么比蓝牙提供的即插即用更有价值的吗?
|
||||||
|
|
||||||
|
— [Marty Kalin][13]
|
||||||
|
|
||||||
|
在评论中与我们分享。你的生活中不能没有什么 Linux 内核模块?
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
via: https://opensource.com/article/21/8/linux-kernel-module
|
||||||
|
|
||||||
|
作者:[Jen Wike Huger][a]
|
||||||
|
选题:[lujun9972][b]
|
||||||
|
译者:[geekpi](https://github.com/geekpi)
|
||||||
|
校对:[wxy](https://github.com/wxy)
|
||||||
|
|
||||||
|
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||||
|
|
||||||
|
[a]: https://opensource.com/users/jen-wike
|
||||||
|
[b]: https://github.com/lujun9972
|
||||||
|
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/linux_keyboard_desktop.png?itok=I2nGw78_ (Linux keys on the keyboard for a desktop computer)
|
||||||
|
[2]: https://opensource.com/users/czanik
|
||||||
|
[3]: https://en.wikipedia.org/wiki/Zram
|
||||||
|
[4]: https://opensource.com/users/hansic99
|
||||||
|
[5]: https://opensource.com/users/joel2001k
|
||||||
|
[6]: https://opensource.com/users/greg-p
|
||||||
|
[7]: https://opensource.com/users/greptile
|
||||||
|
[8]: https://opensource.com/users/warthog9
|
||||||
|
[9]: https://tldp.org/HOWTO/Ftape-HOWTO.html
|
||||||
|
[10]: https://opensource.com/users/jim-hall
|
||||||
|
[11]: https://opensource.com/users/gkamathe
|
||||||
|
[12]: https://opensource.com/users/kolb
|
||||||
|
[13]: https://opensource.com/users/mkalindepauledu
|
@ -0,0 +1,130 @@
|
|||||||
|
[#]: sub·ject: "Position text on your screen in Linux with ncurses"
|
||||||
|
[#]: via: "https://opensource.com/article/21/8/ncurses-linux"
|
||||||
|
[#]: author: "Jim Hall https://opensource.com/users/jim-hall"
|
||||||
|
[#]: collector: "lujun9972"
|
||||||
|
[#]: translator: "perfiffer"
|
||||||
|
[#]: reviewer: "wxy"
|
||||||
|
[#]: publisher: "wxy"
|
||||||
|
[#]: url: "https://linux.cn/article-13756-1.html"
|
||||||
|
|
||||||
|
使用 ncurses 在你的 Linux 屏幕上定位文本
|
||||||
|
======
|
||||||
|
|
||||||
|
> 使用 ncurses 在 Linux 屏幕上的特定位置放置文本,可以带来更友好的用户界面体验。
|
||||||
|
|
||||||
|
![](https://img.linux.net.cn/data/attachment/album/202109/06/085908qrdrrv5dru6pcucr.jpg)
|
||||||
|
|
||||||
|
大多数的 Linux 实用程序仅仅只在屏幕的底部滚动文本。如果你想在屏幕中放置你的文本,例如一个游戏或者一个数据展示,你可以试试 ncurses。
|
||||||
|
|
||||||
|
curses 是一个旧的 Unix 库,它可以在文本终端界面控制光标。curses 的名称就来自于术语 “<ruby>光标控制<rt>cursor control</rt></ruby>”。多年以后,其他人编写了新的 curses 版本用来添加新的功能,新版本被叫做 “new curses” 或者 “ncurses”。你可以在每个流行的 Linux 发行版中找到 ncurses。尽管默认情况下可能未安装开发库、头文件和文档。例如,在 Fedora 上,你需要使用以下命令安装 `ncurses-devel` 包:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ sudo dnf install ncurses-devel
|
||||||
|
```
|
||||||
|
|
||||||
|
### 在程序中使用 ncurses
|
||||||
|
|
||||||
|
要在屏幕上直接寻址,你首先需要初始化 `ncurses` 库。大部分程序会通过以下三行来做到这一点:
|
||||||
|
|
||||||
|
* `initscr()`:初始化窗口对象和 ncurses 代码,返回代表整个屏幕的窗口对象
|
||||||
|
* `cbreak()`:禁用缓冲并使键入的输入立即可用
|
||||||
|
* `noecho()`:关闭回显,因此用户输入不会显示在屏幕上
|
||||||
|
|
||||||
|
这些函数定义在 `curses.h` 头文件中,你需要在你的程序中通过以下方式将其包含进来:
|
||||||
|
|
||||||
|
```
|
||||||
|
#include <curses.h>
|
||||||
|
```
|
||||||
|
|
||||||
|
初始化终端后,你可以自由使用任何 ncurses 函数,我们将在示例程序中探讨其中的一些函数。
|
||||||
|
|
||||||
|
当你使用完 ncurses 并想返回到常规终端模式下时,使用 `endwin()` 重置一切。此命令可以重置任何屏幕颜色,将光标移动到屏幕的左下角,并使光标可见。通常在退出程序之前执行此操作。
|
||||||
|
|
||||||
|
### 在屏幕上寻址
|
||||||
|
|
||||||
|
关于 ncurses 首先需要知道的是屏幕的坐标分为行和列,左上角的是 `0,0` 点。ncurses 定义了两个全局变量来帮助你识别屏幕:`LINES` 是屏幕的行数,`COLS` 是屏幕的列数。屏幕右下角的位置是 `LINES-1,COLS-1`。
|
||||||
|
|
||||||
|
例如,如果你想要移动光标到第 10 行和第 30 列,你可以使用 `move()` 函数,移动到此坐标:
|
||||||
|
|
||||||
|
```
|
||||||
|
move(10, 30);
|
||||||
|
```
|
||||||
|
|
||||||
|
之后显示的任何文本都将从屏幕的该位置开始。要显示单个字符,请对单个字符使用 `addch(c)` 函数。要显示字符串,将对字符串使用 `addstr(s)` 函数。对于类似于 `printf` 的格式化输出,请使用带有常用选项的 `printw(fmt, ...)`。
|
||||||
|
|
||||||
|
移动到屏幕指定位置和显示文本是一件很常见的事情,ncurses 提供了同时执行这两项操作的快捷方式。`mvaddch(row, col, c)` 函数将在屏幕第 `row` 行,第 `col` 列的位置显示一个字符。而 `mvaddstr(row, col, s)` 函数将在屏幕第 `row` 行,第 `col` 列的位置显示一个字符串。举个更直接的例子,在程序中使用 `mvaddstr(10, 30, "Welcome to ncurses");` 函数将从屏幕的第 `10` 行和第 `30` 列开始显示文本 `Welcome to ncurses`。使用 `mvaddch(0, 0, '+')` 函数将在屏幕的左上角第 `0` 行和第 `0` 列处显示一个加号(`+`)。
|
||||||
|
|
||||||
|
在终端屏幕上绘制文本会对某些系统产生性能影响,尤其是在较旧的硬件终端上。因此 ncurses 允许你“堆叠”一堆文本以显示在屏幕上,然后使用 `refresh()` 函数使所有这些更改对用户可见。
|
||||||
|
|
||||||
|
让我们来看一个将以上所有内容整合在一起的简单示例:
|
||||||
|
|
||||||
|
```
|
||||||
|
#include <curses.h>
|
||||||
|
|
||||||
|
int
|
||||||
|
main()
|
||||||
|
{
|
||||||
|
initscr();
|
||||||
|
cbreak();
|
||||||
|
noecho();
|
||||||
|
|
||||||
|
mvaddch(0, 0, '+');
|
||||||
|
mvaddch(LINES - 1, 0, '-');
|
||||||
|
mvaddstr(10, 30, "press any key to quit");
|
||||||
|
refresh();
|
||||||
|
|
||||||
|
getch();
|
||||||
|
|
||||||
|
endwin();
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
程序的开始初始化了一个终端窗口,然后在屏幕的左上角打印了一个加号,在左下角打印了一个减号,在第 `10` 行和第 `30` 列打印了 `press any key to quit` 文本。程序通过使用 `getch()` 函数接收了键盘输入的单个字符,接着,使用 `endwin()` 函数在程序完全退出前重置了终端。
|
||||||
|
|
||||||
|
`getch()` 是一个很有用的函数,你可以使用它来做很多事情。我经常使用它在我退出程序前用来暂停。与大多数 ncurses 函数一样,还有一个名为 `mvgetch(row, col)` 的 `getch()` 版本,用于在等待字符输入之前移动到屏幕位置的第 `row` 行,第 `col` 列。
|
||||||
|
|
||||||
|
### 使用 ncurses 编译
|
||||||
|
|
||||||
|
如果你尝试以通常的方式编译该示例程序,例如 `gcc pause.c`,你可能会从链接器中获得大量错误列表。那是因为 GNU C 编译器不会自动链接 `ncurses` 库。相反,你需要使用 `-l ncurses` 命令行选项加载它以进行链接。
|
||||||
|
|
||||||
|
```
|
||||||
|
$ gcc -o pause pause.c -lncurses
|
||||||
|
```
|
||||||
|
|
||||||
|
运行新程序将打印一条简单的 `press any key to quit`消息,该消息差不多位于屏幕中央:
|
||||||
|
|
||||||
|
![centered message in a program window][2]
|
||||||
|
|
||||||
|
*图 1:程序中居中的 “press any key to quit” 消息。*
|
||||||
|
|
||||||
|
### 使用 ncurses 构建更好的程序
|
||||||
|
|
||||||
|
探索 `ncurses` 库函数以了解在屏幕上显示文本的其它方法。你可以在 `ncurses` 的手册页中找到所有 `ncurses` 函数的列表。这给出了 ncurses 的一般概述,并提供了不同 `ncurses` 函数的类似表格的列表,并参考了包含完整详细信息的手册页。例如,在 `curs_printw(3X)` 手册页中描述了 `printw`,可以通过以下方式查看:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ man 3x curs_printw
|
||||||
|
```
|
||||||
|
|
||||||
|
更简单点:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ man curs_printw
|
||||||
|
```
|
||||||
|
|
||||||
|
使用 ncurses,你可以创建更多有趣的程序。通过在屏幕上的特定位置打印文本,你可以创建在终端中运行的游戏和高级实用程序。
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
via: https://opensource.com/article/21/8/ncurses-linux
|
||||||
|
|
||||||
|
作者:[Jim Hall][a]
|
||||||
|
选题:[lujun9972][b]
|
||||||
|
译者:[perfiffer](https://github.com/perfiffer)
|
||||||
|
校对:[wxy](https://github.com/wxy)
|
||||||
|
|
||||||
|
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||||
|
|
||||||
|
[a]: https://opensource.com/users/jim-hall
|
||||||
|
[b]: https://github.com/lujun9972
|
||||||
|
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/laptop_screen_desk_work_chat_text.png?itok=UXqIDRDD (Person using a laptop)
|
||||||
|
[2]: https://opensource.com/sites/default/files/press-key_0.png
|
@ -0,0 +1,143 @@
|
|||||||
|
[#]: subject: "Linux Jargon Buster: What is sudo rm -rf? Why is it Dangerous?"
|
||||||
|
[#]: via: "https://itsfoss.com/sudo-rm-rf/"
|
||||||
|
[#]: author: "Abhishek Prakash https://itsfoss.com/author/abhishek/"
|
||||||
|
[#]: collector: "lujun9972"
|
||||||
|
[#]: translator: "wxy"
|
||||||
|
[#]: reviewer: "wxy"
|
||||||
|
[#]: publisher: "wxy"
|
||||||
|
[#]: url: "https://linux.cn/article-13813-1.html"
|
||||||
|
|
||||||
|
Linux 黑话解释:什么是 sudo rm -rf?为什么如此危险?
|
||||||
|
======
|
||||||
|
|
||||||
|
![][11]
|
||||||
|
|
||||||
|
当你刚接触 Linux 时,你会经常遇到这样的建议:永远不要运行 `sudo rm -rf /`。在 Linux 世界里,更是围绕着 `sudo rm -rf` 有很多梗。
|
||||||
|
|
||||||
|
![][1]
|
||||||
|
|
||||||
|
但似乎对于它也有一些混乱的认识。在 [清理 Ubuntu 以腾出空间][2] 的教程中,我建议运行一些涉及 `sudo` 和 `rm -rf` 的命令。一位读者问我,如果 `sudo rm -rf` 是一个不应该运行的危险的 Linux 命令,我为什么要建议这样做。
|
||||||
|
|
||||||
|
因此,我想到了写一篇 Linux 黑话解释,以消除误解。
|
||||||
|
|
||||||
|
### sudo rm -rf 在做什么?
|
||||||
|
|
||||||
|
让我们按步骤来学习。
|
||||||
|
|
||||||
|
`rm` 命令用于 [在 Linux 命令行中删除文件和目录][3]。
|
||||||
|
|
||||||
|
```
|
||||||
|
$ rm agatha
|
||||||
|
$
|
||||||
|
```
|
||||||
|
|
||||||
|
但是因为有只读的 [文件权限][4],有些文件不会被立即删除。它们必须用选项 `-f` 强制删除。
|
||||||
|
|
||||||
|
```
|
||||||
|
$ rm books
|
||||||
|
rm: remove write-protected regular file 'books'? y
|
||||||
|
$ rm -f christie
|
||||||
|
$
|
||||||
|
```
|
||||||
|
|
||||||
|
另外,`rm` 命令不能被用来直接删除目录(文件夹)。你必须在 `rm` 命令中使用递归选项 `-r`。
|
||||||
|
|
||||||
|
```
|
||||||
|
$ rm new_dir
|
||||||
|
rm: cannot remove 'new_dir': Is a directory
|
||||||
|
```
|
||||||
|
|
||||||
|
因此最终,`rm -rf` 命令意味着递归地、强制删除指定的目录。
|
||||||
|
|
||||||
|
```
|
||||||
|
$ rm -r new_dir
|
||||||
|
rm: remove write-protected regular file 'new_dir/books'? ^C
|
||||||
|
$ rm -rf new_dir
|
||||||
|
$
|
||||||
|
```
|
||||||
|
|
||||||
|
下面是上述所有命令的截图。
|
||||||
|
|
||||||
|
![解释 rm 命令的例子][5]
|
||||||
|
|
||||||
|
如果你在 `rm -rf` 命令前加入 `sudo`,你就是在删除具有 root 权限的文件。这意味着你可以删除由 [root 用户][6] 拥有的系统文件。
|
||||||
|
|
||||||
|
### 所以,sudo rm -rf 是一个危险的 Linux 命令?
|
||||||
|
|
||||||
|
嗯,任何删除东西的命令都可能是危险的,如果你不确定你正在删除什么。
|
||||||
|
|
||||||
|
把 `rm -rf` 命令看作一把刀。刀是一个危险的东西吗?有可能。如果你用刀切蔬菜,那是好事。如果你用刀切手指,那当然是不好的。
|
||||||
|
|
||||||
|
`rm -rf` 命令也是如此。它本身并不危险。它只是用来删除文件的。但是,如果你在不知情的情况下用它来删除重要文件,那就有问题了。
|
||||||
|
|
||||||
|
现在来看看 `sudo rm -rf /`。
|
||||||
|
|
||||||
|
你知道,使用 `sudo`,你是以 root 身份运行一个命令,这允许你对系统进行任何改变。
|
||||||
|
|
||||||
|
`/` 是根目录的符号。`/var` 表示根目录下的 `var` 目录。`/var/log/apt` 指的是根目录的 `log` 目录下的 `apt` 目录。
|
||||||
|
|
||||||
|
![Linux 目录层次表示法][7]
|
||||||
|
|
||||||
|
按照 [Linux 目录层次结构][8],Linux 文件系统中的一切都从根目录开始。如果你删除了根目录,你基本上就是删除了系统中的所有文件。
|
||||||
|
|
||||||
|
这就是为什么建议不要运行 `sudo rm -rf /` 命令,因为你会抹去你的整个 Linux 系统。
|
||||||
|
|
||||||
|
请注意,在某些情况下,你可能正在运行像 `sudo rm -rf /var/log/apt` 这样的命令,这可能是没问题的。同样,你必须注意你正在删除的东西,就像你必须注意你正在用刀切割的东西一样。
|
||||||
|
|
||||||
|
### 我在玩火:如果我运行 sudo rm -rf /,看看会发生什么呢?
|
||||||
|
|
||||||
|
大多数 Linux 发行版都提供了一个故障安全保护,防止意外删除根目录。
|
||||||
|
|
||||||
|
```
|
||||||
|
$ sudo rm -rf /
|
||||||
|
[sudo] password for abhishek:
|
||||||
|
rm: it is dangerous to operate recursively on '/'
|
||||||
|
rm: use --no-preserve-root to override this failsafe
|
||||||
|
```
|
||||||
|
|
||||||
|
我的意思是,人是会打错字的,如果你不小心打了 `/ var/log/apt`,而不是 `/var/log/apt`(`/` 和 `var` 之间的空格意味着你给出了 `/` 和 `var` 目录来删除),你将会删除根目录。(LCTT 译注:我真干过,键盘敲的飞起,结果多敲了一个空格,然后就丢了半个文件系统 —— 那时候 Linux 还没这种故障安全保护。)
|
||||||
|
|
||||||
|
![使用 sudo rm -rf 时要注意][9]
|
||||||
|
|
||||||
|
别担心。你的 Linux 系统会照顾到这种意外。
|
||||||
|
|
||||||
|
现在,如果你一心想用 `sudo rm -rf /` 来破坏你的系统呢?你将必须使用它将要求你使用的 `-no-preserve-root` 选项与之配合。
|
||||||
|
|
||||||
|
不,请不要自己这样做。让我做给你看看。
|
||||||
|
|
||||||
|
所以,我在一个虚拟机中运行基本的操作系统。我运行 `sudo rm -rf / --no-preserve-root`,你可以在下面的视频中看到灯光熄灭(大约 1 分钟)。
|
||||||
|
|
||||||
|
![video](https://vimeo.com/594025609)
|
||||||
|
|
||||||
|
### 清楚了么?
|
||||||
|
|
||||||
|
Linux 有一个活跃的社区,大多数人都会帮助新用户。 之所以说是大多数,是是因为有一些的邪恶坏人潜伏着捣乱新用户。他们经常会建议对初学者所面临的最简单的问题运行 `rm -rf /`。我认为这些白痴在这种邪恶行为中得到了某种至上主义的满足。我会立即将他们从我管理的论坛和群组中踢出去。
|
||||||
|
|
||||||
|
我希望这篇文章能让你更清楚地了解这些情况。你有可能仍然有一些困惑,特别是因为它涉及到根目录、文件权限和其他新用户可能不熟悉的东西。如果是这样的话,请在评论区告诉我你的疑惑,我会尽力去解决。
|
||||||
|
|
||||||
|
最后,请记住。<ruby>不要喝酒胡搞<rt>Don’t drink and root</rt></ruby>。在运行你的 Linux 系统时要安全驾驶。
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
via: https://itsfoss.com/sudo-rm-rf/
|
||||||
|
|
||||||
|
作者:[Abhishek Prakash][a]
|
||||||
|
选题:[lujun9972][b]
|
||||||
|
译者:[wxy](https://github.com/wxy)
|
||||||
|
校对:[wxy](https://github.com/wxy)
|
||||||
|
|
||||||
|
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||||
|
|
||||||
|
[a]: https://itsfoss.com/author/abhishek/
|
||||||
|
[b]: https://github.com/lujun9972
|
||||||
|
[1]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2016/04/sudo-rm-rf.gif?resize=400%2C225&ssl=1
|
||||||
|
[2]: https://itsfoss.com/free-up-space-ubuntu-linux/
|
||||||
|
[3]: https://linuxhandbook.com/remove-files-directories/
|
||||||
|
[4]: https://linuxhandbook.com/linux-file-permissions/
|
||||||
|
[5]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/08/rm-rf-command-example-800x487.png?resize=800%2C487&ssl=1
|
||||||
|
[6]: https://itsfoss.com/root-user-ubuntu/
|
||||||
|
[7]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/08/linux-directory-structure.png?resize=800%2C400&ssl=1
|
||||||
|
[8]: https://linuxhandbook.com/linux-directory-structure/
|
||||||
|
[9]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/08/sudo-rm-rf-example.png?resize=798%2C346&ssl=1
|
||||||
|
[10]: https://www.youtube.com/c/itsfoss?sub_confirmation=1
|
||||||
|
[11]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/08/dont-drink-and-root.jpg?resize=800%2C450&ssl=1
|
@ -0,0 +1,161 @@
|
|||||||
|
[#]: subject: "Write a guessing game in ncurses on Linux"
|
||||||
|
[#]: via: "https://opensource.com/article/21/8/guess-number-game-ncurses-linux"
|
||||||
|
[#]: author: "Jim Hall https://opensource.com/users/jim-hall"
|
||||||
|
[#]: collector: "lujun9972"
|
||||||
|
[#]: translator: "perfiffer"
|
||||||
|
[#]: reviewer: "wxy"
|
||||||
|
[#]: publisher: "wxy"
|
||||||
|
[#]: url: "https://linux.cn/article-13762-1.html"
|
||||||
|
|
||||||
|
通过 ncurses 在 Linux 上写一个猜谜游戏
|
||||||
|
======
|
||||||
|
|
||||||
|
> 使用 ncurses 的灵活性和强大功能在 Linux 上创建一个猜数字游戏。
|
||||||
|
|
||||||
|
![](https://img.linux.net.cn/data/attachment/album/202109/07/224224ecchm0t5jbjc1dzy.jpg)
|
||||||
|
|
||||||
|
在我的 [上一篇文章][2],我简要介绍了使用 ncurses 库通过 C 语言编写文本模式交互式应用程序。使用 ncurses,我们可以控制文本在终端上的显示位置和方式。如果你通过阅读手册页探索 ncurses 库函数,你会发现显示文本有很多不同的方式,包括粗体文本、颜色、闪烁文本、窗口、边框、图形字符和其它功能,这些都可以使你的应用脱颖而出。
|
||||||
|
|
||||||
|
如果你想探索一个更高级的程序来演示其中一些有趣的功能,有一个简单的“猜数字”游戏,我已更新为使用 ncurses 编写的了。该程序在一个范围内选择一个随机数,然后要求用户进行重复猜测,直到他们猜到这个秘密数字。当用户进行猜测时,程序会告知他们猜测的数字是太低还是太高。
|
||||||
|
|
||||||
|
请注意,程序限定可能的数字范围是 0 到 7。将值保持在有限的个位数数字范围内,可以更轻松的使用 `getch()` 函数从用户读取单个数字。我还使用了 `getrandom` 内核系统调用来生成随机数,设定数字最大值为 7,以从 0 (二进制 `0000`)到 7 (二进制 `0111`)中选择一个随机数。
|
||||||
|
|
||||||
|
```
|
||||||
|
#include <curses.h>;
|
||||||
|
#include <string.h>; /* for strlen */
|
||||||
|
#include <sys/random.h>; /* for getrandom */
|
||||||
|
|
||||||
|
int
|
||||||
|
random0_7()
|
||||||
|
{
|
||||||
|
int num;
|
||||||
|
getrandom(&num, sizeof(int), GRND_NONBLOCK);
|
||||||
|
return (num & 7); /* from 0000 to 0111 */
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
read_guess()
|
||||||
|
{
|
||||||
|
int ch;
|
||||||
|
|
||||||
|
do {
|
||||||
|
ch = getch();
|
||||||
|
} while ((ch < '0') || (ch > '7'));
|
||||||
|
|
||||||
|
return (ch - '0'); /* turn into a number */
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
通过使用 ncurses,我们可以增加一些有趣的视觉体验。通过添加函数,我们可以在屏幕顶部显示重要的文本信息,在屏幕底部显示状态消息行:
|
||||||
|
|
||||||
|
```
|
||||||
|
void
|
||||||
|
print_header(const char *text)
|
||||||
|
{
|
||||||
|
move(0, 0);
|
||||||
|
clrtoeol();
|
||||||
|
|
||||||
|
attron(A_BOLD);
|
||||||
|
mvaddstr(0, (COLS / 2) - (strlen(text) / 2), text);
|
||||||
|
attroff(A_BOLD);
|
||||||
|
refresh();
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
print_status(const char *text)
|
||||||
|
{
|
||||||
|
move(LINES - 1, 0);
|
||||||
|
clrtoeol();
|
||||||
|
|
||||||
|
attron(A_REVERSE);
|
||||||
|
mvaddstr(LINES - 1, 0, text);
|
||||||
|
attroff(A_REVERSE);
|
||||||
|
refresh();
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
通过这些函数,我们就可以构建猜数字游戏的主要部分。首先,程序为 ncurses 设置终端,然后从 0 到 7 中选择一个随机数。显示数字刻度后,程序启动一个循环,询问用户的猜测。
|
||||||
|
|
||||||
|
当用户进行猜测时,程序会在屏幕上提供反馈。如果猜测太低,程序会在屏幕上的数字下方打印一个左方括号。如果猜测太高,程序会在屏幕上的数字下方打印一个右方括号。这有助于用户缩小他们的选择范围,直到他们猜出正确的数字。
|
||||||
|
|
||||||
|
```
|
||||||
|
int
|
||||||
|
main()
|
||||||
|
{
|
||||||
|
int number, guess;
|
||||||
|
|
||||||
|
initscr();
|
||||||
|
cbreak();
|
||||||
|
noecho();
|
||||||
|
|
||||||
|
number = random0_7();
|
||||||
|
mvprintw(1, COLS - 1, "%d", number); /* debugging */
|
||||||
|
|
||||||
|
print_header("Guess the number 0-7");
|
||||||
|
|
||||||
|
mvaddstr(9, (COLS / 2) - 7, "0 1 2 3 4 5 6 7");
|
||||||
|
|
||||||
|
print_status("Make a guess...");
|
||||||
|
|
||||||
|
do {
|
||||||
|
guess = read_guess();
|
||||||
|
|
||||||
|
move(10, (COLS / 2) - 7 + (guess * 2));
|
||||||
|
|
||||||
|
if (guess < number) {
|
||||||
|
addch('[');
|
||||||
|
print_status("Too low");
|
||||||
|
}
|
||||||
|
|
||||||
|
else if (guess > number) {
|
||||||
|
addch(']');
|
||||||
|
print_status("Too high");
|
||||||
|
}
|
||||||
|
|
||||||
|
else {
|
||||||
|
addch('^');
|
||||||
|
}
|
||||||
|
} while (guess != number);
|
||||||
|
|
||||||
|
print_header("That's right!");
|
||||||
|
print_status("Press any key to quit");
|
||||||
|
getch();
|
||||||
|
|
||||||
|
endwin();
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
复制这个程序,自己尝试编译它。不要忘记你需要告诉 GCC 编译器链接到 ncurses 库:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ gcc -o guess guess.c -lncurses
|
||||||
|
```
|
||||||
|
|
||||||
|
我留下了一个调试行,所以你可以看到屏幕右上角附近的秘密数字:
|
||||||
|
|
||||||
|
![guess number game interface][3]
|
||||||
|
|
||||||
|
*图1:猜数字游戏。注意右上角的秘密数字。*
|
||||||
|
|
||||||
|
### 开始使用 ncurses
|
||||||
|
|
||||||
|
该程序使用了 ncurses 的许多其它函数,你可以从这些函数开始。例如,`print_header` 函数在屏幕顶部居中以粗体文本打印消息,`print_status` 函数在屏幕左下角以反向文本打印消息。使用它来帮助你开始使用 ncurses 编程。
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
via: https://opensource.com/article/21/8/guess-number-game-ncurses-linux
|
||||||
|
|
||||||
|
作者:[Jim Hall][a]
|
||||||
|
选题:[lujun9972][b]
|
||||||
|
译者:[perfiffer](https://github.com/perfiffer)
|
||||||
|
校对:[wxy](https://github.com/wxy)
|
||||||
|
|
||||||
|
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||||
|
|
||||||
|
[a]: https://opensource.com/users/jim-hall
|
||||||
|
[b]: https://github.com/lujun9972
|
||||||
|
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/question-mark_chalkboard.jpg?itok=DaG4tje9 (question mark in chalk)
|
||||||
|
[2]: https://linux.cn/article-13756-1.html
|
||||||
|
[3]: https://opensource.com/sites/default/files/guessnumber07.png
|
120
published/202109/20210831 What is a container image.md
Normal file
120
published/202109/20210831 What is a container image.md
Normal file
@ -0,0 +1,120 @@
|
|||||||
|
[#]: subject: "What is a container image?"
|
||||||
|
[#]: via: "https://opensource.com/article/21/8/container-image"
|
||||||
|
[#]: author: "Nived V https://opensource.com/users/nivedv"
|
||||||
|
[#]: collector: "lujun9972"
|
||||||
|
[#]: translator: "geekpi"
|
||||||
|
[#]: reviewer: "wxy"
|
||||||
|
[#]: publisher: "wxy"
|
||||||
|
[#]: url: "https://linux.cn/article-13766-1.html"
|
||||||
|
|
||||||
|
什么是容器镜像?
|
||||||
|
======
|
||||||
|
|
||||||
|
> 容器镜像包含一个打包的应用,以及它的依赖关系,还有它在启动时运行的进程信息。
|
||||||
|
|
||||||
|
![](https://img.linux.net.cn/data/attachment/album/202109/08/152733c9i69xsssa62b6rr.jpg)
|
||||||
|
|
||||||
|
容器是当今 IT 运维的一个关键部分。<ruby>容器镜像<rt>container image</rt></ruby>包含了一个打包的应用,以及它的依赖关系,还有它在启动时运行的进程信息。
|
||||||
|
|
||||||
|
你可以通过提供一组特殊格式的指令来创建容器镜像,可以是提交给<ruby>注册中心<rt>Registry</rt></ruby>,或者是作为 Dockerfile 保存。例如,这个 Dockerfile 为 PHP Web 应用创建了一个容器:
|
||||||
|
|
||||||
|
```
|
||||||
|
FROM registry.access.redhat.com/ubi8/ubi:8.1
|
||||||
|
|
||||||
|
RUN yum --disableplugin=subscription-manager -y module enable php:7.3 \
|
||||||
|
&& yum --disableplugin=subscription-manager -y install httpd php \
|
||||||
|
&& yum --disableplugin=subscription-manager clean all
|
||||||
|
|
||||||
|
ADD index.php /var/www/html
|
||||||
|
|
||||||
|
RUN sed -i 's/Listen 80/Listen 8080/' /etc/httpd/conf/httpd.conf \
|
||||||
|
&& sed -i 's/listen.acl_users = apache,nginx/listen.acl_users =/' /etc/php-fpm.d/www.conf \
|
||||||
|
&& mkdir /run/php-fpm \
|
||||||
|
&& chgrp -R 0 /var/log/httpd /var/run/httpd /run/php-fpm \
|
||||||
|
&& chmod -R g=u /var/log/httpd /var/run/httpd /run/php-fpm
|
||||||
|
|
||||||
|
EXPOSE 8080
|
||||||
|
USER 1001
|
||||||
|
CMD php-fpm & httpd -D FOREGROUND
|
||||||
|
```
|
||||||
|
|
||||||
|
这个文件中的每条指令都会在容器镜像中增加一个<ruby>层<rt>layer</rt></ruby>。每一层只增加与下面一层的区别,然后,所有这些堆叠在一起,形成一个只读的容器镜像。
|
||||||
|
|
||||||
|
### 它是如何工作的?
|
||||||
|
|
||||||
|
你需要知道一些关于容器镜像的事情,按照这个顺序理解这些概念很重要:
|
||||||
|
|
||||||
|
1. 联合文件系统
|
||||||
|
2. 写入时复制(COW)
|
||||||
|
3. 叠加文件系统
|
||||||
|
4. 快照器
|
||||||
|
|
||||||
|
### 联合文件系统
|
||||||
|
|
||||||
|
<ruby>联合文件系统<rt>Union File System</rt></ruby>(UnionFS)内置于 Linux 内核中,它允许将一个文件系统的内容与另一个文件系统的内容合并,同时保持“物理”内容的分离。其结果是一个统一的文件系统,即使数据实际上是以分支形式组织。
|
||||||
|
|
||||||
|
这里的想法是,如果你有多个镜像有一些相同的数据,不是让这些数据再次复制过来,而是通过使用一个叫做<ruby>层<rt>layer</rt></ruby>的东西来共享。
|
||||||
|
|
||||||
|
![UnionFS][2]
|
||||||
|
|
||||||
|
每一层都是一个可以在多个容器中共享的文件系统,例如,httpd 基础层是 Apache 的官方镜像,可以在任何数量的容器中使用。想象一下,由于我们在所有的容器中使用相同的基础层,我们节省了多少磁盘空间。
|
||||||
|
|
||||||
|
这些镜像层总是只读的,但是当我们用这个镜像创建一个新的容器时,我们会在它上面添加一个薄的可写层。这个可写层是你创建、修改、删除或进行每个容器所需的其他修改的地方。
|
||||||
|
|
||||||
|
### 写时复制(COW)
|
||||||
|
|
||||||
|
当你启动一个容器时,看起来好像这个容器有自己的整个文件系统。这意味着你在系统中运行的每个容器都需要自己的文件系统副本。这岂不是要占用大量的磁盘空间,而且还要花费大量的时间让容器启动?不是的,因为每个容器都不需要它自己的文件系统副本!
|
||||||
|
|
||||||
|
容器和镜像使用<ruby>写时复制<rt>copy-on-write</rt></ruby>(COW)机制来实现这一点。写时复制策略不是复制文件,而是将同一个数据实例分享给多个进程,并且只在一个进程需要修改或写入数据时进行复制。所有其他进程将继续使用原始数据。
|
||||||
|
|
||||||
|
Docker 对镜像和容器都使用了写时复制的机制。为了做到这一点,在旧版本中,镜像和运行中的容器之间的变化是通过<ruby>图驱动<rt>graph driver</rt></ruby>来跟踪的,现在则是通过<ruby>快照器<rt>snapshotter</rt></ruby>来跟踪。
|
||||||
|
|
||||||
|
在运行中的容器中执行任何写操作之前,要修改的文件的副本被放在容器的可写层上。这就是发生 _写_ 的地方。现在你知道为什么它被称为“写时复制”了么。
|
||||||
|
|
||||||
|
这种策略既优化了镜像磁盘空间的使用,也优化了容器启动时间的性能,并与 UnionFS 一起工作。
|
||||||
|
|
||||||
|
### 叠加文件系统
|
||||||
|
|
||||||
|
<ruby>叠加文件系统<rt>Overlay File System</rt></ruby>位于现有文件系统的顶部,结合了上层和下层的目录树,并将它们作为一个单一的目录来呈现。这些目录被称为<ruby>层<rt>layer</rt></ruby>。下层保持不被修改。每一层只增加与下一层的差异(计算机术语为 “diff”),这种统一的过程被称为<ruby>联合挂载<rt>union mount</rt></ruby>。
|
||||||
|
|
||||||
|
最低的目录或镜像层被称为<ruby>下层目录<rt>lowerdir</rt></ruby>,上面的目录被称为 <ruby>上层目录<rt>upperdir</rt></ruby>。最后的覆盖层或统一层被称为<ruby>合并层<rt>merged</rt></ruby>。
|
||||||
|
|
||||||
|
![Layered file system][3]
|
||||||
|
|
||||||
|
常见的术语包括这些层的定义:
|
||||||
|
|
||||||
|
* <ruby>基础层<rt>Base layer</rt></ruby>:是你的文件系统的文件所在的地方。就容器镜像而言,这个层就是你的基础镜像。
|
||||||
|
* <ruby>叠加层<rt>Overlay layer</rt></ruby>:通常被称为<ruby>容器层<rt>container layer</rt></ruby>,因为对运行中的容器所做的所有改变,如添加、删除或修改文件,都会写到这个可写层。对这一层所做的所有修改都存储在下一层,是基础层和差异层的联合视图。
|
||||||
|
* <ruby>差异层<rt>Diff layer</rt></ruby>包含了在叠加层所作的所有修改。如果你写的东西已经在基础层了,那么叠加文件系统就会把文件复制到差异层,并做出你想写的修改。这被称为写时复制。
|
||||||
|
|
||||||
|
### 快照器
|
||||||
|
|
||||||
|
通过使用层和图驱动,容器可以将其更改作为其容器文件系统的一部分来构建、管理和分发。但是使用<ruby>图驱动<rt>graph driver</rt></ruby>的工作真的很复杂,而且容易出错。<ruby>快照器<rt>SnapShotter</rt></ruby>与图驱动不同,因为它们不用了解镜像或容器。
|
||||||
|
|
||||||
|
快照器的工作方式与 Git 非常相似,比如有树的概念,并跟踪每次提交对树的改变。一个<ruby>快照<rt>snapshot</rt></ruby>代表一个文件系统状态。快照有父子关系,使用一组目录。可以在父级和其快照之间进行差异比较(`diff`),以创建一个层。
|
||||||
|
|
||||||
|
快照器提供了一个用于分配、快照和挂载抽象的分层文件系统的 API。
|
||||||
|
|
||||||
|
### 总结
|
||||||
|
|
||||||
|
你现在对什么是容器镜像以及它们的分层方法如何使容器可移植有了很好的认识。接下来,我将介绍容器的运行机制和内部结构。
|
||||||
|
|
||||||
|
本文基于 [techbeatly][4] 的文章,经许可后改编。
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
via: https://opensource.com/article/21/8/container-image
|
||||||
|
|
||||||
|
作者:[Nived V][a]
|
||||||
|
选题:[lujun9972][b]
|
||||||
|
译者:[geekpi](https://github.com/geekpi)
|
||||||
|
校对:[wxy](https://github.com/wxy)
|
||||||
|
|
||||||
|
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||||
|
|
||||||
|
[a]: https://opensource.com/users/nivedv
|
||||||
|
[b]: https://github.com/lujun9972
|
||||||
|
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/bus-containers.png?itok=d_4QhZxT (Shipping containers stacked)
|
||||||
|
[2]: https://opensource.com/sites/default/files/unionfs.png (UnionFS)
|
||||||
|
[3]: https://miro.medium.com/max/4800/0*h61UE3S0jRPv3mA7 (Layered file system)
|
||||||
|
[4]: https://medium.com/techbeatly/container-part-ii-images-4f2139194775
|
@ -0,0 +1,99 @@
|
|||||||
|
[#]: subject: "Zulip: An Interesting Open-Source Alternative to Slack"
|
||||||
|
[#]: via: "https://itsfoss.com/zulip/"
|
||||||
|
[#]: author: "Ankush Das https://itsfoss.com/author/ankush/"
|
||||||
|
[#]: collector: "lujun9972"
|
||||||
|
[#]: translator: "geekpi"
|
||||||
|
[#]: reviewer: "wxy"
|
||||||
|
[#]: publisher: "wxy"
|
||||||
|
[#]: url: "https://linux.cn/article-13750-1.html"
|
||||||
|
|
||||||
|
Zulip:一个不错的开源的 Slack 替代品
|
||||||
|
======
|
||||||
|
|
||||||
|
> Zulip 是一个开源的协作平台,它把自己定位为一个更好的 Slack 替代品。让我们来了解一下。
|
||||||
|
|
||||||
|
![](https://img.linux.net.cn/data/attachment/album/202109/04/083746lbheeynx13jmn3xn.jpg)
|
||||||
|
|
||||||
|
当涉及到你的工作时,消息和协作平台有很大的不同。
|
||||||
|
|
||||||
|
虽然有几个选择,但 Slack 是许多组织使用的一个流行选择。但是,可以自托管的 Slack 的开源替代方案如何呢?
|
||||||
|
|
||||||
|
Zulip 就是这样一个软件。
|
||||||
|
|
||||||
|
### Zulip:开源的协作消息应用
|
||||||
|
|
||||||
|
![][1]
|
||||||
|
|
||||||
|
如果你想多了解,我必须提到还有更多的 [Slack 开源替代品][2]。
|
||||||
|
|
||||||
|
但在这里,我重点介绍 Zulip。
|
||||||
|
|
||||||
|
Zulip 是一个自由而开源的消息应用,有付费托管选项和自托管的能力。
|
||||||
|
|
||||||
|
它旨在提供与 Slack 类似的体验,同时努力帮助你利用话题提高对话的有效性。
|
||||||
|
|
||||||
|
与 Slack 中的频道相比,Zulip 聊天添加了话题(类似标签),以快速过滤与你有关的对话。
|
||||||
|
|
||||||
|
### Zulip 的特点
|
||||||
|
|
||||||
|
![][3]
|
||||||
|
|
||||||
|
你可以通过 Zulip 获得大部分的基本功能。这里列出主要的亮点,你可以发现:
|
||||||
|
|
||||||
|
* 支持 Markdown
|
||||||
|
* 频道的主题
|
||||||
|
* 支持拖放文件
|
||||||
|
* 代码块
|
||||||
|
* 集成 GitHub 来跟踪问题
|
||||||
|
* 支持电子邮件通知
|
||||||
|
* 自托管选项
|
||||||
|
* 信息编辑
|
||||||
|
* 集成 GIPHY
|
||||||
|
* 用 Zoom、Jitsi 或 BigBlueButton 进行视频通话
|
||||||
|
|
||||||
|
除了上述功能外,你可以预期得到你通常在 Slack 和其他方面得到的基本选项。
|
||||||
|
|
||||||
|
此外,如果你愿意,你还可以将它与 Matrix 和 IRC 整合。
|
||||||
|
|
||||||
|
![][4]
|
||||||
|
|
||||||
|
在我简短的测试使用中,其用户界面对于有效的沟通来说是足够好的。然而,我没能找到任何黑暗模式或改变主题的能力。
|
||||||
|
|
||||||
|
它看起来比 Slack 更简单直白,这样可以改善用户体验方面的问题。
|
||||||
|
|
||||||
|
### 在 Linux 中安装 Zulip
|
||||||
|
|
||||||
|
Zulip 在其官方网站上以 AppImage 文件的形式提供。如果你需要帮助,可以参考我们关于 [在 Linux 中使用 AppImage][5] 的指南。
|
||||||
|
|
||||||
|
它也有一个 Snap 包。所以,你可以在任何一个 Linux 发行版上使用它们中的任何一个。
|
||||||
|
|
||||||
|
你也可以使用 APT 通过终端为基于 Ubuntu/Debian 的发行版安装它。如果你想这样做,请看它的 [官方说明][6]。
|
||||||
|
|
||||||
|
Zulip 可用于 Windows、Mac 和 Linux。你也应该发现它可用于 Android 和 iOS 手机。
|
||||||
|
|
||||||
|
- [Zulip][7]
|
||||||
|
|
||||||
|
你可以在网络、桌面和智能手机上使用 Zulip,所以可以把它当做 Slack 的合适替代品。
|
||||||
|
|
||||||
|
你试过了吗?你用什么消息平台来进行工作协作?欢迎在评论中分享你的想法。
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
via: https://itsfoss.com/zulip/
|
||||||
|
|
||||||
|
作者:[Ankush Das][a]
|
||||||
|
选题:[lujun9972][b]
|
||||||
|
译者:[geekpi](https://github.com/geekpi)
|
||||||
|
校对:[wxy](https://github.com/wxy)
|
||||||
|
|
||||||
|
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||||
|
|
||||||
|
[a]: https://itsfoss.com/author/ankush/
|
||||||
|
[b]: https://github.com/lujun9972
|
||||||
|
[1]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/08/zulip-chat-new.png?resize=800%2C551&ssl=1
|
||||||
|
[2]: https://itsfoss.com/open-source-slack-alternative/
|
||||||
|
[3]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/08/zulip-chat-screenshot.png?resize=800%2C550&ssl=1
|
||||||
|
[4]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/08/zulip-settings.png?resize=800%2C546&ssl=1
|
||||||
|
[5]: https://itsfoss.com/use-appimage-linux/
|
||||||
|
[6]: https://zulip.com/help/desktop-app-install-guide
|
||||||
|
[7]: https://zulip.com/
|
@ -0,0 +1,244 @@
|
|||||||
|
[#]: subject: "20 essential Linux commands for every user"
|
||||||
|
[#]: via: "https://opensource.com/article/21/9/essential-linux-commands"
|
||||||
|
[#]: author: "Seth Kenlon https://opensource.com/users/seth"
|
||||||
|
[#]: collector: "lujun9972"
|
||||||
|
[#]: translator: "unigeorge"
|
||||||
|
[#]: reviewer: "wxy"
|
||||||
|
[#]: publisher: "wxy"
|
||||||
|
[#]: url: "https://linux.cn/article-13759-1.html"
|
||||||
|
|
||||||
|
用户必会的 20 个 Linux 基础命令
|
||||||
|
======
|
||||||
|
|
||||||
|
> 无论新手老手,这 20 个 Linux 命令都能让你的操作更轻松。
|
||||||
|
|
||||||
|
![](https://img.linux.net.cn/data/attachment/album/202109/07/082525n7amf7gejo16zaxx.jpg)
|
||||||
|
|
||||||
|
在黝黑的终端窗口中输入命令,这样的方式对某些人群来说可能好像过时了,但对许多专业计算机人员来说,这几乎是计算机完成能够执行的所有任务的最有效、最简便和最清晰的方式。如今,一些项目将开源命令引入了 macOS 和 Windows 等非开放平台,因此终端命令不仅仅是针对 Linux 和 BSD 用户,更是与每个人都息息相关。你可能会惊讶地发现,在一台普通的 [POSIX][2] 计算机上安装了数千个命令,当然,其中很多命令并不是真的有用,至少不是直接或经常性被使用。而其中的一部分命令虽然不是有效终端必须使用的命令,但相比其他命令而言使用频率较高,值得大家学习一下。
|
||||||
|
|
||||||
|
以下是终端用户最可能会使用的前 20 个命令:
|
||||||
|
|
||||||
|
### cd
|
||||||
|
|
||||||
|
在终端外,你可以单击图标从一个文件夹移动到另一个文件夹,但在终端中,你需要使用 `cd`。`cd` 命令代表<ruby>变更目录<rt>change directory</rt></ruby>,是用户在 Linux 系统中移动的方式。这是 Linux 中从一个地方到另一个地方最快、最直接的路线。
|
||||||
|
|
||||||
|
例如,在桌面上,当你想从你的主目录(你保存所有文件夹的地方)移动到一个名为 `presentations` 的文件夹时,你首先要打开你的 `Documents` 文件夹,然后打开一个名叫 `work` 的文件夹,然后是 `projects` 文件夹,然后是 `conference` 文件夹,最后是 `presentations` 文件夹,里面存放的是 LibreOffice Impress 幻灯片。这个过程包含了很多次的双击操作。同时屏幕上还需要许多鼠标移动动作,这取决于新窗口出现的位置,以及大脑需要跟踪的许多路径点。许多人通过将 _所有文件_ 都放在桌面上来避免这个看似微不足道的任务。
|
||||||
|
|
||||||
|
而终端用户只需键入以下内容即可避免此问题:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ cd ~/Documents/work/projects/conference/presentations
|
||||||
|
```
|
||||||
|
|
||||||
|
一些有经验的终端用户甚至都懒得输入所有这些,而是使用 `Tab` 键自动完成单词填充。更甚者,有时你都不必依赖自动完成,而是改用通配符:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ cd ~/Doc*/work/*/conf*/p*
|
||||||
|
```
|
||||||
|
|
||||||
|
### pwd
|
||||||
|
|
||||||
|
用 Buckaroo Banzai 的话来说:“无论你走到哪里,你就在那里。”
|
||||||
|
|
||||||
|
当你想弄清楚确切位置时,就可以使用 `pwd` 命令。`pwd` 代表<ruby>打印工作目录<rt>print working directory</rt></ruby>,这正是它的作用。`--physical`(在某些情况时缩写为 `-P`)显示解析所有符号链接后的确切位置。
|
||||||
|
|
||||||
|
```
|
||||||
|
$ pwd
|
||||||
|
/home/tux/presentation
|
||||||
|
|
||||||
|
$ pwd --physical
|
||||||
|
/home/tux/Documents/work/projects/conference/presentations
|
||||||
|
```
|
||||||
|
|
||||||
|
### sed
|
||||||
|
|
||||||
|
流编辑器 `sed` 更广为人知的是一个强大的批量 _查找和替换_ 命令,但它同时也是一个正当合理的文本编辑器。你可以通过阅读我的 [介绍性文章][3] 来学习使用它,然后通过我的 [高级教程和备忘录][4] 成为老手。
|
||||||
|
|
||||||
|
### grep
|
||||||
|
|
||||||
|
`grep` 命令使用很普遍,以至于经常被用作动词(例如 “我会对一些文件进行 grep”)和动名词(例如 “grep 一些输出”)。无论是查看日志文件还是解析其他命令的输出,它都是在 shell 中解析文本时的关键组件。这是忙碌的用户专注于特定信息的一种方式。考虑一下计算世界中的数据量,`grep` 命令的流行就见怪不怪了。你可以通过阅读我的 [介绍性文章][5] 了解 `grep`,然后下载 [备忘录][6] 学习。
|
||||||
|
|
||||||
|
### file
|
||||||
|
|
||||||
|
当你需要知道文件包含什么类型的数据时,请使用 `file` 命令:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ file example.foo
|
||||||
|
example.foo: RIFF (little-endian) data, Web/P image [...]
|
||||||
|
|
||||||
|
$ file example.bar
|
||||||
|
example.bar: ELF 64-bit LSB executable, x86-64 [...]
|
||||||
|
```
|
||||||
|
|
||||||
|
当然,`file` 命令并不神奇。它只不过是根据文件如何标识自身而进行输出的,并且文件可能是错误的、损坏的或伪装的。使用 [hexdump][7] 进行严格检查的方式确定性更强,但对于日常使用而言,`file` 命令非常方便。
|
||||||
|
|
||||||
|
### awk
|
||||||
|
|
||||||
|
`awk` 不仅仅是一个命令,它还是一种字面意义上的 [编程语言][8]。[点此下载我们的免费 Awk 电子书][9] 进行学习,你可能会写出远超你想象的脚本。
|
||||||
|
|
||||||
|
### curl
|
||||||
|
|
||||||
|
`curl` 命令是用于终端的 [非交互式 Web 浏览器][10]。它是面向 Web 和 API 开发人员的 [开发工具][11]。它是一个复杂灵活的命令,但如果你想从你的终端顺利地与 Web 服务交互,该命令是很值得学习的。
|
||||||
|
|
||||||
|
下载我们免费的 [curl 备忘录][12],你可以从中学会 `curl` 的许多选项。
|
||||||
|
|
||||||
|
### ps
|
||||||
|
|
||||||
|
管理系统资源主要由内核负责,当你更喜欢或更需要手动管理时,可以使用 `ps` 命令。读者可以在我的 [使用 procps-ng 监控 Linux 系统][13] 文章中了解 `ps`。
|
||||||
|
|
||||||
|
### cat
|
||||||
|
|
||||||
|
[cat 命令][14] 是<ruby>连接<rt>concatenate</rt></ruby>的缩写,它曾因为能将若干小文件合并而显得非常有用,这些小文件可能是由于大小限制而(使用 `split` 命令)拆分的。如今,`cat` 主要是用来将文本文件的内容转储到终端中以供快速阅读,除非你为此专门去使用 `head`、`tail`、`more` 或 `less` 等命令。
|
||||||
|
|
||||||
|
尽管它的原始用途几乎已被弃用,并且其他几个命令也主要提供了其次要功能,但 `cat` 仍然是一个有用的工具。例如,它可以是复制(`cp`)命令的替代品:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ cat myfile.ogg > /backups/myfile.ogg
|
||||||
|
```
|
||||||
|
|
||||||
|
它可以显示文件中不便观察的隐形字符。例如,使用 `--show-tabs` 选项,分割 [YAML][15] 的 `Tab` 字符就会显示为 `^I`:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ cat --show-tabs my.yaml
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
- hosts: all
|
||||||
|
tasks:
|
||||||
|
- name: Make sure the current version of 'sysstat' is installed.
|
||||||
|
dnf:
|
||||||
|
name:
|
||||||
|
^I- sysstat
|
||||||
|
^I- httpd
|
||||||
|
^I- mariadb-server
|
||||||
|
state: latest
|
||||||
|
```
|
||||||
|
|
||||||
|
它还可以用 `--show-nonprinting` 显示非打印字符,用 `--show-ends` 标记行尾,用 `--number` 提供行号,等等。
|
||||||
|
|
||||||
|
### find
|
||||||
|
|
||||||
|
`find` 命令可以用来查找文件,但它还有许多选项,这些选项可以帮助你通过各种过滤器和参数查找文件。读者可以从我的 [介绍性文章][16] 中学习该命令的基础知识。
|
||||||
|
|
||||||
|
如果你一直想知道为什么最基本的、不起眼的 [ls 命令][17],不在本文列表中,那是因为 `find` 的灵活性。它不仅可以列表文件:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ find .
|
||||||
|
./bar.txt
|
||||||
|
./baz.xml
|
||||||
|
./foo.txt
|
||||||
|
[...]
|
||||||
|
```
|
||||||
|
|
||||||
|
它还可以提供包含详细信息的长列表功能:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ find . -ls
|
||||||
|
3014803 464 -rw-rw-r-- 1 tux users 473385 Jul 26 07:25 ./foo.txt
|
||||||
|
3014837 900 -rwxrwxr-x 1 tux users 918217 Nov 6 2019 ./baz.xml
|
||||||
|
3026891 452 -rw-rw-r-- 1 tux users 461354 Aug 10 13:41 ./foo.txt
|
||||||
|
[...]
|
||||||
|
```
|
||||||
|
|
||||||
|
这是一个技术问题,但也是很一个巧妙的技巧。
|
||||||
|
|
||||||
|
### tar
|
||||||
|
|
||||||
|
人们有时会引用 BSD 的 `tar` 语法来拿 Linux 命令开玩笑。尽管有这样的名声,但 `tar` 命令实际上非常直观。读者可以阅读我的 [如何解压缩 tar.gz 文件][18] 文章,了解在需要时使用 `tar` 命令的简单知识。
|
||||||
|
|
||||||
|
### more、less 和 most
|
||||||
|
|
||||||
|
这些统称为分页命令。分页命令与 `cat` 类似,但前者会在屏幕底部暂停输出,直到你向下滚动查看更多内容。这些命令比较简单,但每个之间都有细微差别。用户是用箭头键还是空格键滚动?是必须手动退出,还是在显示的文件末尾自动退出?用户的首选搜索行为是什么样的?选择你最喜欢的分页命令并将其设置在 `.bashrc` 中吧!
|
||||||
|
|
||||||
|
### ssh 和 scp
|
||||||
|
|
||||||
|
OpenSSH 不仅有助于保护与远程系统的连接安全,还可以用于启用其他命令。例如,对于许多用户来说,有了 `.ssh` 目录,他们才能与 Git 存储库顺利交互、将更新发布到网站、登录云控制平台。
|
||||||
|
|
||||||
|
### mv
|
||||||
|
|
||||||
|
`mv` 命令有双重作用:它既可以 [移动文件][19] 又可以 [重命名文件][20]。它有几个可用的保护措施,例如 `--interactive` 和 `--no-clobber` 选项避免破坏现有文件,`--backup` 命令确保数据在新位置验证之前被保留,以及 `--update` 选项确保旧版本不会替换新版本文件。
|
||||||
|
|
||||||
|
### sudo
|
||||||
|
|
||||||
|
当某个用户账户的用户名已知,且具有 _全部_ 系统权限时,该用户很快就会成为黑客攻击的目标。`sudo` 命令消除了对字面上 `root` 用户的需求,从而优雅地移除了有关系统的重要信息。不过这还不是全部,使用 `sudo` 你还可以轻松地管理单个命令、用户和组的权限。你可以在选定的命令上启用无密码执行、记录用户会话、使用摘要验证来验证命令,[等等][21]。
|
||||||
|
|
||||||
|
### alias
|
||||||
|
|
||||||
|
使用 `alias` 命令将长命令变成易于记忆的快捷方式:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ alias ls='ls --classify --almost-all --ignore-backups --color'
|
||||||
|
```
|
||||||
|
|
||||||
|
### clear
|
||||||
|
|
||||||
|
有时终端会显得很混乱,输入 `clear`(或在某些 shell 中按 `Ctrl+L`)后,你就能得到漂亮、刷新的屏幕了。
|
||||||
|
|
||||||
|
### setfacl
|
||||||
|
|
||||||
|
传统上,POSIX 文件权限由 `chown` 和 `chmod` 决定。然而,如今系统变得更加复杂,因此有一个灵活性更高的命令。`setfacl` 命令允许创建一个 [访问控制列表(ACL)][22],可以配置任意用户所需权限,并可以为文件夹及其中创建的内容设置默认权限。
|
||||||
|
|
||||||
|
### netcat
|
||||||
|
|
||||||
|
可能需要使用 `netcat`(`nc`)的人不多,但这些使用它的人确离不开它。`nc` 命令是一个通用的网络连接工具。
|
||||||
|
|
||||||
|
它可以连接到一个端口,类似于 `telnet` 命令:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ nc -u 192.168.0.12 80
|
||||||
|
```
|
||||||
|
|
||||||
|
它可以 ping 一个端口,类似于 `ping` 命令:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ nc -zvn 192.168.0.12 25
|
||||||
|
```
|
||||||
|
|
||||||
|
它可以探测开放端口,类似于 `nmap` 命令:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ nc -zv 192.168.0.12 25-80
|
||||||
|
```
|
||||||
|
|
||||||
|
以上仅是该命令的一小部分用途。
|
||||||
|
|
||||||
|
### 你自己构建的命令
|
||||||
|
|
||||||
|
在某种程度上,Linux 终端是一个创造性解决问题的平台。当你学习命令时,你也在学习可用于创建自己的命令的组块。我的 [shell 历史][23] 中的许多命令都是自己编写的 shell 脚本,从而实现了根据自己想要的工作方式定制工作流程。你为自己的效率和舒适度而设计的命令也可以作为 shell 中的基本命令。花些时间了解一些很棒的命令,然后试着构建自己的命令吧。当你构建出的命令非常好用时,把它开源,这样就可以与他人分享你的想法啦!
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
via: https://opensource.com/article/21/9/essential-linux-commands
|
||||||
|
|
||||||
|
作者:[Seth Kenlon][a]
|
||||||
|
选题:[lujun9972][b]
|
||||||
|
译者:[unigeorge](https://github.com/unigeorge)
|
||||||
|
校对:[wxy](https://github.com/wxy)
|
||||||
|
|
||||||
|
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||||
|
|
||||||
|
[a]: https://opensource.com/users/seth
|
||||||
|
[b]: https://github.com/lujun9972
|
||||||
|
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/command_line_prompt.png?itok=wbGiJ_yg (Command line prompt)
|
||||||
|
[2]: https://opensource.com/article/19/7/what-posix-richard-stallman-explains
|
||||||
|
[3]: https://opensource.com/article/20/12/sed
|
||||||
|
[4]: https://opensource.com/article/21/3/sed-cheat-sheet
|
||||||
|
[5]: https://opensource.com/article/21/3/grep-cheat-sheet
|
||||||
|
[6]: https://opensource.com/downloads/grep-cheat-sheet
|
||||||
|
[7]: https://opensource.com/article/19/8/dig-binary-files-hexdump
|
||||||
|
[8]: https://opensource.com/article/21/1/learn-awk
|
||||||
|
[9]: https://opensource.com/article/20/9/awk-ebook
|
||||||
|
[10]: https://opensource.com/article/20/5/curl-cheat-sheet
|
||||||
|
[11]: https://www.redhat.com/sysadmin/use-curl-api
|
||||||
|
[12]: https://opensource.com/downloads/curl-command-cheat-sheet
|
||||||
|
[13]: https://opensource.com/article/21/8/linux-procps-ng
|
||||||
|
[14]: https://opensource.com/article/19/2/getting-started-cat-command
|
||||||
|
[15]: https://www.redhat.com/sysadmin/yaml-beginners
|
||||||
|
[16]: https://opensource.com/article/21/8/find-files-and-directories-find
|
||||||
|
[17]: https://opensource.com/article/19/7/master-ls-command
|
||||||
|
[18]: https://opensource.com/article/17/7/how-unzip-targz-file
|
||||||
|
[19]: https://opensource.com/article/21/8/move-files-linux
|
||||||
|
[20]: https://opensource.com/article/21/8/rename-file-linux-terminal
|
||||||
|
[21]: https://opensource.com/article/19/10/know-about-sudo
|
||||||
|
[22]: https://opensource.com/article/20/3/external-drives-linux
|
||||||
|
[23]: https://opensource.com/article/18/6/history-command
|
92
published/202109/20210901 What are container runtimes.md
Normal file
92
published/202109/20210901 What are container runtimes.md
Normal file
@ -0,0 +1,92 @@
|
|||||||
|
[#]: subject: "What are container runtimes?"
|
||||||
|
[#]: via: "https://opensource.com/article/21/9/container-runtimes"
|
||||||
|
[#]: author: "Nived V https://opensource.com/users/nivedv"
|
||||||
|
[#]: collector: "lujun9972"
|
||||||
|
[#]: translator: "geekpi"
|
||||||
|
[#]: reviewer: "turbokernel"
|
||||||
|
[#]: publisher: "wxy"
|
||||||
|
[#]: url: "https://linux.cn/article-13772-1.html"
|
||||||
|
|
||||||
|
什么是容器运行时?
|
||||||
|
======
|
||||||
|
|
||||||
|
> 通过深入了解容器运行时,理解容器环境是如何建立的。
|
||||||
|
|
||||||
|
![](https://img.linux.net.cn/data/attachment/album/202109/11/110104vzgjs0v9c9o04s78.jpg)
|
||||||
|
|
||||||
|
在学习 [容器镜像][2] 时,我们讨论了容器的基本原理,但现在是深入研究容器<ruby>运行时<rt>runtime</rt></ruby>的时候了,从而了解容器环境是如何构建的。本文的部分信息摘自 <ruby>开放容器计划<rt>Open Container Initiative</rt></ruby>(OCI)的 [官方文档][3],所以无论使用何种容器引擎,这些信息都是一致的。
|
||||||
|
|
||||||
|
### 容器运行机制
|
||||||
|
|
||||||
|
那么,当你运行 `podman run` 或 `docker run` 命令时,在后台到底发生了什么?一个分步的概述如下:
|
||||||
|
|
||||||
|
1. 如果本地没有镜像,则从镜像<ruby>登记仓库<rt>registry</rt></ruby>拉取镜像
|
||||||
|
2. 镜像被提取到一个写时复制(COW)的文件系统上,所有的容器层相互堆叠以形成一个合并的文件系统
|
||||||
|
3. 为容器准备一个挂载点
|
||||||
|
4. 从容器镜像中设置元数据,包括诸如覆盖 `CMD`、来自用户输入的 `ENTRYPOINT`、设置 SECCOMP 规则等设置,以确保容器按预期运行
|
||||||
|
5. 提醒内核为该容器分配某种隔离,如进程、网络和文件系统(<ruby>命名空间<rt>namespace</rt></ruby>)
|
||||||
|
6. 提醒内核为改容器分配一些资源限制,如 CPU 或内存限制(<ruby>控制组<rt>cgroup</rt></ruby>)
|
||||||
|
7. 传递一个<ruby>系统调用<rt>syscall</rt></ruby>给内核用于启动容器
|
||||||
|
8. 设置 SELinux/AppArmor
|
||||||
|
|
||||||
|
容器运行时负责上述所有的工作。当我们提及容器运行时,想到的可能是 runc、lxc、containerd、rkt、cri-o 等等。嗯,你没有错。这些都是容器引擎和容器运行时,每一种都是为不同的情况建立的。
|
||||||
|
|
||||||
|
<ruby>容器运行时<rt>Container runtime</rt></ruby>更侧重于运行容器,为容器设置命名空间和控制组(cgroup),也被称为底层容器运行时。高层的容器运行时或容器引擎专注于格式、解包、管理和镜像共享。它们还为开发者提供 API。
|
||||||
|
|
||||||
|
### 开放容器计划(OCI)
|
||||||
|
|
||||||
|
<ruby>开放容器计划<rt>Open Container Initiative</rt></ruby>(OCI)是一个 Linux 基金会的项目。其目的是设计某些开放标准或围绕如何与容器运行时和容器镜像格式工作的结构。它是由 Docker、rkt、CoreOS 和其他行业领导者于 2015 年 6 月建立的。
|
||||||
|
|
||||||
|
它通过两个规范来完成如下任务:
|
||||||
|
|
||||||
|
#### 1、镜像规范
|
||||||
|
|
||||||
|
该规范的目标是创建可互操作的工具,用于构建、传输和准备运行的容器镜像。
|
||||||
|
|
||||||
|
该规范的高层组件包括:
|
||||||
|
|
||||||
|
* [镜像清单][4] — 一个描述构成容器镜像的元素的文件
|
||||||
|
* [镜像索引][5] — 镜像清单的注释索引
|
||||||
|
* [镜像布局][6] — 一个镜像内容的文件系统布局
|
||||||
|
* [文件系统布局][7] — 一个描述容器文件系统的变更集
|
||||||
|
* [镜像配置][8] — 确定镜像层顺序和配置的文件,以便转换成 [运行时捆包][9]
|
||||||
|
* [转换][10] — 解释应该如何进行转换的文件
|
||||||
|
* [描述符][11] — 一个描述被引用内容的类型、元数据和内容地址的参考资料
|
||||||
|
|
||||||
|
#### 2、运行时规范
|
||||||
|
|
||||||
|
该规范用于定义容器的配置、执行环境和生命周期。`config.json` 文件为所有支持的平台提供了容器配置,并详细定义了用于创建容器的字段。在详细定义执行环境时也描述了为容器的生命周期定义的通用操作,以确保在容器内运行的应用在不同的运行时环境之间有一个一致的环境。
|
||||||
|
|
||||||
|
Linux 容器规范使用了各种内核特性,包括<ruby>命名空间<rt>namespace</rt></ruby>、<ruby>控制组<rt>cgroup</rt></ruby>、<ruby>权能<rt>capability</rt></ruby>、LSM 和文件系统<ruby>隔离<rt>jail</rt></ruby>等来实现该规范。
|
||||||
|
|
||||||
|
### 小结
|
||||||
|
|
||||||
|
容器运行时是通过 OCI 规范管理的,以提供一致性和互操作性。许多人在使用容器时不需要了解它们是如何工作的,但当你需要排除故障或优化时,了解容器是一个宝贵的优势。
|
||||||
|
|
||||||
|
本文基于 [techbeatly][12] 的文章,并经授权改编。
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
via: https://opensource.com/article/21/9/container-runtimes
|
||||||
|
|
||||||
|
作者:[Nived V][a]
|
||||||
|
选题:[lujun9972][b]
|
||||||
|
译者:[geekpi](https://github.com/geekpi)
|
||||||
|
校对:[turbokernel](https://github.com/turbokernel)
|
||||||
|
|
||||||
|
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||||
|
|
||||||
|
[a]: https://opensource.com/users/nivedv
|
||||||
|
[b]: https://github.com/lujun9972
|
||||||
|
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/kubernetes_containers_ship_lead.png?itok=9EUnSwci (Ships at sea on the web)
|
||||||
|
[2]: https://opensource.com/article/21/8/container-fundamentals-2
|
||||||
|
[3]: https://github.com/opencontainers
|
||||||
|
[4]: https://github.com/opencontainers/image-spec/blob/master/manifest.md
|
||||||
|
[5]: https://github.com/opencontainers/image-spec/blob/master/image-index.md
|
||||||
|
[6]: https://github.com/opencontainers/image-spec/blob/master/image-layout.md
|
||||||
|
[7]: https://github.com/opencontainers/image-spec/blob/master/layer.md
|
||||||
|
[8]: https://github.com/opencontainers/image-spec/blob/master/config.md
|
||||||
|
[9]: https://github.com/opencontainers/runtime-spec
|
||||||
|
[10]: https://github.com/opencontainers/image-spec/blob/master/conversion.md
|
||||||
|
[11]: https://github.com/opencontainers/image-spec/blob/master/descriptor.md
|
||||||
|
[12]: https://medium.com/techbeatly/container-runtimes-deep-dive-77eb0e511939
|
@ -0,0 +1,192 @@
|
|||||||
|
[#]: subject: "4 Linux technologies fundamental to containers"
|
||||||
|
[#]: via: "https://opensource.com/article/21/8/container-linux-technology"
|
||||||
|
[#]: author: "Nived V https://opensource.com/users/nivedv"
|
||||||
|
[#]: collector: "lujun9972"
|
||||||
|
[#]: translator: "wxy"
|
||||||
|
[#]: reviewer: "turbokernel"
|
||||||
|
[#]: publisher: "wxy"
|
||||||
|
[#]: url: "https://linux.cn/article-13792-1.html"
|
||||||
|
|
||||||
|
容器的四大基础技术
|
||||||
|
======
|
||||||
|
|
||||||
|
> 命名空间、控制组、seccomp 和 SELinux 构成了在系统上构建和运行一个容器进程的 Linux 技术基础。
|
||||||
|
|
||||||
|
![](https://img.linux.net.cn/data/attachment/album/202109/17/085439ye0iq5ynzyhpusy5.jpg)
|
||||||
|
|
||||||
|
在以前的文章中,我介绍过 [容器镜像][2] 及其 [运行时][3]。在本文中,我研究了容器是如何在一些特殊的 Linux 技术基础上实现的,这其中包括命名空间和控制组。
|
||||||
|
|
||||||
|
![容器技术的层次][4]
|
||||||
|
|
||||||
|
*图1:对容器有贡献的 Linux 技术(Nived Velayudhan, [CC BY-SA 4.0][5])*
|
||||||
|
|
||||||
|
这些 Linux 技术构成了在系统上构建和运行容器进程的基础:
|
||||||
|
|
||||||
|
1. 命名空间
|
||||||
|
2. 控制组(cgroups)
|
||||||
|
3. Seccomp
|
||||||
|
4. SELinux
|
||||||
|
|
||||||
|
### 命名空间
|
||||||
|
|
||||||
|
<ruby>命名空间<rt>namespace</rt></ruby> 为容器提供了一个隔离层,给容器提供了一个看起来是独占的 Linux 文件系统的视图。这就限制了进程能访问的内容,从而限制了它所能获得的资源。
|
||||||
|
|
||||||
|
在创建容器时,Docker 或 Podman 和其他容器技术使用了 Linux 内核中的几个命名空间:
|
||||||
|
|
||||||
|
```
|
||||||
|
[nivedv@homelab ~]$ docker container run alpine ping 8.8.8.8
|
||||||
|
[nivedv@homelab ~]$ sudo lsns -p 29413
|
||||||
|
|
||||||
|
NS TYPE NPROCS PID USER COMMAND
|
||||||
|
4026531835 cgroup 299 1 root /usr/lib/systemd/systemd --switched...
|
||||||
|
4026531837 user 278 1 root /usr/lib/systemd/systemd --switched...
|
||||||
|
4026533105 mnt 1 29413 root ping 8.8.8.8
|
||||||
|
4026533106 uts 1 29413 root ping 8.8.8.8
|
||||||
|
4026533107 ipc 1 29413 root ping 8.8.8.8
|
||||||
|
4026533108 pid 1 29413 root ping 8.8.8.8
|
||||||
|
4026533110 net 1 29413 root ping 8.8.8.8
|
||||||
|
```
|
||||||
|
#### 用户
|
||||||
|
|
||||||
|
用户(`user`)命名空间将用户和组隔离在一个容器内。这是通过分配给容器与宿主系统有不同的 UID 和 GID 范围来实现的。用户命名空间使软件能够以 root 用户的身份在容器内运行。如果入侵者攻击容器,然后逃逸到宿主机上,他们就只能以受限的非 root 身份运行了。
|
||||||
|
|
||||||
|
#### 挂载
|
||||||
|
|
||||||
|
挂载(`mnt`)命名空间允许容器有自己的文件系统层次结构视图。你可以在 Linux 系统中的 `/proc/<PID>/mounts` 位置找到每个容器进程的挂载点。
|
||||||
|
|
||||||
|
#### UTS
|
||||||
|
|
||||||
|
<ruby>Unix 分时系统<rt>Unix Timeharing System</rt></ruby>(UTS)命名空间允许容器拥有一个唯一主机名和域名。当你运行一个容器时,即使使用 `- name` 标签,也会使用一个随机的 ID 作为主机名。你可以使用 [unshare 命令][6] 来了解一下这个工作原理。
|
||||||
|
|
||||||
|
```
|
||||||
|
nivedv@homelab ~]$ docker container run -it --name nived alpine sh
|
||||||
|
/ # hostname
|
||||||
|
9c9a5edabdd6
|
||||||
|
/ #
|
||||||
|
nivedv@homelab ~]$ sudo unshare -u sh
|
||||||
|
sh-5.0# hostname isolated.hostname
|
||||||
|
sh-5.0# hostname
|
||||||
|
isolated.hostname
|
||||||
|
sh-5.0#
|
||||||
|
sh-5.0# exit
|
||||||
|
exit
|
||||||
|
[nivedv@homelab ~]$ hostname
|
||||||
|
homelab.redhat.com
|
||||||
|
```
|
||||||
|
|
||||||
|
#### IPC
|
||||||
|
|
||||||
|
<ruby>进程间通信<rt>Inter-Process Communication</rt></ruby>(IPC)命名空间允许不同的容器进程之间,通过访问共享内存或使用共享消息队列来进行通信。
|
||||||
|
|
||||||
|
```
|
||||||
|
[root@demo /]# ipcmk -M 10M
|
||||||
|
Shared memory id: 0
|
||||||
|
[root@demo /]# ipcmk -M 20M
|
||||||
|
Shared memory id: 1
|
||||||
|
[root@demo /]#
|
||||||
|
[root@demo /]# ipcs
|
||||||
|
------ Message Queues --------
|
||||||
|
key msqid owner perms used-bytes messages
|
||||||
|
------ Shared Memory Segments --------
|
||||||
|
key shmid owner perms bytes nattch status
|
||||||
|
0xd1df416a 0 root 644 10485760 0
|
||||||
|
0xbd487a9d 1 root 644 20971520 0
|
||||||
|
------ Semaphore Arrays --------
|
||||||
|
key semid owner perms nsems
|
||||||
|
```
|
||||||
|
|
||||||
|
#### PID
|
||||||
|
|
||||||
|
<ruby>进程 ID<rt>Process ID</rt></ruby>(PID)命名空间确保运行在容器内的进程与外部隔离。当你在容器内运行 `ps` 命令时,由于这个命名空间隔离的存在,你只能看到在容器内运行的进程,而不是在宿主机上。
|
||||||
|
|
||||||
|
#### 网络
|
||||||
|
|
||||||
|
网络(`net`)命名空间允许容器有自己网络接口、IP 地址、路由表、端口号等视图。容器如何能够与外部通信?你创建的所有容器都会被附加到一个特殊的虚拟网络接口上进行通信。
|
||||||
|
|
||||||
|
```
|
||||||
|
[nivedv@homelab ~]$ docker container run --rm -it alpine sh
|
||||||
|
/ # ping 8.8.8.8
|
||||||
|
PING 8.8.8.8 (8.8.8.8): 56 data bytes
|
||||||
|
64 bytes from 8.8.8.8: seq=0 ttl=119 time=21.643 ms
|
||||||
|
64 bytes from 8.8.8.8: seq=1 ttl=119 time=20.940 ms
|
||||||
|
^C
|
||||||
|
[root@homelab ~]# ip link show veth84ea6fc
|
||||||
|
veth84ea6fc@if22: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue
|
||||||
|
master docker0 state UP mode DEFAULT group default
|
||||||
|
```
|
||||||
|
|
||||||
|
### 控制组
|
||||||
|
|
||||||
|
控制组(`cgroup`)是组成一个容器的基本模块。控制组会分配和限制容器所使用的资源,如 CPU、内存、网络 I/O 等。容器引擎会自动创建每种类型的控制组文件系统,并在容器运行时为每个容器设置配额。
|
||||||
|
|
||||||
|
```
|
||||||
|
[root@homelab ~]# lscgroup | grep docker
|
||||||
|
cpuset:/docker
|
||||||
|
net_cls,net_prio:/docker
|
||||||
|
cpu,cpuacct:/docker
|
||||||
|
hugetlb:/docker
|
||||||
|
devices:/docker
|
||||||
|
freezer:/docker
|
||||||
|
memory:/docker
|
||||||
|
perf_event:/docker
|
||||||
|
blkio:/docker
|
||||||
|
pids:/docker
|
||||||
|
```
|
||||||
|
|
||||||
|
容器运行时为每个容器设置了控制组值,所有信息都存储在 `/sys/fs/cgroup/*/docker`。下面的命令将确保容器可以使用 50000 微秒的 CPU 时间片,并将内存的软、硬限制分别设置为 500M 和 1G。
|
||||||
|
|
||||||
|
```
|
||||||
|
[root@homelab ~]# docker container run -d --name test-cgroups --cpus 0.5 --memory 1G --memory-reservation 500M httpd
|
||||||
|
[root@homelab ~]# lscgroup cpu,cpuacct:/docker memory:/docker
|
||||||
|
cpu,cpuacct:/docker/
|
||||||
|
cpu,cpuacct:/docker/c3503ac704dafea3522d3bb82c77faff840018e857a2a7f669065f05c8b2cc84
|
||||||
|
memory:/docker/
|
||||||
|
memory:/docker/c3503ac704dafea3522d3bb82c77faff840018e857a2a7f669065f05c8b2cc84
|
||||||
|
[root@homelab c....c84]# cat cpu.cfs_period_us
|
||||||
|
100000
|
||||||
|
[root@homelab c....c84]# cat cpu.cfs_quota_us
|
||||||
|
50000
|
||||||
|
[root@homelab c....c84]# cat memory.soft_limit_in_bytes
|
||||||
|
524288000
|
||||||
|
[root@homelab c....c84]# cat memory.limit_in_bytes
|
||||||
|
1073741824
|
||||||
|
```
|
||||||
|
|
||||||
|
### SECCOMP
|
||||||
|
|
||||||
|
Seccomp 意思是“<ruby>安全计算<rt>secure computing</rt></ruby>”。它是一项 Linux 功能,用于限制应用程序进行的系统调用的集合。例如,Docker 的默认 seccomp 配置文件禁用了大约 44 个系统调用(总计超过 300 个)。
|
||||||
|
|
||||||
|
这里的思路是让容器只访问所必须的资源。例如,如果你不需要容器改变主机上的时钟时间,你可能不会使用 `clock_adjtime` 和 `clock_settime` 系统调用,屏蔽它们是合理的。同样地,你不希望容器改变内核模块,所以没有必要让它们使用 `create_module`、 `delete_module` 系统调用。
|
||||||
|
|
||||||
|
### SELinux
|
||||||
|
|
||||||
|
SELinux 是“<ruby>安全增强的 Linux<rt>security-enhanced Linux</rt></ruby>”的缩写。如果你在你的宿主机上运行的是 Red Hat 发行版,那么 SELinux 是默认启用的。SELinux 可以让你限制一个应用程序只能访问它自己的文件,并阻止任何其他进程访问。因此,如果一个应用程序被破坏了,它将限制该应用程序可以影响或控制的文件数量。通过为文件和进程设置上下文环境以及定义策略来实现,这些策略将限制一个进程可以访问和更改的内容。
|
||||||
|
|
||||||
|
容器的 SELinux 策略是由 `container-selinux` 包定义的。默认情况下,容器以 `container_t` 标签运行,允许在 `/usr` 目录下读取(`r`)和执行(`x`),并从 `/etc` 目录下读取大部分内容。标签`container_var_lib_t` 是与容器有关的文件的通用标签。
|
||||||
|
|
||||||
|
### 总结
|
||||||
|
|
||||||
|
容器是当今 IT 基础设施的一个重要组成部分,也是一项相当有趣的技术。即使你的工作不直接涉及容器化,了解一些基本的容器概念和方法,也能让你体会到它们如何帮助你的组织。容器是建立在开源的 Linux 技术之上的,这使它们变得更加美好。
|
||||||
|
|
||||||
|
本文基于 [techbeatly][7] 的文章,并经授权改编。
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
via: https://opensource.com/article/21/8/container-linux-technology
|
||||||
|
|
||||||
|
作者:[Nived V][a]
|
||||||
|
选题:[lujun9972][b]
|
||||||
|
译者:[wxy](https://github.com/wxy)
|
||||||
|
校对:[turbokernel](https://github.com/turbokernel)
|
||||||
|
|
||||||
|
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||||
|
|
||||||
|
[a]: https://opensource.com/users/nivedv
|
||||||
|
[b]: https://github.com/lujun9972
|
||||||
|
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/car-penguin-drive-linux-yellow.png?itok=twWGlYAc (Penguin driving a car with a yellow background)
|
||||||
|
[2]: https://linux.cn/article-13766-1.html
|
||||||
|
[3]: https://linux.cn/article-13772-1.html
|
||||||
|
[4]: https://opensource.com/sites/default/files/1linuxtechs.png (layers of linux technologies)
|
||||||
|
[5]: https://creativecommons.org/licenses/by-sa/4.0/
|
||||||
|
[6]: https://opensource.com/article/19/10/namespaces-and-containers-linux
|
||||||
|
[7]: https://nivedv.medium.com/container-internals-deep-dive-5cc424957413
|
@ -0,0 +1,118 @@
|
|||||||
|
[#]: subject: "How to Install Dropbox on Ubuntu Linux"
|
||||||
|
[#]: via: "https://itsfoss.com/install-dropbox-ubuntu/"
|
||||||
|
[#]: author: "Abhishek Prakash https://itsfoss.com/author/abhishek/"
|
||||||
|
[#]: collector: "lujun9972"
|
||||||
|
[#]: translator: "geekpi"
|
||||||
|
[#]: reviewer: "wxy"
|
||||||
|
[#]: publisher: "wxy"
|
||||||
|
[#]: url: "https://linux.cn/article-13773-1.html"
|
||||||
|
|
||||||
|
如何在 Ubuntu Linux 上安装 Dropbox
|
||||||
|
======
|
||||||
|
|
||||||
|
![](https://img.linux.net.cn/data/attachment/album/202109/11/112839qa96g29ws99z9479.jpg)
|
||||||
|
|
||||||
|
Dropbox 是 [最受欢迎的云存储服务之一,可用于 Linux][1] 和其他操作系统。
|
||||||
|
|
||||||
|
事实上,Dropbox 是最早提供原生 Linux 应用的服务之一。它仍然 [支持 32 位 Linux 系统][2],这也是一项值得称赞的工作。
|
||||||
|
|
||||||
|
在这个初学者的教程中,我将展示在 Ubuntu 上安装 Dropbox 的步骤。这些步骤其实很简单,但有些网站把它弄得不必要的复杂。
|
||||||
|
|
||||||
|
### 在 Ubuntu 桌面上安装 Dropbox
|
||||||
|
|
||||||
|
让我们来看看安装步骤,一步一步来。
|
||||||
|
|
||||||
|
#### 第一步:获取 Ubuntu 的 Dropbox 安装程序
|
||||||
|
|
||||||
|
Dropbox 为其安装程序提供 DEB 文件。进入网站的下载页面:
|
||||||
|
|
||||||
|
- [下载 Dropbox][3]
|
||||||
|
|
||||||
|
下载相应的 DEB 文件。考虑到你使用的是 64 位的 Ubuntu,请获取 64 位版本的 DEB 文件。
|
||||||
|
|
||||||
|
![Download the Dropbox installer][4]
|
||||||
|
|
||||||
|
#### 第二步:安装 Dropbox 安装程序
|
||||||
|
|
||||||
|
你下载的 deb 文件只是 Dropbox 的一个安装程序。实际的 Dropbox 安装稍后开始,类似于 [在 Ubuntu 上安装 Steam][5]。
|
||||||
|
|
||||||
|
要 [安装下载的 deb 文件][6],可以双击它,或者右击并选择用软件安装打开。
|
||||||
|
|
||||||
|
![Installing the downloaded Dropbox deb file][7]
|
||||||
|
|
||||||
|
它将打开软件中心,你可以点击安装按钮。
|
||||||
|
|
||||||
|
![Installing Dropbox deb file][8]
|
||||||
|
|
||||||
|
等待安装完成。
|
||||||
|
|
||||||
|
#### 第三步:开始安装 Dropbox
|
||||||
|
|
||||||
|
现在 Dropbox 安装程序已经安装完毕。按 `Windows` 键(也叫 `Super` 键),搜索 Dropbox 并点击它。
|
||||||
|
|
||||||
|
![Start Dropbox for installation][9]
|
||||||
|
|
||||||
|
第一次启动时,它显示两个弹出窗口。一个是关于重启 Nautilus(Ubuntu 中的文件资源管理器),另一个是关于 Dropbox 的安装。
|
||||||
|
|
||||||
|
![Starting Dropbox installation][10]
|
||||||
|
|
||||||
|
点击 “Restart Nautilus” -> “Close”(在 Nautilus 弹出窗口)或 “OK”(在安装弹出窗口),开始实际的 Dropbox 客户端下载和安装。如果 “Nautilus Restart” 在点击关闭按钮时没有关闭,请点击 “X” 按钮。
|
||||||
|
|
||||||
|
等待 Dropbox 的安装完成。
|
||||||
|
|
||||||
|
![Installing Dropbox][11]
|
||||||
|
|
||||||
|
哦!需要重新启动 Nautilus,因为 Dropbox 增加了一些额外的功能,如在文件资源管理器中显示同步状态。
|
||||||
|
|
||||||
|
当 Dropbox 安装完毕,它应该会自动带你到 Dropbox 的登录页面,或者你可以点击顶部的 Dropbox 图标并选择登录选项。
|
||||||
|
|
||||||
|
![Sign in to Dropbox after installation][12]
|
||||||
|
|
||||||
|
事实上,这就是你今后访问 Dropbox 设置的方式。
|
||||||
|
|
||||||
|
#### 第四步:开始在 Ubuntu 上使用 Dropbox
|
||||||
|
|
||||||
|
![Sign in into Dropbox][13]
|
||||||
|
|
||||||
|
**注意**:在你成功登录之前,Dropbox 将不会工作。这里有一个问题。免费版的 Dropbox 限制了你可以链接到你的账户的设备数量。**如果你已经有 3 个链接的设备,你应该删除一些你不使用的旧设备。**
|
||||||
|
|
||||||
|
当你成功登录后,你应该看到在你的家目录中创建了一个 Dropbox 文件夹,你的云端文件开始出现在这里。
|
||||||
|
|
||||||
|
![Dropbox folder is created under home directory][14]
|
||||||
|
|
||||||
|
如果你想节省磁盘空间或带宽,你可以进入偏好设置并选择<ruby>选择性同步<rt>Selective Sync</rt></ruby>选项。该选项允许你只在本地系统上同步来自 Dropbox 云的选定文件夹。
|
||||||
|
|
||||||
|
![Using selective sync in Dropbox][15]
|
||||||
|
|
||||||
|
Dropbox 会在每次启动时自动启动。我相信,这是你应该从任何云服务中期待的行为。
|
||||||
|
|
||||||
|
这就是你在 Ubuntu 上开始使用 Dropbox 所需要的一切。我希望这个教程对你有帮助。
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
via: https://itsfoss.com/install-dropbox-ubuntu/
|
||||||
|
|
||||||
|
作者:[Abhishek Prakash][a]
|
||||||
|
选题:[lujun9972][b]
|
||||||
|
译者:[geekpi](https://github.com/geekpi)
|
||||||
|
校对:[wxy](https://github.com/wxy)
|
||||||
|
|
||||||
|
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||||
|
|
||||||
|
[a]: https://itsfoss.com/author/abhishek/
|
||||||
|
[b]: https://github.com/lujun9972
|
||||||
|
[1]: https://itsfoss.com/cloud-services-linux/
|
||||||
|
[2]: https://itsfoss.com/32-bit-linux-distributions/
|
||||||
|
[3]: https://www.dropbox.com/install-linux
|
||||||
|
[4]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/09/get-dropbox-for-ubuntu.png?resize=800%2C294&ssl=1
|
||||||
|
[5]: https://itsfoss.com/install-steam-ubuntu-linux/
|
||||||
|
[6]: https://itsfoss.com/install-deb-files-ubuntu/
|
||||||
|
[7]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/09/dropbox-installer-ubuntu.png?resize=797%2C476&ssl=1
|
||||||
|
[8]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/09/installing-dropbox-deb-file.png?resize=800%2C346&ssl=1
|
||||||
|
[9]: https://itsfoss.com/wp-content/uploads/2021/09/start-drobox-ubuntu.webp
|
||||||
|
[10]: https://itsfoss.com/wp-content/uploads/2021/09/starting-dropbox-installation-800x599.webp
|
||||||
|
[11]: https://itsfoss.com/wp-content/uploads/2021/09/installing-dropbox.webp
|
||||||
|
[12]: https://itsfoss.com/wp-content/uploads/2021/09/sign-in-to-dropbox-after-first-installation.webp
|
||||||
|
[13]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/09/sign-in-dropbox.png?resize=800%2C409&ssl=1
|
||||||
|
[14]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/09/dropbox-folder-ubuntu.png?resize=800%2C491&ssl=1
|
||||||
|
[15]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/09/Dropbox-selective-sync.png?resize=800%2C399&ssl=1
|
@ -0,0 +1,82 @@
|
|||||||
|
[#]: subject: "Neither Windows, nor Linux! Shrine is ‘God’s Operating System’"
|
||||||
|
[#]: via: "https://itsfoss.com/shrine-os/"
|
||||||
|
[#]: author: "John Paul https://itsfoss.com/author/john/"
|
||||||
|
[#]: collector: "lujun9972"
|
||||||
|
[#]: translator: "wxy"
|
||||||
|
[#]: reviewer: "wxy"
|
||||||
|
[#]: publisher: "wxy"
|
||||||
|
[#]: url: "https://linux.cn/article-13831-1.html"
|
||||||
|
|
||||||
|
不是 Windows,也不是 Linux,Shrine 才是 “神之操作系统”
|
||||||
|
======
|
||||||
|
|
||||||
|
![](https://img.linux.net.cn/data/attachment/album/202109/28/154516dcc5u1a50zfn4abw.jpg)
|
||||||
|
|
||||||
|
在生活中,我们都曾使用过多种操作系统。有些好,有些坏。但你能说你使用过由“神”设计的操作系统吗?今天,我想向你介绍 Shrine(圣殿)。
|
||||||
|
|
||||||
|
### 什么是 Shrine?
|
||||||
|
|
||||||
|
![Shrine 界面][1]
|
||||||
|
|
||||||
|
从介绍里,你可能想知道这到底是怎么回事。嗯,这一切都始于一个叫 Terry Davis 的人。在我们进一步介绍之前,我最好提醒你,Terry 在生前患有精神分裂症,而且经常不吃药。正因为如此,他在生活中说过或做过一些不被社会接受的事情。
|
||||||
|
|
||||||
|
总之,让我们回到故事的主线。在 21 世纪初,Terry 发布了一个简单的操作系统。多年来,它不停地换了几个名字,有 J Operating System、LoseThos 和 SparrowOS 等等。他最终确定了 [TempleOS][2](神庙系统)这个名字。他选择这个名字是因为这个操作系统将成为“神的圣殿”。因此,“神”给 Terry 的操作系统规定了以下 [规格][3]:
|
||||||
|
|
||||||
|
![video](https://youtu.be/LtlyeDAJR7A)
|
||||||
|
|
||||||
|
* 它将有 640×480 的 16 色图形显示
|
||||||
|
* 它将使用 “单声道 8 位带符号的类似 MIDI 的声音采样”
|
||||||
|
* 它将追随 Commodore 64,即“一个非网络化的简单机器,编程是目标,而不仅仅是达到目的的手段”
|
||||||
|
* 它将只支持一个文件系统(名为 “Red Sea”)
|
||||||
|
* 它将被限制在 10 万行代码内,以使它 “整体易于学习”
|
||||||
|
* “只支持 Ring-0 级,一切都在内核模式下运行,包括用户应用程序”
|
||||||
|
* 字体将被限制为 “一种 8×8 等宽字体”
|
||||||
|
* “对一切都可以完全访问。所有的内存、I/O 端口、指令和类似的东西都绝无限制。所有的函数、变量和类成员都是可访问的”
|
||||||
|
* 它将只支持一个平台,即 64 位 PC
|
||||||
|
|
||||||
|
Terry 用一种他称之为 HolyC(神圣 C 语言)的编程语言编写了这个操作系统。TechRepublic 称其为一种 “C++ 的修改版(‘比 C 多,比 C++ 少’)”。如果你有兴趣了解 HolyC,我推荐 [这篇文章][4] 和 [RosettaCode][5] 上的 HolyC 条目。
|
||||||
|
|
||||||
|
2013 年,Terry 在他的网站上宣布,TempleOS 已经完成。不幸的是,几年后的 2018 年 8 月,Terry 被火车撞死了。当时他无家可归。多年来,许多人通过他在该操作系统上的工作关注着他。大多数人对他在如此小的体积中编写操作系统的能力印象深刻。
|
||||||
|
|
||||||
|
现在,你可能想知道这些关于 TempleOS 的讨论与 Shrine 有什么关系。好吧,正如 Shrine 的 [GitHub 页面][6] 所说,它是 “一个为异教徒设计的 TempleOS 发行版”。GitHub 用户 [minexew][7] 创建了 Shrine,为 TempleOS 添加 Terry 忽略的功能。这些功能包括:
|
||||||
|
|
||||||
|
* 与 TempleOS 程序 99% 的兼容性
|
||||||
|
* 带有 Lambda Shell,感觉有点像经典的 Unix 命令解释器
|
||||||
|
* TCP/IP 协议栈和开机即可上网
|
||||||
|
* 包括一个软件包下载器
|
||||||
|
|
||||||
|
minexew 正计划在未来增加更多的功能,但还没有宣布具体会包括什么。他有计划为 Linux 制作一个完整的 TempleOS 环境。
|
||||||
|
|
||||||
|
![video](https://youtu.be/UCgoxQCf5Jg)
|
||||||
|
|
||||||
|
### 体验
|
||||||
|
|
||||||
|
让 Shrine 在虚拟机中运行是相当容易的。你所需要做的就是安装你选择的虚拟化软件。(我的是 VirtualBox)当你为 Shrine 创建一个虚拟机时,确保它是 64 位的,并且至少有 512MB 的内存。
|
||||||
|
|
||||||
|
一旦你启动到 Shrine,会询问你是否要安装到你的(虚拟)硬盘上。一旦安装完成(你也可以选择不安装),你会看到一个该操作系统的导览,你可以由此探索。
|
||||||
|
|
||||||
|
### 总结
|
||||||
|
|
||||||
|
TempleOS (和 Shrine)显然不是为了取代 Windows 或 Linux。即使 Terry 把它称为 “神之圣殿”,我相信在他比较清醒的时候,他也会承认这更像是一个业余的作业系统。考虑到这一点,已完成的产品相当 [令人印象深刻][8]。在 12 年的时间里,Terry 用他自己创造的语言创造了一个稍稍超过 10 万行代码的操作系统。他还编写了自己的编译器、图形库和几个游戏。所有这些都是在与他自己的个人心魔作斗争的时候进行的。
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
via: https://itsfoss.com/shrine-os/
|
||||||
|
|
||||||
|
作者:[John Paul][a]
|
||||||
|
选题:[lujun9972][b]
|
||||||
|
译者:[wxy](https://github.com/wxy)
|
||||||
|
校对:[wxy](https://github.com/wxy)
|
||||||
|
|
||||||
|
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||||
|
|
||||||
|
[a]: https://itsfoss.com/author/john/
|
||||||
|
[b]: https://github.com/lujun9972
|
||||||
|
[1]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/09/shrine.jpg?resize=800%2C600&ssl=1
|
||||||
|
[2]: https://templeos.org/
|
||||||
|
[3]: https://web.archive.org/web/20170508181026/http://www.templeos.org:80/Wb/Doc/Charter.html
|
||||||
|
[4]: https://harrisontotty.github.io/p/a-lang-design-analysis-of-holyc
|
||||||
|
[5]: https://rosettacode.org/wiki/Category:HolyC
|
||||||
|
[6]: https://github.com/minexew/Shrine
|
||||||
|
[7]: https://github.com/minexew
|
||||||
|
[8]: http://www.codersnotes.com/notes/a-constructive-look-at-templeos/
|
@ -0,0 +1,82 @@
|
|||||||
|
[#]: subject: "Getting the Top Indicator Panel Back in GNOME"
|
||||||
|
[#]: via: "https://itsfoss.com/enable-applet-indicator-gnome/"
|
||||||
|
[#]: author: "Abhishek Prakash https://itsfoss.com/author/abhishek/"
|
||||||
|
[#]: collector: "lujun9972"
|
||||||
|
[#]: translator: "imgradeone"
|
||||||
|
[#]: reviewer: "wxy"
|
||||||
|
[#]: publisher: "wxy"
|
||||||
|
[#]: url: "https://linux.cn/article-13785-1.html"
|
||||||
|
|
||||||
|
恢复 GNOME 顶栏的托盘图标
|
||||||
|
======
|
||||||
|
|
||||||
|
GNOME 是一款流行的 Linux 桌面环境,致力于为 Linux 用户提供现代化的桌面体验。
|
||||||
|
|
||||||
|
虽然这款桌面绝大部分功能都不错,但 GNOME 团队的某些决定确实也让许多用户恼火、质疑。
|
||||||
|
|
||||||
|
前脚不能在桌面摆放图标和文件,后脚将右键菜单中的 [新建文档选项移除][1],现在,除此之外,GNOME 同样也移除了托盘图标栏功能。
|
||||||
|
|
||||||
|
怎么说,你总得知道托盘图标栏是什么吧?这些小图标允许你使用相应应用程序的附加功能。我自己的 Ubuntu 系统里就有许多托盘图标。
|
||||||
|
|
||||||
|
![托盘图标栏][2]
|
||||||
|
|
||||||
|
这一砍就砍出了大问题,尤其是针对那些完全依赖托盘图标的软件的致命打击。就拿 [Dropbox][3] 举例子吧,你只能通过 Dropbox 的托盘图标菜单来访问 Dropbox 的设置页面,很不幸,你在 GNOME 中就完全找不到这个图标。
|
||||||
|
|
||||||
|
这确实是个大问题,好在,我们还是有解决办法的。
|
||||||
|
|
||||||
|
### 借助插件来重新启用 GNOME 的托盘图标栏
|
||||||
|
|
||||||
|
如果你在用 GNOME,想必你已经知道 GNOME 插件是什么了。这些小插件基本上是由热心的独立开发者开发的。
|
||||||
|
|
||||||
|
如果你没有准备好,那么就去 [启用 GNOME 插件][4] 吧。这一步其实非常简单,使用 Chrome 或 Firefox 打开任意一个插件的页面,然后页面会提示你安装浏览器扩展。安装这个扩展,然后就可以启程了。
|
||||||
|
|
||||||
|
![启用 GNOME 插件的浏览器扩展][5]
|
||||||
|
|
||||||
|
现在,有一些可以向顶栏增加托盘图标的 GNOME 插件。在撰写本篇教程的时候,[AppIndicator and KStatusNotifierItem Support][6] 这款插件在 GNOME 的较新版本中已经有良好的开发优化与支持。
|
||||||
|
|
||||||
|
前往插件的页面:
|
||||||
|
|
||||||
|
- [AppIndicator 插件][6]
|
||||||
|
|
||||||
|
在这个页面中,你应该能看到一个开关按钮。点击这个按钮即可安装该插件。
|
||||||
|
|
||||||
|
![][7]
|
||||||
|
|
||||||
|
接下来会有一个弹窗,弹出后请点击“安装”。
|
||||||
|
|
||||||
|
![安装插件][8]
|
||||||
|
|
||||||
|
也许安装插件后,插件不会立即生效。此时,你必须重启 GNOME。在 Xorg 会话中,你只需要按下 `Alt + F2` 并输入 `r` 即可重启 GNOME,但这个操作不支持 Wayland 会话。
|
||||||
|
|
||||||
|
注销当前会话,并且重新登录,此后托盘图标应该就能成功启用了。如果你安装了任何一款带托盘图标的软件,那么你应该可以在顶栏上看见这些图标的身影了。
|
||||||
|
|
||||||
|
于我而言,我已经安装了 Dropbox,因此托盘图标就直接出现在顶栏上了。
|
||||||
|
|
||||||
|
![Dropbox 托盘图标在 GNOME 下可用的截图][9]
|
||||||
|
|
||||||
|
希望这个小技巧能帮助你恢复 GNOME 顶栏中的托盘图标。
|
||||||
|
|
||||||
|
我完全不理解,为什么 GNOME 的开发者会认为把这种实用性极强的功能删除会是个好主意。不过,上帝关上了一扇门,却(通常)会再打开一扇窗。好好享受按你的偏好运作的 GNOME 吧。
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
via: https://itsfoss.com/enable-applet-indicator-gnome/
|
||||||
|
|
||||||
|
作者:[Abhishek Prakash][a]
|
||||||
|
选题:[lujun9972][b]
|
||||||
|
译者:[imgradeone](https://github.com/imgradeone)
|
||||||
|
校对:[wxy](https://github.com/wxy)
|
||||||
|
|
||||||
|
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||||
|
|
||||||
|
[a]: https://itsfoss.com/author/abhishek/
|
||||||
|
[b]: https://github.com/lujun9972
|
||||||
|
[1]: https://itsfoss.com/add-new-document-option/
|
||||||
|
[2]: https://itsfoss.com/wp-content/uploads/2021/09/indicator-applet-linux.webp
|
||||||
|
[3]: https://www.dropbox.com
|
||||||
|
[4]: https://itsfoss.com/gnome-shell-extensions/
|
||||||
|
[5]: https://itsfoss.com/wp-content/uploads/2021/09/installing-gnome-extension-add-on-800x355.webp
|
||||||
|
[6]: https://extensions.gnome.org/extension/615/appindicator-support/
|
||||||
|
[7]: https://itsfoss.com/wp-content/uploads/2021/09/appindicator-extension-800x329.webp
|
||||||
|
[8]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/09/installing-appindicator-extension.png?resize=800%2C269&ssl=1
|
||||||
|
[9]: https://itsfoss.com/wp-content/uploads/2021/09/gnome-dropbox-indicator-800x561.webp
|
@ -0,0 +1,77 @@
|
|||||||
|
[#]: subject: "Resize an image from the Linux terminal"
|
||||||
|
[#]: via: "https://opensource.com/article/21/9/resize-image-linux"
|
||||||
|
[#]: author: "Jim Hall https://opensource.com/users/jim-hall"
|
||||||
|
[#]: collector: "lujun9972"
|
||||||
|
[#]: translator: "geekpi"
|
||||||
|
[#]: reviewer: "wxy"
|
||||||
|
[#]: publisher: "wxy"
|
||||||
|
[#]: url: "https://linux.cn/article-13779-1.html"
|
||||||
|
|
||||||
|
在 Linux 终端调整图像的大小
|
||||||
|
======
|
||||||
|
|
||||||
|
> 用 ImageMagick 的转换命令从你的终端缩放一张图像。
|
||||||
|
|
||||||
|
![](https://img.linux.net.cn/data/attachment/album/202109/12/235041ohsppv1hg1m26y1m.jpg)
|
||||||
|
|
||||||
|
ImageMagick 是一个方便的多用途命令行工具,它能满足你所有的图像需求。ImageMagick 支持各种图像类型,包括 JPG 照片和 PNG 图形。
|
||||||
|
|
||||||
|
### 调整图像大小
|
||||||
|
|
||||||
|
我经常在我的 Web 服务器上使用 ImageMagick 来调整图像大小。例如,假设我想在我的个人网站上发一张我的猫的照片。我手机里的照片非常大,大约 4000x3000 像素,有 3.3MB。这对一个网页来说太大了。我使用 ImageMagick 转换工具来改变照片的大小,这样我就可以把它放在我的网页上。ImageMagick 是一套完整的工具,其中最常用的是 `convert` 命令。
|
||||||
|
|
||||||
|
ImageMagick 的 `convert` 命令使用这样的一般语法:
|
||||||
|
|
||||||
|
```
|
||||||
|
convert {input} {actions} {output}
|
||||||
|
```
|
||||||
|
|
||||||
|
要将一张名为 `PXL_20210413_015045733.jpg` 的照片调整到一个更容易管理的 500 像素宽度,请输入:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ convert PXL_20210413_015045733.jpg -resize 500x sleeping-cats.jpg
|
||||||
|
```
|
||||||
|
|
||||||
|
现在新图片的大小只有 65KB。
|
||||||
|
|
||||||
|
![Sleeping cats][2]
|
||||||
|
|
||||||
|
你可以用 `-resize` 选项同时提供宽度和高度尺寸。但是,如果只提供宽度,ImageMagic 就会为你做计算,并通过调整输出图像的高度比例来自动保留长宽比。
|
||||||
|
|
||||||
|
### 在 Linux 上安装 ImageMagick
|
||||||
|
|
||||||
|
在 Linux 上,你可以使用你的包管理器安装 ImageMagick。例如,在 Fedora 或类似系统上:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ sudo dnf install imagemagick
|
||||||
|
```
|
||||||
|
|
||||||
|
在 Debian 和类似系统上:
|
||||||
|
|
||||||
|
```
|
||||||
|
$ sudo apt install imagemagick
|
||||||
|
```
|
||||||
|
|
||||||
|
在 macOS 上,使用 [MacPorts][4] 或 [Homebrew][5]。
|
||||||
|
|
||||||
|
在 Windows 上,使用 [Chocolatey][6] 即可。
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
via: https://opensource.com/article/21/9/resize-image-linux
|
||||||
|
|
||||||
|
作者:[Jim Hall][a]
|
||||||
|
选题:[lujun9972][b]
|
||||||
|
译者:[geekpi](https://github.com/geekpi)
|
||||||
|
校对:[wxy](https://github.com/wxy)
|
||||||
|
|
||||||
|
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||||
|
|
||||||
|
[a]: https://opensource.com/users/jim-hall
|
||||||
|
[b]: https://github.com/lujun9972
|
||||||
|
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/osdc-photo-camera-blue.png?itok=AsIMZ9ga (Old camera blue)
|
||||||
|
[2]: https://opensource.com/sites/default/files/sleeping-cats.jpg (Sleeping cats)
|
||||||
|
[3]: https://creativecommons.org/licenses/by-sa/4.0/
|
||||||
|
[4]: https://opensource.com/article/20/11/macports
|
||||||
|
[5]: https://opensource.com/article/20/6/homebrew-mac
|
||||||
|
[6]: https://opensource.com/article/20/3/chocolatey
|
@ -0,0 +1,92 @@
|
|||||||
|
[#]: subject: "How to Stop a Program in Linux Terminal"
|
||||||
|
[#]: via: "https://itsfoss.com/stop-program-linux-terminal/"
|
||||||
|
[#]: author: "Abhishek Prakash https://itsfoss.com/author/abhishek/"
|
||||||
|
[#]: collector: "lujun9972"
|
||||||
|
[#]: translator: "geekpi"
|
||||||
|
[#]: reviewer: "wxy"
|
||||||
|
[#]: publisher: "wxy"
|
||||||
|
[#]: url: "https://linux.cn/article-13783-1.html"
|
||||||
|
|
||||||
|
如何在 Linux 终端中退出一个程序
|
||||||
|
======
|
||||||
|
|
||||||
|
![](https://img.linux.net.cn/data/attachment/album/202109/14/112410p18i9dsj813i1j4p.jpg)
|
||||||
|
|
||||||
|
有趣的是,当你刚接触一些东西时,最简单的事情也会变得复杂。
|
||||||
|
|
||||||
|
有一天,我发现我的朋友搞不清楚如何退出 `top` 命令。他没有中止这个命令,而是关闭了整个终端程序。
|
||||||
|
|
||||||
|
这不仅是不必要的,而且是一件不好的事情。
|
||||||
|
|
||||||
|
### 在 Linux 里中止程序
|
||||||
|
|
||||||
|
在 Linux 中,你可以使用 `Ctrl+C` 键来中止终端中的运行程序。这对 Ubuntu 和其他 Linux 发行版都适用。
|
||||||
|
|
||||||
|
以 `ping` 命令为例。如果你不中止它,它将持续显示结果。
|
||||||
|
|
||||||
|
按住 `Ctrl` 键并同时按下 `C` 键。它向正在运行的程序发送 [SIGINT 信号][1]以强制退出该命令。
|
||||||
|
|
||||||
|
![Stopping a program in the Linux terminal][2]
|
||||||
|
|
||||||
|
你看到 `^C` 了吗?这个插入符号(`^`)代表 `Ctrl`。所以基本上,终端将 `Ctrl+C` 的按键显示为 `^C`。
|
||||||
|
|
||||||
|
`Ctrl+C` 对于那些被设计为持续运行直到被打断的命令非常有效。你觉得你需要取消命令,就用 `Ctrl+C`。
|
||||||
|
|
||||||
|
在一个更复杂的方法中,你可以 [找到进程 ID 并杀死一个正在运行的进程][3]。这是更高级的东西,只有进程在后台或由其他用户运行或在另一个终端窗口运行时使用。
|
||||||
|
|
||||||
|
除此以外,还有一些其他的命令和命令行工具也有自己的退出命令。让我在这里简单地提一下其中的一些。
|
||||||
|
|
||||||
|
#### 如何退出 Vim 编辑器
|
||||||
|
|
||||||
|
[退出 Vim 编辑器][4] 在 Linux 世界里闹出了很多笑话。当你刚接触这个强大的基于命令行的文本编辑器时,是很难搞清楚的。在几种退出 `vim` 的方法中,最常见的是按 `Esc` 键,然后输入冒号(`:`),再输入 `q!` 表示不保存而强制退出,或者 `wq` 表示保存并退出。
|
||||||
|
|
||||||
|
![][5]
|
||||||
|
|
||||||
|
#### 如何退出 Nano 编辑器
|
||||||
|
|
||||||
|
退出 [Nano 编辑器][6]比退出 Vim 要简单一些。为什么?因为 Nano 在底部有快捷方式。如果你是新手,你可能不明白,但至少你下次就能搞清楚了。
|
||||||
|
|
||||||
|
要退出 Nano,按 `Ctrl+X`。它将询问你是否要保存对文件所做的修改。你可以输入你的选择。
|
||||||
|
|
||||||
|
![][7]
|
||||||
|
|
||||||
|
#### 如何退出 less 命令
|
||||||
|
|
||||||
|
`less` 是一个奇妙的命令,它可以让你在不像 `cat` 命令那样杂乱的终端屏幕上进行查看。如果你在 `less` 命令的视图内,使用 `q` 键来退出 `less`。
|
||||||
|
|
||||||
|
#### 如何退出终端
|
||||||
|
|
||||||
|
要退出终端本身,不是关闭终端,而是使用 `Ctrl+D` 键盘快捷键或输入退出命令:
|
||||||
|
|
||||||
|
```
|
||||||
|
exit
|
||||||
|
```
|
||||||
|
|
||||||
|
这实际上是让你从当前的 shell 中退出。当你[在 Ubuntu 或其他发行版中打开一个终端][8],它会运行默认的 shell。当你从这个 shell 退出时,终端也会结束。`Ctrl+D` 是做同样事情的快捷方式,并退出终端。
|
||||||
|
|
||||||
|
我希望你觉得这个快速教程对你有帮助。我强烈建议你学习这些 [Linux 命令技巧][9]。
|
||||||
|
|
||||||
|
有问题或建议?请在下面留下评论。
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
via: https://itsfoss.com/stop-program-linux-terminal/
|
||||||
|
|
||||||
|
作者:[Abhishek Prakash][a]
|
||||||
|
选题:[lujun9972][b]
|
||||||
|
译者:[geekpi](https://github.com/geekpi)
|
||||||
|
校对:[wxy](https://github.com/wxy)
|
||||||
|
|
||||||
|
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||||
|
|
||||||
|
[a]: https://itsfoss.com/author/abhishek/
|
||||||
|
[b]: https://github.com/lujun9972
|
||||||
|
[1]: https://linuxhandbook.com/sigterm-vs-sigkill/#what-is-sigkill
|
||||||
|
[2]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/09/stop-a-program-linux-terminal.png?resize=800%2C373&ssl=1
|
||||||
|
[3]: https://itsfoss.com/how-to-find-the-process-id-of-a-program-and-kill-it-quick-tip/
|
||||||
|
[4]: https://itsfoss.com/how-to-exit-vim/
|
||||||
|
[5]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2017/05/how-to-exit-vim.png?resize=737%2C422&ssl=1
|
||||||
|
[6]: https://itsfoss.com/nano-editor-guide/
|
||||||
|
[7]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/05/nano-editor-save-and-exit.png?resize=799%2C503&ssl=1
|
||||||
|
[8]: https://itsfoss.com/open-terminal-ubuntu/
|
||||||
|
[9]: https://itsfoss.com/linux-command-tricks/
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user