diff --git a/published/20190108 Create your own video streaming server with Linux.md b/published/20190108 Create your own video streaming server with Linux.md new file mode 100644 index 0000000000..b16e72c645 --- /dev/null +++ b/published/20190108 Create your own video streaming server with Linux.md @@ -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 处理器内核的虚拟机上。 + +本项目使用实时消息传递协议Real-Time Messaging Protocol(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 没有捕获任何内容,因为你没有为其提供源。在本教程中,你只需为流捕获桌面。单击“来源Source”下的 “+” 按钮,选择“显示捕获Screen Capture”,然后选择要捕获的桌面。 + +单击“确定OK”,你应该会看到 OBS 镜像了你的桌面。 + +现在可以将你新配置的视频流发送到你的服务器了。在 OBS 中,单击“文件 > 设置File > Settings”。 单击“Stream”部分,并将“串流类型Stream Type” 设置为“自定义流媒体服务器Custom Streaming Server”。 + +在 URL 框中,输入前缀 `rtmp://` 后跟流媒体服务器的 IP 地址,后跟 `/live`。例如,`rtmp://IP-ADDRESS/live`。 + +接下来,你可能需要输入“串流密钥Stream key”,这是观看你的流所需的特殊标识符。 在“串流密钥Stream key”框中输入你想要(并且可以记住)的任何关键词。 + +![](https://opensource.com/sites/default/files/uploads/stream-server_streamkey.png) + +单击“应用Apply”,然后单击“确定OK”。 + +现在 OBS 已配置为将你的流发送到你的服务器,你可以开始你的第一个视频流。 单击“开始推流Start Streaming”。 + +如果一切正常,你应该会看到按钮更改为“停止推流Stop Streaming”,并且在 OBS 的底部将出现一些带宽指标。 + +![](https://opensource.com/sites/default/files/uploads/stream-server_metrics.png) + +如果你收到错误消息,请仔细检查 OBS 中的流设置是否有拼写错误。如果一切看起来都不错,则可能是另一个问题阻止了它的工作。 + +### 观看你的视频流 + +如果没有人观看,就说明直播视频不是很好,所以请成为你的第一个观众! + +有许多支持 RTMP 的开源媒体播放器,但最著名的可能是 [VLC 媒体播放器][6]。 + +安装并启动 VLC 后,通过单击“媒体 > 打开网络串流Media > Open Network Stream” 打开你的流。输入你的流的路径,添加你在 OBS 中设置的串流密钥,然后单击“播放Play”。 例如,`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 diff --git a/published/20200421 IoT offers a way to track COVID-19 via connected thermometers.md b/published/20200421 IoT offers a way to track COVID-19 via connected thermometers.md new file mode 100644 index 0000000000..695bb88281 --- /dev/null +++ b/published/20200421 IoT offers a way to track COVID-19 via connected thermometers.md @@ -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 diff --git a/published/20200629 NIST aims to make frequency sharing more efficient for wireless networks.md b/published/20200629 NIST aims to make frequency sharing more efficient for wireless networks.md new file mode 100644 index 0000000000..6b0b26ee32 --- /dev/null +++ b/published/20200629 NIST aims to make frequency sharing more efficient for wireless networks.md @@ -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 diff --git a/published/20200717 A brief history of the Content Management System.md b/published/20200717 A brief history of the Content Management System.md new file mode 100644 index 0000000000..aa7afddb42 --- /dev/null +++ b/published/20200717 A brief history of the Content Management System.md @@ -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) + +内容管理系统Content Management System(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/ diff --git a/published/20210715 Linux for Education- Best Distributions for Kids, Teachers - Schools.md b/published/20210715 Linux for Education- Best Distributions for Kids, Teachers - Schools.md new file mode 100644 index 0000000000..371b9dee5d --- /dev/null +++ b/published/20210715 Linux for Education- Best Distributions for Kids, Teachers - Schools.md @@ -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 diff --git a/published/202108/20200107 5 ways to improve your Bash scripts.md b/published/202108/20200107 5 ways to improve your Bash scripts.md new file mode 100644 index 0000000000..22d5579875 --- /dev/null +++ b/published/202108/20200107 5 ways to improve your Bash scripts.md @@ -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) + +系统管理员经常写脚本程序,不论长短,这些脚本可以完成某种任务。 + +你是否曾经查看过某个软件发行方提供的安装用的脚本script程序?为了能够适应不同用户的系统配置,顺利完成安装,这些脚本程序经常包含很多函数和逻辑分支。多年来,我积累了一些改进脚本程序的一些技巧,这里分享几个,希望能对朋友们也有用。这里列出一组短脚本示例,展示给大家做脚本样本。 + +### 初步尝试 + +我尝试写一个脚本程序时,原始程序往往就是一组命令行,通常就是调用标准命令完成诸如更新网页内容之类的工作,这样可以节省时间。其中一个类似的工作是解压文件到 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 "工作者图片" diff --git a/published/20200204 Managing your attached hardware on Linux with systemd-udevd.md b/published/202108/20200204 Managing your attached hardware on Linux with systemd-udevd.md similarity index 100% rename from published/20200204 Managing your attached hardware on Linux with systemd-udevd.md rename to published/202108/20200204 Managing your attached hardware on Linux with systemd-udevd.md diff --git a/published/202108/20200504 Understanding systemd at startup on Linux.md b/published/202108/20200504 Understanding systemd at startup on Linux.md new file mode 100644 index 0000000000..59f2c0442c --- /dev/null +++ b/published/202108/20200504 Understanding systemd at startup on Linux.md @@ -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(大统一引导加载器Grand Unified Boot Loader)配置改变这个设置。 + +主要的 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` 代表 “红帽图形化引导Red Hat Graphical Boot”,在内核初始化阶段显示一个小小的 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 + +``` + +由于数据流可能长达几十万甚至几百万行,我在这里截断了它。(我的主要工作站上列出的日志长度是 1,188,482 行。)请确保是在你的测试系统尝试的这个命令。如果系统已经运行了一段时间 —— 即使重启过很多次 —— 还是会显示大量的数据。查看这些日志数据,因为它包含了很多信息,在进行问题判断时可能非常有用。了解这个数据文件在正常的引导和启动过程中的模样,可以帮助你在问题出现时定位问题。 + +我将在本系列之后的文章讨论 systemd 日志、`journalctl` 命令、以及如何整理输出的日志数据来寻找更详细的信息。 + +内核被 GRUB 加载到内存后,必须先将自己从压缩后的文件中解压出来,才能执行任何有意义的操作。解压自己后,内核开始运行,加载 systemd 并转交控制权。 + +引导boot阶段到此结束,此时 Linux 内核和 systemd 正在运行,但是无法为用户执行任何生产性任务,因为其他的程序都没有执行,没有命令行解释器提供命令行,没有后台进程管理网络和其他的通信链接,也没有任何东西能够控制计算机执行生产功能。 + +现在 systemd 可以加载所需的功能性单元以便将系统启动到选择的目标运行状态。 + +### 目标 + +一个 systemd 目标target代表一个 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` 文件类似单用户模式。目标和服务service都是一种 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 diff --git a/published/202108/20200907 A beginner-s guide to SSH for remote connection on Linux.md b/published/202108/20200907 A beginner-s guide to SSH for remote connection on Linux.md new file mode 100644 index 0000000000..1d32280bd6 --- /dev/null +++ b/published/202108/20200907 A beginner-s guide to SSH for remote connection on Linux.md @@ -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 用户来说可能不过是日常任务,但从没操作过的人可能就会感到很困惑。本文介绍了如何配置两台计算机的 安全外壳协议secure shell(简称 SSH)连接,以及如何在没有密码的情况下安全地从一台计算机连接到另一台计算机。 + +### 相关术语 + +在讨论多台计算机时,如何将不同计算机彼此区分开可能会让人头疼。IT 社区拥有完善的术语来描述计算机联网的过程。 + + * 服务service: + 服务是指在后台运行的软件,因此它不会局限于仅供安装它的计算机使用。例如,Web 服务器通常托管着 Web 共享 _服务_。该术语暗含(但非绝对)它是没有图形界面的软件。 + * 主机host: + 主机可以是任何计算机。在 IT 中,任何计算机都可以称为 _主机_,因为从技术上讲,任何计算机都可以托管host对其他计算机有用的应用程序。你可能不会把自己的笔记本电脑视为 **主机**,但其实上面可能正运行着一些对你、你的手机或其他计算机有用的服务。 + * 本地local: + 本地计算机是指用户或某些特定软件正在使用的计算机。例如,每台计算机都会把自己称为 `localhost`。 + * 远程remote: + 远程计算机是指你既没在其面前,也没有在实际使用的计算机,是真正意义上在 _远程_ 位置的计算机。 + +现在术语已经明确好,我们可以开始了。 + +### 在每台主机上激活 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` 的地址。这是一个环回loopback地址,系统使用它来找到自己。这在登录远程计算机时并没有什么用,因此在此示例中,远程计算机的正确 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 diff --git a/published/20210308 How the ARPANET Protocols Worked.md b/published/202108/20210308 How the ARPANET Protocols Worked.md similarity index 100% rename from published/20210308 How the ARPANET Protocols Worked.md rename to published/202108/20210308 How the ARPANET Protocols Worked.md diff --git a/published/20210414 3 essential Linux cheat sheets for productivity.md b/published/202108/20210414 3 essential Linux cheat sheets for productivity.md similarity index 100% rename from published/20210414 3 essential Linux cheat sheets for productivity.md rename to published/202108/20210414 3 essential Linux cheat sheets for productivity.md diff --git a/published/20210525 Pen testing with Linux security tools.md b/published/202108/20210525 Pen testing with Linux security tools.md similarity index 100% rename from published/20210525 Pen testing with Linux security tools.md rename to published/202108/20210525 Pen testing with Linux security tools.md diff --git a/published/20210608 Tune your MySQL queries like a pro.md b/published/202108/20210608 Tune your MySQL queries like a pro.md similarity index 100% rename from published/20210608 Tune your MySQL queries like a pro.md rename to published/202108/20210608 Tune your MySQL queries like a pro.md diff --git a/published/20210625 Windows 11 Makes Your Hardware Obsolete, Use Linux Instead.md b/published/202108/20210625 Windows 11 Makes Your Hardware Obsolete, Use Linux Instead.md similarity index 100% rename from published/20210625 Windows 11 Makes Your Hardware Obsolete, Use Linux Instead.md rename to published/202108/20210625 Windows 11 Makes Your Hardware Obsolete, Use Linux Instead.md diff --git a/published/20210626 Windows 11 Look Inspired by KDE Plasma and GNOME.md b/published/202108/20210626 Windows 11 Look Inspired by KDE Plasma and GNOME.md similarity index 100% rename from published/20210626 Windows 11 Look Inspired by KDE Plasma and GNOME.md rename to published/202108/20210626 Windows 11 Look Inspired by KDE Plasma and GNOME.md diff --git a/published/202108/20210707 How to Know if Your System Uses MBR or GPT Partitioning -on Windows and Linux.md b/published/202108/20210707 How to Know if Your System Uses MBR or GPT Partitioning -on Windows and Linux.md new file mode 100644 index 0000000000..b13f856687 --- /dev/null +++ b/published/202108/20210707 How to Know if Your System Uses MBR or GPT Partitioning -on Windows and Linux.md @@ -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 diff --git a/published/20210712 Reading and writing files with Python.md b/published/202108/20210712 Reading and writing files with Python.md similarity index 100% rename from published/20210712 Reading and writing files with Python.md rename to published/202108/20210712 Reading and writing files with Python.md diff --git a/published/202108/20210713 Use VS Code to develop in containers.md b/published/202108/20210713 Use VS Code to develop in containers.md new file mode 100644 index 0000000000..f646962510 --- /dev/null +++ b/published/202108/20210713 Use VS Code to develop in containers.md @@ -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 diff --git a/published/20210720 How to Upgrade to Debian 11 from Debian 10.md b/published/202108/20210720 How to Upgrade to Debian 11 from Debian 10.md similarity index 100% rename from published/20210720 How to Upgrade to Debian 11 from Debian 10.md rename to published/202108/20210720 How to Upgrade to Debian 11 from Debian 10.md diff --git a/published/20210720 Install Shutter in Fedora 34 and Above.md b/published/202108/20210720 Install Shutter in Fedora 34 and Above.md similarity index 100% rename from published/20210720 Install Shutter in Fedora 34 and Above.md rename to published/202108/20210720 Install Shutter in Fedora 34 and Above.md diff --git a/published/20210723 5 useful ways to manage Kubernetes with kubectl.md b/published/202108/20210723 5 useful ways to manage Kubernetes with kubectl.md similarity index 100% rename from published/20210723 5 useful ways to manage Kubernetes with kubectl.md rename to published/202108/20210723 5 useful ways to manage Kubernetes with kubectl.md diff --git a/published/20210725 Top 7 Linux Laptops You Can Buy in 2021.md b/published/202108/20210725 Top 7 Linux Laptops You Can Buy in 2021.md similarity index 100% rename from published/20210725 Top 7 Linux Laptops You Can Buy in 2021.md rename to published/202108/20210725 Top 7 Linux Laptops You Can Buy in 2021.md diff --git a/published/20210726 Command line quick tips- wc, sort, sed and tr.md b/published/202108/20210726 Command line quick tips- wc, sort, sed and tr.md similarity index 100% rename from published/20210726 Command line quick tips- wc, sort, sed and tr.md rename to published/202108/20210726 Command line quick tips- wc, sort, sed and tr.md diff --git a/published/20210726 How to Install elementary Tweaks Tool.md b/published/202108/20210726 How to Install elementary Tweaks Tool.md similarity index 100% rename from published/20210726 How to Install elementary Tweaks Tool.md rename to published/202108/20210726 How to Install elementary Tweaks Tool.md diff --git a/published/20210726 How to use cron on Linux.md b/published/202108/20210726 How to use cron on Linux.md similarity index 100% rename from published/20210726 How to use cron on Linux.md rename to published/202108/20210726 How to use cron on Linux.md diff --git a/published/20210727 Check used disk space on Linux with du.md b/published/202108/20210727 Check used disk space on Linux with du.md similarity index 100% rename from published/20210727 Check used disk space on Linux with du.md rename to published/202108/20210727 Check used disk space on Linux with du.md diff --git a/published/20210727 How to Change Lock and Login Screen Wallpaper in elementary OS.md b/published/202108/20210727 How to Change Lock and Login Screen Wallpaper in elementary OS.md similarity index 100% rename from published/20210727 How to Change Lock and Login Screen Wallpaper in elementary OS.md rename to published/202108/20210727 How to Change Lock and Login Screen Wallpaper in elementary OS.md diff --git a/published/20210729 Use df to check free disk space on Linux.md b/published/202108/20210729 Use df to check free disk space on Linux.md similarity index 100% rename from published/20210729 Use df to check free disk space on Linux.md rename to published/202108/20210729 Use df to check free disk space on Linux.md diff --git a/published/20210730 4 cool new projects to try in Copr from July 2021.md b/published/202108/20210730 4 cool new projects to try in Copr from July 2021.md similarity index 100% rename from published/20210730 4 cool new projects to try in Copr from July 2021.md rename to published/202108/20210730 4 cool new projects to try in Copr from July 2021.md diff --git a/published/202108/20210730 Brave vs. Firefox- Your Ultimate Browser Choice for Private Web Experience.md b/published/202108/20210730 Brave vs. Firefox- Your Ultimate Browser Choice for Private Web Experience.md new file mode 100644 index 0000000000..78021917e5 --- /dev/null +++ b/published/202108/20210730 Brave vs. Firefox- Your Ultimate Browser Choice for Private Web Experience.md @@ -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/ diff --git a/published/20210801 Use the Linux terminal to see what files are on your computer.md b/published/202108/20210801 Use the Linux terminal to see what files are on your computer.md similarity index 100% rename from published/20210801 Use the Linux terminal to see what files are on your computer.md rename to published/202108/20210801 Use the Linux terminal to see what files are on your computer.md diff --git a/translated/tech/20210802 Use OpenCV on Fedora Linux - part 1.md b/published/202108/20210802 Use OpenCV on Fedora Linux - part 1.md similarity index 61% rename from translated/tech/20210802 Use OpenCV on Fedora Linux - part 1.md rename to published/202108/20210802 Use OpenCV on Fedora Linux - part 1.md index 8e5c9a5867..b1bb746623 100644 --- a/translated/tech/20210802 Use OpenCV on Fedora Linux - part 1.md +++ b/published/202108/20210802 Use OpenCV on Fedora Linux - part 1.md @@ -3,36 +3,40 @@ [#]: author: (Onuralp SEZER https://fedoramagazine.org/author/thunderbirdtr/) [#]: collector: (lujun9972) [#]: translator: (geekpi) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13698-1.html) -在 Fedora Linux 上使用 OpenCV ‒ 第一部分 +在 Fedora Linux 上使用 OpenCV(一) ====== ![][1] -封面图片选自[文森特-凡高][2]的《星空》,公共领域,通过维基共享资源发布 +*封面图片选自[文森特·梵高][2]的《星空》,公共领域,通过维基共享资源发布* -技术世界每天都在变化,对计算机视觉、人工智能和机器学习的需求也在增加。让计算机和手机能够看到周围环境的技术被称为[计算机视觉][3]。重新创造人眼的工作始于 50 年代。从那时起,计算机视觉技术有了长足的发展。计算机视觉已经通过不同的应用进入了我们的手机。这篇文章将介绍 Fedora Linux 上的[OpenCV][4]。 +技术世界每天都在变化,对计算机视觉、人工智能和机器学习的需求也在增加。让计算机和手机能够看到周围环境的技术被称为 [计算机视觉][3]。这个重新创造人眼的工作始于 50 年代。从那时起,计算机视觉技术有了长足的发展。计算机视觉已经通过不同的应用进入了我们的手机。这篇文章将介绍 Fedora Linux 上的 [OpenCV][4]。 -### **什么是 OpenCV?** +### 什么是 OpenCV? -> OpenCV (开源计算机视觉库)是一个开源的计算机视觉和机器学习软件库。OpenCV 的建立是为了给计算机视觉应用提供一个通用的基础设施,并加速机器感知在商业产品中的应用。它有超过 2500 种优化算法,其中包括一套全面的经典和最先进的计算机视觉和机器学习算法。这些算法可用于检测和识别人脸,识别物体,对视频中的人类行为进行分类,并建立标记,将其与增强现实叠加等等。 +> OpenCV(开源计算机视觉库Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习软件库。OpenCV 的建立是为了给计算机视觉应用提供一个通用的基础设施,并加速机器感知在商业产品中的应用。它有超过 2500 种优化后的算法,其中包括一套全面的经典和最先进的计算机视觉和机器学习算法。这些算法可用于检测和识别人脸、识别物体、对视频中的人类行为进行分类,并建立标记,将其与增强现实叠加等等。 > > [opencv.org – about][5] ### 在 Fedora Linux 上安装 OpenCV -要开始使用 OpenCV,请从 Fedora Linux 仓库中安装它。 +要开始使用 OpenCV,请从 Fedora Linux 仓库中安装它: ``` $ 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 @@ -45,20 +49,20 @@ Type "help", "copyright", "credits" or "license" for more information. >>> 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 -安装完成后,使用 Python 和 OpenCV 库加载一个样本图像(按 **S** 键以 _png_ 格式保存图像的副本并完成程序): +安装完成后,使用 Python 和 OpenCV 库加载一个样本图像(按 `S` 键以 png 格式保存图像的副本并完成程序): ``` $ cp /usr/share/opencv4/samples/data/starry_night.jpg . $ python starry_night.py ``` -_starry_night.py_ 的内容: +`starry_night.py` 的内容: ``` import cv2 as cv @@ -74,7 +78,7 @@ if k == ord("s"): ![][7] -通过在 _cv.imread_ 函数中添加参数 **0**,对图像进行灰度处理,如下所示。 +通过在 `cv.imread` 函数中添加参数 `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] -这些是一些可以用于 _cv.imread_ 函数的第二个参数的替代值。 - - * **cv2.IMREAD_GRAYSCALE** 或 **0:** 以灰度模式加载图像。 - * **cv2.IMREAD_COLOR** 或 **1:** 以彩色模式载入图像。图像中的任何透明度将被移除。这是默认的。 - * **cv2.IMREAD_UNCHANGED** 或 **-1:**载入未经修改的图像。包括 alpha 通道。 - +这些是一些可以用于 `cv.imread` 函数的第二个参数的替代值: + * `cv2.IMREAD_GRAYSCALE` 或 `0`:以灰度模式加载图像。 + * `cv2.IMREAD_COLOR** 或 `1`:以彩色模式载入图像。图像中的任何透明度将被移除。这是默认的。 + * `cv2.IMREAD_UNCHANGED** 或 `-1`:载入未经修改的图像。包括 alpha 通道。 #### 使用 OpenCV 显示图像属性 @@ -121,10 +123,8 @@ Image 2D numpy array ... ``` - * **img.shape:** 返回一个行数、列数和通道数的元组(如果是彩色图像)。 - * **img.dtype:** 返回图像的数据类型。 - - + * `img.shape`:返回一个行数、列数和通道数的元组(如果是彩色图像)。 + * `img.dtype`:返回图像的数据类型。 接下来用 Matplotlib 显示图像: @@ -140,7 +140,7 @@ plt.show() #### 发生了什么? -该图像是作为灰度图像读入的,但是当使用 Matplotlib 的 _imshow_ 函数时,它不一定会以灰度显示。这是因为 _imshow_ 函数默认使用不同的颜色映射。要指定使用灰度颜色映射,请将 _imshow_ 函数的第二个参数设置为 _cmap='gray'_,如下所示。 +该图像是作为灰度图像读入的,但是当使用 Matplotlib 的 `imshow` 函数时,它不一定会以灰度显示。这是因为 `imshow` 函数默认使用不同的颜色映射。要指定使用灰度颜色映射,请将 `imshow` 函数的第二个参数设置为 `cmap='gray'`,如下所示: ``` plt.imshow(img,cmap='gray') @@ -192,16 +192,14 @@ plt.show() ![][12] - * **cv2.split:**将一个多通道数组分割成几个单通道数组。 - * **cv2.merge:** 将几个数组合并成一个多通道数组。所有的输入矩阵必须具有相同的大小。 + * `cv2.split`:将一个多通道数组分割成几个单通道数组。 + * `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 @@ -218,7 +216,7 @@ plt.show() 关于 OpenCV 的更多细节可以在[在线文档][14]中找到。 -谢谢。 +感谢阅读。 -------------------------------------------------------------------------------- @@ -227,7 +225,7 @@ via: https://fedoramagazine.org/use-opencv-on-fedora-linux-part-1/ 作者:[Onuralp SEZER][a] 选题:[lujun9972][b] 译者:[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/) 荣誉推出 diff --git a/published/20210803 GNOME Web Canary is Now Available to Test Bleeding Edge Features.md b/published/202108/20210803 GNOME Web Canary is Now Available to Test Bleeding Edge Features.md similarity index 100% rename from published/20210803 GNOME Web Canary is Now Available to Test Bleeding Edge Features.md rename to published/202108/20210803 GNOME Web Canary is Now Available to Test Bleeding Edge Features.md diff --git a/published/20210803 How to Install Google Chrome on Linux Mint -Beginners Tip.md b/published/202108/20210803 How to Install Google Chrome on Linux Mint -Beginners Tip.md similarity index 100% rename from published/20210803 How to Install Google Chrome on Linux Mint -Beginners Tip.md rename to published/202108/20210803 How to Install Google Chrome on Linux Mint -Beginners Tip.md diff --git a/published/20210803 Mount Microsoft OneDrive in Linux With OneDriver GUI Tool.md b/published/202108/20210803 Mount Microsoft OneDrive in Linux With OneDriver GUI Tool.md similarity index 100% rename from published/20210803 Mount Microsoft OneDrive in Linux With OneDriver GUI Tool.md rename to published/202108/20210803 Mount Microsoft OneDrive in Linux With OneDriver GUI Tool.md diff --git a/published/20210803 Set up a VPN server on your Linux PC.md b/published/202108/20210803 Set up a VPN server on your Linux PC.md similarity index 100% rename from published/20210803 Set up a VPN server on your Linux PC.md rename to published/202108/20210803 Set up a VPN server on your Linux PC.md diff --git a/published/20210803 Use the Linux terminal to navigate throughout your computer.md b/published/202108/20210803 Use the Linux terminal to navigate throughout your computer.md similarity index 100% rename from published/20210803 Use the Linux terminal to navigate throughout your computer.md rename to published/202108/20210803 Use the Linux terminal to navigate throughout your computer.md diff --git a/published/20210804 Firefox Lost Almost 50 million Users- Here-s Why It is Concerning.md b/published/202108/20210804 Firefox Lost Almost 50 million Users- Here-s Why It is Concerning.md similarity index 100% rename from published/20210804 Firefox Lost Almost 50 million Users- Here-s Why It is Concerning.md rename to published/202108/20210804 Firefox Lost Almost 50 million Users- Here-s Why It is Concerning.md diff --git a/published/20210804 How to Find and Remove Duplicate Photos in Linux.md b/published/202108/20210804 How to Find and Remove Duplicate Photos in Linux.md similarity index 100% rename from published/20210804 How to Find and Remove Duplicate Photos in Linux.md rename to published/202108/20210804 How to Find and Remove Duplicate Photos in Linux.md diff --git a/published/202108/20210804 Install OpenVPN on your Linux PC.md b/published/202108/20210804 Install OpenVPN on your Linux PC.md new file mode 100644 index 0000000000..9c444e001e --- /dev/null +++ b/published/202108/20210804 Install OpenVPN on your Linux PC.md @@ -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 承担了称为 证书颁发机构certificate authority(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/ diff --git a/published/20210804 Move files in the Linux terminal.md b/published/202108/20210804 Move files in the Linux terminal.md similarity index 100% rename from published/20210804 Move files in the Linux terminal.md rename to published/202108/20210804 Move files in the Linux terminal.md diff --git a/translated/tech/20210805 Configure your OpenVPN server on Linux.md b/published/202108/20210805 Configure your OpenVPN server on Linux.md similarity index 57% rename from translated/tech/20210805 Configure your OpenVPN server on Linux.md rename to published/202108/20210805 Configure your OpenVPN server on Linux.md index 6c997507f6..14efcf70ca 100644 --- a/translated/tech/20210805 Configure your OpenVPN server on Linux.md +++ b/published/202108/20210805 Configure your OpenVPN server on Linux.md @@ -3,61 +3,57 @@ [#]: author: "D. Greg Scott https://opensource.com/users/greg-scott" [#]: collector: "lujun9972" [#]: translator: "geekpi" -[#]: reviewer: " " -[#]: publisher: " " -[#]: url: " " +[#]: reviewer: "turbokernel" +[#]: publisher: "wxy" +[#]: 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` 以启用路由。 - * 为所有的配置和认证文件设置适当的所有权,以便在一个非 root 账户下运行 OpenVPN 服务器守护程序。 - * 设置 OpenVPN 以适当的配置文件启动。 + * 使用 `sysctl` 设置`net.ipv4.ip_forward = 1` 以启用路由。 + * 为所有的配置和认证文件设置适当的所有权,以便使用非 root 账户运行 0penVPN 服务器守护程序。 + * 设置 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 转发,请下载我的脚本: - ``` $ curl \ - > \ -OVPNdownloads.sh + https://www.dgregscott.com/ovpn/OVPNdownloads.sh > \ + OVPNdownloads.sh ``` -阅读该脚本,了解它的工作内容。下面是它的行为概述: +阅读该脚本,了解它的工作内容。下面是它的运行概述: - * 在你的 OpenVPN 服务器上创建适当的目录 + * 在你的 0penVPN 服务器上创建适当的目录 * 从我的网站下载服务器和客户端的配置文件模板 - * 下载我的自定义脚本,并以正确的权限把它们放到正确的目录中。 - * 下载 `99-ipforward.conf` 并把它放到 `/etc/sysctl.d` 中,以便在下次启动时打开 IP 转发功能。 + * 下载我的自定义脚本,并以正确的权限把它们放到正确的目录中 + * 下载 `99-ipforward.conf` 并把它放到 `/etc/sysctl.d` 中,以便在下次启动时打开 IP 转发功能 * 为 `/etc/openvpn` 中的所有内容设置了所有权 - - 当你确定你理解了这个脚本的作用,就使它可执行并运行它: - ``` $ chmod +x OVPNdownloads.sh $ sudo ./OVPNdownloads.sh @@ -65,7 +61,6 @@ $ sudo ./OVPNdownloads.sh 下面是它复制的文件(注意文件的所有权): - ``` $ ls -al -R /etc/openvpn /etc/openvpn: @@ -104,7 +99,6 @@ drwxr-xr-x. 4 openvpn openvpn 56 Apr 6 20:35 .. 下面是 `99-ipforward.conf` 文件: - ``` # Turn on IP forwarding. OpenVPN servers need to do routing 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 @@ -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 @@ -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],经许可后重新使用。_ @@ -159,7 +147,7 @@ via: https://opensource.com/article/21/7/openvpn-firewall 作者:[D. Greg Scott][a] 选题:[lujun9972][b] 译者:[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/) 荣誉推出 @@ -167,7 +155,7 @@ via: https://opensource.com/article/21/7/openvpn-firewall [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) [2]: https://openvpn.net/ -[3]: https://opensource.com/article/21/7/vpn-openvpn-part-1 -[4]: https://opensource.com/article/21/7/vpn-openvpn-part-2 +[3]: https://linux.cn/article-13680-1.html +[4]: https://linux.cn/article-13702-1.html [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/ diff --git a/published/202108/20210806 Access OpenVPN from a client computer.md b/published/202108/20210806 Access OpenVPN from a client computer.md new file mode 100644 index 0000000000..b09363db70 --- /dev/null +++ b/published/202108/20210806 Access OpenVPN from a client computer.md @@ -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/` 目录,或者你也可以导航到系统设置中的网络管理器添加一个“虚拟专用网络” 连接。 + +连接类型选择“证书(TLS)Certificates(TLS)”。告知网络管理器你从服务器上复制的证书和密钥。 + +![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 图标并单击“连接Connect”,从办公室网络内部连接到服务器。调试此连接,这应该可以找到并解决问题,而不会出现任何防火墙问题,因为客户端和服务器都在防火墙的同一侧。 + +接下来,编辑客户端配置文件的 `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/ diff --git a/published/202108/20210806 Change your Linux Desktop Wallpaper Every Hour -Here-s How.md b/published/202108/20210806 Change your Linux Desktop Wallpaper Every Hour -Here-s How.md new file mode 100644 index 0000000000..ec970dc530 --- /dev/null +++ b/published/202108/20210806 Change your Linux Desktop Wallpaper Every Hour -Here-s How.md @@ -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 \ No newline at end of file diff --git a/published/20210807 How to Install Java on Fedora Linux.md b/published/202108/20210807 How to Install Java on Fedora Linux.md similarity index 100% rename from published/20210807 How to Install Java on Fedora Linux.md rename to published/202108/20210807 How to Install Java on Fedora Linux.md diff --git a/published/20210807 It-s Time for Ubuntu to Opt for a Hybrid Rolling Release Model.md b/published/202108/20210807 It-s Time for Ubuntu to Opt for a Hybrid Rolling Release Model.md similarity index 100% rename from published/20210807 It-s Time for Ubuntu to Opt for a Hybrid Rolling Release Model.md rename to published/202108/20210807 It-s Time for Ubuntu to Opt for a Hybrid Rolling Release Model.md diff --git a/published/20210807 Remove files and folders in the Linux terminal.md b/published/202108/20210807 Remove files and folders in the Linux terminal.md similarity index 100% rename from published/20210807 Remove files and folders in the Linux terminal.md rename to published/202108/20210807 Remove files and folders in the Linux terminal.md diff --git a/published/202108/20210811 Monitor your Linux system in your terminal with procps-ng.md b/published/202108/20210811 Monitor your Linux system in your terminal with procps-ng.md new file mode 100644 index 0000000000..ebfa999849 --- /dev/null +++ b/published/202108/20210811 Monitor your Linux system in your terminal with procps-ng.md @@ -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] 术语中,进程process是一个正在进行的事件,由操作系统的内核管理。当你启动一个应用时就会产生一个进程,尽管还有许多其他的进程在你的计算机后台运行,包括保持系统时间准确的程序、监测新的文件系统、索引文件,等等。 + +大多数操作系统都有某种类型的系统活动监视器,因此你可以了解在任何特定时刻有哪些进程在运行。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 一个关于让 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 开发者定义的设置,而且你在安装时无法控制各个卷。 +安装程序重点关注在简单的安装上:定义你的分区并安装到这些分区。对于那些想要更灵活的设置的人来说,[逻辑卷管理器][3]logical volume manager(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] -CC BY-SA Seth Kenlon - -接下来,在磁盘的其余部分创建一个 `lvm2 pv` 类型的分区(这是你的 LVM 的位置)。 +接下来,在磁盘的其余部分创建一个 `lvm2 pv` 类型(LVM 2 物理卷)的分区(这是你的 LVM 的位置)。 ![Partition layout][7] -CC BY-SA Seth Kenlon - 现在打开一个终端窗口,并将你的权限提升到 root: - ``` $ sudo -s # whoami root ``` -接下来,你必须找到你之前创建的 LVM 成员(大分区)。使用下列命令之一: `lsblk -f` 或 `pvs` 或 `pvscan`。 - +接下来,你必须找到你之前创建的 LVM 成员(那个大分区)。使用下列命令之一:`lsblk -f` 或 `pvs` 或 `pvscan`。 ``` # pvs @@ -64,42 +60,37 @@ PV VG Fmt [...] 在我的例子中,该分区位于 `/dev/sda2`,但你应该用你的输出中得到的内容来替换它。 -现在你知道了你的分区有哪些设备,你可以在那里创建一个 LVM 卷组: - +现在你知道了你的分区有哪些设备,你可以在那里创建一个 LVM 卷组(VG): ``` -`# vgcreate vg /dev/sda2` +# vgcreate vg /dev/sda2 ``` 你可以使用 `vgs` 或 `vgscan` 看到你创建的卷组的细节。 -创建你想在安装时使用的逻辑卷。为了简单,我分别创建了根分区(`/`)和 `swap` 分区,但是你可以根据需要创建更多的分区(例如,为 `/home` 创建一个单独的分区)。 - +创建你想在安装时使用的逻辑卷(LV)。为了简单,我分别创建了 `root` 根分区(`/`)和 `swap` 交换分区,但是你可以根据需要创建更多的分区(例如,为 `/home` 创建一个单独的分区)。 ``` # lvcreate -L 80G -n root vg # lvcreate -L 16G -n swap vg ``` -我的例子中的分区大小是任意的,是基于我可用的。使用对你的硬盘有意义的分区大小。 +我的例子中的分区大小是任意的,是基于我可用的空间。使用对你的硬盘有意义的分区大小。 你可以用 `lvs` 或 `lvdisplay` 查看逻辑卷。 -终端到这就结束了。 +终端操作到这就结束了。 ### 安装 Linux 现在从桌面上的图标启动安装程序: - * 进入 **Installation type**,选择 **Something else**。 + * 进入 “Installation type”,选择 “Something else”。 * 编辑 512Mb 的分区并将其改为 `EFI`。 - * 编辑根 LV,将其改为 `ext4`(或一个你选择的文件系统)。选择将其挂载为根目录,并选择将其格式化。 - * 编辑交换分区并将其设置为`swap`。 + * 编辑根逻辑卷,将其改为 `ext4`(或一个你选择的文件系统)。选择将其挂载为根目录(`/`),并选择将其格式化。 + * 编辑 `swap` 分区并将其设置为交换分区。 * 继续正常的安装过程。Linux Mint 安装程序会将文件放在正确的位置并为你创建挂载点。 - - - 完成了。在你的 Linux Mint 安装中享受 LVM 的强大。 如果你需要调整分区大小或在系统上做任何高级工作,你会感谢选择 LVM。 @@ -111,7 +102,7 @@ via: https://opensource.com/article/21/8/install-linux-mint-lvm 作者:[Kenneth Aaron][a] 选题:[lujun9972][b] 译者:[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/) 荣誉推出 diff --git a/translated/tech/20210813 Parse command options in Java with commons-cli.md b/published/202108/20210813 Parse command options in Java with commons-cli.md similarity index 57% rename from translated/tech/20210813 Parse command options in Java with commons-cli.md rename to published/202108/20210813 Parse command options in Java with commons-cli.md index f4789d23ea..d0923f6214 100644 --- a/translated/tech/20210813 Parse command options in Java with commons-cli.md +++ b/published/202108/20210813 Parse command options in Java with commons-cli.md @@ -3,14 +3,16 @@ [#]: author: "Seth Kenlon https://opensource.com/users/seth" [#]: collector: "lujun9972" [#]: translator: "unigeorge" -[#]: reviewer: " " -[#]: publisher: " " -[#]: url: " " +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13699-1.html" 使用 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 应用程序还是仅启动终端应用程序,都可以使用 @@ -22,13 +24,13 @@ Java 中有若干种解析选项的方法,其中我最喜欢用的是 [Apache ### 安装 commons-cli -如果你使用类似 [Maven][5] 之类的项目管理系统以及集成开发环境(Integrated Development Environment,简称IDE),可以在项目属性(比如 `pom.xml` 配置文件或者 Eclipse 和 NetBeans 的配置选项卡)中安装 Apache Commons CLI 库。 +如果你使用类似 [Maven][5] 之类的项目管理系统以及集成开发环境Integrated Development Environment(简称 IDE),可以在项目属性(比如 `pom.xml` 配置文件或者 Eclipse 和 NetBeans 的配置选项卡)中安装 Apache Commons CLI 库。 而如果你采用手动方式管理库,则可以从 Apache 网站下载 [该库的最新版本][6]。下载到本地的是几个捆绑在一起的 JAR 文件,你只需要其中的一个文件 `commons-cli-X.Y.jar`(其中 X 和 Y 代指最新版本号)。把这个 JAR 文件或手动或使用 IDE 添加到项目,就可以在代码中使用了。 ### 将库导入至 Java 代码 -在使用 **commons-cli** 库之前,必须首先导入它。对于本次选项解析的简单示例而言,可以先在 `Main.java` 文件中简单写入以下标准代码: +在使用 `commons-cli` 库之前,必须首先导入它。对于本次选项解析的简单示例而言,可以先在 `Main.java` 文件中简单写入以下标准代码: ``` package com.opensource.myoptparser; @@ -36,7 +38,7 @@ package com.opensource.myoptparser; import org.apache.commons.cli.*; public class Main { -    public static void main([String][7][] args) { +    public static void main(String[] args) {     // code      } } @@ -55,20 +57,20 @@ public class Main {     Options options = new Options(); ``` -接下来,通过列出短选项(即选项名简写)、长选项(即全写)、默认布尔值(译注:设置是否需要选项参数,指定为 false 时此选项不带参,即为布尔选项)和帮助信息来定义选项,然后设置该选项是否为必需项(译注:下方创建 `alpha` 对象的代码中未手动设置此项),最后将该选项添加到包含所有选项的 `options` 组对象中。在下面几行代码中,我只创建了一个选项,命名为 `alpha`: +接下来,通过列出短选项(即选项名简写)、长选项(即全写)、默认布尔值(LCTT 译注:设置是否需要选项参数,指定为 `false` 时此选项不带参,即为布尔选项)和帮助信息来定义选项,然后设置该选项是否为必需项(LCTT 译注:下方创建 `alpha` 对象的代码中未手动设置此项),最后将该选项添加到包含所有选项的 `options` 组对象中。在下面几行代码中,我只创建了一个选项,命名为 `alpha`: ```     //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); ``` ### 在 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")         .hasArg()         .required(true) @@ -76,11 +78,11 @@ public class Main {     options.addOption(config); ``` -`builder`函数可以用来设置短选项、长选项、是否为必需项(本段代码中必需项设置为 **true**,也就意味着用户启动程序时必须提供此选项,否则应用程序无法运行)、帮助信息等。 +`builder` 函数可以用来设置短选项、长选项、是否为必需项(本段代码中必需项设置为 `true`,也就意味着用户启动程序时必须提供此选项,否则应用程序无法运行)、帮助信息等。 ### 使用 Java 解析选项 -定义并添加所有可能用到的选项后,需要对用户提供的参数进行迭代处理,检测是否有参数同预设的有效短选项列表中的内容相匹配。为此要创建 **CommandLine** 命令行本身的一个实例,其中包含用户提供的所有参数(包含有效选项和无效选项)。为了处理这些参数,还要创建一个 **CommandLineParser** 对象,我在代码中将其命名为 `parser`。最后,还可以创建一个 **HelpFormatter** 对象(我将其命名为 `helper`),当参数中缺少某些必需项或者用户使用 `--help` 或 `-h` 选项时,此对象可以自动向用户提供一些有用的信息。 +定义并添加所有可能用到的选项后,需要对用户提供的参数进行迭代处理,检测是否有参数同预设的有效短选项列表中的内容相匹配。为此要创建命令行 `CommandLine` 本身的一个实例,其中包含用户提供的所有参数(包含有效选项和无效选项)。为了处理这些参数,还要创建一个 `CommandLineParser` 对象,我在代码中将其命名为 `parser`。最后,还可以创建一个 `HelpFormatter` 对象(我将其命名为 `helper`),当参数中缺少某些必需项或者用户使用 `--help` 或 `-h` 选项时,此对象可以自动向用户提供一些有用的信息。 ```     // define parser @@ -93,23 +95,23 @@ public class Main { ``` try { -    cmd = parser.parse(options, args); -    if(cmd.hasOption("a")) { -    [System][9].out.println("Alpha activated"); -    } + cmd = parser.parse(options, args); + if(cmd.hasOption("a")) { + System.out.println("Alpha activated"); + } -    if (cmd.hasOption("c")) { -    [String][7] opt_config = cmd.getOptionValue("config"); -    [System][9].out.println("Config set to " + opt_config); -    } -} catch ([ParseException][10] e) { -    [System][9].out.println(e.getMessage()); -    helper.printHelp("Usage:", options); -    [System][9].exit(0); + 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); } ``` -解析过程有可能会产生错误,因为有时可能缺少某些必需项如本例中的 `-c` 或 `--config` 选项。这时程序会打印一条帮助信息,并立即结束运行。考虑到此错误(Java 术语中称为 _exception_,异常),在 main 方法的开头要添加语句声明可能的异常: +解析过程有可能会产生错误,因为有时可能缺少某些必需项如本例中的 `-c` 或 `--config` 选项。这时程序会打印一条帮助信息,并立即结束运行。考虑到此错误(Java 术语中称为异常),在 `main` 方法的开头要添加语句声明可能的异常: ``` @@ -146,53 +148,52 @@ Config set to foo 以下是完整的演示代码,供读者参考: - ``` package com.opensource.myapp; import org.apache.commons.cli.*; 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(); + + /** + * @param args the command line arguments + * @throws org.apache.commons.cli.ParseException + */ + public static void main(String[] args) throws ParseException { + // define options + Options options = new Options(); + + Option alpha = new Option("a", "alpha", false, "Activate feature alpha"); + options.addOption(alpha); + + Option config = Option.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); -            if(cmd.hasOption("a")) { -                [System][9].out.println("Alpha activated"); -            } -           -            if (cmd.hasOption("c")) { -                [String][7] opt_config = cmd.getOptionValue("config"); -                [System][9].out.println("Config set to " + opt_config); -            } -        } catch ([ParseException][10] e) { -            [System][9].out.println(e.getMessage()); -            helper.printHelp("Usage:", options); -            [System][9].exit(0); -        } -    } + 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] 选题:[lujun9972][b] 译者:[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/) 荣誉推出 diff --git a/published/20210814 What is SteamOS- Everything Important You Need to Know About This -Gaming Distribution.md b/published/202108/20210814 What is SteamOS- Everything Important You Need to Know About This -Gaming Distribution.md similarity index 100% rename from published/20210814 What is SteamOS- Everything Important You Need to Know About This -Gaming Distribution.md rename to published/202108/20210814 What is SteamOS- Everything Important You Need to Know About This -Gaming Distribution.md diff --git a/translated/news/20210815 7 New Features in the Newly Released Debian 11 ‘Bullseye- Linux Distro.md b/published/202108/20210815 7 New Features in the Newly Released Debian 11 ‘Bullseye- Linux Distro.md similarity index 98% rename from translated/news/20210815 7 New Features in the Newly Released Debian 11 ‘Bullseye- Linux Distro.md rename to published/202108/20210815 7 New Features in the Newly Released Debian 11 ‘Bullseye- Linux Distro.md index 04634c409c..e2190e87dd 100644 --- a/translated/news/20210815 7 New Features in the Newly Released Debian 11 ‘Bullseye- Linux Distro.md +++ b/published/202108/20210815 7 New Features in the Newly Released Debian 11 ‘Bullseye- Linux Distro.md @@ -4,8 +4,8 @@ [#]: collector: "lujun9972" [#]: translator: "wxy" [#]: reviewer: "wxy" -[#]: publisher: " " -[#]: url: " " +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13695-1.html" 新发布的 Debian 11 “Bullseye” Linux 发行版的 7 大亮点 ====== diff --git a/published/202108/20210815 Schedule a task with the Linux at command.md b/published/202108/20210815 Schedule a task with the Linux at command.md new file mode 100644 index 0000000000..f4212f579c --- /dev/null +++ b/published/202108/20210815 Schedule a task with the Linux at command.md @@ -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> +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 diff --git a/published/202108/20210817 4 alternatives to cron in Linux.md b/published/202108/20210817 4 alternatives to cron in Linux.md new file mode 100644 index 0000000000..72b6aae2d7 --- /dev/null +++ b/published/202108/20210817 4 alternatives to cron in Linux.md @@ -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 diff --git a/published/202108/20210817 Automatically Synchronize Subtitle With Video Using SubSync.md b/published/202108/20210817 Automatically Synchronize Subtitle With Video Using SubSync.md new file mode 100644 index 0000000000..367eb80668 --- /dev/null +++ b/published/202108/20210817 Automatically Synchronize Subtitle With Video Using SubSync.md @@ -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/ diff --git a/published/202108/20210818 Build a JAR file with fastjar and gjar.md b/published/202108/20210818 Build a JAR file with fastjar and gjar.md new file mode 100644 index 0000000000..ce47a73776 --- /dev/null +++ b/published/202108/20210818 Build a JAR file with fastjar and gjar.md @@ -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 diff --git a/published/202108/20210819 Check free disk space in Linux with ncdu.md b/published/202108/20210819 Check free disk space in Linux with ncdu.md new file mode 100644 index 0000000000..4d77814c02 --- /dev/null +++ b/published/202108/20210819 Check free disk space in Linux with ncdu.md @@ -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) diff --git a/published/202108/20210819 Zorin OS 16 Released with Stunning New Look and Array of Updates.md b/published/202108/20210819 Zorin OS 16 Released with Stunning New Look and Array of Updates.md new file mode 100644 index 0000000000..f7003aad4f --- /dev/null +++ b/published/202108/20210819 Zorin OS 16 Released with Stunning New Look and Array of Updates.md @@ -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/ diff --git a/published/202108/20210822 How to Monitor Log Files in Real Time in Linux -Desktop and Server.md b/published/202108/20210822 How to Monitor Log Files in Real Time in Linux -Desktop and Server.md new file mode 100644 index 0000000000..3fd2befe24 --- /dev/null +++ b/published/202108/20210822 How to Monitor Log Files in Real Time in Linux -Desktop and Server.md @@ -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/ diff --git a/published/202108/20210822 Linux Phones- Here are Your Options.md b/published/202108/20210822 Linux Phones- Here are Your Options.md new file mode 100644 index 0000000000..21375774ba --- /dev/null +++ b/published/202108/20210822 Linux Phones- Here are Your Options.md @@ -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#/ diff --git a/published/202108/20210823 Access your iPhone on Linux with this open source tool.md b/published/202108/20210823 Access your iPhone on Linux with this open source tool.md new file mode 100644 index 0000000000..f864386b61 --- /dev/null +++ b/published/202108/20210823 Access your iPhone on Linux with this open source tool.md @@ -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 diff --git a/published/202108/20210823 KDE Plasma 5.23 - New Features and Release Dates.md b/published/202108/20210823 KDE Plasma 5.23 - New Features and Release Dates.md new file mode 100644 index 0000000000..43cce08b84 --- /dev/null +++ b/published/202108/20210823 KDE Plasma 5.23 - New Features and Release Dates.md @@ -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 diff --git a/published/202108/20210824 How to include options in your Bash shell scripts.md b/published/202108/20210824 How to include options in your Bash shell scripts.md new file mode 100644 index 0000000000..6aa2c9de83 --- /dev/null +++ b/published/202108/20210824 How to include options in your Bash shell scripts.md @@ -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 diff --git a/published/202108/20210826 30 things you didn-t know about the Linux kernel.md b/published/202108/20210826 30 things you didn-t know about the Linux kernel.md new file mode 100644 index 0000000000..0a8360ba4b --- /dev/null +++ b/published/202108/20210826 30 things you didn-t know about the Linux kernel.md @@ -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 指的是直接渲染管理器Direct Rendering Manager,它指的是用于与对接显卡的 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. 虚拟文件系统Virtual File System(VFS)是 Linux 内核中的一个软件层,为用户运行的应用程序提供文件系统接口。它也是内核的一个抽象层,以便不同的文件系统实现可以共存。 + 22. Linux 内核包括一个实体的盲文输出设备的驱动程序。 + 23. 在 2.6.29 版本的内核中,启动时的 Tux 徽标被替换为 “Tuz”,以提高人们对当时影响澳大利亚的塔斯马尼亚魔鬼Tasmanian Devil(即袋獾)种群的一种侵袭性癌症的认识。 + 24. 控制组Control Groups(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 diff --git a/published/202109/20200121 13 of the best React JavaScript frameworks.md b/published/202109/20200121 13 of the best React JavaScript frameworks.md new file mode 100644 index 0000000000..45d734f18e --- /dev/null +++ b/published/202109/20200121 13 of the best React JavaScript frameworks.md @@ -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 = () => ( +  +); +``` + +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
{itemType}
; +}; + +class App extends React.Component { + ... +  render() { +    return ( +      +        +        +        // or +        {generatePreview} +      +    ); +  } +} +``` + +#### 优点 + + 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(, 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(, 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 diff --git a/published/202109/20200211 Using external libraries in Java.md b/published/202109/20200211 Using external libraries in Java.md new file mode 100644 index 0000000000..c1f3652236 --- /dev/null +++ b/published/202109/20200211 Using external libraries in Java.md @@ -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] 数据库,并得到一些有趣的信息。首先,我们来回顾一下库的重要部分。 + +### 什么是库? + +library里自然包含的是一些有用的代码。但为了发挥用处,代码需要以特定方式进行组织,特定的方式使 Java 程序员可以访问其中组件来解决手头问题。 + +可以说,一个库最重要的部分是它的应用程序编程接口(API)文档。这种文档很多人都熟悉,通常是由 [Javadoc][8] 生成的。Javadoc 读取代码中的结构化注释并以 HTML 格式输出文档,通常 API 的 package 在页面左上角的面板中显示,class 在左下角显示,同时右侧会有库、包或类级别的详细文档(具体取决于在主面板中选择的内容)。例如,[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` 包来查找刚刚创建的函数的零点。但如果你不知道,就可能需要更多学习向的文档,也许甚至是一个实际例子,来读懂参考文档。 + +这种文档结构还有助于阐明 package(相关 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 diff --git a/published/202109/20200908 Deploy a deep learning model on Kubernetes.md b/published/202109/20200908 Deploy a deep learning model on Kubernetes.md new file mode 100644 index 0000000000..cf034c4879 --- /dev/null +++ b/published/202109/20200908 Deploy a deep learning model on Kubernetes.md @@ -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 + 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 / + + sudo docker push / + ``` + + ![给镜像打上 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 diff --git a/published/202109/20210228 What is GNU-Linux Copypasta.md b/published/202109/20210228 What is GNU-Linux Copypasta.md new file mode 100644 index 0000000000..0026fa8d35 --- /dev/null +++ b/published/202109/20210228 What is GNU-Linux Copypasta.md @@ -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 口水话copypaste)。 + +我不清楚这些 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 译注:译者选择翻译为“口水话”,或许有更贴合中文的译法,请大家指正)这个术语。它与意大利面pasta毫无关系。 + +[口水话][8] 是在互联网上复制和粘贴的文本块,通常是为了嘲弄或取笑别人。它是“复制-粘贴copy-paste”一词的变种。 + +口水话也被认为是垃圾内容,因为它们被重复了一次又一次。以 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/ diff --git a/published/202109/20210424 Can We Recommend Linux for Gaming in 2021.md b/published/202109/20210424 Can We Recommend Linux for Gaming in 2021.md new file mode 100644 index 0000000000..d2e5ad57bf --- /dev/null +++ b/published/202109/20210424 Can We Recommend Linux for Gaming in 2021.md @@ -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 diff --git a/published/202109/20210622 What is a config file.md b/published/202109/20210622 What is a config file.md new file mode 100644 index 0000000000..704240b003 --- /dev/null +++ b/published/202109/20210622 What is a config file.md @@ -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 格式还可以分 section。在下列示例代码中,`[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 全称为JavaScript 对象符号JavaScript Object Notation。由于与 Web 开发密切相关,JSON 是 Web API 的常见输出格式。大多数编程语言都有解析 JSON 的库。 + +#### XML + +XML 使用标签作为键,将配置值围绕起来: + +``` +Tux1 + +``` + +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/ diff --git a/published/202109/20210719 Apps for daily needs part 2- office suites.md b/published/202109/20210719 Apps for daily needs part 2- office suites.md new file mode 100644 index 0000000000..eb2f6ecbcf --- /dev/null +++ b/published/202109/20210719 Apps for daily needs part 2- office suites.md @@ -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] + +更多信息请见此链接: + +### 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] + +更多信息请见此链接: + +### 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] + +更多信息请见此链接: + +### 总结 + +这篇文章介绍了 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 diff --git a/published/202109/20210727 Analyze the Linux kernel with ftrace.md b/published/202109/20210727 Analyze the Linux kernel with ftrace.md new file mode 100644 index 0000000000..673661c1b3 --- /dev/null +++ b/published/202109/20210727 Analyze the Linux kernel with ftrace.md @@ -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 +# | | | |||| | | + -0 [000] d... 2088.841739: tsc_verify_tsc_adjust <-arch_cpu_idle_enter + -0 [000] d... 2088.841739: local_touch_nmi <-do_idle + -0 [000] d... 2088.841740: rcu_nocb_flush_deferred_wakeup <-do_idle + -0 [000] d... 2088.841740: tick_check_broadcast_expired <-do_idle + -0 [000] d... 2088.841740: cpuidle_get_cpu_driver <-do_idle + -0 [000] d... 2088.841740: cpuidle_not_available <-do_idle + -0 [000] d... 2088.841741: cpuidle_select <-do_idle + -0 [000] d... 2088.841741: menu_select <-do_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 \ No newline at end of file diff --git a/published/202109/20210804 Apps for daily needs part 3- image editors.md b/published/202109/20210804 Apps for daily needs part 3- image editors.md new file mode 100644 index 0000000000..f23981589d --- /dev/null +++ b/published/202109/20210804 Apps for daily needs part 3- image editors.md @@ -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(GNU 图像处理程序GNU Image Manipulation Program)是一个光栅图像(位图)编辑器,用于照片修饰、图像合成和图像创作。它的功能几乎与 Adobe Photoshop 相同。你可以用 GIMP 做很多你可以用 Photoshop 做的事情。正因为如此,GIMP 作为 Adobe Photoshop 的开源替代品,已经成为最受欢迎的应用程序。 + +GIMP 有很多图像处理的功能,特别是针对光栅图像。你可以用 GIMP 修复或改变照片的颜色。你可以选择图像的一部分,裁剪它,然后与图像的其他部分合并。GIMP 还有许多你可以应用于你的图像的效果,包括模糊、阴影、噪音等等。许多人用 GIMP 来修复损坏的照片,提高图像质量,裁剪图像中不需要的部分,制作海报和各种图形设计作品,等等。此外,你还可以在 GIMP 中添加插件和脚本,使其功能更加全面。 + +![][5] + +更多信息请见此链接:: + +### Inkscape + +Inkscape 是一个流行的开源应用程序,用于创建和编辑矢量图。它是一个功能丰富的矢量图形编辑器,这使它可以与其他类似的专有应用程序(如 Adobe Illustrator 和 Corel Draw)相竞争。正因为如此,许多专业插画师使用它来创建基于矢量的艺术作品。 + +你可以用 Inkscape 制作艺术和技术插图,如标志、图表、图标、桌面壁纸、流程图、漫画等等。此外,Inkscape 可以处理各种图形文件格式。此外,你还可以添加附加组件,使你的工作更容易。 + +![][6] + +更多信息请见此链接: + +### Krita + +Krita 乍一看像 GIMP 或 Inkscape。但实际上,它是一个完全不同的应用程序,尽管它有一些类似的功能。Krita 是一款用于创作像艺术家那样的数字绘画的应用程序。你可以用 Krita 来制作概念艺术、插图、漫画、纹理和哑光画。 + +Krita 有 100 多个预装的专业画笔。它还有一个画笔稳定器功能,有 3 种不同的方式来平滑和稳定你的画笔笔触。此外,你可以用 9 种以上的独特画笔引擎来定制你的画笔。Krita 是那些喜欢进行数字绘画的人的合适应用。 + +![][7] + +更多信息可在此链接获得: + +### darktable + +darktable 是摄影师或那些想提高照片质量的人的完美选择。darktable 更侧重于图像编辑,特别是对 RAW 图像的非破坏性后期制作。因此,它提供专业的色彩管理,支持自动检测显示配置文件。此外,你还可以用 darktable 过滤和排序多张图片。所以你可以通过标签、评级、颜色标签等来搜索你的收藏。它可以导入各种图像格式,如 JPEG、CR2、NEF、HDR、PFM、RAF 等。 + +![][8] + +更多信息可在此链接中获得: + +### 总结 + +这篇文章介绍了四个图像编辑器,你可以在 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 diff --git a/published/202109/20210819 A guide to understanding your team-s implicit values and needs.md b/published/202109/20210819 A guide to understanding your team-s implicit values and needs.md new file mode 100644 index 0000000000..b883d98c6f --- /dev/null +++ b/published/202109/20210819 A guide to understanding your team-s implicit values and needs.md @@ -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 diff --git a/published/202109/20210819 Debian vs Ubuntu- What-s the Difference- Which One Should You Use.md b/published/202109/20210819 Debian vs Ubuntu- What-s the Difference- Which One Should You Use.md new file mode 100644 index 0000000000..3468fcc4c2 --- /dev/null +++ b/published/202109/20210819 Debian vs Ubuntu- What-s the Difference- Which One Should You Use.md @@ -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](个人软件包存档Personal Package Archive)。通过 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)。 + +所以它也被称为 “通用操作系统universal operating system”。 + +#### 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/ diff --git a/published/202109/20210820 Check file status on Linux with the stat command.md b/published/202109/20210820 Check file status on Linux with the stat command.md new file mode 100644 index 0000000000..551d34a53f --- /dev/null +++ b/published/202109/20210820 Check file status on Linux with the stat command.md @@ -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 diff --git a/published/202109/20210820 How to Download Audio Only Using youtube-dl.md b/published/202109/20210820 How to Download Audio Only Using youtube-dl.md new file mode 100644 index 0000000000..fd70c1524c --- /dev/null +++ b/published/202109/20210820 How to Download Audio Only Using youtube-dl.md @@ -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 diff --git a/published/202109/20210821 10 Things to Do After Installing elementary OS 6 -Odin.md b/published/202109/20210821 10 Things to Do After Installing elementary OS 6 -Odin.md new file mode 100644 index 0000000000..b713a04e1a --- /dev/null +++ b/published/202109/20210821 10 Things to Do After Installing elementary OS 6 -Odin.md @@ -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 +``` + +安装后打开系统设置,你可以在那里找到 “调整Tweaks” 选项。 + +[这里][5] 提供了更详细的安装指南(如果你需要了解更多信息)。 + +### 4、配置 Dock + +Dock 是整个桌面的中心。老实说,Dock 中默认包含的应用并不常用,因此你可以通过以下步骤配置 Dock 中的项目。 + + * 移除:右键单击并取消 “在 Dock 中驻留Keep in Dock” 选项。 + * 添加新的项目:单击顶部的应用程序。然后右键单击你想要放在 Dock 的应用图标。选择 “添加到 DockAdd to Dock”。 + +在我看来,你应该至少把文件管理、截图工具、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 + diff --git a/published/202109/20210821 How to set up your printer on Linux.md b/published/202109/20210821 How to set up your printer on Linux.md new file mode 100644 index 0000000000..6e56331207 --- /dev/null +++ b/published/202109/20210821 How to set up your printer on Linux.md @@ -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) + +即使未来已来,电子墨水e-ink和 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) + +通用打印驱动系统Common Unix Printing System(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/ + diff --git a/published/202109/20210823 Apps for daily needs part 4- audio editors.md b/published/202109/20210823 Apps for daily needs part 4- audio editors.md new file mode 100644 index 0000000000..782b51296d --- /dev/null +++ b/published/202109/20210823 Apps for daily needs part 4- audio editors.md @@ -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] + +在过去,音频编辑应用或数字音频工作站digital audio workstation(DAW)只提供给专业人士使用,如唱片制作人、音响工程师和音乐家。但现在很多不是专业人士的人也需要它们。这些工具被用于演示文稿解说、视频博客,甚至只是作为一种爱好。现在尤其如此,因为有这么多的在线平台,方便大家分享音频作品,如音乐、歌曲、播客等。本文将介绍一些你可以在 Fedora Linux 上使用的开源音频编辑器或 DAW。你可能需要安装提到的软件。如果你不熟悉如何在 Fedora Linux 中添加软件包,请参阅我之前的文章[安装 Fedora 34 工作站后要做的事情][4]。这里列出了音频编辑器或 DAW 类的一些日常需求的应用。 + +### Audacity + +我相信很多人已经知道 Audacity 了。它是一个流行的多轨音频编辑器和录音机,可用于对所有类型的音频进行后期处理。大多数人使用 Audacity 来记录他们的声音,然后进行编辑,使其成品更好。其成品可以作为播客或视频博客的解说词。此外,人们还用 Audacity 来创作音乐和歌曲。你可以通过麦克风或调音台录制现场音频。它还支持 32 位的声音质量。 + +Audacity 有很多功能,可以支持你的音频作品。它有对插件的支持,你甚至可以自己编写插件。Audacity 提供了许多内置效果,如降噪、放大、压缩、混响、回声、限制器等。你可以利用实时预览功能在直接聆听音频的同时尝试这些效果。内置的插件管理器可以让你管理经常使用的插件和效果。 + +![][5] + +详情请参考此链接: + +### LMMS + +LMMS(即 Linux 多媒体工作室Linux MultiMedia Studio)是一个全面的音乐创作应用。你可以从头使用 LMMS 用你的电脑开始制作你的音乐。你可以根据自己的创意创造旋律和节拍,并通过选择声音乐器和各种效果使其更加完美。有几个与乐器和效果有关的内置功能,如 16 个内置合成器、嵌入式 ZynAddSubFx、支持插入式 VST 效果插件、捆绑图形和参数均衡器、内置分析器等等。LMMS 还支持 MIDI 键盘和其他音频外围设备。 + +![][6] + +详情请参考此链接: + +### Ardour + +Ardour 作为一个全面的音乐创作应用,其功能与 LMMS 相似。它在其网站上说,Ardour 是一个 DAW 应用,是来自世界各地的音乐家、程序员和专业录音工程师合作的结果。Ardour 拥有音频工程师、音乐家、配乐编辑和作曲家需要的各种功能。 + +Ardour 提供了完整的录音、编辑、混音和输出功能。它有无限的多声道音轨、无限撤销/重做的非线性编辑器、一个全功能的混音器、内置插件等。Ardour 还包含视频播放工具,所以使用它为视频项目创建和编辑配乐也很有帮助。 + +![][7] + +详情请参考此链接: + +### TuxGuitar + +TuxGuitar 是一款指法谱和乐谱编辑器。它配备了指法编辑器、乐谱查看器、多轨显示、拍号管理和速度管理。它包括弯曲、滑动、颤音等各种效果。虽然 TuxGuitar 专注于吉他,但它也可以为其他乐器写乐谱。它也能够作为一个基本的 MIDI 编辑器。你需要对指法谱和乐谱有一定的了解才能使用它。 + +![][8] + +详情请参考此链接: + +### 总结 + +本文章介绍了四款音频编辑器,可以满足你在 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 diff --git a/published/202109/20210824 Ulauncher- A Super Useful Application Launcher for Linux.md b/published/202109/20210824 Ulauncher- A Super Useful Application Launcher for Linux.md new file mode 100644 index 0000000000..b6fced4284 --- /dev/null +++ b/published/202109/20210824 Ulauncher- A Super Useful Application Launcher for Linux.md @@ -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 diff --git a/published/202109/20210826 Elementary OS 6 Odin Review - Late Arrival but a Solid One.md b/published/202109/20210826 Elementary OS 6 Odin Review - Late Arrival but a Solid One.md new file mode 100644 index 0000000000..906a2faf90 --- /dev/null +++ b/published/202109/20210826 Elementary OS 6 Odin Review - Late Arrival but a Solid One.md @@ -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 diff --git a/published/202109/20210827 How to Easily Install Debian Linux.md b/published/202109/20210827 How to Easily Install Debian Linux.md new file mode 100644 index 0000000000..e72e6b8f6e --- /dev/null +++ b/published/202109/20210827 How to Easily Install Debian Linux.md @@ -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],那么创建临场Live USB 盘的步骤有一点不同。 + +#### 步骤 1:获取正确的 Debian ISO 镜像 + +在安装 Debian 过程中,选择正确的 ISO 镜像就已经成功一半了。令人惊讶的是,对于一个新的 Debian 用户来说,要浏览 Debian 的网站并找到最轻松好用的 ISO 真的很困难。 + +如果你点击 Debian 官网的下载按钮,它会下载一个最小化的网络安装文件,这对普通用户来说是非常复杂的。请 **不要** 使用这个。 + +反而,你应该用临场Live 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]。 + +有些机器如果启用了安全启动secure boot功能,就不允许从临场 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 作为你电脑上唯一的操作系统来安装。 + +最简单的方法是直接选择 “擦除磁盘Erase Disk”。除了必须的 ESP 分区和交换分区外,Debian 会把其他所有东西都放在根挂载点(`/`)上。实际上,下面显示了你所选的安装方式后的磁盘布局。 + +![磁盘分区][25] + +如果你想把事情掌握在自己手中,你也可以选择手动分区,选择分配给 `/`、`/home`、`/boot` 或交换分区的大小。只有在你知道自己在做什么时,才可以这样做。 + +下一界面,你需要提供用户名和密码。但它不会设置 root 的密码,并将其保持为空。 + +![设置用户名和密码][26] + +这也意味着你可以用新创建的用户使用 `sudo` 。在“复杂的 Debian 安装”中,你也可以设置 root 密码,但这样你就必须手动将普通用户添加到 `sudoer` 列表。看看,这种安装过程是不是对新手来说很容易? + +在继续实际安装之前,它会呈现你所做的选择的汇总信息。如果没有问题,就可以点击“安装Install”按钮。 + +![安装配置的汇总信息][27] + +现在只需要等待安装完成。 + +![安装 Debian][28] + +几分钟后就会完成安装。当安装完成,它会提示重启。 + +![完成 Debian 安装][29] + +重启系统后如果一切顺利,你应该可以看到 Debian 的 GRUB 界面。 + +![Debian 启动画面][30] + +### 疑难解答(如果系统没有启动到 Debian) + +我遇到情况是,我的 Dell 系统不能识别任何要引导的操作系统。这很奇怪,我看见 Debian 经创建了一个 ESP 分区。 + +如果你也是同样的情况,进去 BIOS 配置里。检查启动顺序Boot Sequence,如果你看不到任何东西,就点击“新增引导选项Add Boot Option”。 + +![增加新的启动选项][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 diff --git a/published/202109/20210827 Linux kernel modules we can-t live without.md b/published/202109/20210827 Linux kernel modules we can-t live without.md new file mode 100644 index 0000000000..ddcdd82d5c --- /dev/null +++ b/published/202109/20210827 Linux kernel modules we can-t live without.md @@ -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 的。参见: + + * + * + +知道别人无法看到你的磁盘上的内容是非常棒的,例如,如果你的笔记本丢失或被盗时。 + +— [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 diff --git a/published/202109/20210829 Position text on your screen in Linux with ncurses.md b/published/202109/20210829 Position text on your screen in Linux with ncurses.md new file mode 100644 index 0000000000..7e1d61b25f --- /dev/null +++ b/published/202109/20210829 Position text on your screen in Linux with ncurses.md @@ -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 的名称就来自于术语 “光标控制cursor control”。多年以后,其他人编写了新的 curses 版本用来添加新的功能,新版本被叫做 “new curses” 或者 “ncurses”。你可以在每个流行的 Linux 发行版中找到 ncurses。尽管默认情况下可能未安装开发库、头文件和文档。例如,在 Fedora 上,你需要使用以下命令安装 `ncurses-devel` 包: + +``` +$ sudo dnf install ncurses-devel +``` + +### 在程序中使用 ncurses + +要在屏幕上直接寻址,你首先需要初始化 `ncurses` 库。大部分程序会通过以下三行来做到这一点: + + * `initscr()`:初始化窗口对象和 ncurses 代码,返回代表整个屏幕的窗口对象 + * `cbreak()`:禁用缓冲并使键入的输入立即可用 + * `noecho()`:关闭回显,因此用户输入不会显示在屏幕上 + +这些函数定义在 `curses.h` 头文件中,你需要在你的程序中通过以下方式将其包含进来: + +``` +#include +``` + +初始化终端后,你可以自由使用任何 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 + +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 diff --git a/published/202109/20210830 Linux Jargon Buster- What is sudo rm -rf- Why is it Dangerous.md b/published/202109/20210830 Linux Jargon Buster- What is sudo rm -rf- Why is it Dangerous.md new file mode 100644 index 0000000000..be034f13b5 --- /dev/null +++ b/published/202109/20210830 Linux Jargon Buster- What is sudo rm -rf- Why is it Dangerous.md @@ -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 /`。我认为这些白痴在这种邪恶行为中得到了某种至上主义的满足。我会立即将他们从我管理的论坛和群组中踢出去。 + +我希望这篇文章能让你更清楚地了解这些情况。你有可能仍然有一些困惑,特别是因为它涉及到根目录、文件权限和其他新用户可能不熟悉的东西。如果是这样的话,请在评论区告诉我你的疑惑,我会尽力去解决。 + +最后,请记住。不要喝酒胡搞Don’t drink and root。在运行你的 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 diff --git a/published/202109/20210830 Write a guessing game in ncurses on Linux.md b/published/202109/20210830 Write a guessing game in ncurses on Linux.md new file mode 100644 index 0000000000..581e629460 --- /dev/null +++ b/published/202109/20210830 Write a guessing game in ncurses on Linux.md @@ -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 ; +#include ;          /* for strlen */ +#include ;      /* 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 diff --git a/published/202109/20210831 What is a container image.md b/published/202109/20210831 What is a container image.md new file mode 100644 index 0000000000..7f3729f419 --- /dev/null +++ b/published/202109/20210831 What is a container image.md @@ -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 运维的一个关键部分。容器镜像container image包含了一个打包的应用,以及它的依赖关系,还有它在启动时运行的进程信息。 + +你可以通过提供一组特殊格式的指令来创建容器镜像,可以是提交给注册中心Registry,或者是作为 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 +``` + +这个文件中的每条指令都会在容器镜像中增加一个layer。每一层只增加与下面一层的区别,然后,所有这些堆叠在一起,形成一个只读的容器镜像。 + +### 它是如何工作的? + +你需要知道一些关于容器镜像的事情,按照这个顺序理解这些概念很重要: + + 1. 联合文件系统 + 2. 写入时复制(COW) + 3. 叠加文件系统 + 4. 快照器 + +### 联合文件系统 + +联合文件系统Union File System(UnionFS)内置于 Linux 内核中,它允许将一个文件系统的内容与另一个文件系统的内容合并,同时保持“物理”内容的分离。其结果是一个统一的文件系统,即使数据实际上是以分支形式组织。 + +这里的想法是,如果你有多个镜像有一些相同的数据,不是让这些数据再次复制过来,而是通过使用一个叫做layer的东西来共享。 + +![UnionFS][2] + +每一层都是一个可以在多个容器中共享的文件系统,例如,httpd 基础层是 Apache 的官方镜像,可以在任何数量的容器中使用。想象一下,由于我们在所有的容器中使用相同的基础层,我们节省了多少磁盘空间。 + +这些镜像层总是只读的,但是当我们用这个镜像创建一个新的容器时,我们会在它上面添加一个薄的可写层。这个可写层是你创建、修改、删除或进行每个容器所需的其他修改的地方。 + +### 写时复制(COW) + +当你启动一个容器时,看起来好像这个容器有自己的整个文件系统。这意味着你在系统中运行的每个容器都需要自己的文件系统副本。这岂不是要占用大量的磁盘空间,而且还要花费大量的时间让容器启动?不是的,因为每个容器都不需要它自己的文件系统副本! + +容器和镜像使用写时复制copy-on-write(COW)机制来实现这一点。写时复制策略不是复制文件,而是将同一个数据实例分享给多个进程,并且只在一个进程需要修改或写入数据时进行复制。所有其他进程将继续使用原始数据。 + +Docker 对镜像和容器都使用了写时复制的机制。为了做到这一点,在旧版本中,镜像和运行中的容器之间的变化是通过图驱动graph driver来跟踪的,现在则是通过快照器snapshotter来跟踪。 + +在运行中的容器中执行任何写操作之前,要修改的文件的副本被放在容器的可写层上。这就是发生 _写_ 的地方。现在你知道为什么它被称为“写时复制”了么。 + +这种策略既优化了镜像磁盘空间的使用,也优化了容器启动时间的性能,并与 UnionFS 一起工作。 + +### 叠加文件系统 + +叠加文件系统Overlay File System位于现有文件系统的顶部,结合了上层和下层的目录树,并将它们作为一个单一的目录来呈现。这些目录被称为layer。下层保持不被修改。每一层只增加与下一层的差异(计算机术语为 “diff”),这种统一的过程被称为联合挂载union mount。 + +最低的目录或镜像层被称为下层目录lowerdir,上面的目录被称为 上层目录upperdir。最后的覆盖层或统一层被称为合并层merged。 + +![Layered file system][3] + +常见的术语包括这些层的定义: + + * 基础层Base layer:是你的文件系统的文件所在的地方。就容器镜像而言,这个层就是你的基础镜像。 + * 叠加层Overlay layer:通常被称为容器层container layer,因为对运行中的容器所做的所有改变,如添加、删除或修改文件,都会写到这个可写层。对这一层所做的所有修改都存储在下一层,是基础层和差异层的联合视图。 + * 差异层Diff layer包含了在叠加层所作的所有修改。如果你写的东西已经在基础层了,那么叠加文件系统就会把文件复制到差异层,并做出你想写的修改。这被称为写时复制。 + +### 快照器 + +通过使用层和图驱动,容器可以将其更改作为其容器文件系统的一部分来构建、管理和分发。但是使用图驱动graph driver的工作真的很复杂,而且容易出错。快照器SnapShotter与图驱动不同,因为它们不用了解镜像或容器。 + +快照器的工作方式与 Git 非常相似,比如有树的概念,并跟踪每次提交对树的改变。一个快照snapshot代表一个文件系统状态。快照有父子关系,使用一组目录。可以在父级和其快照之间进行差异比较(`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 diff --git a/published/202109/20210831 Zulip- An Interesting Open-Source Alternative to Slack.md b/published/202109/20210831 Zulip- An Interesting Open-Source Alternative to Slack.md new file mode 100644 index 0000000000..edbf0cdbbe --- /dev/null +++ b/published/202109/20210831 Zulip- An Interesting Open-Source Alternative to Slack.md @@ -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/ diff --git a/published/202109/20210901 20 essential Linux commands for every user.md b/published/202109/20210901 20 essential Linux commands for every user.md new file mode 100644 index 0000000000..61ef6c4baf --- /dev/null +++ b/published/202109/20210901 20 essential Linux commands for every user.md @@ -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` 命令代表变更目录change directory,是用户在 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` 代表打印工作目录print working directory,这正是它的作用。`--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] 是连接concatenate的缩写,它曾因为能将若干小文件合并而显得非常有用,这些小文件可能是由于大小限制而(使用 `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 diff --git a/published/202109/20210901 What are container runtimes.md b/published/202109/20210901 What are container runtimes.md new file mode 100644 index 0000000000..9119fc9aeb --- /dev/null +++ b/published/202109/20210901 What are container runtimes.md @@ -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] 时,我们讨论了容器的基本原理,但现在是深入研究容器运行时runtime的时候了,从而了解容器环境是如何构建的。本文的部分信息摘自 开放容器计划Open Container Initiative(OCI)的 [官方文档][3],所以无论使用何种容器引擎,这些信息都是一致的。 + +### 容器运行机制 + +那么,当你运行 `podman run` 或 `docker run` 命令时,在后台到底发生了什么?一个分步的概述如下: + + 1. 如果本地没有镜像,则从镜像登记仓库registry拉取镜像 + 2. 镜像被提取到一个写时复制(COW)的文件系统上,所有的容器层相互堆叠以形成一个合并的文件系统 + 3. 为容器准备一个挂载点 + 4. 从容器镜像中设置元数据,包括诸如覆盖 `CMD`、来自用户输入的 `ENTRYPOINT`、设置 SECCOMP 规则等设置,以确保容器按预期运行 + 5. 提醒内核为该容器分配某种隔离,如进程、网络和文件系统(命名空间namespace) + 6. 提醒内核为改容器分配一些资源限制,如 CPU 或内存限制(控制组cgroup) + 7. 传递一个系统调用syscall给内核用于启动容器 + 8. 设置 SELinux/AppArmor + +容器运行时负责上述所有的工作。当我们提及容器运行时,想到的可能是 runc、lxc、containerd、rkt、cri-o 等等。嗯,你没有错。这些都是容器引擎和容器运行时,每一种都是为不同的情况建立的。 + +容器运行时Container runtime更侧重于运行容器,为容器设置命名空间和控制组(cgroup),也被称为底层容器运行时。高层的容器运行时或容器引擎专注于格式、解包、管理和镜像共享。它们还为开发者提供 API。 + +### 开放容器计划(OCI) + +开放容器计划Open Container Initiative(OCI)是一个 Linux 基金会的项目。其目的是设计某些开放标准或围绕如何与容器运行时和容器镜像格式工作的结构。它是由 Docker、rkt、CoreOS 和其他行业领导者于 2015 年 6 月建立的。 + +它通过两个规范来完成如下任务: + +#### 1、镜像规范 + +该规范的目标是创建可互操作的工具,用于构建、传输和准备运行的容器镜像。 + +该规范的高层组件包括: + + * [镜像清单][4] — 一个描述构成容器镜像的元素的文件 + * [镜像索引][5] — 镜像清单的注释索引 + * [镜像布局][6] — 一个镜像内容的文件系统布局 + * [文件系统布局][7] — 一个描述容器文件系统的变更集 + * [镜像配置][8] — 确定镜像层顺序和配置的文件,以便转换成 [运行时捆包][9] + * [转换][10] — 解释应该如何进行转换的文件 + * [描述符][11] — 一个描述被引用内容的类型、元数据和内容地址的参考资料 + +#### 2、运行时规范 + +该规范用于定义容器的配置、执行环境和生命周期。`config.json` 文件为所有支持的平台提供了容器配置,并详细定义了用于创建容器的字段。在详细定义执行环境时也描述了为容器的生命周期定义的通用操作,以确保在容器内运行的应用在不同的运行时环境之间有一个一致的环境。 + +Linux 容器规范使用了各种内核特性,包括命名空间namespace控制组cgroup权能capability、LSM 和文件系统隔离jail等来实现该规范。 + +### 小结 + +容器运行时是通过 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 diff --git a/published/202109/20210902 4 Linux technologies fundamental to containers.md b/published/202109/20210902 4 Linux technologies fundamental to containers.md new file mode 100644 index 0000000000..0a719929b2 --- /dev/null +++ b/published/202109/20210902 4 Linux technologies fundamental to containers.md @@ -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 + +### 命名空间 + +命名空间namespace 为容器提供了一个隔离层,给容器提供了一个看起来是独占的 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//mounts` 位置找到每个容器进程的挂载点。 + +#### UTS + +Unix 分时系统Unix Timeharing System(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 + +进程间通信Inter-Process Communication(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 + +进程 IDProcess ID(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: 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 意思是“安全计算secure computing”。它是一项 Linux 功能,用于限制应用程序进行的系统调用的集合。例如,Docker 的默认 seccomp 配置文件禁用了大约 44 个系统调用(总计超过 300 个)。 + +这里的思路是让容器只访问所必须的资源。例如,如果你不需要容器改变主机上的时钟时间,你可能不会使用 `clock_adjtime` 和 `clock_settime` 系统调用,屏蔽它们是合理的。同样地,你不希望容器改变内核模块,所以没有必要让它们使用 `create_module`、 `delete_module` 系统调用。 + +### SELinux + +SELinux 是“安全增强的 Linuxsecurity-enhanced Linux”的缩写。如果你在你的宿主机上运行的是 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 diff --git a/published/202109/20210904 How to Install Dropbox on Ubuntu Linux.md b/published/202109/20210904 How to Install Dropbox on Ubuntu Linux.md new file mode 100644 index 0000000000..450681de4c --- /dev/null +++ b/published/202109/20210904 How to Install Dropbox on Ubuntu Linux.md @@ -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] + +如果你想节省磁盘空间或带宽,你可以进入偏好设置并选择选择性同步Selective Sync选项。该选项允许你只在本地系统上同步来自 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 diff --git a/published/202109/20210905 Neither Windows, nor Linux- Shrine is ‘God-s Operating System.md b/published/202109/20210905 Neither Windows, nor Linux- Shrine is ‘God-s Operating System.md new file mode 100644 index 0000000000..aac67eb493 --- /dev/null +++ b/published/202109/20210905 Neither Windows, nor Linux- Shrine is ‘God-s Operating System.md @@ -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/ diff --git a/published/202109/20210906 Getting the Top Indicator Panel Back in GNOME.md b/published/202109/20210906 Getting the Top Indicator Panel Back in GNOME.md new file mode 100644 index 0000000000..784a213bb9 --- /dev/null +++ b/published/202109/20210906 Getting the Top Indicator Panel Back in GNOME.md @@ -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 diff --git a/published/202109/20210906 Resize an image from the Linux terminal.md b/published/202109/20210906 Resize an image from the Linux terminal.md new file mode 100644 index 0000000000..c3438f6d0e --- /dev/null +++ b/published/202109/20210906 Resize an image from the Linux terminal.md @@ -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 diff --git a/published/202109/20210907 How to Stop a Program in Linux Terminal.md b/published/202109/20210907 How to Stop a Program in Linux Terminal.md new file mode 100644 index 0000000000..e9856a16c0 --- /dev/null +++ b/published/202109/20210907 How to Stop a Program in Linux Terminal.md @@ -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/ \ No newline at end of file diff --git a/published/202109/20210907 OpenWrt 21.02 Arrives With Linux Kernel 5.4 - WPA3 Support.md b/published/202109/20210907 OpenWrt 21.02 Arrives With Linux Kernel 5.4 - WPA3 Support.md new file mode 100644 index 0000000000..d0e2b53289 --- /dev/null +++ b/published/202109/20210907 OpenWrt 21.02 Arrives With Linux Kernel 5.4 - WPA3 Support.md @@ -0,0 +1,92 @@ +[#]: subject: "OpenWrt 21.02 Arrives With Linux Kernel 5.4 & WPA3 Support" +[#]: via: "https://news.itsfoss.com/openwrt-21-02-release/" +[#]: author: "Rishabh Moharir https://news.itsfoss.com/author/rishabh/" +[#]: collector: "lujun9972" +[#]: translator: "wxy" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13763-1.html" + +OpenWrt 21.02 发布,支持 Linux 内核 5.4 和 WPA3 +====== + +![](https://i2.wp.com/news.itsfoss.com/wp-content/uploads/2021/09/OpenWrt-21.02.jpg?w=1200&ssl=1) + +OpenWrt 社区宣布了该发行版的最新稳定版本:OpenWrt 21.02。 + +补充一句,OpenWrt 是一个帮助你创建嵌入式设备定制操作系统的项目。 + +它使用户能够根据他们的网络需求公开定制他们的设备,这是市面上销售的路由器的固件所没有的功能。除了路由器之外,OpenWrt 还可以在各种设备上运行,如智能手机、住宅网关,甚至是 32 位的个人电脑。 + +自从旧的 OpenWrt 19.07 以来,这个版本的发布带来了超过 5800 个新提交。 + +让我们来看看 OpenWrt 21.02 有哪些新功能。 + +### OpenWrt 21.02 有什么新内容? + +虽然有一些技术上的变化和改进,但让我强调一下主要的新增内容。 + +#### WPA3 支持 + +虽然在 19.07 版本中就已经存在,但这个最新的 Wi-Fi 网络安全标准现在已默认包含在镜像中了。 + +WPA3 的意思是Wi-Fi 受保护接入第三版Wi-Fi Protected Access 3,与流行的 WPA2 相比,在安全方面有很大的改进,也向后兼容。 + +#### TLS 和 HTTPS 支持 + +就像 WPA3 一样,它也默认包括了 TLS 和 HTTPS 支持,并且带有来自 Mozilla 的可信 CA 证书。 + +有了这个支持,无需其它工作,`wget` 和 ` opkg` 现在可以通过 HTTPS 获取资源了。此外,除了 HTTP 之外,[LuCl][1] 也可以通过 HTTPS 获得。 + +#### 初步的 DSA 支持 + +正如其发布公告中所说: + +> “DSA(分布式交换机架构Distributed Switch Architecture)是关于可配置的以太网交换机的 Linux 标准。” + +这取代了直到现在还在使用的 `swconfig` 系统,是对 VLAN 和交换机端口管理方式的一个明显变化。 + +#### 新的最低硬件要求 + +随着 OpenWrt 的众多新功能和更新,以及 Linux 内核的大小的普遍增加,其最低硬件要求也被提高。 + +现在设备需要至少 8MB 的闪存和 64MB 的内存来运行默认的构建版本,以确保适当的稳定性。 + +#### 软件包更新 + +该版本还包含了几个软件包的升级,其中一些是: + + * Linux 内核 5.4.143 + * gcc 8.4.0 + * glibc 2.33 + * binutils 2.34 + * busybox 1.33.1 + +除了上述列出的软件包,还有许多其他软件包也得到了升级。你可以在 [官方发布公告][2] 中了解完整的技术细节。 + +### 下载 OpenWrt 21.02 + +你可以前往其官方网站下载最新的稳定版,或者选择开发快照进行实验。 + +构建自己的软件包和固件的说明应该可以在其文档中找到。 + +可以使用 `sysupgrade` 命令将你的系统从 OpenWrt 19.07 升级到 OpenWrt 21.02。请注意,你无法从 18.06 升级。 + +- [OpenWrt 21.02][3] + +-------------------------------------------------------------------------------- + +via: https://news.itsfoss.com/openwrt-21-02-release/ + +作者:[Rishabh Moharir][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://news.itsfoss.com/author/rishabh/ +[b]: https://github.com/lujun9972 +[1]: https://openwrt.org/docs/techref/luci +[2]: https://openwrt.org/releases/21.02/notes-21.02.0 +[3]: https://openwrt.org/downloads diff --git a/published/202109/20210907 Run Web Applications in Linux Using Tangram Browser.md b/published/202109/20210907 Run Web Applications in Linux Using Tangram Browser.md new file mode 100644 index 0000000000..3d22db8010 --- /dev/null +++ b/published/202109/20210907 Run Web Applications in Linux Using Tangram Browser.md @@ -0,0 +1,92 @@ +[#]: subject: "Run Web Applications in Linux Using Tangram Browser" +[#]: via: "https://itsfoss.com/tangram/" +[#]: author: "Ankush Das https://itsfoss.com/author/ankush/" +[#]: collector: "lujun9972" +[#]: translator: "anine09" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13777-1.html" + +使用 Tangram 浏览器在 Linux 中运行 Web 应用 +======= + +> Tangram 是一个旨在帮助你在 Linux 中运行和管理 Web 应用的浏览器。一起来看看它是如何使用的吧。 + +对于一些工具来说,即使我们有许多 Linux 原生应用,但是许多人最终还是选择使用 Web 应用。 + +他们也许是使用 Electron 构建的应用,或是直接在浏览器中打开的网页,使用原生应用正在成为一种比较“传统”的做法。 + +当然,不管在什么平台运行 Web 应用都会占用更多的系统资源。而且,考虑到每一个服务都正在提供基于 Web 的方式,而不是原生体验,我们就需要一种有效管理 Web 应用的解决方案。 + +一款开源的 Linux 应用 Tangram 或许就是这个解决方案。 + +### Tangram:专为 Web 应用设计的浏览器 + +![][1] + +你可以选择其他 [优秀的浏览器][2] 来运行 Web 应用,但是如果你想完全专注于 Web 应用体验的浏览器,Tangram 是个不错的选择。 + +Tangram 的开发者从 GNOME Web、[Franz][3] 和 [Rambox][4] 中获得了灵感。 + +没有其他花里胡哨的功能,只是能更改你的用户代理User Agent和管理你所登录的 Web 应用。 + +它可以用于访问多个社交媒体,聊天工具,工作协同应用等等。 + +### Tangram 的特性 + +![][5] + +考虑到 Tangram 是一个基于 WebKitGTK 的精简化浏览器,它拥有的功能不算很多,下面是一些功能要点: + + * 重新排列侧边栏的标签 + * 方便地将任何一个 Web 服务添加为 Web 应用程序 + * 调整用户代理(桌面端和移动端) + * 使用键盘快捷键 + * 改变侧边栏(标签栏)的位置 + +你所需要做的就是加载一个 Web 服务,登录,然后点击“完成”,将其添加为 Web 应用程序。 + +![][6] + +### 在 Linux 中安装 Tangram + +每个 Linux 发行版都可以通过 Flatpak 来安装 Tangram,你也可以在 [AUR][7] 中找到它。 + +如果你想通过终端来安装它,输入以下命令: + +``` +flatpak install flathub re.sonny.Tangram +``` + +如果你的系统没有启用 Flatpak,你可以参考我们的 [Flatpak 指南][8]。 + +想要了解更多信息,请访问 [Tangram 的 Github 页面][9]。 + +- [Tangram Browser][10] + +你试过 Tangram 吗?你更喜欢 Web 应用还是原生应用?欢迎在下面的评论中分享你的想法。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/tangram/ + +作者:[Ankush Das][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://itsfoss.com/author/ankush/ +[b]: https://github.com/lujun9972 +[1]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/09/tangram-web-app-browser.png?resize=800%2C611&ssl=1 +[2]: https://itsfoss.com/best-browsers-ubuntu-linux/ +[3]: https://itsfoss.com/franz-messaging-app/ +[4]: https://itsfoss.com/rambox/ +[5]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/09/tangram-settings.png?resize=530%2C290&ssl=1 +[6]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/09/tangram-web-app-whatsapp.png?resize=800%2C431&ssl=1 +[7]: https://itsfoss.com/aur-arch-linux/ + +[8]: https://itsfoss.com/flatpak-guide/ +[9]: https://github.com/sonnyp/Tangram +[10]: https://flathub.org/apps/details/re.sonny.Tangram diff --git a/published/202109/20210907 Use lspci on Linux to see your hardware.md b/published/202109/20210907 Use lspci on Linux to see your hardware.md new file mode 100644 index 0000000000..1e0d130b60 --- /dev/null +++ b/published/202109/20210907 Use lspci on Linux to see your hardware.md @@ -0,0 +1,150 @@ +[#]: subject: "Use lspci on Linux to see your hardware" +[#]: via: "https://opensource.com/article/21/9/lspci-linux-hardware" +[#]: author: "Alan Formy-Duval https://opensource.com/users/alanfdoss" +[#]: collector: "lujun9972" +[#]: translator: "unigeorge" +[#]: reviewer: "turbokernel" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13793-1.html" + +在 Linux 上使用 lspci 命令查看硬件情况 +====== + +> lspci 命令用于显示 Linux 系统上的设备和驱动程序。 + +![](https://img.linux.net.cn/data/attachment/album/202109/17/091425l7c8au5c865x7q68.jpg) + +当你在个人电脑或服务器上运行 Linux 时,有时需要识别该系统中的硬件。`lspci` 命令用于显示连接到 PCI 总线的所有设备,从而满足上述需求。该命令由 [pciutils][2] 包提供,可用于各种基于 Linux 和 BSD 的操作系统。 + +### 基础用法 + +由于访问权限,普通用户运行 `lspci` 时显示的信息可能会受限,因此可以使用 `sudo` 运行命令,系统会给出完整的信息图。 + +直接运行 `lspci` 命令会列出 PCI 总线及其连接的设备,下图是在我的媒体中心 PC 上的演示样例。图中是一个基于 AMD Phenom CPU 的系统,所以它有一个 AMD 芯片组,以及 Atheros 无线适配器和 Nvidia 显卡。所有硬件设备都列出了详细信息,例如供应商、名称和型号等: + +``` +$ sudo lspci +00:00.0 Host bridge: Advanced Micro Devices, Inc. [AMD] RS880 Host Bridge +00:02.0 PCI bridge: Advanced Micro Devices, Inc. [AMD] RS780 PCI to PCI bridge (ext gfx port 0) +00:04.0 PCI bridge: Advanced Micro Devices, Inc. [AMD] RS780/RS880 PCI to PCI bridge (PCIE port 0) +00:05.0 PCI bridge: Advanced Micro Devices, Inc. [AMD] RS780/RS880 PCI to PCI bridge (PCIE port 1) +00:11.0 SATA controller: Advanced Micro Devices, Inc. [AMD/ATI] SB7x0/SB8x0/SB9x0 SATA Controller [AHCI mode] +00:12.0 USB controller: Advanced Micro Devices, Inc. [AMD/ATI] SB7x0/SB8x0/SB9x0 USB OHCI0 Controller +00:12.1 USB controller: Advanced Micro Devices, Inc. [AMD/ATI] SB7x0 USB OHCI1 Controller +00:12.2 USB controller: Advanced Micro Devices, Inc. [AMD/ATI] SB7x0/SB8x0/SB9x0 USB EHCI Controller +00:13.0 USB controller: Advanced Micro Devices, Inc. [AMD/ATI] SB7x0/SB8x0/SB9x0 USB OHCI0 Controller +00:13.1 USB controller: Advanced Micro Devices, Inc. [AMD/ATI] SB7x0 USB OHCI1 Controller +00:13.2 USB controller: Advanced Micro Devices, Inc. [AMD/ATI] SB7x0/SB8x0/SB9x0 USB EHCI Controller +00:14.0 SMBus: Advanced Micro Devices, Inc. [AMD/ATI] SBx00 SMBus Controller (rev 3c) +00:14.1 IDE interface: Advanced Micro Devices, Inc. [AMD/ATI] SB7x0/SB8x0/SB9x0 IDE Controller +00:14.3 ISA bridge: Advanced Micro Devices, Inc. [AMD/ATI] SB7x0/SB8x0/SB9x0 LPC host controller +00:14.4 PCI bridge: Advanced Micro Devices, Inc. [AMD/ATI] SBx00 PCI to PCI Bridge +00:14.5 USB controller: Advanced Micro Devices, Inc. [AMD/ATI] SB7x0/SB8x0/SB9x0 USB OHCI2 Controller +00:18.0 Host bridge: Advanced Micro Devices, Inc. [AMD] Family 10h Processor HyperTransport Configuration +00:18.1 Host bridge: Advanced Micro Devices, Inc. [AMD] Family 10h Processor Address Map +00:18.2 Host bridge: Advanced Micro Devices, Inc. [AMD] Family 10h Processor DRAM Controller +00:18.3 Host bridge: Advanced Micro Devices, Inc. [AMD] Family 10h Processor Miscellaneous Control +00:18.4 Host bridge: Advanced Micro Devices, Inc. [AMD] Family 10h Processor Link Control +01:00.0 VGA compatible controller: NVIDIA Corporation GK107 [GeForce GTX 650] (rev a1) +01:00.1 Audio device: NVIDIA Corporation GK107 HDMI Audio Controller (rev a1) +02:00.0 Network controller: Qualcomm Atheros AR9287 Wireless Network Adapter (PCI-Express) (rev 01) +``` + +### 详细输出 + +添加 `-v` 选项会显示每个设备的详细信息,你可以使用 `-vv` 或 `-vvv` 来获取更多的设备细节。在 `-v` 级别,`lspci` 会显示所有设备的各种子系统和内存地址、中断请求(IRQ)编号和一些其他功能信息。输出信息会非常长。在你的系统上试一试吧。 + +### 使用 grep 过滤搜索 + +你可能会需要缩小搜索范围。例如,RPM Fusion 网站有安装 Nvidia 图形驱动程序的说明,里面就首先使用了 `grep` 命令来定位显卡信息。下面是我在笔记本电脑上得到的输出: + +``` +$ sudo lspci | grep -e VGA +00:02.0 VGA compatible controller: Intel Corporation UHD Graphics 620 (rev 07) +$ sudo lspci | grep -e 3D +01:00.0 3D controller: NVIDIA Corporation GM108M [GeForce MX130] (rev a2) +``` + +下面(LCTT 译注:原文为 “above”,应为作者笔误)的 `grep` 命令在我的媒体中心 PC 上定位了一个 VGA 设备,但没有显示 3D 设备。 + +``` +$ sudo lspci | grep -e VGA +01:00.0 VGA compatible controller: NVIDIA Corporation GK107 [GeForce GTX 650] (rev a1) +$ sudo lspci | grep -e 3D +$ +``` + +### 按供应商 ID 搜索 + +还有另一种无需 `grep` 的方法可以使用。假设我想确认一下此计算机是否有其他的 Nvidia 设备,在此之前我们还需要一些额外信息,使用 `-nn` 选项显示的供应商和设备 ID 号。在我的媒体中心 PC 上,此选项会给出我的 VGA 卡、供应商 ID 和设备 ID: + +``` +$ sudo lspci -nn | grep -e VGA +01:00.0 VGA compatible controller [0300]: NVIDIA Corporation GK107 [GeForce GTX 650] [10de:0fc6] (rev a1) +``` + +设备名称后的方括号内有用冒号分隔的数字,即供应商和设备 ID。输出表明 Nvidia Corporation 制造的设备的供应商 ID 为 `10de`。 + +`-d` 选项用于指定供应商、设备或类 ID 的所有设备。以下是我系统中的所有 Nvidia 设备(保留 `-nn` 以解析供应商 ID): + +``` +$ sudo lspci -nn -d 10de: +01:00.0 VGA compatible controller [0300]: NVIDIA Corporation GK107 [GeForce GTX 650] [10de:0fc6] (rev a1) +01:00.1 Audio device [0403]: NVIDIA Corporation GK107 HDMI Audio Controller [10de:0e1b] (rev a1) +``` + +从输出中可以看到,除了显卡之外,我还有一个 Nvidia 音频设备。实际上它们都属于同一张 **Nvidia GeForce GTX 650** 卡,但这仍然是一个很好的示例。 + +### 内核模块 + +结合 PCI 硬件设备,`lspci` 可以使用 `-k` 选项显示内核加载了哪些驱动程序模块。我将此选项添加到我的 `lspci` 命令来查看有关我的 Nvidia 设备的信息。 + +``` +$ sudo lspci -nn -k -d 10de: +01:00.0 VGA compatible controller [0300]: NVIDIA Corporation GK107 [GeForce GTX 650] [10de:0fc6] (rev a1) + Subsystem: eVga.com. Corp. GK107 [GeForce GTX 650] [3842:2650] + Kernel driver in use: nvidia + Kernel modules: nvidiafb, nouveau, nvidia_drm, nvidia +01:00.1 Audio device [0403]: NVIDIA Corporation GK107 HDMI Audio Controller [10de:0e1b] (rev a1) + Subsystem: eVga.com. Corp. GK107 HDMI Audio Controller [3842:2650] + Kernel driver in use: snd_hda_intel + Kernel modules: snd_hda_intel +``` + +可以看到额外显示了两行:正在使用的内核驱动程序Kernel driver in use内核模块Kernel modules,其中后者列出了可用于支持该设备的模块。 + +### 同步最新状态 + +新设备和供应商总是在不断迭代。如果看到显示为 `unknown` 的设备,说明你的 PCI 设备 ID 数据库可能已过时。有两种方法可以检查更新。`-Q` 选项会使用 DNS 查询中央数据库,当然,这需要联网。 + +``` +$ sudo lspci -Q +``` + +你还可以通过运行命令 `update-pciids` 来更新本地 PCI ID 数据库。 + +``` +$ sudo update-pciids +Downloaded daily snapshot dated 2021-08-22 03:15:01 +``` + +### 了解有关你的硬件的更多信息 + +当然,`lspci` 只是 Linux 中用于查询系统硬件和软件的诸多命令之一。读者可以在阅读关于 USB 设备的文章,了解有关 Linux 硬件的更多信息:[使用此 USB ID 存储库识别 Linux 上的更多设备][3]。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/9/lspci-linux-hardware + +作者:[Alan Formy-Duval][a] +选题:[lujun9972][b] +译者:[unigeorge](https://github.com/unigeorge) +校对:[turbokernel](https://github.com/turbokernel) + +本文由 [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/features_solutions_command_data.png?itok=4_VQN3RK (computer screen ) +[2]: https://mj.ucw.cz/sw/pciutils/ +[3]: https://opensource.com/article/20/8/usb-id-repository diff --git a/published/202109/20210908 Apps for daily needs part 5- video editors.md b/published/202109/20210908 Apps for daily needs part 5- video editors.md new file mode 100644 index 0000000000..b8fdeceee1 --- /dev/null +++ b/published/202109/20210908 Apps for daily needs part 5- video editors.md @@ -0,0 +1,78 @@ +[#]: subject: "Apps for daily needs part 5: video editors" +[#]: via: "https://fedoramagazine.org/apps-for-daily-needs-part-5-video-editors/" +[#]: author: "Arman Arisman https://fedoramagazine.org/author/armanwu/" +[#]: collector: "lujun9972" +[#]: translator: "wxy" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13808-1.html" + +满足日常需求的应用(五):视频编辑器 +====== + +![][1] + +视频编辑已经成为一种流行的活动。人们出于各种原因需要视频编辑,不管是工作、教育或仅仅是一种爱好。现在也有很多平台可以在互联网上分享视频,以及几乎所有的社交媒体和聊天工具都提供分享视频的功能。本文将介绍一些你可以在 Fedora Linux 上使用的开源视频编辑器。你可能需要安装提到的这些软件才能使用。如果你不熟悉如何在 Fedora Linux 中添加软件包,请参阅我之前的文章《[安装 Fedora 34 工作站后要做的事情][4]》。这里列出了视频编辑器类别的一些日常需求的应用程序。 + +### Kdenlive + +当有人问起 Linux 上的开源视频编辑器时,经常出现的答案是 Kdenlive。它是一个在开源用户群体中非常流行的视频编辑器。这是因为它的功能对于一般用途来说是足够的,而且对于非专业人士的人来说也很容易使用。 + +Kdenlive 支持多轨编辑,因此你可以将多个来源的音频、视频、图像和文本结合起来。这个应用程序还支持各种视频和音频格式,这样你就不必事先转换它们。此外,Kdenlive 提供了各种各样的效果和转场,以支持你的创造力来制作很酷的视频。Kdenlive 提供的一些功能有:用于创建 2D 字幕的字幕器、音频和视频范围、代理编辑、时间线预览、关键帧效果等等。 + +![][5] + +更多信息可在此链接中获得: + +### Shotcut + +Shotcut 与 Kdenlive 的功能大致相同。这个应用程序是一个通用的视频编辑器。它有一个相当简单的界面,但功能齐全,可以满足你视频编辑工作的各种需要。 + +Shotcut 拥有一套完整视频编辑功能,提供了从简单的编辑到高级的功能。它还支持各种视频、音频和图像格式。你不需要担心你的编辑历史,因为这个应用程序有无限的撤销和重做功能。Shotcut 还提供了各种视频和音频效果,因此你可以自由地创造性地制作你的视频作品。它提供的一些功能有:音频过滤器、音频混合、交叉淡化的音视频溶解过渡、音调发生器、速度变化、视频合成、3 路色轮、轨道合成/混合模式、视频过滤器等。 + +![][6] + +更多信息可在此链接中获得: + +### Pitivi + +如果你想要一个具有直观和简洁用户界面的视频编辑器,Pitivi 将是正确的选择。你会对它的外观感到舒适,并且不难找到你需要的功能。这个应用程序被归类为非常容易学习,特别是如果你需要一个用于简单编辑需求的应用程序时。然而,Pitivi 仍然提供了种种功能,如修剪 & 切割、混音、关键帧音频效果、音频波形、音量关键帧曲线、视频过渡等。 + +![][7] + +更多信息可在此链接中获得: + +### Cinelerra + +Cinelerra 是一个已经开发了很久的视频编辑器。它为你的视频工作提供了大量的功能,如内置帧渲染、各种视频效果、无限的层、8K 支持、多相机支持、视频音频同步、渲染农场、动态图形、实时预览等。这个应用程序可能不适合那些刚开始学习的人。我认为你需要一段时间来适应这个界面,特别是如果你已经熟悉了其他流行的视频编辑应用程序。但 Cinelerra 仍是一个有趣的选择,可以作为你的视频编辑器。 + +![][8] + +更多信息请见此链接: + +### 总结 + +这篇文章介绍了四个在 Fedora Linux 上可用的视频编辑器应用,以满足你的日常需求。实际上,在 Fedora Linux 上还有很多其他的视频编辑器可以使用。你也可以使用 Olive(Fedora Linux 仓库)、 OpenShot(rpmfusion-free)、Flowblade(rpmfusion-free)等等。每个视频编辑器都有自己的优势。有些在纠正颜色方面比较好,而有些在各种转场和效果方面比较好。当涉及到如何轻松地添加文本时,有些则更好。请选择适合你需求的应用程序。希望这篇文章可以帮助你选择正确的视频编辑。如果你有使用这些应用程序的经验,请在评论中分享你的经验。 + +-------------------------------------------------------------------------------- + +via: https://fedoramagazine.org/apps-for-daily-needs-part-5-video-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/08/FedoraMagz-Apps-5-video-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/video-kdenlive-1024x576.png +[6]: https://fedoramagazine.org/wp-content/uploads/2021/08/video-shotcut-1024x576.png +[7]: https://fedoramagazine.org/wp-content/uploads/2021/08/video-pitivi-1024x576.png +[8]: https://fedoramagazine.org/wp-content/uploads/2021/08/video-cinelerra-1024x576.png +[9]: https://www.olivevideoeditor.org/ diff --git a/published/202109/20210908 Debug a web page error from the command line.md b/published/202109/20210908 Debug a web page error from the command line.md new file mode 100644 index 0000000000..a720798e24 --- /dev/null +++ b/published/202109/20210908 Debug a web page error from the command line.md @@ -0,0 +1,80 @@ +[#]: subject: "Debug a web page error from the command line" +[#]: via: "https://opensource.com/article/21/9/wget-debug-web-server" +[#]: author: "Jim Hall https://opensource.com/users/jim-hall" +[#]: collector: "lujun9972" +[#]: translator: "geekpi" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13795-1.html" + +从命令行使用 wget 调试网页错误 +====== + +> 调试 Web 服务器的一种方法是使用 wget 命令行程序。 + +![](https://img.linux.net.cn/data/attachment/album/202109/17/225018elcip4pii4qcknir.jpg) + +有时在管理一个网站时,事情会被搞得一团糟。你可能会删除一些陈旧的内容,用重定向到其他页面来代替。后来,在做了其他改动后,你发现一些网页变得完全无法访问了。你可能会在浏览器中看到一个错误:“该页面没有正确重定向”,并建议你检查你的 cookie。 + +![Redirect loop example in Firefox][2] + +调试这种情况的一个方法是使用 `wget` 命令行程序,使用 `-S` 选项来显示所有的服务器响应。当使用 `wget` 进行调试时,我也喜欢使用 `-O` 选项将输出保存到一些临时文件中,以备以后需要查看其内容。 + +``` +$ wget -O /tmp/test.html -S http://10.0.0.11/announce/ +--2021-08-24 17:09:49-- http://10.0.0.11/announce/ +Connecting to 10.0.0.11:80... connected. + +HTTP request sent, awaiting response... + +HTTP/1.1 302 Found +Date: Tue, 24 Aug 2021 22:09:49 GMT +Server: Apache/2.4.48 (Fedora) +X-Powered-By: PHP/7.4.21 +Location: http://10.0.0.11/assets/ +Content-Length: 0 +Keep-Alive: timeout=5, max=100 +Connection: Keep-Alive +Content-Type: text/html; charset=UTF-8 +Location: http://10.0.0.11/assets/ [following] +--2021-08-24 17:09:49-- http://10.0.0.11/assets/ +Reusing existing connection to 10.0.0.11:80. + +HTTP request sent, awaiting response... + +HTTP/1.1 302 Found +Date: Tue, 24 Aug 2021 22:09:49 GMT +Server: Apache/2.4.48 (Fedora) +X-Powered-By: PHP/7.4.21 +Location: http://10.0.0.11/announce/ +Content-Length: 0 +Keep-Alive: timeout=5, max=99 +Connection: Keep-Alive +Content-Type: text/html; charset=UTF-8 +Location: http://10.0.0.11/announce/ [following] +--2021-08-24 17:09:49-- http://10.0.0.11/announce/ +Reusing existing connection to 10.0.0.11:80. +. +. +. +20 redirections exceeded. +``` + +我在这个输出中省略了很多重复的内容。通过阅读服务器的响应,你可以看到 `http://10.0.0.11/announce/` 立即重定向到 `http://10.0.0.11/assets/`,然后又重定向到 `http://10.0.0.11/announce/`。以此类推。这是一个无休止的循环,`wget` 将在 20 次重定向后退出。但有了这些调试信息,你可以修复重定向,避免循环。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/9/wget-debug-web-server + +作者:[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/browser_web_internet_website.png?itok=g5B_Bw62 (Digital creative of a browser on the internet) +[2]: https://opensource.com/sites/default/files/uploads/firefox-redirect-loop.png (Redirect loop example in Firefox) +[3]: https://creativecommons.org/licenses/by-sa/4.0/ \ No newline at end of file diff --git a/published/202109/20210908 How to Run Java Programs in Ubuntu.md b/published/202109/20210908 How to Run Java Programs in Ubuntu.md new file mode 100644 index 0000000000..e7b3277f53 --- /dev/null +++ b/published/202109/20210908 How to Run Java Programs in Ubuntu.md @@ -0,0 +1,118 @@ +[#]: subject: "How to Run Java Programs in Ubuntu" +[#]: via: "https://itsfoss.com/run-java-program-ubuntu/" +[#]: author: "Abhishek Prakash https://itsfoss.com/author/abhishek/" +[#]: collector: "lujun9972" +[#]: translator: "geekpi" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13790-1.html" + +如何在 Ubuntu 中运行 Java 程序 +====== + +![](https://img.linux.net.cn/data/attachment/album/202109/16/163803pn2dja7ajcx8jjw2.jpg) + +听说,你已经开始学习 Java 编程了?很好。 + +你想在你的 Linux 系统上运行 Java 程序?那就更好了。 + +让我告诉你如何在 Ubuntu 和其他 Linux 发行版的终端中运行 Java。 + +### 在 Ubuntu 中运行 Java 程序 + +让我们在这里按正确的步骤进行。 + +#### 第一步:安装 Java 编译器 + +要运行一个 Java 程序,你需要先编译该程序。为此你需要 Java 编译器。 + +Java 编译器是 [JDK][1](Java 开发工具包Java Development Kit)的一部分。你需要安装 JDK,以便编译和运行 Java 程序。 + +首先,检查你的系统上是否已经安装了 Java 编译器: + +``` +javac --version +``` + +如果你看到类似 “Command ‘javac’ not found, but can be installed with” 的错误,这意味着你需要安装 Java 开发工具包。 + +![Check if Java compiler is already installed or not][2] + +在 Ubuntu 上安装 JDK 的最简单方法是使用 Ubuntu 的默认包: + +``` +sudo apt install default-jdk +``` + +你会被要求输入你的账户密码。当你输入密码时,屏幕上什么也看不到。这很正常。直接输入密码即可。当询问时,按回车键或 `Y` 键。 + +![Installing JDK that also contains the Java compiler][3] + +上述命令应该适用于其他基于 Debian 和 Ubuntu 的发行版,如 Linux Mint、Elementary OS 等。对于其他发行版,请使用你的发行版的包管理器。包的名称也可能不同。 + +安装完毕后,验证 `javac` 现在是否可用。 + +![Verify that Java compiler can be used now][4] + +#### 第二步:在 Linux 中编译 Java 程序 + +要编译的话,你首先需要有一个 Java 程序文件。假设你创建了一个名为 `HelloWorld.java` 的新的 Java 程序文件,它的内容如下: + +``` +class HelloWorld{ + public static void main(String args[]){ + System.out.println("Hello World"); + } +} +``` + +你可以 [使用终端下的 Nano 编辑器][5] 或 Gedit 图形化文本编辑器来编写你的 Java 程序。 + +``` +javac HelloWorld.java +``` + +如果没有错误,上面的命令不会产生输出。 + +当你编译 Java 程序时,它会生成一个 .class 文件,文件名是你在程序中使用的类。你需要运行这个类文件。 + +#### 第三步:运行 Java 类文件 + +你不需要在这里指定类的扩展名。只需要类的名称。而这一次,你使用 `java` 命令,而不是 `javac`。 + +``` +java HelloWorld +``` + +我的程序将在屏幕上打印 “Hello World”。 + +![Running java programs in the Linux terminal][6] + +这就是你如何在 Linux 终端中运行一个 Java 程序。 + +这是最简单的一个例子。这个示例程序只有一个类。Java 编译器为你程序中的每个类都创建一个类文件。对于较大的程序和项目来说,事情会变得很复杂。 + +这就是为什么我建议 [在 Ubuntu 上安装 Eclipse][7] 来进行 Java 编程。在 IDE 中编程更容易。 + +希望本教程对你有所帮助。有问题或建议吗?评论区都是你的。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/run-java-program-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://jdk.java.net/ +[2]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/09/java-compiler-check-ubuntu.png?resize=800%2C328&ssl=1 +[3]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/09/install-jdk-ubuntu.png?resize=800%2C430&ssl=1 +[4]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/09/java-compiler-ubuntu.png?resize=798%2C226&ssl=1 +[5]: https://itsfoss.com/nano-editor-guide/ +[6]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/09/running-java-programs-in-Linux-terminal.png?resize=798%2C301&ssl=1 +[7]: https://itsfoss.com/install-latest-eclipse-ubuntu/ diff --git a/published/202109/20210908 How to Use the dd Command to Create a Live USB Drive in Linux Terminal -For Experts and Adventurers.md b/published/202109/20210908 How to Use the dd Command to Create a Live USB Drive in Linux Terminal -For Experts and Adventurers.md new file mode 100644 index 0000000000..8c2b4ba03a --- /dev/null +++ b/published/202109/20210908 How to Use the dd Command to Create a Live USB Drive in Linux Terminal -For Experts and Adventurers.md @@ -0,0 +1,127 @@ +[#]: subject: "How to Use the dd Command to Create a Live USB Drive in Linux Terminal [For Experts and Adventurers]" +[#]: via: "https://itsfoss.com/live-usb-with-dd-command/" +[#]: author: "Hunter Wittenborn https://itsfoss.com/author/hunter/" +[#]: collector: "lujun9972" +[#]: translator: "perfiffer" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13787-1.html" + +怎样在 Linux 终端下使用 dd 命令创建一个临场 USB 驱动器 +====== + +![](https://img.linux.net.cn/data/attachment/album/202109/15/104940ucajv4o4zb8934ll.jpg) + +有很多的图形化工具可以用来创建临场live USB 驱动器。Linux 上的 [Etcher][1] 可能是最受欢迎的。为此,Ubuntu 也开发了自己的启动盘创建工具。 + +但是,资深 Linux 用户可能更喜欢使用 `dd` 命令在 Linux 终端中创建临场 USB,这会更快速便捷。 + +`dd` 命令是一个 [命令行][2] 工具,它提供了用来复制和转换文件的强大功能。 + +一个常见的使用示例是,用户使用 `dd` 命令将 ISO 文件写入到他们的外部存储设备(例如 USB 驱动盘),以用来给他们的电脑或者笔记本安装一个新的 Linux 发行版。 + +这就是我将在本教程中展示的内容。我将带你认识需要的命令,从终端找到我们的 USB 驱动器,然后对 ISO 文件进行实际刷写。 + +### 使用 dd 命令从 ISO 镜像创建临场 USB + +在我向你展示步骤前,让我带你快速过一下你将要使用到的命令并解释它的作用。 + +这是一个使用命令刷写 ISO 的例子: + +``` +dd if="./filename.iso" of="/dev/sdb" status="progress" conv="fsync" +``` + +让我们来看看 [dd 命令][3] 实际都做了些什么。 + +#### 理解 dd 命令 + +![Explanation of the dd command for live USB creation][4] + +首先,你输入 `dd`。没错,这就是你要运行的程序的名称。 + +接下来,你指定 `if="./filename.iso"`。`if` 代表输入文件input file,告诉 `dd` 命令你将要向外部存储设备写入哪个文件。 + +之后,你输入 `of="/dev/sdb"`。和 `if` 一样,`of` 代表的是输出文件output file。 + +要记住的是,输出文件在技术上不必是系统上的文件。你还可以指定诸如外部设备路径之类的内容(如示例所示),它看起来像系统上的普通文件,但实际上指向连接到你机器的设备。 + +`status` 可以设定为 3 个选项:`none`、`noxfer` 和 `progress`。 + +- 你设置的 `progress` 选项将使 `dd` 任务显示有关已将多少 ISO 文件传输到存储驱动器的定期统计信息,以及对 `dd` 任务完成前需要多长时间的估计。 +- 如果你改为设置 `none` 选项,`dd` 任务在写入 ISO 文件期间只会打印错误消息,并且删除进度条之类的内容。 +- `noxfer` 选项隐藏了传输完成后打印的一些信息,例如从开始到完成所用的时间。 + +最后,你将 `conv` 选项设置为 `fsync`。这会导致 `dd` 任务在整个 ISO 文件写入 USB 驱动器之前不会报告成功写入。 + +如果你省略这个选项,`dd` 任务会工作的很好(并且实际上可能看起来运行得更快),但你可能会发现你的系统需要很长时间才能告诉你移除 USB 驱动器是安全的,因为它会在后台完成 ISO 的内容写入,从而允许你在此期间做其它事情。 + +**现在你明白了你必须做什么,让我们看看如何去做。** + +> **注意事项** +> +> 命令行是把双刃剑。当你在命令行使用类似于 `dd` 命令时必须十分小心。你必须确保你目标输出文件是正确的设备。一个错误的步骤就可能会格式化你的系统硬盘,你的操作系统也会因此而损坏。 + +#### 第 0 步: 下载所需的 ISO 镜像 + +不用说,你需要有一个 ISO 镜像文件才能将其刷写到 USB 上。 + +我将使用 Ubuntu 20.04 ISO(可在此处[下载][5])来测试我之前介绍的 `dd` 命令。 + +#### 第 1 步: 获取 USB 盘符 + +插入你的 USB 驱动器。 + +我为 `of` 参数输入的具体路径是 `/dev/sdb`。USB 磁盘通常会标记为 `/dev/sdb`,但这不是硬性规定。 + +此路径可能因你的系统而异,你可以使用 `lsblk` 命令确认 USB 磁盘的路径。只需从列表中查找一个看起来像你的 USB 磁盘大小的驱动器,就可以了。 + +![][6] + +如果你更熟悉 GUI 程序,还可以使用 GNOME Disks 等工具找到驱动器的路径。 + +![][7] + +现在你已经确认了外部驱动器的路径,让我们开始创建临场 USB。 + +#### 第 2 步:将 ISO 文件写入 USB 磁盘 + +在下载 ISO 文件的目录打开一个终端,然后运行以下命令(如果 `/dev/sdb` 与你的存储设备名称不同,请记住将其替换): + +``` +sudo dd if="./ubuntu-20.04.2.0-desktop-amd64.iso" of="/dev/sdb" status="progress" conv="fsync" +``` + +之后,让 `dd` 去做剩下的事情,它会在完成后打印一条完成消息: + +![][8] + +就像这样,你已经在 Linux 终端中使用 `dd` 命令刷写了 ISO 文件! + +### 总结 + +现在,你可以通过终端做更多的事情,让你的工作效率大大提高。 + +对 `dd` 命令有任何没解决的问题,或者无法正常工作?请随时在下面的评论部分中留下你的问题。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/live-usb-with-dd-command/ + +作者:[Hunter Wittenborn][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/hunter/ +[b]: https://github.com/lujun9972 +[1]: https://itsfoss.com/install-etcher-linux/ +[2]: https://itsfoss.com/gui-cli-tui/ +[3]: https://linuxhandbook.com/dd-command/ +[4]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/09/dd-command-for-live-usb-creation.png?resize=800%2C450&ssl=1 +[5]: https://ubuntu.com/download/desktop/thank-you?version=20.04.2.0&architecture=amd64 +[6]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/08/dd_disks.png?resize=753%2C264&ssl=1 +[7]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/08/dd_gnome_disks.png?resize=800%2C440&ssl=1 +[8]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/08/dd-iso-write.png?resize=800%2C322&ssl=1 diff --git a/published/202109/20210909 Adobe Kills Brackets Code Editor - Suggests Using Visual Studio Code.md b/published/202109/20210909 Adobe Kills Brackets Code Editor - Suggests Using Visual Studio Code.md new file mode 100644 index 0000000000..f8962272b2 --- /dev/null +++ b/published/202109/20210909 Adobe Kills Brackets Code Editor - Suggests Using Visual Studio Code.md @@ -0,0 +1,79 @@ +[#]: subject: "Adobe Kills Brackets Code Editor & Suggests Using Visual Studio Code" +[#]: via: "https://news.itsfoss.com/adobe-kills-brackets-editor/" +[#]: author: "Ankush Das https://news.itsfoss.com/author/ankush/" +[#]: collector: "lujun9972" +[#]: translator: "wxy" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13782-1.html" + +Adobe 终止支持 Brackets,并建议使用 VS Code 替代 +====== + +> Adobe 结束了对 Brackets 代码编辑器的支持,坚持让用户迁移到微软的 Visual Studio Code。不过,还好总还算是留下了一个复刻。 + +![](https://i2.wp.com/news.itsfoss.com/wp-content/uploads/2021/09/adobe-bracket-visual-studio.jpg?w=1200&ssl=1) + +Brackets 是一个令人印象深刻的现代开源代码编辑器,可用于 Windows、macOS 和 Linux。 + +Adobe 以一个社区引导的项目的形式创建了它,来帮助 Web 开发者。我们之前把它列为 [可供编程人员使用的最佳现代文本编辑器][1] 之一。 + +不幸的是,Adobe 在 2021 年 9 月 1 日结束了对 Brackets 的支持。 + +### 为什么 Adobe 停用了 Brackets? + +![][2] + +看起来可能是 Adobe 与微软的合作关系促使他们拔掉了这个社区项目的插头。 + +因此,他们建议用户迁移到微软的 Visual Studio Code 编辑器。 + +![][3] + +这是 Brackets 项目中止后 GitHub 的原始页面上的内容。 + +### Visual Studio Code 作为 Brackets 的替代品 + +当然,微软的 Visual Studio Code 是一个很好的替代品,而且建立在开源的基础上。然而,当你从他们的网站上下载 Visual Studio Code 时,它并不在一个促进自由和开源软件的许可证之下。 + +因此,你可能不得不从源代码构建,或者尝试 [VSCodium][4],这是一个没有遥测/跟踪功能的 Visual Studio Code 的自由许可版本。 + +另外,有一个 [关于从 Brackets 迁移的官方指南][5],如果你感兴趣,可以去看看。 + +### Brackets 将继续以没有 Adobe 的复刻出现 + +![][6] + +尽管 Adobe 已经停止了这个项目,但 [原网站][7] 仍然存在,以维持这个项目的复刻。 + +该项目名称可能会改变,但从目前来看,它叫 “Brackets Continued”,以帮助用户识别该复刻。 + +请注意,这个复刻项目还没有发布,我们也不知道它是否会作为一个独立的项目继续下去。 + +所以,如果你想帮助 Brackets 复刻,并以某种方式帮助维护它,请前往其 GitHub 页面了解更多细节。 + +- [Brackets Continued(复刻)][8] + +你喜欢用什么作为你的代码编辑器?你喜欢用 Brackets 代码编辑器进行 Web 开发工作吗?欢迎在评论中分享你的想法。 + +-------------------------------------------------------------------------------- + +via: https://news.itsfoss.com/adobe-kills-brackets-editor/ + +作者:[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://news.itsfoss.com/author/ankush/ +[b]: https://github.com/lujun9972 +[1]: https://itsfoss.com/best-modern-open-source-code-editors-for-linux/ +[2]: https://i2.wp.com/news.itsfoss.com/wp-content/uploads/2021/09/brackets-screenshot.png?w=800&ssl=1 +[3]: https://i2.wp.com/news.itsfoss.com/wp-content/uploads/2021/09/adobe-brackets-github.png?w=964&ssl=1 +[4]: https://vscodium.com +[5]: https://code.visualstudio.com/migrate-from-brackets +[6]: https://i2.wp.com/news.itsfoss.com/wp-content/uploads/2021/09/brackets-fork.png?w=1511&ssl=1 +[7]: https://brackets.io +[8]: https://github.com/brackets-cont/brackets diff --git a/published/202109/20210910 Building an open source community health analytics platform.md b/published/202109/20210910 Building an open source community health analytics platform.md new file mode 100644 index 0000000000..fb77032618 --- /dev/null +++ b/published/202109/20210910 Building an open source community health analytics platform.md @@ -0,0 +1,57 @@ +[#]: subject: "Building an open source community health analytics platform" +[#]: via: "https://opensource.com/article/21/9/openrit-mystic" +[#]: author: "Quinn Foster https://opensource.com/users/quinn-foster" +[#]: collector: "lujun9972" +[#]: translator: "geekpi" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13800-1.html" + +构建开源的社区健康分析平台 +====== + +> 一个学术性的 OSPO 正在与 CHAOSS 软件合作,以建立一个社区健康分析平台。 + +![](https://img.linux.net.cn/data/attachment/album/202109/19/100755mlngkwvvwjjlblgn.png) + +罗切斯特理工学院Rochester Institute of Technology(RIT)最近在增加其在开源世界的影响力方面取得了相当大的进展。RIT的自由和开源软件及自由文化辅修课程是学术界的第一个此类课程。例如,其开源项目办公室 Open@RIT 已经开始帮助 RIT 的教职员工和研究员为他们的开源项目建立和维护社区。 + +这些进展是由 RIT 的学生、教师和工作人员推动的。目前,大学里已经有越来越多的人在管理他们自己的开源项目。然而,运行一个完全的开源项目可能是很麻烦的。这主要来自于维护项目的社区和管理数据,如项目的代码、问题跟踪和仓库。 + +为了帮助他们,Open@RIT 正在创建一个名为 Mystic 的系统,这是一个社区健康分析平台,利用了 [GrimoireLab][2],这是一个由 [CHAOSS][3] 软件开发的开源工具包,为开源项目提供了指标和分析。GrimoireLab 允许用户收集、丰富、过滤和可视化一个项目的数据,例如一个报告的问题被解决的时间、贡献者的关系等。 + +Mystic 将作为一个前端门户,任何人都可以提交他们的项目。在那里,项目将被直接发送到 GrimoireLab,它将在几分钟后为提交者计算并发布项目的指标。 + +> Open@RIT 的全栈开发者和 Mystic 的首席开发者 Emi Simpson 说:“我们希望 RIT 的任何管理、领导或参与开源项目的人都能将该项目提交给 Mystic,并获得他们需要的任何指标”。 + +这个过程很简单。登录 Mystic 后,上传项目的用户会打开一个弹出式窗口,输入项目的细节和数据源的链接,如 GitLab、RSS feed 和一个开放软件基金会Open Software Foundation(OSF)项目名。一旦保存了细节和项目,Mystic 就会使用 GrimoireLab 从项目源中自动检索指标,并为每个源渲染图表。然后,该项目及其指标将显示在它自己的仪表板上。 + +![Mystic statistics page][4] + +这些仪表盘将并列显示在一个页面上,以供其他人查看,鼓励 RIT 内部的开源社区之间的合作开发和互动。Simpson 和 Open@RIT 希望这将增加 RIT 的开放工作的参与度,并进一步巩固该大学作为开放工作中心的地位。 + +> Simpson 说:“如果有人问 RIT 在为开源软件做什么,我希望人们能够指着 Mystic 和 GrimoireLab 说就是这些。通过建立‘这些是我们正在做的,这些是我们的贡献,这些是人们正在做的项目’的指标,我们可以在 RIT 建立一个以我们正在做的开源工作为中心的社区。” + +目前,Mystic 仍在开发中,还没有准备好进入生产环境,但它对 RIT 和整个开源的潜力仍然是有目共睹的。未来的目标包括实现与大学报告工具的轻松整合,以及在项目层面和总体上的综合仪表盘。 + +你对 Mystic 的贡献感兴趣吗?[请与我们联系][6] 开始吧。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/9/openrit-mystic + +作者:[Quinn Foster][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/quinn-foster +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/metrics_data_dashboard_system_computer_analytics.png?itok=oxAeIEI- (metrics and data shown on a computer screen) +[2]: https://chaoss.github.io/grimoirelab/ +[3]: https://chaoss.community/ +[4]: https://opensource.com/sites/default/files/uploads/mystic_statistics_page.png (Mystic statistics page) +[5]: https://creativecommons.org/licenses/by-sa/4.0/ +[6]: https://opensource.ieee.org/rit/mystic diff --git a/published/202109/20210910 Quadratic algorithms are slow (and hashmaps are fast).md b/published/202109/20210910 Quadratic algorithms are slow (and hashmaps are fast).md new file mode 100644 index 0000000000..c20f6d13c9 --- /dev/null +++ b/published/202109/20210910 Quadratic algorithms are slow (and hashmaps are fast).md @@ -0,0 +1,253 @@ +[#]: subject: "Quadratic algorithms are slow (and hashmaps are fast)" +[#]: via: "https://jvns.ca/blog/2021/09/10/hashmaps-make-things-fast/" +[#]: author: "Julia Evans https://jvns.ca/" +[#]: collector: "lujun9972" +[#]: translator: "unigeorge" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13786-1.html" + +浅谈慢速的二次算法与快速的 hashmap +====== + +![](https://img.linux.net.cn/data/attachment/album/202109/15/094524s7dlcq74ksqazyyc.jpg) + +大家好!昨天我与一位朋友聊天,他正在准备编程面试,并试图学习一些算法基础知识。 + +我们聊到了二次时间quadratic-time线性时间linear-time算法的话题,我认为在这里写这篇文章会很有趣,因为避免二次时间算法不仅在面试中很重要——有时在现实生活中了解一下也是很好的!后面我会快速解释一下什么是“二次时间算法” :) + +以下是我们将要讨论的 3 件事: + + 1. 二次时间函数比线性时间函数慢得非常非常多 + 2. 有时可以通过使用 hashmap 把二次算法变成线性算法 + 3. 这是因为 hashmap 查找非常快(即时查询!) + +我会尽量避免使用数学术语,重点关注真实的代码示例以及它们到底有多快/多慢。 + +### 目标问题:取两个列表的交集 + +我们来讨论一个简单的面试式问题:获取 2 个数字列表的交集。 例如,`intersect([1,2,3], [2,4,5])` 应该返回 `[2]`。 + +这个问题也是有些现实应用的——你可以假设有一个真实程序,其需求正是取两个 ID 列表的交集。 + +### “显而易见”的解决方案: + +我们来写一些获取 2 个列表交集的代码。下面是一个实现此需求的程序,命名为 `quadratic.py`。 + +``` +import sys + +# 实际运行的代码 +def intersection(list1, list2): + result = [] + for x in list1: + for y in list2: + if x == y: + result.append(y) + return result + +# 一些样板,便于我们从命令行运行程序,处理不同大小的列表 +def run(n): + # 定义两个有 n+1 个元素的列表 + list1 = list(range(3, n)) + [2] + list2 = list(range(n+1, 2*n)) + [2] + # 取其交集并输出结果 + print(list(intersection(list1, list2))) + +# 使用第一个命令行参数作为输入,运行程序 +run(int(sys.argv[1])) +``` + +程序名为 `quadratic.py`(LCTT 译注:“quadratic”意为“二次方的”)的原因是:如果 `list1` 和 `list2` 的大小为 `n`,那么内层循环(`if x == y`)会运行 `n^2` 次。在数学中,像 `x^2` 这样的函数就称为“二次”函数。 + +### `quadratic.py` 有多慢? + +用一些不同长度的列表来运行这个程序,两个列表的交集总是相同的:`[2]`。 + +``` +$ time python3 quadratic.py 10 +[2] + +real 0m0.037s +$ time python3 quadratic.py 100 +[2] + +real 0m0.053s +$ time python3 quadratic.py 1000 +[2] + +real 0m0.051s +$ time python3 quadratic.py 10000 # 10,000 +[2] + +real 0m1.661s +``` + +到目前为止,一切都还不错——程序仍然只花费不到 2 秒的时间。 + +然后运行该程序处理两个包含 100,000 个元素的列表,我不得不等待了很长时间。结果如下: + +``` +$ time python3 quadratic.py 100000 # 100,000 +[2] + +real 2m41.059s +``` + +这可以说相当慢了!总共花费了 160 秒,几乎是在 10,000 个元素上运行时(1.6 秒)的 100 倍。所以我们可以看到,在某个点之后,每次我们将列表扩大 10 倍,程序运行的时间就会增加大约 100 倍。 + +我没有尝试在 1,000,000 个元素上运行这个程序,因为我知道它会花费又 100 倍的时间——可能大约需要 3 个小时。我没时间这样做! + +你现在大概明白了为什么二次时间算法会成为一个问题——即使是这个非常简单的程序也会很快变得非常缓慢。 + +### 快速版:`linear.py` + +好,接下来我们编写一个快速版的程序。我先给你看看程序的样子,然后再分析。 + +``` +import sys + +# 实际执行的算法 +def intersection(list1, list2): + set1 = set(list1) # this is a hash set + result = [] + for y in list2: + if y in set1: + result.append(y) + return result + +# 一些样板,便于我们从命令行运行程序,处理不同大小的列表 +def run(n): + # 定义两个有 n+1 个元素的列表 + list1 = range(3, n) + [2] + list2 = range(n+1, 2*n) + [2] + # 输出交集结果 + print(intersection(list1, list2)) + +run(int(sys.argv[1])) +``` + +(这不是最惯用的 Python 使用方式,但我想在尽量避免使用太多 Python 思想的前提下编写代码,以便不了解 Python 的人能够更容易理解) + +这里我们做了两件与慢速版程序不同的事: + + 1. 将 `list1` 转换成名为 `set1` 的 set 集合 + 2. 只使用一个 for 循环而不是两个 + +### 看看 `linear.py` 程序有多快 + +在讨论 _为什么_ 这个程序快之前,我们先在一些大型列表上运行该程序,以此证明它确实是很快的。此处演示该程序依次在大小为 10 到 10,000,000 的列表上运行的过程。(请记住,我们上一个的程序在 100,000 个元素上运行时开始变得非常非常慢) + +``` +$ time python3 linear.py 100 +[2] + +real 0m0.056s +$ time python3 linear.py 1000 +[2] + +real 0m0.036s +$ time python3 linear.py 10000 # 10,000 +[2] + +real 0m0.028s +$ time python3 linear.py 100000 # 100,000 +[2] + +real 0m0.048s <-- quadratic.py took 2 minutes in this case! we're doing it in 0.04 seconds now!!! so fast! +$ time python3 linear.py 1000000 # 1,000,000 +[2] + +real 0m0.178s +$ time python3 linear.py 10000000 # 10,000,000 +[2] + +real 0m1.560s +``` + +### 在极大型列表上运行 `linear.py` + +如果我们试着在一个非常非常大的列表(100 亿 / 10,000,000,000 个元素)上运行它,那么实际上会遇到另一个问题:它足够 _快_ 了(该列表仅比花费 4.2 秒的列表大 100 倍,因此我们大概应该能在不超过 420 秒的时间内完成),但我的计算机没有足够的内存来存储列表的所有元素,因此程序在运行结束之前崩溃了。 + +``` +$ time python3 linear.py 10000000000 +Traceback (most recent call last): + File "/home/bork/work/homepage/linear.py", line 18, in + run(int(sys.argv[1])) + File "/home/bork/work/homepage/linear.py", line 13, in run + list1 = [1] * n + [2] +MemoryError + +real 0m0.090s +user 0m0.034s +sys 0m0.018s +``` + +不过本文不讨论内存使用,所以我们可以忽略这个问题。 + +### 那么,为什么 `linear.py` 很快呢? + +现在我将试着解释为什么 `linear.py` 很快。 + +再看一下我们的代码: + +``` +def intersection(list1, list2): + set1 = set(list1) # this is a hash set + result = [] + for y in list2: + if y in set1: + result.append(y) + return result +``` + +假设 `list1` 和 `list2` 都是大约 10,000,000 个不同元素的列表,这样的元素数量可以说是很大了! + +那么为什么它还能够运行得如此之快呢?因为 hashmap!!! + +### hashmap 查找是即时的(“常数级时间”) + +我们看一下快速版程序中的 `if` 语句: + +``` +if y in set1: + result.append(y) +``` + +你可能会认为如果 `set1` 包含 1000 万个元素,那么这个查找——`if y in set1` 会比 `set1` 包含 1000 个元素时慢。但事实并非如此!无论 `set1` 有多大,所需时间基本是相同的(超级快)。 + +这是因为 `set1` 是一个哈希集合,它是一种只有键没有值的 hashmap(hashtable)结构。 + +我不准备在本文中解释 _为什么_ hashmap 查找是即时的,但是神奇的 Vaidehi Joshi 的 [basecs][1] 系列中有关于 [hash table][2] 和 [hash 函数][3] 的解释,其中讨论了 hashmap 即时查找的原因。 + +### 不经意的二次方:现实中的二次算法! + +二次时间算法真的很慢,我们看到的的这个问题实际上在现实中也会遇到——Nelson Elhage 有一个很棒的博客,名为 [不经意的二次方][4],其中有关于不经意以二次时间算法运行代码导致性能问题的故事。 + +### 二次时间算法可能会“偷袭”你 + +关于二次时间算法的奇怪之处在于,当你在少量元素(如 1000)上运行它们时,它看起来并没有那么糟糕!没那么慢!但是如果你给它 1,000,000 个元素,它真的会花费几个小时去运行。 + +所以我认为它还是值得深入了解的,这样你就可以避免无意中使用二次时间算法,特别是当有一种简单的方法来编写线性时间算法(例如使用 hashmap)时。 + +### 总是让我感到一丝神奇的 hashmap + +hashmap 当然不是魔法(你可以学习一下为什么 hashmap 查找是即时的!真的很酷!),但它总是让人 _感觉_ 有点神奇,每次我在程序中使用 hashmap 来加速,都会使我感到开心 :) + +-------------------------------------------------------------------------------- + +via: https://jvns.ca/blog/2021/09/10/hashmaps-make-things-fast/ + +作者:[Julia Evans][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://jvns.ca/ +[b]: https://github.com/lujun9972 +[1]: https://medium.com/basecs +[2]: https://medium.com/basecs/taking-hash-tables-off-the-shelf-139cbf4752f0 +[3]: https://medium.com/basecs/hashing-out-hash-functions-ea5dd8beb4dd +[4]: https://accidentallyquadratic.tumblr.com/ diff --git a/published/202109/20210911 Here-s Why Firefox is Seeing a Continuous Decline for Last 12 Years.md b/published/202109/20210911 Here-s Why Firefox is Seeing a Continuous Decline for Last 12 Years.md new file mode 100644 index 0000000000..95737229ff --- /dev/null +++ b/published/202109/20210911 Here-s Why Firefox is Seeing a Continuous Decline for Last 12 Years.md @@ -0,0 +1,84 @@ +[#]: subject: "Here’s Why Firefox is Seeing a Continuous Decline for Last 12 Years" +[#]: via: "https://news.itsfoss.com/firefox-continuous-decline/" +[#]: author: "Community https://news.itsfoss.com/author/team/" +[#]: collector: "lujun9972" +[#]: translator: "wxy" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13780-1.html" + +Firefox 在过去 12 年里损失了 5 亿用户及其 75% 份额的原因 +====== + +> 一位有四十年编程经验的老程序员表达了他对 Firefox 浏览器为何逐渐衰退的看法。 + +![](https://i2.wp.com/news.itsfoss.com/wp-content/uploads/2021/09/decline.png?w=1200&ssl=1) + +最近有很多关于 Firefox 浏览器衰落的讨论,还有很多讨论 [它在过去两年里失去了 5000 万用户][1] 的文章。 + +但是 **实际上它的衰落已经有 12 年之久了,总共损失了 5 亿用户和它曾经拥有的市场份额的 75%**。 + +这一切都开始于 2009 年第三季度,其致命的决定是强迫…… + +### 顶部标签 + +自从 [做了这个决定][2],Firefox 就开始丢失市场份额。PC 上的所有程序都使用针对活动窗口的标签。如微软 Office 和 Adobe 这样的专有软件,如 GIMP、3D 设计、视频编辑器、十六进制编辑器这样的 FOSS 软件,你能想的的种种软件都是这样的,这是标准的、合乎逻辑的设计。 + +然后,谷歌决定将标签放在其 Chrome 浏览器的顶部,该浏览器是为移动设备而非台式机设计的。在智能手机上,这可能是有意义的,因为没有空间来容纳一个完整的桌面风格的菜单布局。但在桌面上,它是反直觉的,并且会破坏与所有其他程序的工作流程。台式机的代码与手机不同,所以没有合理的理由试图将移动用户界面强加给台式机用户,而台式机是 Firefox 的主要用户群。在一个 400 万行的代码库中,由两行代码所制定的单一设置“太难维护”的论点,只是在侮辱用户的智商。代码不是草坪,如果你几周不管它,它也不会改变。 + +当用户对这一变化的投诉蜂拥而至时,我从一位不愿透露姓名的主要开发者那里得到的回应是:“我们有数亿用户。5000 人的抱怨并不代表大多数的用户。”这些投诉有一个共同的观点:“如果我想让我的浏览器看起来像 Chrome,我就会使用 Chrome。”于是他们就这么做了。 + +### 不断删除“没人使用”的功能 + +对 Firefox 所做的每项改动都是一样的做法。默认功能被改变了,但有一个菜单设置可以恢复它。然后菜单设置被删除,你只能通过`about:config` 来改变它。再然后,`about:config` 选项也被删除了。用户群的每一次抗议都得到了同样的回应:“你只是极少数人,大多数人喜欢这种改变。” + +75% 并不是少数人。几乎每个人都讨厌这些变化,每一次变化都会把更多的用户赶走,而 Mozilla 工作人员傲慢的、居高临下的回应让用户们有苦难言,让他们再也不想回来了。仔细观察,你可以看到每次删除一些功能,用户数量都有明显的下降,只有在第三方组件或 CSS 恢复了这些变化时才会稳定下来。一次又一次,年复一年。他们没有学到任何教训。 + +光是移除设置还不够。Firefox 继续阉割附加组件和主题,强迫集中签名,并最终废除了 XUL,而没有足够的 Web 扩展 API 来替代失去的功能。在抱怨这一变化时,我再次与一位主要开发者(同一个人)交谈。他的回答是(原话)“人们并不是因为附加组件而使用 Firefox 的。我们的遥测显示 80% 的用户从未安装过任何附加组件。”也就是说,任何懂技术的人都会立即关闭遥测,因为他们不想让浏览器监视他们,对此我们也曾无数次抱怨过。 + +即使是他们在用户界面设计方面的一项重大举措,即可拖放定制的 Australis 界面,也因为可怕的默认布局和缺乏不需要 CSS 的选项而疏远了更多用户。难看的斜角标签(抄袭自 Chrome)是 Mozilla 唯一承认糟糕的用户界面变化,而且令人惊讶的是,他们只是在 Chrome 取消了斜角标签 **之后** 才这样做。 + +时至今日,Mozilla 仍然声称要听取用户的意见,但 12 年后,他们仍然无视我们,难看的默认 Proton 用户界面是最新强加给不情愿的用户群的愚蠢选择。(如果你认为我属于少数的话,可以在谷歌上输入 “Firefox Proton” 来查看最常搜索的建议。)幸运的是,它仍然可以用 `userChrome.css` 来大致修复,但即使是我,也已经厌倦了必须反复修补新的代码来跟上不断的弃用和格式变化。  + +### 糟糕的编码范式 + +Mozilla 的源代码是一场噩梦。例如,默认配置文件的位置被定义了 3 次,使用了 3 种不同的语言的不同的变量,其中之一是由位于不同文件中的多个变量组合生成的。我看到的另外一个例子是在 6 个不同的文件中定义的另一个全局变量。 + +在编译后,下载历史、访问过的网页、书签等等,都被一起塞进了乱七八糟的文件中。最终的结果是什么?试着从你的历史记录中删除 400 个条目,看看它需要多长时间。而从一个单独的文本文件中删除这么多行,只需要一瞬间。想改变一个图标的外观或为自定义搜索添加一个新的图标?它们大多只是 PNG,但它们被混淆并被封入 `omni.ja` 文件。本来可以用你选择的编辑器在几秒钟内改变,但你需要安装和学习 Eclipse 之类的程序,并在每次更改时重新编译文件。这样的例子不胜枚举。 + +难怪 Mozilla 的码农在寻找和修复错误方面这么困难。这导致了更糟糕的编码范式,为了修复错误而记录一切。它部分导致了... + +### 糟糕的内存管理 + +如果一个程序坐在那里什么都不做,它的内存使用量不应该改变。看看我的内存管理器,我有 40 个进程在遵守这个原则。尽管什么都不做,却不断地读写磁盘的唯一程序是什么?Firefox。它正在运行 13 个进程,所有这些进程都在不断地做这两件事。我写了 40 年的代码,造了 30 年的电脑,所以我确实了解一点计算机如何工作的事情。这就是基础层面上的糟糕设计,在表面上做再多的修补也无济于事。 + +代码范式是 Mozilla 性能问题的根源,他们不会解决这个问题。我敢打赌,这也是 FirefoxOS 失败的原因,它是一个伟大的想法,但由于执行不力和编码实践问题,导致太多的错误无法修复而失败。  +### 在告诉我们“我们重视你的隐私”的同时,侵犯了你的隐私 + +就是遥测。当你点击“禁用遥测”时,隐藏的遥测并没有被禁用。首次运行也要发出遥测信号。强制签署附加组件。无法关闭的自动更新,每 10 分钟发出一次信号。需要单独选择退出的“实验”。现在最新的问题是,只是为了制作一个自定义的主题,就强制使用基于 2FA 的应用以登录到 Firefox 插件帐户,如果不是强制签署附加组件,根本就不需要。 + +Mozilla 对用户隐私的尊重和对我们意见的尊重一样少。 + +### 总结 + +事情不一定是这样的。虽然还没有,但是不能承认自己的错误,也不考虑不同的意见的人,注定要停滞不前,走向衰败。Mozilla 的决策者似乎就是这样想的,所以我对未来不抱什么希望。希望你们中的一些人至少能从他们的错误中学习,在他们失败的地方取得成功。通过为用户提供他们想要的东西,而不是告诉他们应该想要什么来取得成功。通过提供市场上缺少的东西,而不是盲目地试图复制你的竞争对手。 + +*本文所表达的观点和意见仅代表作者本人,不一定反映本站和 It's FOSS 的官方政策或立场。* + +> 作者信息:Dan 来自澳大利亚墨尔本,已经有大约 40 年的编码经验,做了 25 年的平面设计。他还从事基于 3D 打印机套件的开源机械设计。 + +-------------------------------------------------------------------------------- + +via: https://news.itsfoss.com/firefox-continuous-decline/ + +作者:[Community][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://news.itsfoss.com/author/team/ +[b]: https://github.com/lujun9972 +[1]: https://news.itsfoss.com/firefox-decline/ +[2]: https://www.wired.com/2009/07/mozilla-considers-copying-chrome-for-firefox-4dot0/ diff --git a/published/202109/20210913 Replace smart quotes with the Linux sed command.md b/published/202109/20210913 Replace smart quotes with the Linux sed command.md new file mode 100644 index 0000000000..753582a52d --- /dev/null +++ b/published/202109/20210913 Replace smart quotes with the Linux sed command.md @@ -0,0 +1,80 @@ +[#]: subject: "Replace smart quotes with the Linux sed command" +[#]: via: "https://opensource.com/article/21/9/sed-replace-smart-quotes" +[#]: author: "Seth Kenlon https://opensource.com/users/seth" +[#]: collector: "lujun9972" +[#]: translator: "geekpi" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13806-1.html" + +用 Linux sed 命令替换智能引号 +====== + +> 用你喜欢的 sed 版本去除“智能”引号。 + +![](https://img.linux.net.cn/data/attachment/album/202109/21/151406chun5nyumy8wyu5y.png) + +在排版学中,一对引号传统上是朝向彼此的。它们看起来像这样: + +“智能引号” + +随着计算机在二十世纪中期的普及,这种朝向往往被放弃了。计算机的原始字符集没有太多的空间,所以在 ASCII 规范中,两个双引号和两个单引号被缩减为各一个是合理的。如今,通用的字符集是 Unicode,有足够的空间容纳许多花哨的引号和撇号,但许多人已经习惯了开头和结尾引号都只有一个字符的极简主义。此外,计算机实际上将不同种类的引号和撇号视为不同的字符。换句话说,对计算机来说,右双引号与左双引号或直引号是不同的。 + +### 用 sed 替换智能引号 + +计算机并不是打字机。当你按下键盘上的一个键时,你不是在按一个带有印章的控制杆。你只是按下一个按钮,向你的计算机发送一个信号,计算机将其解释为一个显示特定预定义字符的请求。这个请求取决于你的键盘映射。作为一个 Dvorak 打字员,我目睹了人们在发现我的键盘上的 “asdf” 在屏幕上产生 “aoeu” 时脸上的困惑。你也可能按了一些特殊的组合键来产生字符,如 ™ 或 ß 或 ≠,这甚至没有印在你的键盘上。 + +每个字母或字符,不管它是否印在你的键盘上,都有一个编码。字符编码可以用不同的方式表达,但对计算机来说,Unicode 序列 u2018 和 u2019 产生 `‘` 和 `’`,而代码 u201c 和 u201d 产生 `“` 和 `”` 字符。知道这些“秘密”代码意味着你可以使用 [sed][2] 这样的命令以编程方式替换它们。任何版本的 sed 都可以,所以你可以使用 GNU sed 或 BSD sed,甚至是 [Busybox][3] sed。 + +下面是我使用的简单的 shell 脚本: + +``` +#!/bin/sh +# GNU All-Permissive License + +SDQUO=$(echo -ne '\u2018\u2019') +RDQUO=$(echo -ne '\u201C\u201D') +$SED -i -e "s/[$SDQUO]/\'/g" -e "s/[$RDQUO]/\"/g" "${1}" +``` + +将此脚本保存为 `fixquotes.sh`,然后创建一个包含智能引号的单独测试文件: + +``` +‘Single quote’ +“Double quote” +``` + +运行该脚本,然后使用 [cat][4] 命令查看结果: + +``` +$ sh ./fixquotes.sh test.txt +$ cat test.txt +'Single quote' +"Double quote" +``` + +### 安装 sed + +如果你使用的是 Linux、BSD 或 macOS,那么你已经安装了 GNU 或 BSD 的 `sed`。这是原始 `sed` 命令的两个独特的重新实现,对于本文中的脚本来说,它们在功能上是一样的(不过并不是所有的脚本都是这样)。 + +在 Windows 上,你可以用 [Chocolatey][6] [安装 GNU sed][5]。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/9/sed-replace-smart-quotes + +作者:[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/code_computer_laptop_hack_work.png?itok=aSpcWkcl (Coding on a computer) +[2]: https://opensource.com/article/20/12/sed +[3]: https://opensource.com/article/21/8/what-busybox +[4]: https://opensource.com/article/19/2/getting-started-cat-command +[5]: https://chocolatey.org/packages/sed +[6]: https://opensource.com/article/20/3/chocolatey diff --git a/published/202109/20210915 How to check for update info and changelogs with rpm-ostree db.md b/published/202109/20210915 How to check for update info and changelogs with rpm-ostree db.md new file mode 100644 index 0000000000..a45df8003b --- /dev/null +++ b/published/202109/20210915 How to check for update info and changelogs with rpm-ostree db.md @@ -0,0 +1,112 @@ +[#]: subject: "How to check for update info and changelogs with rpm-ostree db" +[#]: via: "https://fedoramagazine.org/how-to-check-for-update-info-and-changelogs-with-rpm-ostree-db/" +[#]: author: "Mateus Rodrigues Costa https://fedoramagazine.org/author/mateusrodcosta/" +[#]: collector: "lujun9972" +[#]: translator: "geekpi" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13803-1.html" + +如何用 rpm-ostree 数据库检查更新信息和更新日志 +====== + +![][1] + +这篇文章将教你如何使用 `rpm-ostree` 数据库及其子命令检查更新、检查更改的软件包和阅读更新日志。 + +这些命令将在 Fedora Silverblue 上进行演示,并且应该在任何使用 `rpm-ostree` 的操作系统上工作。 + +### 简介 + +假设你对不可更改的系统感兴趣。在基于容器技术构建用例时使用只读的基本系统听起来非常有吸引力,它会说服你选择使用 `rpm-ostree` 的发行版。 + +你现在发现自己在 [Fedora Silverblue][4](或其他类似的发行版)上,你想检查更新。但你遇到了一个问题。虽然你可以通过 GNOME Software 找到 Fedora Silverblue 上的更新包,但你实际上无法阅读它们的更新日志。你也不能 [使用 dnf updateinfo 在命令行上读取它们][5],因为主机系统上没有 DNF。 + +那么,你应该怎么做呢?嗯,`rpm-ostree` 有一些子命令可以在这种情况下提供帮助。 + +### 检查更新 + +第一步是检查更新。只需运行: + +``` +$ rpm-ostree upgrade --check +... +AvailableUpdate: + Version: 34.20210905.0 (2021-09-05T20:59:47Z) + Commit: d8bab818f5abcfb58d2c038614965bf26426d55667e52018fcd295b9bfbc88b4 + GPGSignature: Valid signature by 8C5BA6990BDB26E19F2A1A801161AE6945719A39 + SecAdvisories: 1 moderate + Diff: 4 upgraded +``` + +请注意,虽然它没有在输出中告诉更新的软件包,但它显示了更新的提交为 `d8bab818f5abcfb58d2c038614965bf26426d55667e52018fcd295b9bfbc88b4`。这在后面会很有用。 + +接下来你需要做的是找到你正在运行的当前部署的提交。运行 `rpm-ostree status` 以获得当前部署的基提交BaseCommit: + +``` +$ rpm-ostree status +State: idle +Deployments: +● fedora:fedora/34/x86_64/silverblue + Version: 34.20210904.0 (2021-09-04T19:16:37Z) + BaseCommit: e279286dcd8b5e231cff15c4130a4b1f5a03b6735327b213ee474332b311dd1e + GPGSignature: Valid signature by 8C5BA6990BDB26E19F2A1A801161AE6945719A39 + RemovedBasePackages: ... + LayeredPackages: ... +... +``` + +对于这个例子,基提交是`e279286dcd8b5e231cff15c4130a4b1f5a03b6735327b213ee474332b311dd1e`。 + +现在你可以用 `rpm-ostree db diff [commit1] [commit2]` 找到这两个提交的差异。在这个命令中,`[commit1]` 将是当前部署的基提交,`[commit2]` 将是升级检查命令中的提交。 + +``` +$ rpm-ostree db diff e279286dcd8b5e231cff15c4130a4b1f5a03b6735327b213ee474332b311dd1e d8bab818f5abcfb58d2c038614965bf26426d55667e52018fcd295b9bfbc88b4 +ostree diff commit from: e279286dcd8b5e231cff15c4130a4b1f5a03b6735327b213ee474332b311dd1e +ostree diff commit to: d8bab818f5abcfb58d2c038614965bf26426d55667e52018fcd295b9bfbc88b4 +Upgraded: + soundtouch 2.1.1-6.fc34 -> 2.1.2-1.fc34 +``` + +`diff` 输出显示 `soundtouch` 被更新了,并指出了版本号。通过在前面的命令中加入 `-changelogs` 来查看更新日志: + +``` +$ rpm-ostree db diff e279286dcd8b5e231cff15c4130a4b1f5a03b6735327b213ee474332b311dd1e d8bab818f5abcfb58d2c038614965bf26426d55667e52018fcd295b9bfbc88b4 --changelogs +ostree diff commit from: e279286dcd8b5e231cff15c4130a4b1f5a03b6735327b213ee474332b311dd1e +ostree diff commit to: d8bab818f5abcfb58d2c038614965bf26426d55667e52018fcd295b9bfbc88b4 +Upgraded: + soundtouch 2.1.1-6.fc34.x86_64 -> 2.1.2-1.fc34.x86_64 + * dom ago 29 2021 Uwe Klotz - 2.1.2-1 + - Update to new upstream version 2.1.2 + Bump version to 2.1.2 to correct incorrect version info in configure.ac + + * sex jul 23 2021 Fedora Release Engineering - 2.1.1-7 + - Rebuilt for https://fedoraproject.org/wiki/Fedora_35_Mass_Rebuild +``` + +这个输出显示了提交说明以及版本号。 + +### 总结 + +使用 `rpm-ostree db`,你现在可以拥有相当于 `dnf check-update` 和 `dnf updateinfo` 的功能。 + +如果你想检查你所安装的更新的详细信息,这将非常有用。 + +-------------------------------------------------------------------------------- + +via: https://fedoramagazine.org/how-to-check-for-update-info-and-changelogs-with-rpm-ostree-db/ + +作者:[Mateus Rodrigues Costa][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://fedoramagazine.org/author/mateusrodcosta/ +[b]: https://github.com/lujun9972 +[1]: https://fedoramagazine.org/wp-content/uploads/2021/09/rpm-ostree-db_changelog-816x345.jpg +[2]: https://unsplash.com/@dancristianp?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText +[3]: https://unsplash.com/s/photos/backdrop?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText +[4]: https://fedoramagazine.org/what-is-silverblue/ +[5]: https://fedoramagazine.org/use-dnf-updateinfo-to-read-update-changelogs/ diff --git a/published/202109/20210915 Raspberry Pi Zero vs Zero W- What-s the Difference.md b/published/202109/20210915 Raspberry Pi Zero vs Zero W- What-s the Difference.md new file mode 100644 index 0000000000..b7b68fd5ce --- /dev/null +++ b/published/202109/20210915 Raspberry Pi Zero vs Zero W- What-s the Difference.md @@ -0,0 +1,96 @@ +[#]: subject: "Raspberry Pi Zero vs Zero W: What’s the Difference?" +[#]: via: "https://itsfoss.com/raspberry-pi-zero-vs-zero-w/" +[#]: author: "Ankush Das https://itsfoss.com/author/ankush/" +[#]: collector: "lujun9972" +[#]: translator: "anine09" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13799-1.html" + +树莓派 Zero 与 Zero W 对比 +====== + +树莓派十年前凭借 25 美元的迷你电脑掀起了一场革命。随着时间的推移,树莓派发布了许多变种。有些是对以前的型号进行升级,有些是为特定目的而制作的。 + +在所有的树莓派模块中,Pi Zero 和 Pi Zero W 是最便宜的型号,旨在用于小规模项目和 IoT 项目。这两种设备几乎是相同的,但是它们之间有一些微妙而重要的区别。 + +**那么,树莓派 Zero 和 Zero W 之间的区别是什么?Zero W 中的 W 代表的是无线Wireless,它表示的是 Zero W 模块拥有无线功能。这是这两个相似模块之间的最大差异。** + +让我们来详细了解一下。 + +### Pi Zero 与 Pi Zero W 之间的主要不同点 + +![][1] + +树莓派 Zero 是以在只有 A+ 板一半的大小上提供尽可能多的功能为目标。 + +而树莓派 Zero W 是为了支持无线在后来推出的,在不需要任何附加的组件和模块的情况下就可以使用蓝牙和 Wi-Fi。 + +这是两者之间的关键区别,其他的规格保持一致。 + +所以,如果你需要以下功能: + + * 802.11 b/g/n 无线网口 + * 蓝牙 4.1 + * 低功耗蓝牙(BLE) + +树莓派 Zero W 将是你的不二之选。 + +此外,树莓派 Zero W 还提供了一种带引脚的版本,叫做 “树莓派 Pi Zero WH” + +### 树莓派 Zero 和 Zero W 的规格 + +![Raspberry Pi Zero W][6] + +[树莓派 Zero 和 Zero W 的规格][7] 几乎是一样的。 + +它们都具有 1 GHz 的单核 CPU 和 512 MB 的 RAM。至于接口方面,一个 mini HDMI 接口,支持 micro USB OTG、micro USB 供电和一个 CSI 摄像头接口(用于插入一个相机模块)。 + +这些板子会提供一种叫 [HAT][8](顶部附加硬件Hardware Attached on Top)兼容的 40 个引脚。但一般情况下,没有这些可以让你轻松插入接口的引脚。 + +你可以根据自己的功能需要选择使用 [各种树莓派兼容的系统][9],但无论哪种情况,我还是推荐你使用树莓派 OS。 + +### 树莓派 Zero 系列值不值得买? + +![Raspberry Pi Zero][10] + +树莓派 Zero 是一种很受人们喜欢的单片机形式,即使你有很多树莓派 Zero 的替代品,树莓派 Zero 仍然是最推荐的选择。 + +当然,除非你有特殊需求。 + +除了板子的尺寸之外,定价、功率要求、运算能力也是这款 20 美元以下的板子的主要亮点。 + +因此,如果你正在寻找预算内满足基本功能的单片机,树莓派 Zero 就是专门为你打造的。 + +### 树莓派 Zero 系列价格怎么样? + +树莓派 Zero 售价 **5 美元** ,Zero W 售价 **10 美元左右**,当然,根据其供应情况和地区,定价规则会不一样,如果你选择带引脚的版本树莓派 Zero WH ,售价大概是 **14 美元** 左右。 + +还有 [其他的设备可以代替树莓派 Zero][11],它们价格也相差不大。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/raspberry-pi-zero-vs-zero-w/ + +作者:[Ankush Das][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://itsfoss.com/author/ankush/ +[b]: https://github.com/lujun9972 +[1]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/09/raspberry-pi-zero-vs-zero-w.png?resize=800%2C450&ssl=1 +[2]: https://i1.wp.com/m.media-amazon.com/images/I/517BwcAPmTL._SL160_.jpg?ssl=1 +[3]: https://www.amazon.com/dp/B072N3X39J?tag=chmod7mediate-20&linkCode=osi&th=1&psc=1 "CanaKit Raspberry Pi Zero W (Wireless) Complete Starter Kit - 16 GB Edition" +[4]: https://www.amazon.com/gp/prime/?tag=chmod7mediate-20 "Amazon Prime" +[5]: https://www.amazon.com/dp/B072N3X39J?tag=chmod7mediate-20&linkCode=osi&th=1&psc=1 "Buy on Amazon" +[6]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/09/raspberry-pi-zero-w.png?resize=600%2C400&ssl=1 +[7]: https://itsfoss.com/raspberry-pi-zero-w/ +[8]: https://github.com/raspberrypi/hats +[9]: https://itsfoss.com/raspberry-pi-os/ +[10]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/09/raspberry-pi-zero-1.png?resize=600%2C400&ssl=1 +[11]: https://itsfoss.com/raspberry-pi-zero-alternatives/ +[12]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/10/raspberry-pi-zero-w-projects.png?fit=800%2C450&ssl=1 +[13]: https://itsfoss.com/raspberry-pi-zero-projects/ diff --git a/published/202109/20210915 Screen Recording in Linux With OBS and Wayland.md b/published/202109/20210915 Screen Recording in Linux With OBS and Wayland.md new file mode 100644 index 0000000000..931655002d --- /dev/null +++ b/published/202109/20210915 Screen Recording in Linux With OBS and Wayland.md @@ -0,0 +1,125 @@ +[#]: subject: "Screen Recording in Linux With OBS and Wayland" +[#]: via: "https://itsfoss.com/screen-record-obs-wayland/" +[#]: author: "Abhishek Prakash https://itsfoss.com/author/abhishek/" +[#]: collector: "lujun9972" +[#]: translator: "geekpi" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13802-1.html" + +在 Linux 中使用 OBS 和 Wayland 进行屏幕录制 +====== + +有 [大量可用于 Linux 的屏幕录像机][1]。但是当涉及到支持 [Wayland][2] 时,几乎所有的都不能用。 + +这是个问题,因为许多新发布的版本都再次默认切换到 Wayland 显示管理器。而如果像屏幕录像机这样基本的东西不能工作,就会给人留下不好的体验。 + +[GNOME 的内置屏幕录像机][3] 可以工作,但它是隐藏的,没有 GUI,也没有办法配置和控制记录内容。此外,还有一个叫 [Kooha][4] 的工具,但它一直在屏幕上显示一个计时器。 + +只是为了录制屏幕而 [在 Xorg 和 Wayland 之间切换][5],这不是很方便。 + +这种情况下,我很高兴地得知,由于 Pipewire 的帮助,在 OBS Studio v27 中支持了 Wayland。但即使是这样,也不是很简单,因此我将向你展示使用 [OBS Studio][6] 在 Wayland 上录制屏幕的步骤。 + +### 使用 OBS 在 Wayland 上进行屏幕录制 + +![][7] + +让我们来看看它是如何完成的。 + +#### 第一步:安装 OBS Studio + +你应该先安装 OBS Studio v27。它已经包含在 Ubuntu 21.10 中,我会在本教程中使用它。 + +要在 Ubuntu 18.04、20.04、Linux Mint 20 等系统上安装 OBS Studio 27,请使用 [官方的 OBS Studio PPA][8]。 + +打开终端,逐一使用以下命令: + +``` +sudo add-apt-repository ppa:obsproject/obs-studio +sudo apt update +sudo apt install obs-studio +``` + +如果已经安装了 OBS Studio 的旧版本,它将被升级到较新的版本。 + +对于 Fedora、Arch 和其他发行版,请检查你的包管理器或非官方仓库以安装最新版本的 OBS Studio。 + +#### 第二步:检查 Wayland 捕获是否工作 + +请确认你正在使用 Wayland。现在启动 OBS Studio,查看它在第一次运行时显示的所有内容。我不打算展示这些。 + +主要步骤是添加 Pipewire 作为屏幕捕捉源。点击 “Sources” 列表下的 “+” 符号。 + +![Add screen capture source in OBS Studio][9] + +你有没有看到 “Screen Capture (PipeWire)” 的字样? + +![Do you see PipeWire option in the screen sources?][10] + +**如果没看到,请退出 OBS Studio**。这很正常。至少在 Ubuntu 下,OBS Studio 不会自动切换到使用 Wayland。对此有一个修复方法。 + +打开一个终端,使用以下命令: + +``` +export QT_QPA_PLATFORM=wayland +``` + +在同一个终端,运行以下命令,启动 OBS Studio: + +``` +obs +``` + +它将在终端上显示一些信息。不要理会它们。你的注意力应该放在 OBS Studio GUI 上。再次尝试添加屏幕捕捉。你现在应该看到 PipeWire 选项了。 + +![][10] + +你这次用 `QT_QPA_PLATFORM` 变量明确要求 OBS Studio 使用 Wayland。 + +选择 PipeWire 作为源,然后它要求你选择一个显示屏幕。选择它并点击分享按钮。 + +![][11] + +现在它应该无限次递归地显示你的屏幕。如果你看到了,你现在就可以开始在 Wayland 中录制屏幕了。 + +![][12] + +#### 第三步:让改变成为永久性的 + +这很好。你刚刚验证了你可以在 Wayland 上录制屏幕。但每次设置环境变量并从终端启动 OBS 并不方便。 + +你可以做的是**把这个变量导出到你的 `~/.bash_profile`(对你而言)或 `/etc/profile`(对系统中的所有用户而言)。** + +``` +export QT_QPA_PLATFORM=wayland +``` + +退出并重新登录。现在 OBS 会自动开始使用这个参数,你可以用它来录制 Wayland 的屏幕。 + +我希望这个快速技巧对你有帮助。如果你还有问题或建议,请在评论区告诉我。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/screen-record-obs-wayland/ + +作者:[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/best-linux-screen-recorders/ +[2]: https://wayland.freedesktop.org/ +[3]: https://itsfoss.com/gnome-screen-recorder/ +[4]: https://itsfoss.com/kooha-screen-recorder/ +[5]: https://itsfoss.com/switch-xorg-wayland/ +[6]: https://obsproject.com/ +[7]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/09/obs-screen-record-wayland.webp?resize=800%2C450&ssl=1 +[8]: https://launchpad.net/~obsproject/+archive/ubuntu/obs-studio +[9]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/09/obs-studio-add-screen-capture-source.png?resize=800%2C537&ssl=1 +[10]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/09/obs-studio-wayland-support.png?resize=800%2C538&ssl=1 +[11]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/09/obs-studio-screen.png?resize=800%2C578&ssl=1 +[12]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/09/start-screen-recording-obs-wayland.jpg?resize=800%2C537&ssl=1 diff --git a/published/202109/20210916 Kali Linux 2021.3 Brings in Kali Live VM Support, New Tools, and Other Improvements.md b/published/202109/20210916 Kali Linux 2021.3 Brings in Kali Live VM Support, New Tools, and Other Improvements.md new file mode 100644 index 0000000000..64d25716e9 --- /dev/null +++ b/published/202109/20210916 Kali Linux 2021.3 Brings in Kali Live VM Support, New Tools, and Other Improvements.md @@ -0,0 +1,107 @@ +[#]: subject: "Kali Linux 2021.3 Brings in Kali Live VM Support, New Tools, and Other Improvements" +[#]: via: "https://news.itsfoss.com/kali-linux-2021-3-release/" +[#]: author: "Omar Maarof https://news.itsfoss.com/author/omar/" +[#]: collector: "lujun9972" +[#]: translator: "wxy" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13798-1.html" + +Kali Linux 2021.3 的新改进 +====== + +> Kali Linux 2021.3 带来了一些重要的功能改进以及一些新工具。此外还有一个惊喜,他们还宣布正在开发他们的第一个 NetHunter 智能手表。 + +![](https://i2.wp.com/news.itsfoss.com/wp-content/uploads/2021/09/kali-linux-2021-3.jpg?w=1200&ssl=1) + +Kali Linux 是 [用于渗透测试的最佳 Linux 发行版][1] 之一。它是基于 Debian 的,但它可能不适合替代你的成熟的桌面操作系统。 + +最新的 2021.3 版本带来了一些重要的功能添加和改进。让我们来看看它们。 + +### 有何新变化? + +![][2] + +#### OpenSSL 兼容性 + +重新配置了 [OpenSSL][3],以扩大 Kali 可以连接的服务。因此,老式过期的协议,如 TLS 1.0 和 TLS 1.1 以及更旧的加密算法,在默认情况下是允许的。也就是说;它将让 Kali 可以连接到更多过时的服务器。然而,如果你不需要它,你可以改变这个选项。 + +#### 虚拟化的改进 + +众所周知,Kali 可以作为一个虚拟机完美地工作。首先,无论你的访客机是在 VirtualBox、VMware、Hyper-V 还是 QEMU+Spice 下运行,宿主机和访客机系统之间的拖放、复制和粘贴等操作都比以前更顺畅。 + +其次,使用 Kali-Tweaks 可以更容易为 Hyper-V 增强会话模式(一种虚拟化管理程序)配置 Kali。 + +简而言之,Kali Linux 2021.3 使得在设置虚拟环境时的体验更加完美。 + +#### Kali 工具 + +每一个 Kali 版本都包含新的工具,这是理所当然的。同样的,这个版本也不例外。Kali 加入的工具有: + + * [Berate_ap][4] - 编组 MANA rogue Wi-Fi 接入点 + * [CALDERA][5] - 可扩展的自动对手模拟平台 + * [EAPHammer][6] - 针对 WPA2-Enterprise Wi-Fi 网络的 evil twin 攻击 + * [HostHunter][7] - 使用 OSINT 技术发现主机名的侦察工具 + * [RouterKeygenPC][8] - 生成默认的 WPA/WEP 无线密钥 + * [Subjack][9] - 子域接管 + * [WPA_Sycophant][10] - EAP 中继攻击的邪恶客户端部分 + +#### Kali ARM 更新和 Kali-Tools + +在 Kali 2021.3 中,对 ARM 设备的支持得到了更多的改进。我发现最吸引人的是: + + * en_US.UTF-8 是所有镜像的默认语言。 + * 重新构建了 Kali ARM 构建脚本,以更好地支持一些设备。 + * 树莓派镜像现在可以使用 `/boot` 分区上的 `wpa_supplicant.conf` 文件。 + +此外,Kali 刷新了其信息域 **Kali-Tools**,以提供简洁的工具概述、整洁的界面和快速的系统。 + +### 其他变化 + +![Kali Linux 2021.3][11] + +Kali 还有其他一些不错的改进,包括: + + * 改进了 Xfce 和 Gnome 版本的布局。Kali 并没有忘记 KDE,因为这是它最喜欢的桌面环境之一,已经内置了 KDE 5.21 是新的版本。 + * 他们的文档网站中的一些重要页面进行了大幅更新。 + * 与 Ampere 合作,让其 ARM 包构建机运行在 Ampere 的硬件上。因此,其大幅的提速使得 Kali 受益。 + +Kali 增强了针对安卓设备的移动渗透测试平台。换句话说,你现在可以在 Android 11 设备上安装 Kali NetHunter,而不需要完整的可工作的 [TWRP][12](Team Win Recovery Project)。最重要的是,由于其方便的安装程序,这一更新很有希望。 + +除了这个版本之外,他们还宣布了他们的第一个 NetHunter 智能手表,**TicHunter Pro**。但是,它仍然处于开发的最初阶段。 + +要了解更多关于这次升级的所有技术变化,请参考 [官方公告][13]。 + +### 总结 + +总的来说,这是一个重要的版本,提供了重要的改进和令人兴奋的新工具。从它的官方网站上下载它,就可以开始了。 + +- [下载 Kali Linux 2021.3][14] + +-------------------------------------------------------------------------------- + +via: https://news.itsfoss.com/kali-linux-2021-3-release/ + +作者:[Omar Maarof][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://news.itsfoss.com/author/omar/ +[b]: https://github.com/lujun9972 +[1]: https://itsfoss.com/linux-hacking-penetration-testing/ +[2]: https://i1.wp.com/news.itsfoss.com/wp-content/uploads/2021/09/kali-linux-desktop-2021-3.png?w=1200&ssl=1 +[3]: https://www.openssl.org/ +[4]: https://pkg.kali.org/pkg/berate-ap +[5]: https://pkg.kali.org/pkg/caldera +[6]: https://pkg.kali.org/pkg/eaphammer +[7]: https://pkg.kali.org/pkg/hosthunter +[8]: https://pkg.kali.org/pkg/routerkeygenpc +[9]: https://pkg.kali.org/pkg/subjack +[10]: https://pkg.kali.org/pkg/wpa-sycophant +[11]: https://i0.wp.com/news.itsfoss.com/wp-content/uploads/2021/09/banner-kali-2021.3-release.jpg?w=1200&ssl=1 +[12]: http://twrp.me/ +[13]: https://www.kali.org/blog/kali-linux-2021-3-release/ +[14]: https://www.kali.org/get-kali/ diff --git a/published/202109/20210916 Watch commands and tasks with the Linux watch command.md b/published/202109/20210916 Watch commands and tasks with the Linux watch command.md new file mode 100644 index 0000000000..4bd279ab40 --- /dev/null +++ b/published/202109/20210916 Watch commands and tasks with the Linux watch command.md @@ -0,0 +1,116 @@ +[#]: subject: "Watch commands and tasks with the Linux watch command" +[#]: via: "https://opensource.com/article/21/9/linux-watch-command" +[#]: author: "Moshe Zadka https://opensource.com/users/moshez" +[#]: collector: "lujun9972" +[#]: translator: "geekpi" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13810-1.html" + +用 Linux 的 watch 命令观察命令和任务 +====== + +> 了解 watch 命令如何让你知道任务已完成或命令已执行。 + +![](https://img.linux.net.cn/data/attachment/album/202109/22/104541ddfgzpvud5ga55sp.jpg) + +有很多时候,你需要等待一些事情的完成,比如: + + * 一个文件的下载。 + * 创建或解压一个 [tar][2] 文件。 + * 一个 [Ansible][3] 作业。 + +其中一些进程有进度指示,但有时进程是通过一层抽象运行的,衡量进度的唯一方法是通过其副作用。其中一些可能是: + + * 一个正在下载的文件不断增长。 + * 一个从 tarball 中提取的目录被文件填满了。 + * Ansible 作业构建了一个[容器][4]。 + +你可以用这样的命令查询所有这些: + +``` +$ ls -l downloaded-file +$ find . | wc -l +$ podman ps +$ docker ps +``` + +但是反复运行这些命令,即使是利用 [Bash 历史][5] 和**向上箭头**的便利,也是很乏味的。 + +另一种方法是写一个小的 Bash 脚本来为你自动执行这些命令: + +``` +while : +do + docker ps + sleep 2 +done +``` + +但这样的脚本写起来也会很繁琐。你可以写一个小的通用脚本,并将其打包,这样它就可以一直被你使用。幸运的是,其他开源的开发者已经有了这样的经验和做法。 + +那就是 `watch` 这个命令。 + +### 安装 watch + +`watch` 命令是 [procps-ng 包][6]的一部分,所以如果你是在 Linux 上,你已经安装了它。 + +在 macOS 上,使用 [MacPorts][7] 或 [Homebrew][8] 安装 `watch`。在 Windows 上,使用 [Chocolatey][9]。 + +### 使用 watch + +`watch` 命令定期运行一个命令并显示其输出。它有一些文本终端的特性,所以只有最新的输出才会出现在屏幕上。 + +最简单的用法是:`watch `。 + +例如,在 `docker ps` 命令前加上 `watch`,就可以这样操作: + +``` +$ watch docker ps +``` + +用 `watch` 命令,以及一些创造性的 Unix 命令行技巧,可以生成临时的仪表盘。例如,要计算审计事件: + +``` +$ watch 'grep audit: /var/log/kern.log |wc -l' +``` + +在最后一个例子中,如果有一个可视化的指示,表明审计事件的数量发生了变化,这可能是有用的。如果变化是预期的,但你想让一些东西看起来“不同”,`watch --differences` 就很好用。它可以高亮显示与上次运行的任何差异。如果你在多个文件中搜索,这一点尤其有效,所以你可以很容易地看到哪个文件发生了变化。 + +如果没有预期的变化,你可以使用 `watch --differences=permanent` 要求它们被“永久”高亮显示,以便知道哪些变化需要调查。这通常是更有用的。 + +### 控制频率 + +最后,有时该命令可能是资源密集型的,不应运行得太频繁。`-n` 参数控制频率。`watch` 默认使用 2 秒间隔,但是 `watch -n 10` 可能适合于资源密集型的情况,比如在子目录的任何文件中搜索一个模式: + +``` +$ watch -n 10 'find . -type f | xargs grep suspicious-pattern' +``` + +### 用 watch 观察一个命令 + +`watch` 命令对于许多临时性的系统管理任务非常有用,在这些任务中,你需要在没有进度条的情况下等待一些耗时的步骤,然后再进入下一个步骤。尽管这种情况并不理想,但 `watch` 可以使情况稍微好转。它让你有时间为工作做回顾性笔记!"。下载 [备忘录][10],让有用的语法和选项触手可及。。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/9/linux-watch-command + +作者:[Moshe Zadka][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/moshez +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/desk_clock_job_work.jpg?itok=Nj4fuhl6 (Clock, pen, and notepad on a desk) +[2]: https://opensource.com/article/17/7/how-unzip-targz-file +[3]: https://opensource.com/resources/what-ansible +[4]: https://opensource.com/resources/what-docker +[5]: https://opensource.com/article/20/6/bash-history-control +[6]: https://opensource.com/article/21/8/linux-procps-ng +[7]: https://opensource.com/article/20/11/macports +[8]: https://opensource.com/article/20/6/homebrew-mac +[9]: https://opensource.com/article/20/3/chocolatey +[10]: https://opensource.com/downloads/watch-cheat-sheet diff --git a/published/202109/20210917 How to Install Kali Linux in VMware.md b/published/202109/20210917 How to Install Kali Linux in VMware.md new file mode 100644 index 0000000000..0312e49ddf --- /dev/null +++ b/published/202109/20210917 How to Install Kali Linux in VMware.md @@ -0,0 +1,194 @@ +[#]: subject: "How to Install Kali Linux in VMware" +[#]: via: "https://itsfoss.com/install-kali-linux-vmware/" +[#]: author: "Ankush Das https://itsfoss.com/author/ankush/" +[#]: collector: "lujun9972" +[#]: translator: "wxy" +[#]: reviewer: "wxy" +[#]: publisher: " " +[#]: url: " " + +如何在 VMware 中安装 Kali Linux +====== + +![](https://img.linux.net.cn/data/attachment/album/202109/21/144206sjhgutyjgtu6m22z.jpg) + +Kali Linux 是 [用于学习和练习黑客攻击和渗透测试的 Linux 发行版][1] 的不二之选。 + +而且,如果你经常捣鼓 Linux 发行版,出于好奇心,你可能已经尝试过它。 + +> **警告!** +> +> 本文介绍的内容仅供学习 Kali Linux 的安装,请勿使用 Kali Linux 进行任何非授权的行为。Kali Linux 应该用于在授权的情况下,对授权的目标进行合理的渗透测试,以了解其脆弱性并加以防范。本文作译者和本站均不对非授权和非法的使用及其造成的后果负责。 + +然而,无论你用它做什么,它都不能替代正规成熟的桌面 Linux 操作系统。因此,(至少对于初学者来说)建议使用虚拟机程序(如 VMware)来安装 Kali Linux。 + +通过虚拟机,你可以把 Kali Linux 作为你的 Windows 或 Linux 系统中的一个常规应用程序来使用,就像在你的系统中运行 VLC 或 Skype 一样。 + +有一些免费的虚拟化工具可供使用。你可以 [在 Oracle VirtualBox 上安装 Kali Linux][2] ,也可以使用 VMWare Workstation。 + +本教程重点介绍 VMWare。 + +### 在 Windows 和 Linux 的 VMware 上安装 Kali Linux + +> **非 FOSS 警报!** +> +> VMWare 不是开源软件。 + +对于本教程,我假定你使用的是 Windows,是考虑到大多数 VMware 用户喜欢使用 Windows 10/11。 + +然而,除了在 Windows 上安装 VMWare 的部分,本 **教程对 Linux 也是有效的**。你可以 [轻松地在 Ubuntu 和其他 Linux 发行版上安装 VMWare][3]。 + +#### 步骤 1:安装 VMWare Workstation Player(在 Windows 上) + +如果你的系统上已经安装了 VMware,你可以跳到安装 Kali Linux 的步骤。 + +前往 [VMWare 的 Workstation Player 官方网页][4],然后点击 “Download For Free” 按钮。 + +![][5] + +接下来,你可以选择版本(如果你想要特定的版本或遇到最新版本的 bug),然后点击 “Go to Downloads”。 + +![][6] + +然后你就会看到 Windows 和 Linux 版本的下载按钮。你需要点击 “Windows 64-bit” 的按钮,因为这就是我们在这里需要的。 + +![][7] + +顺便提一句,它不支持 32 位系统。 + +最后,当你得到下载的 .exe 文件时,启动它以开始安装过程。你需要点击 “Next” 来开始安装 VMware。 + +![][8] + +接下来,你需要同意这些政策和条件才能继续。 + +![][9] + +现在,你可以选择安装的路径。理想情况下,保持默认设置。但是,如果你在虚拟机中需要更好的键盘响应/屏幕上的键盘性能,你可能想启用 “增强型键盘驱动程序Enhanced Keyboard Driver”。 + +![][10] + +进入下一步,你可以选择禁用每次启动程序时的更新检查(可能很烦人),并禁用向 VMware 发送数据,这是其用户体验改进计划的一部分。 + +![][11] + +如果你想使用桌面和开始菜单的快捷方式进行快速访问,你可以勾选这些设置,或像我一样将其取消。 + +![][12] + +现在,继续以开始安装。 + +![][13] + +这可能需要一些时间,完成后,你会看到另一个窗口,让你完成这个过程,并让你选择输入一个许可证密钥。如果你想获得商业许可,你需要 VMware Workstation 专业版,否则,该 Player 版本对个人使用是免费的。 + +![][14] + +> **注意!** +> +> 请确保你的系统已经启用了虚拟化功能。最近的 VMWare 的 Windows 版本要求你明确启用虚拟化以使用虚拟机。 + +#### 步骤 2:在 VMware 上安装 Kali Linux + +开始时,你需要下载 Kali Linux 的镜像文件。而且,如果你打算在虚拟机上使用它,Kali Linux 会提供一个单独的 ISO 文件。 + +![][15] + +前往其 [官方下载页面][16],下载可用的预构建的 VMware 镜像。 + +![][17] + +你可以直接下载 .7z 文件或利用 Torrent(一般来说速度更快)。在这两种情况下,你也可以用提供的 SHA256 值检查文件的完整性。 + +下载完成,你需要将文件解压到你选择的任何路径。 + +![][18] + +打开 VMware Workstation Player,然后点击 “打开一个虚拟机Open a Virtual Machine”。现在,寻找你提取的文件夹。然后浏览它,直到你找到一个扩展名为 .vmx 的文件。 + +比如说,`Kali-Linux-2021.3-vmware-amd64.vmx`。 + +![][19] + +选择 .vmx 文件来打开该虚拟机。它应该直接出现在你的 VMware Player 中。 + +你可以选择以默认设置启动虚拟机。或者,如果你想调整分配给虚拟机的硬件,可以在启动前随意改变设置。 + +![][20] + +根据你的计算机硬件,你应该分配更多的内存和至少一半的处理器核心,以获得流畅的性能。 + +在这种情况下,我有 16GB 的内存和一个四核处理器。因此,为这个虚拟机分配近 7GB 的内存和两个内核是安全的。 + +![][21] + +虽然你可以分配更多的资源,但它可能会影响你的宿主机操作系统在工作时的性能。所以,建议在这两者之间保持平衡。 + +现在,保存设置并点击 “播放虚拟机Play virtual machine” 来启动 Kali Linux on VMware。 + +当它开始加载时,你可能会看到一些提示,告诉你可以通过调整一些虚拟机设置来提高性能。 + +你不用必须这样做,但如果你注意到性能问题,你可以禁用侧通道缓解措施side-channel mitigations(用于增强安全性)来提高虚拟机的性能。 + +另外,你可能会被提示下载并 [安装 VMware tools for Linux][22];你需要这样做以获得良好的虚拟机体验。 + +完成之后,你就会看到 Kali Linux 的登录界面。 + +![][23] + +考虑到你启动了一个预先建立的 VMware 虚拟机,你需要输入默认的登录名和密码来继续。 + +- 用户名:`kali` +- 密码: `kali` + +![][24] + +就是这样!你已经完成了在 VMware 上安装 Kali Linux。现在,你所要做的就是开始探索了! + +### 接下来呢? + +这里有一些你可以利用的提示: + + * 如果剪贴板共享和文件共享不工作,请在访客系统(Kali Linux)上 [安装 VMWare tools][22]。 + * 如果你是新手,请查看这个 [Kali Linux 工具列表][25]。 + +如果你觉得这个教程有帮助,欢迎分享你的想法。你是否喜欢在不使用 VMware 镜像的情况下安装 Kali Linux?请在下面的评论中告诉我。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/install-kali-linux-vmware/ + +作者:[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/linux-hacking-penetration-testing/ +[2]: https://itsfoss.com/install-kali-linux-virtualbox/ +[3]: https://itsfoss.com/install-vmware-player-ubuntu-1310/ +[4]: https://www.vmware.com/products/workstation-player.html +[5]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/09/vmware-player-download.png?resize=732%2C486&ssl=1 +[6]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/09/vmware-player-download-1.png?resize=800%2C292&ssl=1 +[7]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/09/vmware-player-download-final.png?resize=800%2C212&ssl=1 +[8]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/09/vmware-setup-1.png?resize=692%2C465&ssl=1 +[9]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/09/vmware-setup-license.png?resize=629%2C443&ssl=1 +[10]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/09/vmware-setup-2.png?resize=638%2C440&ssl=1 +[11]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/09/vmware-workstation-tracking.png?resize=618%2C473&ssl=1 +[12]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/09/vmware-workstation-shortcuts.png?resize=595%2C445&ssl=1 +[13]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/09/vmware-player-install.png?resize=620%2C474&ssl=1 +[14]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/09/vmware-player-installed.png?resize=589%2C441&ssl=1 +[15]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/09/vmware-image-kali.png?resize=800%2C488&ssl=1 +[16]: https://www.kali.org/get-kali/ +[17]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/09/vmware-kali-linux-image-download.png?resize=800%2C764&ssl=1 +[18]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/09/extract-vmware-image.png?resize=617%2C359&ssl=1 +[19]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/09/vmware-kali-linux-image-folder.png?resize=800%2C498&ssl=1 +[20]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/09/virtual-machine-settings-kali.png?resize=800%2C652&ssl=1 +[21]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/09/kali-vm-settings.png?resize=800%2C329&ssl=1 +[22]: https://itsfoss.com/install-vmware-tools-linux/ +[23]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/09/kali-linux-vm-login.png?resize=800%2C540&ssl=1 +[24]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/09/vmware-kali-linux.png?resize=800%2C537&ssl=1 +[25]: https://itsfoss.com/best-kali-linux-tools/ diff --git a/published/202109/20210917 Start using YAML now.md b/published/202109/20210917 Start using YAML now.md new file mode 100644 index 0000000000..51a6134df8 --- /dev/null +++ b/published/202109/20210917 Start using YAML now.md @@ -0,0 +1,126 @@ +[#]: subject: "Start using YAML now" +[#]: via: "https://opensource.com/article/21/9/intro-yaml" +[#]: author: "Ayush Sharma https://opensource.com/users/ayushsharma" +[#]: collector: "lujun9972" +[#]: translator: "geekpi" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13811-1.html" + +YAML 使用入门 +====== + +> 什么是 YAML,为什么我们现在应该开始使用它? + +![](https://img.linux.net.cn/data/attachment/album/202109/23/095242fw0qzzp5fe6e565z.jpg) + +[YAML](https://yaml.org/)(YAML 不是标记语言YAML Ain't Markup Language)是一种适宜阅读理解的数据序列化语言。它的语法简单而易于阅读。它不包含引号、打开和关闭的标签或大括号。它不包含任何可能使人类难以解析嵌套规则的东西。你可以看一下你的 YAML 文档就知道它在什么。 + +### YAML 特性 + +YAML 有一些超级特性,使其优于其他序列化格式: + + * 易于略读。 + * 易于使用。 + * 可在编程语言之间移植。 + * 敏捷语言的原生数据结构。 + * 支持通用工具的一致模型。 + * 支持一次性处理。 + * 表现力和可扩展性。 + +我将通过一些例子进一步向你展示 YAML 的强大。 + +你能弄清楚下面发生了什么吗? + +``` +------- +# My grocery list +groceries: + - Milk + - Eggs + - Bread + - Butter +... +``` + +上面的例子包含了一个简单的杂货购物清单,它是一个完全格式化的 YAML 文档。在 YAML 中,字符串不加引号,而列表需要简单的连字符和空格。一个 YAML 文档以 `---` 开始,以 `...` 结束,但它们是可选的。YAML中的注释以 `#` 开始。 + +缩进是 YAML 的关键。缩进必须包含空格,而不是制表符。虽然所需的空格数量是灵活的,但保持一致是个好主意。 + +### 基本元素 + +#### 集合 + +YAML 有两种类型的集合。列表(用于序列)和字典(用于映射)。列表是键值对,每个值都在一个新的行中,以连字符和空格开始。字典也是键值对,每个值都是一个映射,包含一个键、一个冒号和空格以及一个值。 + +例如: + +``` +# My List +groceries: + - Milk + - Eggs + - Bread + - Butter + +# My dictionary +contact: + name: Ayush Sharma + email: myemail@example.com +``` + +列表和字典经常被结合起来,以提供更复杂的数据结构。列表可以包含字典,而字典可以包含列表。 + +#### 字符串 + +YAML 中的字符串不需要加引号。多行字符串可以用 `|` 或 `>` 来定义。前者保留了换行符,而后者则没有。 + +例如: + +``` +my_string: | + This is my string. + It can contain many lines. + Newlines are preserved. +``` + +``` +my_string_2: > + This is my string. + This can also contain many lines. + Newlines aren't preserved and all lines are folded. +``` + +#### 锚点 + +YAML 可以通过节点锚点来获得可重复的数据块。`&` 字符定义了一个数据块,以后可以用 `*` 来引用。例如: + +``` +billing_address: &add1 + house: B1 + street: My Street + +shipping_address: *add1 +``` + +至止你对 YAML 的了解就足以让你开始工作了。你可以使用在线 YAML 解析器来测试。如果你每天都与 YAML 打交道,那么 [这个方便的备忘单][3] 会对你有所帮助。 + +_这篇文章最初发表在[作者的个人博客][4]上,并经授权改编。_ + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/9/intro-yaml + +作者:[Ayush Sharma][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/ayushsharma +[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]: mailto:myemail@example.com +[3]: https://yaml.org/refcard.html +[4]: https://notes.ayushsharma.in/2021/08/introduction-to-yaml diff --git a/published/202109/20210918 How to Install Ubuntu Desktop on Raspberry Pi 4.md b/published/202109/20210918 How to Install Ubuntu Desktop on Raspberry Pi 4.md new file mode 100644 index 0000000000..809d57ea63 --- /dev/null +++ b/published/202109/20210918 How to Install Ubuntu Desktop on Raspberry Pi 4.md @@ -0,0 +1,235 @@ +[#]: subject: "How to Install Ubuntu Desktop on Raspberry Pi 4" +[#]: via: "https://itsfoss.com/install-ubuntu-desktop-raspberry-pi/" +[#]: author: "Avimanyu Bandyopadhyay https://itsfoss.com/author/avimanyu/" +[#]: collector: "lujun9972" +[#]: translator: "wxy" +[#]: reviewer: "turbokernel" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13817-1.html" + +如何在树莓派 4 上安装 Ubuntu 桌面系统 +====== + +> 本教程将详细告诉你在树莓派 4 设备上如何安装 Ubuntu 桌面。 + +![](https://img.linux.net.cn/data/attachment/album/202109/25/084015z4cfiiy8e1ezmmz0.jpg) + +革命性的树莓派Raspberry Pi是最受欢迎的单板计算机。它拥有基于 Debian 的操作系统,叫做 [树莓派操作系统][1]Raspberry Pi OS(原名 Raspbian)。 + +还有其他几个 [可用于树莓派的操作系统][2],但几乎所有的都是轻量级的,适合于树莓派设备的小尺寸和低端硬件。 + +随着标榜 8GB 内存和支持 4K 显示的树莓派 4B 的推出,情况发生了变化。其目的是将树莓派作为常规桌面使用,并在更大程度上成功地做到了这一点。 + +在 4B 型号之前,你可以 [在树莓派上安装 Ubuntu 服务器][3],但桌面版本却无法使用。然而,**Ubuntu 现在为树莓派 4 提供了官方的桌面镜像**。 + +在本教程中,我将展示在树莓派 4 上安装 Ubuntu 桌面的步骤。 + +首先,快速了解一下运行要求。 + +### 在树莓派 4 上运行 Ubuntu 的要求 + +![][4] + +以下是你需要的东西: + + 1. 一个能够联网的 Linux 或 Windows 系统。 + 2. [树莓派镜像工具][5] :树莓派的官方开源工具,可以在你的 SD 卡上写入发行版镜像。 + 3. Micro SD 卡:最低使用 16GB 的存储卡,推荐使用 32GB 的版本。 + 4. 一个基于 USB 的 Micro SD 卡读卡器(如果你的电脑没有读卡器)。 + 5. 树莓派 4 必备配件,如 HDMI 兼容显示器、[Micro HDMI 连接到标准 HDMI(A/M) 接口的电缆][6]、[电源(建议使用官方适配器)][7]、USB 的有线/无线键盘和鼠标/触摸板。 + +最好能够提前 [详细阅读树莓派的要求][8] 。 + +现在,闲话少叙,让我快速带领你完成 SD 卡的镜像准备。 + +### 为树莓派准备 Ubuntu 桌面镜像 + +树莓派提供了一个 GUI 应用程序,用于将 ISO 镜像写入 SD 卡中。**这个工具还可以自动下载兼容的操作系统,如 Ubuntu、树莓派操作系统等**。 + +![下载并将操作系统放入 SD 卡的官方工具][9] + +你可以从官方网站上下载这个工具的 Ubuntu、Windows 和 macOS 版本: + +- [下载树莓派镜像工具][10] + +在 Ubuntu 和其他 Linux 发行版上,你也可以使用 Snap 安装它: + +``` +sudo snap install rpi-imager +``` + +安装完毕后,运行该工具。当你看到下面的界面时,选择 “选择操作系统CHOOSE OS”: + +![镜像工具:选择首选操作系统][11] + +在“操作系统Operating System”下,选择 “其它通用的操作系统Other general purpose OS”: + +![镜像工具: 其他通用的操作系统][12] + +现在,选择 “Ubuntu”: + +![镜像工具:发行版 - Ubuntu][13] + +接下来,选择 “Ubuntu Desktop 21.04(RPI 4/400)”,如下图所示。 + +![镜像工具:发行版 - Ubuntu 21.04][14] + +> **注意:** +> +> 如果你没有一个稳定的网络连接,你可以 [从 Ubuntu 的网站上单独下载 Ubuntu 的树莓派镜像][15]。在镜像工具中,在选择操作系统时,从底部选择“使用自定义Use custom”选项。你也可以使用 Etcher 将镜像写入到 SD 卡上。 + +将 Micro SD 卡插入读卡器中,等待它挂载。选择“存储设备Storage”下的 “选择存储设备CHOOSE STORAGE”: + +![镜像工具:选择存储设备(SD 卡)][16] + +你应该可以根据存储空间大小,识别你的 Micro SD 卡。这里,我使用的是 32GB 的卡: + +![镜像工具:选择 SD 卡][17] + +现在点击“写入WRITE”: + +![镜像工具:镜像写入][18] + +如果你已经备份了 SD 卡上的内容或是一张新卡,你可以直接进行: + +![镜像工具:镜像写入确认][19] + +由于这需要 [sudo][20] 的权限,你必须输入密码。如果你从终端运行 `sudo rpi-imager`,就不会出现这种情况: + +![镜像工具:镜像写入授权需要密码][21] + +如果你的 SD 卡有点旧,这将需要一些时间。如果它是一个新的高速 SD 卡,就无需很长时间: + +![镜像工具:写入镜像][22] + +为确保镜像写入成功,我不建议跳过验证: + +![镜像工具:验证写入][23] + +写入结束后,会有以下确认提示: + +![镜像工具:写入成功][24] + +现在,从你的系统中安全移除 SD 卡。 + +### 在树莓派上使用装有 Ubuntu 的 MicroSD 卡 + +已经成功了一半了。与常规的 Ubuntu 安装不同,无需创建一个临场安装环境。Ubuntu 已经安装在 SD 卡上了,而且几乎可以直接使用了。让我们来看看这里还剩下什么。 + +#### 第 1 步:将 SD 卡插入树莓派中 + +对于第一次使用的用户来说,有时会有点困惑,不知道那个卡槽到底在哪里?不用担心。它位于电路板背面的左手边。下面是一个插入卡后的倒置视图。 + +![树莓派 4B 板倒置,插入 Micro SD 卡][25] + +按照这个方向将卡慢慢插入板子下面的卡槽,轻轻地插,直到它不再往前移动。你可能还会听到一点咔嚓声来确认。这意味着它已经完美地插入了。 + +![树莓派 SD 插槽在板子背面的左侧][26] + +当你把它插进去的时候,你可能会注意到在插槽中有两个小针脚调整了自己的位置(如上图所示),但这没关系。一旦插入,卡看起来会有一点突出。这就是它应该有的样子。 + +![树莓派 SD 卡插入时有一小部分可见][27] + +#### 第 2 步:设置树莓派 + +我无需在这里详细介绍。 + +保证电源线接头、微型 HDMI 线接头、键盘和鼠标接头(有线/无线)都牢固地连接到树莓派板的相关端口。 + +确保显示器和电源插头也已正确连接,然后再去打开电源插座。我不建议把适配器插到带电的插座上。参考 [电弧][28]。 + +确认了以上两个步骤后,你就可以 [打开树莓派设备的电源][29]。 + +#### 第 3 步:在树莓派上 Ubuntu 桌面的首次运行 + +当你打开树莓派的电源,你需要在初次运行时进行一些基本配置。你只需按照屏幕上的指示操作即可。 + +选择你的语言、键盘布局、连接到 WiFi 等: + +![选择语言][30] + +![选择键盘布局][31] + +![选择 WiFi][32] + +你可以根据需求选择时区: + +![选择时区][33] + +然后创建用户和密码: + +![输入所需的用户名和密码][34] + +之后的步骤将配置一些东西,这个过程需要一些时间: + +![完成 Ubuntu 设置][35] + +![完成 Ubuntu 设置][36] + +系统会重新启动之前需要一些时间,最终,你将会来到 Ubuntu 的登录界面: + +![Ubuntu 的登录界面][37] + +现在,你可以开始享受树莓派上的 Ubuntu 桌面了: + +![树莓派上的 Ubuntu 桌面][38] + +### 总结 + +我注意到**一个暂时的异常情况**。在进行安装时,我的显示器左侧有一个红色的闪烁边界。这种闪烁(也有不同的颜色)在屏幕的随机部分也能注意到。但在重启和第一次启动后,它就消失了。 + +很高兴能够看到它在树莓派上运行,我非常需要 Ubuntu 开始为树莓派等流行的 ARM 设备提供支持。 + +希望这个教程对你有所帮助。如果你有问题或建议,请在评论中告诉我。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/install-ubuntu-desktop-raspberry-pi/ + +作者:[Avimanyu Bandyopadhyay][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://itsfoss.com/author/avimanyu/ +[b]: https://github.com/lujun9972 +[1]: https://itsfoss.com/tutorial-how-to-install-raspberry-pi-os-raspbian-wheezy/ +[2]: https://itsfoss.com/raspberry-pi-os/ +[3]: https://itsfoss.com/install-ubuntu-server-raspberry-pi/ +[4]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/09/ubuntu-desktop-raspberry-pi.png?resize=800%2C450&ssl=1 +[5]: https://github.com/raspberrypi/rpi-imager +[6]: https://www.raspberrypi.org/products/micro-hdmi-to-standard-hdmi-a-cable/ +[7]: https://www.raspberrypi.org/products/type-c-power-supply/ +[8]: https://itsfoss.com/things-you-need-to-get-your-raspberry-pi-working/ +[9]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/09/raspberry-pi-imager-tool.webp?resize=680%2C448&ssl=1 +[10]: https://www.raspberrypi.org/software/ +[11]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/09/pi-imager-choose-os.webp?resize=681%2C443&ssl=1 +[12]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/09/pi-imager-other-general-purpose-os.webp?resize=679%2C440&ssl=1 +[13]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/09/pi-imager-os-ubuntu.webp?resize=677%2C440&ssl=1 +[14]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/09/pi-imager-os-ubuntu-21-04.webp?resize=677%2C440&ssl=1 +[15]: https://ubuntu.com/download/raspberry-pi +[16]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/09/pi-imager-choose-storage.webp?resize=677%2C438&ssl=1 +[17]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/09/pi-imager-choose-sd-card.webp?resize=790%2C450&ssl=1 +[18]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/09/pi-imager-image-write.webp?resize=676%2C437&ssl=1 +[19]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/09/pi-imager-image-write-confirm.webp?resize=679%2C440&ssl=1 +[20]: https://itsfoss.com/add-sudo-user-ubuntu/ +[21]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/09/pi-imager-image-write-password.webp?resize=380%2C227&ssl=1 +[22]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/09/pi-imager-writing-image.webp?resize=673%2C438&ssl=1 +[23]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/09/pi-imager-verifying-changes.webp?resize=677%2C440&ssl=1 +[24]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/09/pi-imager-write-successful.webp?resize=675%2C442&ssl=1 +[25]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/09/pi-inverted-micro-sd-card-inserted.webp?resize=800%2C572&ssl=1 +[26]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/09/raspberry-pi-sd-slot-left-side-middle-below-board.webp?resize=632%2C324&ssl=1 +[27]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/09/pi-sd-card-inserted.webp?resize=650%2C432&ssl=1 +[28]: https://www.electricianatlanta.net/what-is-electrical-arcing-and-why-is-it-dangerous/ +[29]: https://itsfoss.com/turn-on-raspberry-pi/ +[30]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/09/ubuntu-raspberry-pi-first-run.webp?resize=800%2C451&ssl=1 +[31]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/09/ubuntu-raspberry-pi-first-run-2.webp?resize=800%2C600&ssl=1 +[32]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/09/ubuntu-raspberry-pi-first-run-3.webp?resize=800%2C600&ssl=1 +[33]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/09/ubuntu-raspberry-pi-first-run-4.webp?resize=800%2C600&ssl=1 +[34]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/09/ubuntu-raspberry-pi-first-run-5.webp?resize=800%2C600&ssl=1 +[35]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/09/ubuntu-raspberry-pi-first-run-6.webp?resize=800%2C600&ssl=1 +[36]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/09/ubuntu-raspberry-pi-first-run-7.webp?resize=800%2C600&ssl=1 +[37]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/09/ubuntu-raspberry-pi-login-screen.webp?resize=800%2C600&ssl=1 +[38]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/09/ubuntu-21-04-post-setup-desktop.webp?resize=800%2C450&ssl=1 diff --git a/published/202109/20210920 Use Vagrant to test your scripts on different operating systems.md b/published/202109/20210920 Use Vagrant to test your scripts on different operating systems.md new file mode 100644 index 0000000000..b105bb5413 --- /dev/null +++ b/published/202109/20210920 Use Vagrant to test your scripts on different operating systems.md @@ -0,0 +1,135 @@ +[#]: subject: "Use Vagrant to test your scripts on different operating systems" +[#]: via: "https://opensource.com/article/21/9/test-vagrant" +[#]: author: "Ayush Sharma https://opensource.com/users/ayushsharma" +[#]: collector: "lujun9972" +[#]: translator: "geekpi" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13829-1.html" + +使用 Vagrant 在不同的操作系统上测试你的脚本 +====== + +> Vagrant 可以帮助你在你的电脑上运行其他操作系统,这意味着你可以构建、测试、疯狂折腾而不毁坏你的系统。 + +![](https://img.linux.net.cn/data/attachment/album/202109/28/115827gv75kkrhnnhvkhcf.jpg) + +我使用 Vagrant 已经很长时间了。我使用几种 DevOps 工具,把它们全安装在一个系统上会搞得很乱。Vagrant 可以让你在不破坏系统的情况下随意折腾,因为你根本不需要在生产系统上做实验。 + +如果你熟悉 [VirtualBox][2] 或 [GNOME Boxes][3],那么学习 Vagrant 很容易。Vagrant 有一个简单而干净的界面用于管理虚拟机。一个名为 `Vagrantfile` 的配置文件,允许你定制你的虚拟机(称为 “Vagrant 盒子box”)。一个简单的命令行界面让你启动、停止、暂停或销毁你的“盒子”。 + +考虑一下这个简单的例子。 + +假设你想写 Ansible 或 shell 脚本,在一个新的服务器上安装 Nginx。你不能在你自己的系统上这样做,因为你运行的可能不是你想测试的操作系统,或者没有所有的依赖项。启动新的云服务器进行测试可能会很费时和昂贵。这就是 Vagrant 派上用处的地方。你可以用它来启动一个虚拟机,用你的脚本来配备provision它,并证明一切按预期工作。然后,你可以删除这个“盒子”,重新配备它,并重新运行你的脚本来验证它。你可以多次重复这个过程,直到你确信你的脚本在所有条件下都能工作。你可以将你的 Vagrantfile 提交给 Git,以确保你的团队正在测试完全相同的环境(因为他们将使用完全相同的测试机)。不会再有“但它在我的机器上运行良好!”这事了。 + +### 开始使用 + +首先,[在你的系统上安装 Vagrant][4],然后创建一个新的文件夹进行实验。在这个新文件夹中,创建一个名为 `Vagrantfile` 的新文件,内容如下: + +``` +Vagrant.configure("2") do |config| + + config.vm.box = "ubuntu/hirsute64" + +end +``` + +你也可以运行 `vagrant init ubuntu/hirsute64`,它将为你生成一个新的 Vagrant 文件。现在运行 `vagrant up`。这个命令将从 Vagrant 仓库中下载 `ubuntu/hirsuite64` 镜像。 + +``` +Bringing machine 'default' up with 'virtualbox' provider... +==> default: Importing base box 'ubuntu/hirsute64'... +==> default: Matching MAC address for NAT networking... +==> default: Checking if box 'ubuntu/hirsute64' version '20210820.0.0' is up to date... +==> default: Setting the name of the VM: a_default_1630204214778_76885 +==> default: Clearing any previously set network interfaces... +==> default: Preparing network interfaces based on configuration... + default: Adapter 1: nat + default: Adapter 2: hostonly +==> default: Forwarding ports... + default: 22 (guest) => 2222 (host) (adapter 1) +==> default: Running 'pre-boot' VM customizations... +==> default: Booting VM... +==> default: Waiting for machine to boot. This may take a few minutes... + default: SSH address: 127.0.0.1:2222 + default: SSH username: vagrant + default: SSH auth method: private key + default: Warning: Remote connection disconnect. Retrying... + default: Warning: Connection reset. Retrying... + default: + default: Vagrant insecure key detected. Vagrant will automatically replace + default: this with a newly generated keypair for better security. + default: + default: Inserting generated public key within guest... + default: Removing insecure key from the guest if it's present... + default: Key inserted! Disconnecting and reconnecting using new SSH key... +==> default: Machine booted and ready! +``` + +此时,如果你打开你的 Vagrant 后端(如 VirtualBox 或 virt-manager),你会看到你的“盒子”已经有了。接下来,运行 `vagrant ssh` 登录到“盒子”。如果你能看到 Vagrant 的提示符,那么你就进入了! + +``` +~ vagrant ssh +Welcome to Ubuntu 21.04 (GNU/Linux 5.11.0-31-generic x86_64) + +* Documentation: +* Management: +* Support: + + System information as of Sun Aug 29 02:33:51 UTC 2021 + + System load: 0.01 Processes: 110 + Usage of /: 4.1% of 38.71GB Users logged in: 0 + Memory usage: 17% IPv4 address for enp0s3: 10.0.2.15 + Swap usage: 0% IPv4 address for enp0s8: 192.168.1.20 + +0 updates can be applied immediately. + +vagrant@ubuntu-hirsute:~$ +``` + +Vagrant 使用“基础盒子”来建立你的本地机器。在我们的例子中,Vagrant 从 [Hashicorp 的 Vagrant 目录][5]下载 `ubuntu/hirsuite64` 镜像,并插入 VirtualBox 来创建实际的“盒子”。 + +### 共享文件夹 + +Vagrant 将你的当前文件夹映射到 Vagrant “盒子”中的 `/vagrant`。这允许你在你的系统和“盒子”里保持文件同步。这很适合测试 Nginx 网站,通过将你的文件根目录指向 `/vagrant`。你可以使用 IDE 进行修改,“盒子”里的 Nginx 会提供这些修改。 + +### Vagrant 命令 + +有几个 Vagrant 命令,你可以用它们来控制你的“盒子”。 + +其中一些重要的命令是: + + * `vagrant up`:启动一个“盒子”。 + * `vagrant status`:显示当前“盒子”的状态。 + * `vagrant suspend`:暂停当前的“盒子”。 + * `vagrant resume`:恢复当前的“盒子”。 + * `vagrant halt`:关闭当前的“盒子”。 + * `vagrant destroy`:销毁当前的“盒子”。通过运行此命令,你将失去存储在“盒子”上的任何数据。 + * `vagrant snapshot`:对当前的“盒子”进行快照。 + +### 试试 Vagrant + +Vagrant 是一个使用 DevOps 原则进行虚拟机管理的工具,久经时间考验。配置你的测试机,与你的团队分享配置,并在一个可预测和可重复的环境中测试你的项目。如果你正在开发软件,那么通过使用 Vagrant 进行测试,你将为你的用户提供良好的服务。如果你不开发软件,但你喜欢尝试新版本的操作系统,那么没有比这更简单的方法了。今天就试试 Vagrant 吧! + +这篇文章最初发表在 [作者的个人博客][6] 上,经许可后被改编。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/9/test-vagrant + +作者:[Ayush Sharma][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/ayushsharma +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/lenovo-thinkpad-laptop-concentration-focus-windows-office.png?itok=-8E2ihcF (Woman using laptop concentrating) +[2]: https://opensource.com/article/21/6/try-linux-virtualbox +[3]: https://opensource.com/article/19/5/getting-started-gnome-boxes-virtualization +[4]: https://www.vagrantup.com/docs/installation +[5]: https://app.vagrantup.com/boxes/search +[6]: https://notes.ayushsharma.in/2021/08/introduction-to-vagrant diff --git a/published/202109/20210920 Use this Linux command-line tool to learn more about your NVMe drives.md b/published/202109/20210920 Use this Linux command-line tool to learn more about your NVMe drives.md new file mode 100644 index 0000000000..782e44586b --- /dev/null +++ b/published/202109/20210920 Use this Linux command-line tool to learn more about your NVMe drives.md @@ -0,0 +1,177 @@ +[#]: subject: "Use this Linux command-line tool to learn more about your NVMe drives" +[#]: via: "https://opensource.com/article/21/9/nvme-cli" +[#]: author: "Don Watkins https://opensource.com/users/don-watkins" +[#]: collector: "lujun9972" +[#]: translator: "geekpi" +[#]: reviewer: "turbokernel" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13822-1.html" + +使用 Linux 命令行工具来了解你的 NVMe 驱动器 +====== + +> nvme-cli 命令拥有诸多实用的选项,且它是控制和管理数据一种很好的方式。 + +![](https://img.linux.net.cn/data/attachment/album/202109/26/102441ux8cy36gy1vggykz.jpg) + +NVMe 是指非易失性内存规范Non-Volatile Memory Express,它规范了软件和存储通过 PCIe 和其他协议(包括 TCP)进行通信的方式。它是由非营利组织领导的 [开放规范][2],并定义了几种形式的固态存储。 + +我的笔记本电脑有一个 NVMe 驱动器,我的台式机也有。而且它们的速度很快。我喜欢我的电脑启动的速度,以及它们读写数据的速度。几乎没有延迟。 + +没过多久,我就对驱动这种超高速存储的技术产生了好奇,所以我做了一些调查。我了解到,NVMe 驱动器消耗的电力更少,而提供的数据访问速度甚至比 SATA 的 SSD 驱动器快得多。这很有趣,但我想知道更多关于我的特定 NVMe 驱动器的信息,我想知道它们与其他驱动器有何区别。我可以安全地擦除驱动器吗?我怎样才能检查它的完整性? + +带着这些问题我在互联网上搜索,发现了一个开源项目,其中有一系列管理 NVMe 驱动器的工具。它被称为 [nvme-cli][3]。 + +### 安装 nvme-cli + +你可以从你的发行版的包管理器中安装 `nvme-cli`。例如,在 Fedora、CentOS 或类似系统上: + +``` +$ sudo dnf install nvme-cli +``` + +在 Debian、Mint、Elementary 和类似系统上: + +``` +$ sudo apt install nvme-cli +``` + +### 探索 NVMe 驱动器 + +在安装 `nvme-cli` 后,我想探索我的驱动器。`nvme-cli` 没有手册页,但你可以通过输入 `nvme help` 获得很多帮助: + +``` +$ nvme help +nvme-1.14 +usage: nvme [] [] + +The '' may be either an NVMe character device (ex: /dev/nvme0) or an +nvme block device (ex: /dev/nvme0n1). + +The following are all implemented sub-commands: + list List all NVMe devices and namespaces on machine + list-subsys List nvme subsystems + id-ctrl Send NVMe Identify Controller + id-ns Send NVMe Identify Namespace, display structure + id-ns-granularity Send NVMe Identify Namespace Granularity List, display structure + list-ns Send NVMe Identify List, display structure + list-ctrl Send NVMe Identify Controller List, display structure + nvm-id-ctrl Send NVMe Identify Controller NVM Command Set, display structure + primary-ctrl-caps Send NVMe Identify Primary Controller Capabilities +[...] +``` + +### 列出所有的 NVMe 驱动器 + +`sudo nvme list` 命令列出你机器上所有的 NVMe 设备和命名空间。我用它在 `/dev/nvme0n1` 找到了一个 NVMe 驱动器。下面是命令输出结果: + + +``` +$ sudo nvme list + +Node SN Model Namespace Usage Format FW Rev + +--------------------- -------------------- ---------------------------------------- --------- -------------------------- ---------------- -------- + +/dev/nvme0n1 S42GMY9M141281 SAMSUNG MZVLB256HAHQ-000L7 1 + +214.68 GB / 256.06 GB 512 B + 0 B 0L2QEXD7 +``` + +我有一个名为 `nvme0n1` 的驱动器。它列出了序列号、品牌、容量、固件版本等等。 + +通过使用 `id-ctrl` 子命令,你可以得到更多关于该硬盘和它所支持的特性的信息: + +``` +$ sudo nvme id-ctrl /dev/nvme0n1 +NVME Identify Controller: +vid : 0x144d +ssvid : 0x144d +sn : S42GMY9M141281 +mn : SAMSUNG MZVLB256HAHQ-000L7 +fr : 0L2QEXD7 +rab : 2 +ieee : 002538 +cmic : 0 +mdts : 9 +cntlid : 0x4 +ver : 0x10200 +rtd3r : 0x186a0 +rtd3e : 0x7a1200 +[...] +``` + +### 驱动器健康 + +你可以通过 `smart-log` 子命令来了解硬盘的整体健康状况: + +``` +$ sudo nvme smart-log /dev/nvme0n1 +Smart Log for NVME device:nvme0n1 namespace-id:ffffffff +critical_warning : 0 +temperature : 21 C +available_spare : 100% +available_spare_threshold : 10% +percentage_used : 2% +endurance group critical warning summary: 0 +data_units_read : 5,749,452 +data_units_written : 10,602,948 +host_read_commands : 77,809,121 +host_write_commands : 153,405,213 +controller_busy_time : 756 +power_cycles : 1,719 +power_on_hours : 1,311 +unsafe_shutdowns : 129 +media_errors : 0 +num_err_log_entries : 1,243 +Warning Temperature Time : 0 +Critical Composite Temperature Time : 0 +Temperature Sensor 1 : 21 C +Temperature Sensor 2 : 22 C +Thermal Management T1 Trans Count : 0 +Thermal Management T2 Trans Count : 0 +Thermal Management T1 Total Time : 0 +Thermal Management T2 Total Time : 0 +``` + +这为你提供了硬盘的当前温度、到目前为止的使用时间、不安全的关机次数等等。 + +### 格式化一个 NVMe 驱动器 + +你可以用 `nvme-cli` 格式化一个 NVMe 驱动器,但要注意。这将删除驱动器上的所有数据!如果你的硬盘上有重要的数据,你必须在这样做之前将其备份,否则你**将会**丢失数据。子命令是 `format`: + +``` +$ sudo nvme format /dev/nvme0nX +``` + +(为了安全起见,我用 `X` 替换了驱动器的实际位置,以防止复制粘贴的错误。将 `X` 改为 `1` 或 `nvme list` 结果中列出的实际位置。) + +### 安全地擦除 NVMe 驱动器 + +当你准备出售或处理你的 NVMe 电脑时,你可能想安全地擦除驱动器。这里的警告与格式化过程中的警告相同。首先要备份重要的数据,因为这个命令会删除这些数据! + +``` +$ sudo nvme sanitize /dev/nvme0nX +``` + +### 尝试 nvme-cli + +`nvme-cli` 命令是在 [GPLv2][4] 许可下发布的。它是一个强大的命令,有很多有用的选项,用来有效地控制和管理数据。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/9/nvme-cli + +作者:[Don Watkins][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/don-watkins +[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://nvmexpress.org/ +[3]: https://github.com/linux-nvme/nvme-cli +[4]: https://github.com/linux-nvme/nvme-cli/blob/master/LICENSE diff --git a/published/202109/20210921 Run containers on your Mac with Lima.md b/published/202109/20210921 Run containers on your Mac with Lima.md new file mode 100644 index 0000000000..759725d878 --- /dev/null +++ b/published/202109/20210921 Run containers on your Mac with Lima.md @@ -0,0 +1,146 @@ +[#]: subject: "Run containers on your Mac with Lima" +[#]: via: "https://opensource.com/article/21/9/run-containers-mac-lima" +[#]: author: "Moshe Zadka https://opensource.com/users/moshez" +[#]: collector: "lujun9972" +[#]: translator: "geekpi" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13824-1.html" + +用 Lima 在你的 Mac 上运行容器 +====== + +> Lima 可以帮助克服在 Mac 上运行容器的挑战。 + +![](https://img.linux.net.cn/data/attachment/album/202109/27/091509kx8u9uqdzcz8c6ud.jpg) + +在你的 Mac 上运行容器可能是一个挑战。毕竟,容器是基于 Linux 特有的技术,如控制组和命名空间。 + +幸运的是,macOS 拥有一个内置的虚拟机监控程序hypervisor,允许在 Mac 上运行虚拟机(VM)。虚拟机监控程序是一个底层的内核功能,而不是一个面向用户的功能。 + +hyperkit 是一个可以使用 macOS 虚拟机监控程序运行虚拟机的 [开源项目][2]。hyperkit 被设计成一个“极简化”的虚拟机运行器。与 VirtualBox 不同,它没有花哨的 UI 功能来管理虚拟机。 + +你可以获取 hyperkit,这是一个运行容器管理器的极简 Linux 发行版,并将所有部分组合在一起。但这将有很多变动组件,且听起来像有很多工作。特别是如果你想通过使用 `vpnkit` (一个开源项目,用于创建感觉更像是主机网络一部分的虚拟机网络)使网络连接更加无缝。 + +### Lima + +当 [lima 项目][3] 已经解决了这些细节问题时,就没有理由再去做这些努力了。让 `lima` 运行的最简单方法之一是使用 [Homebrew][4]。你可以用这个命令安装 `lima`: + +``` +$ brew install lima +``` + +安装后,可能需要一些时间,就享受一些乐趣了。为了让 `lima` 知道你已经准备好了,你需要启动它。下面是命令: + +``` +$ limactl start +``` + +如果这是你第一次运行,你会被问到是否喜欢默认值,或者是否要改变其中的任何一项。默认值是非常安全的,但我喜欢生活在疯狂的一面。这就是为什么我跳进一个编辑器,从以下地方进行修改: + +``` +- location: "~" + # CAUTION: `writable` SHOULD be false for the home directory. + # Setting `writable` to true is possible but untested and dangerous. + writable: false +``` + +变成: + +``` + - location: "~" + # I *also* like to live dangerously -- Austin Powers + writable: true +``` + +正如评论中所说,这可能是危险的。可悲的是,许多现有的工作流程都依赖于挂载是可读写的。 + +默认情况下,`lima` 运行 `containerd` 来管理容器。`containerd` 管理器也是一个非常简洁的管理器。虽然使用一个包装的守护程序,如 `dockerd`,来增加这些漂亮的工效是很常见的,但也有另一种方法。 + +### nerdctl 工具 + +`nerdctl` 工具是 Docker 客户端的直接替换,它将这些功能放在客户端,而不是服务器上。`lima` 工具允许无需在本地安装就可以直接从虚拟机内部运行 `nerdctl`。 + +做完这些后,可以运行一个容器了!这个容器将运行一个 HTTP 服务器。你可以在你的 Mac 上创建这些文件: + +``` +$ ls +index.html +$ cat index.html +hello +``` + +现在,挂载并转发端口: + +``` +$ lima nerdctl run --rm -it -p 8000:8000 -v $(pwd):/html --entrypoint bash python +root@9486145449ab:/# +``` + +在容器内,运行一个简单的 Web 服务器: + +``` +$ lima nerdctl run --rm -it -p 8000:8000 -v $(pwd):/html --entrypoint bash python +root@9486145449ab:/# cd /html/ +root@9486145449ab:/html# python -m http.server 8000 +Serving HTTP on 0.0.0.0 port 8000 () ... +``` + +在另一个终端,你可以检查一切看起来都很好: + +``` +$ curl localhost:8000 +hello +``` + +回到容器上,有一条记录 HTTP 客户端连接的日志信息: + +``` +10.4.0.1 - - [09/Sep/2021 14:59:08] "GET / HTTP/1.1" 200 - +``` + +一个文件是不够的,所以还要做些优化。 在服务器上执行 `CTRL-C`,并添加另一个文件: + +``` +^C +Keyboard interrupt received, exiting. +root@9486145449ab:/html# echo goodbye > foo.html +root@9486145449ab:/html# python -m http.server 8000 +Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ... +``` + +检查你是否能看到新的文件: + +``` +$ curl localhost:8000/foo.html +goodbye +``` + +### 总结 + +总结一下,安装 `lima` 需要一些时间,但完成后,你可以做以下事情: + + * 运行容器。 + * 将你的主目录中的任意子目录挂载到容器中。 + * 编辑这些目录中的文件。 + * 运行网络服务器,在 Mac 程序看来,它们是在 localhost 上运行的。 + +这些都是通过 `lima nerdctl` 实现的。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/9/run-containers-mac-lima + +作者:[Moshe Zadka][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/moshez +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/containers_2015-2-osdc-lead.png?itok=kAfHrBoy (Containers for shipping overseas) +[2]: https://www.docker.com/blog/docker-unikernels-open-source/ +[3]: https://github.com/lima-vm/lima +[4]: https://brew.sh/ diff --git a/published/202109/20210923 GNOME 41 Released- The Most Popular Linux Desktop Environment Gets Better.md b/published/202109/20210923 GNOME 41 Released- The Most Popular Linux Desktop Environment Gets Better.md new file mode 100644 index 0000000000..0a3ec80616 --- /dev/null +++ b/published/202109/20210923 GNOME 41 Released- The Most Popular Linux Desktop Environment Gets Better.md @@ -0,0 +1,164 @@ +[#]: subject: "GNOME 41 Released: The Most Popular Linux Desktop Environment Gets Better" +[#]: via: "https://news.itsfoss.com/gnome-41-release/" +[#]: author: "Ankush Das https://news.itsfoss.com/author/ankush/" +[#]: collector: "lujun9972" +[#]: translator: "wxy" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13816-1.html" + +GNOME 41 发布:最受欢迎的 Linux 桌面环境的精细打磨 +====== + +> GNOME 41 是一次有价值的升级,它带来了新的应用程序、功能和细微的视觉改进。 + +![](hhttps://img.linux.net.cn/data/attachment/album/202109/24/130703iznp8p53dbd1kktz.jpg) + +现在 GNOME 41 稳定版终于发布了。 + +虽然 GNOME 40 带来了不少激进的改变,让许多用户不得不去适应新的工作流程,但 GNOME 41 似乎避免了这个问题。 + +在 GNOME 41 中没有明显的工作流程变化,但有增加了新的功能,做了全面的改进。 + +GNOME 41 的测试版已经发布了一段时间了。而且,为了发现它值得关注的地方,我们在发布前就使用 [GNOME OS][1] 试用了它的稳定版。 + +### GNOME 41 有什么新功能? + +GNOME 41 并没有给你带来任何新的视觉感受,但是一些有用的改进可以帮助你改善或控制工作流程。 + +此外,还升级了一些 GNOME 应用程序。 + +让我提一下 GNOME 41 的主要亮点。 + +#### GNOME 41 软件的上下文板块 + +![][3] + +每个版本中,用户都期待着对 GNOME “软件Software”的改进。 + +虽然他们一直在朝着正确的方向改进它,但它需要一次视觉上的重新打造。而且,这一次,GNOME 41 带来了急需的 UI 更新。 + +软件商店的描述性更强了,看起来应该对新用户有吸引力。它使用表情符号/创意图标来对应用程序进行分类,使软件中心变得更时尚。 + +就像 [Apps for GNOME][4] 门户网站一样,“软件”的应用程序屏幕包括了更多的细节,以尽可能地告知用户,而不需要参考项目页面或其网站。 + +![][5] + +换句话说,这些添加到应用程序页面的上下文板块,提供了有关设备支持、安全/许可、年龄等级、下载的大小、项目等信息。 + +你还可以为某些应用程序(如 GIMP)选择可用的附加组件,以便一次都安装上。这样你就可以节省寻找附加组件和单独安装它们的时间了。 + +事实证明,GNOME 41 “软件”比以前更有好用了。 + +#### 新的多任务选项 + +![][6] + +GNOME 41 打造了新的多任务设置以帮助你改善工作流程。 + +你可以通过切换热角来快速打开“活动概览Activities Overview”。还添加了一个拖动窗口到边缘时调整其大小的能力。 + +根据你的需求,你可以设置一个固定的可用工作空间的数量,当然也可以保持动态数量。 + +除此以外,你还可以调整这些功能: + + * 多显示器工作区 + * 应用程序切换行为 + +当你有多个显示器时,你可以选择将工作空间限制在一个屏幕上,或在连接的显示器上连续显示。 + +而且,当你在切换应用程序并浏览它们时,你可以自定义只在同一工作区或在所有工作区预览应用程序。 + +#### 节电设置 + +![][7] + +在 GNOME 41 中,现在有一个有效节省电力的性能调整。这对于笔记本用户手动调整其性能,或者当一个应用程序要求切换模式以节省电力时,是非常有用的。 + +![][8] + +#### GNOME “日历”的改进 + +GNOME “日历Calendar”现在可以打开 ICS 文件及导入活动。 + +#### 触摸板手势 + +无缝的工作流程的体验:可以利用三指垂直向上/向下滑动的动作来获得“活动概览”,以及利用三指水平向右/向左滑动的动作在工作空间之间导航。 + +很高兴看到他们重点放在改善使用触摸板的工作流程上,这类似于 [elementary OS 6 的功能][9]。 + +#### GNOME 连接应用 + +![][10] + +添加了一个新的“连接Connections”应用程序,可以连接到远程计算机,不管是什么平台。 + +我看到这个应用程序仍然是一个 alpha 版本,但也许随着接下来的几次更新,就会看到这个应用程序的完成版本。 + +我还没有试过它是否可以工作,但也许值得再写一篇简短的文章来告诉你如何使用它。 + +#### SIP/VoIP 支持 + +在 [GNOME 41 测试版][11] 中,我发现了对 SIP/VoIP 的支持。 + +如果你是一个商业用户或者经常打国际电话,你现在可以直接从 GNOME 41 的拨号盘上拨打 VoIP 电话了。 + +不幸的是,在使用带有 GNOME 41 稳定版的 GNOME OS 时,我无法找到包含的“通话Calls”应用程序。所以,我无法截图给你看。 + +#### GNOME Web / Epiphany 的改进 + +![][12] + +GNOME Web(即 Epiphany 浏览器)最近进行了很多很棒的改进。 + +在 GNOME 41 中,Epiphany 浏览器现在利用 AdGuard 的脚本来阻止 YouTube 广告。别忘了,它还增加了对 Epiphany canary 构建版的支持。 + +#### 其他改进 + +在底层,有一些细微但重要的变化带来了更好、更快的用户体验。 + +例如,你可能会注意到,在应用程序/窗口的标题区域,图标更加醒目。这是为了提高清晰度和增强外观。 + +同样地,GNOME 应用程序和功能也有许多改进,你在使用它们时可能会发现: + + * GNOME “地图Map”现在以一种用户友好的方式显示平均海平面。 + * Nautilus 文件管理器进行了改进,支持有密码保护的压缩文件,并能够让你切换启用/禁用自动清理垃圾的功能 + * “音乐Music”应用程序的用户界面进行了更新 + * GNOME 文本编辑器有了更多功能 + * GTK 更新至 4.4.0 + * 增加 libawaita,以潜在地改善 GNOME 应用程序的用户体验 + +你可以参考 [官方更新日志和公告博文][13] 来探索所有的技术变化。 + +### 总结 + +GNOME 41 可能不是一个突破性的升级,但它是一个带有许多有价值的补充的重要更新。 + +你可以期待在下个月发布 Fedora 35 中带有它。不幸的是,Ubuntu 21.10 将不包括它,但你可以在其他 Linux 发行版中等待它。 + +-------------------------------------------------------------------------------- + +via: https://news.itsfoss.com/gnome-41-release/ + +作者:[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://news.itsfoss.com/author/ankush/ +[b]: https://github.com/lujun9972 +[1]: https://itsfoss.com/gnome-os/ +[2]: https://i2.wp.com/i.ytimg.com/vi/holOYrZquBQ/hqdefault.jpg?w=780&ssl=1 +[3]: https://i2.wp.com/news.itsfoss.com/wp-content/uploads/2021/09/gnome-41-software.png?w=1233&ssl=1 +[4]: https://news.itsfoss.com/apps-for-gnome-portal/ +[5]: https://i0.wp.com/news.itsfoss.com/wp-content/uploads/2021/09/gnome-41-software-app.png?w=1284&ssl=1 +[6]: https://i2.wp.com/news.itsfoss.com/wp-content/uploads/2021/09/gnome-41-multitasking.png?w=1032&ssl=1 +[7]: https://i1.wp.com/news.itsfoss.com/wp-content/uploads/2021/09/gnome-41-power-settings.png?w=443&ssl=1 +[8]: https://i0.wp.com/news.itsfoss.com/wp-content/uploads/2021/09/gnome-41-power-options.png?w=1012&ssl=1 +[9]: https://news.itsfoss.com/elementary-os-6-features/ +[10]: https://i1.wp.com/news.itsfoss.com/wp-content/uploads/2021/09/connections-gnome-41.png?w=1075&ssl=1 +[11]: https://news.itsfoss.com/gnome-41-beta/ +[12]: https://i1.wp.com/news.itsfoss.com/wp-content/uploads/2021/09/gnome-web-41.png?w=1328&ssl=1 +[13]: https://help.gnome.org/misc/release-notes/41.0/ diff --git a/published/202109/20210924 An open source alternative to Microsoft Exchange.md b/published/202109/20210924 An open source alternative to Microsoft Exchange.md new file mode 100644 index 0000000000..31cd9853e0 --- /dev/null +++ b/published/202109/20210924 An open source alternative to Microsoft Exchange.md @@ -0,0 +1,81 @@ +[#]: subject: "An open source alternative to Microsoft Exchange" +[#]: via: "https://opensource.com/article/21/9/open-source-groupware-grommunio" +[#]: author: "Markus Feilner https://opensource.com/users/mfeilner" +[#]: collector: "lujun9972" +[#]: translator: "geekpi" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13833-1.html" + +微软 Exchange 的一个开源替代方案 +====== + +> 开源用户现在有了一个强大的、功能齐全的群件选择。 + +![](https://img.linux.net.cn/data/attachment/album/202109/29/141404pesw8xgh8oohwhjh.jpg) + +多年来,微软 Exchange 作为一个平台牢牢统治着群件环境。然而,在 2020 年末,一个奥地利的开源软件开发商推出了 [grommunio][2],这是一个群件服务器和客户端,其外观和感觉让 Exchange 和 Outlook 用户感到很熟悉。 + +grmmunio 项目可以很好地替代 Exchange。开发者以与微软相同的方式将组件连接到平台上,它们支持 RPC (远程过程调用)与 HTTP 协议。据开发者介绍,grommunio 还包括许多常见的群件接口,如 IMAP、POP3、SMTP、EAS(Exchange ActiveSync)、EWS(Exchange Web Services)、CalDAV 和 CardDAV。有了这样广泛的支持,grommunio 可以顺利地整合到现有的基础设施中。 + +用户会注意到对 Outlook、Android 和 iOS 客户端来说几乎没有区别。当然,作为开源软件,它也支持其他客户端。由于集成了原生的 Exchange 协议,Outlook 和智能手机与 grommunio 的通信就像与微软 Exchange 服务器一样。日常的企业用户可以继续使用他们现有的客户端,而 grommunio 服务器则在后台安静地运行。 + +### 不仅仅是邮件 + +除了邮件功能外,grommunio 界面还提供了日历系统。可以直接在日历显示中或在一个新标签中点击创建约会。这很直观,正如你对现代工具的期望。用户可以创建、管理和分享日历以及地址簿。私人联系人或普通联系人都支持,而且你可以与同事分享一切。 + +任务管理在左边的下拉菜单中显示任务列表,它们可以有一个所有者和多个合作者。你可以为每个任务指定截止日期、类别、附件和其他属性。笔记可以以同样的方式被管理并与其他团队成员共享。 + +### 聊天、视频会议和文件同步 + +除了现代群件的所有标准功能外,grommunio 还提供聊天、视频会议和文件同步功能。它为企业实现了大规模的全面整合,具有极高的性能。对于开源的推动者来说,这是一个简单的选择,对于系统管理员来说,这是一个强大的选择。因为 grommunio 的目标是整合而不是重新发明,所以所有的组件都是标准的开源工具。 + +![Screenshot of grommunio meeting space][3] + +*用于高级视频会议的 Jitsi 集成(Markus Feilner, [CC BY-SA 4.0][4])* + +在 grommunio 会议功能的背后是 [Jitsi][5],它以熟悉的用户界面顺利地集成到 grommunio 的用户界面中。完全集成和集中管理的聊天功能是基于 [Mattermost][6]。 + +![Screenshot of grommunio's town square for chat][7] + +*用于聊天的 Mattermost(Markus Feilner,[CC BY-SA 4.0][4])* + +[ownCloud][8] 承诺提供企业级的文件共享和同步,在点击“文件”按钮后开始。 + +![Screenshot of grommunio file sharing space][9] + +*用于文件同步和交换的 ownCloud(Markus Feilner,[CC BY-SA 4.0][4])* + +grommunio 项目有一个强大的管理界面,包括角色、域和组织管理、预测性监测和自助服务门户。基于 shell 的向导指导管理员完成安装和从微软 Exchange 迁移数据。开发团队正在不断努力,以实现更好的整合和更集中的管理,并随之为管理员提供更好的工作流程。 + +![Screenshot of grommunio dashboards][10] + +*grommunio 的管理界面(Markus Feilner, [CC BY-SA 4.0][4])* + +### 探索 grommunio + +grommunio 项目的目标很高,但它的开发者已经付出了努力,这一点很明显。一家专门从事税务咨询的德国托管服务机构最近宣布,他们的客户可以使用 grommunio,这是一个德国数据保护法特别严厉的行业。grommunio 项目做得很好:将现有的、成功的概念干净地结合在一起,实现了开放、安全和符合隐私的通信。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/9/open-source-groupware-grommunio + +作者:[Markus Feilner][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/mfeilner +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/team_dev_email_chat_video_work_wfm_desk_520.png?itok=6YtME4Hj (Working on a team, busy worklife) +[2]: https://grommunio.com/en/ +[3]: https://opensource.com/sites/default/files/uploads/jitsi_0.png (grommunio meeting space) +[4]: https://creativecommons.org/licenses/by-sa/4.0/ +[5]: https://opensource.com/article/20/5/open-source-video-conferencing +[6]: https://opensource.com/education/16/3/mattermost-open-source-chat +[7]: https://opensource.com/sites/default/files/uploads/mattermost.png (grommunio's town square for chat) +[8]: https://owncloud.com/ +[9]: https://opensource.com/sites/default/files/uploads/owncloud_0.png (Owncloud for file synchronization and exchange) +[10]: https://opensource.com/sites/default/files/uploads/grommunio_interface_0.png (Screenshot of grommunio dashboards) diff --git a/published/202109/20210924 Linux Gamers Can Finally Play Games like Apex Legends, Fortnite, Thanks to Easy Anti-Cheat Support.md b/published/202109/20210924 Linux Gamers Can Finally Play Games like Apex Legends, Fortnite, Thanks to Easy Anti-Cheat Support.md new file mode 100644 index 0000000000..c2728027ce --- /dev/null +++ b/published/202109/20210924 Linux Gamers Can Finally Play Games like Apex Legends, Fortnite, Thanks to Easy Anti-Cheat Support.md @@ -0,0 +1,82 @@ +[#]: subject: "Linux Gamers Can Finally Play Games like Apex Legends, Fortnite, Thanks to Easy Anti-Cheat Support" +[#]: via: "https://news.itsfoss.com/easy-anti-cheat-linux/" +[#]: author: "Ankush Das https://news.itsfoss.com/author/ankush/" +[#]: collector: "lujun9972" +[#]: translator: "wxy" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13821-1.html" + +Linux 玩家终于可以玩《Apex Legends》、《Fortnite》等游戏了 +====== + +> 如果你是一个狂热的多人游戏玩家,你将能够玩到《Apex Legends》和《Fortnite》这样的热门游戏。但是,你可能需要等待一段时间。 + +![](https://i1.wp.com/news.itsfoss.com/wp-content/uploads/2021/09/easy-anti-cheat-linux.png?w=1200&ssl=1) + +Linux 玩家们,这可是个大新闻啊! + +Epic Games 为其“简易反作弊”服务增加了完整的 Linux 支持,官方提供了兼容 [SteamPlay][1](或 Proton)和 Wine 兼容性。 + +尽管我们预计这将在未来的某个时候发生,但 Steam Deck 的引入改变了 [在 Linux 上玩游戏][2] 的场景。 + +你可能知道,Steam Deck 是由 Linux 驱动的,这就是为什么 Epic Games 有兴趣扩大对 Linux 平台的支持。 + +因此,可以说,如果不是 Valve 在 Steam Deck 上的努力,在 Linux 上获得“简易反作弊”支持的机会并不乐观。 + +### 多人游戏玩家可以考虑转到 Linux 上了 + +有了 [简易反作弊][3] 的支持,许多流行的多人游戏,如《Apex Legends》、《Fortnite》、《Tom Clancy's Division 2》、《Rust》 和其他许多游戏应该可以在 Linux 上完美地运行了。 + +根据 Epic Games 的公告: + +> 从最新的 SDK 版本开始,开发者只需在 Epic 在线服务开发者门户点击几下,就可以通过 Wine 或 Proton 激活对 Linux 的反作弊支持。 + +因此,开发人员可能需要一段时间来激活对各种游戏的反作弊支持。但是,对于大多数带有简易反作弊功能的游戏来说,这应该是一个绿色信号。 + +少了一个 [Windows 与 Linux 双启动][4] 的理由。 + +《Apex Legends》 是我喜欢的多人游戏之一。而且,我不得不使用 Windows 来玩这个游戏。希望这种情况很快就会改变,在未来几周内,我可以在 Linux 上试一试! + +同样,如果你几乎就要转到 Linux 了,但因为它与游戏的兼容性问题而迟疑,我想说问题已经解决了一半了! + +当然,我们仍然需要对 BattleEye、其他反作弊服务和游戏客户端的官方支持。但是,这是个开端。 + +### Steam Deck 现在是一个令人信服的游戏选择 + +虽然许多人不确定 Steam Deck 是否支持所有的 AAA 级游戏,但这应该会有所改善! + +[Steam Deck][5] 现在应该是多人游戏玩家的一个简单选择。 + +### 总结 + +如果 Steam Deck 作为一个成功的掌上游戏机而成为了焦点,那么正如我们所知,在 Linux 上玩游戏也将发生改变。 + +而且,我认为 Epic Games 在其反作弊服务中加入 Linux 支持仅仅只是一个开始。 + +也许,我们永远都不用借助 [ProtonDB][6] 来在 Linux 上玩一个只有 Windows 支持的游戏;谁知道呢?但是,在这之后,Linux 游戏的未来似乎充满希望。 + +如果你是一个开发者,你可能想阅读 [该公告][7] 来获得最新的 SDK。 + +你对 Epic Games 将简易反作弊引入 Linux 有何看法?欢迎在下面的评论中分享你的想法。 + +-------------------------------------------------------------------------------- + +via: https://news.itsfoss.com/easy-anti-cheat-linux/ + +作者:[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://news.itsfoss.com/author/ankush/ +[b]: https://github.com/lujun9972 +[1]: https://itsfoss.com/steam-play/ +[2]: https://itsfoss.com/linux-gaming-guide/ +[3]: https://www.easy.ac/en-us/ +[4]: https://itsfoss.com/install-ubuntu-1404-dual-boot-mode-windows-8-81-uefi/ +[5]: https://www.steamdeck.com/en/ +[6]: https://www.protondb.com +[7]: https://dev.epicgames.com/en-US/news/epic-online-services-launches-anti-cheat-support-for-linux-mac-and-steam-deck diff --git a/published/202109/20210927 5 open source alternatives to Zoom.md b/published/202109/20210927 5 open source alternatives to Zoom.md new file mode 100644 index 0000000000..64e4bd65c2 --- /dev/null +++ b/published/202109/20210927 5 open source alternatives to Zoom.md @@ -0,0 +1,73 @@ +[#]: subject: "5 open source alternatives to Zoom" +[#]: via: "https://opensource.com/article/21/9/alternatives-zoom" +[#]: author: "Seth Kenlon https://opensource.com/users/seth" +[#]: collector: "lujun9972" +[#]: translator: "geekpi" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13836-1.html" + +5 个替代 Zoom 的开源软件 +====== + +> 试试这些开源视频会议服务之一。 + +![](https://img.linux.net.cn/data/attachment/album/202109/30/114413ylalu7dcl5au575v.jpg) + +我最近参加了 [实用开源信息(POSI)][2] 会议,它是在一个自由开源的视频会议平台上举行的。当我参加了一系列关于开源软件的实际用途的精彩讲座时,我意识到视频会议在过去几年里已经变得非常普遍。 + +如果说开源做了什么,那就是提供了选择,现在越来越多的工人有了远程工作的自由,在你的连接方式上有一个选择是非常有意义的。 + +有时,你需要一个全功能的视频会议应用,其中包括审核、演示模式和分组讨论室,而其他时候,你想做的只是给朋友打一个快速电话,以便看到对方的脸。 + +### Jitsi + +[Jitsi][3] 是一个简单、随意、但强大的视频通话平台。你可以自己托管它,也可以在 [meet.jit.si][4] 的公共实例上使用它。它有可定制的 URL,可以很容易地与你想见面的朋友分享链接、通话中的聊天、管理控制,和通话录音。它的开发非常活跃,每年都会测试和发布一大批新功能。它是 Opensource.com 用于我们每周会议的平台。 + +### Signal + +[Signal][5] 已经是一个流行的以安全为重点的聊天应用,最近它又增加了 [团体视频通话][6] 的功能。视频通话非常适合简单的会议,而且因为你只能与你的 Signal 联系人列表中的其他人见面,所以不用担心你的视频通话会议上有不速之客。当你尝试定位你应该参与开会的虚拟房间时,也没有来回的“电话标签”。这一切都发生在 Signal 中,因此无需猜测。 + +Signal 本身是非常直观的,视频功能非常适合其现有惯例。简而言之,只要你的联系人在使用 Signal,这就是一个不费力的视频通话平台。这是我用于个人联系的应用,我经常使用其视频通话功能与朋友和家人联系。 + +### P2p.chat + +[P2p.chat][7] 是这些中最简单的一个,无论是设计还是实现。通过 WebRTC 工作,p2p.chat 是一个 Web 应用,允许你直接连接到你正在呼叫的人,而不需要托管服务器。p2p.chat 的界面并不多,但这也是其吸引力的另一部分。没有管理控制或演示模式,因为 p2p.chat 在很大程度上是科幻片中承诺的“视频电话”:与远方的人进行轻松的人对人(或人们对人们)视频通话。 + +你可以使用自定义的 URL 来动态地创建一个会议空间,所以它们相对容易记忆(除了小的随机部分)和输入。我和不在 Signal 上的朋友使用 p2p.chat,它从未让我失望过。 + +### BigBlueButton + +如果你需要严格的管理控制和极端的灵活性,[BigBlueButton][8] 是你正在寻找的解决方案,它专为教室、会议和演讲而设计。有了 BigBlueButton,你可以让所有与会者静音,阻止和踢走一个与会者,创建分组讨论室,创建协作式白板,共享屏幕,进行演讲,以及记录会议。与会者可以“举起手”表示注意,并将他们的状态设定为非语言交流方式。它很容易使用,但它是一个严肃的平台,适用于重点和非常大的群体。我参加过一些使用 BigBlueButton 的技术会议,包括 [实用开源信息(POSI)][2]会议。 + +### Wire + +[Wire][9] 是寻找托管视频聊天和群件客户端的企业客户的绝佳选择。它是 [AGPL][10] 许可,这个开源项目可用于桌面和服务器、安卓和 iOS。它具有视频通话、发信和文件共享的功能,因此,即使是远程会议,基本上也有亲自开会的所有便利。你可以在有限的时间内免费试用 Wire,然后为你的公司购买一份支持合同。另外,你也可以自己托管它。 + +### 开源视频聊天 + +没有理由满足于由你可能不完全信任的公司托管的专有视频通话。今天可用的开源选项对于与你的职业和个人生活中的所有人保持联系是非常好的。下次你想和朋友见面时,不妨试试这些解决方案之一。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/9/alternatives-zoom + +作者:[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/chat_video_conference_talk_team.png?itok=t2_7fEH0 (Two people chatting via a video conference app) +[2]: https://opensource.org/posicfp +[3]: http://jitsi.org +[4]: http://meet.jit.si +[5]: https://signal.org +[6]: https://support.signal.org/hc/en-us/articles/360052977792-Group-Calling-Voice-or-Video-with-Screen-Sharing +[7]: https://p2p.chat/ +[8]: https://bigbluebutton.org/ +[9]: https://wire.com/en/ +[10]: https://opensource.org/licenses/AGPL-3.0 diff --git a/published/202109/20210929 Manage CentOS Stream with Foreman.md b/published/202109/20210929 Manage CentOS Stream with Foreman.md new file mode 100644 index 0000000000..52d66d056a --- /dev/null +++ b/published/202109/20210929 Manage CentOS Stream with Foreman.md @@ -0,0 +1,164 @@ +[#]: subject: "Manage CentOS Stream with Foreman" +[#]: via: "https://opensource.com/article/21/9/centos-stream-foreman" +[#]: author: "Melanie Corr https://opensource.com/users/melanie-corr" +[#]: collector: "lujun9972" +[#]: translator: "wxy" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13837-1.html" + +用 Foreman 管理 CentOS Stream +====== + +> 这个例子让我们看到了在 Foreman 中管理和配置 CentOS Stream 内容的许多选项。 + +![](https://img.linux.net.cn/data/attachment/album/202109/30/133541s3e3s31yzmnugl1s.jpg) + +2021 年 12 月,CentOS 8 将达到生命终点,被 CentOS Stream 取代。CentOS Stream 和 CentOS 之前的迭代之间的主要变化之一是没有小版本。Centos Stream 采用了一个连续的发布周期。从今年年初开始,Foreman 社区的开发者开始看到 CentOS Stream 由于持续发布而提供的更早的错误检测和补丁的好处。我们不再需要等待下一个版本来利用最新的变化和错误修复。[一位资深的 Linux 社区爱好者][2] 指出,此举也使 RHEL 开发者比以往更接近 FOSS 社区。 + +然而,如果你是一个拥有数百或数千台服务器的管理员,你可能想控制新的软件包何时被添加到特定的服务器。如果你正在寻找一个免费的开源工具,帮助你确保生产服务器的稳定性,同时允许你安全地从 Centos Stream 中拉入最新的变化用于开发和测试,这就是 Foreman 可以帮助你的地方。有了 Foreman,你可以在生命周期环境的各个阶段管理你的 Centos Stream 内容。 + +### Foreman 介绍 + +Foreman 是一个完整的物理和虚拟服务器的生命周期管理工具。有了 Foreman,系统管理员有能力轻松实现重复性任务的自动化,快速部署应用程序,并主动管理内部或云中的服务器。Foreman 为配备provisioning管理、配置管理和监控提供了企业级解决方案。由于其插件架构,Foreman 可以以无数种方式进行扩展。使用 Katello 插件,你可以把 Foreman 作为一个完整的内容管理content management工具来管理 CentOS Stream,以及其他许多内容类型。 + +通过 Foreman 和 Katello,你可以准确地定义你希望每个环境包含哪些软件包。例如,生产环境可能使用已被验证为稳定的软件包,而开发环境可能需要最新、最先进的软件包版本。你还可以跨生命周期环境推广内容视图content view。让我们来看看 Foreman 是如何完成这个任务的。 + +我们在这篇文章中使用了网页用户界面,但 Foreman 也有一个强大的 CLI 和 API。Katello 插件为 Pulp 项目提供了一个工作流和网页用户界面,你可以在 [这篇文章][3] 中了解更多。我们在这里也提供了一个简单的工作流程,但是 Foreman 和 Katello 项目提供了许多不同的配置选项来满足你的具体需求。 + +本文假设 Foreman 和 Katello 已经安装完毕。关于如何安装的更多信息,请参阅 [Katello 安装手册][4]。 + +### 创建一个产品 + +第一步是在 Foreman 中创建一个产品product。该产品的功能是作为一个内部标签来存储 CentOS Stream 存储库。 + + 1. 在 Foreman 网页用户界面,导航到“内容Content > 产品Products”,并点击“创建产品Create Product”。 + 2. 在“名称Name”字段中,为产品输入一个名称。Foreman会根据你输入的“名称Name”自动完成“标签Label”字段,以后不能再更改。 + +### 将 CentOS Stream 存储库添加到产品中 + +现在你有了一个产品,你可以使用 AppStream 和 BaseOS 存储库的 URL,并将它们添加到你的新产品中。 + + 1. 在 Foreman 网页用户界面中,导航到 “内容Content > 产品Products”,选择你要使用的产品,然后点击 “新存储库New Repository”。 + 2. 在“名称Name”字段中,为存储库输入一个名称;例如,“Centos8StreamBaseOS”。Foreman 会根据你输入的“名称Name”,自动完成“标签Label”字段。 + 3. 从“类型Type”列表中,选择存储库的类型,然后选择“Yum”。 + 4. 在 “URL” 字段中,输入 CentOS Stream Baseos 存储库的 URL,作为源: `http://mirror.centos.org/centos/8-stream/BaseOS/x86_64/os/`。 + 5. 选择“下载规则Download Policy”列表。默认的是“按需On Demand”,这意味着 Katello 将只下载元数据。如果你想下载所有的软件包,请改成“即时Immediate”,它可以下载所有的软件包,可能会达到 20-30GB。 + 6. 确保“与镜像同步Mirror on Sync”复选框被选中。这个选项确保在同步过程中,不再是上游存储库的一部分的内容被删除。 + 7. 点击“保存Save”。 + + + +重复这些步骤,添加 AppStream 存储库及其 URL,例如,`http://mirror.centos.org/centos/8-stream/AppStream/x86_64/os/`。确保你使用最近的官方 CentOS 镜像来代替它。 + +要执行立即同步,在你的产品窗口,点击“立即同步Sync Now”。最初的同步可能需要一些时间。你可以从“内容Content > 同步状态Sync Status”查看同步状态。 + +同步完成后,你可以在“主机 Hosts > 操作系统Operating System”中查看新的 CentOS Stream 操作系统。请随意编辑名称和描述以满足你的要求。 + +如果你打算使用 Ansible 或 Puppet 等配置管理软件,Foreman 会自动创建一个操作系统报告。你可以在“管理Administe > 设置Settings > 忽略操作系统状况Ignore facts for operating system”中关闭这个选项。重命名操作系统以匹配配置管理软件中的名称是一个好主意。例如,对于 Puppet,这将是“CentOS 8”。 + +### 定义你的基础设施的生命周期环境 + +应用程序生命周期是 Foreman 的内容管理功能的一个核心概念。应用程序的生命周期定义了一个特定的系统和它的软件在特定阶段的状况。例如,一个应用程序的生命周期可能很简单,你可能只有一个“开发”阶段和“生产”阶段。Foreman 提供了一些方法来以可控的方式定制每个应用生命周期阶段,以适应你的规范。 + +在这一点上,你必须创建你的生命周期环境路径。 + + 1. 在 Foreman 网页用户界面中,导航到“内容Content > 生命周期环境Lifecycle Environments”。 + 2. 点击“新环境路径New Environment Path”,开始一个新的应用生命周期。 + 3. 在“名称Name”字段中,为你的环境输入一个名称。 + 4. 在“描述Description”字段中,为你的环境输入一个描述。 + 5. 点击“保存Save”。 + 6. 根据你的需要添加尽可能多的环境路径。例如,你可以创建“dev”、“test”、“stage” 和 “production” 环境。要添加这些环境,点击“添加新环境”,完成“名称Name”和“描述Description”字段,并从“优先环境Prior Environment*”列表中选择先前的环境,这样你就可以按照你预期使用的顺序将它们串联起来。 + + + +### 创建和发布一个内容视图 + +在 Foreman 中,“内容视图Content View”是你的存储库在某个特定时间点的快照。内容视图提供了隔离软件包版本到你想保留的状态的机制。内容视图有很多可配置的功能,你可以用它来进一步细化。为了本教程的目的,让我们保持简单。 + + 1. 在 Foreman 网页用户界面中,导航到“内容Content > 内容视图Content View”,并点击“创建新视图Create New View”。 + 2. 在“名称Name”字段中,为视图输入一个名称。Foreman 会根据你输入的名称自动完成“标签Label”字段。 + 3. 在“描述Description”字段中,输入视图的描述。 + 4. 单击“保存Save”以创建内容视图。 + 5. 在新的内容视图中,点击“Yum 内容Yum Contents > 添加存储库Add Repositories”,在“存储库选择Repository Selection”区域,点击“添加Add”。对于 BaseOS 和 Appstream 存储库,选择你想包括的软件包,然后点击“添加存储库Add Repositories”。 + 6. 点击“发布新版本Publish New Version”,在“描述Description”区域,输入关于版本的信息以记录变化。 + 7. 单击“保存Save”。 + +当你点击“发布新版本Publish New Version”时,你创建了一个你已同步的所有内容的快照。这意味着你订阅此内容视图的每台服务器将只能访问与此生命周期环境相关的内容视图中的软件包版本。 + +每一个新的内容视图和后续版本都会首先发布到库环境,然后你可以在那里推广到其他环境。 + +### 跨生命周期环境推广内容 + +如果你已经测试了新的软件包,并且确信一切都很稳定,你可以把你的内容视图推广到另一个生命周期环境中。 + + 1. 导航到“内容Content > 内容视图Content Views”,选择你想推广的内容视图。 + 2. 点击内容视图的“版本Versions”标签。 + 3. 选择你想推广的版本,并在“操作Action”栏中,点击“推广Promote”。 + 4. 选择你要推广内容视图的环境,并点击“推广版本Promote Version”。 + 5. 再次点击“推广Promote”按钮。这次选择生命周期环境,例如,“Test”,然后单击“推广版本Promote Version”。 + 6. 最后,再次点击“推广Promote”按钮。例如,选择“Production”环境并点击“推广版本Promote Version”。 + +被分配到该特定环境的服务器现在可以从一套更新的软件包中提取。 + +### 创建一个激活密钥 + +为了将 CentOS Stream 服务器注册到你在特定生命周期中定义的内容,你必须创建一个激活密钥。激活密钥是一种与服务器共享凭证的安全方法。这使用了一个叫做“订阅管理器subscription-manager的工具来订阅 CentOS Stream 服务器的内容。 + +当你创建了激活密钥后,将 CentOS Stream 订阅添加到激活密钥中。 + + 1. 在 Foreman 网页用户界面中,导航到“内容Content > 激活密钥Activation keys”,并点击“创建激活密钥Create Activation Key”。 + 2. 在“名称Name”栏中,输入激活密钥的名称。 + 3. 在“描述Description”栏中,输入激活密钥的描述。 + 4. 从“环境Environment”列表中,选择要使用的环境。 + 5. 从“内容视图Content View”列表中,选择你刚才创建的内容视图。 + 6. 点击“保存Save”。 + +###从 Foreman 管理的内容中创建一个 CentOS Stream 主机 + +现在一切都准备好了。随着你创建的内容包含在内容视图中,并在整个生命周期中推广,你现在可以准确地用你想使用的内容来配置主机,并订阅你想让它们接收的更新。 + +要在 Foreman 中创建一个主机,请导航到“主机 > 创建主机”。 + + 1. 在“名称Name”字段中,为主机输入一个名称。 + 2. 单击“组织Organization”和“位置Location”选项卡,以确保配置环境自动设置为当前环境。 + 3. 从“部署在Deploy On”列表中,选择“裸金属Bare Metal”。 + 4. 单击“操作系统Operating System”选项卡。 + 5. 从“架构Architectures”列表中,选择“x86_64”。 + 6. 从“操作系统Operating System”列表中,选择“CentOS_Stream 8”。 + 7. 勾选“构建模式Build Mode”框。 + 8. 对于“媒体选择Media Selection”,选择“同步的内容Synced Content”来使用你之前同步的 CentOS Stream 内容。 + 9. 从“同步的内容Synced Content”列表中,确保选择 “CentOS Stream”。 + 10. 从“分区表Partition Table”列表中,对于这个演示,选择默认的 “Kickstart”,但有许多可用的选项。 + 11. 在“Root 密码Root Password”栏中,为你的新主机输入一个 root 密码。 + 12. 点击“接口Interface”标签,并点击“编辑Edit”,并添加一个 “Mac 地址Mac address”。 + 13. 点击“参数Parameters”标签,并确保存在一个提供激活密钥的参数。如果没有,添加一个激活密钥。 + 14. 点击“提交Submit”以保存主机条目。 + + + +现在,新的主机处于构建模式,这意味着当你打开它时,它将开始安装操作系统。 + +如果你导航到“主机Hosts > 内容主机Content Hosts”,你可以看到你的主机所订阅的订阅、生命周期环境和内容视图的全部细节。 + +这个例子只是对你在 Foreman 中管理和配置 CentOS Stream 内容的众多选项的一个小窥视。如果你想了解更多关于如何管理 CentOS Stream 版本,控制你的服务器可以访问的内容,以及控制和保护你的基础设施的稳定性的详细信息,请查看 [Foreman 内容管理][5] 文档。当所有 CentOS Stream 内容在你的控制之下时,你可以创建和注册 Centos Stream,只使用你指定的内容。有关配备的更多详细信息,请参见 [Foreman 配备][6] 文档。如果你有任何问题、反馈或建议,你可以在 找到 Foreman 社区。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/9/centos-stream-foreman + +作者:[Melanie Corr][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/melanie-corr +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/puzzle_computer_solve_fix_tool.png?itok=U0pH1uwj (Puzzle pieces coming together to form a computer screen) +[2]: https://twitter.com/Det_Conan_Kudo/status/1337366036023218177?s=20 +[3]: https://opensource.com/article/20/8/manage-repositories-pulp +[4]: https://docs.theforeman.org/3.0/Installing_Server_on_Red_Hat/index-katello.html +[5]: https://docs.theforeman.org/master/Content_Management_Guide/index-foreman.html +[6]: https://docs.theforeman.org/master/Provisioning_Guide/index-foreman.html diff --git a/published/20210901 Ubuntu Server vs Desktop- What-s the Difference.md b/published/20210901 Ubuntu Server vs Desktop- What-s the Difference.md new file mode 100644 index 0000000000..05bb41e5a5 --- /dev/null +++ b/published/20210901 Ubuntu Server vs Desktop- What-s the Difference.md @@ -0,0 +1,133 @@ +[#]: subject: "Ubuntu Server vs Desktop: What’s the Difference?" +[#]: via: "https://itsfoss.com/ubuntu-server-vs-desktop/" +[#]: author: "Abhishek Prakash https://itsfoss.com/author/abhishek/" +[#]: collector: "lujun9972" +[#]: translator: "wxy" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-14146-1.html" + +Ubuntu 服务器版与桌面版有什么区别? +====== + +![](https://img.linux.net.cn/data/attachment/album/202201/04/122152zdqkkqqqw6cgcdcq.jpg) + +当你点击 [Ubuntu 网站][1] 上的下载按钮时,它会给你几个选项。其中两个分别是 Ubuntu 桌面版和 Ubuntu 服务器版。 + +这可能会让新用户感到困惑。为什么会有两个(实际上是四个)?应该下载哪一个?Ubuntu 桌面版还是服务器版?它们是一样的吗?有什么区别? + +![Ubuntu 网站给了你多种选择][2] + +我将解释 Ubuntu 的桌面版和服务器版的区别。我还会解释你应该使用哪个变体。 + +### Ubuntu 桌面版与 Ubuntu 服务器版 + +![Ubuntu 桌面版和服务器版][3] + +要了解 Ubuntu 桌面版和服务器版的区别,你应该了解桌面操作系统和服务器操作系统的区别。 + +#### 桌面操作系统 + +桌面电脑Desktop是指个人电脑(PC)。桌面电脑操作系统带有一个图形用户界面,以便用户可以使用鼠标和键盘操作。桌面电脑的主要目的是给你一个系统,可以用来浏览网页、编辑文档、查看/编辑图片和视频、编码和游戏。基本上,就是为个人、终端用户或家庭成员提供了一个通用的计算机。 + +我在这里使用桌面电脑这个术语,但这并不意味着它不能用于笔记本电脑。桌面电脑是个人电脑的通用术语。 + +#### 服务器操作系统 + +另一方面,服务器操作系统是专门为托管网站、应用程序、媒体服务器、数据库等网络服务而打造的。 + +通常情况下,服务器操作系统不带有图形界面。如果是基于 Linux 的操作系统,你就得通过终端的命令来使用该系统。 + +这里的好处是,服务器操作系统不需要(浪费)大量的内存和计算能力,因为它们不使用 [图形化桌面环境][4]。除此以外,服务器操作系统的软件包配置也不同。 + +现在你对服务器和桌面的区别有了一些了解,让我们看看 Ubuntu 服务器版和桌面版的区别。 + +#### 用户界面 + +Ubuntu 服务器版和桌面版之间最明显的区别是用户界面。 + +Ubuntu 桌面版的特点是采用 GNOME 桌面环境的图形化用户界面。这使得它在鼠标点击的帮助下更容易使用。 + +![图为 Ubuntu GNOME 版的用户界面][5] + +Ubuntu 服务器版采用无头方式headless运行。你只有在登录后才会看到一个终端界面。你经常会从其他电脑上通过 SSH 来远程管理它。 + +![通过 SSH 连接到远程 Ubuntu 服务器][6] + +#### 安装 + +[由于有了图形化的安装程序,将 Ubuntu 作为桌面电脑是很容易的][7]。你可以创建一个临场 USBLive USB,无需安装即可体验桌面版。如果你喜欢,你可以按照屏幕上的指示在几分钟内安装它。 + +![通过图形化安装程序安装 Ubuntu 桌面版][8] + +将 Ubuntu 作为服务器安装并不像桌面版那样简单。你只能使用终端界面。如果你不熟悉这个流程,即使是最简单的任务,如连接到 Wi-Fi,也可能是一个困难的任务。 + +![Ubuntu 服务器版的安装][9] + +#### 应用程序 + +在 Ubuntu 桌面版中,默认的应用程序集主要针对普通计算机用户。因此,你会发现网页浏览器、办公套件、媒体播放器、游戏等。 + +![Ubuntu 中的应用程序][10] + +Ubuntu 服务器版的应用程序更多的是为运行网络服务而定制的。而这还不是全部。有些应用程序的配置也是不同的。以 SSH 为例。Ubuntu 服务器预设了 SSH,这样你就可以轻松地从远程系统连接到它。而在 Ubuntu 桌面版上,你必须明确启用 SSH 才行。 + +#### 硬件要求 + +由于桌面版具有图形用户界面,你需要至少 4GB 的内存来运行 Ubuntu 桌面版。磁盘空间至少要有 20GB。 + +这就是 Ubuntu 服务器的有趣之处。它没有图形化的界面。命令行界面不会消耗大量的系统资源。因此,你可以在 512MB 和 5GB 磁盘空间的机器上轻松运行 Ubuntu 服务器。(LCTT 译注:当然,对于服务器环境来说,内存和磁盘空间是多多益善。) + +服务器上的内存和磁盘空间受制于你所运行的网络服务。如果一个网络应用需要至少 2GB 的内存,你就应该有这么多的内存。但在最简单的情况下,即使是 512MB 或 1GB 的内存也可以工作。 + +#### 用途 + +这是 Ubuntu 桌面版和服务器版之间的主要区别。问问自己,你想把 Ubuntu 用于什么目的? + +如果是专门用于部署网络服务,那就选择 Ubuntu 服务器。请记住,你需要有基本的 Linux 命令行知识来使用终端。 + +如果你想把 Ubuntu 作为像 Windows 一样的普通电脑使用,那就选择 Ubuntu 桌面版。如果你想用它来学习 Linux 命令,或用于学习的 Docker 或者甚至是简单的(但是本地的)LAMP 服务器环境,请继续使用 Ubuntu 桌面。 + +对于服务器来说,Ubuntu 服务器版要比 Ubuntu 桌面版好。对于常规的计算机使用,Ubuntu 桌面版是更好的选择。 + +#### 你应该在服务器上使用 Ubuntu 桌面版还是在服务器上安装图形界面? + +是这样的,Ubuntu 桌面版和服务器版都是 Linux,你可以用 Ubuntu 桌面版作为服务器来托管网页服务。这没问题。 + +同样地,[你可以在 Ubuntu 服务器上安装图形界面][11],并以图形方式使用它。这也是可行的。 + +![Ubuntu 服务器上的 GUI 登录][12] + +但仅仅因为它可行,并不意味着你应该这么做。它违背了为服务器和桌面电脑创建不同版本的全部目的。 + +你必须付出额外的努力来将服务器版转换为桌面版,反之亦然。为什么要承受这种痛苦呢? + +如果你使用 Ubuntu 的目的很明确,那就下载并安装合适的 Ubuntu 版本。 + +我希望这能使围绕 Ubuntu 桌面版和服务器版的选择现在更清楚一些。如果你有问题或建议,请利用评论区。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/ubuntu-server-vs-desktop/ + +作者:[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://ubuntu.com/ +[2]: https://itsfoss.com/wp-content/uploads/2021/08/ubuntu-server-desktop-download-800x338.webp +[3]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/08/ubuntu-desktop-server.png?resize=800%2C450&ssl=1 +[4]: https://itsfoss.com/what-is-desktop-environment/ +[5]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/05/installing-gui-ubuntu-server-gnome-desktop.png?resize=792%2C597&ssl=1 +[6]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/08/system-restart-required.png?resize=800%2C469&ssl=1 +[7]: https://itsfoss.com/install-ubuntu/ +[8]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/02/installing-ubuntu.png?resize=800%2C549&ssl=1 +[9]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/08/ubuntu-server-installation.png?resize=800%2C600&ssl=1 +[10]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/09/gnome-app-arranger.jpg?resize=799%2C450&ssl=1 +[11]: https://itsfoss.com/install-gui-ubuntu-server/ +[12]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/05/installing-gui-ubuntu-server-gnome-desktop-greet.png?resize=798%2C600&ssl=1 diff --git a/published/20210916 Crunch numbers in Python with NumPy.md b/published/20210916 Crunch numbers in Python with NumPy.md new file mode 100644 index 0000000000..551d1acc72 --- /dev/null +++ b/published/20210916 Crunch numbers in Python with NumPy.md @@ -0,0 +1,425 @@ +[#]: subject: "Crunch numbers in Python with NumPy" +[#]: via: "https://opensource.com/article/21/9/python-numpy" +[#]: author: "Ayush Sharma https://opensource.com/users/ayushsharma" +[#]: collector: "lujun9972" +[#]: translator: "wxy" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-14160-1.html" + +用 NumPy 在 Python 中处理数字 +====== + +> 这篇文章讨论了安装 NumPy,然后创建、读取和排序 NumPy 数组。 + +![](https://img.linux.net.cn/data/attachment/album/202201/08/174635srrhdhh8wq9fdkrh.jpg) + +NumPy(即 **Num**erical **Py**thon)是一个库,它使得在 Python 中对线性数列和矩阵进行统计和集合操作变得容易。[我在 Python 数据类型的笔记中介绍过][2],它比 Python 的列表快几个数量级。NumPy 在数据分析和科学计算中使用得相当频繁。 + +我将介绍安装 NumPy,然后创建、读取和排序 NumPy 数组。NumPy 数组也被称为 ndarray,即 N 维数组的缩写。 + +### 安装 NumPy + +使用 `pip` 安装 NumPy 包非常简单,可以像安装其他软件包一样进行安装: + +``` +pip install numpy +``` + +安装了 NumPy 包后,只需将其导入你的 Python 文件中: + +``` +import numpy as np +``` + +将 `numpy` 以 `np` 之名导入是一个标准的惯例,但你可以不使用 `np`,而是使用你想要的任何其他别名。 + +### 为什么使用 NumPy? 因为它比 Python 列表要快好几个数量级 + +当涉及到处理大量的数值时,NumPy 比普通的 Python 列表快几个数量级。为了看看它到底有多快,我首先测量在普通 Python 列表上进行 `min()` 和 `max()` 操作的时间。 + +我将首先创建一个具有 999,999,999 项的 Python 列表: + +``` +>>> my_list = range(1, 1000000000) +>>> len(my_list) +999999999 +``` + +现在我将测量在这个列表中找到最小值的时间: + +``` +>>> start = time.time() +>>> min(my_list) +1 +>>> print('Time elapsed in milliseconds: ' + str((time.time() - start) * 1000)) +Time elapsed in milliseconds: 27007.00879096985 +``` + +这花了大约 27,007 毫秒,也就是大约 **27 秒**。这是个很长的时间。现在我试着找出寻找最大值的时间: + +``` +>>> start = time.time() +>>> max(my_list) +999999999 +>>> print('Time elapsed in milliseconds: ' + str((time.time() - start) * 1000)) +Time elapsed in milliseconds: 28111.071348190308 +``` + +这花了大约 28,111 毫秒,也就是大约 **28 秒**。 + +现在我试试用 NumPy 找到最小值和最大值的时间: + +``` +>>> my_list = np.arange(1, 1000000000) +>>> len(my_list) +999999999 +>>> start = time.time() +>>> my_list.min() +1 +>>> print('Time elapsed in milliseconds: ' + str((time.time() - start) * 1000)) +Time elapsed in milliseconds: 1151.1778831481934 +>>> +>>> start = time.time() +>>> my_list.max() +999999999 +>>> print('Time elapsed in milliseconds: ' + str((time.time() - start) * 1000)) +Time elapsed in milliseconds: 1114.8970127105713 +``` + +找到最小值花了大约 1151 毫秒,找到最大值 1114 毫秒。这大约是 **1 秒**。 + +正如你所看到的,使用 NumPy 可以将寻找一个大约有 10 亿个值的列表的最小值和最大值的时间 **从大约 28 秒减少到 1 秒**。这就是 NumPy 的强大之处。 + +### 使用 Python 列表创建 ndarray + +有几种方法可以在 NumPy 中创建 ndarray。 + +你可以通过使用元素列表来创建一个 ndarray: + +``` +>>> my_ndarray = np.array([1, 2, 3, 4, 5]) +>>> print(my_ndarray) +[1 2 3 4 5] +``` + +有了上面的 ndarray 定义,我将检查几件事。首先,上面定义的变量的类型是 `numpy.ndarray`。这是所有 NumPy ndarray 的类型: + +``` +>>> type(my_ndarray) + +``` + +这里要注意的另一件事是 “形状shape”。ndarray 的形状是 ndarray 的每个维度的长度。你可以看到,`my_ndarray` 的形状是 `(5,)`。这意味着 `my_ndarray` 包含一个有 5 个元素的维度(轴)。 + +``` +>>> np.shape(my_ndarray) +(5,) +``` + +数组中的维数被称为它的 “rank”。所以上面的 ndarray 的秩是 1。 + +我将定义另一个 ndarray `my_ndarray2` 作为一个多维 ndarray。那么它的形状会是什么呢?请看下面: + +``` +>>> my_ndarray2 = np.array([(1, 2, 3), (4, 5, 6)]) +>>> np.shape(my_ndarray2) +(2, 3) +``` + +这是一个秩为 2 的 ndarray。另一个要检查的属性是 `dtype`,也就是数据类型。检查我们的 ndarray 的 `dtype` 可以得到以下结果: + +``` +>>> my_ndarray.dtype +dtype('int64') +``` + +`int64` 意味着我们的 ndarray 是由 64 位整数组成的。NumPy 不能创建混合类型的 ndarray,必须只包含一种类型的元素。如果你定义了一个包含混合元素类型的 ndarray,NumPy 会自动将所有的元素类型转换为可以包含所有元素的最高元素类型。 + +例如,创建一个 `int` 和 `float` 的混合序列将创建一个 `float64` 的 ndarray: + +``` +>>> my_ndarray2 = np.array([1, 2.0, 3]) +>>> print(my_ndarray2) +[1. 2. 3.] +>>> my_ndarray2.dtype +dtype('float64') +``` + +另外,将其中一个元素设置为 `string` 将创建 `dtype` 等于 `>> my_ndarray2 = np.array([1, '2', 3]) +>>> print(my_ndarray2) +['1' '2' '3'] +>>> my_ndarray2.dtype +dtype('>> my_ndarray = np.array([1, 2, 3, 4, 5]) +>>> my_ndarray.size +5 +``` + +### 使用 NumPy 方法创建 ndarray + +如果你不想直接使用列表来创建 ndarray,还有几种可以用来创建它的 NumPy 方法。 + +你可以使用 `np.zeros()` 来创建一个填满 0 的 ndarray。它需要一个“形状”作为参数,这是一个包含行数和列数的列表。它还可以接受一个可选的 `dtype` 参数,这是 ndarray 的数据类型: + +``` +>>> my_ndarray = np.zeros([2,3], dtype=int) +>>> print(my_ndarray) +[[0 0 0] + [0 0 0]] +``` + +你可以使用 `np. ones()` 来创建一个填满 `1` 的 ndarray: + +``` +>>> my_ndarray = np.ones([2,3], dtype=int) +>>> print(my_ndarray) +[[1 1 1] + [1 1 1]] +``` + +你可以使用 `np.full()` 来给 ndarray 填充一个特定的值: + +``` +>>> my_ndarray = np.full([2,3], 10, dtype=int) +>>> print(my_ndarray) +[[10 10 10] + [10 10 10]] +``` + +你可以使用 `np.eye()` 来创建一个单位矩阵 / ndarray,这是一个沿主对角线都是 `1` 的正方形矩阵。正方形矩阵是一个行数和列数相同的矩阵: + +``` +>>> my_ndarray = np.eye(3, dtype=int) +>>> print(my_ndarray) +[[1 0 0] + [0 1 0] + [0 0 1]] +``` + +你可以使用 `np.diag()` 来创建一个沿对角线有指定数值的矩阵,而在矩阵的其他部分为 `0`: + +``` +>>> my_ndarray = np.diag([10, 20, 30, 40, 50]) +>>> print(my_ndarray) +[[10 0 0 0 0] + [ 0 20 0 0 0] + [ 0 0 30 0 0] + [ 0 0 0 40 0] + [ 0 0 0 0 50]] +``` + +你可以使用 `np.range()` 来创建一个具有特定数值范围的 ndarray。它是通过指定一个整数的开始和结束(不包括)范围以及一个步长来创建的: + +``` +>>> my_ndarray = np.arange(1, 20, 3) +>>> print(my_ndarray) +[ 1 4 7 10 13 16 19] +``` + +### 读取 ndarray + +ndarray 的值可以使用索引、分片或布尔索引来读取。 + +#### 使用索引读取 ndarray 的值 + +在索引中,你可以使用 ndarray 的元素的整数索引来读取数值,就像你读取 Python 列表一样。就像 Python 列表一样,索引从 `0` 开始。 + +例如,在定义如下的 ndarray 中: + +``` +>>> my_ndarray = np.arange(1, 20, 3) +``` + +第四个值将是 `my_ndarray[3]`,即 `10`。最后一个值是 `my_ndarray[-1]`,即 `19`: + +``` +>>> my_ndarray = np.arange(1, 20, 3) +>>> print(my_ndarray[0]) +1 +>>> print(my_ndarray[3]) +10 +>>> print(my_ndarray[-1]) +19 +>>> print(my_ndarray[5]) +16 +>>> print(my_ndarray[6]) +19 +``` + +#### 使用分片读取 ndarray + +你也可以使用分片来读取 ndarray 的块。分片的工作方式是用冒号(`:`)操作符指定一个开始索引和一个结束索引。然后,Python 将获取该开始和结束索引之间的 ndarray 片断: + +``` +>>> print(my_ndarray[:]) +[ 1 4 7 10 13 16 19] +>>> print(my_ndarray[2:4]) +[ 7 10] +>>> print(my_ndarray[5:6]) +[16] +>>> print(my_ndarray[6:7]) +[19] +>>> print(my_ndarray[:-1]) +[ 1 4 7 10 13 16] +>>> print(my_ndarray[-1:]) +[19] +``` + +分片创建了一个 ndarray 的引用(或视图)。这意味着,修改分片中的值也会改变原始 ndarray 的值。 + +比如说: + +``` +>>> my_ndarray[-1:] = 100 +>>> print(my_ndarray) +[ 1 4 7 10 13 16 100] +``` + +对于秩超过 1 的 ndarray 的分片,可以使用 `[行开始索引:行结束索引, 列开始索引:列结束索引]` 语法: + +``` +>>> my_ndarray2 = np.array([(1, 2, 3), (4, 5, 6)]) +>>> print(my_ndarray2) +[[1 2 3] + [4 5 6]] +>>> print(my_ndarray2[0:2,1:3]) +[[2 3] + [5 6]] +``` + +#### 使用布尔索引读取 ndarray 的方法 + +读取 ndarray 的另一种方法是使用布尔索引。在这种方法中,你在方括号内指定一个过滤条件,然后返回符合该条件的 ndarray 的一个部分。 + +例如,为了获得一个 ndarray 中所有大于 5 的值,你可以指定布尔索引操作 `my_ndarray[my_ndarray > 5]`。这个操作将返回一个包含所有大于 5 的值的 ndarray: + +``` +>>> my_ndarray = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]) +>>> my_ndarray2 = my_ndarray[my_ndarray > 5] +>>> print(my_ndarray2) +[ 6 7 8 9 10] +``` + +例如,为了获得一个 ndarray 中的所有偶数值,你可以使用如下的布尔索引操作: + +``` +>>> my_ndarray2 = my_ndarray[my_ndarray % 2 == 0] +>>> print(my_ndarray2) +[ 2 4 6 8 10] +``` + +而要得到所有的奇数值,你可以用这个方法: + +``` +>>> my_ndarray2 = my_ndarray[my_ndarray % 2 == 1] +>>> print(my_ndarray2) +[1 3 5 7 9] +``` + +### ndarray 的矢量和标量算术 + +NumPy 的 ndarray 允许进行矢量和标量算术操作。在矢量算术中,在两个 ndarray 之间进行一个元素的算术操作。在标量算术中,算术运算是在一个 ndarray 和一个常数标量值之间进行的。 + +如下的两个 ndarray: + +``` +>>> my_ndarray = np.array([1, 2, 3, 4, 5]) +>>> my_ndarray2 = np.array([6, 7, 8, 9, 10]) +``` + +如果你将上述两个 ndarray 相加,就会产生一个两个 ndarray 的元素相加的新的 ndarray。例如,产生的 ndarray 的第一个元素将是原始 ndarray 的第一个元素相加的结果,以此类推: + +``` +>>> print(my_ndarray2 + my_ndarray) +[ 7 9 11 13 15] +``` + +这里,`7` 是 `1` 和 `6` 的和,这是我相加的 ndarray 中的前两个元素。同样,`15` 是 `5` 和`10` 之和,是最后一个元素。 + +请看以下算术运算: + +``` +>>> print(my_ndarray2 - my_ndarray) +[5 5 5 5 5] +>>> +>>> print(my_ndarray2 * my_ndarray) +[ 6 14 24 36 50] +>>> +>>> print(my_ndarray2 / my_ndarray) +[6. 3.5 2.66666667 2.25 2. ] +``` + +在 ndarray 中加一个标量值也有类似的效果,标量值被添加到 ndarray 的所有元素中。这被称为“广播broadcasting”: + +``` +>>> print(my_ndarray + 10) +[11 12 13 14 15] +>>> +>>> print(my_ndarray - 10) +[-9 -8 -7 -6 -5] +>>> +>>> print(my_ndarray * 10) +[10 20 30 40 50] +>>> +>>> print(my_ndarray / 10) +[0.1 0.2 0.3 0.4 0.5] +``` + +### ndarray 的排序 + +有两种方法可以对 ndarray 进行原地或非原地排序。原地排序会对原始 ndarray 进行排序和修改,而非原地排序会返回排序后的 ndarray,但不会修改原始 ndarray。我将尝试这两个例子: + +``` +>>> my_ndarray = np.array([3, 1, 2, 5, 4]) +>>> my_ndarray.sort() +>>> print(my_ndarray) +[1 2 3 4 5] +``` + +正如你所看到的,`sort()` 方法对 ndarray 进行原地排序,并修改了原数组。 + +还有一个方法叫 `np.sort()`,它对数组进行非原地排序: + +``` +>>> my_ndarray = np.array([3, 1, 2, 5, 4]) +>>> print(np.sort(my_ndarray)) +[1 2 3 4 5] +>>> print(my_ndarray) +[3 1 2 5 4] +``` + +正如你所看到的,`np.sort()` 方法返回一个已排序的 ndarray,但没有修改它。 + +### 总结 + +我已经介绍了很多关于 NumPy 和 ndarray 的内容。我谈到了创建 ndarray,读取它们的不同方法,基本的向量和标量算术,以及排序。NumPy 还有很多东西可以探索,包括像 `union()` 和 `intersection()`这样的集合操作,像 `min()` 和 `max()` 这样的统计操作,等等。 + +我希望我上面演示的例子是有用的。祝你在探索 NumPy 时愉快。 + +本文最初发表于 [作者的个人博客][3],经授权后改编。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/9/python-numpy + +作者:[Ayush Sharma][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/ayushsharma +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/math_money_financial_calculator_colors.jpg?itok=_yEVTST1 (old school calculator) +[2]: https://notes.ayushsharma.in/2018/09/data-types-in-python +[3]: https://notes.ayushsharma.in/2018/10/working-with-numpy-in-python diff --git a/published/202110/20200228 How to process real-time data with Apache.md b/published/202110/20200228 How to process real-time data with Apache.md new file mode 100644 index 0000000000..7d4b4189b2 --- /dev/null +++ b/published/202110/20200228 How to process real-time data with Apache.md @@ -0,0 +1,82 @@ +[#]: collector: (lujun9972) +[#]: translator: (unigeorge) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13891-1.html) +[#]: subject: (How to process real-time data with Apache) +[#]: via: (https://opensource.com/article/20/2/real-time-data-processing) +[#]: author: (Simon Crosby https://opensource.com/users/simon-crosby) + +如何使用 Apache 软件处理实时数据 +====== + +> 开源以丰富的项目画布引领着处理实时事件的方向。 + +![](https://img.linux.net.cn/data/attachment/album/202110/17/105502opl53qrmj950j3mv.jpg) + +在“永不下线”的未来,入网设备规模可能会达到数十亿。存储原始数据,日后再进行分析的方案将不再能满足需求,因为用户需要实时且准确的响应。要对故障等对环境敏感的状况进行预测,实时处理数据也必不可少 —— 数据到达数据库后再处理肯定是来不及的。 + +有人可能会说,“云可扩展性”能够满足实时处理流数据的需求,但一些简单的例子就能表明它永远无法满足对无界数据流进行实时响应的需求。从移动设备到物联网,都需要一种新的范式来满足需求。尽管云计算依赖于对大数据“先存储后分析”的方案,但也迫切需要一种能够处理持续、杂乱和海量数据流的软件框架,并在数据流到达时立即对其进行处理,以保证实时的响应、预测和对数据的洞悉。 + +例如,在加利福尼亚州的帕洛阿尔托市,每天从基础交通设施产生的流数据比 Twitter Firehose 还要多。这是很大的数据量。为 Uber、Lyft 和 FedEx 等消费者预测城市交通需要实时的分析、学习和预测。云处理不可避免地导致每个事件大约会有半秒的延迟。 + +我们需要一个简单而强大的编程范式,让应用程序在类似下面的情况时能够动态处理无界数据流: + + * 数据量巨大,或原始数据的移动成本很高。 + * 数据由广泛分布的资产(例如移动设备)生成。 + * 数据具有转瞬即逝的价值,即时分析迫在眉睫。 + * 需要始终洞悉最新数据情况,外推法行不通。 + +### 发布和订阅 + +事件驱动系统领域中有一个关键架构模式:发布/订阅publish/subscribe 消息传递模式。这是一种异步通信方法,其中消息会从 _发布者_(数据产生方)传递到 _订阅者_(处理数据的应用程序)。发布/订阅模式可以将消息发送者与消费者分离开来。 + +在发布/订阅模式中,消息源会 _发布_ 针对某个 主题topic事件event服务端broker,后者按接收顺序存储它们。应用程序可以 _订阅_ 一个或多个 _主题_,然后 _服务端_ 会转发匹配的事件。 Apache Kafka 和 Pulsar 以及 CNCF NATS 是发布/订阅系统。 发布/订阅的云服务包括 Google Pub/Sub、AWS Kinesis、Azure Service Bus、Confluent Cloud 等。(LCTT 译注:本段部分术语英文名称更为泛用,针对这些术语,采用了中英文标注。) + +发布/订阅系统不会 _运行_ 订阅者应用程序,它们只是 _传递_ 数据给相应主题的订阅者。 + +流数据通常包含应用程序或基础架构状态更新的事件。在选择架构来处理数据时,发布/订阅框架等数据分发系统的作用是有限的。消费者应用程序的“处理方式”超出了发布/订阅系统的范围。这让开发人员的管理变得极具复杂性。所谓的流处理器是一种特殊的订阅者,可以动态分析数据并将结果返回给同一个服务端。 + +### Apache Spark + +[Apache Spark][2] 是用于大规模数据处理的统一分析引擎。通常将 Apache Spark Streaming 用作流处理器,例如给机器学习模型提供新数据。Spark Streaming 将数据分成小批量,每个小批量都由 Spark 模型或其他系统独立分析。事件流可以被分组成小批量以进行分析,但流处理器本身必须具有弹性: + + * 流处理器必须能够根据数据速率进行扩展,甚至要能够跨越服务器和云,并且还可以跨实例实现负载均衡,以确保弹性和其他应用层的需求。 + * 它必须能够分析来自不同来源的数据,这些数据源的报告速率可能相差很大。这意味着它必须是有状态的,或者将状态存储在数据库中。当使用 Spark Streaming 作为流处理器时,通常会使用后一种方法,这种方法在需要超低延迟响应时可能会存在性能问题。 + +相关项目 [Apache Samza][3] 也提供了一种处理实时事件流的方法,并使用 [Hadoop Yarn][4] 或 [Apache Mesos][5] 来管理计算资源,以便进行弹性扩展。 + +### 解决数据扩展问题 + +需要注意的是,即使是 Samza 也不能完全减轻开发人员的数据处理需求。扩展数据规模意味着处理事件的任务需要跨多个实例进行负载均衡,而使用数据库是实例间共享结果应用层状态的唯一方法。然而,当应用程序任务之间的状态协调转移到数据库时,对性能会产生不可避免的连锁反应。此外,数据库的选择也至关重要。随着系统的扩展,数据库的集群管理会成为下一个潜在的瓶颈。 + +这个问题可以通过有状态、有弹性的替代方案来解决,并且这样的解决方案可以用来代替流处理器。在应用程序级别(容器或实例内),这些解决方案依据流的更新,动态构建并发、互连的“web 代理”的有状态模型。代理是并发的“微服务”,它们消费单一来源的原始数据并维护它们的状态。基于数据中发现的源之间的真实关系(如包含和临近),代理实现互连以共享状态。代理也因此形成了一个并发服务图,可以分析它们自己的状态和链接到的代理的状态。数据源将原始数据转换为状态,并根据自身及其链接子图的变化进行分析、学习和预测,每个代理都为单个这样的数据源提供微服务。 + +这些解决方案允许大量的代理(真实数据源的数字类比)分布,甚至还有在应用层使代理互连的分布式图,从而简化了应用架构。这是因为代理之间互连的本质,是映射到解决方案的当前运行时执行实例和代理本身的 URL。通过这种方式,应用程序可以跨实例无缝扩展,而无需担心 DevOps 问题。代理消费数据并维护状态,还会计算自己和其他代理的状态。由于代理是有状态的,因此不需要数据库,并且数据洞察是以内存速度计算的。 + +### 使用开源阅读数据世界 + +我们查看数据的方式正在发生翻天覆地的变化:不再将数据库用作记录系统,取而代之的是现实世界,现实世界事物的数字类比可以不断地传输它们的状态。幸运的是,开源社区在处理实时事件的项目丰富度方面处于领先地位。从发布/订阅模式(其中最活跃的社区是 Apache Kafka、Pulsar 和 CNCF NATS)到持续处理流数据的分析框架,包括 Apache Spark、[Flink][6]、[Beam][7]、Samza,以及 Apache 许可的 [SwimOS][8] 和 [Hazelcast][9],对开发人员来说,可选择项目非常之多。可以说,没有什么地方比开源社区的专有软件框架更多了。试看软件的未来,必是开源的天下。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/2/real-time-data-processing + +作者:[Simon Crosby][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/simon-crosby +[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://spark.apache.org/ +[3]: https://samza.apache.org/ +[4]: https://hadoop.apache.org/ +[5]: http://mesos.apache.org/ +[6]: https://flink.apache.org/ +[7]: https://beam.apache.org +[8]: https://github.com/swimos/swim +[9]: https://hazelcast.com/ diff --git a/published/202110/20200504 Define and optimize data partitions in Apache Cassandra.md b/published/202110/20200504 Define and optimize data partitions in Apache Cassandra.md new file mode 100644 index 0000000000..2d5c833852 --- /dev/null +++ b/published/202110/20200504 Define and optimize data partitions in Apache Cassandra.md @@ -0,0 +1,141 @@ +[#]: collector: (lujun9972) +[#]: translator: (unigeorge) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13908-1.html) +[#]: subject: (Define and optimize data partitions in Apache Cassandra) +[#]: via: (https://opensource.com/article/20/5/apache-cassandra) +[#]: author: (Anil Inamdar https://opensource.com/users/anil-inamdar) + +在 Apache Cassandra 中定义和优化数据分区 +====== + +> 速度和可扩展性是 Apache Cassandra 不变的追求;来学习一下如何充分发挥它的专长吧。 + +![](https://img.linux.net.cn/data/attachment/album/202110/22/103651gse3iyiajyaagk34.jpg) + +Apache Cassandra 是一个数据库,但又不是一个简单的数据库;它是一个复制数据库,专为可扩展性、高可用性、低延迟和良好性能而设计调整。Cassandra 可以帮你的数据在区域性中断、硬件故障时,以及很多管理员认为数据量过多的情况下幸免于难。 + +全面掌握数据分区知识,你就能让 Cassandra 集群实现良好的设计、极高的性能和可扩展性。在本文中,我将探究如何定义分区,Cassandra 如何使用这些分区,以及一些你应该了解的最佳实践方案和已知问题。 + +基本概念是这样的: 供数据库关键函数(如数据分发、复制和索引化)使用的原子单元,单个这样的数据块就是一个分区。分布式数据系统通常会把传入的数据分配到这些分区中,使用简单的数学函数(例如 identity 或 hashing 函数)执行分区过程,并用得到的 “分区键” 对数据分组,进一步再形成分区。例如,假设传入数据是服务器日志,使用 “identity” 分区函数和每个日志的时间戳(四舍五入到小时值)作为分区键,我们可以对这些数据进行分区,实现每个分区各保存一小时的日志的目的。 + +### Cassandra 中的数据分区 + +Cassandra 作为分布式系统运行,并且符合前述数据分区原则。使用 Cassandra,数据分区依赖于在集群级别配置的算法和在表级别配置的分区键。 + +![Cassandra data partition][2] + +Cassandra 查询语言(CQL)使用大家很熟悉的 SQL 表、行、列等术语。在上面的示例图中,表配置的主键中包含了分区键,具体格式为:主键Primary Key = 分区键Partition Key + [聚簇列Clustering Columns] 。 + +Cassandra 中的主键既定义了唯一的数据分区,也包含着分区内的数据排列依据信息。数据排列信息取决于聚簇列(非必需项)。每个唯一的分区键代表着服务器(包括其副本所在的服务器)中管理的若干行。 + +### 在 CQL 中定义主键 + +接下来的四个示例演示了如何使用 CQL 语法表示主键。定义主键会让数据行分到不同的集合里,通常这些集合就是分区。 + +#### 定义方式 1(分区键:log_hour,聚簇列:无) + +``` +CREATE TABLE server_logs( +   log_hour TIMESTAMP PRIMARYKEY, +   log_level text, +   message text, +   server text +   ) +``` + +这里,有相同 `log_hour` 的所有行都会进入同一个分区。 + +#### 定义方式 2(分区键:log_hour,聚簇列:log_level) + +``` +CREATE TABLE server_logs( +   log_hour TIMESTAMP, +   log_level text, +   message text, +   server text, +   PRIMARY KEY (log_hour, log_level) +   ) +``` + +此定义方式与方式 1 使用了相同的分区键,但此方式中,每个分区的所有行都会按 `log_level` 升序排列。 + +#### 定义方式 3(分区键:log_hour,server,聚簇列:无) + +``` +CREATE TABLE server_logs( +   log_hour TIMESTAMP, +   log_level text, +   message text, +   server text, +   PRIMARY KEY ((log_hour, server)) +   ) +``` + +在此定义中,`server` 和 `log_hour` 字段都相同的行才会进入同一个分区。 + +#### 定义方式 4(分区键:log_hour,server,聚簇列:log_level) + +``` +CREATE TABLE server_logs( +   log_hour TIMESTAMP, +   log_level text, +   message text, +   server text, +   PRIMARY KEY ((log_hour, server),log_level) +   )WITH CLUSTERING ORDER BY (column3 DESC); +``` + +此定义方式与方式 3 分区相同,但分区内的行会依照 `log_level` 降序排列。 + +### Cassandra 如何使用分区键 + +Cassandra 依靠分区键来确定在哪个节点上存储数据,以及在需要时定位数据。Cassandra 通过查看表中的分区键来执行这些读取和写入操作,并使用令牌tokens(一个 $-2^{63}$ 到 $+2^{63}-1$ 范围内的 long 类型值)来进行数据分布和索引。这些令牌通过分区器映射到分区键,分区器使用了将分区键转换为令牌的分区函数。通过这种令牌机制,Cassandra 集群的每个节点都拥有一组数据分区。然后分区键在每个节点上启用数据索引。 + +![Cassandra cluster with 3 nodes and token-based ownership][3] + +图中显示了一个三节点的 Cassandra 集群以及相应的令牌范围分配。这只是一个简单的示意图:具体实现过程使用了 [Vnodes][4]。 + +### 数据分区对 Cassandra 集群的影响 + +用心的分区键设计对于实现用例的理想分区大小至关重要。合理的分区可以实现均匀的数据分布和强大的 I/O 性能。分区大小对 Cassandra 集群有若干需要注意的影响: + + * 读取性能 —— 为了在磁盘上的 SSTables 文件中找到分区,Cassandra 使用缓存、索引和索引摘要等数据结构。过大的分区会降低这些数据结构的维护效率,从而对性能产生负面影响。Cassandra 新版本在这方面取得了长足的进步:特别是 3.6 及其以上版本的 Cassandra 引擎引入了存储改进,针对大型分区,可以提供更好的性能,以及更强的应对内存问题和崩溃的弹性。 + * 内存使用 —— 大分区会对 JVM 堆产生更大的压力,同时分区的增大也降低了垃圾收集机制的效率。 + * Cassandra 修复 —— 大分区使 Cassandra 执行修复维护操作(通过跨副本比较数据来保持数据一致)时更加困难。 + * “墓碑”删除 —— 听起来可能有点骇人,Cassandra 使用称为“墓碑tombstones”的独特标记来记录要删除的数据。如果没有合适的数据删除模式和压缩策略,大分区会使删除过程变得更加困难。 + +虽然这些影响可能会让人更倾向于简单地设计能产生小分区的分区键,但数据访问模式对理想的分区大小也有很大影响(有关更多信息,请阅读关于 [Cassandra 数据建模][5] 的深入讲解)。数据访问模式可以定义为表的查询方式,包括表的所有 `select` 查询。 理想情况下,CQL 选择查询应该在 `where` 子句中只使用一个分区键。也就是说,当查询可以从单个分区,而不是许多较小的分区获取所需数据时,Cassandra 是最有效率的。 + +### 分区键设计的最佳实践 + +遵循分区键设计的最佳实践原则,这会帮你得到理想的分区大小。根据经验,Cassandra 中的最大分区应保持在 100MB 以下。理想情况下,它应该小于 10MB。虽然 Cassandra 3.6 及其以上版本能更好地支持大分区,但也必须对每个工作负载进行仔细的测试和基准测试,以确保分区键设计能够支持所需的集群性能。 + +具体来说,这些最佳实践原则适用于任何分区键设计: + + * 分区键的目标必须是将理想数量的数据放入每个分区,以支持其访问模式的需求。 + * 分区键应禁止无界分区:那些大小可能随着时间无限增长的分区。例如,在上面的 `server_logs` 示例中,随着服务器日志数量的不断增加,使用服务器列作为分区键就会产生无界分区。相比之下,使用 `log_hour` 将每个分区限制为一个小时数据的方案会更好。 + * 分区键还应避免产生分区倾斜,即分区增长不均匀,有些分区可能随着时间的推移而不受限制地增长。在 `server_logs` 示例中,在一台服务器生成的日志远多于其他服务器的情况下使用服务器列会产生分区倾斜。为了避免这种情况,可以从表中引入另一个属性来强制均匀分布,即使要创建一个虚拟列来这样做,也是值得的。 + * 使用时间元素和其他属性的组合分区键,这对时间序列数据分区很有帮助。这种方式可以防止无界分区,使访问模式能够在查询特定数据时使用时间属性,而且能够对特定时间段内的数据进行删除。上面的每个示例都使用了 `log_hour` 时间属性来演示这一点。 + +还有一些工具可用于帮助测试、分析和监控 Cassandra 分区,以检查所选模式是否高效。通过仔细设计分区键,使解决方案的数据和需求保持一致,并遵循最佳实践原则来优化分区大小,你就可以充分利用数据分区,更好地发挥 Cassandra 的可扩展性和性能潜力。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/5/apache-cassandra + +作者:[Anil Inamdar][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/anil-inamdar +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/data_metrics_analytics_desktop_laptop.png?itok=9QXd7AUr (Person standing in front of a giant computer screen with numbers, data) +[2]: https://opensource.com/sites/default/files/uploads/apache_cassandra_1_0.png (Cassandra data partition) +[3]: https://opensource.com/sites/default/files/uploads/apache_cassandra_2_0.png (Cassandra cluster with 3 nodes and token-based ownership) +[4]: https://www.instaclustr.com/cassandra-vnodes-how-many-should-i-use/ +[5]: https://www.instaclustr.com/resource/6-step-guide-to-apache-cassandra-data-modelling-white-paper/ diff --git a/published/202110/20201029 Managing resources with cgroups in systemd.md b/published/202110/20201029 Managing resources with cgroups in systemd.md new file mode 100644 index 0000000000..b897c6cd6a --- /dev/null +++ b/published/202110/20201029 Managing resources with cgroups in systemd.md @@ -0,0 +1,363 @@ +[#]: collector: (lujun9972) +[#]: translator: (YungeG) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13881-1.html) +[#]: subject: (Managing resources with cgroups in systemd) +[#]: via: (https://opensource.com/article/20/10/cgroups) +[#]: author: (David Both https://opensource.com/users/dboth) + +在 systemd 中使用控制组管理资源 +====== + +> 控制组可以按照应用管理资源,而不是按照组成应用的单个进程。 + +![](https://img.linux.net.cn/data/attachment/album/202110/14/114622by5jdu87u4vng272.jpg) + +作为一个系统管理员,没有事情比意外地耗尽计算资源让我更觉得沮丧。我曾不止一次填满了一个分区的所有可用磁盘空间、耗尽内存、以及没有足够的 CPU 时间在合理的时间内处理我的任务。资源管理是系统管理员最重要的工作之一。 + +资源管理的关键是保证所有的进程能够相对公平的访问需要的系统资源。资源管理还包括确保在需要时添加内存、硬盘驱动器空间、还有 CPU 处理能力;或者在无法添加时限制资源的使用。此外,应该阻止独占系统资源的用户,无论其是否有意。 + +系统管理员可以通过一些工具监控和管理不同的系统资源。例如,[top][2] 和类似的工具允许你监控内存、I/O、存储(磁盘、SSD 等)、网络、交换空间、CPU 的用量等。这些工具,尤其是那些以 CPU 为中心的工具,大部分基于以运行的进程为基本单位进行控制的模型。它们最多只是提供了一种方式来调整 `nice` 数字,从而修改优先级,或者杀死一个运行的进程。(要了解 `nice` 数字的信息,查看 [使用 Glances 监控 Linux 和 Windows 主机][3])。 + +SystemV 环境中基于传统的资源管理的其他工具,由 `/etc/security/limits.conf` 文件和 `/etc/security/limits.d` 中的本地配置文件控制。资源可以按照用户或组以一种相对粗糙但实用的方式限制。可以管理的资源包括内存的各个方面、每日的总 CPU 时间、数据总量、优先级、`nice` 数字、并发登录的数量、进程数、文件大小的最大值等。 + +### 使用控制组管理进程 + +[systemd 和 SystemV][4] 之间的一个主要差异是管理进程的方式。SystemV 将每个进程视作一个独立的实体。systemd 将相关的进程集中到一个控制组,简写做 [cgroup][5],并将控制组作为一个整体管理系统资源。这意味着资源能够基于应用管理,而不是由组成应用的各个进程来管理。 + +控制组的控制单元称作切片单元slice unit。切片是允许 systemd 以树状格式控制程序次序,从而简化管理的概念化。 + +### 查看控制组 + +我将从一些允许你查看不同类型控制组信息的命令开始。 `systemctl status ` 命令显示一个特定服务的切片信息,包括服务的切片。这个例子展示了 `at` 守护进程: + +``` +[root@testvm1 ~]# systemctl status atd.service +● atd.service - Deferred execution scheduler + Loaded: loaded (/usr/lib/systemd/system/atd.service; enabled; vendor preset: enabled) + Active: active (running) since Wed 2020-09-23 12:18:24 EDT; 1 day 3h ago + Docs: man:atd(8) + Main PID: 1010 (atd) + Tasks: 1 (limit: 14760) + Memory: 440.0K + CPU: 5ms + CGroup: /system.slice/atd.service + └─1010 /usr/sbin/atd -f + +Sep 23 12:18:24 testvm1.both.org systemd[1]: Started Deferred execution scheduler. +[root@testvm1 ~]# +``` + +这是一个我感到 systemd 比 SystemV 和旧的初始化程序更好用的原因的绝佳示例。这里的信息远比 SystemV 能够提供的丰富。`CGroup` 项包括的层级结构中,`system.slice` 是 systemd(PID 1),`atd.service` 在下一层,是 `system.slice` 的一部分。`CGroup` 项的第二行还显示了进程 ID(PID)和启动守护进程使用的命令。 + +`systemctl` 命令可以列出多个控制组项,`--all` 参数列出所有的切片,包括当前没有激活的切片: + +``` +[root@testvm1 ~]# systemctl -t slice --all + UNIT LOAD ACTIVE SUB DESCRIPTION + -.slice loaded active active Root Slice + system-getty.slice loaded active active system-getty.slice + system-lvm2\x2dpvscan.slice loaded active active system-lvm2\x2dpvscan.slice + system-modprobe.slice loaded active active system-modprobe.slice + system-sshd\x2dkeygen.slice loaded active active system-sshd\x2dkeygen.slice + system-systemd\x2dcoredump.slice loaded inactive dead system-systemd\x2dcoredump.slice + system-systemd\x2dfsck.slice loaded active active system-systemd\x2dfsck.slice + system.slice loaded active active System Slice + user-0.slice loaded active active User Slice of UID 0 + user-1000.slice loaded active active User Slice of UID 1000 + user.slice loaded active active User and Session Slice + +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. + +11 loaded units listed. +To show all installed unit files use 'systemctl list-unit-files'. +[root@testvm1 ~]# +``` + +关于这个数据,第一个需要注意的是数据显示了 UID 0(root)和 UID 1000 的用户切片,UID 1000 是我登录的用户。这里列出了组成每个切片的切片部分,而不是服务。还说明了每个用户登录时都会为其创建一个切片,这为将一个用户的所有任务作为单个控制组项进行管理提供了一种方式。 + +### 探索控制组的层次结构 + +目前为止一切顺利,但是控制组是分层的,所有的服务单元作为其中一个控制组的成员运行。要查看这个层次结构很简单,使用一个旧命令和 systemd 的一个新命令即可。 + +`ps` 命令可以用于映射进程的和其所处的控制组层次。注意使用 `ps` 命令时需要指明想要的数据列。我大幅削减了下面命令的输出数量,但是试图保留足够的数据,以便你能够对自己系统上的输出有所感受: + +``` +[root@testvm1 ~]# ps xawf -eo pid,user,cgroup,args + PID USER CGROUP COMMAND + 2 root - [kthreadd] + 3 root - \_ [rcu_gp] + 4 root - \_ [rcu_par_gp] + 6 root - \_ [kworker/0:0H-kblockd] + 9 root - \_ [mm_percpu_wq] + 10 root - \_ [ksoftirqd/0] + 11 root - \_ [rcu_sched] + 12 root - \_ [migration/0] + 13 root - \_ [cpuhp/0] + 14 root - \_ [cpuhp/1] +<删节> + 625406 root - \_ [kworker/3:0-ata_sff] + 625409 root - \_ [kworker/u8:0-events_unbound] + 1 root 0::/init.scope /usr/lib/systemd/systemd --switched-root --system --deserialize 30 + 588 root 0::/system.slice/systemd-jo /usr/lib/systemd/systemd-journald + 599 root 0::/system.slice/systemd-ud /usr/lib/systemd/systemd-udevd + 741 root 0::/system.slice/auditd.ser /sbin/auditd + 743 root 0::/system.slice/auditd.ser \_ /usr/sbin/sedispatch + 764 root 0::/system.slice/ModemManag /usr/sbin/ModemManager + 765 root 0::/system.slice/NetworkMan /usr/sbin/NetworkManager --no-daemon + 767 root 0::/system.slice/irqbalance /usr/sbin/irqbalance --foreground + 779 root 0::/system.slice/mcelog.ser /usr/sbin/mcelog --ignorenodev --daemon --foreground + 781 root 0::/system.slice/rngd.servi /sbin/rngd -f + 782 root 0::/system.slice/rsyslog.se /usr/sbin/rsyslogd -n +<删节> + 893 root 0::/system.slice/sshd.servi sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups + 1130 root 0::/user.slice/user-0.slice \_ sshd: root [priv] + 1147 root 0::/user.slice/user-0.slice | \_ sshd: root@pts/0 + 1148 root 0::/user.slice/user-0.slice | \_ -bash + 1321 root 0::/user.slice/user-0.slice | \_ screen + 1322 root 0::/user.slice/user-0.slice | \_ SCREEN + 1323 root 0::/user.slice/user-0.slice | \_ /bin/bash + 498801 root 0::/user.slice/user-0.slice | | \_ man systemd.resource-control + 498813 root 0::/user.slice/user-0.slice | | \_ less + 1351 root 0::/user.slice/user-0.slice | \_ /bin/bash + 123293 root 0::/user.slice/user-0.slice | | \_ man systemd.slice + 123305 root 0::/user.slice/user-0.slice | | \_ less + 1380 root 0::/user.slice/user-0.slice | \_ /bin/bash + 625412 root 0::/user.slice/user-0.slice | | \_ ps xawf -eo pid,user,cgroup,args + 625413 root 0::/user.slice/user-0.slice | | \_ less + 246795 root 0::/user.slice/user-0.slice | \_ /bin/bash + 625338 root 0::/user.slice/user-0.slice | \_ /usr/bin/mc -P /var/tmp/mc-root/mc.pwd.246795 + 625340 root 0::/user.slice/user-0.slice | \_ bash -rcfile .bashrc + 1218 root 0::/user.slice/user-1000.sl \_ sshd: dboth [priv] + 1233 dboth 0::/user.slice/user-1000.sl \_ sshd: dboth@pts/1 + 1235 dboth 0::/user.slice/user-1000.sl \_ -bash +<删节> + 1010 root 0::/system.slice/atd.servic /usr/sbin/atd -f + 1011 root 0::/system.slice/crond.serv /usr/sbin/crond -n + 1098 root 0::/system.slice/lxdm.servi /usr/sbin/lxdm-binary + 1106 root 0::/system.slice/lxdm.servi \_ /usr/libexec/Xorg -background none :0 vt01 -nolisten tcp -novtswitch -auth /var/run/lxdm/lxdm-:0.auth + 370621 root 0::/user.slice/user-1000.sl \_ /usr/libexec/lxdm-session + 370631 dboth 0::/user.slice/user-1000.sl \_ xfce4-session + 370841 dboth 0::/user.slice/user-1000.sl \_ /usr/bin/ssh-agent /bin/sh -c exec -l bash -c "/usr/bin/startxfce4" + 370911 dboth 0::/user.slice/user-1000.sl \_ xfwm4 --display :0.0 --sm-client-id 2dead44ab-0b4d-4101-bca4-e6771f4a8ac2 + 370930 dboth 0::/user.slice/user-1000.sl \_ xfce4-panel --display :0.0 --sm-client-id 2ce38b8ef-86fd-4189-ace5-deec1d0e0952 + 370942 dboth 0::/user.slice/user-1000.sl | \_ /usr/lib64/xfce4/panel/wrapper-2.0 /usr/lib64/xfce4/panel/plugins/libsystray.so 6 23068680 systr +ay Notification Area Area where notification icons appear + 370943 dboth 0::/user.slice/user-1000.sl | \_ /usr/lib64/xfce4/panel/wrapper-2.0 /usr/lib64/xfce4/panel/plugins/libpulseaudio-plugin.so 8 2306 +8681 pulseaudio PulseAudio Plugin Adjust the audio volume of the PulseAudio sound system + 370944 dboth 0::/user.slice/user-1000.sl | \_ /usr/lib64/xfce4/panel/wrapper-2.0 /usr/lib64/xfce4/panel/plugins/libxfce4powermanager.so 9 2306 +8682 power-manager-plugin Power Manager Plugin Display the battery levels of your devices and control the brightness of your display + 370945 dboth 0::/user.slice/user-1000.sl | \_ /usr/lib64/xfce4/panel/wrapper-2.0 /usr/lib64/xfce4/panel/plugins/libnotification-plugin.so 10 2 +3068683 notification-plugin Notification Plugin Notification plugin for the Xfce panel + 370948 dboth 0::/user.slice/user-1000.sl | \_ /usr/lib64/xfce4/panel/wrapper-2.0 /usr/lib64/xfce4/panel/plugins/libactions.so 14 23068684 acti +ons Action Buttons Log out, lock or other system actions + 370934 dboth 0::/user.slice/user-1000.sl \_ Thunar --sm-client-id 2cfc809d8-4e1d-497a-a5c5-6e4fa509c3fb --daemon + 370939 dboth 0::/user.slice/user-1000.sl \_ xfdesktop --display :0.0 --sm-client-id 299be0608-4dca-4055-b4d6-55ec6e73a324 + 370962 dboth 0::/user.slice/user-1000.sl \_ nm-applet +<删节> +``` + +你可以使用 `systemd-cgls` 命令查看整个层次结构,这个命令不需要任何的复杂参数,更加简单。 + +我也大幅缩短了这个树状结构,但是保留了足够多的输出,以便你能够了解在自己的系统上执行这个命令时应该看到的数据总量和条目类型。我在我的一个虚拟机上执行了这个命令,输出大概有 200 行;我的主要工作站的输出大概有 250 行。 + +``` +[root@testvm1 ~]# systemd-cgls +Control group /: +-.slice +├─user.slice +│ ├─user-0.slice +│ │ ├─session-1.scope +│ │ │ ├─ 1130 sshd: root [priv] +│ │ │ ├─ 1147 sshd: root@pts/0 +│ │ │ ├─ 1148 -bash +│ │ │ ├─ 1321 screen +│ │ │ ├─ 1322 SCREEN +│ │ │ ├─ 1323 /bin/bash +│ │ │ ├─ 1351 /bin/bash +│ │ │ ├─ 1380 /bin/bash +│ │ │ ├─123293 man systemd.slice +│ │ │ ├─123305 less +│ │ │ ├─246795 /bin/bash +│ │ │ ├─371371 man systemd-cgls +│ │ │ ├─371383 less +│ │ │ ├─371469 systemd-cgls +│ │ │ └─371470 less +│ │ └─user@0.service … +│ │ ├─dbus-broker.service +│ │ │ ├─1170 /usr/bin/dbus-broker-launch --scope user +│ │ │ └─1171 dbus-broker --log 4 --controller 12 --machine-id 3bccd1140fca488187f8a1439c832f07 --max-bytes 100000000000000 --max-fds 25000000000000 --max-> +│ │ ├─gvfs-daemon.service +│ │ │ └─1173 /usr/libexec/gvfsd +│ │ └─init.scope +│ │ ├─1137 /usr/lib/systemd/systemd --user +│ │ └─1138 (sd-pam) +│ └─user-1000.slice +│ ├─user@1000.service … +│ │ ├─dbus\x2d:1.2\x2dorg.xfce.Xfconf.slice +│ │ │ └─dbus-:1.2-org.xfce.Xfconf@0.service +│ │ │ └─370748 /usr/lib64/xfce4/xfconf/xfconfd +│ │ ├─dbus\x2d:1.2\x2dca.desrt.dconf.slice +│ │ │ └─dbus-:1.2-ca.desrt.dconf@0.service +│ │ │ └─371262 /usr/libexec/dconf-service +│ │ ├─dbus-broker.service +│ │ │ ├─1260 /usr/bin/dbus-broker-launch --scope user +│ │ │ └─1261 dbus-broker --log 4 --controller 11 --machine-id +<删节> +│ │ └─gvfs-mtp-volume-monitor.service +│ │ └─370987 /usr/libexec/gvfs-mtp-volume-monitor +│ ├─session-3.scope +│ │ ├─1218 sshd: dboth [priv] +│ │ ├─1233 sshd: dboth@pts/1 +│ │ └─1235 -bash +│ └─session-7.scope +│ ├─370621 /usr/libexec/lxdm-session +│ ├─370631 xfce4-session +│ ├─370805 /usr/bin/VBoxClient --clipboard +│ ├─370806 /usr/bin/VBoxClient --clipboard +│ ├─370817 /usr/bin/VBoxClient --seamless +│ ├─370818 /usr/bin/VBoxClient --seamless +│ ├─370824 /usr/bin/VBoxClient --draganddrop +│ ├─370825 /usr/bin/VBoxClient --draganddrop +│ ├─370841 /usr/bin/ssh-agent /bin/sh -c exec -l bash -c "/usr/bin/startxfce4" +│ ├─370910 /bin/gpg-agent --sh --daemon --write-env-file /home/dboth/.cache/gpg-agent-info +│ ├─370911 xfwm4 --display :0.0 --sm-client-id 2dead44ab-0b4d-4101-bca4-e6771f4a8ac2 +│ ├─370923 xfsettingsd --display :0.0 --sm-client-id 261b4a437-3029-461c-9551-68c2c42f4fef +│ ├─370930 xfce4-panel --display :0.0 --sm-client-id 2ce38b8ef-86fd-4189-ace5-deec1d0e0952 +│ ├─370934 Thunar --sm-client-id 2cfc809d8-4e1d-497a-a5c5-6e4fa509c3fb --daemon +│ ├─370939 xfdesktop --display :0.0 --sm-client-id 299be0608-4dca-4055-b4d6-55ec6e73a324 +<删节> +└─system.slice + ├─rngd.service + │ └─1650 /sbin/rngd -f + ├─irqbalance.service + │ └─1631 /usr/sbin/irqbalance --foreground + ├─fprintd.service + │ └─303383 /usr/libexec/fprintd + ├─systemd-udevd.service + │ └─956 /usr/lib/systemd/systemd-udevd +<删节> + ├─systemd-journald.service + │ └─588 /usr/lib/systemd/systemd-journald + ├─atd.service + │ └─1010 /usr/sbin/atd -f + ├─system-dbus\x2d:1.10\x2dorg.freedesktop.problems.slice + │ └─dbus-:1.10-org.freedesktop.problems@0.service + │ └─371197 /usr/sbin/abrt-dbus -t133 + ├─sshd.service + │ └─893 sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups + ├─vboxservice.service + │ └─802 /usr/sbin/VBoxService -f + ├─crond.service + │ └─1011 /usr/sbin/crond -n + ├─NetworkManager.service + │ └─765 /usr/sbin/NetworkManager --no-daemon + ├─switcheroo-control.service + │ └─787 /usr/libexec/switcheroo-control + <删节> +``` + +这个树状视图显示了所有的用户和系统切片,以及每个控制组内正在运行的服务和程序。注意叫作 `scope`(范围)的单元,它将相关的程序组成一个管理单元,在上面列出的结果中就是 `user-1000.slice`。`user-1000.slice/session-7.scope` 控制组包含了 GUI 桌面程序层次结构,以 LXDM 显示管理器会话和其所有的子任务开始,包括像 Bash 命令行解释器和 Thunar GUI 文件管理器之类的程序。 + +配置文件中不定义范围单元,而是作为启动相关程序组的结果程序化生成的。范围单元不创建或启动作为控制组的组成部分运行的进程。范围内的所有进程都是平等的,没有内部的层次结构。一个范围的生命周期在第一个进程创建时开始,在最后一个进程销毁时结束。 + +在你的桌面打开多个窗口,比如终端模拟器、LibreOffice、或者任何你想打开的,然后切换到一个可用的虚拟控制台,启动类似 `top` 或 [Midnight Commander][11] 的程序。在主机运行 `systemd-cgls` 命令,留意整体的层次结构和范围单元。 + +`systemd-cgls` 命令提供的控制组层次结构表示(以及组成控制组单元的细节),比我见过的其他任何指令都要完整。和 `ps` 命令提供的输出相比,我喜欢 `systemd-cgls` 命令更简洁的树形表示。 + +### 来自朋友们的一点帮助 + +介绍完这些基础知识后,我曾计划过深入研究控制组的更多细节,以及如何使用,但是我在 Opensource.com 的姐妹网站 [Enable Sysadmin][13] 上发现了一系列四篇优秀文章,由 Red Hat 公司的 [Steve Ovens][12] 所作。与其从头重写 Steve 的文章,我觉得倒不如通过链接到这些文章,利用他的控制组专业知识: + + 1. [一个 Linux 系统管理员对控制组的介绍][14] + 2. [如何用 CPUShares 管理控制组][15] + 3. [用更难的方式,手动管理控制组][16] + 4. [用 systemd 管理控制组][17] + +像我一样享受这些文章并从中汲取知识吧。 + +### 其他资源 + +互联网上充斥着大量关于 systemd 的信息,但大部分都简短生硬、愚钝、甚至令人误解。除了本文提到的资源,下面的网页提供了关于 systemd 启动更详细可靠的信息。自从我开始这一系列的文章来反映我所做的研究以来,这个的列表已经变长了。 + + * Fedora 项目有一个优质实用的 [systemd 指南][18],几乎有你使用 systemd 配置、管理、维护一个 Fedora 计算机需要知道的一切。 + * Fedora 项目还有一个好用的 [速查表][19],交叉引用了古老的 SystemV 命令和对应的 systemd 命令。 + * [systemd.unit(5) 手册页][20] 包含了一个不错的单元文件中各个节的列表,以及这些节的配置选项和简洁的描述。 + * Red Hat 文档包含了一个 [单元文件结构][21] 的有用描述,还有一些其他的重要信息。 + * 要获取 systemd 的详细技术信息和创立的原因,查看 Freedesktop.org 的 [systemd 描 +述][22]。这个使我发现过的最棒页面之一,因为其中包含了许多指向其他重要准确文档的链接。 + * Linux.com 上 “systemd 的更多乐趣” 提供了更高级的 systemd [信息和提示][23]。 + * 查看 [systemd.resource-control(5)][24] 的手册页 + * 查看 [_Linux 内核用户和管理员指南_][25] 中的 [控制组 v2 条目][26]。 + +还有一系列针对系统管理员的深度技术文章,由 systemd 的设计者和主要开发者 Lennart +Poettering 所作。这些文章写于 2010 年 4 月到 2011 年 9 月之间,但在当下仍然像当时一样有 +价值。关于 systemd 及其生态的许多其他优秀的作品都是基于这些文章的。 + + * [Rethinking PID 1][27] + * [systemd for Administrators, Part I][28] + * [systemd for Administrators, Part II][29] + * [systemd for Administrators, Part III][30] + * [systemd for Administrators, Part IV][31] + * [systemd for Administrators, Part V][32] + * [systemd for Administrators, Part VI][33] + * [systemd for Administrators, Part VII][34] + * [systemd for Administrators, Part VIII][35] + * [systemd for Administrators, Part IX][36] + * [systemd for Administrators, Part X][37] + * [systemd for Administrators, Part XI][38] + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/20/10/cgroups + +作者:[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/lenovo-thinkpad-laptop-concentration-focus-windows-office.png?itok=-8E2ihcF (Woman using laptop concentrating) +[2]: https://en.wikipedia.org/wiki/Top_(software) +[3]: https://opensource.com/article/19/11/monitoring-linux-glances +[4]: https://opensource.com/article/20/4/systemd +[5]: https://en.wikipedia.org/wiki/Cgroups +[6]: mailto:user@0.service +[7]: mailto:user@1000.service +[8]: mailto:1.2-org.xfce.Xfconf@0.service +[9]: mailto:1.2-ca.desrt.dconf@0.service +[10]: mailto:1.10-org.freedesktop.problems@0.service +[11]: https://midnight-commander.org/ +[12]: https://www.redhat.com/sysadmin/users/steve-ovens +[13]: https://www.redhat.com/sysadmin/ +[14]: https://www.redhat.com/sysadmin/cgroups-part-one +[15]: https://www.redhat.com/sysadmin/cgroups-part-two +[16]: https://www.redhat.com/sysadmin/cgroups-part-three +[17]: https://www.redhat.com/sysadmin/cgroups-part-four +[18]: https://docs.fedoraproject.org/en-US/quick-docs/understanding-and-administering-systemd/index.html +[19]: https://fedoraproject.org/wiki/SysVinit_to_Systemd_Cheatsheet +[20]: https://man7.org/linux/man-pages/man5/systemd.unit.5.html +[21]: https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8/html/configuring_basic_system_settings/managing-services-with-systemd_configuring-basic-system-settings#Managing_Services_with_systemd-Unit_File_Structure +[22]: https://www.freedesktop.org/wiki/Software/systemd/ +[23]: https://www.linux.com/training-tutorials/more-systemd-fun-blame-game-and-stopping-services-prejudice/ +[24]: https://man7.org/linux/man-pages/man5/systemd.resource-control.5.html +[25]: https://www.kernel.org/doc/html/latest/admin-guide/index.html +[26]: https://www.kernel.org/doc/html/latest/admin-guide/cgroup-v2.html +[27]: http://0pointer.de/blog/projects/systemd.html +[28]: http://0pointer.de/blog/projects/systemd-for-admins-1.html +[29]: http://0pointer.de/blog/projects/systemd-for-admins-2.html +[30]: http://0pointer.de/blog/projects/systemd-for-admins-3.html +[31]: http://0pointer.de/blog/projects/systemd-for-admins-4.html +[32]: http://0pointer.de/blog/projects/three-levels-of-off.html +[33]: http://0pointer.de/blog/projects/changing-roots +[34]: http://0pointer.de/blog/projects/blame-game.html +[35]: http://0pointer.de/blog/projects/the-new-configuration-files.html +[36]: http://0pointer.de/blog/projects/on-etc-sysinit.html +[37]: http://0pointer.de/blog/projects/instances.html +[38]: http://0pointer.de/blog/projects/inetd.html diff --git a/published/202110/20210104 Learn Fortran by writing a -guess the number- game.md b/published/202110/20210104 Learn Fortran by writing a -guess the number- game.md new file mode 100644 index 0000000000..a39854453d --- /dev/null +++ b/published/202110/20210104 Learn Fortran by writing a -guess the number- game.md @@ -0,0 +1,130 @@ +[#]: collector: (lujun9972) +[#]: translator: (unigeorge) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13849-1.html) +[#]: subject: (Learn Fortran by writing a "guess the number" game) +[#]: via: (https://opensource.com/article/21/1/fortran) +[#]: author: (Jim Hall https://opensource.com/users/jim-hall) + +通过写“猜数字”游戏学习 Fortran +====== + +> Fortran 是在打孔卡时代编写的语言,因此它的语法非常有限。但你仍然可以用它编写有用和有趣的程序。 + +![](https://img.linux.net.cn/data/attachment/album/202110/04/125311k6uwzpybabayyoag.jpg) + +Fortran 77 是我学习的第一门编译型编程语言。一开始时,我自学了如何在 Apple II 上用 BASIC 编写程序,后来又学会在 DOS 上用 QBasic 编写程序。但是当我去大学攻读物理学时,我又学习了 [Fortran][2]。 + +Fortran 曾经在科学计算中很常见。曾几何时,所有计算机系统都有一个 Fortran 编译器。Fortran 曾经像今天的 Python 一样无处不在。因此,如果你是像我这样的物理学专业学生,在 1990 年代工作,那你肯定学习了 Fortran。 + +我一直认为 Fortran 与 BASIC 有点相似,所以每当我需要编写一个简短程序,来分析实验室数据或执行其他一些数值分析时,我都会很快想到 Fortran。我在空闲时用 Fortran 编写了一个“猜数字”游戏,其中计算机会在 1 到 100 之间选择一个数字,并让我猜这个数字。程序会一直循环,直到我猜对了为止。 + +“猜数字”程序练习了编程语言中的几个概念:如何为变量赋值、如何编写语句以及如何执行条件判断和循环。这是学习新编程语言时一个很好的的实践案例。 + +### Fortran 编程基础 + +虽然 Fortran 这些年来一直在更新,但我最熟悉的还是 Fortran 77,这是我多年前学习的实现版本。Fortran 是程序员还在打孔卡上编程的年代创建的,因此“经典” Fortran 仅限于处理可以放在打孔卡上的数据。这意味着你只能编写符合以下限制条件的经典 Fortran 程序(LCTT 译注:后来的 Fortran 95 等版本已经对这些限制做了很大的改进,如有兴趣**建议直接学习新版**): + + * 每张卡只允许一行源代码。 + * 仅识别第 1-72 列(最后八列,73-80,保留给卡片分类器)。 + * 行号(“标签”)位于第 1-5 列。 + * 程序语句在第 7-72 列。 + * 要表示跨行,请在第 6 列中输入一个连续字符(通常是 `+`)。 + * 要创建注释行,请在第 1 列中输入 `C` 或 `*`。 + * 只有字符 `A` 到`Z`(大写字母)、`0` 到`9`(数字)和特殊字符 `= + - * / ( ) , . $ ' :` 和空格能够使用。 + +虽然有这些限制,你仍然可以编写非常有用和有趣的程序。 + +### 在 Fortran 中猜数字 + +通过编写“猜数字”游戏来探索 Fortran。这是我的实现代码: + +``` +CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC +C     PROGRAM TO GUESS A NUMBER 1-100 +CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC +      PROGRAM GUESSNUM +      INTEGER SEED, NUMBER, GUESS + +      PRINT *, 'ENTER A RANDOM NUMBER SEED' +      READ *, SEED +      CALL SRAND(SEED) + +      NUMBER = INT( RAND(0) * 100 + 1 ) + +      PRINT *, 'GUESS A NUMBER BETWEEN 1 AND 100' + 10   READ *, GUESS + +      IF (GUESS.LT.NUMBER) THEN +         PRINT *, 'TOO LOW' +      ELSE IF (GUESS.GT.NUMBER) THEN +         PRINT *, 'TOO HIGH' +      ENDIF + +      IF (GUESS.NE.NUMBER) GOTO 10 + +      PRINT *, 'THATS RIGHT!' +      END +``` + +如果你熟悉其他编程语言,你大概可以通过阅读源代码来弄清楚这个程序在做什么。前三行是注释块,表示程序的功能。第四行 `PROGRAM GUESSNUM` 将其标识为一个 程序program,并由最后一行的 `END` 语句关闭。 + +定义变量后,程序会提示用户输入随机数种子。Fortran 程序无法从操作系统初始化随机数生成器,因此你必须始终使用“种子”值和 `SRAND` 子程序subroutine 启动随机数生成器。 + +Fortran 使用 `RAND(0)` 函数生成 0 到 0.999…… 之间的随机数。参数 `0` 告诉 `RAND` 函数生成一个随机数。将此随机数乘以 100 以生成 0 到 99.999…… 之间的数字,然后加 1 得到 1 到 100.999…… 之间的值。`INT` 函数将结果截断为整数;因此,变量 `NUMBER` 就是一个介于 1 到 100 之间的随机数。 + +程序会给出提示,然后进入一个循环。Fortran 不支持更现代的编程语言中可用的 `while` 或 `do-while` 循环(LCTT 译注:Fortran 95 等新版支持,也因此在一定程度上减少了 `GOTO` 的使用)。相反,你必须使用标签(行号)和 `GOTO` 语句来构建自己的循环。这就是 `READ` 语句有一个行号的原因:你可以在循环末尾使用 `GOTO` 跳转到此标签。 + +穿孔卡片没有 `<`(小于)和 `>`(大于)符号,因此 Fortran 采用了另一种语法来进行值比较。要测试一个值是否小于另一个值,请使用 `.LT.`(小于)。要测试一个值是否大于另一个值,请使用 `.GT.`(大于)。等于和不等于分别是 `.EQ.` 和 `.NE.`。 + +在每次循环中,程序都会验证用户的猜测值。如果用户的猜测值小于随机数,程序打印 `TOO LOW`,如果猜测大于随机数,程序打印 `TOO HIGH`。循环会一直持续,直到用户的猜测值等于目标随机数为止。 + +当循环退出时,程序打印 `THATS RIGHT!` 并立即结束运行。 + +``` +$ gfortran -Wall -o guess guess.f + +$ ./guess + ENTER A RANDOM NUMBER SEED +93759 + GUESS A NUMBER BETWEEN 1 AND 100 +50 + TOO LOW +80 + TOO HIGH +60 + TOO LOW +70 + TOO LOW +75 + TOO HIGH +73 + TOO LOW +74 + THATS RIGHT! +``` + +每次运行程序时,用户都需要输入不同的随机数种子。如果你总是输入相同的种子,程序给出的随机数也会一直不变。 + +### 在其他语言中尝试 + +在学习一门新的编程语言时,这个“猜数字”游戏是一个很好的入门程序,因为它以非常简单的方式练习了几个常见的编程概念。通过用不同的编程语言实现这个简单的游戏,你可以弄清一些核心概念以及比较每种语言的细节。 + +你有最喜欢的编程语言吗?如何用你最喜欢的语言来编写“猜数字”游戏?跟随本系列文章来查看你可能感兴趣的其他编程语言示例吧。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/1/fortran + +作者:[Jim Hall][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/jim-hall +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/1980s-computer-yearbook.png?itok=eGOYEKK- (Person typing on a 1980's computer) +[2]: https://en.wikipedia.org/wiki/Fortran diff --git a/published/202110/20210607 Comparing Linux Mint and Fedora- Which One Should You Use.md b/published/202110/20210607 Comparing Linux Mint and Fedora- Which One Should You Use.md new file mode 100644 index 0000000000..a53b8aef60 --- /dev/null +++ b/published/202110/20210607 Comparing Linux Mint and Fedora- Which One Should You Use.md @@ -0,0 +1,186 @@ +[#]: subject: (Comparing Linux Mint and Fedora: Which One Should You Use?) +[#]: via: (https://itsfoss.com/linux-mint-vs-fedora/) +[#]: author: (Ankush Das https://itsfoss.com/author/ankush/) +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: ( ) +[#]: publisher: ( ) +[#]: url: ( ) + +Linux Mint 和 Fedora:应该使用哪一个? +====== + +![](https://img.linux.net.cn/data/attachment/album/202110/04/123523kzzm3x4yr2ppmfj9.jpg) + +Linux Mint 是一个 [为初学者定制的流行的 Linux 发行版][1],同时为用户提供了与 Windows 类似的体验。事实上,它有 [一些地方比 Ubuntu 做的更好][2],这使它成为每一类用户的合适选择。 + +它是基于 Ubuntu 的,完全由社区所支持。 + +另一方面,Fedora 是一个尝鲜发行版,它专注于纳入令人兴奋的变化,最终使其成为红帽企业 Linux(RHEL)的一部分。 + +与 Linux Mint 不同,Fedora 并不完全专注于个人(或非开发者)使用。即使他们提供了一个工作站版本,其目标也是开发者和有经验的 Linux 用户。 + +### Fedora 或 Mint,应该根据什么选择? + +虽然我们知道 Fedora 并不是完全面向 Linux 新手的,但许多用户喜欢使用 Fedora 作为他们的日常系统。因此,在这篇文章中,我们将阐明两者之间的一些区别,以帮助你选择一个在你的台式机上使用的操作系统。 + +#### 系统要求 & 硬件兼容性 + +![][3] + +在选择任何 Linux 发行版之前,你都应该看一下它的系统要求,并检查硬件兼容性。 + +在这方面,Linux Mint 和 Fedora 都需要至少 2GB 的内存、20GB 的磁盘空间,以及 1024 x 768 分辨率的显示器来获得入门级的体验。 + +是的,官方文件可能提到 1GB 内存就可以起步,但要看实际使用情况。除非你有一台复古的电脑,想为一个特定的目的恢复它,否则它就不在考虑范围之内。 + +![Linux Mint 资源使用情况][4] + +在技术上,两者都支持现代的和陈旧的硬件,你只有在安装时才会知道软件/驱动是否支持它。除非你有一个特殊的外围设备或具有特殊功能的硬件组件,否则硬件支持可能不是什么大问题。 + +Linux Mint 19 系列仍然提供了对 32 位系统的支持,你可以使用它到 2023 年 4 月。而 Fedora 已经不支持 32 位系统了。 + +#### 软件更新周期 + +![Linux Mint 更新管理器][5] + +Linux Mint 专注于长期发布版(LTS),支持时间为五年。它的维护方式与 Ubuntu 相同。但没有像 Ubuntu 那样提供付费的扩展支持。 + +Fedora 不提供 LTS 版本,而是每 6 个月推送一次新的更新,每个版本都会得到 13 个月的软件支持。如果你愿意,你可以跳过一个版本。 + +如果你只是想安装一个可以使用多年的 Linux 发行版,而不在乎是不是最新的技术/功能,那么 Linux Mint 是个不错的选择。 + +但是,如果你想要最新的和最伟大的 Linux 技术(在一些罕见的情况下,这也可能破坏你的计算体验),并接受适应 Fedora 推动的重大变化,Fedora 可以是一个选择。 + +#### 桌面环境的选择 + +![Linux Mint Cinnamon 版][6] + +Linux Mint 提供三种不同的 [桌面环境][7]:MATE、Cinnamon 和 Xfce。它们有相同的更新周期,并从发布之日起支持 5 年。 + +尽管 Fedora 不提供 LTS 版本,但你可以通过 Fedora spins 的形式选择各种桌面。你可以得到 KDE、LXQt、MATE、Cinnamon、LXDE,以及一个内置 i3 平铺窗口管理器的版本。 + +![Fedora 34 with GNOME 40][8] + +所以,如果你想有更多的选择,Fedora 可以是一个相当令人激动的选择。 + +#### 软件可用性 + +![Linux Mint 的软件中心和软件包管理器][9] + +Linux Mint(或 Ubuntu)的默认软件库提供了大量可以安装的软件,而 Fedora 的默认软件库只坚持提供开源软件。 + +不仅仅限于此,Linux Mint 还配备了 [Synaptic 软件包管理器][10],这是一个令人印象深刻的安装软件的轻量级工具。 + +尽管你可以 [在 Fedora 中启用第三方软件库][11],但这又是一个额外的步骤。而且,RPM Fusion 存储库可能没有 Ubuntu 的 universe 存储库那么庞大。 + +![Fedora 34 软件中心][12] + +所以,对于 Linux Mint 来说,总的来说,你可以得到更多可安装的软件包和各种安装软件的方法,开箱即用。 + +#### 使用和安装的便利性 + +对于一个 Linux 的新嫩用户来说,Ubuntu 或任何基于 Ubuntu 的发行版通常都是一个很好的开端。 + +从 [Ubuntu 的安装体验][13],到 [安装软件][14] 的简便性,同时还可以选择 LTS 版本,这让初学者觉得很方便。 + +而且,借助 Ubiquity 安装程序,Linux Mint 自然也有与 Ubuntu 相同的好处,因此,它的学习曲线最小,易于安装,易于使用。 + +虽然从表面上看 Fedora 并不复杂,但安装选项、软件包管理器以及默认存储库中缺乏的软件可能是一个耗时的因素。 + +如果你没有尝试过,我建议你试试我们的 [VirtualBox 版的 Fedora 安装指南][15]。这是一个测试安装体验的好方法,然后再在你的任何生产系统上进行尝试。 + +#### 开箱即用的体验 + +最省事的体验通常是令人愉快的选择。嗯,对大多数人来说。 + +现在,你需要明白,根据硬件配置的不同,每个用户最终可能会有不同的“开箱即用”体验。 + +但是,作为参考,让我给你举个 Fedora 和 Linux Mint 的例子。 + +考虑到我的电脑上使用的是 NVIDIA GPU,我需要安装专有的驱动程序以获得最佳性能。 + +![][16] + +而且,当我启动 Linux Mint 时,使用“驱动程序管理器”应用程序,安装驱动程序相当容易。 + +但是,对于 Fedora,即使我按照我们的 [在 Fedora 中安装 Nvidia 驱动程序][17] 的指南,我在重启时还是出现了一个错误。 + +![在 Fedora 中安装 NVIDIA 驱动程序][18] + +不仅如此,由于某些原因,我的有线网络似乎没有被激活,因此,我没有互联网连接。 + +是的,当你遇到问题时,你总是可以尝试着去排除故障,但是对于 Linux Mint,我不需要这么做。所以,根据我的经验,我会推荐 Linux Mint,它有更好的开箱体验。 + +#### 文档 + +如果你依赖于文档资源并想在这个过程中挑战自己,获得不错的学习经验,我推荐你去看看 [Fedora 的文档][19]。 + +你会发现最近和最新的 Fedora 版本的最新信息,这是件好事。 + +另一方面,[Linux Mint 的文档][20] 没有定期更新,但在你想深入挖掘时很有用。 + +#### 社区支持 + +你会得到一个良好的社区支持。[Linux Mint 的论坛][21] 是一个很基础的平台,容易使用并能解决问题。 + +[Fedora 的论坛][22] 是由 Discourse 驱动的,它是最 [流行的现代开源论坛软件][23] 之一。 + +#### 企业与社区的角度 + +Fedora 得到了最大的开源公司 [红帽][24] 的支持 —— 因此你可以得到良好的持续创新和长期的支持。 + +然而,正因为 Fedora 并不是为日常电脑用户而建立的,每一个版本的选择都可能完全影响你的用户体验。 + +另一方面,Linux Mint 完全由一个充满激情的 Linux 社区所支持,专注于使 Linux 在日常使用中更加容易和可靠。当然,它依赖于 Ubuntu 作为基础,但如果社区不喜欢上游的东西,Linux Mint 也会做出大胆的改变。 + +例如,Linux Mint 与 Ubuntu 官方发行版不同,默认情况下禁用了 snap。所以,如果你想使用它们,你就必须 [在 Linux Mint 中启用 snap][25]。 + +### 总结 + +如果你想为你的家用电脑选择一个没有问题的、易于使用的操作系统,我的建议是 Linux Mint。但是,如果你想体验最新的、最伟大的 Linux 操作系统,同时在你的 Linux 学习经历中进行一次小小的冒险,Fedora 可以是一个不错的选择。 + +虽然每个操作系统都需要某种形式的故障排除,没有什么能保证你的硬件完全不出问题,但我认为 Linux Mint 对大多数用户来说可能没有问题。 + +在任何情况下,你可以重新审视上面提到的比较点,看看什么对你的电脑最重要。 + +你怎么看?你会选择 Fedora 而不是 Mint 吗?还有,为什么?请在下面的评论中告诉我。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/linux-mint-vs-fedora/ + +作者:[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-beginners/ +[2]: https://itsfoss.com/linux-mint-vs-ubuntu/ +[3]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/05/fedora-34-about.png?resize=1020%2C709&ssl=1 +[4]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/05/linux-mint-resources.png?resize=800%2C293&ssl=1 +[5]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/05/linux-mint-update-manager.png?resize=819%2C612&ssl=1 +[6]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/05/linux-mint-cinnamon-desktop.png?resize=800%2C450&ssl=1 +[7]: https://itsfoss.com/best-linux-desktop-environments/ +[8]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/05/fedora-34-desktop.png?resize=800%2C478&ssl=1 +[9]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/05/linux-mint-software-sources.png?resize=800%2C385&ssl=1 +[10]: https://itsfoss.com/synaptic-package-manager/ +[11]: https://itsfoss.com/fedora-third-party-repos/ +[12]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/05/fedora-34-software.png?resize=1055%2C691&ssl=1 +[13]: https://itsfoss.com/install-ubuntu/ +[14]: https://itsfoss.com/remove-install-software-ubuntu/ +[15]: https://itsfoss.com/install-fedora-in-virtualbox/ +[16]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/03/linux-mint-driver-manager.jpg?resize=800%2C548&ssl=1 +[17]: https://itsfoss.com/install-nvidia-drivers-fedora/ +[18]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/05/fedora-nvidia-driver-installation.png?resize=706%2C516&ssl=1 +[19]: https://docs.fedoraproject.org/en-US/docs/ +[20]: https://linuxmint.com/documentation.php +[21]: https://forums.linuxmint.com +[22]: https://ask.fedoraproject.org +[23]: https://itsfoss.com/open-source-forum-software/ +[24]: https://www.redhat.com/en +[25]: https://itsfoss.com/enable-snap-support-linux-mint/ diff --git a/published/202110/20210616 Top 5 Chrome-like Browsers That Are Better Than Google Chrome in 2021.md b/published/202110/20210616 Top 5 Chrome-like Browsers That Are Better Than Google Chrome in 2021.md new file mode 100644 index 0000000000..ea7ebdd97e --- /dev/null +++ b/published/202110/20210616 Top 5 Chrome-like Browsers That Are Better Than Google Chrome in 2021.md @@ -0,0 +1,180 @@ +[#]: subject: (Top 5 Chrome-like Browsers That Are Better Than Google Chrome in 2021) +[#]: via: (https://news.itsfoss.com/chrome-like-browsers-2021/) +[#]: author: (Jacob Crume https://news.itsfoss.com/author/jacob/) +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13858-1.html) + +Linux 上 5 个基于 Chromium 的浏览器 +====== + +> 谷歌浏览器可能不是 Linux 用户的最佳浏览器。在这里,我们探讨了 Linux 平台的其他潜在选择。 + +![](https://i0.wp.com/news.itsfoss.com/wp-content/uploads/2021/06/chrome-alternatives-2021.png?w=1200&ssl=1) + +想摆脱谷歌?想为你的 Linux 系统寻找可能比谷歌浏览器(和类似的)更好的浏览器? + +幸运的是,有多个谷歌浏览器的替代品,你可以试试。 + +它们中的每一个都带来了一些有趣的东西,同时也保持了 Chrome 所特有的奇妙兼容性。请继续阅读,了解这些浏览器的更多信息。 + +### 比谷歌浏览器更好的选择 + +> 注:虽然 [自由和开源软件在取代科技巨头方面扮演着关键角色][1],但除了谷歌浏览器之外,Linux 上的任何选择都是一个好的开始。因此,你也会发现一些非 FOSS 的选择。 + +在我看来,Chrome 的最佳替代品是基于 Chromium 的浏览器,这意味着它们与 Chrome 共享相同的基因。这样做的好处是,它们已经拥有与 Chrome 相同的功能,同时有更多时间来增加自己的功能。 + +另外,如果你愿意,你可以了解一下不基于 Chromium 的 [Chrome 开源替代品][2]。 + +无论如何,即使谷歌浏览器的替代品对你来说并不优越,也值得尝试远离科技巨头。 + +我们收集了一些在各方面与 Chrome 相当或更好的浏览器。闲话少说,以下是我挑选的五款比 Chrome 本身更好的类似 Chrome 的浏览器: + + * UnGoogled Chromium + * Brave + * Edge + * Vivaldi + * Opera + +这份名单没有排名顺序。 + +### 1、UnGoogled Chromium + +![][13] + +特点: + + * 移除针对谷歌域名的功能 + * 在运行时阻止对 Google 的内部请求 + * 从源代码中剥离谷歌的二进制文件 + * 许多新的命令行开关和 `chrome://flags` 条目 + * 强制所有弹出式窗口为标签 + +对于那些隐私爱好者来说,[UnGoogled Chromium][4] 浏览器将是一个天赐良机。虽然它可能看起来与 Chrome 相同,但它有许多隐私方面的调整。 + +顾名思义,对于 Chrome 浏览器的用户来说,最大的倒退将是没有谷歌的服务集成。但这也意味着不再有对谷歌的内部请求、谷歌网址跟踪等等。 + +它没有吹嘘任何非凡的东西来保护你的隐私,但它应该比谷歌浏览器更好。 + +你也可以选择通过 `chrome://flags` 设置来探索和切换隐私设置。 + +总而言之,UnGoogled Chromium 提供了一种熟悉的浏览体验,同时还加入了一套隐私功能。它是可靠的,而且还与 Chrome 扩展程序庞大的生态系统兼容。 + +### 2、Brave + +![][14] + +特点: + + * 内置广告拦截器 + * 更快的页面加载时间 + * Brave 奖励计划 + * 能够在设备之间进行同步 + * 支持 Chrome Web 商店 + +当 [Brave][6] 在 2016 年首次登上舞台时,世界各地的人们都震惊于它的隐私和性能特点。在发布时,这包括了一个内置的广告屏蔽器和一个新的用户界面。 + +从那时起,该浏览器有了更多的功能,包括奖励计划和 [Tor][5] 整合。这使得它成为增长最快的浏览器之一。 + +### 3、Edge + +![][15] + +特点: + + * 支持 Chrome Web 商店 + * 儿童浏览模式(额外的保护和更简单的用户界面) + * 良好的 PDF 编辑工具 + * 内置优惠券搜索器 + * 阅读模式 + * 内置密码生成器 + +当微软 [Edge][7] 在 2015 年首次与 Windows 10 一起发布时,它因缓慢和有缺陷而被广泛批评。然而,在 2020 年初,它使用 Chromium Web 引擎完全重新制作了。 + +这也是 Chrome 浏览器所基于的引擎,这提供了现代和快速的浏览体验。这种转变的一个好处是 Web 浏览器能够在许多不同的平台上运行,从 Windows 7 和 macOS 到 Ubuntu 和其他基于 Linux 的发行版。 + +我知道,如果你因为某些原因讨厌微软,这可能不会吸引你 —— 但 Linux 版的微软 Edge 是谷歌 Chrome 浏览器的一个重要替代品。 + +### 4、Vivaldi + +![][16] + +特点: + + * 内置翻译器 + * Vivaldi Email(Beta) + * Feed 阅读器(Beta) + * Vivaldi 日历(Beta) + * 可高度定制的用户界面 + * 内置广告拦截器 + * 支持 Chrome Web 商店 + * 标签分组 + * 分屏标签 + +[Vivaldi][11] 于 2016 年首次发布,它在浏览器大战中迅速崛起。它最初是为对 [Presto][8] [布局引擎][9] 过渡不满的 Opera 用户设计的,它已经成功地重新实现了 Opera 过渡到 Chromium 期间失去的许多功能。 + +令人惊讶的是,它在基于 Chromium 的情况下还能做到这一点(正是 Opera 放弃这些功能的原因)。 + +最新的 [Vivaldi 4.0 版本][10] 也为高级用户提供了一些功能。 + +虽然它不是 100% 的自由软件,但其 93% 的源代码是可用的,只有用户界面是专有的。考虑到 Vivaldi 的开发团队积极关注着 Linux 用户的改进,Vivaldi 提供了大量的功能,这可能是一个值得权衡的结果。 + +### 5、Opera + +![][17] + +特点: + + * 内置虚拟专用网络 + * 轻松访问社交媒体 + * 内置加密货币钱包 + * 欺诈和恶意软件保护 + * 高度可见的网站安全徽章 + +虽然 [Opera][12] 从未成为 Web 浏览器之王,但它一直存在于关于使用何种浏览器的争论中。它最初是基于其内部的 Presto 布局引擎的,在 2013 年切换到 Chromium。 + +不幸的是,这一转换意味着 Opera 团队被迫放弃了其最知名的一些功能,为 Vivaldi 和 Firefox 等替代品填补 Opera 留下的空间铺平道路。 + +这并不是说 Opera 缺乏功能,它包含了许多功能。 + +### 总结 + +在这里,我们列出了为 Linux 桌面平台上用户量身定做的浏览器。 + +无论你是想要更多的功能、更好的用户界面,还是想要帮助你摆脱谷歌的束缚,都有一个选择适合你。 + +由于所有这些浏览器都是基于 Chromium 的,它们都能像 Chrome 一样提供良好的兼容性和用户体验。因此,请切换到这些类似 Chrome 的浏览器中,享受它们各自赋予的自由吧。 + +2021 年,你最喜欢的 Linux 上谷歌浏览器的替代品是什么?请在下面的评论中告诉我。 + +-------------------------------------------------------------------------------- + +via: https://news.itsfoss.com/chrome-like-browsers-2021/ + +作者:[Jacob Crume][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://news.itsfoss.com/author/jacob/ +[b]: https://github.com/lujun9972 +[1]: https://news.itsfoss.com/save-privacy-with-foss/ +[2]: https://itsfoss.com/open-source-browsers-linux/ +[4]: https://github.com/Eloston/ungoogled-chromium +[5]: https://itsfoss.com/tor-guide/ +[6]: https://brave.com +[7]: https://www.microsoftedgeinsider.com/en-us/download +[8]: https://en.wikipedia.org/wiki/Presto_(browser_engine) +[9]: https://en.wikipedia.org/wiki/Browser_engine +[10]: https://news.itsfoss.com/vivaldi-4-0-release/ +[11]: https://vivaldi.com +[12]: https://www.opera.com +[13]: https://i2.wp.com/news.itsfoss.com/wp-content/uploads/2021/05/ungoogled-chromium-screenshot.png?w=1366&ssl=1 +[14]: https://i1.wp.com/news.itsfoss.com/wp-content/uploads/2021/06/brave-homepage.png?w=1366&ssl=1 +[15]: https://i0.wp.com/news.itsfoss.com/wp-content/uploads/2021/06/edge-homepage.png?w=1366&ssl=1 +[16]: https://i0.wp.com/news.itsfoss.com/wp-content/uploads/2021/06/vivaldi-4.0-homepage.png?w=1366&ssl=1 +[17]: https://i1.wp.com/news.itsfoss.com/wp-content/uploads/2021/06/opera-homepage.png?w=1366&ssl=1 \ No newline at end of file diff --git a/published/202110/20210702 Creating a PKGBUILD to Make Packages for Arch Linux.md b/published/202110/20210702 Creating a PKGBUILD to Make Packages for Arch Linux.md new file mode 100644 index 0000000000..1303a2a5ee --- /dev/null +++ b/published/202110/20210702 Creating a PKGBUILD to Make Packages for Arch Linux.md @@ -0,0 +1,263 @@ +[#]: subject: (Creating a PKGBUILD to Make Packages for Arch Linux) +[#]: via: (https://itsfoss.com/create-pkgbuild/) +[#]: author: (Hunter Wittenborn https://itsfoss.com/author/hunter/) +[#]: collector: (lujun9972) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13843-1.html) + +Arch Linux 软件包制作入门 +====== + +![](https://img.linux.net.cn/data/attachment/album/202110/02/130702ybexb5tsvkx1xbs1.jpg) + +`PKGBUILD` 文件是为 Arch Linux 及其衍生版(如 Manjaro)构建和创建软件包的方式。 + +如果你曾经使用过 [AUR][1](即 Arch Linux 的用户维护的 `PKGBUILD` 存储库),你甚至可能也遇到过它们。 + +但是,到底是如何从 `PKGBUILD` 到可安装软件包的呢?这两者之间到底发生了什么,如何把自己的软件制作成软件包呢?你将在这篇文章中了解这些。 + +### PKGBUILD 基础知识 + +对于那些熟悉 Bash 或其他 shell 的人来说,你可能知道,`PKGBUILD` 就是一个带有一些变量的 shell 脚本。 + +`PKGBUILD` 文件由变量和函数组成,所有这些都是用来定义软件包本身,以及如何构建它。 + +为了从 `PKGBUILD` 中创建一个软件包,需要使用 `makepkg` 命令行工具。在获得 `PKGBUILD` 文件后,你只需在包含 `PKGBUILD` 的目录中运行 `makepkg',就可以得到一个可安装的软件包了。 + +![][2] + +在本教程中,你将会看到我刚刚制作的软件包,它在运行时打印出 “Hello World!”。 + +![][3] + +### 准备 + +为了继续学习本教程,你需要创建几个文件。 + +首先,你需要创建一个名为 `PKGBUILD` 的文件,它将作为构建你的软件包的“配方”。 + +你需要做的另一个文件是一个叫 `hello-world.sh` 的文件。我稍后会解释它的用途。 + +你也可以用一个命令来创建这两个文件: + +``` +touch PKGBUILD hello-world.sh +``` + +你可以用 `ls` 命令检查这些文件是否被创建。 + +![][4] + +然后你就可以开始了! + +### 设置你的 PKGBUILD 文件 + +我不会让你复制粘贴整个文件,而是和你一起键入每一行,这样你就能更好地理解每一行的目的。如果你不喜欢这种学习方式,我强烈推荐 [Arch 维基][5] 中为 Arch Linux 创建软件包的文章。 + +这篇文章也没有介绍 `PKGBUILD` 中可以设置的每一个选项,只是介绍了一些常用的选项,以便你能尽快上手。 + +说完了这些,打开你的文本编辑器,让我们直接进入正题吧。 + +#### pkgname + +首先是 `pkgname` 变量。这是安装时定义软件包名称的东西,也是 [Arch Linux 的软件包管理器 pacman][6] 跟踪软件包的方式。 + +这个变量(以及其他一些变量)的格式是 `variable=value`,变量名在左边,变量的值在右边,用等号隔开。 + +要设置包的名称,请在 `PKGBUILD` 中输入以下内容: + +``` +pkgname="hello-world" +``` + + * 要设置一个不同的软件包名称,用你的软件包的名称替换 `hello-world`。 + * 这并不设置用于运行程序的命令,这将在下面的 `package()` 部分中处理。 + +#### pkgver + +正如变量名称本身所述,它设置了你的软件包的版本(即 `1.0.0`)。这在用户更新他们的系统时很有用,因为设置更高的版本会提示用户升级。 + +要设置版本号,请在 `PKGBUILD` 中输入以下内容(在前一行之后): + +``` +pkgver="1.0.0" +``` + +#### pkgrel + +这与 `pkgver` 变量有关,通常不需要知道。不过和 `pkgver` 变量一样,如果它被换到一个更高的数字,就将通知用户进行升级。 + +它适用于任何需要保持 `pkgver` 不变的情况下,例如 `PKGBUILD` 本身发生了变化。如果你为一个你使用的程序创建了一个 `PKGBUILD`(并希望保持软件包的版本相同),而你需要修复 `PKGBUILD` 本身的一个错误,这将是非常有用的。 + +要设置这个变量,请在 `PKGBUILD` 中输入以下内容: + +``` +pkgver="1" +``` + +这个变量应该 **总是** 从 `1` 开始,然后一次一次地向上移动。当 `pkgver` 本身向上移动时,这个变量可以(也应该)重置为 `1`,因为 `pkgver` 本身会通知用户升级。 + +#### pkgdesc + +这将设置软件包的描述,用于帮助更好地识别该软件包。 + +要设置它,只需将描述放在引号内: + +``` +pkgdesc="Hello world in your terminal!" +``` + +#### arch + +这个变量设置软件包所兼容的 [硬件架构][7]。如果你不明白什么是架构,那也没关系,因为在大多数情况下,这个变量几乎是无用的。 + +无论如何,`makepkg` 仍然需要设置它,这样它就知道这个软件包与我们的系统是兼容的。 + +这个变量支持设置多个值,所以 `makepkg` 需要一个不同的语法,如下所示。 + +要设置它,请在 `PKGBUILD` 中输入以下内容: + +``` +arch=("x86_64") +``` + +如果你要设置多个值,需要用空格和引号分隔每个值,像这样。`arch=(“x86_x64" "arm")`。 + +#### depends + +这列出了提供了我们的软件包所需功能的所有软件包。与 `arch` 一样,它也可以包含多个值,因此必须使用括号语法。 + +由于我们的软件包没有任何依赖关系,所以我们不需要在 `PKGBUILD` 中输入这个字段。然而,如果我们的软件包有依赖关系,我们就会使用与 `arch` 相同的语法。 + +#### optdepends + +这里列出了那些并不是提供所需功能而是额外功能的软件包。 + +这与 `depends` 的语法相同。 + +#### conflicts + +这告诉 `pacman` 哪些软件包会导致我们的软件包出现问题,或者以我们不希望的方式行事。 + +这里列出的任何软件包都会在我们的软件包被安装之前被卸载。 + +这与 `depends` 的语法相同。 + +#### license + +这定义了你的程序所采用的 [软件许可证][8]。如果你需要帮助你选择一个许可证,[Arch 维基][9] 提供了一些信息。如果你不知道该怎么设置,将其设置为 `custom` 也可以。 + +这与 `arch` 和 `depends` 的语法相同: + +``` +license=("custom") +``` + +#### source + +这就是 `makepkg` 如何知道要用什么文件来构建我们的软件包。它可以包含各种不同类型的源,包括本地文件和 URL。 + +在添加本地文件时,要输入相对于 `PKGBUILD` 文件的文件路径,比如以下目录布局: + +``` +PKGBUILD +file.txt +src/file.sh +``` + +如果你想在我们的 `PKGBUILD` 中包括 `file.sh`,你需要输入 `src/file.sh` 作为其名称。 + +当输入 URL 时,你只需输入完整的 URL,即 `https://mirrors.creativecommons.org/presskit/logos/cc.logo.large.png`。 + +你的这个软件包只需要 `hello-world.sh` 文件,由于它和 `PKGBUILD` 在同一个目录中,你只需输入它的名字作为 `source` 的值。 + +这个变量也使用与 `arch` 和 `depends` 相同的语法: + +``` +source=("hello-world.sh") +``` + +#### sha512sums + +这是用来验证 `source` 中的文件没有被修改或下载错误。如何获得这个值的信息可以在 [Arch 维基关于 PKGBUILD 的文章][10] 中找到。 + +如果你宁愿不设置这个(或者你只是不需要,例如对于本地文件),你可以为 `source` 变量中的每个文件输入 `SKIP`: + +``` +sha512sums=("SKIP") +``` + +#### package() + +这是最后一个,也是实际制作我们的包的最重要的部分。在处理这个问题时,知道两个变量很重要。 + + * `${srcdir}`:这是 `makepkg` 放置 `source` 变量中文件的地方。在这个目录中,你可以与这些文件进行交互,并对文件进行任何其他需要的修改。 + * `${pkgdir}`:这是我们放置将被安装在系统中的文件的地方。 +`${pkgdir}` 的文件夹结构是按照实际系统中的情况设置的(例如,使用 `pacman` 安装时,`${pkgdir}/usr/bin/hello-world` 会创建文件 `/usr/bin/hello-world`)。 + +`package()` 包含一个用于创建软件包的命令列表。 + +因此,如果(假设)你需要有个在 `/usr/share/motto.txt` 写着 “Linux is superior to Windows ”的文件,你会运行这样的东西: + +``` +package() { + mkdir -p "${pkgdir}/usr/share" + echo "Linux is superior to Windows" | tee "${pkgdir}/usr/share/motto.txt" +} +``` + +关于上述命令的一些说明: + + * `${pkgdir}` 里面最初是 **不包含** 目录的。如果你跳过了 [mkdir 命令][11],`tee` 会输出一个错误,说这个目录不存在。 + * 在指定目录时,**总是** 在它们前面加上 `${pkgdir}` 或 `${srcdir}` 变量。如果输入 `/usr/share/motto.txt`,就会按照字面意义指向你当前运行的系统中的 `/usr/share/motto.txt`。 + +对于你的 `PKGBUILD`,你将把 `hello-world.sh` 文件放在目标系统的 `/usr/bin/hello-world` 中。你还将使该文件在运行时说 “Hello to you!”。 + +要做到这一点,请在 `PKGBUILD` 中输入以下内容: + +``` +package() { + echo 'Hello to you!' > "${srcdir}/hello-world.sh" + mkdir -p "${pkgdir}/usr/bin" + cp "${srcdir}/hello-world.sh" "${pkgdir}/usr/bin/hello-world" + chmod +x "${pkgdir}/usr/bin/hello-world" +} +``` + +然后就完成了!用 `makepkg -si` 构建和安装软件包,然后在终端运行 `hello-world`,查看其输出。 + +![][12] + +### 总结 + +就这样,你已经制作了你的第一个 `PKGBUILD`!你走在了为自己甚至是为 AUR 制作实际的软件包的路上。 + +有什么问题,或者有什么地方不对吗?请随时在下面的评论区发表。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/create-pkgbuild/ + +作者:[Hunter Wittenborn][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/hunter/ +[b]: https://github.com/lujun9972 +[1]: https://itsfoss.com/aur-arch-linux/ +[2]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/05/image.png?resize=748%2C689&ssl=1 +[3]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/05/image-2.png?resize=682%2C260&ssl=1 +[4]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/05/image-3.png?resize=682%2C265&ssl=1 +[5]: https://wiki.archlinux.org/title/Creating_packages +[6]: https://itsfoss.com/pacman-command/ +[7]: https://www.quora.com/What-is-CPU-architecture +[8]: https://en.wikipedia.org/wiki/Software_license +[9]: https://wiki.archlinux.org/title/PKGBUILD#license +[10]: https://wiki.archlinux.org/title/PKGBUILD#Integrity +[11]: https://linuxhandbook.com/mkdir-command/ +[12]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/06/image-1.png?resize=561%2C281&ssl=1 diff --git a/sources/tech/20210721 Run GitHub Actions on Fedora CoreOS.md b/published/202110/20210721 Run GitHub Actions on Fedora CoreOS.md similarity index 57% rename from sources/tech/20210721 Run GitHub Actions on Fedora CoreOS.md rename to published/202110/20210721 Run GitHub Actions on Fedora CoreOS.md index c4b80e2b99..0a6ce8b4b6 100644 --- a/sources/tech/20210721 Run GitHub Actions on Fedora CoreOS.md +++ b/published/202110/20210721 Run GitHub Actions on Fedora CoreOS.md @@ -2,31 +2,29 @@ [#]: via: (https://fedoramagazine.org/run-github-actions-on-fedora-coreos/) [#]: author: (Clément Verna https://fedoramagazine.org/author/cverna/) [#]: collector: (lujun9972) -[#]: translator: ( ) -[#]: reviewer: ( ) -[#]: publisher: ( ) -[#]: url: ( ) +[#]: translator: (wxy) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13846-1.html) -Run GitHub Actions on Fedora CoreOS +在 Fedora CoreOS 上运行 GitHub Actions ====== ![][1] -[United Artists][2], Public domain, via Wikimedia Commons +[GitHub Actions][3] 是一项为快速建立持续集成和交付(CI/CD)工作流程而提供的服务。这些工作流程在被称为“运行器runner”的主机上运行。GitHub 提供的 [托管运行器][4] 的操作系统的选择是有限的(Windows Server、Ubuntu、MacOS)。 -[GitHub Actions][3] is a service provided to quickly setup continuous integration and delivery (CI/CD) workflows . These workflows run on hosts called _runners_. GitHub provides [hosted runners][4] with a limited set of operating system choice (Windows Server, Ubuntu, MacOS). +另一个选择是使用 [自托管][5] 的运行器,这让仓库管理员对运行器有更多控制。自托管的运行程序是专门为某个存储库或组织服务的。下面的文章介绍了使用 Fedora CoreOS 配置自托管运行程序的步骤。 -Another option is to use [self-hosted][5] runners which gives the repository administrator more control on the runners. Self-hosted runners are dedicated to a repository or organization. The following article goes through the steps of configuring self-hosted runners using Fedora CoreOS. +### 入门 -### Getting Started +Fedora CoreOS 是一个精简的操作系统,旨在便于大规模的部署和维护。该操作系统会自动更新,并默认提供运行容器所需的工具。由于这些原因,Fedora CoreOS 是运行 CI/CD 工作流程的一个极佳选择。 -Fedora CoreOS is a minimalist operating system designed to be easy to deploy and maintain at scale. The operating system will automaticaly update and provide, by default, the tools needed to run containers. For all of these reasons, Fedora CoreOS is a great choice to consider for running CI/CD workflows. +配置和配备 Fedora CoreOS 机器的第一步是生成一个 [Ignition][6] 文件。[Butane][7] 允许你使用更友好的格式(YAML)生成 Ignition 文件。 -The first step to configure and provision a Fedora CoreOS machine is to generate an [Ignition][6] file. [Butane][7] allows you to generate Ignition’s file using a friendlier format (YAML). +#### 配置一个 Fedora CoreOS 运行器 -#### Configure a Fedora CoreOS runner - -To execute GitHub actions on Fedora CoreOS, the host needs the binaries and scripts used to register and run the runner. Download the binaries and scripts from the [actions runner project][8] and deploy under _/usr/local/sbin/actions-runner_. +要在 Fedora CoreOS 上执行 GitHub Actions,托管主机需要用于注册和运行该运行器的二进制文件和脚本。从 [Actions 运行器项目][8] 下载二进制文件和脚本,并部署在 `/usr/local/sbin/actions-runner` 下。 ``` version: "1.3.0" @@ -51,13 +49,13 @@ storage: name: core ``` -#### Registration and Removal token +#### 注册和删除令牌 -Configuring runners for a project requires a “token”. This prevents registering or removing self-hosted runners from projects without the correct permissions. Tokens provided by Github have a one hour expiration time. If the runner restarts after this time it will require a new registration token. +为一个项目配置运行器需要一个“令牌token”。这可以防止在没有正确权限的情况下从项目中注册或删除自托管的运行器。GitHub 提供的令牌有一个小时的过期时间。如果运行器在这个时间之后重新启动,它将需要一个新的注册令牌。 -The token can be problematic, in particular with Fedora CoreOS automatic updates. The update process expects that the host will restart at least once every couple weeks after receiving new data. +该令牌可能出问题,特别是在 Fedora CoreOS 自动更新时。更新过程希望托管主机在收到新数据后至少每隔几周重启一次。 -Luckily, it is possible to use GitHub REST API to obtain these tokens and automatically configure the runner every time the host restarts. The following _manage-runner.sh_ script uses the APIs to retrieve a token, remove any runner already configured and register the runner with a new token. +幸运的是,可以使用 GitHub REST API 来获取这些令牌,并在托管主机每次重启时自动配置运行器。下面的 `manage-runner.sh` 脚本使用 API 来获取令牌,删除任何已经配置好的运行器,并用新的令牌注册运行器。 ``` #!/bin/bash @@ -75,7 +73,7 @@ REGISTRATION_TOKEN=$(curl -u ${GITHUB_USER}:${GITHUB_TOKEN} -X POST -H "Accept: /usr/local/sbin/actions-runner/config.sh --url https://github.com/cverna/fcos-actions-runner --token ${REGISTRATION_TOKEN} --labels fcos --unattended ``` -The script above uses a few environment variables that contain a GitHub username and a [Personal Access Token][9] used to authenticate the REST API requests. The Personal Access Token requires the repo permissions in order to successfully retrieve the runner registration and removal tokens. The token is security sensitive so it is better to store it in a different file with stricter permissions. In this example that file is _actions-runner_. +上面的脚本使用了一些环境变量,包含 GitHub 用户名和用于验证 REST API 请求的 [个人访问令牌][9]Personal Access Token。个人访问令牌需要存储库权限,以便成功检索运行器的注册和移除令牌。该令牌是安全敏感信息,所以最好将其存储在一个具有更严格权限的不同文件中。在这个例子中,这个文件是 `actions-runner`。 ``` GITHUB_USER= @@ -83,7 +81,7 @@ GITHUB_REPO= GITHUB_TOKEN= ``` -Following is the Butane snippet that creates these two files – _manage-runner.sh_ and _actions-runner_. +以下是创建这两个文件 `manage-runner.sh` 和 `actions-runner` 的 Butane 片段。 ``` - path: /usr/local/sbin/actions-runner/manage-runner.sh @@ -104,9 +102,9 @@ Following is the Butane snippet that creates these two files – _manage-runner. name: core ``` -### Running Actions on Fedora CoreOS +### 在 Fedora CoreOS 上运行 Actions -Finally, create the systemd services that will configure and start the runner. Define the services in the Butane configuration file. +最后,创建用于配置和启动运行器的 systemd 服务。在 Butane 配置文件中定义这些服务。 ``` systemd: @@ -142,21 +140,19 @@ systemd: WantedBy=multi-user.target ``` -This creates two services, _github-runner-configure.service_ (running once when the host has finished booting) and _github-runner.service_ (running the Actions runner binaries and waiting for new CI/CD jobs). +这将创建两个服务:`github-runner-configure.service`(在主机启动完成后运行一次)和 `github-runner.service`(运行 Actions 运行器二进制文件并等待新的 CI/CD 作业)。 -Now that the Butane configuration is complete, generate an Ignition file out of it and provision a Fedora CoreOS Actions runner. +现在 Butane 配置已经完成,从中生成一个 Ignition 文件并配备一个 Fedora CoreOS Actions 运行器。 ``` $ podman run -i --rm -v $PWD:/code:z --workdir /code quay.io/coreos/butane:release --pretty --strict --files-dir /code config.yaml -o config.ignition ``` -Once the Ignition file is generated, it can be used to provision a runner on the platforms where Fedora CoreOS is [available][10]. +一旦 Ignition 文件生成,它就可以用来在 [支持][10] Fedora CoreOS 的平台上配备一个运行器。 -> [Getting started with Fedora CoreOS][11] +### 配置一个 Action 来使用一个自托管的运行器 -### Configure an Action to use a self-hosted runner - -The following test Action workflow will test the FCOS self-hosted worker. Create the following file in your git repository _.github/workflows/main.yml_ +下面的测试 Action 工作流程将测试 FCOS 的自托管的运行器。在你的 git 存储库中创建以下文件 `.github/workflows/main.yml`。 ``` # This is a basic workflow to help you get started with Actions @@ -188,9 +184,9 @@ jobs: run: podman run --rm fedora-minimal:34 echo Hello World ! ``` -Note that the _runs-on_ configuration is set up to use a runner with the label _fcos_. +请注意,`runs-on` 的配置被设置为使用标签为 `fcos` 的运行器。 -The code presented in this article is available [here][12]. +本文介绍的代码可以在 [这里][12] 中找到。 -------------------------------------------------------------------------------- @@ -198,8 +194,8 @@ via: https://fedoramagazine.org/run-github-actions-on-fedora-coreos/ 作者:[Clément Verna][a] 选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) +译者:[wxy](https://github.com/wxy) +校对:[wxy](https://github.com/wxy) 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 diff --git a/published/202110/20210728 Kernel tracing with trace-cmd.md b/published/202110/20210728 Kernel tracing with trace-cmd.md new file mode 100644 index 0000000000..1b4f6dfc9f --- /dev/null +++ b/published/202110/20210728 Kernel tracing with trace-cmd.md @@ -0,0 +1,354 @@ +[#]: subject: (Kernel tracing with trace-cmd) +[#]: via: (https://opensource.com/article/21/7/linux-kernel-trace-cmd) +[#]: author: (Gaurav Kamathe https://opensource.com/users/gkamathe) +[#]: collector: (lujun9972) +[#]: translator: (mengxinayan) +[#]: reviewer: (wxy) +[#]: publisher: (wxy) +[#]: url: (https://linux.cn/article-13852-1.html) + +使用 trace-cmd 追踪内核 +====== + +> trace-cmd 是一个易于使用,且特性众多、可用来追踪内核函数的命令。 + +![](https://img.linux.net.cn/data/attachment/album/202110/05/145818d2i9tgjetzj8itqg.jpg) + +在 [之前的文章][2] 里,我介绍了如何利用 `ftrace` 来追踪内核函数。通过写入和读出文件来使用 `ftrace` 会变得很枯燥,所以我对它做了一个封装来运行带有选项的命令,以启用和禁用追踪、设置过滤器、查看输出、清除输出等等。 + +[trace-cmd][3] 命令是一个可以帮助你做到这一点的工具。在这篇文章中,我使用 `trace-cmd` 来执行我在 `ftrace` 文章中所做的相同任务。由于会经常参考那篇文章,建议在阅读这篇文章之前先阅读它。 + +### 安装 trace-cmd + +本文中所有的命令都运行在 root 用户下。 + +因为 `ftrace` 机制被内置于内核中,因此你可以使用下面的命令进行验证它是否启用: + +``` +# mount | grep tracefs +none on /sys/kernel/tracing type tracefs (rw,relatime,seclabel) +``` + +不过,你需要手动尝试安装 `trace-cmd` 命令: + +``` +# dnf install trace-cmd -y +``` + +### 列出可用的追踪器 + +当使用 `ftrace` 时,你必须查看文件的内容以了解有哪些追踪器可用。但使用 `trace-cmd`,你可以通过以下方式获得这些信息: + +``` +# trace-cmd list -t +hwlat blk mmiotrace function_graph wakeup_dl wakeup_rt wakeup function nop +``` + +### 启用函数追踪器 + +在我 [之前的文章][2] 中,我使用了两个追踪器,在这里我也会这么做。用 `function` 启用你的第一个追踪器: + +``` +$ trace-cmd start -p function +  plugin 'function' +``` + +### 查看追踪输出 + +一旦追踪器被启用,你可以通过使用 `show` 参数来查看输出。这只显示了前 20 行以保持例子的简短(见我之前的文章对输出的解释): + +``` +# trace-cmd show | head -20 +## tracer: function +# +# entries-in-buffer/entries-written: 410142/3380032 #P:8 +# +# _-----=> irqs-off +# / _----=> need-resched +# | / _---=> hardirq/softirq +# || / _--=> preempt-depth +# ||| / delay +# TASK-PID CPU# |||| TIMESTAMP FUNCTION +# | | | |||| | | + gdbus-2606 [004] ..s. 10520.538759: __msecs_to_jiffies <-rebalance_domains + gdbus-2606 [004] ..s. 10520.538760: load_balance <-rebalance_domains + gdbus-2606 [004] ..s. 10520.538761: idle_cpu <-load_balance + gdbus-2606 [004] ..s. 10520.538762: group_balance_cpu <-load_balance + gdbus-2606 [004] ..s. 10520.538762: find_busiest_group <-load_balance + gdbus-2606 [004] ..s. 10520.538763: update_group_capacity <-update_sd_lb_stats.constprop.0 + gdbus-2606 [004] ..s. 10520.538763: __msecs_to_jiffies <-update_group_capacity + gdbus-2606 [004] ..s. 10520.538765: idle_cpu <-update_sd_lb_stats.constprop.0 + gdbus-2606 [004] ..s. 10520.538766: __msecs_to_jiffies <-rebalance_domains +``` + +### 停止追踪并清除缓冲区 + +追踪将会在后台继续运行,你可以继续用 `show` 查看输出。 + +要停止追踪,请运行带有 `stop` 参数的 `trace-cmd` 命令: + +``` +# trace-cmd stop +``` + +要清除缓冲区,用 `clear` 参数运行它: + +``` +# trace-cmd clear +``` + +### 启用函数调用图追踪器 + +运行第二个追踪器,通过 `function_graph` 参数来启用它。 + +``` +# trace-cmd start -p function_graph + Plugin 'function_graph' +``` + +再次使用 `show` 参数查看输出。正如预期的那样,输出与第一次追踪输出略有不同。这一次,它包括一个**函数调用**链: + +``` +# trace-cmd show | head -20 +## tracer: function_graph +# +# CPU DURATION FUNCTION CALLS +# | | | | | | | + 4) 0.079 us | } /* rcu_all_qs */ + 4) 0.327 us | } /* __cond_resched */ + 4) 0.081 us | rcu_read_unlock_strict(); + 4) | __cond_resched() { + 4) 0.078 us | rcu_all_qs(); + 4) 0.243 us | } + 4) 0.080 us | rcu_read_unlock_strict(); + 4) | __cond_resched() { + 4) 0.078 us | rcu_all_qs(); + 4) 0.241 us | } + 4) 0.080 us | rcu_read_unlock_strict(); + 4) | __cond_resched() { + 4) 0.079 us | rcu_all_qs(); + 4) 0.235 us | } + 4) 0.095 us | rcu_read_unlock_strict(); + 4) | __cond_resched() { +``` + +使用 `stop` 和 `clear` 命令来停止追踪和清除缓存区: + +``` +# trace-cmd stop +# trace-cmd clear +``` + +### 调整追踪以增加深度 + +如果你想在函数调用中看到更多的深度,你可以对追踪器进行调整: + +``` +# trace-cmd start -p function_graph --max-graph-depth 5 + plugin 'function_graph' +``` + +现在,当你将这个输出与你之前看到的进行比较时,你应该看到更多的嵌套函数调用: + +``` +# trace-cmd show | head -20 +## tracer: function_graph +# +# CPU DURATION FUNCTION CALLS +# | | | | | | | + 6) | __fget_light() { + 6) 0.804 us | __fget_files(); + 6) 2.708 us | } + 6) 3.650 us | } /* __fdget */ + 6) 0.547 us | eventfd_poll(); + 6) 0.535 us | fput(); + 6) | __fdget() { + 6) | __fget_light() { + 6) 0.946 us | __fget_files(); + 6) 1.895 us | } + 6) 2.849 us | } + 6) | sock_poll() { + 6) 0.651 us | unix_poll(); + 6) 1.905 us | } + 6) 0.475 us | fput(); + 6) | __fdget() { +``` + +### 了解可被追踪的函数 + +如果你想只追踪某些函数而忽略其他的,你需要知道确切的函数名称。你可以用 `list -f` 参数来得到它们。例如搜索常见的内核函数 `kmalloc`,它被用来在内核中分配内存: + +``` +# trace-cmd list -f | grep kmalloc +bpf_map_kmalloc_node +mempool_kmalloc +__traceiter_kmalloc +__traceiter_kmalloc_node +kmalloc_slab +kmalloc_order +kmalloc_order_trace +kmalloc_large_node +__kmalloc +__kmalloc_track_caller +__kmalloc_node +__kmalloc_node_track_caller +[...] +``` + +下面是我的测试系统中可被追踪的函数总数: + +``` +# trace-cmd list -f | wc -l +63165 +``` + +### 追踪内核模块相关的函数 + +你也可以追踪与特定内核模块相关的函数。假设你想追踪 `kvm` 内核模块相关的功能,你可以通过以下方式来实现。请确保该模块已经加载: + +``` +# lsmod | grep kvm_intel +kvm_intel 335872 0 +kvm 987136 1 kvm_intel +``` + +再次运行 `trace-cmd`,使用 `list` 参数,并从输出结果中,`grep` 查找以 `]` 结尾的行。这将过滤掉内核模块。然后 `grep` 内核模块 `kvm_intel` ,你应该看到所有与该内核模块有关的函数。 + +``` +# trace-cmd list -f | grep ]$ | grep kvm_intel +vmx_can_emulate_instruction [kvm_intel] +vmx_update_emulated_instruction [kvm_intel] +vmx_setup_uret_msr [kvm_intel] +vmx_set_identity_map_addr [kvm_intel] +handle_machine_check [kvm_intel] +handle_triple_fault [kvm_intel] +vmx_patch_hypercall [kvm_intel] + +[...] + +vmx_dump_dtsel [kvm_intel] +vmx_dump_sel [kvm_intel] +``` + +### 追踪特定函数 + +现在你知道了如何找到感兴趣的函数,请用一个例子把这些内容用于时间。就像前面的文章一样,试着追踪与文件系统相关的函数。我的测试系统上的文件系统是 `ext4`。 + +这个过程略有不同;你在运行命令时,不使用 `start` 参数,而是在 `record` 参数后面加上你想追踪的函数的“模式”。你还需要指定你想要的追踪器;在这种情况下,就是 `function_graph`。该命令会继续记录追踪,直到你用 `Ctrl+C` 停止它。所以几秒钟后,按 `Ctrl+C` 停止追踪: + +``` +# trace-cmd list -f | grep ^ext4_ + +# trace-cmd record -l ext4_* -p function_graph + plugin 'function_graph' +Hit Ctrl^C to stop recording +^C +CPU0 data recorded at offset=0x856000 + 8192 bytes in size +[...] +``` + +### 查看追踪记录 + +要查看你之前的追踪记录,运行带有 `report` 参数的命令。从输出结果来看,很明显过滤器起作用了,你只看到 `ext4` 相关的函数追踪: + +``` +# trace-cmd report | head -20 +[...] +cpus=8 + trace-cmd-12697 [000] 11303.928103: funcgraph_entry: | ext4_show_options() { + trace-cmd-12697 [000] 11303.928104: funcgraph_entry: 0.187 us | ext4_get_dummy_policy(); + trace-cmd-12697 [000] 11303.928105: funcgraph_exit: 1.583 us | } + trace-cmd-12697 [000] 11303.928122: funcgraph_entry: | ext4_create() { + trace-cmd-12697 [000] 11303.928122: funcgraph_entry: | ext4_alloc_inode() { + trace-cmd-12697 [000] 11303.928123: funcgraph_entry: 0.101 us | ext4_es_init_tree(); + trace-cmd-12697 [000] 11303.928123: funcgraph_entry: 0.083 us | ext4_init_pending_tree(); + trace-cmd-12697 [000] 11303.928123: funcgraph_entry: 0.141 us | ext4_fc_init_inode(); + trace-cmd-12697 [000] 11303.928123: funcgraph_exit: 0.931 us | } + trace-cmd-12697 [000] 11303.928124: funcgraph_entry: 0.081 us | ext4_get_dummy_policy(); + trace-cmd-12697 [000] 11303.928124: funcgraph_entry: 0.133 us | ext4_get_group_desc(); + trace-cmd-12697 [000] 11303.928124: funcgraph_entry: 0.115 us | ext4_free_inodes_count(); + trace-cmd-12697 [000] 11303.928124: funcgraph_entry: 0.114 us | ext4_get_group_desc(); +``` + +### 追踪一个特定的 PID + +假设你想追踪与一个进程(PID)有关的函数。打开另一个终端,注意运行中的 shell 的PID: + +``` +# echo $$ +10885 +``` + +再次运行 `record` 命令,用 `-P` 选项传递PID。这一次,让终端运行(也就是说,先不要按 `Ctrl+C` ): + +``` +# trace-cmd record -P 10885 -p function_graph + Plugin 'function_graph' +Hit Ctrl^C to stop recording +``` + +### 在 shell 上运行一些命令 + +移动到另一个终端,在那里你有一个以特定 PID 运行的 shell,并运行任何命令,例如,`ls` 命令用来列出文件: + +``` +# ls +Temp-9b61f280-fdc1-4512-9211-5c60f764d702 +tracker-extract-3-files.1000 +v8-compile-cache-1000 +[...] +``` + +移动到你启用追踪的终端,按 `Ctrl+C` 停止追踪: + +``` +# trace-cmd record -P 10885 -p function_graph + plugin 'function_graph' +Hit Ctrl^C to stop recording +^C +CPU1 data recorded at offset=0x856000 + 618496 bytes in size +[...] +``` + +在追踪的输出中,你可以看到左边是 PID 和 Bash shell,右边是与之相关的函数调用。这对于缩小你的追踪范围是非常方便的: + +``` +# trace-cmd report | head -20 + +cpus=8 + -0 [001] 11555.380581: funcgraph_entry: | switch_mm_irqs_off() { + -0 [001] 11555.380583: funcgraph_entry: 1.703 us | load_new_mm_cr3(); + -0 [001] 11555.380586: funcgraph_entry: 0.493 us | switch_ldt(); + -0 [001] 11555.380587: funcgraph_exit: 7.235 us | } + bash-10885 [001] 11555.380589: funcgraph_entry: 1.046 us | finish_task_switch.isra.0(); + bash-10885 [001] 11555.380591: funcgraph_entry: | __fdget() { + bash-10885 [001] 11555.380592: funcgraph_entry: 2.036 us | __fget_light(); + bash-10885 [001] 11555.380594: funcgraph_exit: 3.256 us | } + bash-10885 [001] 11555.380595: funcgraph_entry: | tty_poll() { + bash-10885 [001] 11555.380597: funcgraph_entry: | tty_ldisc_ref_wait() { + bash-10885 [001] 11555.380598: funcgraph_entry: | ldsem_down_read() { + bash-10885 [001] 11555.380598: funcgraph_entry: | __cond_resched() { +``` + +### 试一试 + +这些简短的例子显示了使用 `trace-cmd` 命令而不是底层的 `ftrace` 机制,是如何实现既容易使用又拥有丰富的功能,许多内容本文并没有涉及。要想了解更多信息并更好地使用它,请查阅它的手册,并尝试使用其他有用的命令。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/7/linux-kernel-trace-cmd + +作者:[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/puzzle_computer_solve_fix_tool.png?itok=U0pH1uwj (Puzzle pieces coming together to form a computer screen) +[2]: https://linux.cn/article-13752-1.html +[3]: https://lwn.net/Articles/410200/ diff --git a/sources/tech/20210809 NMState- A declarative networking config tool.md b/published/202110/20210809 NMState- A declarative networking config tool.md similarity index 69% rename from sources/tech/20210809 NMState- A declarative networking config tool.md rename to published/202110/20210809 NMState- A declarative networking config tool.md index 21e95b6ea9..2f15c78d84 100644 --- a/sources/tech/20210809 NMState- A declarative networking config tool.md +++ b/published/202110/20210809 NMState- A declarative networking config tool.md @@ -2,43 +2,41 @@ [#]: via: "https://fedoramagazine.org/nmstate-a-declarative-networking-config-tool/" [#]: author: "Maurizio Garcia https://fedoramagazine.org/author/malgnuz/" [#]: collector: "lujun9972" -[#]: translator: " " -[#]: reviewer: " " -[#]: publisher: " " -[#]: url: " " +[#]: translator: "wxy" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13861-1.html" -NMState: A declarative networking config tool +NMState:一个声明式网络配置工具 ====== -![][1] +![](https://img.linux.net.cn/data/attachment/album/202110/08/145714mqcyh6sshchomyot.jpg) -Comic excerpted from photo by [Bee Felten-Leidel][2] on [Unsplash][3] +这篇文章描述并演示了 NMState,这是一个使用声明式方法配置主机的网络管理器。这意味着你可以通过 API 定义所需的配置状态,而工具则通过提供者provider来应用配置。 -This article describes and demonstrates NMState, a network manager that uses a declarative approach to configure hosts. This means you define the desired configuration state through an API and the tool applies the configuration through a provider. +### 配置方法:命令式与声明式 -### Configuration approaches: imperative vs declarative +网络管理有时候是一项非常复杂的任务,这取决于环境的规模和多样性。在 IT 的早期,网络管理依赖于网络管理员在网络设备上手动执行命令。如今,基础设施即代码Infrastructure as Code(IaC)允许以不同的方式将这些任务自动化。z这基本上有两种方法:命令式或声明式。 -Networking management can be a very complex task depending on the size and diversity of the environment. In the early days of IT, networking management relied on manual procedures performed by network administrators over networking devices. Nowadays, Infrastructure as Code (IaC) allows automation of those tasks in a different way. There are, essentially two approaches: imperative or declarative. +在命令式方法中,你会定义“如何”达到所需的配置状态。而在声明式范式里则定义了“什么”是所需的配置状态,所以它不确定哪些步骤是必需的,也不确定它们必须以何种顺序执行。这种方法目前正在聚集更多的人员参与,你可以在目前使用的大多数管理和编排工具上找到它。 -In an imperative approach you define “how” you will arrive at a desired configuration state. The declarative paradigm defines “what” is the desired configuration state, so it does not shape which steps are required nor in which order they must be performed. This approach is currently gathering more adepts and you can find it on most of the management and orchestration tools currently used. +### NMState:一个声明式的工具 -### NMState: a declarative tool +NMState 是一个网络管理器,允许你按照声明式方法配置主机。这意味着你通过一个北向的声明式 API 定义所需的配置状态,这个工具通过南向的提供者provider应用配置。 -NMState is a network manager that allows you to configure hosts following a declarative approach. It means you define the desired configuration state through a northbound declarative API and this tool applies the configuration through a southbound provider. +目前 NMState 支持的唯一的提供者是 NetworkManager,它是为 Fedora Linux 提供网络功能的主要服务。不过,NMState 的开发计划中将逐渐增加其他提供者。 -Currently the only provider supported by NMState is NetworkManager, which is the main service to address networking capabilities on Fedora Linux. However, the development life cycle of NMState will add other providers gradually. +关于 NMState 的进一步信息,请访问其项目 [站点][4] 或 GitHub [仓库][5]。 -For further information regarding NMState please visit either its project [site][4] or github [repository][5]. +### 安装 -### Installation - -NMState is available on Fedora Linux 29+ and requires NetworkManager 1.26 or later installed and running on the system. The following shows the installation on Fedora Linux 34: +NMState 在 Fedora Linux 29+ 上可用,需要在系统上安装并运行 NetworkManager 1.26 或更高版本。下面是在 Fedora Linux 34 上的安装情况: ``` $ sudo dnf -y install nmstate -… -output omitted -… +... +输出节略 +... Installed: NetworkManager-config-server-1:1.30.4-1.fc34.noarch gobject-introspection-1.68.0-3.fc34.x86_64 nispor-1.0.1-2.fc34.x86_64 nmstate-1.0.3-2.fc34.noarch python3-gobject-base-3.40.1-1.fc34.x86_64 python3-libnmstate-1.0.3-2.fc34.noarch python3-nispor-1.0.1-2.fc34.noarch python3-varlink-30.3.1-2.fc34.noarch @@ -46,18 +44,18 @@ Installed: Complete! ``` -At this point you can use _nmstatectl_ as a command line tool for NMState. Please refer to either _nmstatectl –help_ or _man nmstatectl_ for further information about this tool. +这样,你可以使用 `nmstatectl` 作为 NMState 的命令行工具。请参考 `nmstatectl -help` 或 `man nmstatectl` 以了解关于这个工具的进一步信息。 -### Using NMstate +### 使用 NMstate -Start by checking the NMState version installed in the system: +首先要检查系统中安装的 NMState 版本: ``` $ nmstatectl version 1.0.3 ``` -Check the current configuration of a networking interface, e.g. the _eth0_ configuration: +检查一个网络接口的当前配置,例如 `eth0` 的配置: ``` $ nmstatectl show eth0 @@ -124,29 +122,23 @@ interfaces: mtu: 1500 ``` - As you can see above the networking configuration shows four main sections: +正如你在上面看到的,这个网络配置显示了四个主要部分: - * **dns-resolver**: this section has the nameserver configuration for this interface. - * **route-rules**: it states the routing rules.  - * **routes**: it includes both dynamic and static routes. - * **Interfaces**: this section describes both ipv4 and ipv6 settings. + * `dns-resolver`:这部分是这个接口的名字服务器配置。 + * `route-rules`:它说明了路由规则。  + * `routes`:它包括动态和静态路由。 + * `interfaces`:这部分描述了 ipv4 和 ipv6 设置。 +### 修改配置 +你可以在两种模式下修改所需的配置状态: -### Modify the configuration + * 交互式:通过 `nmstatectl edit` 编辑接口配置。这个命令调用环境变量 `EDITOR` 定义的文本编辑器,因此可以用 yaml 格式编辑网络状态。完成编辑后,NMState 将应用新的网络配置,除非有语法错误。 + * 基于文件的:使用 `nmstatectl apply` 应用接口配置,它从先前创建的 yaml 或 json 文件中导入一个所需的配置状态。 -You can modify the desired configuration state in two modes:  +下面几节告诉你如何使用 NMState 来改变网络配置。这些改变可能会对系统造成破坏,所以建议在测试系统或客户虚拟机上执行这些任务,直到你对 NMState 有更好的理解。 - * **Interactive**: editing the interface configuration through _nmstatectl edit_. This command invokes the text editor defined by the environment variable EDITOR so the network state can be edited in yaml format. After finishing the edition NMState will apply the new network configuration unless there are syntax errors. - - - * **File-based**: applying the interface configuration using _nmstatectl apply_ which imports a desired configuration state from a yaml or json file earlier created. - - - -The following sections show you how to change the networking configuration using NMState. These changes can be disruptive to the system so the recommendation is to perform these tasks on a test system or guest VM till you get a better understanding of NMState. - -The test system in use herehas two Ethernet interfaces: _eth0_ and _eth1_: +这里使用的测试系统有两个以太网接口,`eth0` 和 `eth1`: ``` $ ip -br -4 a @@ -155,11 +147,9 @@ eth0 UP 192.168.122.238/24 eth1 UP 192.168.122.108/24 ``` -#### Example of interactive configuration mode: +#### 互动配置模式的例子 -``` -Change the MTU of eth0 interface to 9000 bytes using the nmstatectl edit command as follows (all changes are in bold): -``` +使用 `nmstatectl edit` 命令将 `eth0` 接口的 MTU 改为 9000 字节,如下所示: ``` $ sudo nmstatectl edit eth0 @@ -222,7 +212,7 @@ interfaces: mtu: 9000 ``` -After saving and exiting the edito, NMState applies the new network desired state: +在保存并退出编辑器后,NMState 应用新的网络期望状态: ``` 2021-06-29 11:29:05,726 root DEBUG Nmstate version: 1.0.3 @@ -232,7 +222,7 @@ After saving and exiting the edito, NMState applies the new network desired stat 2021-06-29 11:29:05,792 root DEBUG Async action: Update profile uuid:2bdee700-f62b-365a-bd1d-69d9c31a9f0c iface:eth0 type:ethernet finished ``` -Now, use both the _ip_ command and also the _eth0_ configuration file to check that the _MTU_ of _eth0_ is 9000 bytes. +现在,使用 `ip` 命令和 `eth0` 的配置文件来检查 `eth0` 的 `MTU` 是不是 9000 字节。 ``` $ ip link show eth0 @@ -273,11 +263,11 @@ ra-timeout=2147483647 [proxy] ``` -#### Example of file-based configuration mode: +#### 基于文件的配置模式的例子 -Let’s use the file-based approach to set a new config state. In this case disable the IPv6 configuration in _eth1_ interface. +让我们使用基于文件的方法来设置一个新的配置状态。这里我们禁用 `eth1` 接口的 IPv6 配置。 -First, create a yaml file to define the desired state of the _eth1_ interface. Use _nmstatectl show_ to save the current settings then _nmstatectl edit_ to disable IPv6. Again, all changes are in bold and deletions are shown with strike-through: +首先,创建一个 yaml 文件来定义 `eth1` 接口的期望状态。使用 `nmstatectl show` 来保存当前设置,然后使用 `nmstatectl edit` 来禁用 IPv6。 ``` $ nmstatectl show eth1 > eth1.yaml @@ -341,7 +331,7 @@ interfaces: mtu: 1500 ``` -After saving the new configuration, use it to apply the new state: +保存新的配置后,用它来应用新的状态: ``` $ sudo nmstatectl apply eth1.yaml @@ -402,7 +392,7 @@ interfaces: mtu: 1500 ``` -You can check that the _eth1_ interface does not have any IPv6 configured: +你可以检查看到 `eth1` 接口没有配置任何 IPv6: ``` $ ip -br a @@ -440,11 +430,11 @@ method=disabled [proxy] ``` -#### Applying changes temporarily +#### 临时应用改变 -An interesting feature of NMState allows you to configure a desired networking state temporarily. In case you are satisfied with the configuration you can commit it afterwards. Otherwise it will rollback when the timeout expires (default is 60 sec). +NMState 的一个有趣的功能允许你临时配置一个期望的网络状态。如果你对这个配置感到满意,你可以事后提交。否则,当超时(默认为 60 秒)过后,它将回滚。 -Modify the _eth1_ configuration from the previous example so it has an IPv4 static address instead of getting it dynamically by DHCP. +修改前面例子中的 `eth1` 配置,使它有一个 IPv4 静态地址,而不是通过 DHCP 动态获得。 ``` $ vi eth1.yaml @@ -498,7 +488,7 @@ interfaces: mtu: 1500 ``` -Now, apply this config temporarily using the option _no-commit_ so it will be valid only for 30 seconds. This can be done adding the option _–timeout_. Meanwhile, we will run the _ip  -br a_ command three times to see how the IPv4 address configured in _eth1_ interface changes and then the configuration rolls back. +现在,使用选项 `no-commit` 临时应用这个配置,让它只在 30 秒内有效。这可以通过添加选项 `timeout` 来完成。同时,我们将运行 `ip -br a` 命令三次,看看配置在 `eth1` 接口的 IPv4 地址是如何变化的,然后配置就会回滚。 ``` $ ip -br a && sudo nmstatectl apply --no-commit --timeout 30 eth1.yaml && sleep 10 && ip -br a && sleep 25 && ip -br a @@ -561,13 +551,13 @@ eth0 UP 192.168.122.238/24 fe80::5054:ff:fe91:e44e/64 eth1 UP 192.168.122.108/24 ``` -As you can see from above, the _eth1_ IP address changed temporarily from 192.168.122.108 to 192.168.122.110 and then it returned to 192.168.122.108 after the timeout expired. +从上面可以看到,`eth1` 的 IP 地址从 `192.168.122.108` 暂时变成了 `192.168.122.110`,然后在超时结束后又回到了 `192.168.122.108`。 -### Conclusion +### 总结 -NMState is a declarative networking configuration tool that currently applies the desired networking configuration state in a host through the NetworkManager API. This state can be defined either interactively using a text editor or with a file-based approach creating a yaml or json file. +NMState 是一个声明式的网络配置工具,目前可以通过 NetworkManager API 在主机中应用所需的网络配置状态。这种状态既可以用文本编辑器交互式地定义,也可以用基于文件的方法创建一个 yaml 或 json 文件。 -This kind of tool provides Infrastructure as Code, it allows the automation of networking tasks and also reduces potential misconfigurations or unstable networking scenarios that could arise using legacy configuration methods. +这种工具提供了“基础设施即代码”,它可以自动化网络任务,也减少了使用传统配置方法可能出现的潜在错误配置或不稳定的网络情况。 -------------------------------------------------------------------------------- @@ -575,8 +565,8 @@ via: https://fedoramagazine.org/nmstate-a-declarative-networking-config-tool/ 作者:[Maurizio Garcia][a] 选题:[lujun9972][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) +译者:[wxy](https://github.com/wxy) +校对:[wxy](https://github.com/wxy) 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 diff --git a/published/202110/20210813 Code memory safety and efficiency by example.md b/published/202110/20210813 Code memory safety and efficiency by example.md new file mode 100644 index 0000000000..d962653d8f --- /dev/null +++ b/published/202110/20210813 Code memory safety and efficiency by example.md @@ -0,0 +1,666 @@ +[#]: subject: "Code memory safety and efficiency by example" +[#]: via: "https://opensource.com/article/21/8/memory-programming-c" +[#]: author: "Marty Kalin https://opensource.com/users/mkalindepauledu" +[#]: collector: "lujun9972" +[#]: translator: "unigeorge" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13845-1.html" + +实例讲解代码之内存安全与效率 +====== + +> 了解有关内存安全和效率的更多信息。 + +![](https://img.linux.net.cn/data/attachment/album/202110/03/101238cd0hgdrhamzab7hj.jpg) + +C 是一种高级语言,同时具有“接近金属close-to-the-metal”(LCTT 译注:即“接近人类思维方式”的反义词)的特性,这使得它有时看起来更像是一种可移植的汇编语言,而不像 Java 或 Python 这样的兄弟语言。内存管理作为上述特性之一,涵盖了正在执行的程序对内存的安全和高效使用。本文通过 C 语言代码示例,以及现代 C 语言编译器生成的汇编语言代码段,详细介绍了内存安全性和效率。 + +尽管代码示例是用 C 语言编写的,但安全高效的内存管理指南对于 C++ 是同样适用的。这两种语言在很多细节上有所不同(例如,C++ 具有 C 所缺乏的面向对象特性和泛型),但在内存管理方面面临的挑战是一样的。 + +### 执行中程序的内存概述 + +对于正在执行的程序(又名 _进程process_),内存被划分为三个区域:**stack**、**heap** 和 **静态区static area**。下文会给出每个区域的概述,以及完整的代码示例。 + +作为通用 CPU 寄存器的替补,_栈_ 为代码块(例如函数或循环体)中的局部变量提供暂存器存储。传递给函数的参数在此上下文中也视作局部变量。看一下下面这个简短的示例: + +``` +void some_func(int a, int b) { +   int n; +   ... +} +``` + +通过 `a` 和 `b` 传递的参数以及局部变量 `n` 的存储会在栈中,除非编译器可以找到通用寄存器。编译器倾向于优先将通用寄存器用作暂存器,因为 CPU 对这些寄存器的访问速度很快(一个时钟周期)。然而,这些寄存器在台式机、笔记本电脑和手持机器的标准架构上很少(大约 16 个)。 + +在只有汇编语言程序员才能看到的实施层面,栈被组织为具有 `push`(插入)和 `pop`(删除)操作的 LIFO(后进先出)列表。 `top` 指针可以作为偏移的基地址;这样,除了 `top` 之外的栈位置也变得可访问了。例如,表达式 `top+16` 指向堆栈的 `top` 指针上方 16 个字节的位置,表达式 `top-16` 指向 `top` 指针下方 16 个字节的位置。因此,可以通过 `top` 指针访问实现了暂存器存储的栈的位置。在标准的 ARM 或 Intel 架构中,栈从高内存地址增长到低内存地址;因此,减小某进程的 `top` 就是增大其栈规模。 + +使用栈结构就意味着轻松高效地使用内存。编译器(而非程序员)会编写管理栈的代码,管理过程通过分配和释放所需的暂存器存储来实现;程序员声明函数参数和局部变量,将实现过程交给编译器。此外,完全相同的栈存储可以在连续的函数调用和代码块(如循环)中重复使用。精心设计的模块化代码会将栈存储作为暂存器的首选内存选项,同时优化编译器要尽可能使用通用寄存器而不是栈。 + +**堆** 提供的存储是通过程序员代码显式分配的,堆分配的语法因语言而异。在 C 中,成功调用库函数 `malloc`(或其变体 `calloc` 等)会分配指定数量的字节(在 C++ 和 Java 等语言中,`new` 运算符具有相同的用途)。编程语言在如何释放堆分配的存储方面有着巨大的差异: + + * 在 Java、Go、Lisp 和 Python 等语言中,程序员不会显式释放动态分配的堆存储。 + + 例如,下面这个 Java 语句为一个字符串分配了堆存储,并将这个堆存储的地址存储在变量 `greeting` 中: + + ``` + String greeting = new String("Hello, world!"); + ``` + + Java 有一个垃圾回收器,它是一个运行时实用程序,如果进程无法再访问自己分配的堆存储,回收器可以使其自动释放。因此,Java 堆释放是通过垃圾收集器自动进行的。在上面的示例中,垃圾收集器将在变量 `greeting` 超出作用域后,释放字符串的堆存储。 + + * Rust 编译器会编写堆释放代码。这是 Rust 在不依赖垃圾回收器的情况下,使堆释放实现自动化的开创性努力,但这也会带来运行时复杂性和开销。向 Rust 的努力致敬! + * 在 C(和 C++)中,堆释放是程序员的任务。程序员调用 `malloc` 分配堆存储,然后负责相应地调用库函数 `free` 来释放该存储空间(在 C++ 中,`new` 运算符分配堆存储,而 `delete` 和 `delete[]` 运算符释放此类存储)。下面是一个 C 语言代码示例: + + ``` + char* greeting = malloc(14);       /* 14 heap bytes */ + strcpy(greeting, "Hello, world!"); /* copy greeting into bytes */ + puts(greeting);                    /* print greeting */ + free(greeting);                    /* free malloced bytes */ + ``` + + C 语言避免了垃圾回收器的成本和复杂性,但也不过是让程序员承担了堆释放的任务。 + +内存的 **静态区** 为可执行代码(例如 C 语言函数)、字符串文字(例如“Hello, world!”)和全局变量提供存储空间: + +``` +int n;                       /* global variable */ +int main() {                 /* function */ +   char* msg = "No comment"; /* string literal */ +   ... +} +``` + +该区域是静态的,因为它的大小从进程执行开始到结束都固定不变。由于静态区相当于进程固定大小的内存占用,因此经验法则是通过避免使用全局数组等方法来使该区域尽可能小。 + +下文会结合代码示例对本节概述展开进一步讲解。 + +### 栈存储 + +想象一个有各种连续执行的任务的程序,任务包括了处理每隔几分钟通过网络下载并存储在本地文件中的数字数据。下面的 `stack` 程序简化了处理流程(仅是将奇数整数值转换为偶数),而将重点放在栈存储的好处上。 + + +``` +#include +#include + +#define Infile   "incoming.dat" +#define Outfile  "outgoing.dat" +#define IntCount 128000  /* 128,000 */ + +void other_task1() { /*...*/ } +void other_task2() { /*...*/ } + +void process_data(const char* infile, +          const char* outfile, +          const unsigned n) { +  int nums[n]; +  FILE* input = fopen(infile, "r"); +  if (NULL == infile) return; +  FILE* output = fopen(outfile, "w"); +  if (NULL == output) { +    fclose(input); +    return; +  } + +  fread(nums, n, sizeof(int), input); /* read input data */ +  unsigned i; +  for (i = 0; i < n; i++) { +    if (1 == (nums[i] & 0x1))  /* odd parity? */ +      nums[i]--;               /* make even */ +  } +  fclose(input);               /* close input file */ + +  fwrite(nums, n, sizeof(int), output); +  fclose(output); +} + +int main() { +  process_data(Infile, Outfile, IntCount); +   +  /** now perform other tasks **/ +  other_task1(); /* automatically released stack storage available */ +  other_task2(); /* ditto */ +   +  return 0; +} +``` + +底部的 `main` 函数首先调用 `process_data` 函数,该函数会创建一个基于栈的数组,其大小由参数 `n` 给定(当前示例中为 128,000)。因此,该数组占用 `128000 * sizeof(int)` 个字节,在标准设备上达到了 512,000 字节(`int` 在这些设备上是四个字节)。然后数据会被读入数组(使用库函数 `fread`),循环处理,并保存到本地文件 `outgoing.dat`(使用库函数 `fwrite`)。 + +当 `process_data` 函数返回到其调用者 `main` 函数时,`process_data` 函数的大约 500MB 栈暂存器可供 `stack` 程序中的其他函数用作暂存器。在此示例中,`main` 函数接下来调用存根函数 `other_task1` 和 `other_task2`。这三个函数在 `main` 中依次调用,这意味着所有三个函数都可以使用相同的堆栈存储作为暂存器。因为编写栈管理代码的是编译器而不是程序员,所以这种方法对程序员来说既高效又容易。 + +在 C 语言中,在块(例如函数或循环体)内定义的任何变量默认都有一个 `auto` 存储类,这意味着该变量是基于栈的。存储类 `register` 现在已经过时了,因为 C 编译器会主动尝试尽可能使用 CPU 寄存器。只有在块内定义的变量可能是 `register`,如果没有可用的 CPU 寄存器,编译器会将其更改为 `auto`。基于栈的编程可能是不错的首选方式,但这种风格确实有一些挑战性。下面的 `badStack` 程序说明了这点。 + +``` +#include ; + +const int* get_array(const unsigned n) { +  int arr[n]; /* stack-based array */ +  unsigned i; +  for (i = 0; i < n; i++) arr[i] = 1 + 1; + +  return arr;  /** ERROR **/ +} + +int main() { +  const unsigned n = 16; +  const int* ptr = get_array(n); +   +  unsigned i; +  for (i = 0; i < n; i++) printf("%i ", ptr[i]); +  puts("\n"); + +  return 0; +} +``` + +`badStack` 程序中的控制流程很简单。`main` 函数使用 16(LCTT 译注:原文为 128,应为作者笔误)作为参数调用函数 `get_array`,然后被调用函数会使用传入参数来创建对应大小的本地数组。`get_array` 函数会初始化数组并返回给 `main` 中的数组标识符 `arr`。 `arr` 是一个指针常量,保存数组的第一个 `int` 元素的地址。 + +当然,本地数组 `arr` 可以在 `get_array` 函数中访问,但是一旦 `get_array` 返回,就不能合法访问该数组。尽管如此,`main` 函数会尝试使用函数 `get_array` 返回的堆栈地址 `arr` 来打印基于栈的数组。现代编译器会警告错误。例如,下面是来自 GNU 编译器的警告: + +``` +badStack.c: In function 'get_array': +badStack.c:9:10: warning: function returns address of local variable [-Wreturn-local-addr] +return arr;  /** ERROR **/ +``` + +一般规则是,如果使用栈存储实现局部变量,应该仅在该变量所在的代码块内,访问这块基于栈的存储(在本例中,数组指针 `arr` 和循环计数器 `i` 均为这样的局部变量)。因此,函数永远不应该返回指向基于栈存储的指针。 + +### 堆存储 + +接下来使用若干代码示例凸显在 C 语言中使用堆存储的优点。在第一个示例中,使用了最优方案分配、使用和释放堆存储。第二个示例(在下一节中)将堆存储嵌套在了其他堆存储中,这会使其释放操作变得复杂。 + +``` +#include +#include + +int* get_heap_array(unsigned n) { +  int* heap_nums = malloc(sizeof(int) * n);  +   +  unsigned i; +  for (i = 0; i < n; i++) +    heap_nums[i] = i + 1;  /* initialize the array */ +   +  /* stack storage for variables heap_nums and i released +     automatically when get_num_array returns */ +  return heap_nums; /* return (copy of) the pointer */ +} + +int main() { +  unsigned n = 100, i; +  int* heap_nums = get_heap_array(n); /* save returned address */ +   +  if (NULL == heap_nums) /* malloc failed */ +    fprintf(stderr, "%s\n", "malloc(...) failed..."); +  else { +    for (i = 0; i < n; i++) printf("%i\n", heap_nums[i]); +    free(heap_nums); /* free the heap storage */ +  } +  return 0;  +} +``` + +上面的 `heap` 程序有两个函数: `main` 函数使用参数(示例中为 100)调用 `get_heap_array` 函数,参数用来指定数组应该有多少个 `int` 元素。因为堆分配可能会失败,`main` 函数会检查 `get_heap_array` 是否返回了 `NULL`;如果是,则表示失败。如果分配成功,`main` 将打印数组中的 `int` 值,然后立即调用库函数 `free` 来对堆存储解除分配。这就是最优的方案。 + +`get_heap_array` 函数以下列语句开头,该语句值得仔细研究一下: + +``` +int* heap_nums = malloc(sizeof(int) * n); /* heap allocation */ +``` + +`malloc` 库函数及其变体函数针对字节进行操作;因此,`malloc` 的参数是 `n` 个 `int` 类型元素所需的字节数(`sizeof(int)` 在标准现代设备上是四个字节)。`malloc` 函数返回所分配字节段的首地址,如果失败则返回 `NULL` . + +如果成功调用 `malloc`,在现代台式机上其返回的地址大小为 64 位。在手持设备和早些时候的台式机上,该地址的大小可能是 32 位,或者甚至更小,具体取决于其年代。堆分配数组中的元素是 `int` 类型,这是一个四字节的有符号整数。这些堆分配的 `int` 的地址存储在基于栈的局部变量 `heap_nums` 中。可以参考下图: + +``` +                 heap-based + stack-based        / +     \        +----+----+   +----+ + heap-nums--->|int1|int2|...|intN| +              +----+----+   +----+ +``` + +一旦 `get_heap_array` 函数返回,指针变量 `heap_nums` 的栈存储将自动回收——但动态 `int` 数组的堆存储仍然存在,这就是 `get_heap_array` 函数返回这个地址(的副本)给 `main` 函数的原因:它现在负责在打印数组的整数后,通过调用库函数 `free` 显式释放堆存储: + +``` +free(heap_nums); /* free the heap storage */ +``` + +`malloc` 函数不会初始化堆分配的存储空间,因此里面是随机值。相比之下,其变体函数 `calloc` 会将分配的存储初始化为零。这两个函数都返回 `NULL` 来表示分配失败。 + +在 `heap` 示例中,`main` 函数在调用 `free` 后会立即返回,正在执行的程序会终止,这会让系统回收所有已分配的堆存储。尽管如此,程序员应该养成在不再需要时立即显式释放堆存储的习惯。 + +### 嵌套堆分配 + +下一个代码示例会更棘手一些。C 语言有很多返回指向堆存储的指针的库函数。下面是一个常见的使用情景: + +1、C 程序调用一个库函数,该函数返回一个指向基于堆的存储的指针,而指向的存储通常是一个聚合体,如数组或结构体: + +``` +SomeStructure* ptr = lib_function(); /* returns pointer to heap storage */ +``` + +2、 然后程序使用所分配的存储。 + +3、 对于清理而言,问题是对 `free` 的简单调用是否会清理库函数分配的所有堆分配存储。例如,`SomeStructure` 实例可能有指向堆分配存储的字段。一个特别麻烦的情况是动态分配的结构体数组,每个结构体有一个指向又一层动态分配的存储的字段。下面的代码示例说明了这个问题,并重点关注了如何设计一个可以安全地为客户端提供堆分配存储的库。 + +``` +#include +#include + +typedef struct { +  unsigned id; +  unsigned len; +  float*   heap_nums; +} HeapStruct; +unsigned structId = 1; + +HeapStruct* get_heap_struct(unsigned n) { +  /* Try to allocate a HeapStruct. */ +  HeapStruct* heap_struct = malloc(sizeof(HeapStruct)); +  if (NULL == heap_struct) /* failure? */ +    return NULL;           /* if so, return NULL */ + +  /* Try to allocate floating-point aggregate within HeapStruct. */ +  heap_struct->heap_nums = malloc(sizeof(float) * n); +  if (NULL == heap_struct->heap_nums) {  /* failure? */ +    free(heap_struct);                   /* if so, first free the HeapStruct */ +    return NULL;                         /* then return NULL */ +  } + +  /* Success: set fields */ +  heap_struct->id = structId++; +  heap_struct->len = n; + +  return heap_struct; /* return pointer to allocated HeapStruct */ +} + +void free_all(HeapStruct* heap_struct) { +  if (NULL == heap_struct) /* NULL pointer? */ +    return;                /* if so, do nothing */ +   +  free(heap_struct->heap_nums); /* first free encapsulated aggregate */ +  free(heap_struct);            /* then free containing structure */   +} + +int main() { +  const unsigned n = 100; +  HeapStruct* hs = get_heap_struct(n); /* get structure with N floats */ + +  /* Do some (meaningless) work for demo. */ +  unsigned i; +  for (i = 0; i < n; i++) hs->heap_nums[i] = 3.14 + (float) i; +  for (i = 0; i < n; i += 10) printf("%12f\n", hs->heap_nums[i]); + +  free_all(hs); /* free dynamically allocated storage */ +   +  return 0; +} +``` + +上面的 `nestedHeap` 程序示例以结构体 `HeapStruct` 为中心,结构体中又有名为 `heap_nums` 的指针字段: + +``` +typedef struct { +  unsigned id; +  unsigned len; +  float*   heap_nums; /** pointer **/ +} HeapStruct; +``` + +函数 `get_heap_struct` 尝试为 `HeapStruct` 实例分配堆存储,这需要为字段 `heap_nums` 指向的若干个 `float` 变量分配堆存储。如果成功调用 `get_heap_struct` 函数,并将指向堆分配结构体的指针以 `hs` 命名,其结果可以描述如下: + +``` +hs-->HeapStruct instance +        id +        len +        heap_nums-->N contiguous float elements +``` + +在 `get_heap_struct` 函数中,第一个堆分配过程很简单: + +``` +HeapStruct* heap_struct = malloc(sizeof(HeapStruct)); +if (NULL == heap_struct) /* failure? */ +  return NULL;           /* if so, return NULL */ +``` + +`sizeof(HeapStruct)` 包括了 `heap_nums` 字段的字节数(32 位机器上为 4,64 位机器上为 8),`heap_nums` 字段则是指向动态分配数组中的 `float` 元素的指针。那么,问题关键在于 `malloc` 为这个结构体传送了字节空间还是表示失败的 `NULL`;如果是 `NULL`,`get_heap_struct` 函数就也返回 `NULL` 以通知调用者堆分配失败。 + +第二步尝试堆分配的过程更复杂,因为在这一步,`HeapStruct` 的堆存储已经分配好了: + +``` +heap_struct->heap_nums = malloc(sizeof(float) * n); +if (NULL == heap_struct->heap_nums) {  /* failure? */ +  free(heap_struct);                   /* if so, first free the HeapStruct */ +  return NULL;                         /* and then return NULL */ +} +``` + +传递给 `get_heap_struct` 函数的参数 `n` 指明动态分配的 `heap_nums` 数组中应该有多少个 `float` 元素。如果可以分配所需的若干个 `float` 元素,则该函数在返回 `HeapStruct` 的堆地址之前会设置结构的 `id` 和 `len` 字段。 但是,如果尝试分配失败,则需要两个步骤来实现最优方案: + +1、 必须释放 `HeapStruct` 的存储以避免内存泄漏。对于调用 `get_heap_struct` 的客户端函数而言,没有动态 `heap_nums` 数组的 `HeapStruct` 可能就是没用的;因此,`HeapStruct` 实例的字节空间应该显式释放,以便系统可以回收这些空间用于未来的堆分配。 + +2、 返回 `NULL` 以标识失败。 + +如果成功调用 `get_heap_struct` 函数,那么释放堆存储也很棘手,因为它涉及要以正确顺序进行的两次 `free` 操作。因此,该程序设计了一个 `free_all` 函数,而不是要求程序员再去手动实现两步释放操作。回顾一下,`free_all` 函数是这样的: + +``` +void free_all(HeapStruct* heap_struct) { +  if (NULL == heap_struct) /* NULL pointer? */ +    return;                /* if so, do nothing */ +   +  free(heap_struct->heap_nums); /* first free encapsulated aggregate */ +  free(heap_struct);            /* then free containing structure */   +} +``` + +检查完参数 `heap_struct` 不是 `NULL` 值后,函数首先释放 `heap_nums` 数组,这步要求 `heap_struct` 指针此时仍然是有效的。先释放 `heap_struct` 的做法是错误的。一旦 `heap_nums` 被释放,`heap_struct` 就可以释放了。如果 `heap_struct` 被释放,但 `heap_nums` 没有被释放,那么数组中的 `float` 元素就会泄漏:仍然分配了字节空间,但无法被访问到——因此一定要记得释放 `heap_nums`。存储泄漏将一直持续,直到 `nestedHeap` 程序退出,系统回收泄漏的字节时为止。 + +关于 `free` 库函数的注意事项就是要有顺序。回想一下上面的调用示例: + +``` +free(heap_struct->heap_nums); /* first free encapsulated aggregate */ +free(heap_struct);            /* then free containing structure */ +``` + +这些调用释放了分配的存储空间——但它们并 _不是_ 将它们的操作参数设置为 `NULL`(`free` 函数会获取地址的副本作为参数;因此,将副本更改为 `NULL` 并不会改变原地址上的参数值)。例如,在成功调用 `free` 之后,指针 `heap_struct` 仍然持有一些堆分配字节的堆地址,但是现在使用这个地址将会产生错误,因为对 `free` 的调用使得系统有权回收然后重用这些分配过的字节。 + +使用 `NULL` 参数调用 `free` 没有意义,但也没有什么坏处。而在非 `NULL` 的地址上重复调用 `free` 会导致不确定结果的错误: + +``` +free(heap_struct);  /* 1st call: ok */ +free(heap_struct);  /* 2nd call: ERROR */ +``` + +### 内存泄漏和堆碎片化 + +“内存泄漏”是指动态分配的堆存储变得不再可访问。看一下相关的代码段: + +``` +float* nums = malloc(sizeof(float) * 10); /* 10 floats */ +nums[0] = 3.14f;                          /* and so on */ +nums = malloc(sizeof(float) * 25);        /* 25 new floats */ +``` + +假如第一个 `malloc` 成功,第二个 `malloc` 会再将 `nums` 指针重置为 `NULL`(分配失败情况下)或是新分配的 25 个 `float` 中第一个的地址。最初分配的 10 个 `float` 元素的堆存储仍然处于被分配状态,但此时已无法再对其访问,因为 `nums` 指针要么指向别处,要么是 `NULL`。结果就是造成了 40 个字节(`sizeof(float) * 10`)的泄漏。 + +在第二次调用 `malloc` 之前,应该释放最初分配的存储空间: + +``` +float* nums = malloc(sizeof(float) * 10); /* 10 floats */ +nums[0] = 3.14f;                          /* and so on */ +free(nums);                               /** good **/ +nums = malloc(sizeof(float) * 25);        /* no leakage */ +``` + +即使没有泄漏,堆也会随着时间的推移而碎片化,需要对系统进行碎片整理。例如,假设两个最大的堆块当前的大小分别为 200MB 和 100MB。然而,这两个堆块并不连续,进程 `P` 此时又需要分配 250MB 的连续堆存储。在进行分配之前,系统可能要对堆进行 _碎片整理_ 以给 `P` 提供 250MB 连续存储空间。碎片整理很复杂,因此也很耗时。 + +内存泄漏会创建处于已分配状态但不可访问的堆块,从而会加速碎片化。因此,释放不再需要的堆存储是程序员帮助减少碎片整理需求的一种方式。 + +### 诊断内存泄漏的工具 + +有很多工具可用于分析内存效率和安全性,其中我最喜欢的是 [valgrind][11]。为了说明该工具如何处理内存泄漏,这里给出 `leaky` 示例程序: + +``` +#include +#include + +int* get_ints(unsigned n) { +  int* ptr = malloc(n * sizeof(int)); +  if (ptr != NULL) { +    unsigned i; +    for (i = 0; i < n; i++) ptr[i] = i + 1; +  } +  return ptr; +} + +void print_ints(int* ptr, unsigned n) { +  unsigned i; +  for (i = 0; i < n; i++) printf("%3i\n", ptr[i]); +} + +int main() { +  const unsigned n = 32; +  int* arr = get_ints(n); +  if (arr != NULL) print_ints(arr, n); + +  /** heap storage not yet freed... **/ +  return 0; +} +``` + +`main` 函数调用了 `get_ints` 函数,后者会试着从堆中 `malloc` 32 个 4 字节的 `int`,然后初始化动态数组(如果 `malloc` 成功)。初始化成功后,`main` 函数会调用 `print_ints`函数。程序中并没有调用 `free` 来对应 `malloc` 操作;因此,内存泄漏了。 + +如果安装了 `valgrind` 工具箱,下面的命令会检查 `leaky` 程序是否存在内存泄漏(`%` 是命令行提示符): + +``` +% valgrind --leak-check=full ./leaky +``` + +绝大部分输出都在下面给出了。左边的数字 207683 是正在执行的 `leaky` 程序的进程标识符。这份报告给出了泄漏发生位置的详细信息,本例中位置是在 `main` 函数所调用的 `get_ints` 函数中对 `malloc` 的调用处。 + +``` +==207683== HEAP SUMMARY: +==207683==   in use at exit: 128 bytes in 1 blocks +==207683==   total heap usage: 2 allocs, 1 frees, 1,152 bytes allocated +==207683==  +==207683== 128 bytes in 1 blocks are definitely lost in loss record 1 of 1 +==207683==   at 0x483B7F3: malloc (in /usr/lib/x86_64-linux-gnu/valgrind/vgpreload_memcheck-amd64-linux.so) +==207683==   by 0x109186: get_ints (in /home/marty/gc/leaky) +==207683==   by 0x109236: main (in /home/marty/gc/leaky) +==207683==  +==207683== LEAK SUMMARY: +==207683==   definitely lost: 128 bytes in 1 blocks +==207683==   indirectly lost: 0 bytes in 0 blocks +==207683==   possibly lost: 0 bytes in 0 blocks +==207683==   still reachable: 0 bytes in 0 blocks +==207683==   suppressed: 0 bytes in 0 blocks +``` + +如果把 `main` 函数改成在对 `print_ints` 的调用之后,再加上一个对 `free` 的调用,`valgrind` 就会对 `leaky` 程序给出一个干净的内存健康清单: + +``` +==218462== All heap blocks were freed -- no leaks are possible +``` + +### 静态区存储 + +在正统的 C 语言中,函数必须在所有块之外定义。这是一些 C 编译器支持的特性,杜绝了在另一个函数体内定义一个函数的可能。我举的例子都是在所有块之外定义的函数。这样的函数要么是 `static` ,即静态的,要么是 `extern`,即外部的,其中 `extern` 是默认值。 + +C 语言中,以 `static` 或 `extern` 修饰的函数和变量驻留在内存中所谓的 **静态区** 中,因为在程序执行期间该区域大小是固定不变的。这两个存储类型的语法非常复杂,我们应该回顾一下。在回顾之后,会有一个完整的代码示例来生动展示语法细节。在所有块之外定义的函数或变量默认为 `extern`;因此,函数和变量要想存储类型为 `static` ,必须显式指定: + +``` +/** file1.c: outside all blocks, five definitions  **/ +int foo(int n) { return n * 2; }     /* extern by default */ +static int bar(int n) { return n; }  /* static */ +extern int baz(int n) { return -n; } /* explicitly extern */ + +int num1;        /* extern */ +static int num2; /* static */ +``` + +`extern` 和 `static` 的区别在于作用域:`extern` 修饰的函数或变量可以实现跨文件可见(需要声明)。相比之下,`static` 修饰的函数仅在 _定义_ 该函数的文件中可见,而 `static` 修饰的变量仅在 _定义_ 该变量的文件(或文件中的块)中可见: + +``` +static int n1;    /* scope is the file */ +void func() { +   static int n2; /* scope is func's body */ +   ... +} +``` + +如果在所有块之外定义了 `static` 变量,例如上面的 `n1`,该变量的作用域就是定义变量的文件。无论在何处定义 `static` 变量,变量的存储都在内存的静态区中。 + +`extern` 函数或变量在给定文件中的所有块之外定义,但这样定义的函数或变量也可以在其他文件中声明。典型的做法是在头文件中 _声明_ 这样的函数或变量,只要需要就可以包含进来。下面这些简短的例子阐述了这些棘手的问题。 + +假设 `extern` 函数 `foo` 在 `file1.c` 中 _定义_,有无关键字 `extern` 效果都一样: + +``` +/** file1.c **/ +int foo(int n) { return n * 2; } /* definition has a body {...} */ +``` + +必须在其他文件(或其中的块)中使用显式的 `extern` _声明_ 此函数才能使其可见。以下是使 `extern` 函数 `foo` 在文件 `file2.c` 中可见的声明语句: + +``` +/** file2.c: make function foo visible here **/ +extern int foo(int); /* declaration (no body) */ +``` + +回想一下,函数声明没有用大括号括起来的主体,而函数定义会有这样的主体。 + +为了便于查看,函数和变量声明通常会放在头文件中。准备好需要声明的源代码文件,然后就可以 `#include` 相关的头文件。下一节中的 `staticProg` 程序演示了这种方法。 + +至于 `extern` 的变量,规则就变得更棘手了(很抱歉增加了难度!)。任何 `extern` 的对象——无论函数或变量——必须 _定义_ 在所有块之外。此外,在所有块之外定义的变量默认为 `extern`: + +``` +/** outside all blocks **/ +int n; /* defaults to extern */ +``` + +但是,只有在变量的 _定义_ 中显式初始化变量时,`extern` 才能在变量的 _定义_ 中显式修饰(LCTT 译注:换言之,如果下列代码中的 `int n1;` 行前加上 `extern`,该行就由 _定义_ 变成了 _声明_): + +``` +/** file1.c: outside all blocks **/ +int n1;             /* defaults to extern, initialized by compiler to zero */ +extern int n2 = -1; /* ok, initialized explicitly */ +int n3 = 9876;      /* ok, extern by default and initialized explicitly */ +``` + +要使在 `file1.c` 中定义为 `extern` 的变量在另一个文件(例如 `file2.c`)中可见,该变量必须在 `file2.c` 中显式 _声明_ 为 `extern` 并且不能初始化(初始化会将声明转换为定义): + +``` +/** file2.c **/ +extern int n1; /* declaration of n1 defined in file1.c */ +``` + +为了避免与 `extern` 变量混淆,经验是在 _声明_ 中显式使用 `extern`(必须),但不要在 _定义_ 中使用(非必须且棘手)。对于函数,`extern` 在定义中是可选使用的,但在声明中是必须使用的。下一节中的 `staticProg` 示例会把这些点整合到一个完整的程序中。 + +### staticProg 示例 + +`staticProg` 程序由三个文件组成:两个 C 语言源文件(`static1.c` 和 `static2.c`)以及一个头文件(`static.h`),头文件中包含两个声明: + +``` +/** header file static.h **/ +#define NumCount 100               /* macro */ +extern int global_nums[NumCount];  /* array declaration */ +extern void fill_array();          /* function declaration */ +``` + +两个声明中的 `extern`,一个用于数组,另一个用于函数,强调对象在别处(“外部”)_定义_:数组 `global_nums` 在文件 `static1.c` 中定义(没有显式的 `extern`),函数 `fill_array` 在文件 `static2.c` 中定义(也没有显式的 `extern`)。每个源文件都包含了头文件 `static.h`。`static1.c` 文件定义了两个驻留在内存静态区域中的数组(`global_nums` 和 `more_nums`)。第二个数组有 `static` 修饰,这将其作用域限制为定义数组的文件 (`static1.c`)。如前所述, `extern` 修饰的 `global_nums` 则可以实现在多个文件中可见。 + +``` +/** static1.c **/ +#include +#include + +#include "static.h"             /* declarations */ + +int global_nums[NumCount];      /* definition: extern (global) aggregate */ +static int more_nums[NumCount]; /* definition: scope limited to this file */ + +int main() { +  fill_array(); /** defined in file static2.c **/ + +  unsigned i; +  for (i = 0; i < NumCount; i++) +    more_nums[i] = i * -1; + +  /* confirm initialization worked */ +  for (i = 0; i < NumCount; i += 10)  +    printf("%4i\t%4i\n", global_nums[i], more_nums[i]); +     +  return 0;   +} +``` + +下面的 `static2.c` 文件中定义了 `fill_array` 函数,该函数由 `main`(在 `static1.c` 文件中)调用;`fill_array` 函数会给名为 `global_nums` 的 `extern` 数组中的元素赋值,该数组在文件 `static1.c` 中定义。使用两个文件的唯一目的是凸显 `extern` 变量或函数能够跨文件可见。 + +``` +/** static2.c **/ +#include "static.h" /** declarations **/ + +void fill_array() { /** definition **/ +  unsigned i; +  for (i = 0; i < NumCount; i++) global_nums[i] = i + 2; +} +``` + +`staticProg` 程序可以用如下编译: + +``` +% gcc -o staticProg static1.c static2.c +``` + +### 从汇编语言看更多细节 + +现代 C 编译器能够处理 C 和汇编语言的任意组合。编译 C 源文件时,编译器首先将 C 代码翻译成汇编语言。这是对从上文 `static1.c` 文件生成的汇编语言进行保存的命令: + +``` +% gcc -S static1.c +``` + +生成的文件就是 `static1.s`。这是文件顶部的一段代码,额外添加了行号以提高可读性: + +``` +    .file    "static1.c"          ## line  1 +    .text                         ## line  2 +    .comm    global_nums,400,32   ## line  3 +    .local    more_nums           ## line  4 +    .comm    more_nums,400,32     ## line  5 +    .section    .rodata           ## line  6 +.LC0:                             ## line  7 +    .string    "%4i\t%4i\n"       ## line  8 +    .text                         ## line  9 +    .globl    main                ## line 10 +    .type    main, @function      ## line 11 +main:                             ## line 12 +... +``` + +诸如 `.file`(第 1 行)之类的汇编语言指令以句点开头。顾名思义,指令会指导汇编程序将汇编语言翻译成机器代码。`.rodata` 指令(第 6 行)表示后面是只读对象,包括字符串常量 `"%4i\t%4i\n"`(第 8 行),`main` 函数(第 12 行)会使用此字符串常量来实现格式化输出。作为标签引入(通过末尾的冒号实现)的 `main` 函数(第 12 行),同样也是只读的。 + +在汇编语言中,标签就是地址。标签 `main:`(第 12 行)标记了 `main` 函数代码开始的地址,标签 `.LC0:`(第 7 行)标记了格式化字符串开头所在的地址。 + +`global_nums`(第 3 行)和 `more_nums`(第 4 行)数组的定义包含了两个数字:400 是每个数组中的总字节数,32 是每个数组(含 100 个 `int` 元素)中每个元素的比特数。(第 5 行中的 `.comm` 指令表示 `common name`,可以忽略。) + +两个数组定义的不同之处在于 `more_nums` 被标记为 `.local`(第 4 行),这意味着其作用域仅限于其所在文件 `static1.s`。相比之下,`global_nums` 数组就能在多个文件中实现可见,包括由 `static1.c` 和 `static2.c` 文件翻译成的汇编文件。 + +最后,`.text` 指令在汇编代码段中出现了两次(第 2 行和第 9 行)。术语“text”表示“只读”,但也会涵盖一些读/写变量,例如两个数组中的元素。尽管本文展示的汇编语言是针对 Intel 架构的,但 Arm6 汇编也非常相似。对于这两种架构,`.text` 区域中的变量(本例中为两个数组中的元素)会自动初始化为零。 + +### 总结 + +C 语言中的内存高效和内存安全编程准则很容易说明,但可能会很难遵循,尤其是在调用设计不佳的库的时候。准则如下: + + * 尽可能使用栈存储,进而鼓励编译器将通用寄存器用作暂存器,实现优化。栈存储代表了高效的内存使用并促进了代码的整洁和模块化。永远不要返回指向基于栈的存储的指针。 + * 小心使用堆存储。C(和 C++)中的重难点是确保动态分配的存储尽快解除分配。良好的编程习惯和工具(如 `valgrind`)有助于攻关这些重难点。优先选用自身提供释放函数的库,例如 `nestedHeap` 代码示例中的 `free_all` 释放函数。 + * 谨慎使用静态存储,因为这种存储会自始至终地影响进程的内存占用。特别是尽量避免使用 `extern` 和 `static` 数组。 + +本文 C 语言代码示例可在我的网站()上找到。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/8/memory-programming-c + +作者:[Marty Kalin][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/mkalindepauledu +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/code_computer_development_programming.png?itok=4OM29-82 (Code going into a computer.) +[2]: http://www.opengroup.org/onlinepubs/009695399/functions/fopen.html +[3]: http://www.opengroup.org/onlinepubs/009695399/functions/fclose.html +[4]: http://www.opengroup.org/onlinepubs/009695399/functions/fread.html +[5]: http://www.opengroup.org/onlinepubs/009695399/functions/fwrite.html +[6]: http://www.opengroup.org/onlinepubs/009695399/functions/printf.html +[7]: http://www.opengroup.org/onlinepubs/009695399/functions/puts.html +[8]: http://www.opengroup.org/onlinepubs/009695399/functions/malloc.html +[9]: http://www.opengroup.org/onlinepubs/009695399/functions/fprintf.html +[10]: http://www.opengroup.org/onlinepubs/009695399/functions/free.html +[11]: https://www.valgrind.org/ diff --git a/published/202110/20210818 below- a time traveling resource monitor.md b/published/202110/20210818 below- a time traveling resource monitor.md new file mode 100644 index 0000000000..7212fecec1 --- /dev/null +++ b/published/202110/20210818 below- a time traveling resource monitor.md @@ -0,0 +1,110 @@ +[#]: subject: "below: a time traveling resource monitor" +[#]: via: "https://fedoramagazine.org/below-a-time-traveling-resource-monitor/" +[#]: author: "Daniel Xu https://fedoramagazine.org/author/dxuu/" +[#]: collector: "lujun9972" +[#]: translator: "wxy" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13854-1.html" + +Below:一个时间旅行的资源监控器 +====== + +![](https://img.linux.net.cn/data/attachment/album/202110/06/093522hdsb82nm1cb4b4b6.jpg) + +在这篇文章中,我们将介绍 `below`:一个用于现代 Linux 系统的 Apache 2.0 许可的资源监视器。`below` 可以让你重放以前记录的数据。 + +![][1] + +### 背景 + +内核的主要职责之一是调度对资源的访问。有时这可能意味着分配物理内存,使多个进程可以共享同一主机。其他时候,它可能意味着确保 CPU 时间的公平分配。在这些场景里,内核提供了机制,而将策略留给了“别人”。近来,这个“别人”通常是 systemd 或 dockerd 这样的运行时。运行时接受来自调度器或最终用户的输入(类似于运行什么和如何运行)并在内核上转动正确的旋钮和拉动正确的杠杆,从而使工作负载能够*好好*工作。 + +在一个完美的世界里,故事就到此结束了。然而,现实情况是,资源管理是一个复杂的、相当不透明的技术混合体,在几十年里计算技术不断发展。尽管其中一些技术有各种缺陷和死角,但最终的结果是,容器运作得比较好。虽然用户通常不需要关心这些细节,但对于基础设施运营商来说,对他们的技术架构拥有可见性是至关重要的。可见性和可调试性对于检测和调查错误的配置、问题和系统性故障至关重要。 + +让事情变得更加复杂的是,资源中断往往难以重现。经常需要花费数周时间等待一个问题重新出现,以便调查其根本原因。规模的扩大进一步加剧了这个问题:我们不能在*每台*主机上运行一个自定义脚本,希望在错误再次发生时记录下关键状态的片段。因此,需要更复杂的工具。这就出现了 `below`。 + +### 动机 + +历史上,Facebook 一直是 [atop][5] 的忠实用户。`atop` 是一个用于 Linux 的性能监视器,能够报告所有进程的活动以及各种系统级活动。与 `htop` 等工具相比,`atop` 最引人注目的功能之一是能够作为一个守护程序记录历史数据。这听起来是一个简单的功能,但在实践中,这使得调试无数的生产问题成为可能。有了足够长的数据保留,就有可能在时间上回溯,查看在问题或故障发生之前、期间和之后的主机状态。 + +不幸的是,随着时间的推移,人们发现`atop` 有某些不足之处。首先,[控制组][6]cgroup 已经成为控制和监视 Linux 机器上资源的实际方式。`atop` 仍然缺乏对这一基本构建模块的支持。第二,`atop` 用自定义的 delta 压缩方法在磁盘上存储数据。这在正常情况下运行良好,但在沉重的资源压力下,主机很可能会丢失数据点。由于使用了 delta 压缩,在数据最重要的时间段内,数据可能会大面积丢失。第三,用户体验有一个陡峭的学习曲线。我们经常听到 `atop` 的资深用户说,他们喜欢密集的布局和众多的键盘绑定。然而,这也是一把双刃剑。当一个刚进入这个领域的人想要调试一个生产问题时,他们现在要同时解决两个问题:手头的问题和如何使用 `atop`。 + +`below` 是由 Facebook 的资源控制团队为其设计和开发的,并得到了 `atop` 生产环境用户的支持。顾名思义,资源控制团队负责的是规模化的资源管理。该团队由内核开发人员、容器运行时开发人员和硬件人员组成。认识到下一代系统监控器的机会,我们在设计 `below` 时考虑到以下几点: + + * 易用性:`below` 必须既能为新用户提供直观的体验,又能为日常用户提供强大的功能。 + *有意义的统计数据:`below` 显示准确和有用的统计数据。即便可以,但我们尽量避免收集和倾倒统计数字。 + * 灵活性:当默认设置不合适时,我们允许用户自定义他们的体验。例如包括可配置的键绑定、可配置的默认视图,以及脚本界面(默认为终端用户接口)。 + +### 安装 + +安装该软件包: + +``` +# dnf install -y below +``` + +打开记录守护进程: + +``` +# systemctl enable --now below +``` + +### 快速介绍 + +`below` 最常用的模式是重放模式。顾名思义,重放模式是重放以前记录的数据。假设你已经启动了记录守护程序,那么通过运行以下程序启动一个会话: + +``` +$ below replay --time "5 minutes ago" +``` + +然后你会看到控制组视图: + +![][2] + +如果你不知道该怎么操作,或者忘记了一个键位,按 `?` 可以进入帮助菜单。 + +屏幕的最上方是状态栏。状态栏显示关于当前样本的信息。你可以通过按 `t` 和 `T` 分别向前和向后移动样本。中间的部分是系统概览。系统概览包含了关于整个系统的统计数据,一般来说,这些数据总是很有用的。第三部分也是最下面的部分是多用途视图。上面的图片显示了控制组视图。此外,还有进程和系统视图,分别通过按 `p` 和` s` 来访问。 + +按 `↑` 和 `↓` 来移动列表选择。按回车键来折叠和展开控制组。假设你发现了一个感兴趣的控制组,你想看看它里面有哪些进程在运行。要放大进程视图,选择控制组并按 `z`: + +![][3] + +再按 `z` 返回到控制组视图。这个视图有时会有点长。如果你对你要找的东西有一个模糊的概念,你可以通过按 `/` 并输入一个过滤器来过滤控制组名称。 + +![][4] + +在这一点上,你可能已经注意到了一个我们还没有探索过的标签系统。要在标签中向前和向后循环,可以分别按 `Tab` 和 `Shift` + `Tab`。我们把这个问题留给读者去做练习。 + +### 其他功能 + +在底层,`below` 有一个强大的设计和架构。Facebook 正在不断升级到更新的内核,所以我们从不假设数据源是可用的。这种默契的假设使得内核和 `below `版本之间能够完全向前和向后兼容。此外,每个数据点都用 zstd 压缩并完整地存储。这解决了我们看到的 `atop` 在大规模时的 delta 压缩问题。根据我们的测试,我们的每个样本压缩可以达到平均 5 倍的压缩率。 + +`below` 也使用 [eBPF][8] 来收集关于短暂进程(生存时间短于数据收集间隔的进程)的信息。相比之下,`atop` 使用 BSD 进程核算来实现这一功能,这是一个已知缓慢且容易发生优先级转换的内核接口。 + +对于用户来说,`below` 还支持实时模式和一个转储接口。实时模式将记录守护程序和 TUI 会话合并到一个进程中。这对于浏览系统状态是很方便的,不需要为数据存储投入长期运行的守护程序或磁盘空间。转储接口是一个可编写脚本的接口,用于所有的 `below` 数据存储。转储既强大又灵活,详细的数据以 CSV、JSON 和人类可读格式提供。 + +### 总结 + +`below` 是一个 Apache 2.0 许可的开源项目,我们(`below` 的开发者)认为它比资源监控领域的现有工具具有引人注目的优势。我们已经花了大量的精力来准备 `below`,以提供开源使用,所以我们希望读者和社区有机会尝试 `below`,并报告错误和功能要求。 + +-------------------------------------------------------------------------------- + +via: https://fedoramagazine.org/below-a-time-traveling-resource-monitor/ + +作者:[Daniel Xu][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/dxuu/ +[b]: https://github.com/lujun9972 +[1]: https://fedoramagazine.org/wp-content/uploads/2021/08/below_resource_monitor-816x345.jpg +[2]: https://fedoramagazine.org/wp-content/uploads/2021/08/image-1024x800.png +[3]: https://fedoramagazine.org/wp-content/uploads/2021/08/image-1-1024x800.png +[4]: https://fedoramagazine.org/wp-content/uploads/2021/08/image-2-1024x800.png +[5]: +[6]: +[7]: \ No newline at end of file diff --git a/published/202110/20210907 How to use BusyBox on Linux.md b/published/202110/20210907 How to use BusyBox on Linux.md new file mode 100644 index 0000000000..3b2744163a --- /dev/null +++ b/published/202110/20210907 How to use BusyBox on Linux.md @@ -0,0 +1,181 @@ +[#]: subject: "How to use BusyBox on Linux" +[#]: via: "https://opensource.com/article/21/8/what-busybox" +[#]: author: "Seth Kenlon https://opensource.com/users/seth" +[#]: collector: "lujun9972" +[#]: translator: "wxy" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13840-1.html" + +如何在 Linux 上使用 BusyBox +====== + +> BusyBox 是一个开源(GPL)项目,提供了近 400 个常用命令的简单实现。 + +![](https://img.linux.net.cn/data/attachment/album/202110/01/185208x6ckkmvi0silk3vk.jpg) + +我们很容易认为 Linux 的命令是理所当然的。当你安装 Linux 时,它们与系统捆绑在一起,而我们常常不问为什么它们会在那里。一些基本的命令,如 [cd][2]、[kill][3] 和 echo,并不总是独立的应用程序,而是实际上内置于你的 shell 中。其他如 [ls][4]、[mv][5] 和 [cat][6] 是核心工具包(通常是 GNU `coreutils`)的一部分。但在开源的世界里,总是有一些替代品,其中最有趣的是 [BusyBox][7]。 + +### Linux 中的 BusyBox 简介 + +BusyBox 是一个开源(GPL)项目,提供近 400 个常用命令的简单实现,包括 `ls`、`mv`、`ln`、`mkdir`、`more`、`ps`、`gzip`、`bzip2`、`tar` 和 `grep`。它还包含了编程语言 `awk`、流编辑器 `sed`、文件系统检查工具 `fsck`、`rpm` 和 `dpkg` 软件包管理器,当然还有一个可以方便的访问所有这些命令的 shell(`sh`)。简而言之,它包含了所有 POSIX 系统需要的基本命令,以执行常见的系统维护任务以及许多用户和管理任务。 + +事实上,它甚至包含一个 `init` 命令,可以作为 PID 1 启动,以作为所有其它系统服务的父进程。换句话说,BusyBox 可以作为 [systemd][8]、OpenRC、sinit、init 和其他初始化系统的替代品。 + +BusyBox 非常小。作为一个可执行文件,它不到 1MB,所以它在 [嵌入式][9]、[边缘计算][10] 和 [物联网][11] 领域很受欢迎,因为这些场景的存储空间是很宝贵的。在容器和云计算的世界里,它作为精简的 Linux 容器镜像的基础镜像也很受欢迎。 + +### 极简主义 + +BusyBox 的部分魅力在于它的极简主义。它的所有命令都被编译到一个二进制文件里(`busybox`),它的手册只有 81 页(根据我对 `man` 送到 `pr` 管道的计算),但它涵盖了近 400 条命令。 + +作为一个例子的比较,这是 “原版” 的 `useradd —help` 的输出: + +``` + -b, --base-dir BASE_DIR       base directory for home + -c, --comment COMMENT         GECOS field of the new account + -d, --home-dir HOME_DIR       home directory of the new account + -D, --defaults                print or change the default config + -e, --expiredate EXPIRE_DATE  expiration date of the new account + -f, --inactive INACTIVE       password inactivity + -g, --gid GROUP               name or ID of the primary group + -G, --groups GROUPS           list of supplementary groups + -h, --help                    display this help message and exit + -k, --skel SKEL_DIR           alternative skeleton dir + -K, --key KEY=VALUE           override /etc/login.defs + -l, --no-log-init             do not add the user to the lastlog + -m, --create-home             create the user's home directory + -M, --no-create-home          do not create the user's home directory + -N, --no-user-group           do not create a group with the user's name + -o, --non-unique              allow users with non-unique UIDs + -p, --password PASSWORD       encrypted password of the new account + -r, --system                  create a system account + -R, --root CHROOT_DIR         directory to chroot into + -s, --shell SHELL             login shell of the new account + -u, --uid UID                 user ID of the new account + -U, --user-group              create a group with the same name as a user +``` + +而这是是同一命令的 BusyBox 版本: + +``` + -h DIR    Home directory + -g GECOS  GECOS field + -s SHELL  Login shell + -G GRP    Group + -S            Create a system user + -D            Don't assign a password + -H            Don't create home directory + -u UID    User id + -k SKEL   Skeleton directory (/etc/skel) +``` + +这种差异是一种特性还是一种限制,取决于你是喜欢你的命令拥有 20 个选项还是 10 个选项。对于一些用户和某些用例来说,BusyBox 的极简主义刚刚满足所需。对于其他人来说,它是一个很好的最小化环境,可以作为一个后备工具,或者作为安装更强大的工具的基础,比如 [Bash][12]、[Zsh][13]、GNU [Awk][14] 等等。 + +### 安装 BusyBox + +在 Linux 上,你可以使用你的软件包管理器安装 BusyBox。例如,在 Fedora 及类似发行版: + +``` +$ sudo dnf install busybox +``` + +在 Debian 及其衍生版: + +``` +$ sudo apt install busybox +``` + +在 MacOS 上,可以使用 [MacPorts][15] 或 [Homebrew][16]。在 Windows 上,可以使用 [Chocolatey][17]。 + +你可以将 BusyBox 设置为你的 shell,使用 `chsh —shell` 命令,然后再加上 BusyBox `sh` 应用程序的路径。我把 BusyBox 放在 `/lib64` 中,但它的位置取决于你的发行版的安装位置。 + +``` +$ which busybox +/lib64/busybox/busybox +$ chsh --shell /lib64/busybox/sh +``` + +用 BusyBox 全盘替换所有常见的命令要复杂一些,因为大多数发行版都是“硬接线”,会在特定的软件包寻找特定的命令。换句话说,虽然技术上可以用 BusyBox 的 `init` 替换系统的 `init`,但你的软件包管理器可能会拒绝让你删除包含 `init` 的软件包,以免你担心删除会导致系统无法启动。有一些发行版是建立在 BusyBox 之上的,所以从新环境开始可能是体验 BusyBox 系统的最简单方法。 + +### 试试 BusyBox + +你不必为了尝试 BusyBox 而将你的 shell 永久改为 BusyBox。你可以从你当前的 shell 中启动一个 BusyBox shell。 + +``` +$ busybox sh +~ $ +``` + +不过你的系统仍然有安装的非 BusyBox 版本的命令,所以要体验 BusyBox 的工具,你必须把命令作为参数发给 `busybox` 可执行文件: + +``` +~ $ busybox echo $0 +sh +~ $ busybox ls --help +BusyBox vX.YY.Z (2021-08-25 07:31:48 NZST) multi-call binary. + +Usage: ls [-1AaCxdLHRFplinshrSXvctu] [-w WIDTH] [FILE]... + +List directory contents + + -1  One column output + -a  Include entries that start with . + -A  Like -a, but exclude . and .. + -x  List by lines +[...] +``` + +为了获得“完整”的 BusyBox 体验,你可以为每个命令创建一个 `busybox` 的符号链接。这很容易,只要你使用 [for 循环][18] 就行: + +``` +$ mkdir bbx +$ for i in $(bbx --list); do \ + ln -s /path/to/busybox bbx/$i \ +done +``` + +在你的 [路径][19] 的 _开头_ 添加这个符号链接目录,并启动 BusyBox: + +``` +$ PATH=$(pwd)/bbx:$PATH bbx/sh +``` + +### 用起来 + +BusyBox 是一个有趣的项目,也是一个可以实现 _极简_ 计算的例子。无论你是把 BusyBox 作为 [你唤醒的][21] [古老的计算机][20] 的轻量级环境,还是作为 [嵌入式设备][22] 的用户界面,抑或试用一个新的初始化系统,就算是为了好奇,让自己重新认识那些熟悉而又陌生的命令,都会很有意思。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/8/what-busybox + +作者:[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/lead-images/bash_command_line.png?itok=k4z94W2U (bash logo on green background) +[2]: https://opensource.com/article/21/8/navigate-linux-directories +[3]: https://opensource.com/article/18/5/how-kill-process-stop-program-linux +[4]: https://opensource.com/article/19/7/master-ls-command +[5]: https://opensource.com/article/19/8/moving-files-linux-depth +[6]: https://opensource.com/article/19/2/getting-started-cat-command +[7]: https://www.busybox.net +[8]: https://opensource.com/article/20/4/systemd +[9]: https://opensource.com/article/21/3/rtos-embedded-development +[10]: https://opensource.com/article/17/9/what-edge-computing +[11]: https://opensource.com/article/21/3/iot-measure-raspberry-pi +[12]: https://opensource.com/article/20/4/bash-sysadmins-ebook +[13]: https://opensource.com/article/19/9/getting-started-zsh +[14]: https://opensource.com/article/20/9/awk-ebook +[15]: https://opensource.com/article/20/11/macports +[16]: https://opensource.com/article/20/6/homebrew-mac +[17]: https://opensource.com/article/20/3/chocolatey +[18]: https://opensource.com/article/19/10/programming-bash-loops +[19]: https://opensource.com/article/17/6/set-path-linux +[20]: https://opensource.com/article/20/2/restore-old-computer-linux +[21]: https://opensource.com/article/19/7/how-make-old-computer-useful-again +[22]: https://opensource.com/article/20/6/open-source-rtos diff --git a/published/202110/20210911 Play with model trains in OpenTTD.md b/published/202110/20210911 Play with model trains in OpenTTD.md new file mode 100644 index 0000000000..d07f1699f9 --- /dev/null +++ b/published/202110/20210911 Play with model trains in OpenTTD.md @@ -0,0 +1,200 @@ +[#]: subject: "Play with model trains in OpenTTD" +[#]: via: "https://opensource.com/article/21/9/model-trains-openttd" +[#]: author: "Seth Kenlon https://opensource.com/users/seth" +[#]: collector: "lujun9972" +[#]: translator: "unigeorge" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13924-1.html" + +在 OpenTTD 中玩模型火车 +====== + +> 想玩实体模型火车,却没有足够大的空间?试试 OpenTTD 中的虚拟火车吧。 + +![](https://img.linux.net.cn/data/attachment/album/202110/27/100255emc3x33icci0cacc.jpg) + +我父亲一直很喜欢火车模型,我记得我小时候,曾看着他在圣诞树周围建了一整条轨道。当 [乐高][2] 火车套装发布时,因其便利性和固有可扩展性,我们转而投向了乐高火车的怀抱。多年来,我们热衷于建造和改装乐高火车及单轨轨道。我经常想象,未来我会有一个车库或地下室,专门用于微型景观和电动汽笛火车。强调一下,我沉迷于另一个爱好的可能性非常低,所以当发现 _虚拟_ 模型铁路可以为我提供相同的满足感时,我很开心。我的虚拟爱好引擎是 [OpenTTD][3],这是一款基于名为 **Transport Tycoon Deluxe** 的 90 年代老游戏的开源模拟游戏。 + +### 安装 OpenTTD + +你可以在 [openttd.org/downloads][4] 下载适用于 Linux、macOS 和 Windows 的 OpenTTD。 + +如果你正使用 Debian Linux 或其衍生产品,甚至是[在使用 Chromebook][5],你可以下载 `.deb` 包。使用 `apt` 命令安装它: + +``` +$ sudo apt install ./openttd*deb +``` + +如果你在使用其他 Linux 发行版,请下载通用安装程序,并使用 [tar 命令][6]解压缩包: + +``` +$ tar xvf openttd-x.yy.z-linux*.tar.xz +``` + +OpenTTD 已经在 Linux、macOS 和 Windows 的 [Steam][7] 中上架(Steam 是一个非开源的,但是很常见的跨平台游戏客户端)。 + +### 启动 OpenTTD + +如果你安装了 OpenTTD,可以从应用程序菜单启动它。 + +如果你是下载了通用包,可以切换到游戏目录,使用本地的 `openttd` 命令启动游戏: + +``` +$ cd openttd* +$ ./openttd & +``` + +首次启动 OpenTTD 时,游戏会提示必须下载图像集,在 Steam 版中会自动安装,但在独立应用程序中需要单击一下鼠标。无论如何,因为 OpenTTD 是开源的,经过了很好的改进,所以在默认图像之外,你最终还会下载的还有很多其他图像。 + +下载图像集后,你会看到一个古色古香的小型界面。我觉得 640x480 的界面有点小,虽然旧图像界面确实更有年代感(那时计算能力还比较弱),但一些适配现代屏幕的轻度升级还是很好用的。因此,你的第一步操作就是点击“检查在线内容Check online content”按钮。 + +### 加载模组 + +“内容下载Content downloading”界面是一个查看已通过审查的 OpenTTD 模组mod的窗口,可以提供个性化的改进图像界面、全新音乐、火车模型和地图名称。我使用了新西兰全套配置,所以对我来说,生成的所有城市都很熟悉,尽管 2020 年我转而开始使用“辐射 3”套装了。模组 _非常多_,可以使用右上角的搜索栏来缩小选择范围。 + +下面是一些个人认为必备的模组: + + * **abase** - 高分辨率图像。将近 300 MB,这可能是你玩此游戏需要的最大一次下载(游戏本身只有 50 MB)。 + * **OpenSFX** - 一个声音合集。让你能听到城市中的交通声、船运的喇叭声以及很棒的火车汽笛声。 + * **Town names** - 城镇名称。默认的城市名称很有趣,但我认为记一些本地化的名称更容易。 + * **Trains** - 火车模组。OpenTTD 有一组运行良好的默认火车模型,但如果你已经是一名火车观察员,那你可能会喜欢下载一些额外的火车模型。我使用的是 NZR 火车合集,但还有很多火车也是可用的,包括来自英国、美国、奥地利、比利时、捷克共和国的车,以及按字母表顺序排列的许多其他火车。 + * **Beginner tutorial** - 新手教程。是一个帮你学习游戏及界面的引导场景。 + +### 游戏引擎默认值 + +下载新素材后,你需要将它们设置为默认值。有两个设置的地方:游戏引擎默认值、游戏内脚本与素材。 + +![OpenTTD main menu][8] + +*OpenTTD 菜单(Seth Kenlon, [CC BY-SA 4.0][9])* + +单击“游戏选项Game Options”按钮。 在游戏选项屏幕中,调整以下设置: + + * 将屏幕分辨率screen resolution设置为你喜欢的界面尺寸。 + * 将基础图像集 base graphics set设置为 **abase**。 + * 将基础声音设置base sounds set设置为 **OpenSFX**。 + +关闭游戏选项屏幕。你的改动会自动保存。 + +### 游戏选项 + +在主菜单界面,单击“NewGRF 设置NewGRF Settings”按钮。 + +![NewGRF settings window][10] + +*NewGRF 设置菜单(Seth Kenlon, [CC BY-SA 4.0][9])* + +未活动的模组显示在 NewGRF 设置窗口的下半部分。要激活一个未活动的模组,请选择它并单击左下角的“添加Add”按钮。选择要激活的模组后,再单击“应用Apply”按钮。 + +### 教程 + +如果你下载了“初学者教程Beginner tutorial”场景,可以通过它来学习 OpenTTD。开始教程请单击主菜单屏幕顶部附近的“播放场景Play scenario” 按钮,然后选择该教程并开始。 + +初学者教程有着游戏界面的完整浏览流程,全部完成需要花费一些时间。 + +### 快速开始 + +现在我们快速介绍一下,此处你要了解以下内容:车辆出自仓库,一切活动都需要时间表。记住这两条规则,你可以立即开始建造火车(以及道路、海港和机场)。 + +#### 建造车站 + +要在两个城市之间建立一条简单的铁路线,请单击顶部图标栏中的铁路轨道图标。 + +![New icon bar - railway option][11] + +*新建图标栏——铁路选项(Seth Kenlon, [CC BY-SA 4.0][9])* + +铁路以车站开始和结束,所以我通常在预定线路的两端各放置一个车站。单击火车站图标(将鼠标悬停在其上方可查看其标签)。一个火车站要服务于一个地区,其作用范围必须与该地区尽量多地重叠。要查看车站的覆盖范围,请通过单击车站对话框底部的“开启On”按钮以启用覆盖区域高亮Coverage area highlight功能。 + +![Station coverage window][12] + +*车站覆盖信息窗口(Seth Kenlon, [CC BY-SA 4.0][9])* + +黑色网格表示覆盖范围,而白色网格显示车站的物理占据范围。当你将鼠标悬停在一个区域上时,车站的覆盖范围所需耗材会在弹出窗口中列出。从简单的开始,创建一个单轨 4 辆车的站台。在地图上的两个城市之间重复执行此操作两次。 + +![create station menu][13] + +*创建车站菜单(Seth Kenlon, [CC BY-SA 4.0][9])* + +### 铺设铁轨 + +接下来,用铁轨连接车站。 OpenTTD 的等距视图需要一些时间来适应,但是在单击铁路图标并在地图上单击拖动之后,你就开始大概有所了解了。X-rail 图标提供了“自动轨道”模式,该模式会根据用户单击的方块位置对齐轨道。 + +铺设导轨时要细心。OpenTTD 是不可撤回的,所以一旦点击一个正方形,轨道就会被构造出来。你必须使用炸药图标来移除导轨。和现实生活中一样,没有撤消按钮。 + +### 火车车库 + +火车来自车库depot。因此,要在铁路上添加火车,必须在沿线的某处添加一个车库。单击车库图标并在现有铁路附近放置。将车库连接到现有轨道,以确保你的火车可以从车库到达适当线路的(在此简单示例中,线路是唯一的)。 + +![create depot menu][14] + +*建造车库菜单(Seth Kenlon, [CC BY-SA 4.0][9])* + +### 模型火车 + +终于,你可以将虚拟模型火车添加到虚拟铁路中了。要创建火车,请单击车库。 + +单击站点窗口底部的“新建车辆New Vehicle”按钮,会列出可用的火车引擎和汽车。列表会部分取决于你从可下载内容中添加的模型。一般来说,发动机分为三种:蒸汽发动机、柴油发动机和电动发动机。游戏内时间从 1950 年开始,所以早期你只有蒸汽可选。随着时间推进,你会获得可用于升级的创新型新模型。 + +![create train menu][15] + +*创建火车菜单(Seth Kenlon, [CC BY-SA 4.0][9])* + +现在创建一个简单的火车,其中包括一节引擎、一节客车和一节邮车。如果想添加其他类型的车厢,请单击站点以确认它们的可提供车型(由其覆盖区域决定) + +### 创建火车时刻表 + +现在有了铁路和火车,还需要创建一个火车时刻表。时间表与车辆关联,因此无论何时添加新车,都要记得添加时间表,以让新车投入使用。 + +要为火车添加时刻表,请单击其车库列表中列车左侧的编号。这样可以打开火车视口,窗口右侧会有按钮。单击箭头图标即可查看该列车的时刻表。 + +![create schedule menu][16] + +*创建时刻表菜单(Seth Kenlon, [CC BY-SA 4.0][9])* + +要创建时间表,请单击时间表窗口底部的“前往Go To”按钮,然后单击要设置成第一个目的地的车站。然后点击下一站。你可以在时间表中选择一个停靠点,浏览“满载Full load”和“卸载Unload”下拉菜单中的选项,以此调整装卸要求,并且可以在“无停靠Non-stop”下拉菜单中调整路线(如果开发了新路线)。选项有很多,随着城市发展和地图完善,你可能需要随时调整策略。 + +但是现在,单击火车视口底部的红色“已停止Stopped”按钮,让火车投入使用吧! + +![train moving from station to station][17] + +*在役中的火车(Seth Kenlon, [CC BY-SA 4.0][9])* + +### 试试 OpenTTD 吧 + +OpenTTD 是一个模拟器,同时也是一个游戏,所以确实会有一些限制,比如你可能想要优化的预算和参数。例如,你可以单击一个城市、农场或工厂,了解其可接受的进出口类型。你可以通过单击 OpenTTD 窗口右下角的预算按钮来借钱。它不仅仅是一个虚拟的火车集合游戏。你还可以建造道路、机场、海港等。记得所有车辆都需要车库和时间表,你就在实现虚拟企业的路上成功了一半。 + +OpenTTD 有着活跃而热情的社区,以及[详细的维基][18],并且有大量的资源和教程在线可用。下载游戏并试试吧! + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/9/model-trains-openttd + +作者:[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/train-plane-speed-big-machine.png?itok=f377dXKs (Old train) +[2]: https://opensource.com/article/20/6/open-source-virtual-lego +[3]: http://openttd.org +[4]: https://www.openttd.org/downloads/openttd-releases/latest.html +[5]: https://opensource.com/article/21/2/chromebook-linux +[6]: https://opensource.com/article/17/7/how-unzip-targz-file +[7]: https://store.steampowered.com/app/1536610/OpenTTD/ +[8]: https://opensource.com/sites/default/files/openttd-menu.jpg (OpenTTD menu) +[9]: https://creativecommons.org/licenses/by-sa/4.0/ +[10]: https://opensource.com/sites/default/files/openttd-newgrf.jpg (The NewGRF settings menu) +[11]: https://opensource.com/sites/default/files/openttd-iconbar-railway.jpg (The new icon bar - railway option) +[12]: https://opensource.com/sites/default/files/openttd-window-station.jpg (Station coverage information window) +[13]: https://opensource.com/sites/default/files/openttd-create-station.jpg (The create station menu) +[14]: https://opensource.com/sites/default/files/openttd-create-depot.jpg (Create depot menu) +[15]: https://opensource.com/sites/default/files/openttd-create-train.jpg (The create train menu) +[16]: https://opensource.com/sites/default/files/openttd-create-schedule.png (The create schedule menu) +[17]: https://opensource.com/sites/default/files/openttd-train.jpg (Train in service) +[18]: https://wiki.openttd.org/en/ diff --git a/published/202110/20210922 Install AnyDesk on Ubuntu Linux -GUI and Terminal Methods.md b/published/202110/20210922 Install AnyDesk on Ubuntu Linux -GUI and Terminal Methods.md new file mode 100644 index 0000000000..2820edd9a1 --- /dev/null +++ b/published/202110/20210922 Install AnyDesk on Ubuntu Linux -GUI and Terminal Methods.md @@ -0,0 +1,151 @@ +[#]: subject: "Install AnyDesk on Ubuntu Linux [GUI and Terminal Methods]" +[#]: via: "https://itsfoss.com/install-anydesk-ubuntu/" +[#]: author: "Abhishek Prakash https://itsfoss.com/author/abhishek/" +[#]: collector: "lujun9972" +[#]: translator: "geekpi" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13839-1.html" + +在 Ubuntu Linux 上安装 AnyDesk +====== + +> 这个初学者的教程讨论了在基于 Ubuntu 的 Linux 发行版上安装 AnyDesk 的 GUI 和终端方法。 + +![](https://img.linux.net.cn/data/attachment/album/202110/01/165758y9aaiix7yu88ayui.jpg) + +[AnyDesk][1] 是一个流行的远程桌面软件,可用于 Linux、Windows、BSD、macOS 和移动平台。 + +有了 AnyDesk,你可以用它远程访问其他电脑,或者让别人远程访问你的系统。不是每个人都可以访问它,因为需要两台设备都使用 AnyDesk。你必须接受传入的连接和/或提供一个安全连接的密码。 + +这对于向朋友、家人、同事甚至客户提供技术支持很有帮助。 + +在本教程中,我将向你展示在 Ubuntu 上安装 AnyDesk 的图形和命令行两种方法。你可以根据自己的喜好使用这两种方法。这两种方法都会在你的 Ubuntu 系统上安装相同的 AnyDesk 版本。 + +同样的方法应该适用于 Debian 和其他基于 Debian 和 Ubuntu 的发行版,如 Linux Mint,Linux Lite 等。 + +> **非 FOSS 警告!** +> +> AnyDesk 不是开源软件。这里涉及它是因为它在 Linux 上可用,而文章的重点是 Linux。 + +### 方法 1:使用终端在 Ubuntu 上安装 AnyDesk + +在你的系统上 [打开终端程序][2]。你需要一个像 `wget` 这样的工具来 [在终端下载文件][3],使用以下命令: + +``` +sudo apt update +sudo apt install wget +``` + +下一步是下载 AnyDesk 仓库的 GPG 密钥,并将其添加到你的系统的可信密钥中。这样,你的系统就会信任来自这个[外部仓库][4]的软件。 + +``` +wget -qO - https://keys.anydesk.com/repos/DEB-GPG-KEY | sudo apt-key add - +``` + +你可以暂时忽略关于 `apt-key` 命令的废弃警告。下一步是将 AnyDesk 仓库添加到系统的仓库源中: + +``` +echo "deb http://deb.anydesk.com/ all main" | sudo tee /etc/apt/sources.list.d/anydesk-stable.list +``` + +更新包缓存,这样你的系统就能通过新添加的仓库了解到新应用的可用性。 + +``` +sudo apt update +``` + +现在,你可以安装 AnyDesk 了: + +``` +sudo apt install anydesk +``` + +完成后,你可以从系统菜单或从终端本身启动 AnyDesk: + +``` +anydesk +``` + +你现在可以享受 AnyDesk 了。 + +![AnyDesk running in Ubuntu][5] + +### 方法 2:在 Ubuntu 上以图形方式安装 AnyDesk + +如果你不习惯使用命令行,不用担心。你也可以不进入终端安装 AnyDesk。 + +你可以从 AnyDesk 官网下载 Ubuntu 上的 AnyDesk: + +- [下载 Linux 上的 Anydesk][6] + +你会看到一个“Download Now”的按钮。点击它。 + +![Download AnyDesk][7] + +当你点击下载按钮时,它会给你提供各种 Linux 发行版的选项。选择 Ubuntu 的那个: + +![Download the appropriate file][8] + +它将下载 AnyDesk 的 DEB 文件。[安装 DEB 文件][9]很简单。要么双击它,要么右击并使用软件安装打开。 + +![Right click on deb file and open with software center][10] + +软件中心应用将被打开,你可以在那里安装它。 + +![Installing AnyDesk in Ubuntu software center][11] + +安装后,在系统菜单中搜索它并从那里开始。 + +![AnyDesk installed in Ubuntu][12] + +这就好了。不是太难,是吗? + +我不打算展示使用 AnyDesk 的步骤。我想你已经对这个问题有了一些了解。如果没有,请参考 [这篇文章][13]。 + +#### 故障排除提示 + +当我试图从系统菜单中运行 AnyDesk 时,它没有启动。于是,我从终端启动它,它显示了这个错误: + +``` +[email protected]:~$ anydesk +anydesk: error while loading shared libraries: libpangox-1.0.so.0: cannot open shared object file: No such file or directory +``` + +如果你看到 “[error while loading shared libraries][14]” 信息,你要安装它所报错的软件包。在我的例子中,我是这样做的: + +``` +sudo apt install libpangox-1.0-0 +``` + +这解决了我的问题,我希望它也能为你解决。 + +如果你有任何与此主题相关的问题,请在评论区告诉我。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/install-anydesk-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://anydesk.com/en +[2]: https://itsfoss.com/open-terminal-ubuntu/ +[3]: https://itsfoss.com/download-files-from-linux-terminal/ +[4]: https://itsfoss.com/adding-external-repositories-ubuntu/ +[5]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/09/anydesk-running-in-ubuntu.png?resize=800%2C418&ssl=1 +[6]: https://anydesk.com/en/downloads/linux +[7]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/09/any-desk-ubuntu-download.webp?resize=800%2C312&ssl=1 +[8]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/09/any-desk-ubuntu-download-1.webp?resize=800%2C427&ssl=1 +[9]: https://itsfoss.com/install-deb-files-ubuntu/ +[10]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/09/install-anaydesk-ubuntu.png?resize=800%2C403&ssl=1 +[11]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/09/installing-anydesk-in-ubuntu-software-center.png?resize=781%2C405&ssl=1 +[12]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/09/anydesk-installed-in-ubuntu.png?resize=759%2C196&ssl=1 +[13]: https://support.anydesk.com/Access +[14]: https://itsfoss.com/solve-open-shared-object-file-quick-tip/ diff --git a/published/202110/20210923 Build your website with Jekyll.md b/published/202110/20210923 Build your website with Jekyll.md new file mode 100644 index 0000000000..b0b5ccd10d --- /dev/null +++ b/published/202110/20210923 Build your website with Jekyll.md @@ -0,0 +1,173 @@ +[#]: subject: "Build your website with Jekyll" +[#]: via: "https://opensource.com/article/21/9/build-website-jekyll" +[#]: author: "Ayush Sharma https://opensource.com/users/ayushsharma" +[#]: collector: "lujun9972" +[#]: translator: "perfiffer" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13875-1.html" + +使用 Jekyll 构建你的网站 +====== + +> Jekyll 是一个开源的静态网站生成器。你可以使用 Markdown 编写内容,使用 HTML/CSS 来构建和展示,Jekyll 会将其编译为静态的 HTML。 + +![](https://img.linux.net.cn/data/attachment/album/202110/12/145349rblj459naj74j5nr.jpg) + +近年来开始流行静态网站生成器和 JAMStack,而且理由很充分,它们不需要复杂的后端,只需要静态的 HTML、CSS 和 Javascript。没有后端意味着更好的安全性、更低的运营开销和更便宜的托管。双赢! + +在本文中,我将讨论 Jekyll。在撰写本文时,[我的个人网站使用的是 Jekyll][2]。Jekyll 使用 Ruby 引擎将用 Markdown 编写的文章转换成 HTML。[Sass][3] 可以将复杂的 CSS 规则应用到普通文本文件中。[Liquid][4] 允许对静态内容进行编程控制。 + +### 安装 Jekyll + +[Jekyll 网站][5] 提供了 Linux、MacOS 和 Windows 安装说明。安装完成之后,[快速引导][6] 将会安装一个基础的 Hello-World 项目。 + +现在在你的浏览器访问 `http://localhost:4000`,你可以看到你的默认“真棒”博客。 + +![Default "awesome" blog][7] + +### 目录结构 + +这个默认站点包含以下的文件和文件夹: + + * `_posts`: 你的博客文章。 + * `_site`: 最终编译成的静态网站文件。 + * `about.markdown`: “关于页”的内容。 + * `index.markdown`: “主页”的内容。 + * `404.html`: “404 页”的内容。 + * `_config.yml`: Jekyll 的全站配置文件。 + +### 创建新的博客帖子 + +创建帖子很简单。你需要做的就是在 `_post` 目录下使用正确的格式和扩展名创建一个新文件,这样就完成了。 + +有效的文件名像 `2021-08-29-welcome-to-jekyll.markdown` 这样。一个博客文件必须包含 Jekyll 所谓的 YAML 卷首块Front Matter。它是文件开头的一个包含元数据的特殊部分。如果你查看默认的帖子,你可以看到以下内容: + +``` +--- +layout: post +title: "Welcome to Jekyll!" +date:  2021-08-29 11:28:12 +0530 +categories: jekyll update +--- +``` + +Jekyll 会使用上面的元数据,你也可以自定义 `key: value` 键值对。如果你需要一些提示,[请查看我的网站的卷首][9]。除了前面的问题,你还可以 [使用内置的 Jekyll 变量][10] 来自定义你的网站。 + +让我们创建一个新的帖子。在 `_posts` 文件夹下创建 `2021-08-29-ayushsharma.markdown`。内容如下: + +``` +--- +layout: post +title:  "Check out ayushsharma.in!" +date:   2021-08-29 12:00:00 +0530 +categories: mycategory +--- +This is my first post. + +# This is a heading. + +## This is another heading. + +This is a [link]() + +This is my category: +``` + +如果 `jekyll serve` 命令仍在运行,刷新页面,你将看到下面的新帖子。 + +![New blog entry][11] + +恭喜你创建了你的第一篇帖子!这个过程看起来很简单,但是你可以通过 Jekyll 做很多事情。使用简单的 Markdown,你可以归档博客、高亮显示代码片段以及分类管理帖子。 + +### 草稿 + +如果你还没准备好发布你的内容,你可以创建一个 `_drafts` 文件夹。此文件夹中的 Markdown 文件仅通过传递 `--drafts--` 参数来呈现。 + +### 布局和包含 + +请注意 `_post` 文件夹中两篇文章的卷首块,你将在其中看到 `layout: post`。`_layout` 文件夹中包含所有布局。你不会在源代码中找到它们,因为 Jekyll 默认加载它们。Jekyll 使用的默认源代码在 [这里][12]。如果你点击该链接,你可以看到 `post` 的布局使用了默认(`default`)布局。默认布局包含的代码 `{{ content }}` 是注入内容的地方。布局文件还将包含 `include` 指令。它们从 [`include` 文件夹][14] 加载文件,并使用不同的组件组成页面。 + +总的来说,这就是布局的工作方式:你在卷首块定义它们并将你的内容注入其中。而包含则提供了页面的其它部分以组成整个页面。这是一种标准的网页设计技术:定义页眉、页脚、旁白和内容元素,然后在其中注入内容。这就是静态站点生成器的真正威力,完全以编程的方式控制,将你的网站组装起来并最终编译成静态的 HTML。 + +### 页面 + +你网站上的所有内容并不都是文章或博客。你需要“关于”页面、“联系”页面、“项目”页面或“作品”页面。这就是“页面”的用武之地。它们的工作方式与“帖子”完全一样,这意味着它们是带有卷首块的 Markdown 文件。但它们不会放到 `_posts` 目录。它们要么保留在你的项目根目录中,要么保留在它们自己的文件夹中。对于布局和包含,你可以使用与帖子相同的布局或创建新帖子。 Jekyll 非常灵活,你可以随心所欲地发挥你的创意!你的默认博客已经有 `index.markdown` 和 `about.markdown`。请随意自定义它们。 + +### 数据文件 + +数据文件位于 `_data` 目录中,可以是 `.yml`、`.json`、`.csv` 等格式的文件。例如,一个 `_data/members.yml` 文件可能包含: + +``` +- name: A + github: a@a + +- name: B + github: b@b + +- name: C + github: c@c +``` + +Jekyll 在网站生成的时候读取这些内容。你可以通过 `site.data.members` 访问它们。 + +``` + +``` + +### 永久链接 + +你的 `_config.yml` 文件定义了永久链接的格式。你可以使用各种默认变量来组合你自己的自定义永久链接。 + +### 构建你最终的网站 + +命令 `jekyll serve` 非常适合本地测试。但是一旦你完成了本地测试,你将需要构建要发布的最终工作。命令 `jekyll build --source source_dir --destination destination_dir` 将你的网站构建到 `_site` 文件夹中。请注意,此文件夹在每次构建之前都会被清理,所以不要将重要的东西放在那里。生成内容后,你可以将其托管在你的静态托管服务上。 + +你现在应该对 Jekyll 的功能以及主要部分的功能有一个全面的了解。如果你正在寻找灵感,官方 [JAMStack 网站上有一些很棒的例子][17]。 + +![Example Jekyll sites from JAMStack][18] + +编码快乐。 + +本文首发于 [作者个人博客][19],经授权改编。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/9/build-website-jekyll + +作者:[Ayush Sharma][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/ayushsharma +[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://gitlab.com/ayush-sharma/ayushsharma-in +[3]: https://sass-lang.com/ +[4]: https://shopify.github.io/liquid/ +[5]: https://jekyllrb.com/docs/installation/ +[6]: https://jekyllrb.com/docs/ +[7]: https://opensource.com/sites/default/files/uploads/2016-08-15-introduction-to-jekyll-welcome-to-jekyll.png (Default "awesome" blog) +[8]: https://creativecommons.org/licenses/by-sa/4.0/ +[9]: https://gitlab.com/ayush-sharma/ayushsharma-in/-/blob/2.0/_posts/2021-07-15-the-evolution-of-ayushsharma-in.md +[10]: https://jekyllrb.com/docs/variables/ +[11]: https://opensource.com/sites/default/files/uploads/2016-08-15-introduction-to-jekyll-new-article.png (New blog entry) +[12]: https://github.com/jekyll/minima/blob/master/_layouts/post.html +[13]: https://github.com/jekyll/minima/blob/master/_layouts/default.html#L12 +[14]: https://github.com/jekyll/minima/tree/master/_includes +[15]: https://github.com/"\> +[16]: https://jekyllrb.com/docs/permalinks/ +[17]: https://jamstack.org/examples/ +[18]: https://opensource.com/sites/default/files/uploads/2016-08-15-introduction-to-jekyll-jamstack-examples.png (Example Jekyll sites from JAMStack) +[19]: https://notes.ayushsharma.in/2021/08/introduction-to-jekyll diff --git a/published/202110/20210927 Install Java from your Linux distribution-s repositories.md b/published/202110/20210927 Install Java from your Linux distribution-s repositories.md new file mode 100644 index 0000000000..f2de6c0c60 --- /dev/null +++ b/published/202110/20210927 Install Java from your Linux distribution-s repositories.md @@ -0,0 +1,117 @@ +[#]: subject: "Install Java from your Linux distribution's repositories" +[#]: via: "https://opensource.com/article/21/9/install-java-linux-repositories" +[#]: author: "Chris Hermansen https://opensource.com/users/clhermansen" +[#]: collector: "lujun9972" +[#]: translator: "geekpi" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13864-1.html" + +如何从 Linux 发行版的仓库中安装 Java +====== + +> 无论你喜欢哪个发行版和包管理器,都可以都很容易地在你的 Linux 系统上安装 Java。 + +![](https://img.linux.net.cn/data/attachment/album/202110/09/092717ean17be0alz10kt5.jpg) + +把 Java 安装到你的 Linux 桌面上有多种方法。一个明显的方式是使用你的 Linux 发行版中提供的软件包。请注意,这并不适合所有人。例如,有些用户可能需要一个非常具体的 Java 版本。 + +在你开始之前,你必须确定你需要“哪种 Java”。你是否只需要运行一些 `.class` 文件或 `.jar` 文件?还是你正在编写一些需要编译的代码? + +就我而言,我运行的大部分 Java 都是我自己(至少部分)编写的 Java,所以安装完整的 Java 开发工具包(或称 JDK)总是有意义的,它包含了 Java 编译器、库和一些非常有用的工具。当然,在这里,我们更倾向于使用开源的 JDK,称为 [OpenJDK][2]。 + +由于我主要在 Ubuntu Linux 发行版上工作,我的软件包管理器是 `apt`。我可以用 `apt` 来查找哪些 OpenJDK 包是可用的: + +``` +apt list OpenJDK\* +``` + +这个命令的输出看起来像这样: + +``` +Listing... Done +openjdk-11-dbg/hirsute-updates,hirsute-security 11.0.11+9-0ubuntu2 amd64 +openjdk-11-dbg/hirsute-updates,hirsute-security 11.0.11+9-0ubuntu2 i386 +openjdk-11-demo/hirsute-updates,hirsute-security 11.0.11+9-0ubuntu2 amd64 +openjdk-11-demo/hirsute-updates,hirsute-security 11.0.11+9-0ubuntu2 i386 +openjdk-11-doc/hirsute-updates,hirsute-updates,hirsute-security,hirsute-security 11.0.11+9-0ubuntu2 all +openjdk-11-jdk-headless/hirsute-updates,hirsute-security 11.0.11+9-0ubuntu2 amd64 +openjdk-11-jdk-headless/hirsute-updates,hirsute-security 11.0.11+9-0ubuntu2 i386 +openjdk-11-jdk/hirsute-updates,hirsute-security 11.0.11+9-0ubuntu2 amd64 +openjdk-11-jdk/hirsute-updates,hirsute-security 11.0.11+9-0ubuntu2 i386 +openjdk-11-jre-dcevm/hirsute 11.0.10+1-1 amd64 +openjdk-11-jre-headless/hirsute-updates,hirsute-security 11.0.11+9-0ubuntu2 amd64 +openjdk-11-jre-headless/hirsute-updates,hirsute-security 11.0.11+9-0ubuntu2 i386 +openjdk-11-jre-zero/hirsute-updates,hirsute-security 11.0.11+9-0ubuntu2 amd64 +openjdk-11-jre-zero/hirsute-updates,hirsute-security 11.0.11+9-0ubuntu2 i386 +openjdk-11-jre/hirsute-updates,hirsute-security 11.0.11+9-0ubuntu2 amd64 +openjdk-11-jre/hirsute-updates,hirsute-security 11.0.11+9-0ubuntu2 i386 +openjdk-11-source/hirsute-updates,hirsute-updates,hirsute-security,hirsute-security 11.0.11+9-0ubuntu2 all +openjdk-15-dbg/hirsute 15.0.3+3-1 amd64 +openjdk-15-dbg/hirsute 15.0.3+3-1 i386 +openjdk-15-demo/hirsute 15.0.3+3-1 amd64 +... +openjdk-8-jre/hirsute-updates,hirsute-security 8u292-b10-0ubuntu1 i386 +openjdk-8-source/hirsute-updates,hirsute-updates,hirsute-security,hirsute-security 8u292-b10-0ubuntu1 all +``` + +我在上面用 `...` 省略了不少行。 + +事实证明,即使限制在 OpenJDK 中,我仍然有很多选择: + + * 不同的架构(在我的例子中,i386 还是 amd64)。 + * 不同的 Java 版本(就我而言,有 8、11、15、16、17 等)。 + * 纯粹的 OpenJDK 或无头版本。 + * Java 运行时环境(JRE)。 + * 用于调试、演示,以及是否包含源代码等。 + +同样,在我的情况中,我主要对纯粹的普通 OpenJDK 感兴趣。 + +假设我想为我的 amd64 架构安装 Java 11 版本的普通 OpenJDK,我可以输入: + +``` +sudo apt install -a=amd64 openjdk-11-jdk +``` + +几分钟后,我就可以编译、运行、调试和打包我的 Java 代码了。 + +注意,很有可能需要同时安装多个版本的 Java,有时甚至是必要的。在 Ubuntu 中,有一个有用的工具,叫做 `update-java-alternatives`,它可以 [显示并配置在使用哪个 Java 环境][3]。 + +那些使用不同 Linux 发行版的人,一般来说,可以采取类似的方法。其他的几个发行版(如 Debian 和 Mint)也使用 `apt` ,尽管可用的软件包可能不同。发行版可能使用不同的软件包管理器。例如, [Fedora 安装 Java 的文档页面][4] 显示了如何使用 Fedora `dnf` 包管理器来处理安装。首先,为了显示可用的版本,输入: + +``` +dnf search openjdk +``` + +接下来,要安装完整的开发 x86_64 架构版本,请输入: + +``` +sudo dnf install java-11-openjdk-devel.x86_64 +``` + +同样地,Fedora 提供了 `alternatives` 工具来 [显示和配置 Java 环境][5]。 + +再比如,[很棒的 Arch Linux 维基][6] 显示对应的软件包是 `jdk11-openjdk`。该维基还解释了许多在 Arch 中使用 Java 的其他重要细节,比如使用 `archlinux-java` 工具来显示安装了哪些 Java 环境或选择一个不同的默认环境。Arch 使用一个叫 `pacman` 的包管理器,它也有文档 [在 Arch Linux 维基上][7]。 + +不管你喜欢哪个发行版和软件包管理器,在你的 Linux 系统上获得 Java 是很容易的。当然,在安装之前,要考虑版本和功能。还要记住,在同一台电脑上有管理两个或多个 Java 版本的方法。我的大多数例子都使用了 `apt`,但也要记得可以选择使用 `dnf`。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/9/install-java-linux-repositories + +作者:[Chris Hermansen][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/clhermansen +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/java-coffee-mug.jpg?itok=Bj6rQo8r (Coffee beans and a cup of coffee) +[2]: https://openjdk.java.net/ +[3]: http://manpages.ubuntu.com/manpages/hirsute/man8/update-java-alternatives.8.html +[4]: https://docs.fedoraproject.org/en-US/quick-docs/installing-java/ +[5]: https://tecadmin.net/install-java-on-fedora/ +[6]: https://wiki.archlinux.org/title/java#OpenJDK +[7]: https://wiki.archlinux.org/title/pacman#Querying_package_databases diff --git a/published/202110/20210929 Dialect- An Open-Source Translation App for Linux.md b/published/202110/20210929 Dialect- An Open-Source Translation App for Linux.md new file mode 100644 index 0000000000..073ad4a64f --- /dev/null +++ b/published/202110/20210929 Dialect- An Open-Source Translation App for Linux.md @@ -0,0 +1,100 @@ +[#]: subject: "Dialect: An Open-Source Translation App for Linux" +[#]: via: "https://itsfoss.com/dialect/" +[#]: author: "Ankush Das https://itsfoss.com/author/ankush/" +[#]: collector: "lujun9972" +[#]: translator: "geekpi" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13868-1.html" + +Dialect:Linux 下的开源翻译应用 +====== + +![](https://img.linux.net.cn/data/attachment/album/202110/10/115724t5xgx8agu8asag0u.jpg) + +> Dialect 是一个简单明了的应用,可以让你使用 Web 服务进行语言间的翻译。想要了解更多的话,让我们来一窥究竟。 + +虽然你可以启动 Web 浏览器并直接使用任何翻译服务来完成工作,但桌面应用有时会派上用场。 + +Dialect 是一个简单的翻译应用,可以利用 Web 服务进行翻译,同时给你一些额外的能力。 + +### 使用谷歌翻译和 LibreTranslate 的开源翻译应用 + +![][1] + +Dialect 是一个主要为 GNOME 桌面定制的应用,但它在其他桌面环境下也应该能正常工作。 + +它可以让你快速翻译语言,同时还有一些额外的选项。 + +在其核心部分,你可以选择谷歌翻译或 LibreTranslate 翻译服务。 + +尽管 LibreTranslate 达不到谷歌翻译的准确性,但把它作为一个选项来切换是一个很好的补充。至少,对于一些基本的用法,如果用户不想利用谷歌的服务,你的桌面上就有一个备选方案。 + +### Dialect 的特点 + +![][2] + +除了切换翻译服务外,你还能得到如下个功能: + + * 发音 + * 文本到语音(TTS)功能(谷歌) + * 黑暗模式 + * 翻译快捷方式 + * 实时翻译 + * 剪贴板按钮可快速复制/粘贴 + * 翻译历史(撤销/重做) + +正如你在截图中所注意到的,实时翻译功能可能会因为滥用 API 而使你的 IP 地址被禁止使用服务。 + +![][3] + +我试着使用 LibreTranslate(如上图所示)和谷歌翻译,并启用实时翻译功能,它工作得很好。 + +也许,如果你经常依赖翻译,你可能想避免这个实时翻译。但是,对于我的临时使用,在相当多的测试中,该服务并没有导致 IP 地址被禁止。 + +重要的是要注意,如果你想,你可以指定一个自定义的 LibreTranslate 实例。默认情况下,它使用 “translate.astian.org” 作为实例。 + +你可能找不到一个单独显示的翻译历史区域,但窗口左上角的箭头按钮会让你看到你以前的翻译,以及翻译设置。 + +所以,它也可以作为一个重做/撤销的功能。 + +### 在 Linux 中安装 Dialect + +[Dialect][7] 是以 [Flatpak][4] 的形式提供的。所以,你应该能够在你选择的任何 Linux 发行版上安装它。如果你是新手,你可能想看看我们的 [Flatpak 指南][5] 以获得帮助。 + +首先,添加 Flathub 仓库: + +``` +flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo +``` + +然后安装应用: + +``` +flatpak install flathub com.github.gi_lom.dialect +``` + +安装后,在系统菜单中寻找它,并从那里启动它。 + +你也可以浏览它的 [GitHub 页面][6] 了解更多信息。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/dialect/ + +作者:[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://i0.wp.com/itsfoss.com/wp-content/uploads/2021/09/dialect-screenshot.png?resize=800%2C331&ssl=1 +[2]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/09/dialect-app-options.png?resize=800%2C470&ssl=1 +[3]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/09/dialect-libretranslate.png?resize=800%2C326&ssl=1 +[4]: https://itsfoss.com/what-is-flatpak/ +[5]: https://itsfoss.com/flatpak-guide/ +[6]: https://github.com/dialect-app/dialect/ +[7]: https://flathub.org/apps/details/com.github.gi_lom.dialect diff --git a/published/202110/20210929 Install Java manually on Linux.md b/published/202110/20210929 Install Java manually on Linux.md new file mode 100644 index 0000000000..32ba846089 --- /dev/null +++ b/published/202110/20210929 Install Java manually on Linux.md @@ -0,0 +1,118 @@ +[#]: subject: "Install Java manually on Linux" +[#]: via: "https://opensource.com/article/21/9/install-java-manually-linux" +[#]: author: "Alan Formy-Duval https://opensource.com/users/alanfdoss" +[#]: collector: "lujun9972" +[#]: translator: "wxy" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13869-1.html" + +如何在 Linux 上手动安装 Java +====== + +> 手动安装可以让用户更好的控制 Java 运行时环境。 + +![](https://img.linux.net.cn/data/attachment/album/202110/10/143844wm2x4d18b1mb8md1.jpg) + +[使用 Linux 发行版的软件包管理工具来安装 Java 软件包][6] 是很容易的。然而,有时你需要手动安装 Java。这对基于 Java 的应用服务器(如 Tomcat 或 JBoss)的管理员特别重要。许多开源和专有软件产品都依赖于这些服务。 + +### 开发者或运行时套件? + +Java 虚拟机Java Virtual Machine(JVM)以两种不同的形式提供:Java 开发工具包Java Development Kit(JDK)或 Java 运行时环境Java Runtime Environment(JRE)。 + +软件开发人员通常需要 JDK。它包含编译、运行和测试源代码所需的二进制文件。部署一个预先建立的 Java 应用程序通常只需要 JRE。它不包括编译器和其他开发工具。由于安全性的提高和空间的限制,通常在生产环境中安装 JRE。 + +### 获取 Java + +你可以从网上下载开源的 Java 软件。你可以在 [Red Hat Developer][2]、[Adoptium.net][3] 下载 OpenJDK 打包文件,或从 Azul 下载 [Zulu 社区版][4] 。 + +### 安装 Java + +设置一个目录来存放 Java 文件。我喜欢创建一个简单的名为 `java` 的目录,这样我就可以在一个专门的目录中下载并解压打包文件: + +``` +$ mkdir -p java/jdk +``` + +让我们在这个例子中使用 JDK。将下载的文件保存到 `jdk` 目录下。然后换到该目录: + +``` +$ cd java/jdk +$ ls +OpenJDK11U-jdk_x64_linux_hotspot_11.0.12_7.tar.gz +``` + +提取该打包文件。注意,`tar` 会创建一个新的目录: + +``` +$ tar xvzf OpenJDK11U-jdk_x64_linux_hotspot_11.0.12_7.tar.gz +$ ls +jdk-11.0.12+7 OpenJDK11U-jdk_x64_linux_hotspot_11.0.12_7.tar.gz +``` + +使用 `-version` 选项确认新 JVM 的版本。 + +``` +$ cd jdk-11.0.12+7/bin +$ ./java -version +``` + +JVM 的版本输出看起来类似这样: + +``` +openjdk version "11.0.12" 2021-07-20 +OpenJDK Runtime Environment Temurin-11.0.12+7 (build 11.0.12+7) +OpenJDK 64-Bit Server VM Temurin-11.0.12+7 (build 11.0.12+7, mixed mode) +``` + +#### 环境变量 + +为了确保一个特定的应用程序能够正常工作,它需要确切地知道如何定位 JVM。有两个主要的变量需要设置:`JAVA_HOME` 和 `PATH`。 + +``` +$ echo $JAVA_HOME +$ echo $PATH +``` + +这些可以在用户的 `.bashrc` 文件中设置。确保这些变量出现在 [任何设置 PATH 的现有代码][5] 之后: + +``` +#Set the JAVA_HOME +export JAVA_HOME=~/java/jdk/jdk-11.0.12+7 +#Add the JAVA_HOME to the PATH +export PATH="$JAVA_HOME/bin:$PATH" +``` + +### 手动安装的情况 + +有几种情况需要手动安装 Java。请考虑以下三种情况: + +一种情况可能是要求使用不同的,也许是较早的,在你的 Linux 发行版的软件库中已经没有的 Java 版本。 + +另一个例子可能是由安全推动的决定,即 Java 不会被默认安装在操作系统上或在“根级别”上。 + +第三种情况是可能需要几个不同版本的 Java,通常是因为 J2EE Web 应用程序的多个实例在同一台服务器上运行。由于越来越多地使用虚拟机和容器来隔离进程,这种操作系统共享在今天已经不太常见了。然而,由于需要维护不同的容器镜像,对手动安装的理解仍然至关重要。 + +### 总结 + +我演示了我手动安装 Java 运行时环境的方式,但你可以制定一个最适合你需求的惯例。最终,手动安装让用户可以更好的控制 Java 运行时环境。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/9/install-java-manually-linux + +作者:[Alan Formy-Duval][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/alanfdoss +[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://developers.redhat.com/products/openjdk/download +[3]: https://adoptium.net/ +[4]: https://www.azul.com/downloads/zulu-community +[5]: https://opensource.com/article/17/6/set-path-linux +[6]: https://linux.cn/article-13864-1.html \ No newline at end of file diff --git a/published/202110/20210930 How I use Ansible and anacron for automation.md b/published/202110/20210930 How I use Ansible and anacron for automation.md new file mode 100644 index 0000000000..bde30f2bb5 --- /dev/null +++ b/published/202110/20210930 How I use Ansible and anacron for automation.md @@ -0,0 +1,129 @@ +[#]: subject: "How I use Ansible and anacron for automation" +[#]: via: "https://opensource.com/article/21/9/ansible-anacron-automation" +[#]: author: "Seth Kenlon https://opensource.com/users/seth" +[#]: collector: "lujun9972" +[#]: translator: "geekpi" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13879-1.html" + +我如何使用 Ansible 和 anacron 实现自动化 +====== + +> 有了 anacron,我可以把脚本和 Ansible 剧本放到合适的地方,以完成各种琐碎的任务。 + +![](https://img.linux.net.cn/data/attachment/album/202110/13/155036tc0c7th906cc96mm.jpg) + +自动化是伟大的 IT 和 DevOps 理想,但根据我的经验,可能根本不存在什么不方便的东西。有很多次,我为某些任务想出了一个很好的解决方案,我甚至会编写脚本,但我没有让它真正实现自动化,因为在我工作的机器上不存在易于自动化的基础设施。 + +我最喜欢的简易自动化工具曾经是 cron 系统,它古老、可靠、面向用户,而且简单(除了一个我永远无法记住的调度语法之外)。然而,cron 的问题是,它假定一台电脑每天 24 小时都在工作。在错过了太多预定的备份之后,我发现了 [anacron][2],一个基于时间戳而非预定时间的 cron 系统。如果你的电脑在通常情况下运行时处于关闭状态,anacron 会确保它在电脑重新开启时运行。创建一个作业只需要简单地把一个 shell 脚本放到三个目录中:`cron.day`、`cron.weekly` 或者 `cron.monthly` (如果你想的话,你可以定义更多)。有了 anacron,我发现自己把脚本和 Ansible 剧本用在了各种琐碎的任务中,包括弹出到期和事件提醒。 + +这是一个现代问题的简单而明显的解决方案,但如果 anacron 没有安装在电脑上,那它对我就没有用。 + +### 用 Ansible 进行软件设置 + +任何时候我设置一台新的计算机,无论是笔记本电脑、工作站还是服务器,我都会安装 anacron。这很简单,但是 anacron 的安装只提供了 `anacron` 命令。它并没有设置 anacron 的用户环境。所以我创建了一个 Ansible 剧本来设置用户需要什么来使用 anacron 并安装 `anacron` 命令。 + +首先,标准的 Ansible 模板: + +``` +--- +- hosts: localhost + tasks: +``` + +### 用 Ansible 创建目录 + +接下来,我创建了用于 Anacron 的目录树。你可以把它看成是一种透明的 crontab。 + +``` + - name: create directory tree + ansible.builtin.file: + path: "{{ item }}" + state: directory + with_items: + - '~/.local/etc/cron.daily' + - '~/.local/etc/cron.weekly' + - '~/.local/etc/cron.monthly' + - '~/.var/spool/anacron' +``` + +这个语法可能看起来有点奇怪,但它实际上是一个循环。`with_items:` 指令定义了四个要创建的目录,Ansible 在 `ansible.buildin.file:` 指令中为每个目录迭代一次(目录名填充了 `{{ item }}` 变量)。与 Ansible 中的一切一样,如果目录已经存在,不会有错误或冲突。 + +### 用 Ansible 复制文件 + +`ansible.buildin.copy` 模块将文件从一个地方复制到另一个地方。为了让它工作,我需要创建一个叫做 `anacrontab` 的文件。它不是 Ansible 剧本,所以我把它放在我的 `~/Ansible/data` 目录下,那里是我的剧本的支持文件。 + +``` + - name: copy anacrontab into place + ansible.builtin.copy: + src: ~/Ansible/data/anacrontab + dest: ~/.local/etc/anacrontab + mode: '0755' +``` + +我的 `anacrontab` 文件很简单,模仿了一些发行版默认安装在 `/etc/anacron` 中的文件: + +``` +SHELL=/bin/sh +PATH=/sbin:/bin:/usr/sbin:/usr/bin +1 0 cron.day run-parts $HOME/.local/etc/cron.daily/ +7 0 cron.wek run-parts $HOME/.local/etc/cron.weekly/ +30 0 cron.mon run-parts $HOME/.local/etc/cron.monthly/ +``` + +### 登录时运行 anacron + +大多数 Linux 发行版将 anacron 配置为从 `/etc/anacron` 读取作业。我主要是作为一个普通用户使用 anacron,所以我从我的登录账号 `~/.profile` 启动 anacron。我不想让自己记住这些配置,所以我让 Ansible 来做。我使用 `ansible.buildin.lineinfile` 模块,它会在 `~/.profile` 不存在时创建它,并插入 anacron 的启动行。 + +``` + - name: add local anacrontab to .profile + ansible.builtin.lineinfile: + path: ~/.profile + regexp: '^/usr/sbin/anacron' + line: '/usr/sbin/anacron -t ~/.local/etc/anacrontab' + create: true +``` + +### 用 Ansible 安装 anacron + +对于我的大多数系统来说,`dnf` 模块可以用来安装软件包,但我的工作站运行的是 Slackware(使用 `slackpkg`),有时不同的 Linux 发行版也会进入我的收藏。`ansible.buildin.package` 模块提供了一个安装软件包的通用接口,所以我把它用在这个剧本上。幸运的是,我还没有遇到一个名为 `anacron` 的仓库不是 `anacron`,所以现在,我不必考虑软件包名称的潜在差异。 + +这实际上是一个单独的剧本,因为软件包的安装需要权限升级,它由 `becomes: true` 指令提供。 + +``` +- hosts: localhost + become: true + tasks: + - name: install anacron + ansible.builtin.package: + name: anacron + state: present +``` + +### 使用 anacron 和 Ansible 实现轻松自动化 + +为了用 Ansible 安装 anacron,我运行该剧本: + +``` +$ ansible-playbook ~/Ansible/setup-anacron.yaml +``` + +从此,我就可以编写 shell 脚本来执行一些琐碎但重复的任务,然后把它复制到 `~/.local/etc/cron.daily`,让它每天自动运行一次(或者大约如此)。我还为诸如 [清理下载文件夹][3] 之类的任务编写了 Ansible 剧本。我把我的剧本放在 `~/Ansible` 里,这是我保存 Ansible 剧本的地方,然后在 `~/.local/etc/cron.daily` 里创建一个 shell 脚本来执行这个剧本。这很简单,不费吹灰之力,而且很快成为习惯。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/9/ansible-anacron-automation + +作者:[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/programming-code-keyboard-laptop-music-headphones.png?itok=EQZ2WKzy (Woman programming) +[2]: https://opensource.com/article/21/2/linux-automation +[3]: https://opensource.com/article/21/9/keep-folders-tidy-ansible diff --git a/published/202110/20210930 Make YAML as easy as it looks.md b/published/202110/20210930 Make YAML as easy as it looks.md new file mode 100644 index 0000000000..88330932b8 --- /dev/null +++ b/published/202110/20210930 Make YAML as easy as it looks.md @@ -0,0 +1,154 @@ +[#]: subject: "Make YAML as easy as it looks" +[#]: via: "https://opensource.com/article/21/9/yaml-cheat-sheet" +[#]: author: "Seth Kenlon https://opensource.com/users/seth" +[#]: collector: "lujun9972" +[#]: translator: "wxy" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13842-1.html" + +让 YAML 变得像它看起来一样简单 +====== + +> YAML 看起来很简单,为什么它这么难写呢?了解成功使用 YAML 的两个秘诀。 + +![](https://img.linux.net.cn/data/attachment/album/202110/02/101824shamurmpvldpu29a.jpg) + +如果你曾经尝试过写 YAML,你可能一开始会对它看起来很容易感到高兴。乍一看,经常用于配置文件、Ansible 剧本和普通文件数据库的 YAML 看起来就像购物清单一样直观。然而,YAML 的结构中有很多细微的差别,它隐藏着一个危险的秘密:YAML 实际上是一种高度精确、结构化和令人惊讶的严格语言。好消息是,你只需要了解两件事就可以知道 YAML 的工作原理。 + +关于 YAML 的真相是,YAML 中只有两种数据结构:序列sequence映射mapping。这是两个花哨的名字,你会发现它代表了你非常熟悉的概念。这篇文章解释了这两种结构,更重要的是,介绍了它们是如何协同工作,使 YAML 成为表示你所关心的数据的强大方式。 + +### YAML 序列 + +YAML 序列是一个列表。在其最简单的形式中,每行有一个项目,每行以破折号和空格开始。 + +下面是一个例子: + +``` +--- +- Linux +- BSD +- Illumos +``` + +不同的语言有不同的方式来表示这种数据。例如,在 Python 中,同一个列表可以写成 `['Linux', 'BSD', 'Illumos']`。当你在现实生活中写一个列表时,例如在你去买菜之前,你写的可能近似于 YAML 序列。 + +### YAML 映射 + +YAML 映射是一个关键术语与该术语的定义相结合。在其他语言中,映射被称为“键值对”或“词典”。 + +这里有一个例子: + +``` +--- +Kernel: Linux +CPU: AMD +RAM: '16 GB' +``` + +不同的语言有不同的方式来表示这种数据。[在 Python 中][2],例如,同样的数据可以写成 `{"Kernel": "Linux", "CPU": "AMD", "RAM": "16 GB"}`。在现实生活中,你可能会使用这种结构来计划,例如,与朋友的游戏之夜。一个朋友报名带零食,另一个报名带一副牌,另一个报名带一个棋盘游戏,等等。 + +### 组合序列和映射 + +你现在知道 YAML 的语法了。序列和映射是 YAML 中仅有的两种构件,你想在 YAML 中表示的任何东西都可以放在序列或映射中。 + +或者同时使用这二者! + +是的,序列和映射可以被组合和嵌套,这就是 YAML 看起来很直观,但同时又感觉很复杂的原因之一。不过,只有四种可能的组合,一旦你学会如何看它们,YAML 就会觉得像它看起来一样简单。 + +### 序列的映射 + +当你想让一个键项有许多值时,你可以使用一个序列的映射。也就是说,你从一个映射(键)开始,但是给值一个列表: + +``` +--- +Linux: +  - Fedora +  - Slackware +BSD: +  - FreeBSD +  - NetBSD +``` + +在这个示例代码中,`Linux` 是第一个键,它的值是一个序列,其中包含 `Fedora` 和 `Slackware`。第二个键是 `BSD`,它的值是一个序列,包含 `FreeBSD` 和 `NetBSD`。 + +### 映射的映射 + +当你想让一个键项的值中既有键又有值时,你可以使用映射的映射。也就是说,你从一个映射(键)开始,但是给值另一个映射。 + +这可能有点欺骗性,但它揭示了 YAML 中使用特定术语的原因:因为你只不过是创建了一个映射的列表,并不意味着你创建了一个序列。这里是一个映射的映射: + +``` +--- +Desktop: +  CPU: RISC-V +  RAM: '32 GB' +Laptop: +  CPU: AMD +  RAM: '16 GB' +``` + +对大多数人来说,这看起来像一个列表。而且从技术上讲,它是一个列表。但重要的是要认识到,它不是 YAML 序列。它是一个映射,其中包含映射。作为半个 YAML 专家,你可以从明显缺少破折号的地方看出区别。 + +在 Ansible 剧本的所有结构中,我发现这个结构最容易欺骗人。作为人类,我们喜欢列表,当我们看到一个数据结构 _在字面上_ 是列表时,大多数人会把它当成 YAML 序列。但是在 YAML 中,虽然序列是列表,但是列表并不总是序列。 + +### 序列的序列 + +就像你可以嵌套映射一样,你可以将一个序列嵌套到一个序列中: + +``` +--- +- [Linux, FreeBSD, Illumos] +- [YAML, XML, JSON] +``` + +这可能是我在 YAML 的实际使用中遇到的最不常见的数据结构,但有时你需要一个列表的列表。 + +### 映射的序列 + +你也可以创建一个包含映射的序列。对于人类排序数据的方式来说,这并不太常见,但对于计算机来说,这可能是一个重要的结构。 + +这里有一个例子: + +``` +--- +- +  CPU: AMD +  RAM: '16 GB' +- +  CPU: Intel +  RAM: '16 GB' +``` + +对于 YAML,这可能是最不直观的语法。我发现它在 Python 中呈现时更清晰: + +``` +[{"CPU": "AMD", "RAM": "16 GB"}, {"CPU": "Intel", "RAM": "16 GB"}] +``` + +方括号代表一个列表结构,这个列表包含两个字典。每个字典都包含键值对。 + +### 构建更好的 YAML + +现在你知道了 YAML 的两个组成部分,以及它们如何被组合起来以表示复杂的数据结构。问题是:你要用 YAML 构建什么? + +和很多人一样,我也使用 YAML 来编写 Ansible 剧本。我还用它作为一种简单的配置格式、作为 D&D 的角色表、表示项目组织所需的目录结构,等等。只要你能适应序列和映射的概念,你会发现 YAML 是一种很容易编写、阅读和(如果有合适的库)解析的格式。 + +如果你发现自己经常使用 YAML,请下载我们的 [YAML 速查表][3],以帮助你直观地了解基本数据结构及其组合,并帮助你记住一些额外的语法约定。通过一点点的练习,你会发现 YAML 真的和它看起来一样简单! + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/9/yaml-cheat-sheet + +作者:[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/lead-images/laptop_screen_desk_work_chat_text.png?itok=UXqIDRDD (Person using a laptop) +[2]: https://opensource.com/article/21/3/dictionary-values-python +[3]: https://opensource.com/downloads/yaml-cheat-sheet diff --git a/published/202110/20211001 -e- cloud is a deGoogled Alternative to Google Drive.md b/published/202110/20211001 -e- cloud is a deGoogled Alternative to Google Drive.md new file mode 100644 index 0000000000..6234cfe8b9 --- /dev/null +++ b/published/202110/20211001 -e- cloud is a deGoogled Alternative to Google Drive.md @@ -0,0 +1,77 @@ +[#]: subject: "/e/ cloud is a deGoogled Alternative to Google Drive" +[#]: via: "https://news.itsfoss.com/e-cloud/" +[#]: author: "Ankush Das https://news.itsfoss.com/author/ankush/" +[#]: collector: "lujun9972" +[#]: translator: "geekpi" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13874-1.html" + +/e/ 云:一个去谷歌化的 Google Drive 替代方案 +====== + +![](https://img.linux.net.cn/data/attachment/album/202110/12/122933awf0z9vnqdzslv1q.jpg) + +> /e/ 云是 e.foundation 使用 Nextcloud 等开源工具创立的,以作为 Google Drive 和 Gmail 的替代品。 + +![](https://i0.wp.com/news.itsfoss.com/wp-content/uploads/2021/10/ecloud-ft.png?w=1200&ssl=1) + +Google Drive 是一种流行的云存储服务,在大多数情况下效果很好。 + +然而,它可能不是最关注隐私的选择。因此,要完全控制你的数据,最好的办法是启动一个 [Nextcloud][1] 实例,存储你的基本数据,并可以访问其他协作工具。 + +虽然这听起来不错,但不是每个人都能投入精力来创建和维护他们的实例。这就是 /e/ 云上场的时候了,它是由 [去谷歌化的安卓操作系统 /e/ 操作系统][2] 背后的同一个团队建立的。 + +/e/ 云主要将自己定位为一个新的 Google Drive 私人替代品,并提供一个取代 Gmail 的邮箱。 + +### /e/ 云:带有邮箱的 Nextcloud 及 OnlyOffice + +![][3] + +当你创建一个 /e/ 账户时,它会给你一个私人电子邮件地址 [xyz@e.email][4]。 + +而且,同邮箱地址一起,你会得到 1GB 的免费 /e/ 云存储空间和一个由 Nextcloud 和 OnlyOffice 为核心的协作平台。 + +因此,如果你想利用 Nextcloud 和 OnlyOffice 来取代谷歌的工具套件,而不需要自己全部设置,/e/ 云可以成为一个引人注目的以隐私为中心的选择。 + +![][5] + +除了 OnlyOffice 的文件存储和文档支持外,你还可以使用日历,存储笔记,并添加任务。 + +因此,它也可以成为一个正式的以隐私为中心的协作平台,你可以免费使用。 + +如果你想要更多的存储空间,你可以将你的订阅升级到付费计划,你可以根据需要选择 20 到 1TB 的存储空间,并按月/年计费。定价计划起价低至 3 美元/月。 + +毫无疑问,如果你在手机上使用 /e/ 操作系统或使用一个 /e/ 智能电话,这应该是一种无缝体验。 + +但是,你也可以使用第三方邮件客户端和 Nextcloud 移动应用在任何设备上使用它。 + +- [注册 /e/ 云][6] + +### 总结 + +考虑到它相对较新,正计划增加几个功能,包括端到端加密,从 Google Drive 迁移等。 + +你可以注册一个帐户并免费试用。 + +对于像 /e/ 云这样以 Nextcloud 为核心的主流解决方案,除了电子邮件和协作服务外,还能帮助你安全地管理/存储文件,你觉得怎么样? + +-------------------------------------------------------------------------------- + +via: https://news.itsfoss.com/e-cloud/ + +作者:[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://news.itsfoss.com/author/ankush/ +[b]: https://github.com/lujun9972 +[1]: https://itsfoss.com/nextcloud/ +[2]: https://itsfoss.com/e-os-review/ +[3]: https://i0.wp.com/news.itsfoss.com/wp-content/uploads/2021/10/ecloud.png?resize=1568%2C772&ssl=1 +[4]: mailto:xyz@e.email +[5]: https://i0.wp.com/news.itsfoss.com/wp-content/uploads/2021/10/ecloud-files.png?resize=1568%2C787&ssl=1 +[6]: https://e.foundation/e-email-invite/ diff --git a/published/202110/20211001 8 reasons why I learned Core Java.md b/published/202110/20211001 8 reasons why I learned Core Java.md new file mode 100644 index 0000000000..b7359fbbf1 --- /dev/null +++ b/published/202110/20211001 8 reasons why I learned Core Java.md @@ -0,0 +1,97 @@ +[#]: subject: "8 reasons why I learned Core Java" +[#]: via: "https://opensource.com/article/21/10/why-i-learned-core-java" +[#]: author: "Shantam Sahai https://opensource.com/users/shantam-sahai" +[#]: collector: "lujun9972" +[#]: translator: "wxy" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13855-1.html" + +学习 Core Java 的 8 个原因 +====== + +> 在学习建立在 Java 之上的所有相关工具时,了解 Core Java 会给你带来很大的优势。 + +![](https://img.linux.net.cn/data/attachment/album/202110/06/094720iax1d49c5sc0sd48.jpg) + +计算机编程(也被称为 *编码*)的重点不是使用哪种编程语言,而是发展编程逻辑和学习像程序员一样思考。你一开始使用的编程语言应该是在这一努力过程中对你帮助最大的语言。因此,你必须问自己一个问题,“作为一个程序员,你想开发什么?” + +例如,如果你想从事安卓应用开发、视频游戏开发、桌面 GUI 应用,或者只是一般的软件开发,我认为学习 Java 是一个很好的选择。我选择的语言是 Java,它为我提供了一个完整的编程世界。在我居住的印度,Java 程序员的平均工资约为每年 59 万印度卢比(LPA)(根据你的经验,可以高达 100 LPA)。 + +不过,Java 是一种庞大的语言,有很多框架和变体可供选择。Core Java 是科技行业发展出来的术语,指的是 Java 语言的中心组件,人们用它来编写框架,并围绕 Java 发展了丰富的产业。我认为,Core Java 是你能获得的最强大的技能之一,因为在学习建立在它之上的所有相关工具时,了解 Java 的基础知识会给你带来巨大的优势。 + +以下是我选择 Core Java 的八大理由,我想你也会认可: + +### 1、Java 是一种不断发展的编程语言 + +Java 有重要的企业支持,但 Java 开发中最重要的组成部分是 [OpenJDK][2],这是个开源的 Java 开发工具包。OpenJDK 社区以促进和维护开发源码、开放创新和开放标准为使命,致力于改进和维护 Java 及其工具链的开源实现。 + +它的每一个版本都会增加创新和便利,使 Java 对开发者和用户都更容易。例如,就在 Java 11 中,他们增加了运行 .java 文件的能力。现在,运行一个单文件的 Java 应用程序所需要的只是 `java` 命令,不需要进行编译: + +``` +$ java ./hello.java + +Hello world +``` + +你可以使用 Java 做 Web、移动或桌面的应用程序编程。它是一种高度通用的语言。它有许多有趣的特点,如动态编码、多种安全功能、平台无关的特点和以网络为中心的设计。 + +### 2、Java 锚定了安卓应用开发 + +你可以使用 Java 来创建安卓用程序。安卓市场巨大,对移动程序员的需求只会越来越大。即使你对成为一个专业的应用程序开发人员不感兴趣,定制你的移动体验的能力也是很强大的,而 Java 使之成为可能。 + +而且,这比你想象的要容易得多!学习 Core Java 可以让你轻松地掌握安卓开发工具包或可以输出到移动平台的框架,如 [Processing][3]。 + +### 3、丰富的 API 使得 Java 易于使用 + +Java 的 API(应用编程接口Application Programming Interface)包括类、包、接口等。Java 主要有三种类型的 API: + + * 官方的 Java Core API + * 最佳的官方 Java API + * 非官方的 API + +API 使编程更容易,因为你可以在不知道其内部实现的情况下构建应用程序。根据我的经验,许多公司喜欢用 Java 而不是其他选择,就是因为 Java API 的力量。 + +### 4、开源库 + +几乎有无穷无尽的 Java 开源库,包括 Maven、Guava、Apache Commons、Jhipster,等等。你可以复制、学习和分享这些库的资源。它们使编程更容易获得、更快、更便宜,也更有教育意义。 + +### 5、Java 有可靠的开发工具 + +Java 有一些我最喜欢的 IDE(集成开发环境Integrated Development Environments),包括 [Eclipse][4]、[NetBeans][5]、[BlueJ][6] 和 IntelliJ IDEA。它们提供了调试、语法高亮、代码补完、语言支持、自动重构等功能。简而言之,IDE 在 Java 的成功和你在 Java 学习中起着至关重要的作用! + +### 6、印度对 Java 开发人员的需求 + +谷歌、Netflix 和 Instagram 等巨头都使用 Java 进行后台开发。印度公司正在积极寻找雇用 Java 程序员来开发安卓应用程序、新的 API 和云上的微服务。这种需求转化为更多的工作机会。 + +### 7、Java 有庞大的编程社区 + +Java 程序员的社区庞大,囊括了从初学者到专家的所有人。我发现这个社区很热情待人,当你寻求支持的时候,他们会给予帮助。最重要的是,通过参与在线讨论,我学到了大量的新技巧。作为社区的一分子,这是我了解最新趋势、学习更多语言和跟上发展的重要途径。 + +### 8、Java 是独立于平台 + +Java 是平台无关的,这一点使它具有很高的价值。Java 源代码被编译成字节码,在 Java 虚拟机(JVM)上运行。任何运行 JVM 的平台(支持所有主要平台)都可以运行你的 Java 应用程序。你只需写一次,就可以在任何地方运行!这并不只是理论上的,Java 实际上已经实现了这一点。你可以在你开发的任何平台上编写 Java,并将其交付给你的所有目标平台。 + +网上有很多学习 Java 的资源,包括 Opensource.com 上有一个 [速查表][7]。还有一个很好的 [在线 Java 课程][8],可以用印地语免费学习。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/10/why-i-learned-core-java + +作者:[Shantam Sahai][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/shantam-sahai +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/studying-books-java-couch-education.png?itok=C9gasCXr (Learning and studying technology is the key to success) +[2]: https://developer.ibm.com/components/open-jdk/ +[3]: http://processing.org/ +[4]: https://opensource.com/article/20/12/eclipse +[5]: https://opensource.com/article/20/12/netbeans +[6]: https://opensource.com/article/20/7/ide-java#bluej +[7]: https://opensource.com/downloads/java-cheat-sheet +[8]: https://www.learnvern.com/course/core-java-programming-tutorial diff --git a/published/202110/20211001 How to Install Google Chrome on Debian and Kali Linux.md b/published/202110/20211001 How to Install Google Chrome on Debian and Kali Linux.md new file mode 100644 index 0000000000..8e49872ca7 --- /dev/null +++ b/published/202110/20211001 How to Install Google Chrome on Debian and Kali Linux.md @@ -0,0 +1,160 @@ +[#]: subject: "How to Install Google Chrome on Debian and Kali Linux" +[#]: via: "https://itsfoss.com/install-chrome-debian-kali-linux/" +[#]: author: "Abhishek Prakash https://itsfoss.com/author/abhishek/" +[#]: collector: "lujun9972" +[#]: translator: "geekpi" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13895-1.html" + +如何在 Debian 和 Kali Linux 上安装 Chrome 浏览器 +====== + +> Debian 和基于 Debian 的 Kali Linux 将 Firefox 作为默认的网页浏览器。但这并不意味着你不能在其中安装其他网页浏览器。 + +![](https://img.linux.net.cn/data/attachment/album/202110/18/175716cfvxnvf05b5je1ax.jpg) + +Chrome 浏览器非常流行,你可能已经在其他系统上使用它了。如果你想在 Debian 上安装 Chrome,你肯定可以这样做。 + +你在 Debian 的软件库中找不到 Chrome,因为它不是开源软件,但你可以从 Chrome 网站下载并安装它。 + +在本教程中,我将向你展示在 Debian 上安装 Chrome 的两种方法: + + * GUI 方法 + * 命令行方法 + +让我们先从 GUI 方法开始。 + +> 注意:我在这里的例子中使用的是 Debian,但由于 Kali Linux 是基于 Debian 的,所以同样的方法也适用于 Kali Linux。 + +### 方法 1: 在 Debian 上以图形方式安装 Chrome 浏览器 + +这是一个不费吹灰之力的方法。你去 Chrome 网站,下载 deb 文件,然后双击它来安装它。我将详细地展示这些步骤,这样你就能很容易地掌握了。 + +前往 Chrome 的网站。 + +[Get Google Chrome][1] + +你会看到下载 Chrome 的选项。 + +![Click on the Download Chrome button][2] + +当你点击下载按钮时,它会给你两个下载安装文件的选项。选择写着 Debian/Ubuntu 的那个。 + +![Download the Chrome installer file for Debian][3] + +**请注意,Chrome 浏览器不适用于 32 位系统。** + +接下来,你应该选择将文件保存到电脑中,而不是在软件中心打开进行安装。这样一来,下载的文件将被保存在下载文件夹中,而不是临时目录中。 + +![Save the downloaded DEB file for Google Chrome][4] + +进入下载文件夹,右击下载的 DEB 文件,选择用 “Software Install” 打开它。 + +![Right click on the downloaded DEB file and open with Software Install][5] + +它将打开软件中心,你应该看到现在安装 Chrome 浏览器的选项。点击安装按钮。 + +![Click on the install button][6] + +你会被要求输入账户的密码。这是你用来登录系统的同一密码。 + +![Enter your account’s password][7] + +在不到一分钟的时间里,Chrome 就会安装完毕。你现在应该看到一个删除选项,这表明软件已经安装完毕。 + +![Chrome is now installed][8] + +当 Chrome 在 Debian 上安装完毕,在系统菜单中搜索它并启动它。 + +![Start Google Chrome][9] + +它将要求成为你的默认浏览器,并将崩溃报告发送给谷歌。你可以取消勾选这两个选项。然后你就可以看到谷歌浏览器的窗口。 + +![][10] + +如果你登录了你的谷歌账户,你应该可以在这里同步你的密码、书签和其他浏览数据。好好体验吧! + +还有一点,安装完 Chrome 后,你可以从系统中删除下载的 DEB 文件。不再需要它了,甚至在卸载 Chrome 时也不需要。 + +### 方法 2:在 Debian 上从终端安装 Chrome + +你刚才看到的内容可以在终端中轻松实现。 + +首先,确保你的软件包缓存已经刷新,并且你已经安装了 `wget`,用于 [在终端中从网上下载文件][11]。 + +``` +sudo apt update && sudo apt install wget +``` + +接下来是下载 Chrome 的 .deb 文件。 + +``` +wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb +``` + +下载后,你可以用 `apt` 命令 [在终端安装 deb 文件][12],像这样: + +``` +sudo apt install ./google-chrome-stable_current_amd64.deb +``` + +安装完成后,你就可以开始使用 Chrome 了。 + +### 额外提示:更新 Chrome + +这两种方法都会将谷歌的软件库添加到你的系统中。你可以在你的 `sources.list.d` 目录中看到它: + +``` +cat /etc/apt/sources.list.d/google-chrome.list +``` + +这意味着 Chrome 将与 Debian 和 Kali Linux 中的其他系统更新一起被更新。你知道 [如何在命令行中更新你的 Kali Linux][13] 或 Debian 系统么?只要使用这个命令: + +``` +sudo apt update && sudo apt upgrade -y +``` + +### 从你的系统中卸载 Chrome + +即使你选择用 GUI 方法在 Debian 上安装 Chrome,你也必须使用终端来删除它。 + +不要担心。这其实只是一个命令: + +``` +sudo apt purge google-chrome-stable +``` + +根据要求输入你的账户密码。当你输入密码时,屏幕上没有任何显示。这没关系。输入它并按回车键,确认删除。 + +![][14] + +好了,就这些了。我希望你觉得这个教程有帮助。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/install-chrome-debian-kali-linux/ + +作者:[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://www.google.com/chrome/ +[2]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/09/download-chrome-on-debian.webp?resize=800%2C344&ssl=1 +[3]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/09/downloading-google-chrome.webp?resize=800%2C512&ssl=1 +[4]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/09/save-downloaded-chrome-installer-file-debian.webp?resize=800%2C430&ssl=1 +[5]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/09/open-deb-file-with-software-install.webp?resize=800%2C419&ssl=1 +[6]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/09/installing-chrome-debian.webp?resize=800%2C408&ssl=1 +[7]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/09/enter-account-password-while-installing-deb-file.webp?resize=800%2C420&ssl=1 +[8]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/09/chrome-installed-debian.webp?resize=800%2C384&ssl=1 +[9]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/09/start-chrome-debian.webp?resize=800%2C276&ssl=1 +[10]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/09/Chrom-in-Debian.webp?resize=800%2C450&ssl=1 +[11]: https://itsfoss.com/download-files-from-linux-terminal/ +[12]: https://itsfoss.com/install-deb-files-ubuntu/ +[13]: https://linuxhandbook.com/update-kali-linux/ +[14]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/09/remove-google-chrome-ubuntu.webp?resize=800%2C450&ssl=1 diff --git a/published/202110/20211001 The Official Raspberry Pi 4 Case Sucks- Here-s What You Can do to Reduce the Overheating.md b/published/202110/20211001 The Official Raspberry Pi 4 Case Sucks- Here-s What You Can do to Reduce the Overheating.md new file mode 100644 index 0000000000..8b1b953f84 --- /dev/null +++ b/published/202110/20211001 The Official Raspberry Pi 4 Case Sucks- Here-s What You Can do to Reduce the Overheating.md @@ -0,0 +1,128 @@ +[#]: subject: "The Official Raspberry Pi 4 Case Sucks! Here’s What You Can do to Reduce the Overheating" +[#]: via: "https://itsfoss.com/raspberry-pi-case-overheating/" +[#]: author: "Avimanyu Bandyopadhyay https://itsfoss.com/author/avimanyu/" +[#]: collector: "lujun9972" +[#]: translator: "wxy" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13851-1.html" + +官方的树莓派 4 外壳很烂!怎么样减少过热? +====== + +![](https://img.linux.net.cn/data/attachment/album/202110/04/201826ghpecyb43cxehi4y.jpg) + +[树莓派 4][1] 绝对是数百万人的最爱,特别是在极客社区里,我也不例外。但是你知道树莓派在没有适当冷却的情况下会限制性能吗? + +在这里,我将介绍 [树莓派 4 官方外壳][2] 的一些严重缺点,同时也分享一些缓解这些缺点的方法。 + +![树莓派 4 官方外壳][3] + +在第一次启动后,我的安装在 [树莓派 4 官方外壳][2] 内的树莓派 4(8GB 内存版),在无人值守的升级启动时,会高达 80℃。我在 Ubuntu 上进行了所有的 [固件更新][4],显然是为了 [解决发热问题][5]。 + +就算在空闲时,这个烫手的香草和草莓蛋糕也绝不会低于 75℃。 + +我几乎无法使用它,直到我取下外壳顶部的白色盖子。它闲置时的温度降到只有 67℃ 左右 —— 你相信吗?即使是在我重新启动一段时间后再次检查也是这样。很明显,这仍然是不太可接受。如果我买了这个外壳并打算长期使用,我为什么要一直把盖子打开? + +为什么会发生这样的事情?这都是因为官方的树莓派外壳的设计非常糟糕。 + +### 官方的树莓派 4 外壳是一个发热怪物! + +简单地说,[热节流][6] 就是降低你的树莓派处理器(CPU)的性能,以使温度不超过极限高温(如 80℃)而 [导致损坏][7]。 + +这个外壳是由塑料制成的,它是热的不良导体(简单的 [传统物理学][8] 知识),因此无法将热量有效地散布到整个外壳和板子之外。因此,板上的处理器会发热,一旦温度达到惊人的程度,它的性能就会被降到一个极低的水平。我注意到,在第一次开机后,在**无人值守**的情况下进行升级时,CPU 的温度为 80℃,CPU 的使用率为 100%。 + +虽然这个官方的外壳看起来很美,但它对树莓派的性能造成了很大的影响。 + +如果你真的想让你的树莓派发挥最大的性能,你也必须负责它的冷却。这些发热问题不能被简单地忽视。 + +#### 热量被困在内部 + +一旦你把树莓派安装在这个外壳里,它甚至没有一个通风口可以让多余的热量排出。所以热量就一直在里面积累,直到达到那些疯狂的温度并触发了节流阀。 + +#### 没有风扇通风口(非常需要) + +顶部的白色盖子上可以有一个圆形的通风口,至少可以把 [树莓派 4 的官方风扇][9] 放在上面使用。 + +#### 没有被动冷却 + +如果外壳是金属的,它就可以作为散热器,有效地将树莓派板上的处理器的热量散发出去。 + +#### 除了发热问题之外,还有其他的缺点 + +树莓派 4 官方外壳还有一些缺点: + + 1. 不便于 SD 卡管理:将树莓派板子装入外壳内,并将 SD 卡端口放在正确的方向上,以便以后能够换卡,这不是很方便。 + 2. 没有螺丝钉系统:没有提供螺丝,也许是因为它可能会破坏机箱底座上的假支架,这些假支架看起来就像你可以用四颗螺丝把板子牢牢地固定在底座上。 + +### 你可以做什么来控制树莓派 4 的过热? + +在做了一些紧张的研究之后,我找到了市场上一些最好的冷却解决方案 —— 这一切都要归功于我们了不起的改装社区。 + +#### 使用冰塔式冷却器 + +我首先发现了 [Jeff Geerling's][10] 对各种树莓派散热器的深入性能评估,他在网上被称为 [geerlingguy][11]。在看完温度统计后,我直接选择了冰塔式散热器,并组装了它: + +![树莓派 4 冰塔冷却器][12] + +它空闲和低载时的温度下降到 30℃,现在保持在 45℃ 左右。我还没有为它改装一个合适的外壳。我准备找个给冷却器提供了足够的空间的现成外壳。也许可以在亚马逊或其他网上商店找到这种外壳。 + +但我没有找到这种产品。 + +#### 使用铝制散热器进行被动散热 + +网上也有一个关于 [被动冷却][17] 的出色视频,测评了一个用铝制散热片做的外壳。 + +它提供了一个热垫,它相当于台式机处理器上使用的散热膏。按照视频中显示的方式放置它,热量就会从树莓派板上的处理器散发到整个外壳内。这就是科学的神奇之处! + +#### 改装官方的树莓派外壳 + +如果你仍然想买官方的外壳,建议你至少要做一个风扇的改装。 + +### 潜在的制造解决方案 + +这里有一些解决方案,通过应用 [DevOps][21] 启发的改进,可以使整个制造过程更容易。 + + * 想一想,从外壳顶部切下的那块圆形塑料可以回收,用来制造更多的树莓派 4 外壳,不是吗?这显然会是一个双赢的局面,同时也降低了成本! + * 铝是地球上最丰富的金属,但 [全球供应中断][22] 可能是一个挑战。即使如此,还有其他的 [导电性解决方案][23] 来探索用于设计案例的材料! + +### 总结 + +希望这篇文章能帮助你从树莓派 4 中获得最大的收益。我很想知道你的想法、建议和经验,请在下面的评论中留言。请不要犹豫地分享。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/raspberry-pi-case-overheating/ + +作者:[Avimanyu Bandyopadhyay][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/avimanyu/ +[b]: https://github.com/lujun9972 +[1]: https://itsfoss.com/raspberry-pi-4/ +[2]: https://www.raspberrypi.org/products/raspberry-pi-4-case/ +[3]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/09/raspberry-pi-4-official-case.webp?resize=800%2C533&ssl=1 +[4]: https://www.einfochips.com/blog/understanding-firmware-updates-the-whats-whys-and-hows/ +[5]: https://www.seeedstudio.com/blog/2019/11/29/raspberry-pi-4-firmware-update-pi-4-now-runs-cooler-than-ever/ +[6]: https://www.pcmag.com/encyclopedia/term/thermal-throttling +[7]: https://www.pcgamer.com/cpu-temperature-overheat/ +[8]: https://thermtest.com/stay-colder-for-longer-in-a-container-made-of-plastic-or-metal +[9]: https://www.raspberrypi.org/products/raspberry-pi-4-case-fan/ +[10]: https://www.jeffgeerling.com/blog/2019/best-way-keep-your-cool-running-raspberry-pi-4 +[11]: https://www.jeffgeerling.com/about +[12]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/09/raspberry-pi-4-ice-tower-cooler.webp?resize=480%2C360&ssl=1 +[13]: https://i0.wp.com/m.media-amazon.com/images/I/51g9gQC9k7L._SL160_.jpg?ssl=1 +[14]: https://www.amazon.com/dp/B07V35SXMC?tag=chmod7mediate-20&linkCode=ogi&th=1&psc=1 (GeeekPi Raspberry Pi Cooling Fan, Raspberry Pi ICE Tower Cooler, RGB Cooling Fan with Raspberry Pi Heatsink for Raspberry Pi 4 Model B & Raspberry Pi 3B+ & Raspberry Pi 3 Model B) +[15]: https://www.amazon.com/gp/prime/?tag=chmod7mediate-20 (Amazon Prime) +[16]: https://www.amazon.com/dp/B07V35SXMC?tag=chmod7mediate-20&linkCode=ogi&th=1&psc=1 (Buy on Amazon) +[17]: https://buildabroad.org/2016/11/05/passive-cooling/ +[18]: https://i2.wp.com/m.media-amazon.com/images/I/41XGLQONCVS._SL160_.jpg?ssl=1 +[19]: https://www.amazon.com/dp/B07VD568FB?tag=chmod7mediate-20&linkCode=osi&th=1&psc=1 (Geekworm Raspberry Pi 4 Armor Case, Raspberry Pi 4 Computer Model B Armor Aluminum Alloy Passive Cooling Case Compatible with Raspberry Pi 4 Model B Only) +[20]: https://www.amazon.com/dp/B07VD568FB?tag=chmod7mediate-20&linkCode=osi&th=1&psc=1 (Buy on Amazon) +[21]: https://linuxhandbook.com/what-is-devops/ +[22]: https://www.reuters.com/article/global-metals-idUSL1N2Q90GA +[23]: https://news.mit.edu/2018/engineers-turn-plastic-insulator-heat-conductor-0330 diff --git a/published/202110/20211002 Monitor your Java on Linux with jconsole.md b/published/202110/20211002 Monitor your Java on Linux with jconsole.md new file mode 100644 index 0000000000..737b990907 --- /dev/null +++ b/published/202110/20211002 Monitor your Java on Linux with jconsole.md @@ -0,0 +1,104 @@ +[#]: subject: "Monitor your Java on Linux with jconsole" +[#]: via: "https://opensource.com/article/21/10/monitor-java-linux-jconsole" +[#]: author: "Alan Formy-Duval https://opensource.com/users/alanfdoss" +[#]: collector: "lujun9972" +[#]: translator: "wxy" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13860-1.html" + +用 jconsole 在 Linux 上监控你的 Java +====== + +> 如何使用 Java 开发工具包中的 Java 监控和管理控制台。 + +![](https://img.linux.net.cn/data/attachment/album/202110/08/131129bf3h3gv18388fl11.jpg) + +Java 开发工具包(JDK)提供了开发 Java 应用程序的二进制文件、工具和编译器。其中一个有用的工具是 `jconsole`。 + +为了演示,我将使用 WildFly J2EE 应用服务器,它是 JBOSS 开源应用服务器项目的一部分。首先,我启动了一个独立的实例。 + +``` +~/wildfly/24.0.1/bin$ ./standalone.sh +========================================================================= +  JBoss Bootstrap Environment +  JBOSS_HOME: /home/alan/wildfly/24.0.1 +  JAVA: /usr/lib/jvm/java-11-openjdk-11.0.11.0.9-5.fc34.x86_64/bin/java +``` + +现在,在另一个终端,输入 `jconsole`。 + +``` +$ jconsole +``` + +启动后,jconsole 会列出本地实例。选择“本地进程Local Process”,然后选择进程的名称并点击“连接Connect”。这就是连接并开始使用运行中的 Java 虚拟机(JVM)的 jconsole 的全部过程。 + +![jconsole 与本地进程的新连接屏幕][2] + +### 概述 + +这个 Java 监控和管理控制台在仪表板的顶部显示进程标识符(PID)。“概述Overview”标签有四个图表,显示“堆内存使用情况Heap Memory Usage”、“线程Threads”、“Classes”和“CPU 使用情况CPU Usage”的重要信息。 + +![jconsole 仪表板显示堆内存使用量、线程、类和 CPU 使用量][4] + +沿着顶部的标签提供每个区域的更详细的视图。 + +### 内存 + +“内存Memory”标签显示 JVM 所使用的内存的各个方面的图表。分配给 JVM 的服务器系统内存量被称为“Heap”。这个屏幕还提供了关于堆的内部组件使用情况的详细信息,例如 “伊甸园Eden Space”、“老年代Old Gen” 和 “幸存者区Survivor Space”。你也可以手动请求一个垃圾收集动作。 + +![jconsole 内存标签][5] + +### 线程 + +“线程Threads”标签显示有多少线程在运行。你也可以手动检查是否存在死锁。 + +![jconsole 线程仪表板显示了随时间变化的线程数量和滚动的线程列表][6] + +### 类 + +“Classes”标签告诉你有多少类被加载,有多少被卸载。 + +![jconsole 类标签显示随着时间推移加载的类数量][7] + +### 虚拟机摘要 + +“虚拟机摘要VM Summary”标签提供了许多关于应用程序和主机系统的细节。你可以了解你所处的操作系统和架构、系统内存总量、CPU 数量,甚至交换空间。 + +![jconsole 虚拟机摘要标签][8] + +摘要中显示的关于 JVM 的进一步细节,包括当前和最大的堆大小以及正在使用的垃圾收集器的信息。底部的窗格列出了传递给 JVM 的所有参数。 + +### MBeans + +最后一个标签,MBeans,让你通过所有的 MBeans 向下钻取,以查看每个 MBeans 的属性和值。 + +![MBeans 标签][9] + +### 总结 + +Java 已经存在了很长时间,它将继续为全球数百万的系统提供动力。有很多开发环境和监控系统可以使用,但像 `jconsole` 这样的包含在基本工具包中的工具非常有价值。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/10/monitor-java-linux-jconsole + +作者:[Alan Formy-Duval][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/alanfdoss +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/puzzle_computer_solve_fix_tool.png?itok=U0pH1uwj (Puzzle pieces coming together to form a computer screen) +[2]: https://opensource.com/sites/default/files/uploads/jconsole_new_connection_local.png (new connection) +[3]: https://creativecommons.org/licenses/by-sa/4.0/deed.ast +[4]: https://opensource.com/sites/default/files/uploads/jconsole_tab_overview.png (tab overview) +[5]: https://opensource.com/sites/default/files/uploads/jconsole_tab_memory.png (memory tab) +[6]: https://opensource.com/sites/default/files/uploads/jconsole_tab_threads.png (threads tab) +[7]: https://opensource.com/sites/default/files/uploads/jconsole_tab_classes.png (classes tab) +[8]: https://opensource.com/sites/default/files/uploads/jconsole_tab_vm-summary.png (VMsummary tab ) +[9]: https://opensource.com/sites/default/files/uploads/jconsole_tab_mbeans.png (MBeans tab) diff --git a/published/202110/20211003 Open Source Changed Linux Otherwise It Was Done- Linus Torvalds.md b/published/202110/20211003 Open Source Changed Linux Otherwise It Was Done- Linus Torvalds.md new file mode 100644 index 0000000000..792706a9e8 --- /dev/null +++ b/published/202110/20211003 Open Source Changed Linux Otherwise It Was Done- Linus Torvalds.md @@ -0,0 +1,57 @@ +[#]: subject: "Open Source Changed Linux Otherwise It Was Done: Linus Torvalds" +[#]: via: "https://news.itsfoss.com/open-source-changed-linux-torvalds/" +[#]: author: "Abhishek https://news.itsfoss.com/author/root/" +[#]: collector: "lujun9972" +[#]: translator: "zd200572" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13890-1.html" + +Linus Torvalds :开源改变了 Linux, 否则它就完了 +====== + +> Linux 本来会像其他业余项目一样被抛在后面,但开源改变了这一点。 + +![](https://i2.wp.com/news.itsfoss.com/wp-content/uploads/2021/10/torvalds-linux-kernel.png?w=1200&ssl=1) + +你可能已经知道这个故事,30 年前,芬兰学生 Linus Torvalds 开发了一个业余项目,创建了一个类 UNIX 操作系统。 + +你不知道的是,Torvalds 认为这个业余项目已经完成了,他本想把它抛在脑后,做一些新的、有趣的项目。 + +那么,是什么让他在这个“业余项目”上工作了 30 年呢?答案是开源。 + +### 开源改变了 Linux + +在最近结束的 [北美开源峰会][1] 上,Linus Torvalds 分享了一些关于 Linux 项目过去、现在和未来的见解。 + +当回忆起这个项目的最初情况时,[Torvalds 说][2] 他本以为会以“已完成的状态”抛下 Linux 这个项目,而去做些新的、有趣的事情。 + +> 显然是开源改变了这一切。这个项目,如果是由我来决定,我可能会把它抛在一边,但是突然间,我开始收到各种问题,最后还有人们提交的补丁,这使得我的动力不断持续。现在 30 年过去了,这仍然是动力所在。 + +Torvalds 还补充说,就他而言,Linux 在过去 29 年里已经完成了。以后添加的每一个其他的功能,都是其他人需要、想要或感兴趣的。 + +许多开发人员都会遇到这种情况。你在一个项目上工作,认为它已经达到“完成”的状态了,如果这个项目没有足够的吸引力,你就会对它失去兴趣,转而去做一些“新的、有趣的”事情。实际上继续这个项目的真正动力来自用户和认可。 + +当被问及 Linux 50 周年要做些什么时,Torvalds 说,他不认为自己在 70 岁的时候还能继续做内核编程。然后他还补充说,他也没想过自己在 50 岁还在做内核编程,但他现在却在做这个事情。 + +> “不知何故,我不认为我 70 岁还能做内核编程。但是另一方面,几年前,我也没想到自己 50 岁还在做内核编程,所以……我们拭目以待。” + +我们总是愿意听 Torvalds 谈论 Linux,作为一个热心的 Linux 用户,我们还有如此多需要学习和交流的东西! + +来源:[The News Stack][2] + +-------------------------------------------------------------------------------- + +via: https://news.itsfoss.com/open-source-changed-linux-torvalds/ + +作者:[Abhishek][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://news.itsfoss.com/author/root/ +[b]: https://github.com/lujun9972 +[1]: https://events.linuxfoundation.org/open-source-summit-north-america/ +[2]: https://thenewstack.io/linus-torvalds-on-community-rust-and-linuxs-longevity/ diff --git a/published/202110/20211005 Tools to explore BGP.md b/published/202110/20211005 Tools to explore BGP.md new file mode 100644 index 0000000000..5b9e728692 --- /dev/null +++ b/published/202110/20211005 Tools to explore BGP.md @@ -0,0 +1,364 @@ +[#]: subject: "Tools to explore BGP" +[#]: via: "https://jvns.ca/blog/2021/10/05/tools-to-look-at-bgp-routes/" +[#]: author: "Julia Evans https://jvns.ca/" +[#]: collector: "lujun9972" +[#]: translator: "wxy" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13857-1.html" + +由 Facebook 事故引发的 BGP 工具探索 +====== + +![](https://img.linux.net.cn/data/attachment/album/202110/07/093743krr8ftrpvgfrvffx.jpg) + +昨天,Facebook 发生了由 BGP 引起的离线事故。我对学习更多关于 BGP 的知识已经隐约感兴趣了很长时间,所以我阅读了一些文章。 + +我感到很沮丧,因为没有一篇文章告诉我如何在我的电脑上实际查找与 BGP 有关的信息,因此我 [写了一条询问有关工具的推特][1]。 + +我一如既往地得到了一堆有用的回复,所以这篇博文展示了一些你可以用来查询 BGP 信息的工具。这篇文章中可能会有较多的错误,因为我对 BGP 不是很了解。 + +### 我不能发布 BGP 路由 + +我从来没有了解过 BGP 的原因之一是,据我所知,我没有在互联网上发布 BGP 路由的权限。 + +对于大多数网络协议,如果需要,你可以非常轻松地自己实现该协议。例如,你可以: + + * 发行你自己的 TLS 证书 + * 编写你自己的 HTTP 服务器 + * 编写你自己的 TCP 实现 + * 为你的域名编写你自己的权威 DNS 服务器(我现在正在为一个小项目尝试这样做) + * 建立你自己的证书机构(CA) + +但是对于 BGP,我认为除非你拥有自己的 ASN,否则你不能自己发布路由(你*可以*在你的家庭网络上实现 BGP,但这对我来说有点无聊,当我做实验的时候,我希望它们真的在真正的互联网上)。 + +无论如何,尽管我不能用它做实验,但我仍然认为它超级有趣,因为我喜欢网络,所以我将向你展示我找到的一些用来学习 BGP 的工具。 + +首先我们来谈谈 BGP 的一些术语。我打算很快掠过,因为我对工具更感兴趣,而且网上有很多关于 BGP 的高水平解释(比如这篇 [cloudflare 的文章][2])。 + +### AS 是什么? + +我们首先需要了解的是 AS(“自治系统autonomous system”)。每个 AS: + + 1. 由一个组织拥有(通常是一个大型组织,如你的 ISP、政府、大学、Facebook 等)。 + 2. 控制一组特定的 IP 地址(例如,我的 ISP 的 AS 包括 247,808 个 IP 地址)。 + 3. 有一个编号 ASN(如 1403)。 + +下面是我通过做一些实验对 AS 的一些观察: + + * 一些相当大的科技公司并没有自己的 AS。例如,我在 BGPView 上查看了 Patreon,就我所知,他们没有自己的 AS,他们的主要网站(`patreon.com`,[104.16.6.49][3])在 Cloudflare 的 AS 中。 + * 一个 AS 可以包括许多国家的 IP。Facebook 的 AS([AS32934][4])肯定有新加坡、加拿大、尼日利亚、肯尼亚、美国和其他国家的 IP 地址。 + * 似乎 IP 地址可以在一个以上的 AS 中。例如,如果我查找 [209.216.230.240][5],它有 2 个 ASN 与之相关:`AS6130` 和 `AS21581`。显然,当这种情况发生时,更具体的路线会被优先考虑 —— 所以到该 IP 的数据包会被路由到 `AS21581`。 + +### 什么是 BGP 路由? + +互联网上有很多的路由器。例如,我的 ISP 就有路由器。 + +当我给我的 ISP 发送一个数据包时(例如通过运行 `ping 129.134.30.0`),我的 ISP 的路由器需要弄清楚如何将我的数据包实际送到 IP 地址 `129.134.30.0`。 + +路由器计算的方法是,它有一个**路由表**:这是个有一堆 IP 地址范围的列表(比如 `129.134.30.0/23`),以及它知道的到达该子网的路由。 + +下面是一个 `129.134.30.0/23` (Facebook 的一个子网)的真实路由的例子。这不是来自我的 ISP。 + +``` +11670 32934 + 206.108.35.2 from 206.108.35.254 (206.108.35.254) + Origin IGP, metric 0, valid, external + Community: 3856:55000 + Last update: Mon Oct 4 21:17:33 2021 +``` + +我认为这是在说通往 `129.134.30.0` 的一条路径是通过机器 `206.108.35.2`,这是在它的本地网络上。所以路由器接下来可能会把我的 ping 包发送到 `206.108.35.2`,然后 `206.108.35.2` 会知道如何把它送到 Facebook。开头的两个数字(`11670 32934`)是 ASN。 + +### BGP 是什么? + +我对 BGP 的理解非常浅薄,它是一个公司用来公布 BGP 路由的协议。 + +昨天发生在 Facebook 身上的事情基本上是他们发布了一个 BGP 公告,撤销了他们所有的 BGP 路由,所以世界上的每个路由器都删除了所有与 Facebook 有关的路由,没有流量可以到达那里。 + +好了,现在我们已经涵盖了一些基本的术语,让我们来谈谈你可以用来查看 AS 和 BGP 的工具吧! + +### 工具 1:用 BGPView 查看你的 ISP 的 AS + +为了使 AS 这个东西不那么抽象,让我们用一个叫做 [BGPView][6]的 工具来看看一个真实的 AS。 + +我的 ISP(EBOX)拥有 [AS 1403][7]。这是 [我的 ISP 拥有的 IP 地址][8]。如果我查找我的计算机的公共 IPv4 地址,我可以看到它是我的 ISP 拥有的IP地址之一:它在 `104.163.128.0/17` 块中。 + +BGPView 也有这个图,显示了我的 ISP 与其他 AS 的连接情况。 + +![][9] + +### 工具 2:traceroute -A 和 mtr -z + +好了,我们感兴趣的是 AS 。让我们看看我从哪些 AS 中穿过。 + +`traceroute` 和 `mtr` 都有选项可以告诉你每个 IP 的 ASN。其选项分别是 `traceroute -A` 和 `mtr -z`。 + +让我们看看我用 `mtr` 在去 `facebook.com` 的路上经过了哪些 AS! + +``` +$ mtr -z facebook.com + 1. AS??? LEDE.lan + 2. AS1403 104-163-190-1.qc.cable.ebox.net + 3. AS??? 10.170.192.58 + 4. AS1403 0.et-5-2-0.er1.mtl7.yul.ebox.ca + 5. AS1403 0.ae17.er2.mtl3.yul.ebox.ca + 6. AS1403 0.ae0.er1.151fw.yyz.ebox.ca + 7. AS??? facebook-a.ip4.torontointernetxchange.net + 8. AS32934 po103.psw01.yyz1.tfbnw.net + 9. AS32934 157.240.38.75 +10. AS32934 edge-star-mini-shv-01-yyz1.facebook.com +``` + +这很有意思,看起来我们直接从我的 ISP 的 AS(`1403`)到 Facebook 的 AS(`32934`),中间有一个“互联网交换”。 + +> 我不确定 [互联网交换][10]internet exchange(IX)是什么,但我知道它是互联网的一个极其重要的部分。不过这将是以后的事了。我猜是,它是互联网中实现“对等”的部分,就假设它是一个有巨大的交换机的机房,里面有无限的带宽,一堆不同的公司把他们的电脑放在里面,这样他们就可以互相发送数据包。 + +#### mtr 用 DNS 查找 ASN + +我对 `mtr` 如何查找 ASN 感到好奇,所以我使用了 `strace`。我看到它看起来像是在使用 DNS,所以我运行了 [dnspeep][11],然后就看到了! + +``` +$ sudo dnspeep +... +TXT 1.190.163.104.origin.asn.cymru.com 192.168.1.1 TXT: 1403 | 104.163.176.0/20 | CA | arin | 2014-08-14, TXT: 1403 | 104.163.160.0/19 | CA | arin | 2014-08-14, TXT: 1403 | 104.163.128.0/17 | CA | arin | 2014-08-14 +... +``` + +所以,看起来我们可以通过查找 `1.190.163.104.origin.asn.cymru.com` 上的 `txt` 记录找到 `104.163.190.1` 的 ASN,像这样: + +``` +$ dig txt 1.190.163.104.origin.asn.cymru.com +1.190.163.104.origin.asn.cymru.com. 13911 IN TXT "1403 | 104.163.160.0/19 | CA | arin | 2014-08-14" +1.190.163.104.origin.asn.cymru.com. 13911 IN TXT "1403 | 104.163.128.0/17 | CA | arin | 2014-08-14" +1.190.163.104.origin.asn.cymru.com. 13911 IN TXT "1403 | 104.163.176.0/20 | CA | arin | 2014-08-14" +``` + +这很好!让我们继续前进吧。 + +### 工具 3:数据包交换所的观察镜 + +PCH(“数据包交换所packet clearing house”)是运行大量互联网交换点的组织。“观察镜looking glass”似乎是一个通用术语,指的是让你从另一个人的计算机上运行网络命令的 Web 表单。有一些观察镜不支持 BGP,但我只对那些能显示 BGP 路由信息的观察镜感兴趣。 + +这里是 PCH 的观察镜: 。 + +在该网站的 Web 表单中,我选择了多伦多 IX(“TORIX”),因为 `mtr` 说我是用它来访问 `facebook.com` 的。 + +#### 操作 1:显示 ip bgp 摘要 + +下面是输出结果。我修改了其中的一些内容: + +``` +IPv4 Unicast Summary: +BGP router identifier 74.80.118.4, local AS number 3856 vrf-id 0 +BGP table version 33061919 +RIB entries 513241, using 90 MiB of memory +Peers 147, using 3003 KiB of memory +Peer groups 8, using 512 bytes of memory + +Neighbor V AS MsgRcvd MsgSent TblVer InQ OutQ Up/Down State/PfxRcd +... +206.108.34.248 4 1403 484672 466938 0 0 0 05w3d03h 50 +... +206.108.35.2 4 32934 482088 466714 0 0 0 01w6d07h 38 +206.108.35.3 4 32934 482019 466475 0 0 0 01w0d06h 38 +... + +Total number of neighbors 147 +``` + +我的理解是,多伦多 IX(“TORIX”)直接连接到我的 ISP (EBOX,AS 1403)和 Facebook(AS 32934)。 + +#### 操作 2:显示 ip bgp 129.134.30.0 + +这是筛选自 `show ip bgp` 对 `129.134.30.0`(Facebook 的一个 IP 地址)的输出: + +``` +BGP routing table entry for 129.134.30.0/23 +Paths: (4 available, best #4, table default) + Advertised to non peer-group peers: + 206.220.231.55 + 11670 32934 + 206.108.35.2 from 206.108.35.254 (206.108.35.254) + Origin IGP, metric 0, valid, external + Community: 3856:55000 + Last update: Mon Oct 4 21:17:33 2021 + + 11670 32934 + 206.108.35.2 from 206.108.35.253 (206.108.35.253) + Origin IGP, metric 0, valid, external + Community: 3856:55000 + Last update: Mon Oct 4 21:17:31 2021 + + 32934 + 206.108.35.3 from 206.108.35.3 (157.240.58.225) + Origin IGP, metric 0, valid, external, multipath + Community: 3856:55000 + Last update: Mon Oct 4 21:17:27 2021 + + 32934 + 206.108.35.2 from 206.108.35.2 (157.240.58.182) + Origin IGP, metric 0, valid, external, multipath, best (Older Path) + Community: 3856:55000 + Last update: Mon Oct 4 21:17:27 2021 +``` + +这似乎是在说,从该 IX 到 Facebook 有 4 条路线。 + +**魁北克 IX 似乎对 Facebook 一无所知**。 + +我也试过从魁北克 IX(“QIX”,它可能离我更近,因为我住在蒙特利尔而不是多伦多)做同样的事情。但 QIX 似乎对 Facebook 一无所知:当我输入`129.134.30.0` 时,它只是说 “% 网络不在表中”。 + +所以我想这就是为什么我被送到多伦多 IX 而不是魁北克的 IX。 + +#### 更多的 BGP 观察镜 + +这里还有一些带观察镜的网站,可以从其他角度给你类似的信息。它们似乎都支持相同的 `show ip bgp` 语法,也许是因为他们运行的是同一个软件?我不太确定。 + + * + * + * + +似乎有很多这样的观察镜服务,远不止这 3 个列表。 + +这里有一个与这个列表上的一个服务器进行会话的例子:`route-views.routeviews.org`。这次我是通过 telnet 连接的,而不是通过 Web 表单,但输出的格式看起来是一样的。 + +``` +$ telnet route-views.routeviews.org + +route-views>show ip bgp 31.13.80.36 + +BGP routing table entry for 31.13.80.0/24, version 1053404087 +Paths: (23 available, best #2, table default) + Not advertised to any peer + Refresh Epoch 1 + 3267 1299 32934 + 194.85.40.15 from 194.85.40.15 (185.141.126.1) + Origin IGP, metric 0, localpref 100, valid, external + path 7FE0C3340190 RPKI State valid + rx pathid: 0, tx pathid: 0 + Refresh Epoch 1 + 6939 32934 + 64.71.137.241 from 64.71.137.241 (216.218.252.164) + Origin IGP, localpref 100, valid, external, best + path 7FE135DB6500 RPKI State valid + rx pathid: 0, tx pathid: 0x0 + Refresh Epoch 1 + 701 174 32934 + 137.39.3.55 from 137.39.3.55 (137.39.3.55) + Origin IGP, localpref 100, valid, external + path 7FE1604D3AF0 RPKI State valid + rx pathid: 0, tx pathid: 0 + Refresh Epoch 1 + 20912 3257 1299 32934 + 212.66.96.126 from 212.66.96.126 (212.66.96.126) + Origin IGP, localpref 100, valid, external + Community: 3257:8095 3257:30622 3257:50001 3257:53900 3257:53904 20912:65004 + path 7FE1195AF140 RPKI State valid + rx pathid: 0, tx pathid: 0 + Refresh Epoch 1 + 7660 2516 1299 32934 + 203.181.248.168 from 203.181.248.168 (203.181.248.168) + Origin IGP, localpref 100, valid, external + Community: 2516:1030 7660:9001 + path 7FE0D195E7D0 RPKI State valid + rx pathid: 0, tx pathid: 0 +``` + +这里有几个路由的选择: + + * `3267 1299 32934` + * `6939 32934` + * `701 174 32934` + * `20912 3257 1299 32934` + * `7660 2516 1299 32934` + +我想这些都有不止一个 AS 的原因是,`31.13.80.36` 是 Facebook 在多伦多的 IP 地址,所以这个服务器(可能在美国西海岸,我不确定)不能直接连接到它,它需要先到另一个 AS。所以所有的路由都有一个或多个 ASN。 + +最短的是 `6939`(“Hurricane Electric”),它是一个 “全球互联网骨干”。他们也有自己的 [Hurricane Electric 观察镜][12] 页面。 + +### 工具 4:BGPlay + +到目前为止,所有其他的工具都只是向我们展示了 Facebook 路由的当前状态,其中一切正常,但这第四个工具让我们看到了这个 Facebook BGP 互联网灾难的历史。这是一个 GUI 工具,所以我将包括一堆屏幕截图。 + +该工具在 。我输入了 IP 地址 `129.134.30.12`(Facebook 的一个 IP),如果你想一起试试。 + +首先,让我们看看一切出错之前的状态。我点击了在 10 月 4 日 13:11:28 的时间线,得到了这个结果: + +![][13] + +我最初发现这很让人不知所措。发生了什么事?但后来有人在推特上指出,下一个要看的地方是点击 Facebook 灾难发生后的时间线(10 月 4 日 18 点 38 分)。 + +![][14] + +很明显,这张图有问题:所有的 BGP 路线都不见了!哦,不要! + +顶部的文字显示了最后一条 Facebook BGP 路由的消失: + +``` +Type: W > withdrawal Involving: 129.134.30.0/24 +Short description: The route 50869, 25091, 32934 has been withdrawn. +Date and time: 2021-10-04 16:02:33 Collected by: 20-91.206.53.12 +``` + +如果我再点击“快进fast forward”按钮,我们看到 BGP 路由开始回来了。 + +![][15] + +第一个宣告的是 `137409 32934`。但我不认为这实际上是第一个宣布的,在同一秒内有很多路由宣告(在 2021-10-04 21:00:40),我认为 BGPlay 内部的排序是任意的。 + +如果我再次点击“快进fast forward”按钮,越来越多的路由开始回来,路由开始恢复正常。 + +我发现在 BGPlay 里看这个故障真的很有趣,尽管一开始界面很混乱。 + +### 也许了解一下 BGP 是很重要的? + +我在这篇文章的开头说,你不能改变 BGP 路由,但后来我想起在 2016 年或 2017 年,有一个 [Telia 路由问题][16],给我们的工作造成了一些小的网络问题。而当这种情况发生时,了解为什么你的客户无法到达你的网站其实是很有用的,即使它完全不受你控制。当时我不知道这些工具,但我希望能知道! + +我认为对于大多数公司来说,应对由其他人的错误 BGP 路由造成的中断,你所能做的就是“什么都不做,等待它得到修复”,但能够_自信地_什么都不做是很好的。 + +### 一些发布 BGP 路由的方法 + +如果你想(作为一个业余爱好者)真正发布 BGP 路由,这里有一些评论中的链接: + + * [获取你自己的 ASN 的指南][17] + * [dn42][18] 似乎有一个 BGP 的实验场(它不在公共互联网上,但确实有其他人在上面,这似乎比自己在家里做 BGP 实验更有趣) + +### 目前就这些了 + +我想还有很多 BGP 工具(比如 PCH 有一堆 [路由数据的每日快照][19],看起来很有趣),但这篇文章已经很长了,而且我今天还有其他事情要做。 + +我对我作为一个普通人可以得到这么多关于 BGP 的信息感到惊讶,我一直认为它是一个“秘密的网络巫师”这样的东西,但显然有各种公共机器,任何人都可以直接 telnet 到它并用来查看路由表!没想到! + +-------------------------------------------------------------------------------- + +via: https://jvns.ca/blog/2021/10/05/tools-to-look-at-bgp-routes/ + +作者:[Julia 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://jvns.ca/ +[b]: https://github.com/lujun9972 +[1]: https://twitter.com/b0rk/status/1445199475195236356 +[2]: https://blog.cloudflare.com/october-2021-facebook-outage/ +[3]: https://bgpview.io/ip/104.16.6.49 +[4]: https://bgpview.io/asn/32934#prefixes-v4 +[5]: https://bgpview.io/ip/209.216.230.240 +[6]: https://bgpview.io +[7]: https://bgpview.io/asn/1403 +[8]: https://bgpview.io/asn/1403#prefixes-v4 +[9]: https://jvns.ca/images/ebox-graph.png +[10]: https://en.wikipedia.org/wiki/Internet_exchange_point +[11]: https://github.com/jvns/dnspeep/ +[12]: https://lg.he.net/ +[13]: https://jvns.ca/images/bgplay-before.png +[14]: https://jvns.ca/images/bgplay-after.png +[15]: https://jvns.ca/images/bgplay-return.png +[16]: https://news.ycombinator.com/item?id=14246888 +[17]: https://labs.ripe.net/author/samir_jafferali/build-your-own-anycast-network-in-nine-steps/ +[18]: https://dn42.eu/Home +[19]: https://www.pch.net/resources/Routing_Data/IPv4_daily_snapshots/ diff --git a/published/202110/20211006 Check Java processes on Linux with the jps command.md b/published/202110/20211006 Check Java processes on Linux with the jps command.md new file mode 100644 index 0000000000..b43db9696d --- /dev/null +++ b/published/202110/20211006 Check Java processes on Linux with the jps command.md @@ -0,0 +1,70 @@ +[#]: subject: "Check Java processes on Linux with the jps command" +[#]: via: "https://opensource.com/article/21/10/check-java-jps" +[#]: author: "Alan Formy-Duval https://opensource.com/users/alanfdoss" +[#]: collector: "lujun9972" +[#]: translator: "unigeorge" +[#]: reviewer: "turbokernel" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13871-1.html" + +在 Linux 上使用 jps 命令检查 Java 进程 +====== + +> 系统上运行着诸多进程,通过 `jps` 命令能够快速有效识别 Java 进程。 + +![](https://img.linux.net.cn/data/attachment/album/202110/11/102806lhhtyalq2lv2vbte.jpg) + +在 Linux 中,有一些用于查看系统上运行进程的命令。进程是指由内核管理的正在进行的事件。每启动一个应用程序时,就会产生一个进程,但也有许多在计算机后台运行的进程,如保持系统时间准确的进程、监听新文件系统的进程、索引化文件的进程等。有一些可以用来监测这些进程的实用程序,比如包含在 [procps-ng 包][2] 中的程序,但它们往往都是对各种进程通用的。它们会查看计算机上的所有进程,你可以根据需要过滤结果列表。 + +在 Linux 中,可以通过 `ps` 命令查看进程。这是查看当前系统上运行进程最简单的方法。 + +``` +$ ps +    PID TTY          TIME CMD +   4486 pts/0    00:00:00 bash +  66930 pts/0    00:00:00 ps +``` + +你也可以通过 `ps` 命令,并配合结果输出管道符进行 `grep`,从而查看系统上运行的 Java 进程,。 + +``` +$ ps ax |grep java + 67604 pts/1 Sl+ 0:18 /usr/lib/jvm/java-11-openjdk-11.0.12.0.7-4.fc34.x86_64/bin/java -D[Standalone] -server -Xms64m -Xmx512m -XX:MetaspaceSize=96M -XX:MaxMetaspaceSize=256m -Djava.net.preferIPv4Stack=true -Djboss.modules.system.pkgs=org.jboss.byteman -Djava.awt.headless=true --add-exports=java.desktop/sun.awt=ALL-UNNAMED --add-exports=java.naming/com.sun.jndi.ldap=ALL-UNNAMED --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.lang.invoke=ALL-UNNAMED --add-opens=java.base/java.io=ALL-UNNAMED --add-opens=java.base/java.security=ALL-UNNAMED --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.management/javax.management=ALL-UNNAMED --add-opens=java.naming/javax.naming=ALL-UNNAMED -Dorg.jboss.boot.log.file=/home/alan/wildfly/24.0.1/standalone/log/server.log -Dlogging.configuration=file:/home/alan/wildfly/24.0.1/standalone/configuration/logging.properties -jar /home/alan/wildfly/24.0.1/jboss-modules.jar -mp /home/alan/wildfly/24.0.1/modules org.jboss.as.standalone -Djboss.home.dir=/home/alan/wildfly/24.0.1 -Djboss.server.base.dir=/home/alan/wildfly/24.0.1/standalone +``` + +然而,OpenJDK 有自己专属的进程监视器。Java 虚拟机进程状态Java Virtual Machine Process Status(jps)工具可以帮你扫描系统上所有运行的 Java 虚拟机(JVM)实例。 + +要想实现与 `ps` 命令类似的输出,可以使用 `-v` 选项。这很实用,这与 `ps` 相比,可以减少你的输入。 + +``` +$ jps -v +67604 jboss-modules.jar -D[Standalone] -Xms64m -Xmx512m -XX:MetaspaceSize=96M -XX:MaxMetaspaceSize=256m -Djava.net.preferIPv4Stack=true -Djboss.modules.system.pkgs=org.jboss.byteman -Djava.awt.headless=true --add-exports=java.desktop/sun.awt=ALL-UNNAMED --add-exports=java.naming/com.sun.jndi.ldap=ALL-UNNAMED --add-opens=java.base/java.lang=ALL-UNNAMED --add-opens=java.base/java.lang.invoke=ALL-UNNAMED --add-opens=java.base/java.io=ALL-UNNAMED --add-opens=java.base/java.security=ALL-UNNAMED --add-opens=java.base/java.util=ALL-UNNAMED --add-opens=java.management/javax.management=ALL-UNNAMED --add-opens=java.naming/javax.naming=ALL-UNNAMED -Dorg.jboss.boot.log.file=/home/alan/wildfly/24.0.1/standalone/log/server.log -Dlogging.configuration=file:/home/alan/wildfly/24.0.1/standalone/configuration/logging.properties +``` + +`jps` 命令的默认输出包含进程标识符,类名或 Jar 文件名。 + +``` +$ jps +67604 jboss-modules.jar +69430 Jps +``` + +**注意:** `jps` 的手册页指出此命令是试验性且不受支持的。尽管如此,它仍然是一个不错的选择,因为一个系统通常运行着许多进程,这种只识别 Java 进程的快速方法是很有用的。 + +当下的 Java 仍然是一种流行的语言,所以熟悉 Java 开发工具包和运行时环境仍然很重要。它们包含着许多适用于 Java 应用程序开发和维护的工具。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/10/check-java-jps + +作者:[Alan Formy-Duval][a] +选题:[lujun9972][b] +译者:[unigeorge](https://github.com/unigeorge) +校对:[turbokernel](https://github.com/turbokernel) + +本文由 [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/java-coffee-beans.jpg?itok=3hkjX5We (Coffee beans) +[2]: https://opensource.com/article/21/8/linux-procps-ng diff --git a/published/202110/20211006 DirectX 11-12 Games like Cyberpunk 2077 Can Use NVIDIA DLSS With Proton Experimental on Linux.md b/published/202110/20211006 DirectX 11-12 Games like Cyberpunk 2077 Can Use NVIDIA DLSS With Proton Experimental on Linux.md new file mode 100644 index 0000000000..6ae2ebe009 --- /dev/null +++ b/published/202110/20211006 DirectX 11-12 Games like Cyberpunk 2077 Can Use NVIDIA DLSS With Proton Experimental on Linux.md @@ -0,0 +1,94 @@ +[#]: subject: "DirectX 11/12 Games like Cyberpunk 2077 Can Use NVIDIA DLSS With Proton Experimental on Linux" +[#]: via: "https://news.itsfoss.com/nvidia-dlss-dx-11-12-proton/" +[#]: author: "Rishabh Moharir https://news.itsfoss.com/author/rishabh/" +[#]: collector: "lujun9972" +[#]: translator: "wxy" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13865-1.html" + +《赛博朋克 2077》等 DirectX 11/12 游戏可在 Linux 上体验 DLSS 了 +====== + +> 通过 Steam Proton 的实验版本,期待已久的 Nvidia DLSS 支持在 Linux 上的 DirectX 11/12 大作中出现。 + +![](https://i0.wp.com/news.itsfoss.com/wp-content/uploads/2021/10/nvidia-dlss-proton.png?w=1200&ssl=1) + +6 月,英伟达 [宣布][1] 通过 Steam Proton 支持 Linux 中的 DLSS,并为基于 Vulkan 的游戏提供了测试版驱动程序。 + +DLSS 是指深度学习超级采样Deep Learning Super Sampling。它利用由 RTX GPU 中的 Tensor 核心提供支持的深度学习算法来提升游戏中的图像。这将使图像更清晰、更锐利,并提高帧率。 + +![来源:英伟达][2] + +这种 [升级技术][3] 类似于 AMD 的 Fidelity FX,甚至更接近于英特尔即将推出的 XeSS,与 DLSS 不同的是这两者都是开源的。玩家已经可以通过 [GloriousEggroll][4] 的定制 Proton GE 版本体验到 Fidelity FX。 + +此外,英伟达还计划在今年秋天之前将支持范围扩大到 DirectX 游戏。 + +而且,随着最新的 Proton 实验性支持,这一切终于实现了。使用英伟达 GPU 的 Linux 游戏玩家现在可以用 DLSS 玩他们最喜欢的基于 DX11/12 的游戏。 + +考虑到我们很快就能在 Linux 上玩各种多人游戏,并且 [Proton 中添加了对 BattleEye & Easy-Anti Cheat 的支持][5],这是进行这项添加的最好时机。 + +### Steam Porton 的重大更新 + +几天前,伴随着 Proton 6.3-7 的一波改进,Valve 终于设法将 DLSS 支持添加到 Proton 的 DirectX 11/12 游戏实验分支中。 + +在此之前,需要一个测试版驱动程序才能将 DLSS 用于基于 Vulkan 的游戏,例如 DOOM Eternal。 + +但是,现在不再如此 —— 尽管推荐使用最新的驱动程序。 + +作为补充,DXVK 和 Steamworks SDK 也已经更新到最新的开发版本。此外,还修复了特定游戏的性能问题和其他错误。 + +你可以查看 Proton 的 [官方 GitHub 更新日志][6] 来了解到目前为止支持的所有游戏的改进列表。 + +### 为 DX11/12 游戏启用 DLSS + +启用 DLSS 是一个简单明了的过程。 + +首先,你必须确保你的 Windows 游戏可以在 Proton Experimental 上运行。 + +这可以通过右键点击游戏并选择“属性Properties”来完成。然后在“兼容性Compatibility”下,你需要勾选“强制使用特定的 Steam Play 兼容工具Force the use of a specific Steam Play compatibility tool”复选框。接下来,从下拉菜单中选择 “Proton Experimental”。 + +![][7] + +最后,你需要在“启动选项Launch Options”中插入命令:`PROTON_HIDE_NVIDIA_GPU=0 PROTON_ENABLE_NVAPI=1 %command%` 。 + +![][8] + +这就行了。你就可以用 DLSS 玩你的游戏了! + +### 总结 + +英伟达 DLSS 对于许多游戏来说是一个非常需要的功能,因为它的作用很大。 + +Linux 从一开始就没有对 DLSS 的全面支持。但是,看起来它很快就会在未来的 Proton 稳定版本中提供,并进行必要的改进。 + +Linux 玩家终于可以用基于 RTX 的 GPU 在许多游戏中体验到更好的帧率和视觉质量。 + +虽然我在 AMD 显卡上使用 Fidelity FX,但我仍然渴望在 RTX GPU 上尝试 DLSS! + +你对英伟达 DLSS 的到来有什么感觉?你会很快尝试它吗?欢迎在下面分享你的评论。 + +转自:[GamingOnLinux][9]。 + +-------------------------------------------------------------------------------- + +via: https://news.itsfoss.com/nvidia-dlss-dx-11-12-proton/ + +作者:[Rishabh Moharir][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://news.itsfoss.com/author/rishabh/ +[b]: https://github.com/lujun9972 +[1]: https://www.nvidia.com/en-us/geforce/news/june-2021-rtx-dlss-game-update/ +[2]: https://i0.wp.com/news.itsfoss.com/wp-content/uploads/2021/10/DLSS_RDD2.jpg?w=800&ssl=1 +[3]: https://news.itsfoss.com/intel-xess-open-source/ +[4]: https://github.com/GloriousEggroll/proton-ge-custom +[5]: https://news.itsfoss.com/easy-anti-cheat-linux/ +[6]: https://github.com/ValveSoftware/Proton/wiki/Changelog +[7]: https://i2.wp.com/news.itsfoss.com/wp-content/uploads/2021/10/Compatibility.png?w=836&ssl=1 +[8]: https://i2.wp.com/news.itsfoss.com/wp-content/uploads/2021/10/Commands-1.png?w=831&ssl=1 +[9]: https://www.gamingonlinux.com/2021/10/proton-experimental-expands-nvidia-dlss-support-on-linux-to-directx-11-titles diff --git a/published/202110/20211007 Rotate and archive logs with the Linux logrotate command.md b/published/202110/20211007 Rotate and archive logs with the Linux logrotate command.md new file mode 100644 index 0000000000..54fed8f9b4 --- /dev/null +++ b/published/202110/20211007 Rotate and archive logs with the Linux logrotate command.md @@ -0,0 +1,218 @@ +[#]: subject: "Rotate and archive logs with the Linux logrotate command" +[#]: via: "https://opensource.com/article/21/10/linux-logrotate" +[#]: author: "Ayush Sharma https://opensource.com/users/ayushsharma" +[#]: collector: "lujun9972" +[#]: translator: "perfiffer" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13909-1.html" + +使用 logrotate 命令轮转和归档日志 +====== + +> 使用此 Linux 命令保持日志文件更新。 + +![](https://img.linux.net.cn/data/attachment/album/202110/22/113833i6ikk4dzdm3y3hkk.jpg) + +日志非常适合找出应用程序在做什么或对可能的问题进行故障排除。几乎我们处理的每个应用程序都会生成日志,我们希望我们自己开发的应用程序也生成日志。日志越详细,我们拥有的信息就越多。但放任不管,日志可能会增长到无法管理的大小,反过来,它们可能会成为它们自己的问题。因此,最好将它们进行裁剪,保留我们需要的那些,并将其余的归档。 + +### 基本功能 + +`logrotate` 实用程序在管理日志方面非常出色。它可以轮转日志、压缩日志、通过电子邮件发送日志、删除日志、归档日志,并在你需要时开始记录最新的。 + +运行 `logrotate` 非常简单——只需要运行 `logrotate -vs state-file config-file`。在上面的命令中,`v` 选项开启详细模式,`s` 指定一个状态文件,最后的 `config-file` 是配置文件,你可以指定需要做什么。 + +### 实战演练 + +让我们看看在我们的系统上静默运行的 `logrotate` 配置,它管理我们在 `/var/log` 目录中找到的大量日志。查看该目录中的当前文件。你是否看到很多 `*.[number].gz` 文件?这就是 `logrotate` 正在做的。你可以在 `/etc/logrotate.d/rsyslog` 下找到此配置文件。我的配置文件如下: + +``` +/var/log/syslog +{ +        rotate 7 +        daily +        missingok +        notifempty +        delaycompress +        compress +        postrotate +                reload rsyslog > /dev/null 2>&1 || true +        endscript +} + +/var/log/mail.info +/var/log/mail.warn +/var/log/mail.err +/var/log/mail.log +/var/log/daemon.log +/var/log/kern.log +/var/log/auth.log +/var/log/user.log +/var/log/lpr.log +/var/log/cron.log +/var/log/debug +/var/log/messages + +{ +        rotate 4 +        weekly +        missingok +        notifempty +        compress +        delaycompress +        sharedscripts +        postrotate +                reload rsyslog > /dev/null 2>&1 || true +        endscript +} +``` + +该文件首先定义了轮转 `/var/log/syslog` 文件的说明,这些说明包含在后面的花括号中。以下是它们的含义: + + * `rotate 7`: 保留最近 7 次轮转的日志。然后开始删除超出的。 + * `daily`: 每天轮转日志,与 `rotate 7` 一起使用,这意味着日志将保留过去 7 天。其它选项是每周、每月、每年。还有一个大小参数,如果日志文件的大小增加超过指定的限制(例如,大小 10k、大小 10M、大小 10G 等),则将轮转日志文件。如果未指定任何内容,日志将在运行 `logrotate` 时轮转。你甚至可以在 cron 中运行 `logrotate` 以便在更具体的时间间隔内使用它。 + * `missingok`: 如果日志文件缺失也没关系。不要惊慌。 + * `notifempty`: 日志文件为空时不轮转。 + * `compress`: 开启压缩,使用 `nocompress` 关闭它。 + * `delaycompress`: 如果压缩已打开,则将压缩延迟到下一次轮转。这允许至少存在一个轮转但未压缩的文件。如果你希望昨天的日志保持未压缩以便进行故障排除,那么此配置会很有用。如果某些程序在重新启动/重新加载之前可能仍然写入旧文件,这也很有帮助,例如 Apache。 + * `postrotate/endscript`: 轮转后运行此部分中的脚本。有助于做清理工作。还有一个 `prerotate/endscript` 用于在轮转开始之前执行操作。 + +你能弄清楚下一节对上面配置中提到的所有文件做了什么吗?第二节中唯一多出的参数是 `sharedscripts`,它告诉 `logrotate` 在所有日志轮转完成之前不要运行 `postrotate/endscript` 中的部分。它可以防止脚本在每一次轮转时执行,只在最后一次轮转完成时执行。 + +### 看点新的东西 + +我使用下面的配置来处理我系统上的 `Nginx` 的访问和错误日志。 + +``` +/var/log/nginx/access.log +/var/log/nginx/error.log  { +        size 1 +        missingok +        notifempty +        create 544 www-data adm +        rotate 30 +        compress +        delaycompress +        dateext +        dateformat -%Y-%m-%d-%s +        sharedscripts +        extension .log +        postrotate +                service nginx reload +        endscript +} +``` + +上面的脚本可以使用如下命令运行: + +``` +logrotate -vs state-file /tmp/logrotate +``` + +第一次运行该命令会给出以下输出: + +``` +reading config file /tmp/logrotate +extension is now .log + +Handling 1 logs + +rotating pattern: /var/log/nginx/access.log +/var/log/nginx/error.log   1 bytes (30 rotations) +empty log files are not rotated, old logs are removed +considering log /var/log/nginx/access.log +  log needs rotating +considering log /var/log/nginx/error.log +  log does not need rotating +rotating log /var/log/nginx/access.log, log->rotateCount is 30 +Converted ' -%Y-%m-%d-%s' -> '-%Y-%m-%d-%s' +dateext suffix '-2021-08-27-1485508250' +glob pattern '-[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]' +glob finding logs to compress failed +glob finding old rotated logs failed +renaming /var/log/nginx/access.log to /var/log/nginx/access-2021-08-27-1485508250.log +creating new /var/log/nginx/access.log mode = 0544 uid = 33 gid = 4 +running postrotate script +* Reloading nginx configuration nginx +``` + +第二次运行它: + +``` +reading config file /tmp/logrotate +extension is now .log + +Handling 1 logs + +rotating pattern: /var/log/nginx/access.log +/var/log/nginx/error.log   1 bytes (30 rotations) +empty log files are not rotated, old logs are removed +considering log /var/log/nginx/access.log +  log needs rotating +considering log /var/log/nginx/error.log +  log does not need rotating +rotating log /var/log/nginx/access.log, log->rotateCount is 30 +Converted ' -%Y-%m-%d-%s' -> '-%Y-%m-%d-%s' +dateext suffix '-2021-08-27-1485508280' +glob pattern '-[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]' +compressing log with: /bin/gzip +renaming /var/log/nginx/access.log to /var/log/nginx/access-2021-08-27-1485508280.log +creating new /var/log/nginx/access.log mode = 0544 uid = 33 gid = 4 +running postrotate script +* Reloading nginx configuration nginx +``` + +第三次运行它: + +``` +reading config file /tmp/logrotate +extension is now .log + +Handling 1 logs + +rotating pattern: /var/log/nginx/access.log +/var/log/nginx/error.log   1 bytes (30 rotations) +empty log files are not rotated, old logs are removed +considering log /var/log/nginx/access.log +  log needs rotating +considering log /var/log/nginx/error.log +  log does not need rotating +rotating log /var/log/nginx/access.log, log->rotateCount is 30 +Converted ' -%Y-%m-%d-%s' -> '-%Y-%m-%d-%s' +dateext suffix '-2021-08-27-1485508316' +glob pattern '-[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9]-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]' +compressing log with: /bin/gzip +renaming /var/log/nginx/access.log to /var/log/nginx/access-2021-08-27-1485508316.log +creating new /var/log/nginx/access.log mode = 0544 uid = 33 gid = 4 +running postrotate script +* Reloading nginx configuration nginx +``` + +状态文件的内容如下所示: + +``` +logrotate state -- version 2 +"/var/log/nginx/error.log" 2021-08-27-9:0:0 +"/var/log/nginx/access.log" 2021-08-27-9:11:56 +``` + +- [下载 Linux logrotate 备忘单][2] + +本文首发于[作者个人博客][3],经授权改编。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/10/linux-logrotate + +作者:[Ayush Sharma][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/ayushsharma +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/oliver-paaske-unsplash.jpg?itok=bv0sZSSB (Logs stacked up and to the right in front of a green tree forest) +[2]: https://opensource.com/downloads/logrotate-cheat-sheet +[3]: https://notes.ayushsharma.in/2017/01/fiddling-with-logrotate diff --git a/published/202110/20211008 3 new features of the latest OpenPGP.js version.md b/published/202110/20211008 3 new features of the latest OpenPGP.js version.md new file mode 100644 index 0000000000..6f0e1851a8 --- /dev/null +++ b/published/202110/20211008 3 new features of the latest OpenPGP.js version.md @@ -0,0 +1,72 @@ +[#]: subject: "3 new features of the latest OpenPGP.js version" +[#]: via: "https://opensource.com/article/21/10/openpgpjs" +[#]: author: "Daniel Huigens https://opensource.com/users/twiss" +[#]: collector: "lujun9972" +[#]: translator: "geekpi" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13888-1.html" + +最新 OpenPGP.js 版本的 3 个新功能 +====== + +> OpenPGP.js 是一个实现了 OpenPGP 标准的密码学库,最常用于电子邮件加密。 + +![](https://img.linux.net.cn/data/attachment/album/202110/16/115721k1vi1ekzip1kpqkg.jpg) + +[OpenPGP.js][2] 是一个实现了 [OpenPGP 标准][3] 的密码学库,最常用于电子邮件加密。ProtonMail、Mailvelope 和 FlowCrypt 都使用 OpenPGP.js,这还仅仅是其中一些。也就是说 OpenPGP.js 库对数百万用户的信息进行了加密。 + +OpenPGP 标准首次发布于 20 世纪 90 年代,像几乎任何东西一样,需要维护和更新,以保证安全和可用性。该标准的“加密刷新” [正在进行中][4],它增加了现代的加密算法并废除了过时的算法。为了提高可用性,各种电子邮件应用程序现在允许用户无缝加密他们的通信,用户无需管理他们的密钥或他们的联系人的密钥。 + +OpenPGP.js 于 2014 年首次发布,开始基于一个名为 GPG4Browsers 的早期原型,该原型基于 Herbert Hanewinkel(以及其他贡献者)的几个脚本。OpenPGP.js 的第二个版本于 2016 年发布,完全重新设计,使用 Uint8Arrays 而不是字符串(这大大增加了其性能),并在内部使用现代 ES6 模块而不是 CommonJS 模块。第 3 和第 4 版都是在 2018 年发布的,分别增加了对椭圆曲线加密法(ECC)和流的支持。 + +我和我的团队继续在 OpenPGP.js 上工作,以确保其发展为一个易于使用的强加密库。 + +### 1、默认的椭圆曲线加密 + +在 OpenPGP.js 第 4 版中,生成新密钥时默认使用 RSA。虽然 ECC 更快、更安全,但 Curve25519 还没有在 OpenPGP 规范中得到标准化。加密刷新草案包括了 Curve25519,并且预计它将“按原样”包含在下一版本的 OpenPGP 规范中,因此 OpenPGP.js 第 5 版现在默认使用 ECC 生成密钥。 + +### 2、只导入你需要的模块 + +同样,虽然 OpenPGP.js 内部使用 ES6 模块多年,但第 4 版仍然没有发布一个合适的 ES6 模块。相反,它只发布了一个通用模块定义Univeral Module Definition(UMD)模块,可以在浏览器和 Node.js 上运行。在第 5 版中,这种情况有所改变,为浏览器和 Node.js 发布了单独的模块(包括 ES6 和非 ES6),使库用户更容易在所有平台上导入 OpenPGP.js ,且(当使用 ES6 模块时)只导入他们需要的部分。这在很大程度上是通过将构建系统切换到 [rollup][5] 来实现的。 + +### 3、拒绝弱加密技术 + +还有许多其他的安全改进。例如,1024 位 RSA 密钥、ElGamal 和 DSA 密钥被认为是不安全的,并被默认拒绝。此外,第 4 版已经默认使用 AES 加密,第 5 版现在完全默认拒绝使用较弱的算法进行加密,即使公钥声称只支持较弱的算法。相反,它假定所有的 OpenPGP 实现都支持 AES(这种情况已经存在很长时间了)。 + +### OpenPGP.js 的下一步是什么? + +展望未来,有一些安全方面的改进要做。用于识别公钥的密钥指纹仍然使用 SHA-1,尽管在加密技术更新中计划对此进行修复。同时,建议使用不同的方法来确定用于加密的任何公钥的真实性,例如使用提议的 [网络密钥目录][6]Web Key Directory(WKD)标准直接从收件人的域中获取整个密钥,这已经由各种 [电子邮件提供商][7] 实现。WKD 支持内置于 OpenPGP.js 第 4 版,但在第 5 版中是一个单独的模块,以保持主库的精简。 + +同样,当用密码而不是公钥加密信息或文件时(例如:在使用 OpenPGP 进行电子邮件加密时不常见,但在用于加密备份时更常见),密码会使用相对较弱的密钥衍生函数Key Derivation Function(KDF)转换为对称密钥。因此,建议应用在将用户的密码传递给 OpenPGP.js 之前,先通过一个强大的 KDF,如 [Argon2][8] 或 [scrypt][9]。希望加密刷新草案会包括这些算法中的一种,以便在未来的 OpenPGP.js 版本中实现。 + +### 如何使用 OpenPGP.js 第 5 版 + +不过现在,OpenPGP.js 第 5 版已经 [发布][10] 到 npm 仓库。如果你喜欢,可以随时试用!欢迎在 GitHub 的 [讨论版][11] 中进行反馈。然而,请注意,虽然 OpenPGP.js 是一个通用的加密库,但它的主要使用情况是在需要与 OpenPGP 规范兼容的情况下(例如,在发送或接收 PGP 加密的电子邮件时)。对于其他的使用情况,不同的库可能是一个更合适或性能更好的选择。当然,总的来说,在尝试使用任何加密技术时都要小心。 + +感谢阅读,这里是保护电子邮件的未来! + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/10/openpgpjs + +作者:[Daniel Huigens][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/twiss +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/newsletter_email_mail_web_browser.jpg?itok=Lo91H9UH (email or newsletters via inbox and browser) +[2]: https://github.com/openpgpjs/openpgpjs +[3]: https://tools.ietf.org/html/rfc4880 +[4]: https://datatracker.ietf.org/doc/charter-ietf-openpgp/ +[5]: https://rollupjs.org/ +[6]: https://datatracker.ietf.org/doc/html/draft-koch-openpgp-webkey-service +[7]: https://wiki.gnupg.org/WKD#Mail_Service_Providers_offering_WKD +[8]: https://en.wikipedia.org/wiki/Argon2 +[9]: https://en.wikipedia.org/wiki/Scrypt +[10]: https://www.npmjs.com/package/openpgp +[11]: https://github.com/openpgpjs/openpgpjs/discussions diff --git a/published/202110/20211008 How to Install Vivaldi Browser on Ubuntu and Other Linux Distributions.md b/published/202110/20211008 How to Install Vivaldi Browser on Ubuntu and Other Linux Distributions.md new file mode 100644 index 0000000000..315ab7790f --- /dev/null +++ b/published/202110/20211008 How to Install Vivaldi Browser on Ubuntu and Other Linux Distributions.md @@ -0,0 +1,161 @@ +[#]: subject: "How to Install Vivaldi Browser on Ubuntu and Other Linux Distributions" +[#]: via: "https://itsfoss.com/install-vivaldi-ubuntu-linux/" +[#]: author: "Abhishek Prakash https://itsfoss.com/author/abhishek/" +[#]: collector: "lujun9972" +[#]: translator: "imgradeone" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13877-1.html" + +[初级] 如何在 Ubuntu 中安装 Vivaldi 浏览器 +====== + +![](https://img.linux.net.cn/data/attachment/album/202110/13/142545reotvtqgqpfvmmvp.jpg) + +> 你将在本篇新手教程中学习如何在 Ubuntu、Debian 及其他 Linux 发行版中安装 Vivaldi 网页浏览器,同时本教程也将介绍如何更新和卸载该软件。 + +[Vivaldi][1] 是一款日益流行的网页浏览器。它基于 Chromium 内核,因此它拥有和 Chrome 类似的功能,但它也新增了一些其他特色功能,让这款浏览器与众不同、更为直观。 + +它内置了标签组、广告拦截、鼠标手势、笔记管理,甚至还有命令连锁。你甚至可以借助切分视图来一次性浏览多个页面。当然,相比于 Chrome,Vivaldi 更加尊重你的隐私。 + +![标签平铺,一次性分割浏览多个页面][2] + +[Manjaro Linux 近期使用 Vivaldi 取代 Firefox 作为其部分变体的默认浏览器][3],你可以从这件事来了解 Vivaldi 浏览器的受欢迎程度。 + +如果你想尝试一下这款浏览器的话,接下来让我告诉你,如何在 Linux 上安装 Vivaldi。你将了解到: + + * 安装 Vivaldi 的 GUI 和命令行方式 + * 将 Vivaldi 更新到最新版本的技巧 + * 在 Ubuntu 中卸载 Vivaldi 的方式 + +> **非自由软件警告!** +> +> Vivaldi 并非完全的开源软件。它的 UI 界面是闭源的。之所以在这里介绍这款浏览器,是因为 Vivaldi 团队正努力让该软件在 Linux 平台上可用。 + +### 方式 1:在 Ubuntu 中安装 Vivaldi [GUI 方式] + +好消息是,Vivaldi 提供了预先构建好的安装包,包括 Ubuntu/Debian 的 DEB 文件,以及 Fedora、Red Hat、SUSE 的 RPM 文件。 + +它支持 32 位和 64 位平台,也支持 [像树莓派之类的 ARM 设备][4]。 + +![Vivaldi 为各类 Linux 发行版提供了安装包][5] + +安装过程非常简单。你只需要前往 Vivaldi 的官网下载正确的安装包文件,双击打开,然后安装,大功告成。 + +我将详细介绍在 Ubuntu/Debian 下的安装过程。对于其他类型的发行版,你可以使用类似的步骤。 + +#### 第 1 步:下载 Vivaldi + +前往 Vivaldi 的下载页面,下载支持 Ubuntu 的 DEB 格式安装包。 + +- [下载 Vivaldi][6] + +![下载支持 Ubuntu/Debian 的 DEB 安装包][7] + +#### 第 2 步:安装刚刚下载的 DEB 文件 + +前往你刚刚下载 DEB 文件的下载文件夹。[安装 DEB 文件][8] 非常简单,只需要双击打开,或者右键后使用软件中心打开即可。 + +![右键点击下载的 DEB 文件并用软件中心打开以安装][9] + +这将打开软件中心,在这里可以看到安装 Vivaldi 的选项。点击安装按钮即可。 + +![点击安装按钮][10] + +你将需要输入系统账户的密码,输入密码授权后,Vivaldi 很快就能完成安装,随后安装按钮也变成了移除按钮。这表明 Vivaldi 已经安装完成了。 + +#### 第 3 步:使用 Vivaldi + +按下 `Super`(`Windows`)键打开系统菜单,搜索 Vivaldi,然后单击 Vivaldi 的图标。 + +![在系统菜单中搜索 Vivaldi][11] + +首次启动时,你将看到如下界面。 + +![运行于 Ubuntu 的 Vivaldi][12] + +既然你已经知道了这个方法,那我接下来将展示在 Ubuntu/Debian 使用终端安装 Vivaldi 的方法。 + +### 方式 2:借助终端,在 Ubuntu/Debian 上安装 Vivaldi + +打开终端,确认你已经安装了用于 [在命令行下下载文件][13] 的 `wget`。 + +``` +sudo apt install wget +``` + +接下来,获取 Vivaldi 仓库的公钥并添加到系统,以让系统信任该来源的软件包。如果你感兴趣的话,你可以阅读 [关于在 Ubuntu 添加第三方软件仓库的文章][14]。 + +``` +wget -qO- https://repo.vivaldi.com/archive/linux_signing_key.pub | sudo apt-key add - +``` + +添加完该密钥后,再添加 Vivaldi 的仓库: + +``` +sudo add-apt-repository 'deb https://repo.vivaldi.com/archive/deb/ stable main' +``` + +现在距离完成也只有一步之遥了。更新软件仓库缓存并安装 Vivaldi。 + +``` +sudo apt update && sudo apt install vivaldi-stable +``` + +大功告成。现在,前往系统菜单搜索并启动 Vivaldi 吧。 + +### 在 Ubuntu 中更新 Vivaldi + +GUI 和命令行这两种方式都会在系统里添加 Vivaldi 的仓库。这意味着,只要 Vivaldi 发布了新版本,你就可以在系统更新中一并获取 Vivaldi 的更新。 + +![已添加到系统中的 Vivaldi 仓库][15] + +一般情况下,你更新 Ubuntu 系统时,如果 Vivaldi 发布了新版本,那么 Vivaldi 也同时会被更新。 + +![Vivaldi 浏览器会跟随系统更新][16] + +### 在 Ubuntu 中卸载 Vivaldi + +如果你不喜欢 Vivaldi 或者不再使用,你可以直接卸载。现在,如果你想 [在 Ubuntu 中卸载软件][17],你可能会想到软件中心,但软件中心不会查找到外部和第三方的软件包。 + +目前你必须使用终端卸载 Vivaldi,即便你是使用 GUI 方式安装的。其实这也很简单,打开终端,输入以下命令: + +``` +sudo apt remove vivaldi-stable +``` + +`sudo` 会 [在 Ubuntu 中给予你 root 权限][18]。你需要输入当前账户的密码。输入密码时,你可能不会在屏幕上看见输入密码的痕迹。这是正常现象,直接输入密码即可,随后 Vivaldi 将被卸载。 + +希望这篇关于如何在 Linux 安装 Vivaldi 的教程对你有用。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/install-vivaldi-ubuntu-linux/ + +作者:[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://vivaldi.com/ +[2]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/10/tab-tiling.webp?resize=800%2C448&ssl=1 +[3]: https://news.itsfoss.com/vivaldi-replaces-firefox-manjaro/ +[4]: https://itsfoss.com/raspberry-pi-alternatives/ +[5]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/10/downloading-vivaldi-linux.webp?resize=800%2C541&ssl=1 +[6]: https://vivaldi.com/download/ +[7]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/10/vivaldi-download-linux.webp?resize=800%2C438&ssl=1 +[8]: https://itsfoss.com/install-deb-files-ubuntu/ +[9]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/10/installing-vivaldi-ubuntu.webp?resize=800%2C466&ssl=1 +[10]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/10/install-vivaldi-ubuntu-software.png?resize=800%2C407&ssl=1 +[11]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/10/running-vivaldi-in-ubuntu.png?resize=703%2C229&ssl=1 +[12]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/10/Vivaldi-in-Ubuntu.webp?resize=800%2C450&ssl=1 +[13]: https://itsfoss.com/download-files-from-linux-terminal/ +[14]: https://itsfoss.com/adding-external-repositories-ubuntu/ +[15]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/10/Vivaldi-repo-ubuntu.png?resize=800%2C403&ssl=1 +[16]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/06/chrome-edge-update-ubuntu.png?resize=716%2C421&ssl=1 +[17]: https://itsfoss.com/uninstall-programs-ubuntu/ +[18]: https://itsfoss.com/root-user-ubuntu/ diff --git a/published/202110/20211010 Best Linux Distributions Based on KDE.md b/published/202110/20211010 Best Linux Distributions Based on KDE.md new file mode 100644 index 0000000000..3c4f2d2fe5 --- /dev/null +++ b/published/202110/20211010 Best Linux Distributions Based on KDE.md @@ -0,0 +1,193 @@ +[#]: subject: "Best Linux Distributions Based on KDE" +[#]: via: "https://itsfoss.com/best-kde-distributions/" +[#]: author: "Ankush Das https://itsfoss.com/author/ankush/" +[#]: collector: "lujun9972" +[#]: translator: "wxy" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13872-1.html" + +基于 KDE 的最佳 Linux 发行版 +====== + +![](https://img.linux.net.cn/data/attachment/album/202110/11/115436wngdi7vndoodjnfd.jpg) + +KDE 是目前最具定制性和最快速的桌面环境之一。虽然你可以随时安装 KDE,但最好选择一个 KDE 开箱即用的 Linux 发行版。 + +在这里,让我列出一些最好的基于 KDE 的 Linux 发行版。 + +无论你选择什么作为你的首选发行版,你都可以参考我们的 [KDE 定制指南][1] 来调整你的体验。 + +注意:该列表没有特定的排名顺序。 + +### 1、KDE Neon + +![][2] + +主要亮点: + + * 官方 KDE 发行版 + * 最新的 KDE Plasma 稳定版 + * 专注于最新的 KDE 软件 + * 不是桌面发行版的完美替代品 + +如果你想获得 KDE Plasma 的最新体验,[KDE Neon][4] 是最佳选择之一。 + +即使它是建立在稳定版的 Ubuntu LTS 基础之上,你也总是能在最新的 KDE 版本发布后立即得到交付。 + +与其他发行版不同,它不注重完整的桌面用户体验,而是重点关注在 KDE 软件包上。所以,它可能不是每个人的完美桌面替代品。然而,如果你希望使用最新的 KDE 软件,KDE Neon 是一个不错的选择。 + +其“用户版”应该是你需要的,但如果你愿意尝试预先发布的功能,你也可以选择尝试“测试版”或“不稳定版”。 + +如果你想知道它与 Kubuntu 有什么不同,你应该查看 [KDE Neon vs Kubuntu][3] 的比较来探索它。 + +### 2、Kubuntu + +![][5] + +主要亮点: + + * 基于 Ubuntu 的以桌面为重点的 Linux 发行版 + * 提供 LTS 和非 LTS 版本 + * 良好的硬件兼容性 + +如果 KDE 软件套件不是你关注的重点,那么 Kubuntu 应该是你可以作为 Linux 桌面使用的一个优秀发行版。 + +Kubuntu 是 Ubuntu 的一个官方版本,它为其 LTS 版本提供了三年的更新支持。与 KDE Neon 不同的是,你可以得到对各种应用程序更好的支持,而不仅仅是局限于 KDE 软件。 + +你可以选择 LTS 版或非 LTS 版来获得最新的 Ubuntu 功能。 + +与其他一些基于 KDE 的发行版相比,Kubuntu 具有更好的硬件兼容性。考虑到它可以为各种笔记本电脑提供动力,如 Kubuntu Focus、Slimbook 等,其硬件兼容性是你可以信赖的。 + +### 3、Manjaro KDE + +![][6] + +主要亮点: + + * 基于 Arch 的 Linux 发行版 + * 滚动式发布更新 + * 对于新的 Linux 用户来说学习难度不大 + +Manjaro 是一个基于 Arch Linux 的发行版,它使得使用 Arch 作为桌面 Linux 平台变得容易。 + +它按照滚动发布的时间表进行发布,这应该有助于你快速获得最新的软件包,而不必担心软件更新时间。 + +如果你是一个新的 Linux 用户,你可以考虑一直使用 Flatpak 或 Snaps 来安装各种应用程序。虽然 Manjaro 让你很容易使用 Arch,但它对新用户来说多多少少还是有一点学习曲线。所以,你可能需要查看 [Arch 维基][7] 来了解更多信息。 + +### 4、Fedora KDE Spin + +主要亮点: + + * 一个独特的基于 KDE 的 Linux 发行版(如果你不喜欢主流的 Ubuntu/Arch 发行版) + * 为工作站和服务器量身定做 + * 对于新的 Linux 用户来说可能需要适应 + * 硬件兼容性可能是个问题 + +Fedora 是一个独立的发行版(不基于 Ubuntu/Arch),作为 Red Hat Enterprise Linux 的上游。 + +而 Fedora Spin 版为用户提供了各种备用的桌面。如果你想要 KDE,你需要下载 Fedora 的 KDE Spin。 + +像 KDE Neon 一样,Fedora 并不专注于提供一个最佳的桌面体验,而是旨在实验对工作站或服务器有用的最新技术。 + +因此,如果你有信心解决 Linux 发行版上较新技术实现所带来的任何问题/挑战,[Fedora KDE Spin][8] 是一个不错的选择。 + +### 5、openSUSE + +![][9] + +主要亮点: + + * 适用于需要使用多种工具的系统管理员和开发人员 + * 有两个不同的版本,包括稳定版和滚动版 + +[openSUSE][10] 是另一个独立的 Linux 发行版,默认采用 KDE 桌面。虽然它把自己定位为桌面用户的选择之一,但我在过去曾遇到过硬件兼容性问题。 + +然而,对于想在桌面上使用 YaST、Open Build Service、Kiwi 等工具的系统管理员或开发者来说,它是一个很好的选择,开箱即用。 + +它提供了一个稳定版和一个滚动发布版。根据你的要求选择最适合你的。 + +### 6、Garuda Linux + +![][11] + +主要亮点: + + * 滚动发布的发行版 + * BTRFS 作为默认文件系统 + * 预装了基本的 GUI 工具,使 Arch Linux 的使用变得简单 + +[Garuda Linux][12] 是一个基于 Arch 的现代发行版,专注于开箱即用的定制体验。 + +KDE 版本(或 Dr460nized 版本)提供了漂亮的体验,同时可使用类似 macOS 的工作流程进行调整。 + +当然,如果你是一个有经验的 Linux 用户,你可以定制你现有的发行版来模仿同样的体验。 + +锦上添花的是,Garuda Linux 还提供了其 KDE 版本的不同变体,一个预装了游戏工具,一个用于渗透测试,另一个作为基本的 Linux 桌面系统。 + +### 7、Nitrux OS + +![][13] + +主要亮点: + + * 基于 Debian 的发行版,不同的风格 + * 独特的桌面体验 + +一个基于 Debian 的 Linux 发行版,具有开箱即用的 KDE。与 Kubuntu 不同,Nitrux 最终可能提供的是一个更快的 KDE Plasma 更新和较新的 Linux 内核升级。 + +[Nitrux OS][14] 在以其 NX 桌面为特色的同时,提供了一个美丽而独特的体验。 + +如果你想尝试一些不同的 KDE 搭载,Nitrux OS 将是一个不错的选择。 + +### 8、MX Linux KDE + +![][15] + +主要亮点: + + * 基于 Debian 的发行版 + * 轻量级 + * 预装了有用的 MX 工具 + +不在意外观,但想要一个简单的、可定制的、基于 Debian 的 KDE 桌面?[MX Linux KDE 版][16] 应该是一个很好的选择,因为它以迅捷的性能和预装的基本工具而闻名。 + +如果你想调整默认的用户体验,你还可以得到几个 KDE 主题。 + +### 总结 + +在这个列表之外,其他几个 Linux 发行版也将 KDE 桌面作为他们的首选。 + +总体来说,Nitrux OS 应该是一个独特的选择,如果你想远离基于 Ubuntu 的发行版,还有像 Garuda Linux 和 Manjaro 这样基于 Arch 的可靠发行版可以尝试。 + +你最喜欢的基于 KDE 的 Linux 发行版是什么?你是专注于开箱即用的定制,还是喜欢自己定制 KDE 体验? + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/best-kde-distributions/ + +作者:[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/kde-customization +[2]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/08/kde-neon-information-20-04.jpg?resize=800%2C397&ssl=1 +[3]: https://itsfoss.com/kde-neon-vs-kubuntu/ +[4]: https://neon.kde.org/index +[5]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2020/01/kubuntu-kde.jpg?resize=800%2C450&ssl=1 +[6]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/11/manjaro-20-desktop.jpeg?resize=800%2C440&ssl=1 +[7]: https://wiki.archlinux.org +[8]: https://spins.fedoraproject.org/en/kde/ +[9]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/10/opensuse-kde.png?resize=800%2C423&ssl=1 +[10]: https://www.opensuse.org +[11]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2020/12/Garuda-Linux-review.png?resize=800%2C450&ssl=1 +[12]: https://garudalinux.org +[13]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/10/nitrux-os-kde.png?resize=800%2C450&ssl=1 +[14]: https://nxos.org +[15]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2020/08/mx-linux-19-2-kde.jpg?resize=800%2C452&ssl=1 +[16]: https://mxlinux.org diff --git a/published/202110/20211011 What is a hostname.md b/published/202110/20211011 What is a hostname.md new file mode 100644 index 0000000000..7088418f1d --- /dev/null +++ b/published/202110/20211011 What is a hostname.md @@ -0,0 +1,113 @@ +[#]: subject: "What is a hostname?" +[#]: via: "https://opensource.com/article/21/10/what-hostname" +[#]: author: "Alan Formy-Duval https://opensource.com/users/alanfdoss" +[#]: collector: "lujun9972" +[#]: translator: "geekpi" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13897-1.html" + +浅谈主机名 +====== + +> 主机名是人类用来指代特定计算机的标签。 + +![](https://img.linux.net.cn/data/attachment/album/202110/19/134329lwni9tlq9h3u4f4o.jpg) + +计算机有网络地址,但人类通常很难记住它们。主机名是帮助人类参考特定计算机的标签。例如,你可能不会导航到 `192.168.1.4`,而是导航到 `linuxlaptop` 或 `linuxlaptop.local`。 + +### 地址和名称 + +所有联网的计算机(也被称为主机host)都需要一个地址:一个与之相关的唯一数字,以使数据报文能够在它们之间进行正确的数据通信。这就是所谓的互联网协议Internet Protocol(IP)地址。数字 `54.204.39.132` 是一个互联网协议第四版Internet Protocol version 4(IPv4)地址。较新的 IPv6 地址要长得多,像这样:`2001:0db6:3c4d:0017:0000:0000:2a2f:1a2b`。 哇!这将是很难记住的! + +``` +$ ip addr show +``` + +计算机也可以被赋予标签。被称为主机名hostname,这些是友好的名称,便于参考。我可以把我的计算机的主机名设置为 `copperhead`。只要这个名字在网络上是唯一的,所有其他用户和计算机都可以把 `copperhead` 作为地址,而不是 IP 地址。 + +``` +$ hostname -s +``` + +你可以更新你的计算机的主机名。 + +阅读 Seth Kenlon 的文章 [如何在 Linux 上更改主机名][2],了解如何在 Linux 上这样做。 + +#### 完全限定域名 + +从技术上讲,主机名包括一个域名。如果我的域名是 `mycompany.com`,那么我的计算机的主机名是 `copperhead.mycompany.com`,以句点分隔。这就形成了一个完全限定域名fully qualified domain name(FQDN)。这很重要,因为 IP 地址可以解析为 FQDN。 + +``` +host.domain.topleveldomain +``` + +例如:`www.example.com` 是一个完全限定域名。 + +你的域名一般已经确定了,所以你只负责提供主机部分。本文的重点是主机。 + +#### 名称解析 + +将 IP 地址转换为相应的主机名的过程被称为名称解析。这个过程首先发生在本地主机表中。Linux 使用文件 `/etc/hosts` 来存储这个表。 + +``` +cat /etc/hosts +``` + +还有一个分层的、去中心化的基于网络的系统提供解析,称为域名系统Domain Name System(DNS)。这时 FQDN 变得非常重要。 + + +``` +$ dig www.opensource.com +``` + +### 名称的乐趣 + +为我们的计算机起名字可能很有趣。如果你有很多,你可以使用一个主题。我曾经为一家公司工作,该公司将所有的服务器都以蛇命名。 + +后来我工作的一家公司,我是一个数据中心经理,使用啤酒品牌。当我们收到一个新的服务器时,这很令人兴奋,因为我会给开发团队发邮件征求建议。我们大约有 100 台服务器。这些提供了一个有趣的清单,反映了公司的多样性。我们有从库尔斯和百威到阿姆斯特尔和浅粉象的一切。我们有虎牌啤酒、胜狮啤酒和札幌啤酒等等! + +我们认为这很酷!然后,想象一下,当你试图记住卢云堡是拥有最多内存的虚拟化服务器,佩罗尼是 SQL 数据库服务器,喜力是新的域控制器时,会发生什么,特别是对于一个快速发展的公司的新员工。 + +### 惯例 + +当然,主机名是所有者的选择,所以请尽情发挥。然而,根据环境的不同,使用容易记忆的名字或基于命名惯例的名字可能更有意义,因为这些名字有利于描述主机。 + +#### 有用的名字 + +如果你想放弃有趣的东西,并对你的系统进行有益的命名,也许可以考虑它们的功能。数据库服务器可以被命名为 `database1`、`database2`、`database3` 等等。Web 服务器可以命名为 `webserver1`、`webserver2` 等等。 + +#### 位置名称 + +我在许多客户那里使用了一种技术,用一组字符的位置来命名服务器主机,这些字符描述了该系统的一个方面,有助于识别。例如,如果我正在为内政部(DOI)开发一个业务流程管理(BPM)系统,我就会在命名规则中加入他们的缩写词。 + +此外,就像许多大型企业、金融机构和政府一样,他们可能有不同的数据中心,位于不同的地理位置,以达到性能或灾难恢复的目的。因此,比如说,位于北美大陆东海岸的数据中心被称为 ED(East Data center),而位于西海岸的数据中心则是 WD(West Data center)。 + +所有这些信息将汇集到一个名称中,如 `doibpm1ed` 或 `doibpm1wd`。因此,虽然这些名字看起来不长,但在这个项目上工作的人可以很容易地识别它们的目的和位置,而且这个名字甚至可以对潜在的恶意者混淆它们的用途。换句话说,业主可以选择只对内部人员有意义的命名方式 + +### 互联网标准 + +有几个标准管理着主机名。你可以在互联网工程任务组Internet Engineering Task Force(IETF)维护的意见征求Requests for Comment(RFC)中找到这些标准。由此,请遵守以下规定: + + * 主机名的长度应该在 1 到 63 个 ASCII 字符之间 + * 一个 FQDN 的最大长度为 253 个 ASCII 字符 + * 不区分大小写 + * 允许的字符:`a` 到 `z`,`0` 到 `9`,`-`(连字符),和 `_`(下划线)。 + +我希望这篇文章能帮助你澄清主机名。玩得开心,发挥创意。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/10/what-hostname + +作者:[Alan Formy-Duval][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/alanfdoss +[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/21/10/how-change-hostname-linux diff --git a/published/202110/20211012 Seahorse- Manage Your Passwords - Encryption Keys in Linux.md b/published/202110/20211012 Seahorse- Manage Your Passwords - Encryption Keys in Linux.md new file mode 100644 index 0000000000..744568a383 --- /dev/null +++ b/published/202110/20211012 Seahorse- Manage Your Passwords - Encryption Keys in Linux.md @@ -0,0 +1,92 @@ +[#]: subject: "Seahorse: Manage Your Passwords & Encryption Keys in Linux" +[#]: via: "https://itsfoss.com/seahorse/" +[#]: author: "Ankush Das https://itsfoss.com/author/ankush/" +[#]: collector: "lujun9972" +[#]: translator: "geekpi" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13884-1.html" + +Seahorse:在 Linux 中管理你的密码和加密密钥 +====== + +![](https://img.linux.net.cn/data/attachment/album/202110/15/120409ltfmw33c5xpw5bcx.jpg) + +> Seahorse 是一个简洁的开源密码和加密密钥管理器,让我们来探讨一下它的功能和如何安装它。 + +我们经常倾向于忽视许多默认/预装的应用,尤其是在内置了大量工具和实用程序时。 + +你可以在各种 Linux 发行版上使用的这样一个有用的工具是 **GNOME 的 Seahorse**。 + +### Seahorse:GNOME 的密码及加密密钥管理器 + +![][1] + +主要来说,Seahorse 是一个预装在 GNOME 桌面的应用,并为其量身定做。 + +然而,你可以在你选择的任何 Linux 发行版上使用它。它是一个简单而有效的工具,可以在本地管理你的密码和加密密钥/钥匙环。 + +如果你是第一次使用,你可能想读一下 [Linux 中钥匙环的概念][2]。 + +如果你不喜欢基于云的密码管理器,Seahorse 可以很好地解决你的要求。尽管它看起来很简单,但有几个基本功能你可能会觉得很有用。 + +当然,如果你的不太涉及管理加密密钥(或本地存储),你也应该探索一些 [可用于 Linux 的最佳密码管理器][3] 。 + +### Seahorse 的特点 + +虽然你可以很容易地把它作为一个本地(离线)密码管理器,但在处理加密密钥时,你也可以用 Seahorse 做一些事情来加强你的安全管理。 + +![][4] + +一些关键的亮点是: + + * 能够存储 SSH 密钥(用于访问远程计算机/服务器) + * 存储用于保护电子邮件和文件的 GPG 密钥 + * 支持为应用和网络添加密码钥匙环 + * 安全地存储证书的私钥 + * 存储一个密码/密语 + * 能够导入文件并快速存储它们 + * 查找远程密钥 + * 同步和发布密钥 + * 能够查找/复制 VPN 密码 + +![][5] + +### 在 Linux 中安装 Seahorse + +如果你使用的是基于 GNOME 的发行版,你应该已经安装了它。你可以搜索 “Seahorse” 或者 “Passwords” 来找到它。 + +在其他情况下,你可以在软件中心搜索到它。根据我的快速测试,它在 KDE、LXQt 和不同的桌面环境下应该可以正常工作。 + +![][6] + +此外,你可以找到它的 [Flatpak 包][7]。所以,无论你使用的是哪种 Linux 发行版,都可以安装 Seahorse。 + +如果你使用的是 Arch Linux,你也应该在 [AUR][8] 中找到它。 + +- [Seahorse][9] + +你对使用 Seahorse 来取代其他密码管理器有何看法?你是否已经用它来管理加密密钥?请在下面的评论中告诉我你的想法。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/seahorse/ + +作者:[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/10/seahorse-password-keys.png?resize=800%2C613&ssl=1 +[2]: https://itsfoss.com/ubuntu-keyring/ +[3]: https://itsfoss.com/password-managers-linux/ +[4]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/10/seahorse-login.png?resize=800%2C583&ssl=1 +[5]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/10/seahorse-keys.png?resize=800%2C579&ssl=1 +[6]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/10/seahorse-software.png?resize=800%2C508&ssl=1 +[7]: https://www.flathub.org/apps/details/org.gnome.seahorse.Application +[8]: https://itsfoss.com/aur-arch-linux/ +[9]: https://wiki.gnome.org/Apps/Seahorse/ diff --git a/published/202110/20211013 5 markdown editors I recommend trying.md b/published/202110/20211013 5 markdown editors I recommend trying.md new file mode 100644 index 0000000000..d107ec755a --- /dev/null +++ b/published/202110/20211013 5 markdown editors I recommend trying.md @@ -0,0 +1,83 @@ +[#]: subject: "5 markdown editors I recommend trying" +[#]: via: "https://opensource.com/article/21/10/markdown-editors" +[#]: author: "Don Watkins https://opensource.com/users/don-watkins" +[#]: collector: "lujun9972" +[#]: translator: "geekpi" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13904-1.html" + +我推荐尝试的 5 个 Markdown 编辑器 +====== + +> 每个人都有自己喜欢的 Markdown 编辑器。这里有几个我已经试过的。 + +![](https://img.linux.net.cn/data/attachment/album/202110/21/095837n8q1s3hqc1og1fsq.jpg) + +你可以用 Markdown 做任何事情:给网站排版、编写书籍和撰写技术文档只是它的一些用途。我喜欢它创建富文本文档可以如此简单。每个人都有自己喜欢的 Markdown 编辑器。在我的 Markdown 之旅中,我使用了好几个。下面是我考虑过的五个 Markdown 编辑器。 + +### Abricotine + +[Abricotine][2] 是一个在 [GPLv][3] 下发布的开源编辑器。你可以手动输入格式,或者使用菜单插入 [GitHub 风格的 Markdown][4]。Abricotine 允许你在输入时预览文本元素,如标题、图片、数学、嵌入式视频和待办事项。该编辑器只能将文件导出为 HTML。你可以在 Linux、macOS 和 Windows 上使用 Abricotine。 + +![Abricontine][5] + +### MarkText + +[MarkText][7] 是一个简单的 Markdown 编辑器。它有很多功能,而且在处理 Markdown 格式的文件方面做得很好。MarkText 也支持 GitHub 风格的 Markdown,它允许你添加表格和带有语法高亮的代码块。它支持实时预览,并且有一个简单的界面。MarkText 是在 [MIT][8] 下授权的。它支持 HTML 和 PDF 格式的输出。MarkText 可以在 Linux、macOS 和 Windows 上使用。 + +![MarkText][9] + +### Ghostwriter + +[Ghostwriter][10] 是一个用于 Linux 和 Windows 的 Markdown 编辑器。根据其网站用户的说法。“享受无干扰的写作体验,包括全屏模式和简洁的界面。有了 Markdown,你可以现在写,以后再格式化”。它有内置的默认的浅色和深色主题,或者你可以自己编写。你可以将文件实时按 HTML 预览,你可以直接复制和粘贴到博客中,或导出为其他格式。Ghostwriter 是在 [GPLv3][11] 下发布的。 + +![Ghostwriter][12] + +### Atom + +[Atom][13] 被称为 21 世纪的可自定义文本编辑器。它也可以作为一个 Markdown 编辑器使用。它可以在 Linux、Windows 和 macOS上运行,并以 [MIT][14] 许可证发布。它支持 GitHub 风格的 Markdown,并且按下 `Ctrl+Shift+M` 可以打开一个预览面板,这样你就可以轻松地看到 HTML 预览。你可以通过创建一个文件并以 `.md` 文件扩展名保存来轻松入门。这告诉 Atom 它是一个 Markdown 文件。Atom 会自动应用正确的包和语法高亮。 + +![Atom][15] + +### VSCodium + +[VSCodium][16] 是微软的 VSCode 编辑器的自由开源版本,没有内置在微软产品中的遥测技术。它以 [MIT][17] 许可证发布,并提供了 VSCode 的所有功能,而没有专有特性。除了其他功能外,VSCodium 还可以作为一个 Markdown 编辑器。创建一个新文件,点击 “选择一个语言”,选择 “Markdown”,然后开始写你的代码。通过按 `Ctrl-Shift+V` 轻松预览文本,然后再切换回编辑器。你也可以通过添加一个扩展来轻松地扩展 Markdown 编辑器。我最喜欢的插件是 [Markdown editor][18],它是 [MIT][19] 许可证。 + +![VSCodium][20] + +你最喜欢的 Markdown 编辑器是什么? 让我们在评论中知道。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/10/markdown-editors + +作者:[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/osdc-docdish-typewriter-pink.png?itok=OXJBtyYf (A pink typewriter) +[2]: https://abricotine.brrd.fr/ +[3]: https://github.com/brrd/abricotine/blob/develop/LICENSE +[4]: https://guides.github.com/features/mastering-markdown/ +[5]: https://opensource.com/sites/default/files/uploads/1_abricontine.png (Abricontine) +[6]: https://creativecommons.org/licenses/by-sa/4.0/ +[7]: https://marktext.app/ +[8]: https://github.com/marktext/marktext/blob/develop/LICENSE +[9]: https://opensource.com/sites/default/files/uploads/2_marktext.png (MarkText) +[10]: https://wereturtle.github.io/ghostwriter/ +[11]: https://github.com/wereturtle/ghostwriter/blob/master/COPYING +[12]: https://opensource.com/sites/default/files/uploads/3_ghostwriter.png (Ghostwriter) +[13]: https://atom.io/ +[14]: https://github.com/atom/atom/blob/master/LICENSE.md +[15]: https://opensource.com/sites/default/files/uploads/4_atom.png (Atom) +[16]: https://vscodium.com/ +[17]: https://github.com/VSCodium/vscodium/blob/master/LICENSE +[18]: https://github.com/zaaack/vscode-markdown-editor +[19]: https://github.com/zaaack/vscode-markdown-editor/blob/master/LICENSE +[20]: https://opensource.com/sites/default/files/uploads/5_vscodium.png (VSCodium) diff --git a/published/202110/20211014 5 common bugs in C programming and how to fix them.md b/published/202110/20211014 5 common bugs in C programming and how to fix them.md new file mode 100644 index 0000000000..e7023e39e7 --- /dev/null +++ b/published/202110/20211014 5 common bugs in C programming and how to fix them.md @@ -0,0 +1,405 @@ +[#]: subject: "5 common bugs in C programming and how to fix them" +[#]: via: "https://opensource.com/article/21/10/programming-bugs" +[#]: author: "Jim Hall https://opensource.com/users/jim-hall" +[#]: collector: "lujun9972" +[#]: translator: "unigeorge" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13894-1.html" + +C 语言编程中的 5 个常见错误及对应解决方案 +====== + +> 增强 C 语言程序的弹性和可靠性的五种方法。 + +![](https://img.linux.net.cn/data/attachment/album/202110/18/174123p4cz99skp9zz4nf4.jpg) + +即使是最好的程序员也无法完全避免错误。这些错误可能会引入安全漏洞、导致程序崩溃或产生意外操作,具体影响要取决于程序的运行逻辑。 + +C 语言有时名声不太好,因为它不像近期的编程语言(比如 Rust)那样具有内存安全性。但是通过额外的代码,一些最常见和严重的 C 语言错误是可以避免的。下文讲解了可能影响应用程序的五个错误以及避免它们的方法: + +### 1、未初始化的变量 + +程序启动时,系统会为其分配一块内存以供存储数据。这意味着程序启动时,变量将获得内存中的一个随机值。 + +有些编程环境会在程序启动时特意将内存“清零”,因此每个变量都得以有初始的零值。程序中的变量都以零值作为初始值,听上去是很不错的。但是在 C 编程规范中,系统并不会初始化变量。 + +看一下这个使用了若干变量和两个数组的示例程序: + +``` +#include +#include + +int +main() +{ + int i, j, k; + int numbers[5]; + int *array; + + puts("These variables are not initialized:"); + + printf(" i = %d\n", i); + printf(" j = %d\n", j); + printf(" k = %d\n", k); + + puts("This array is not initialized:"); + + for (i = 0; i < 5; i++) { + printf(" numbers[%d] = %d\n", i, numbers[i]); + } + + puts("malloc an array ..."); + array = malloc(sizeof(int) * 5); + + if (array) { + puts("This malloc'ed array is not initialized:"); + + for (i = 0; i < 5; i++) { + printf(" array[%d] = %d\n", i, array[i]); + } + + free(array); + } + + /* done */ + + puts("Ok"); + return 0; +} +``` + +这个程序不会初始化变量,所以变量以系统内存中的随机值作为初始值。在我的 Linux 系统上编译和运行这个程序,会看到一些变量恰巧有“零”值,但其他变量并没有: + +``` +These variables are not initialized: + i = 0 + j = 0 + k = 32766 +This array is not initialized: + numbers[0] = 0 + numbers[1] = 0 + numbers[2] = 4199024 + numbers[3] = 0 + numbers[4] = 0 +malloc an array ... +This malloc'ed array is not initialized: + array[0] = 0 + array[1] = 0 + array[2] = 0 + array[3] = 0 + array[4] = 0 +Ok +``` + +很幸运,`i` 和 `j` 变量是从零值开始的,但 `k` 的起始值为 32766。在 `numbers` 数组中,大多数元素也恰好从零值开始,只有第三个元素的初始值为 4199024。 + +在不同的系统上编译相同的程序,可以进一步显示未初始化变量的危险性。不要误以为“全世界都在运行 Linux”,你的程序很可能某天在其他平台上运行。例如,下面是在 FreeDOS 上运行相同程序的结果: + +``` +These variables are not initialized: + i = 0 + j = 1074 + k = 3120 +This array is not initialized: + numbers[0] = 3106 + numbers[1] = 1224 + numbers[2] = 784 + numbers[3] = 2926 + numbers[4] = 1224 +malloc an array ... +This malloc'ed array is not initialized: + array[0] = 3136 + array[1] = 3136 + array[2] = 14499 + array[3] = -5886 + array[4] = 219 +Ok +``` + +永远都要记得初始化程序的变量。如果你想让变量将以零值作为初始值,请额外添加代码将零分配给该变量。预先编好这些额外的代码,这会有助于减少日后让人头疼的调试过程。 + +### 2、数组越界 + +C 语言中,数组索引从零开始。这意味着对于长度为 10 的数组,索引是从 0 到 9;长度为 1000 的数组,索引则是从 0 到 999。 + +程序员有时会忘记这一点,他们从索引 1 开始引用数组,产生了“大小差一”off by one错误。在长度为 5 的数组中,程序员在索引“5”处使用的值,实际上并不是数组的第 5 个元素。相反,它是内存中的一些其他值,根本与此数组无关。 + +这是一个数组越界的示例程序。该程序使用了一个只含有 5 个元素的数组,但却引用了该范围之外的数组元素: + +``` +#include +#include + +int +main() +{ + int i; + int numbers[5]; + int *array; + + /* test 1 */ + + puts("This array has five elements (0 to 4)"); + + /* initalize the array */ + for (i = 0; i < 5; i++) { + numbers[i] = i; + } + + /* oops, this goes beyond the array bounds: */ + for (i = 0; i < 10; i++) { + printf(" numbers[%d] = %d\n", i, numbers[i]); + } + + /* test 2 */ + + puts("malloc an array ..."); + + array = malloc(sizeof(int) * 5); + + if (array) { + puts("This malloc'ed array also has five elements (0 to 4)"); + + /* initalize the array */ + for (i = 0; i < 5; i++) { + array[i] = i; + } + + /* oops, this goes beyond the array bounds: */ + for (i = 0; i < 10; i++) { + printf(" array[%d] = %d\n", i, array[i]); + } + + free(array); + } + + /* done */ + + puts("Ok"); + return 0; +} +``` + +可以看到,程序初始化了数组的所有值(从索引 0 到 4),然后从索引 0 开始读取,结尾是索引 9 而不是索引 4。前五个值是正确的,再后面的值会让你不知所以: + +``` +This array has five elements (0 to 4) +  numbers[0] = 0 +  numbers[1] = 1 +  numbers[2] = 2 +  numbers[3] = 3 +  numbers[4] = 4 +  numbers[5] = 0 +  numbers[6] = 4198512 +  numbers[7] = 0 +  numbers[8] = 1326609712 +  numbers[9] = 32764 +malloc an array ... +This malloc'ed array also has five elements (0 to 4) +  array[0] = 0 +  array[1] = 1 +  array[2] = 2 +  array[3] = 3 +  array[4] = 4 +  array[5] = 0 +  array[6] = 133441 +  array[7] = 0 +  array[8] = 0 +  array[9] = 0 +Ok +``` + +引用数组时,始终要记得追踪数组大小。将数组大小存储在变量中;不要对数组大小进行硬编码hard-code。否则,如果后期该标识符指向另一个不同大小的数组,却忘记更改硬编码的数组长度时,程序就可能会发生数组越界。 + +### 3、字符串溢出 + +字符串只是特定类型的数组。在 C 语言中,字符串是一个由 `char` 类型值组成的数组,其中用一个零字符表示字符串的结尾。 + +因此,与数组一样,要注意避免超出字符串的范围。有时也称之为 _字符串溢出_。 + +使用 `gets` 函数读取数据是一种很容易发生字符串溢出的行为方式。`gets` 函数非常危险,因为它不知道在一个字符串中可以存储多少数据,只会机械地从用户那里读取数据。如果用户输入像 `foo` 这样的短字符串,不会发生意外;但是当用户输入的值超过字符串长度时,后果可能是灾难性的。 + +下面是一个使用 `gets` 函数读取城市名称的示例程序。在这个程序中,我还添加了一些未使用的变量,来展示字符串溢出对其他数据的影响: + +``` +#include +#include + +int +main() +{ + char name[10]; /* Such as "Chicago" */ + int var1 = 1, var2 = 2; + + /* show initial values */ + + printf("var1 = %d; var2 = %d\n", var1, var2); + + /* this is bad .. please don't use gets */ + + puts("Where do you live?"); + gets(name); + + /* show ending values */ + + printf("<%s> is length %d\n", name, strlen(name)); + printf("var1 = %d; var2 = %d\n", var1, var2); + + /* done */ + + puts("Ok"); + return 0; +} +``` + +当你测试类似的短城市名称时,该程序运行良好,例如伊利诺伊州的 `Chicago` 或北卡罗来纳州的`Raleigh`: + +``` +var1 = 1; var2 = 2 +Where do you live? +Raleigh + is length 7 +var1 = 1; var2 = 2 +Ok +``` + +威尔士的小镇 `Llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch` 有着世界上最长的名字之一。这个字符串有 58 个字符,远远超出了 `name` 变量中保留的 10 个字符。结果,程序将值存储在内存的其他区域,覆盖了 `var1` 和 `var2` 的值: + +``` +var1 = 1; var2 = 2 +Where do you live? +Llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch + is length 58 +var1 = 2036821625; var2 = 2003266668 +Ok +Segmentation fault (core dumped) +``` + +在运行结束之前,程序会用长字符串覆盖内存的其他部分区域。注意,`var1` 和 `var2` 的值不再是起始的 `1` 和 `2`。 + +避免使用 `gets` 函数,改用更安全的方法来读取用户数据。例如,`getline` 函数会分配足够的内存来存储用户输入,因此不会因输入长值而发生意外的字符串溢出。 + +### 4、重复释放内存 + +“分配的内存要手动释放”是良好的 C 语言编程原则之一。程序可以使用 `malloc` 函数为数组和字符串分配内存,该函数会开辟一块内存,并返回一个指向内存中起始地址的指针。之后,程序可以使用 `free` 函数释放内存,该函数会使用指针将内存标记为未使用。 + +但是,你应该只使用一次 `free` 函数。第二次调用 `free` 会导致意外的后果,可能会毁掉你的程序。下面是一个针对此点的简短示例程序。程序分配了内存,然后立即释放了它。但为了模仿一个健忘但有条理的程序员,我在程序结束时又一次释放了内存,导致两次释放了相同的内存: + +``` +#include +#include + +int +main() +{ + int *array; + + puts("malloc an array ..."); + + array = malloc(sizeof(int) * 5); + + if (array) { + puts("malloc succeeded"); + + puts("Free the array..."); + free(array); + } + + puts("Free the array..."); + free(array); + + puts("Ok"); +} +``` + +运行这个程序会导致第二次使用 `free` 函数时出现戏剧性的失败: + +``` +malloc an array ... +malloc succeeded +Free the array... +Free the array... +free(): double free detected in tcache 2 +Aborted (core dumped) +``` + +要记得避免在数组或字符串上多次调用 `free`。将 `malloc` 和 `free` 函数定位在同一个函数中,这是避免重复释放内存的一种方法。 + +例如,一个纸牌游戏程序可能会在主函数中为一副牌分配内存,然后在其他函数中使用这副牌来玩游戏。记得在主函数,而不是其他函数中释放内存。将 `malloc` 和 `free` 语句放在一起有助于避免多次释放内存。 + +### 5、使用无效的文件指针 + +文件是一种便捷的数据存储方式。例如,你可以将程序的配置数据存储在 `config.dat` 文件中。Bash shell 会从用户家目录中的 `.bash_profile` 读取初始化脚本。GNU Emacs 编辑器会寻找文件 `.emacs` 以从中确定起始值。而 Zoom 会议客户端使用 `zoomus.conf` 文件读取其程序配置。 + +所以,从文件中读取数据的能力几乎对所有程序都很重要。但是假如要读取的文件不存在,会发生什么呢? + +在 C 语言中读取文件,首先要用 `fopen` 函数打开文件,该函数会返回指向文件的流指针。你可以结合其他函数,使用这个指针来读取数据,例如 `fgetc` 会逐个字符地读取文件。 + +如果要读取的文件不存在或程序没有读取权限,`fopen` 函数会返回 `NULL` 作为文件指针,这表示文件指针无效。但是这里有一个示例程序,它机械地直接去读取文件,不检查 `fopen` 是否返回了 `NULL`: + +``` +#include + +int +main() +{ + FILE *pfile; + int ch; + + puts("Open the FILE.TXT file ..."); + + pfile = fopen("FILE.TXT", "r"); + + /* you should check if the file pointer is valid, but we skipped that */ + + puts("Now display the contents of FILE.TXT ..."); + + while ((ch = fgetc(pfile)) != EOF) { + printf("<%c>", ch); + } + + fclose(pfile); + + /* done */ + + puts("Ok"); + return 0; +} +``` + +当你运行这个程序时,第一次调用 `fgetc` 会失败,程序会立即中止: + +``` +Open the FILE.TXT file ... +Now display the contents of FILE.TXT ... +Segmentation fault (core dumped) +``` + +始终检查文件指针以确保其有效。例如,在调用 `fopen` 打开一个文件后,用类似 `if (pfile != NULL)` 的语句检查指针,以确保指针是可以使用的。 + +人都会犯错,最优秀的程序员也会产生编程错误。但是,遵循上面这些准则,添加一些额外的代码来检查这五种类型的错误,就可以避免最严重的 C 语言编程错误。提前编写几行代码来捕获这些错误,可能会帮你节省数小时的调试时间。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/10/programming-bugs + +作者:[Jim Hall][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/jim-hall +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/bug_software_issue_tracking_computer_screen.jpg?itok=6qfIHR5y (Bug tracking magnifying glass on computer screen) +[2]: http://www.opengroup.org/onlinepubs/009695399/functions/puts.html +[3]: http://www.opengroup.org/onlinepubs/009695399/functions/printf.html +[4]: http://www.opengroup.org/onlinepubs/009695399/functions/malloc.html +[5]: http://www.opengroup.org/onlinepubs/009695399/functions/free.html +[6]: http://www.opengroup.org/onlinepubs/009695399/functions/gets.html +[7]: http://www.opengroup.org/onlinepubs/009695399/functions/strlen.html +[8]: http://www.opengroup.org/onlinepubs/009695399/functions/fopen.html +[9]: http://www.opengroup.org/onlinepubs/009695399/functions/fgetc.html +[10]: http://www.opengroup.org/onlinepubs/009695399/functions/fclose.html diff --git a/published/202110/20211014 KDE Plasma 5.23 Release Marks its 25th Anniversary With Exciting Improvements.md b/published/202110/20211014 KDE Plasma 5.23 Release Marks its 25th Anniversary With Exciting Improvements.md new file mode 100644 index 0000000000..d8df723097 --- /dev/null +++ b/published/202110/20211014 KDE Plasma 5.23 Release Marks its 25th Anniversary With Exciting Improvements.md @@ -0,0 +1,126 @@ +[#]: subject: "KDE Plasma 5.23 Release Marks its 25th Anniversary With Exciting Improvements" +[#]: via: "https://news.itsfoss.com/kde-plasma-5-23-release/" +[#]: author: "Jacob Crume https://news.itsfoss.com/author/jacob/" +[#]: collector: "lujun9972" +[#]: translator: "wxy" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13885-1.html" + +纪念 25 周年:KDE Plasma 5.23 发布 +====== + +![](https://i0.wp.com/news.itsfoss.com/wp-content/uploads/2021/10/kde-plasma-5-23-ft.png?w=1200&ssl=1) + +多年来,KDE Plasma 一直是最常用的桌面环境之一。这是因为它似乎有无穷无尽的定制选项、华丽的外观和有料的更新。 + +随着 KDE Plasma 5.23 的发布,这个桌面环境已经工作了 25 年。因此,这个版本也被称为 “Plasma 25 周年版”。 + +让我们回想一下,1996 年 10 月 14 日,KDE 的创始人 Matthias Ettrich [向一个新闻组][1] 发出了呼唤,为他的 “Kool 桌面环境Kool Desktop Environment(KDE)” 项目寻求其他程序员的帮助。 + +而你看,KDE 现在呢? + +在这次更新中,我们可以看到包括 Plasma 内部和第三方应用程序在内的一些重大 UI 改进。 + +### KDE Plasma 5.23: 有什么新东西? + +这次更新带来了许多改进,包括: + + * 桌面重点颜色 + * 新的 Breeze 主题 + * 新的电源管理快速控制 + * 应用程序启动器有更多的自定义选项 + * 数以百计的错误修复 + +在这里,我们将看到所有这些新的改进: + +![视频](https://youtu.be/RMXViPlehAo) + +#### 桌面重点颜色 + +![][3] + +在系统设置中,你会发现有一个可以改变你的桌面重点颜色的选项,你可以选择一个你喜欢的自定义颜色或与默认应用的主题相融合的颜色。 + +#### 新的 Breeze 主题 + +![][4] + +这次更新带来了全新的 Breeze 主题:Breeze - Blue Ocean。默认主题经过多年的改进,这一次,它侧重于使视觉效果更加清晰和易于识别。 + +总的来说,新的主题提供了顺滑的外观。除了主题之外,图标也变得更加突出;增加了一个加载齿轮图标。而且,许许多多这样的细微变化已经进入了 KDE Plasma 5.23,以增强桌面的外观和感觉。 + +正如开发者 Nate Graham 在测试版发布时所说: + +> 还有很多时间可以根据需要调整最终的外观,但总的来说,我认为它真的很棒了,我希望你和我一样喜欢它。 + +#### 系统设置中增强的搜索功能 + +为了更容易找到你要找的东西,KDE Plasma 5.23 增加了更多的关键词组合,以使你使用搜索栏寻找时可以快速提示你相关设置。 + +#### 系统托盘的改进 + +![][5] + +虽然系统托盘已经提供了许多控制,但现在监控你连接的网络以及访问剪贴板有了更精细的选项。 + +系统托盘也改进了显示正在播放的活动媒体时的整体外观。 + +#### 新的电源管理快速控制 + +随着 Linux 5.12 的发布,增加了一个电源管理功能。现在,KDE 引入了一种简单的调整方式,它出现在新的快速控制中。 + +它有三个选项:节电、平衡和性能。只需要一次点击就可以节省电池电力并根据需要调整性能。 + +#### 应用程序启动器的改进 + +![][6] + +在 Plasma 5.21 中,KDE 引入了一个新的应用程序启动器,叫做 Kickoff。虽然它受到了普遍欢迎,但一些用户也抱怨与旧的启动器相比,自定义选项较少。 + +好在 Plasma 5.23 解决了这个问题,为 Kickoff 引入了一些全新的自定义选项。这些选项包括以下能力: + + * 图标化电源和用户控件 + * 所有项目都采用选择列表或网格视图,而不仅仅是收藏夹菜单 + * 新的键盘快捷键 `CTRL+F` 可以快速聚焦到搜索栏 + * 在右上角添加了一个新的按针状按钮,以保持应用程序启动器处于活动状态 + +总的来说,我预计用户会相当受欢迎这些新选项,特别是那些因为它有如此之多的定制选项而使用 KDE 的用户。 + +### 其他改进措施 + +其他的常规改进包括: + + * 优化了 Wayland 会话 + * 通过“反馈”程序提高了数据透明度 + * 改进了 KDE 的 Discover(应用中心)的性能 + +要探索更多关于该版本的信息,你可以查看 [官方公告][7] 及其 [更新日志][8]。 + +### 总结 + +虽然不是有史以来最大的版本,但这是一个重要的版本,具有纪念其 25 周年的宝贵补充。像往常一样,你应该在未来几个月内的某个时候收到更新,这取决于你的发行版。 + +你对 KDE Plasma 5.23 的改进有什么看法?请在下面的评论中告诉我。 + +-------------------------------------------------------------------------------- + +via: https://news.itsfoss.com/kde-plasma-5-23-release/ + +作者:[Jacob Crume][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://news.itsfoss.com/author/jacob/ +[b]: https://github.com/lujun9972 +[1]: https://groups.google.com/g/de.comp.os.linux.misc/c/SDbiV3Iat_s/m/zv_D_2ctS8sJ?pli=1 +[2]: https://i0.wp.com/i.ytimg.com/vi/RMXViPlehAo/hqdefault.jpg?w=780&ssl=1 +[3]: https://i2.wp.com/news.itsfoss.com/wp-content/uploads/2021/10/system-settings-accent-colour.png?w=743&ssl=1 +[4]: https://i1.wp.com/news.itsfoss.com/wp-content/uploads/2021/10/breeze-application-style.png?w=368&ssl=1 +[5]: https://i1.wp.com/news.itsfoss.com/wp-content/uploads/2021/10/plasma-nm.png?w=466&ssl=1 +[6]: https://i0.wp.com/news.itsfoss.com/wp-content/uploads/2021/10/kickoff.png?w=699&ssl=1 +[7]: https://kde.org/announcements/plasma/5/5.23.0/ +[8]: https://kde.org/announcements/changelogs/plasma/5/5.22.5-5.23.0/ diff --git a/published/202110/20211014 Ubuntu 21.10 is Available Now- Finally Brings the Much Awaited GNOME 40 With Ubuntu Twist.md b/published/202110/20211014 Ubuntu 21.10 is Available Now- Finally Brings the Much Awaited GNOME 40 With Ubuntu Twist.md new file mode 100644 index 0000000000..e211dcafa9 --- /dev/null +++ b/published/202110/20211014 Ubuntu 21.10 is Available Now- Finally Brings the Much Awaited GNOME 40 With Ubuntu Twist.md @@ -0,0 +1,135 @@ +[#]: subject: "Ubuntu 21.10 is Available Now! Finally Brings the Much Awaited GNOME 40 With Ubuntu Twist" +[#]: via: "https://news.itsfoss.com/ubuntu-21-10-release/" +[#]: author: "Ankush Das https://news.itsfoss.com/author/ankush/" +[#]: collector: "lujun9972" +[#]: translator: "wxy" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13887-1.html" + +Ubuntu 21.10 版现已发布!终于带来了 Ubuntu 特色的 GNOME 40 +====== + +![](https://i1.wp.com/news.itsfoss.com/wp-content/uploads/2021/10/ubuntu-21-10-release-date.png?w=1200&ssl=1) + +> Ubuntu 21.10 是一个激动人心的版本,包含了 GNOME 40 和几个显著的变化。准备已经驶向了 Ubuntu 22.04 LTS 吗? + +Ubuntu 21.10 是下一个大型 LTS 更新之前的最后一个非 LTS 版本。代号为 Impish Indri 的 Ubuntu 21.10 将被支持**九个月,直到 2022 年 7 月**。 + +除非你想尝试最新和最棒的功能,否则你应该坚持使用 Ubuntu 20.04 LTS 并等待 Ubuntu 22.04 LTS。 + +现在你可以下载 Ubuntu 21.10 并在你的系统上安装,让我重点介绍一下这次更新的几个亮点。 + +### Ubuntu 21.10 “Impish Indri” 有何新变化? + +![][1] + +Ubuntu 21.10 出炉时有几个重大变化。一些最有影响的改进包括: + + * 新的安装程序 + * 增加了 GNOME 40 + * 抛弃了混合主题,选择了浅色/深色主题 + * 包括 Linux 内核 5.13 + * 加入了支持蓝牙 LDAC 的 PulseAudio 15 + * 带有 Nvidia 专有驱动程序的 Wayland 会话 + +GNOME 40 可以说是 Ubuntu 中令人耳目一新的变化,但你只有在体验之后才能知道。为了让你快速感受一下,下面是这个版本中你可以期待的所有变化。 + +#### 粉饰一新的安装程序 + +![][2] + +虽然 Ubuntu 的安装程序很容易使用,对新手也很友好,但 Canonical 希望通过对安装程序进行视觉和技术上的改造,使其更上一层楼。 + +开发团队利用 Flutter 使安装程序在所有其他 Ubuntu 口味和系统配置中保持一致。 + +![][3] + +#### GNOME 40 + +![][5] + +Ubuntu 的桌面体验与 GNOME 40 融为一体,没有提供任何混乱的布局。停靠区依然存在,水平活动概览也与之无缝衔接。 + +当然,[GNOME 40][4] 中的所有改进,如核心应用程序的更新、工作区的改变等等,都会延续到 Ubuntu 21.10 中,只是 Canonical 做了一些改动。 + +就我个人而言,我并不喜欢 GNOME 40 的工作流程,但你可能会想体验一下。 + +#### 主题的变化 + +![][9] + +我喜欢改进后的颜色方案,其目的是为了更好地与 Canonical 的 Ubuntu 品牌相融合。 + +然而,当涉及到与应用程序和整体主题选择的一致性时,混合(标准)主题是有点问题的。 + +在 Ubuntu 21.10 中,你会看到深色和浅色主题,而浅色是开箱即用的默认选择。如果你想进一步了解,你可以阅读我们的 [过去的报道以更多了解这一变化][6]。 + +#### Linux 内核 5.13 + +Linux 内核 5.13 的加入增加了对未来的英特尔和 AMD 芯片的支持,以及对苹果 M1 的初步支持。 + +你可以就一步了解 [Linux 内核 5.13][7] 的信息,但总的来说,它应该给你更好的硬件兼容性。 + +#### PulseAudio 15 支持蓝牙 LDAC + +考虑到现在有更多的蓝牙耳机支持 LDAC,当你在桌面上使用 Ubuntu 21.10 时,你可以利用这一功能。 + +别担心,如果你不想尝试非 LTS 版本,Ubuntu 22.04 LTS 将包括同样的改进。所以,你必须耐心等待,直到明年才能利用这一点。 + +除此之外,PulseAudio 15 还带来了一系列的改进,你可以参考它的 [官方更新日志以了解更多信息][8] 。 + +#### Wayland 会话与 NVIDIA 专有驱动程序 + +现在,即使你使用 NVIDIA 专有的驱动程序,如果你需要也可以切换到 Wayland 会话。 + +#### Ubuntu 21.10 中的其他变化 + +![][14] + +Ubuntu 21.10 版本为其云镜像、树莓派支持和安全性带来了一系列高质量的变化。 + +其中一些值得注意的变化包括: + + * [Firefox 默认采用 Snap][10] + * LibreOffice、Thunderbird 更新 + * Ubuntu Sever 的改进 + * 新的 PHP 默认为 8.0.8 + +如果你想探索所有的技术细节,你可能想参考一下 [官方发布说明][11]。 + +### 下载并升级到 Ubuntu 21.10 + +你可以选择全新安装或使用软件升级器 [从 Ubuntu 21.04 升级][12] 到 Ubuntu 21.10。 + +请注意,如果你正在使用 Ubuntu 20.04 LTS,建议等待下一个 LTS 版本,除非你知道自己在做什么。 + +- [下载Ubuntu 21.10][13] + +-------------------------------------------------------------------------------- + +via: https://news.itsfoss.com/ubuntu-21-10-release/ + +作者:[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://news.itsfoss.com/author/ankush/ +[b]: https://github.com/lujun9972 +[1]: https://i1.wp.com/news.itsfoss.com/wp-content/uploads/2021/10/ubuntu-21-10-full.png?w=1200&ssl=1 +[2]: https://i1.wp.com/news.itsfoss.com/wp-content/uploads/2021/02/new-ubuntu-installer.png?w=1012&ssl=1 +[3]: https://i1.wp.com/news.itsfoss.com/wp-content/uploads/2021/10/ubuntu-new-installer.png?w=960&ssl=1 +[4]: https://news.itsfoss.com/gnome-40-release/ +[5]: https://i0.wp.com/news.itsfoss.com/wp-content/uploads/2021/10/ubuntu-21-10-new-gnome-40.png?resize=1568%2C776&ssl=1 +[6]: https://news.itsfoss.com/ubuntu-21-10-theme-change/ +[7]: https://news.itsfoss.com/linux-kernel-5-13-release/ +[8]: https://www.freedesktop.org/wiki/Software/PulseAudio/Notes/15.0/ +[9]: https://i1.wp.com/news.itsfoss.com/wp-content/uploads/2021/10/ubuntu-21-10-appearance.png?w=1062&ssl=1 +[10]: https://news.itsfoss.com/ubuntu-firefox-snap-default/ +[11]: https://discourse.ubuntu.com/t/impish-indri-release-notes/21951 +[12]: https://itsfoss.com/upgrade-ubuntu-to-newer-version/ +[13]: https://releases.ubuntu.com/21.10/ +[14]: https://i2.wp.com/news.itsfoss.com/wp-content/uploads/2021/10/ubuntu-21-10-about.png?w=1054&ssl=1 \ No newline at end of file diff --git a/published/202110/20211015 How to Find and Kill Zombie Process in Linux.md b/published/202110/20211015 How to Find and Kill Zombie Process in Linux.md new file mode 100644 index 0000000000..a3a8dd3f29 --- /dev/null +++ b/published/202110/20211015 How to Find and Kill Zombie Process in Linux.md @@ -0,0 +1,123 @@ +[#]: subject: "How to Find and Kill Zombie Process in Linux" +[#]: via: "https://itsfoss.com/kill-zombie-process-linux/" +[#]: author: "Marco Carmona https://itsfoss.com/author/marco/" +[#]: collector: "lujun9972" +[#]: translator: "zengyi1001" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13919-1.html" + +如何找到并杀掉 Linux 系统中的僵尸进程 +====== + +![][5] + +> 这是一个关于如何寻找 Linux 系统僵尸进程并杀死它们的小知识。你也可以从中了解到关于进程和僵尸进程的一些知识。 + +在了解僵尸进程之前,让我们来复习一下什么是 Linux 进程。 + +简而言之,[进程][1] 是一个程序的运行实例。它可能运行在前端(比如有交互的进程),也可能运行在后端(比如无交互或自动运行的进程)。它可能是一个父进程(运行期间创建了其他进程),也可能是一个子进程(由其他进程所创建)。 + +在 Linux 系统中,除 PID 为 0 的第一个 `init` 进程(或 `systemd`)外,其余进程都有父进程。进程也可以拥有自己的子进程。 + +不相信?可以试试在终端中使用 `pstree` 命令查看进程的树型结构,你能看到系统各个进程的“家族树”。 + +### Linux系统里的僵尸进程是什么? + +子进程死亡后,它的父进程会接收到通知去执行一些清理操作,如释放内存之类。然而,若父进程并未察觉到子进程死亡,子进程就会进入到“僵尸zombie”状态。从父进程角度看,子进程仍然存在,即使子进程实际上已经死亡。这就是“僵尸进程zombie process”(也被称为“已消失进程defunct process”)是如何产生并存在于系统中的。 + +这里有一个来自 [Turnoff.us](https://turnoff.us/geek/zombie-processes/) 的关于僵尸进程的非常有趣的看法: + +![Image credit: Turnoff.us][2] + +### 你真的需要关心僵尸进程吗? + +重点要说的是,僵尸进程并没有像它的名称那样看起来可怕。 + +但如果系统的内存已经所剩不多或者有太多的僵尸进程在吃掉内存,问题会变得糟糕。同样,大部分 Linux 系统进程最大 PID 设置为 32768,如果过多僵尸进程导致其他重要任务没有 PID 可用,你的系统会发生崩溃。 + +这是真实可能发生的,它有一定的概率,特别当存在一个编码糟糕的程序开始大量产生僵尸进程的时候。 + +在这种情况下,找到并杀死僵尸进程是一个明智的做法。 + +### 如何找到僵尸进程 + +Linux 系统中的进程可能处于如下状态中的一种: + + * `D` = 不可中断的休眠 + * `I` = 空闲 + * `R` = 运行中 + * `S` = 休眠 + * `T` = 被调度信号终止 + * `t` = 被调试器终止 + * `Z` = 僵尸状态 + +那如何查看进程和它的当前状态呢?一个简单的方法是在终端中使用 [top 命令][3]。 + +![Top command show processes and their status][4] + +正如你在上面截图中看到的,截图中共有 250 个任务(进程),其中 1 个处在 “运行中running” 状态,248 个进程处于 “休眠sleep” 状态,还有一个处于 “僵尸zombie” 状态。 + +现在问题进入下一步,如何杀死 “僵尸” 进程? + +### 如何找到并杀死一个僵尸进程?僵尸进程能被杀死吗? + +僵尸进程已经死了,要如何才能杀死一个已经死亡的进程呢? + +在僵尸电影中,你可以射击僵尸的头部或烧掉它们,但在这里是行不通的。你可以一把火烧了系统来杀死僵尸进程,但这并不是一个可行的方案。 + +一些人建议发送 `SIGCHLD` 给父进程,但这个信号很可能会被忽略。还有一个方法是杀死父进程来杀死僵尸进程,这听起来很野蛮,但它却是唯一能确保杀死僵尸进程的方法。 + +首先,通过在终端中 [使用 ps 命令][6] 我们列举僵尸进程,得到它们的进程 ID: + +``` +ps ux | awk '{if($8=="Z+") print}' +``` + +`ps ux` 命令输出的第 8 列显示了进程状态。上述命令只会打印所有处在 Z+ 状态(表示僵尸状态)的进程。 + +确认了进程 ID 后,我们可以得到它的父进程 ID: + +``` +ps -o ppid= -p +``` + +你也可以将上述两个命令结合在一起,直接得到僵尸进程的 PID 及其父进程的 PID: + +``` +ps -A -ostat,pid,ppid | grep -e '[zZ]' +``` + +现在你得到了父进程 ID,使用命令行和得到的 ID 号 [终于可以杀死进程了][7]: + +``` +kill -9 +``` + +![Killing parent process][8] + +再次运行 `ps` 命令或 `top` 命令,你可以验证僵尸进程是否已经被杀死。 + +恭喜!现在你知道怎么清理僵尸进程了。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/kill-zombie-process-linux/ + +作者:[Marco Carmona][a] +选题:[lujun9972][b] +译者:[zengyi1001](https://github.com/zengyi1001) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://itsfoss.com/author/marco/ +[b]: https://github.com/lujun9972 +[1]: https://tldp.org/LDP/tlk/kernel/processes.html +[2]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/10/zombies-turnoff.webp?resize=800%2C467&ssl=1 +[3]: https://linuxhandbook.com/top-command/ +[4]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/10/top-command-view.png?resize=800%2C474&ssl=1 +[5]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/10/kill-zombie-process-linux.jpg?resize=800%2C450&ssl=1 +[6]: https://linuxhandbook.com/ps-command/ +[7]: https://itsfoss.com/how-to-find-the-process-id-of-a-program-and-kill-it-quick-tip/ +[8]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/10/killing-parent-process.png?resize=800%2C180&ssl=1 diff --git a/published/202110/20211015 How to Upgrade to Ubuntu 21.10 Right Now.md b/published/202110/20211015 How to Upgrade to Ubuntu 21.10 Right Now.md new file mode 100644 index 0000000000..dd8a75ea34 --- /dev/null +++ b/published/202110/20211015 How to Upgrade to Ubuntu 21.10 Right Now.md @@ -0,0 +1,67 @@ +[#]: subject: "How to Upgrade to Ubuntu 21.10 Right Now" +[#]: via: "https://itsfoss.com/upgrade-ubuntu-to-newer-version/" +[#]: author: "Abhishek Prakash https://itsfoss.com/author/abhishek/" +[#]: collector: "lujun9972" +[#]: translator: "geekpi" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13902-1.html" + +如何现在就升级到 Ubuntu 21.10 +====== + +[Ubuntu 21.10 “Impish Indri” 刚刚发布][1]。如果你正在使用 Ubuntu 21.04,你应该有升级到 Ubuntu 21.10 的选项。 + +![](https://img.linux.net.cn/data/attachment/album/202110/20/105035l6ig4lkjnk5cipuw.jpg) + +然而,这种推出将是逐步的。这意味着不是每个人都会立即得到新版本可用的通知。在你看到升级选项之前,可能需要几周的时间。 + +但是,如果你迫不及待地想获得带有 GNOME 40 和其他新功能的 Ubuntu 21.10 呢?你真的需要等待吗?不用。 + +### 现在就从 Ubuntu 21.04 升级到 Ubuntu 21.10 + +以下是你要做的。打开“软件和更新Software & Updates”应用: + +![Start the Software & Updates application][3] + +并确保你在“更新Updates”标签下将“通知我新的 Ubuntu 版本Notify me of a new Ubuntu version”设置为“任何新版本For any new version”。 + +![Make sure that settings are right for new Ubuntu version notification][4] + +现在打开终端,输入以下命令,以确保你的系统已经更新: + +``` +sudo apt update && sudo apt upgrade +``` + +当你的 Ubuntu 21.04 系统安装了所有的更新,运行更新管理器来寻找开发版本(本例中为 Ubuntu 21.10)。 + +``` +update-manager -d +``` + +它将打开寻找更新的“更新管理器Update Manager”。由于你已经更新了系统,它不会找到新的更新来安装。然而,它将看到 Ubuntu 21.10 现在已经可用。 + +![Hit the upgrade button][2] + +你可以点击“升级Upgrade”按钮,按照屏幕上的选项开始升级程序。你需要有良好的网络速度来下载 2GB 的更新。确保你的系统在升级过程中保持与电源的连接。 + +享受 Ubuntu 21.10! + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/upgrade-ubuntu-to-newer-version/ + +作者:[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://linux.cn/article-13887-1.html +[2]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/10/upgrade-to-Ubuntu-21-10.webp?resize=797%2C287&ssl=1 +[3]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/10/software-and-updates.webp?resize=800%2C166&ssl=1 +[4]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/10/ubuntu-upgrade-settings.webp?resize=800%2C338&ssl=1 diff --git a/published/202110/20211016 helloSystem, the Mac-like FreeBSD OS, Takes Another Step Towards Full Release.md b/published/202110/20211016 helloSystem, the Mac-like FreeBSD OS, Takes Another Step Towards Full Release.md new file mode 100644 index 0000000000..7aecb41222 --- /dev/null +++ b/published/202110/20211016 helloSystem, the Mac-like FreeBSD OS, Takes Another Step Towards Full Release.md @@ -0,0 +1,111 @@ +[#]: subject: "helloSystem, the Mac-like FreeBSD OS, Takes Another Step Towards Full Release" +[#]: via: "https://news.itsfoss.com/hellosystem-towards-first-release/" +[#]: author: "John Paul Wohlscheid https://news.itsfoss.com/author/john/" +[#]: collector: "lujun9972" +[#]: translator: "wxy" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13915-1.html" + +helloSystem:一款类似 Mac 的 FreeBSD 系统 +====== + +![](https://i1.wp.com/news.itsfoss.com/wp-content/uploads/2021/10/hello-system-bsd.jpg?w=1200&ssl=1) + +最近,helloSystem 的开发者发布了他们操作系统的最新版本。helloSystem 是一个较新的项目,希望以 FreeBSD 为基础创建一个简单易用的操作系统。让我们来看看这对你我意味着什么。 + +### helloSystem 简介 + +![helloSystem 的关于屏幕][1] + +你们中的大多数人可能以前从未听说过 [helloSystem][2]。该项目是由 [AppImage 的创建者][3] [Simon Peter][4] 在去年年初启动的。Simon 的目标是创建一个“友好的 [自由桌面][5] 操作系统,重点是简单、简约优雅和可用性。” + +Simon 从上世纪 80 、90 年代更为简单的操作系统中获得了灵感,特别是 **早期的 MacOS**,比如 [System 1][6]。如果你只是看一下系统运行的截图,你可能会想说,“我不明白这有什么好大惊小怪的。有一堆 Linux 发行版或主题,看起来就像 MacOS。” + +该项目不仅仅是看起来像 MacOS,它想回归到更简单、更容易使用的设计。据 [其网站][7] 上讲,“helloSystem 是一个面向创作者的桌面系统,注重简单、优雅和实用性。它的设计遵循 ‘少而精’ 的理念。它的目的是为 ‘普通人’ 提供一个系统,欢迎从 Mac 切换过来的人”。你可以通过观看 Simon 在 [FOSDEM 21][8] 上的演讲,了解更多关于他对 helloSystem 计划的想法。 + +就像 [Suckless 项目][9] 一样,Simon 创建了一个 “[欢迎和不欢迎的技术][10]” 列表。被批准的技术清单包括: + + * Qt + * mDNSResponder + * Python + * Go + +![helloSystem 的欢迎屏幕][12] + +“不受欢迎的技术”清单包括 Simon 认为“太复杂或被认为不美观”的东西。这些技术包括: + + * 触摸 + * btrfs + * Gnome + * GTK + * 客户端窗口装饰 + * Wayland + * Pipewire + * XDG 桌面规范 + * 与原始字体在度量上兼容的字体,但不试图在视觉上与原始字体相似 + * 最终用户应用程序的包管理器 + * 配置文件、IP 地址 + * D-Bus + * 通过限制用户或应用程序可以做的事情而提供的安全性 + * Polkit + * 大写锁定键 + * 本地文件的 URI + +![在 helloSystem 上安装 Inkscape][13] + +### helloSystem 如何工作 + +我最好解释一下 helloSystem 的工作方式。就像 MacOS 一样,桌面在屏幕顶部有一个全局菜单,底部有一个 Dock。与 MacOS 的 Finder 一样,helloSystem 也有一个文件管理器(名为 Filer),它也负责窗口管理。 + +在左上方,你会发现一个 “系统System” 菜单,你可以用它来访问应用程序。(你也可以在左上角的搜索框中输入应用程序的名称。)helloSystem 只安装了几个开箱即用的基本应用程序。如果你点击一个未安装的应用程序,helloSystem 会下载并安装该应用程序的 AppImage。 + +helloSystem 基于 FreeBSD 12.2。它默认启用了 ZFS。它没有密码或用户账户系统,但这并不意味着他们无视安全。据 [其网站][10] 讲,“这并不是说一般的安全问题不重要。而是说它需要以一种不会限制设备的合法用户(所有者)真正 ‘拥有’ 该设备的方式来实现。” + +### 最新版本中的新功能 + +![helloSystem 的实用程序窗口][14] + +最新版本的 helloSystem 包括不少图形方面的更新和小的变化,包括: + + * 从 Openbox 切换到 KWin 窗口管理器 + * 合理的窗口标题居中 + * 当窗口被拖到屏幕边缘时,会缩放到一定大小,类似于 “Aero Snap”。 + * 简化了 “桌面设置Desktop Settings” 的用户界面;现在更改会立即应用 + * 移除文件管理器中的标签以简化用户界面 + * 为菜单添加新的电池小程序,以显示电池充电量 + * 桌面上的垃圾箱图标不再有 “移动到垃圾箱Move to Trash” 的上下文菜单项 + * 最小化窗口和取消最小化窗口时的动画 + * 窗口大小调整时的动画 + * 调整内核配置以优化声音 + * 简化了文件管理器中的 “获取信息Get Info” 对话框 + +你可以在 [这里][11] 看到其余的变化。你也可以从同一个链接下载最新的 .iso 文件。试一试,让我们知道你的想法。 + +-------------------------------------------------------------------------------- + +via: https://news.itsfoss.com/hellosystem-towards-first-release/ + +作者:[John Paul Wohlscheid][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://news.itsfoss.com/author/john/ +[b]: https://github.com/lujun9972 +[1]: https://i2.wp.com/news.itsfoss.com/wp-content/uploads/2021/10/hello-about.jpg?w=850&ssl=1 +[2]: https://github.com/helloSystem/hello +[3]: https://itsfoss.com/appimage-interview/ +[4]: https://github.com/probonopd +[5]: https://medium.com/@probonopd/bring-back-the-ease-of-80s-and-90s-personal-computing-393738c5e2a1 +[6]: https://github.com/helloSystem/hello/wiki#design-principles +[7]: https://hellosystem.github.io/docs/ +[8]: https://fosdem.org/2021/schedule/event/hello_bsd/ +[9]: https://suckless.org/sucks/ +[10]: https://github.com/helloSystem/hello/wiki/Welcome-and-unwelcome-technologies +[11]: https://github.com/helloSystem/ISO/releases/tag/r0.6.0 +[12]: https://i0.wp.com/news.itsfoss.com/wp-content/uploads/2021/10/hello-welcome.jpg?w=850&ssl=1 +[13]: https://i0.wp.com/news.itsfoss.com/wp-content/uploads/2021/10/hello-install.jpg?w=850&ssl=1 +[14]: https://i0.wp.com/news.itsfoss.com/wp-content/uploads/2021/10/hello-utillities.jpg?w=850&ssl=1 \ No newline at end of file diff --git a/published/202110/20211018 4 Linux tools to erase your data.md b/published/202110/20211018 4 Linux tools to erase your data.md new file mode 100644 index 0000000000..2d6147082a --- /dev/null +++ b/published/202110/20211018 4 Linux tools to erase your data.md @@ -0,0 +1,116 @@ +[#]: subject: "4 Linux tools to erase your data" +[#]: via: "https://opensource.com/article/21/10/linux-tools-erase-data" +[#]: author: "Don Watkins https://opensource.com/users/don-watkins" +[#]: collector: "lujun9972" +[#]: translator: "geekpi" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13913-1.html" + +4 个用来擦除数据的 Linux 工具 +====== + +> 用这些开源工具从你的硬盘驱动器中擦除数据。 + +![](https://img.linux.net.cn/data/attachment/album/202110/23/113918sdojp6sj0odgis16.jpg) + +保持数据安全的最好方法之一是只向加密的硬盘驱动器写入数据。在一个标准的硬盘上,只要把硬盘挂载就可以查看数据,就像 U 盘一样,甚至可以用 [Scalpel][2] 和 [Testdisk][3] 等工具显示和恢复已删除的数据。但是在一个加密的驱动器上,如果没有解密密钥(通常是你在挂载驱动器时输入的密码),数据是无法被读取的。 + +加密可以在你安装操作系统时建立,有些操作系统甚至可以在安装后的任何时候激活加密功能。 + +但是,当你卖掉一台电脑或更换一个一开始就没有被加密的驱动器时,你该怎么办呢? + +与从一开始就加密你的数据相比,最好的办法是在你用完硬盘后删除数据。 + +### 负责任的看管者 + +我经常被要求帮助客户升级一台旧电脑。无一例外,他们更愿意帮助我回收它们,使它们能被别人使用。我很乐意翻新这些旧电脑,用较新的固态驱动器来改装它们,极大地提高性能。 + +然而,把一个旧驱动器扔进垃圾桶并不是一个好主意。它需要被擦除,然后被妥善处理。我没有把硬盘留在原来的电脑里,而是把它们取出来,放在一个硬盘盒里,然后把它们连接到我的 Linux 电脑上。有几个 Linux 工具可以很容易地完成这个任务。其中一个是 **Gnu Shred**。 + +### GNU Shred + +``` +$ sudo shred -vfz /dev/sdX +``` + +Shred 有许多选项: + + * `-n` - 覆盖的次数。默认是三次。 + * `-u` - 覆盖并删除。 + * `-s` - 要粉碎的字节数。 + * `-v` - 显示扩展信息。 + * `-f` - 必要时强制改变权限以允许写入。 + * `-z` - 最后用 0 覆盖来隐藏粉碎。 + +使用 `shred --help` 获取更多信息 + +### ShredOS + +ShredOS 是一个即用Live Linux 发行版,它的唯一目的是清除驱动器的全部内容。它是在一个名为 DBAN 的类似发行版停止维护后开发的。它使用 `nwipe` 应用,它是 DBAN 的 `dwipe` 的一个分叉。你可以通过下载 32 位或 64 位镜像,并在 Linux 和 macOS 上使用 `dd` 命令将其写入驱动器来制作一个可启动的 USB 驱动器: + +``` +$ sudo dd if=shredos.img of=/dev/sdX bs=4M status=progress +``` + +另外,你可以在 Linux、macOS 和 Windows 上使用 [Etcher][4] 工具烧录。 + +### dd 命令 + +清除驱动器的一个常见方法是使用 Linux 的 `dd` 命令。几乎所有的 Linux 安装都安装了 `dd` 工具。确保该驱动器没有被挂载。 + +``` +$ sudo umount /dev/sdXY -l +``` + +如果你想在整个目标磁盘上写零,执行以下命令。这可能需要一个整个通宵。 + +``` +$ sudo dd if=/dev/urandom of=/dev/sdX bs=10M +``` + +**警告**:请确保你知道你在系统中的位置,并以正确的驱动器为目标,这样你就不会意外地删除自己的数据。 + +### Nvme-cli + +如果你的计算机包含一个较新的 NVMe 驱动器,你可以安装 [nvme-cli][5] 程序,并使用 `sanitize` 选项来清除你的驱动器。 + +`nvme sanitize help` 命令提供了选项列表: + + * `--no-dealloc`、`-d` - 净化后不解除分配。 + * `--oipbp`、`-i` - 每次覆写后反转模式。 + * `--owpass=`、`-n` - 覆写次数。 + * `--ause`、`-u` - 允许无限制净化退出。 + * `--sanact=`、`-a` - 净化动作。 + * `--ovrpat=`、`-p` - 覆写模式。 + +下面是我使用的命令: + +``` +$ sudo nvme sanitize /dev/nvme0nX +``` + +这里的警告与格式化过程相同:首先备份重要的数据,因为这个命令会擦除这些数据! + +### 信息管理 + +你保存在计算机上的信息是很重要的。它属于你,也属于其他任何人。当你卖掉一台电脑或处理一个硬盘时,确保你已经用这些很棒的工具之一清除了你的数据。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/10/linux-tools-erase-data + +作者:[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/cloud_tools_hardware.png?itok=PGjJenqT (Tools in a cloud) +[2]: https://www.redhat.com/sysadmin/find-lost-files-scalpel +[3]: https://www.redhat.com/sysadmin/recover-partition-files-testdisk +[4]: https://opensource.com/article/18/7/getting-started-etcherio +[5]: https://opensource.com/article/21/9/nvme-cli diff --git a/published/202110/20211018 Get memory use statistics with this Linux command-line tool.md b/published/202110/20211018 Get memory use statistics with this Linux command-line tool.md new file mode 100644 index 0000000000..be81b26066 --- /dev/null +++ b/published/202110/20211018 Get memory use statistics with this Linux command-line tool.md @@ -0,0 +1,113 @@ +[#]: subject: "Get memory use statistics with this Linux command-line tool" +[#]: via: "https://opensource.com/article/21/10/memory-stats-linux-smem" +[#]: author: "Tomasz Waraksa https://opensource.com/users/tomasz" +[#]: collector: "lujun9972" +[#]: translator: "geekpi" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13918-1.html" + +用 smem 命令获取内存使用统计信息 +====== + +> smem 命令允许你快速查看你的网页应用的内存使用情况。 + +![](https://img.linux.net.cn/data/attachment/album/202110/25/101843emjjkmvk88gvyqgv.jpg) + +在我的编程工作中,我经常需要了解网页应用的内存使用情况。在深入研究细节和浏览器剖析工具之前,一个粗略的估计通常就足够了。 + +为了了解 Linux 或 macOS 上的内存使用情况,人们通常使用 [top][2] 或 [htop][3]。我很想看到一个单一的数字:一个进程占用了多少内存。但这些工具所显示的统计数据可能很难理解。对于网页浏览器来说,它甚至更加复杂,因为它们经常运行许多独立的进程。它们在 `top` 输出中显示为一个长长的列表,每一个都有自己的单独指标。 + +![Memory usage using htop][4] + +### smem 命令 + +幸运的是有 [smem][6],另一个用于查看内存使用统计的命令行工具。用你选择的包管理器安装它,例如: + +``` +sudo apt install smem +``` + +要获得 [Firefox][7] 的总内存使用量,请执行: + +``` +smem -c pss -P firefox -k -t | tail -n 1 +``` + +这些开关做了什么? + + * `-c` 开关指定要显示的列。我只对 `pss` 列感兴趣,它显示一个进程分配的内存。 + * `-P` 开关过滤进程,只包括那些名字里有 `firefox` 的进程。 + * `-k` 开关显示以 MB/GB 为单位的内存使用情况,而不是单纯的字节数。 + * `-t` 开关显示总数。 + * `tail -n 1` 过滤器只输出最后一行,也就是总数的地方。 + +输出是非常简单的: + +``` +$ smem -t -k -c pss -P firefox | tail -n 1 +4.9G +``` + +开门见山!而且,经过又一天忙碌的工作,打开了 50 多个选项卡,Firefox 仍然只使用 5 GB。看看吧,Google Chrome。 + +#### 用一个脚本更容易 + +为了方便起见,我创建一个名为 `memory-use` 的小脚本,它将进程名称作为参数。我把所有的脚本都放在 `~/bin` 里,所以: + +``` +echo 'smem -c pss -P "$1" -k -t | tail -n 1' > ~/bin/memory-use && chmod +x ~/bin/memory-use +``` + +现在我可以很容易地测量任何应用的内存使用: + +``` +memory-use firefox +memory-use chrome +memory-use slack +``` + +#### 还有更多! + +该工具不仅可以显示总的内存使用情况。它甚至可以生成图形输出。 + +比如: + +``` +smem --pie name -c pss +``` + +显示类似这样的内容: + +![Pie chart output from smem][8] + +关于更多的细节,我建议查看 [smem 手册页][6]。 + +你可以在 上找到另一个很棒的教程。 + +希望你喜欢! + +本文最初发表在[作者的博客][9]上,并经许可转载。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/10/memory-stats-linux-smem + +作者:[Tomasz Waraksa][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/tomasz +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/programming_code_keyboard_orange_hands.png?itok=G6tJ_64Y (Programming at a browser, orange hands) +[2]: https://linux.die.net/man/1/top +[3]: https://linux.die.net/man/1/htop +[4]: https://opensource.com/sites/default/files/uploads/1_htop.png (Memory usage using htop) +[5]: https://creativecommons.org/licenses/by-sa/4.0/ +[6]: https://linux.die.net/man/8/smem +[7]: https://www.mozilla.org/en-US/firefox/ +[8]: https://opensource.com/sites/default/files/uploads/2_smem-pie-chart.png (Pie chart output from smem) +[9]: https://letsdebug.it/post/26-measure-application-memory-use-on-linux/ diff --git a/published/202110/20211018 PinePhone Pro is an Affordable Linux Flagship Smartphone That Could Replace Your Android.md b/published/202110/20211018 PinePhone Pro is an Affordable Linux Flagship Smartphone That Could Replace Your Android.md new file mode 100644 index 0000000000..ab6426afea --- /dev/null +++ b/published/202110/20211018 PinePhone Pro is an Affordable Linux Flagship Smartphone That Could Replace Your Android.md @@ -0,0 +1,114 @@ +[#]: subject: "PinePhone Pro is an Affordable Linux Flagship Smartphone That Could Replace Your Android" +[#]: via: "https://news.itsfoss.com/pinephone-pro-introduced/" +[#]: author: "Jacob Crume https://news.itsfoss.com/author/jacob/" +[#]: collector: "lujun9972" +[#]: translator: "wxy" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13901-1.html" + +PinePhone Pro:一款价位适中的 Linux 旗舰智能手机 +====== + +> 售价 399 美元的 PinePhone Pro 是一款 Linux 智能手机,或许有潜力取代一些预算相当的 Android 设备。但作为消费者,还需要等待几个月。 + +![](https://i2.wp.com/news.itsfoss.com/wp-content/uploads/2021/10/PinePhone-Pro-ft.png?w=1200&ssl=1) + +早在 2019 年,当 Pine64 宣布推出 PinePhone 时,没有人想到它会变得如此受欢迎。在短短两年间,Pine64 已经成功建立了一个由数万名开发者和用户组成的社区,大家一起努力使 Linux 完美地跑在了手机上。 + +现在,随着 PinePhone Pro 的宣布,Pine64 正在扩大 Linux 手机的受众范围。这个设备有许多令人难以置信的新功能,所有这些都使它可以与许多中档 Android 手机相提并论。 + +- [视频](https://img.linux.net.cn/static/video/Meet%20the%20PinePhone%20Pro%20_%20PINE64-wP2-6Z74W44.mp4) + +### PinePhone Pro 功能 + +![][1] + +与原来的 PinePhone 相比,PinePhone Pro 带来了巨大的升级。这些升级中最值得注意的是使用了 Rockchip 的六核 RK3399S SoC 芯片,这应该能显著地提升性能。其他一些值得注意的功能和升级还有: + + * 4GB LPDDR4 内存 + * 128GB 存储 + microSD 卡插槽 + * 6 英寸 IPS 显示屏,采用 **大猩猩 4 号玻璃**。 + * 1300 万像素(后置)+ 500 万像素(前置)的摄像头 + +让我们来探讨一下这方面的更多细节。 + +#### 性能更好 + +![][2] + +到目前为止,最重要的升级是 RK3399S SoC 的加入,它是 Pine64 和 Rockchip 合作的结果。这个令人印象深刻的强大 SoC 包含 6 个 CPU 核心,以及一个四核 Mali T860 GPU。 + +这一组合带来了显著的性能提升,使得 PinePhone Pro 的性能与大多数中档安卓手机相当。这带来了一个更快的系统,能够运行许多桌面级应用程序,如用于照片编辑的 GIMP 和用于仿真游戏的 RetroArch。 + +总的来说,这次升级将大大改善开发者和消费者的用户体验。 + +#### 内存更多 + +考虑到智能手机已经开始提供 6GB 内存作为基本变体时,Linux 智能手机也应该使用更多的内存来保持流畅。虽然在优化方面已经做了很多工作,但更多的内存总是有益的。 + +PinePhone Pro 提供了 4GB 的内存,当放在基座上时可以有更大的通用性,当作为手机使用时可以多打开几个应用程序。我对此感到非常兴奋,因为它应该能够模拟更多的游戏,增加 PinePhone Pro 作为娱乐设备的吸引力。 + +#### 存储空间升级 + +我的原版的 PinePhone 面临的最大挑战之一是存储空间不足。从看电影到玩仿真游戏,我不得不不断地删除文件以获得足够的存储空间。 + +然而,在 PinePhone Pro 上,Pine64 已经解决了这个问题,它提供了 128GB 的闪存,这对任何人来说都足够了。 + +#### 显示屏改进 + +![][4] + +虽然这并不是原版 PinePhone 的痛点,但 PinePhone Pro 的显示屏已经升级,变得更大,采用了大猩猩 4 号玻璃。这是非常值得欢迎的,这款手机现在应该可以提供明显改善的防刮伤性能和更多可用的屏幕空间。 + +虽然 AMOLED 面板会很好,但这在一定程度上会提高价格,可能会降低设备的吸引力。总的来说,我对这次升级很满意,我相信许多用户也是这样。 + +#### 相机升级 + +至少对我来说,原版的 PinePhone 的摄像头是一个相当大的痛点。主摄像头只有 500 万像素,还有一个小小的 200 万像素的前置摄像头,这两个摄像头都不能拍出非常高质量的图像。 + +原版的 PinePhone 的主摄像头已被移到 PinePhone Pro 的前面。它与一个 1300 万像素的索尼摄像头传感器相配,能够录制 4K 视频和提供更高的图像质量。 + +用户终于可以用他们的 Linux 智能手机来拍摄照片,在社交媒体平台上分享了。 + +### 你可以升级你的原版 PinePhone 吗? + +这是我看到该公告时问的第一个问题。不幸的是,将你的 PinePhone 升级到 PinePhone Pro 主板是不可行的。我认为 Pine64 解释得很好: + +> 虽然 PinePhone Pro 的主板尺寸适合 PinePhone,但机框、IPS 显示面板、摄像头、子板和散热系统都不同。例如,PinePhone Pro 的摄像头就不适合 PinePhone 的机框,而且与 PinePhone Pro 的主板在电气上不兼容。散热是另一个重要的考虑因素,因为在原来的 PinePhone 的机框中,较高的热量输出可能不能简单地忽略,这需要克服解决。 + +虽然 Pine64 不建议升级你原来的 PinePhone 的主板,但我认为尝试一下还是很有意思的。虽然令人失望,但也应该注意到,Pine64 并不打算停止原来的 PinePhone 开发,因为它对于想要一个便宜的 Linux 手机作为基本用途的人来说是完美的。 + +### 总结 + +总的来说,我非常兴奋地看到又一个设备进入 Linux 手机市场,尤其是像 PinePhone Pro 这样将得到良好支持(希望是这样)的设备。尽管其价格是 399 美元,但我认为很多人都会蜂拥而至购买这款手机。 + +如果你认为你可能是这些人中的一员,但你得等待几个月后的正式发布。 + +然而,想要获得早期设备的开发者现在可以点击下面的按钮来预购 PinePhone Pro。 + +- [预购PinePhone Pro][6] + +关于 PinePhone Pro 的可用性和规格的更多细节,你应该去他们的 [官方网站][5] 看看。 + +你要买 PinePhone Pro 吗?请在下面的评论中告诉我! + +-------------------------------------------------------------------------------- + +via: https://news.itsfoss.com/pinephone-pro-introduced/ + +作者:[Jacob Crume][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://news.itsfoss.com/author/jacob/ +[b]: https://github.com/lujun9972 +[1]: https://i2.wp.com/news.itsfoss.com/wp-content/uploads/2021/10/pinephone-pro.png?w=1024&ssl=1 +[2]: https://i0.wp.com/news.itsfoss.com/wp-content/uploads/2021/10/pinephoneProMainBoard.jpg?w=1024&ssl=1 +[3]: https://i0.wp.com/i.ytimg.com/vi/pCxDcMdr_fo/hqdefault.jpg?w=780&ssl=1 +[4]: https://i0.wp.com/news.itsfoss.com/wp-content/uploads/2021/10/PinePhonePro.png?w=465&ssl=1 +[5]: https://www.pine64.org/pinephonepro/ +[6]: https://preorder.pine64.org/ diff --git a/published/202110/20211019 Dash to Dock is Finally Available for GNOME 40.md b/published/202110/20211019 Dash to Dock is Finally Available for GNOME 40.md new file mode 100644 index 0000000000..a4a68bb887 --- /dev/null +++ b/published/202110/20211019 Dash to Dock is Finally Available for GNOME 40.md @@ -0,0 +1,69 @@ +[#]: subject: "Dash to Dock is Finally Available for GNOME 40" +[#]: via: "https://news.itsfoss.com/dash-to-dock-gnome-40/" +[#]: author: "Ankush Das https://news.itsfoss.com/author/ankush/" +[#]: collector: "lujun9972" +[#]: translator: "wxy" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13905-1.html" + +Dash to Dock 终于可以在 GNOME 40 上使用了 +====== + +> Dash to Dock v70 增加了对 GNOME 40 的支持,并放弃了对较旧版本的 GNOME Shell 的支持。但是,你可以继续使用旧版本。 + +![](https://i2.wp.com/news.itsfoss.com/wp-content/uploads/2021/10/ubuntu-dock.png?w=1200&ssl=1) + +Dash to Dock 是多年来最 [有用的 GNOME 扩展][1] 之一。随着 [GNOME 40][2] 的引入,很多人都没能让这个扩展在它上面工作起来。 + +当然,作为一个流行的扩展,对 GNOME 40 的支持预计很快就会被加入。终于,它来了! + +如果你不知道,GNOME 40 包括一个水平工作区视图,这影响了一些人的工作流程,但 Ubuntu 即使在 GNOME 40 中也没有移动 Dock 的打算。 + +所以,你仍然可以使用 Dash to Dock 来从概览区得到一个水平的 Dock。 + +### Dash to Dock v70 放弃了对旧的 GNOME Shell 的支持 + +![][3] + +Dash to Dock v70,对 GNOME 40 和特定的 3.34 版的 GNOME Shell 提供了支持。 + +然而,为了支持 GNOME 40 而对扩展所做的技术修改也意味着新版本的扩展不能再与旧版本的 GNOME Shell 一起工作。 + +如果你没有运行 GNOME 40,你仍然可以使用旧的 v69,它应该可以很好地工作。而且,除了增加了对 GNOME 40 的支持,在功能上也没有什么不同。 + +该扩展的未来发展可能很有趣,他们是否会考虑为不同的 GNOME Shell 版本而增加不同的扩展软件包,并提供新的功能?让我们拭目以待。 + +### 安装 Dash to Dock 的方法 + +![][4] + +你可以从 [GNOME 扩展网站][5] 中通过简单的切换按钮来安装这个扩展。如果你是新手,我建议通过我们的 [GNOME 扩展安装指南][6] 来开始。 + +- [Dash to Dock GNOME 扩展][5] + +值得注意的是,你需要使用一个兼容的网页浏览器来安装这个扩展。虽然它应该可以在大多数浏览器上使用([基于 Chromium 的浏览器][7] 应该可以),但正如 [OMG! Ubuntu][8] 最初报道的那样,Ubuntu 21.10 中 Snap 打包的 Firefox 浏览器可能无法使用。 + +你试过这个扩展了吗?欢迎在下面的评论中告诉我你的想法。 + +-------------------------------------------------------------------------------- + +via: https://news.itsfoss.com/dash-to-dock-gnome-40/ + +作者:[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://news.itsfoss.com/author/ankush/ +[b]: https://github.com/lujun9972 +[1]: https://itsfoss.com/best-gnome-extensions/ +[2]: https://news.itsfoss.com/gnome-40-release/ +[3]: https://i2.wp.com/news.itsfoss.com/wp-content/uploads/2021/10/dash-to-dock.jpeg?w=1366&ssl=1 +[4]: https://i2.wp.com/news.itsfoss.com/wp-content/uploads/2021/10/gnome-dash-dock-extension.png?w=1259&ssl=1 +[5]: https://extensions.gnome.org/extension/307/dash-to-dock/ +[6]: https://itsfoss.com/gnome-shell-extensions/ +[7]: https://news.itsfoss.com/chrome-like-browsers-2021/ +[8]: https://www.omgubuntu.co.uk/2021/10/dash-to-dock-official-gnome-40-support? diff --git a/published/202110/20211019 Linux Tablets- What are Your Options.md b/published/202110/20211019 Linux Tablets- What are Your Options.md new file mode 100644 index 0000000000..1c4f39b903 --- /dev/null +++ b/published/202110/20211019 Linux Tablets- What are Your Options.md @@ -0,0 +1,114 @@ +[#]: subject: "Linux Tablets: What are Your Options?" +[#]: via: "https://itsfoss.com/linux-tablets/" +[#]: author: "Abhishek Prakash https://itsfoss.com/author/abhishek/" +[#]: collector: "lujun9972" +[#]: translator: "wxy" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13929-1.html" + +有哪些 Linux 平板电脑可供选择 +====== + +![](https://img.linux.net.cn/data/attachment/album/202110/28/180114mism33m44sibmsc9.jpg) + +有很多 [基于 Linux 的笔记本电脑][1],也有 [预装了 Linux 的迷你 PC][2],而市场上还有一些 [基于 Linux 的智能手机][3]。 + +那平板电脑呢?有没有一些不错的基于 Linux 的平板电脑?这可能不能用一句话说清楚。 + +许多仅使用 Linux 的系统制造商专注于制造台式电脑。这主要是由于触摸设备上的 Linux 体验与安卓和 iOS 提供的体验相距甚远。 + +但这是否意味着你不能在平板电脑上使用 Linux?并非如此。对于早期尝试用户和 DIY 爱好者来说,还有一些选择的。让我们来看看在这些 Linux 平板电脑中,你有哪些选择。 + +### Ubuntu Touch + +![BQ 平板电脑上的 Ubuntu Touch 操作系统][4] + +好吧!这不是一个平板电脑,而是一个操作系统。但它确实让你可以在一些旧的安卓平板电脑上安装一个适合触摸操作的 Ubuntu 版本。 + +注意“一些”这个词。Ubuntu Touch 官方 [支持][5] Nexus 7、联想 M10、Xperia Z4 和 BQ Aquaris 平板。你甚至可以尝试在你的其他平板电脑上安装 Ubuntu Touch。它可能无法 100% 工作,但仍然非常有用。 + +[Ubuntu Touch][8] 是 Ubuntu 团队的一个项目,但是他们 [在 2017 年中止了它][6]。[UBports][7] 承担了继续这个项目的责任,他们在有限的资源下做的很棒。 + +总而言之,如果你喜欢各种实验,想让你的旧安卓平板电脑获得新生,Ubuntu Touch 可能是你的周末项目。 + +### PineTab + +![PineTab][9] + +Pine64 始于其单板计算机 Pine A64,以作为 [树莓派的替代品][10]。随着时间的推移,它推出了几个 Pine 品牌的产品。这份名单里包括低调的 [PineTime 智能手表][11]、PineBook 笔记本电脑、PinePhone 智能手机和 PineTab 平板电脑。 + +这些 Pine 设备通常价格低廉,并允许用户对这些小设备进行完全控制。这种可魔改的特性帮助它聚集了一大批开源 DIY 爱好者的粉丝。 + +[PineTab][12] 基本上使用了与带有触摸屏和键盘的 Pine64 单板计算机相同的组件。它不是看起来最漂亮的平板电脑,也不打算成为这样的。 + +它的规格很一般,有一个高清 IPS 电容式触摸屏、全志 A64 芯片组、四核 CPU 和 2GB 内存。 + +它无法与 iPad 或 Galaxy Tab 竞争,但它允许你安装你选择的发行版,并按你的要求进行配置。 + +请记住,Pine 的库存有限,所以如果你能看到这个设备可以购买,那你很幸运。 + +### PineNote + +![PineNote][13] + +另一个 Pine 设备,与你在上一节看到的 PineTab 略有不同。 + +PineTab 是一款用于浏览互联网、使用应用程序和玩游戏的 Linux 平板电脑,而 [PineNote][14] 是用来做笔记和阅读书籍和文件的。 + +它有一个电子墨水显示屏,你可能在 Kindle 等电子书阅读器上见过。除了电子书阅读器之外,PineNote 还可以你用 Wacom 笔做笔记。 + +PineNote 拥有四核 Rockchip、多点触控电子墨水面板、4GB 内存和 128GB eMMC 存储。它也是为数不多的价格高于通常的 399 美元的平板点之一。 + +请记住,PineNote 正处于早期开发阶段,只接受开发者的订单。 + +### RasPad + +![RasPad][18] + +[RasPad][19] 是一个用于树莓派设备的套件,可以把它变成一个基于触摸功能的设备。与普通的平板不同,这不是一个扁平的设备,而是有一个楔形的身体。这使得它更容易在办公桌上使用。 + +RasPad 是专门为树莓派设备创建的,你可以轻松使用它的大部分端口。它有一个专门的 RasPad 操作系统,但你可以自由使用常规的树莓派操作系统或 Ubuntu 或任何其他适合树莓派的操作系统。在选择操作系统时请考虑触控友好性。 + +请记住,树莓派设备不包括在套件中。你必须要单独购买。 + +### 你的选择是什么? + +我知道我们离一个优秀的 Linux 平板电脑还很远,但它们至少可以和市场上的安卓平板电脑竞争。至少我们有一些可用的选择,这也是一线希望。 + +你是否已经拥有以上列出的设备之一了?你的体验如何? + +如果你只能选择其中之一,那么你选择哪一款 Linux 平板电脑? + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/linux-tablets/ + +作者:[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://linux.cn/article-13672-1.html +[2]: https://itsfoss.com/linux-based-mini-pc/ +[3]: https://linux.cn/article-13711-1.html +[4]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/10/ubuntu-touch.jpg?resize=755%2C537&ssl=1 +[5]: https://devices.ubuntu-touch.io/ +[6]: https://itsfoss.com/ubuntu-unity-shutdown/ +[7]: https://ubports.com/ +[8]: https://ubuntu-touch.io/ +[9]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/10/PineTab.jpg?resize=800%2C742&ssl=1 +[10]: https://itsfoss.com/raspberry-pi-alternatives/ +[11]: https://itsfoss.com/pinetime-linux-smartwatch/ +[12]: https://pine64.com/product/pinetab-10-1-linux-tablet-with-detached-backlit-keyboard/?v=0446c16e2e66 +[13]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/10/PineNote-tab.jpg?resize=800%2C615&ssl=1 +[14]: https://www.pine64.org/pinenote/ +[15]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/09/jingpad-keyboard-angle.webp?resize=800%2C600&ssl=1 +[16]: https://itsfoss.com/jingpad-a1-review/ +[17]: https://en.jingos.com/jingpad-a1/ +[18]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/10/raspad.webp?resize=800%2C614&ssl=1 +[19]: https://raspad.com/products/raspadv3 diff --git a/published/202110/20211019 Why Mark Text is my favorite markdown editor.md b/published/202110/20211019 Why Mark Text is my favorite markdown editor.md new file mode 100644 index 0000000000..847c4ceb2c --- /dev/null +++ b/published/202110/20211019 Why Mark Text is my favorite markdown editor.md @@ -0,0 +1,92 @@ +[#]: subject: "Why Mark Text is my favorite markdown editor" +[#]: via: "https://opensource.com/article/21/10/mark-text-markdown-editor" +[#]: author: "Don Watkins https://opensource.com/users/don-watkins" +[#]: collector: "lujun9972" +[#]: translator: "wxy" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13926-1.html" + +Mark Text:我最喜欢的 Markdown 编辑器 +====== + +> Mark Text 拥有的工具使得撰写 Markdown 变得容易,同时又提供了一个不会打扰我的简单的界面。 + +![](https://img.linux.net.cn/data/attachment/album/202110/27/141244m9os557ss7au6oas.jpg) + +几年前,当我开始使用 Jupyter 笔记本时,我接触到了 Markdown 格式。许多作者都知道 Markdown,但这是我不熟悉的一种技能。 + +Markdown 是一种标准的文本写作方式,在这种方式中,你可以用精简的符号来标记你想要的文本样式。例如,你不用点击一个按钮来使一个词变粗体,而是用两个星号(`**word**`)包围这个词。这有两种效果: + + * 当作为纯文本查看时,视觉上显示出强调的文本 + * 如果有一个好的文本转换器或渲染器(如 Pandoc 或一个好的 Markdown 文本编辑器),就会显示为加粗。 + +Markdown 最大的优点之一是它的大部分符号都是直观的,并且来自我们大多数人已有的习惯。它使得用星号强调单词,用字符标记标题以区分它们等等变得很自然。 + +每个人都对它评价很高,但我不确定为什么我需要学习和使用 Markdown。然而,我是一个好奇的人,我开始探索 Markdown,以及它如何在我的写作中发挥作用。 + +### 学习 Markdown + +我很喜欢在学习时使用 [Markdown 速查表][2]。我发现 Markdown 是一个很好的工具,可以写任何内容,而且我很喜欢甚至不需要一个专门的 Markdown 编辑器这一点。任何文本编辑器都可以写 Markdown,因为 Markdown 使用标准文本来表示样式。我开始使用简单的编辑器,如 Vim 或 gedit(或任何其他编辑器),并查阅这个速查表以记住简单的格式化规则。 + +今年我一直在写日记,作为组织我的想法和学习更多关于 Markdown 的方法。我最近尝试了 [Ghostwriter][3] 文本编辑器,这是一个优秀的编辑器,有一些额外的 Markdown 特定功能。Markdown 现在已经变得非常流行了,许多编辑器都加入了语法高亮、提示和其他使 Markdown 编写变得容易的功能,或者将其作为重点。它们不是必须的功能,但当你拥有它们时,还是很好的。  + +### 尝试 Mark Text + +在阅读一个博客时,我发现了 [Mark Text][4]。Mark Text 使写 Markdown 变得很容易,同时提供了一个简单的界面,而且又不影响我。Mark Text 有六个主题,三个浅色和三个深色主题。深色主题对我来说更容易使用。它的 [用户文档][5] 非常好,而且也提供了 Markdown 的 [语法帮助][6]。  + +### Markdown 的实时预览 + +Mark Text 以简洁的界面提供了实时预览功能。它支持 [Commonmark][7] 规范、Github 风格的 Markdown 规范,以及 Pandoc Markdown。据其网站说,Mark Text 还支持 KaTex、front matter 和 emoji 等 Markdown 扩展。它还可以输出 HTML 和 PDF 文件。  + +Mark Text 有各种编辑模式,如打字模式、源代码模式和专注模式。添加图片是一件很容易的事,因为你可以简单地从剪贴板上复制和粘贴它们。 + +在 Mark Text 窗口的左上方有一个弹出窗口,显示迄今为止输入的字符和段落数量。作为一个作家,这真的很有帮助。 + +从 Mark Text 窗口左上方的菜单或使用 `Ctrl+S` 保存文件很容易。事实上,Mark Text 的菜单对任何习惯于基本文本编辑器或文字处理器的人来说都是友好和熟悉的。 + +![Mark Text 文件菜单][8] + +我喜欢 Mark Text 用简单的快捷键支持各种格式,包括表格块、图表、行内格式、数学公式块和其他代码块。 + +你可以从以下链接中为你的操作系统下载 Mark Text: + + * [Linux][10] + * [macOS][11] + * [Windows][12] + +Mark Text 以 [MIT][13] 许可证开源。你可以随时 [下载][14] 最新的版本。 + +另外,你可以用 `brew install --cask mark-text` 在 macOS 上安装 Mark Text,在 Windows 上用 [Chocolatey][15] 输入 `choco install marktext` 来安装它。 + +Mark Text 一直在寻找赞助商和开发者。该项目有一个给贡献者的 [指南][16]。此外,你可以在 Patreon 和 Open Collective 上支持该项目。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/21/10/mark-text-markdown-editor + +作者:[Don Watkins][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/don-watkins +[b]: https://github.com/lujun9972 +[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/osdc-docdish-typewriterkeys-3.png?itok=NyBwMdK_ (Typewriter keys in multicolor) +[2]: https://opensource.com/downloads/cheat-sheet-markdown +[3]: https://wereturtle.github.io/ghostwriter/ +[4]: https://marktext.app/ +[5]: https://github.com/marktext/marktext/blob/master/docs/README.md +[6]: https://github.com/marktext/marktext/blob/master/docs/MARKDOWN_SYNTAX.md +[7]: https://commonmark.org/ +[8]: https://opensource.com/sites/default/files/uploads/mark-test-file-menu.png (Mark Text file menu) +[9]: https://creativecommons.org/licenses/by-sa/4.0/ +[10]: https://github.com/marktext/marktext/releases/latest/download/marktext-x86_64.AppImage +[11]: https://github.com/marktext/marktext/releases/latest/download/marktext.dmg +[12]: https://github.com/marktext/marktext/releases/latest/download/marktext-setup.exe +[13]: https://github.com/marktext/marktext/blob/develop/LICENSE +[14]: https://github.com/marktext/marktext/releases +[15]: https://chocolatey.org/ +[16]: https://github.com/marktext/marktext/blob/develop/CONTRIBUTING.md diff --git a/published/202110/20211020 GitUI- A Blazing Fast Terminal Client for Git Written in Rust.md b/published/202110/20211020 GitUI- A Blazing Fast Terminal Client for Git Written in Rust.md new file mode 100644 index 0000000000..51e442a5d6 --- /dev/null +++ b/published/202110/20211020 GitUI- A Blazing Fast Terminal Client for Git Written in Rust.md @@ -0,0 +1,102 @@ +[#]: subject: "GitUI: A Blazing Fast Terminal Client for Git Written in Rust" +[#]: via: "https://itsfoss.com/gitui/" +[#]: author: "Marco Carmona https://itsfoss.com/author/marco/" +[#]: collector: "lujun9972" +[#]: translator: "geekpi" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13922-1.html" + +GitUI: 用 Rust 编写的 Git 的快速命令行客户端 +====== + +![](https://img.linux.net.cn/data/attachment/album/202110/26/111605achvngqr6ix6vv0p.jpg) + +[基本的 Git 命令][1] 对于通常的克隆、添加、提交推送已经足够好了。 + +但如果你在一个有多个贡献者的大型项目上工作,你可能需要将事情可视化。GUI 工具可以让你更好地了解 `diff`、`stash` 和 `blame` 的情况。 + +但是,如果你常用终端,又想要 Git 的舒适性,我为你准备了一个好工具。 + +它叫 GitUI,它提供了类似于 Git GUI 的用户体验和舒适度,但就在你的终端中。它是可移植的、快速的、自由而开源的。 + +### GitUI:一个基于终端的 Git 工具 + +[GitUI][2] 并不是第一个用于 Linux 终端的 Git 客户端。那么,是什么让 GitUI 与其他类似项目如 [lazygit][3] 或 [tig][4] 不同? + +GitUI 的开发者在项目的 README 文件中分享了一些基准数据。 + +名称 | 时间 |内存(GB)| 二进制(MB)| 冻结 | 崩溃 +---|---|---|---|---|--- +gitui | 24 s | 0.17 | 1.4 | 否 | 否 +lazygit | 57 s | 2.6 | 16 | 是 | 有时 +tig | 4 m 20 s | 1.3 | 0.6 | 有时 | 否 + +*GitUI、LazyGit 和 Tig 之间的比较。* + +这种优化大部分来自于 Rust 语言的使用。 + +**注意:该程序处于早期开发阶段,还没有为生产做好准备。** + +### 在 Linux 上安装 GitUI + +不用说,你应该已经 [在你的系统上安装了 Git][5]。 + +要使用 GitUI,首先需要 [为你的 Linux 发行版安装 Rust 支持][6]。 + +在终端中,使用以下命令: + +``` +curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh +``` + +![Installing Rust on Linux][7] + +当你被要求选择时,请选择选项 1。当脚本完成安装后,用这个命令正确设置配置: + +``` +source $HOME/.cargo/env +``` + +现在你已经安装了 Rust 和它的包管理器 Cargo,使用 Cargo 命令来安装 GitUI: + +``` +cargo install gitui +``` + +然后你就可以使用 GitUI了,只需在终端输入 `gitui` 就可以运行了。我做了一些示例文件来测试 Git 和 GitUI。 + +![Starting gitui on terminal][8] + +值得一提的是,这个界面有一个快速而直观的纯键盘控制。一切都很简单,只需输入正确的字母即可将文件暂存、提交、分支或推送到 git 仓库中。 + +真正让我兴奋的是,你不仅可以做之前的四个动作,还可以**编辑**每个文件,**拉取**它,**追溯** 它,在其中**导航**等等,这一切都无需退出界面。 很棒,不是吗? + +![More functions inside the interface][9] + +祝贺你! 现在你知道了如何安装 GitUI 以及它在你的终端中的样子。 + +如果你喜欢这个项目,请在 [GitHub][2] 上点赞它的仓库。如果你使用其他工具来管理 Git,请在评论区提出你的建议。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/gitui/ + +作者:[Marco Carmona][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/marco/ +[b]: https://github.com/lujun9972 +[1]: https://itsfoss.com/basic-git-commands-cheat-sheet/ +[2]: https://github.com/Extrawurst/gitui +[3]: https://github.com/jesseduffield/lazygit +[4]: https://jonas.github.io/tig/ +[5]: https://itsfoss.com/install-git-ubuntu/ +[6]: https://itsfoss.com/install-rust-cargo-ubuntu-linux/ +[7]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/10/Installing-Rust-step-1.png?resize=800%2C471&ssl=1 +[8]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/10/Starting-GitUI-on-terminal.png?resize=800%2C471&ssl=1 +[9]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/10/More-functions-inside-the-interface.png?resize=800%2C471&ssl=1 diff --git a/published/202110/20211020 How to Install Rust and Cargo on Ubuntu and Other Linux Distributions.md b/published/202110/20211020 How to Install Rust and Cargo on Ubuntu and Other Linux Distributions.md new file mode 100644 index 0000000000..a202318931 --- /dev/null +++ b/published/202110/20211020 How to Install Rust and Cargo on Ubuntu and Other Linux Distributions.md @@ -0,0 +1,174 @@ +[#]: subject: "How to Install Rust and Cargo on Ubuntu and Other Linux Distributions" +[#]: via: "https://itsfoss.com/install-rust-cargo-ubuntu-linux/" +[#]: author: "Abhishek Prakash https://itsfoss.com/author/abhishek/" +[#]: collector: "lujun9972" +[#]: translator: "perfiffer" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13938-1.html" + +如何在 Ubuntu 和其它的 Linux 发行版安装 Rust 和 Cargo +====== + +> 了解在 Linux 上安装 Rust 编程语言及其包管理器 Cargo 的各种方法。 + +![](https://img.linux.net.cn/data/attachment/album/202110/31/150031j9e0xgeg9jpxeip0.jpg) + +自从 Mozilla 贡献了 [Rust][1] 语言之后,它就获得了更加突出和受欢迎的地位。口说无凭。[Rust 将被使用在 Linux 内核中][2],它是继 C 语言之后的第二种编程语言。 + +许多开发人员也开始使用 Rust 语言制作很棒的基于命令行的工具。这些工具通常可以通过 [Cargo 包管理器][3] 获得。 + +这就是为什么在 Linux 中安装 Rust 支持对程序员和最终用户都很重要的原因。 + +官方 Rust 文档建议通过以下这种方式下载并执行安装程序脚本在 Linux 中安装 Rust: + +``` +curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh +``` + +这是可行的。但是,你的发行版可能已经打包了 Rust。使用你的发行版的 [包管理器][4] 也是一种选择。 + +让我向你介绍官方 Rust 方式和包管理器方式的 Rust 安装步骤。 + +### 方法1:使用官方方法在任意的 Linux 上安装 Rust + +这种方法有几个优点: + + * 你可以获取最新的 Rust 和 Cargo 版本 + * Rust 仅仅是为当前的用户安装,并不是所有用户 + * 你并不需要 root 用户或者 `sudo` 权限就可以为自己安装 Rust + +一些人不喜欢从互联网下载并 [运行 shell][5] 脚本,即使它来自官方。但是,由于它不需要 root 访问权限并且脚本来自官方,因此以这种方式安装它应该是安全的。 + +首先,确保你已经安装了 `curl`。如果没安装,使用你的发行版的包管理器安装它。你可以使用 `apt` 命令在 [Ubuntu 和 Debian 上安装 Curl][6]。 + +``` +sudo apt install curl +``` + +接下来,使用这条命令下载脚本并运行它: + +``` +curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh +``` + +![][7] + +它会询问你输入所需的安装类型。选择选项 `1`: + +![][8] + +脚本完成安装后,你需要获取配置文件的来源,以使更改应用于你的 shell。 + +![][9] + +应用文件: + +``` +source $HOME/.cargo/env +``` + +完成后,通过检查已安装的版本来验证 Rust 是否可用: + +``` +rustc --version +``` + +![Verifying Rust installation][10] + +太酷了。如果 Rust 发布了新版本,你可以使用如下命令更新已安装的版本: + +``` +rustup update +``` + +在你看到其它安装方法之前,让我快速展示如何移除以这种方式安装的 Rust。 + +#### 删除以官方方式安装的 Rust + +在终端中,使用如下的命令从系统中移除 Rust: + +``` +rustup self uninstall +``` + +询问时按 `Y`,你将从系统中删除 Rust。 + +![Removing Rust from Linux][11] + +官方方式安装已经完成。让我们看看如何使用 `apt` 命令在 Ubuntu 上安装 Rust。 + +### 方法2:使用 apt 命令在 Ubuntu 上安装 Rust + +为什么要使用包管理器? + + * 它在整个系统范围内安装 Rust,可供系统上的所有用户使用 + * 它与其它系统更新一起集中更新(如果你的发行版添加了新版本的 Rust) + +Ubuntu 中有两个主要的 Rust 包: + + * `rustc`:用于 Rust 编程语言的 Rust 编译器 + * `cargo`:Cargo 是 Rust 的包管理器,它会自动安装 `rustc` + +作为一个普通用户,你将使用 Cargo 来安装基于 Rust 的应用程序。作为程序员,你需要 Cargo 来获取其它 Rust 包或创建自己的包。 + +由于 `cargo` 包含 `rustc`,所以我建议安装它,以便一次性安装所有必需的软件包。 + +``` +sudo apt install cargo +``` + +系统会要求你输入账号密码。 + +![][12] + +当然,你可以自由使用 `apt install rustc`,只安装 Rust。这取决于你的选择。 + +你可以验证是否为你和所有其他用户安装了 Rust(如果你愿意): + +![][13] + +很好。让我也快速展示卸载步骤。 + +#### 使用 apt remove 移除 Rust + +要移除 Rust,你可以先移除 Cargo,然后使用 `autoremove` 命令移除随它安装的依赖项。 + +``` +sudo apt remove cargo +``` + +现在运行 `autoremove`: + +``` +sudo apt autoremove +``` + +就是这样。你现在了解了在 Ubuntu 和其它 Linux 发行版上安装 Rust 的所有基本知识。随时欢迎提出问题和建议。 + +-------------------------------------------------------------------------------- + +via: https://itsfoss.com/install-rust-cargo-ubuntu-linux/ + +作者:[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://www.rust-lang.org/ +[2]: https://www.zdnet.com/article/rust-in-the-linux-kernel-why-it-matters-and-whats-happening-next/ +[3]: https://crates.io/ +[4]: https://itsfoss.com/package-manager/ +[5]: https://itsfoss.com/run-shell-script-linux/ +[6]: https://itsfoss.com/install-curl-ubuntu/ +[7]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/10/installing-rust-linux-1.png?resize=800%2C448&ssl=1 +[8]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/10/installing-rust-linux-2.png?resize=800%2C448&ssl=1 +[9]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/10/installing-rust-linux-3.png?resize=800%2C448&ssl=1 +[10]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/10/verify-rust-version.png?resize=800%2C236&ssl=1 +[11]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/10/remove-rust-linux.png?resize=800%2C378&ssl=1 +[12]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/10/install-rust-using-apt-ubuntu.png?resize=759%2C481&ssl=1 +[13]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/10/verify-rust-install-ubuntu.png?resize=741%2C329&ssl=1 diff --git a/published/202110/20211021 How to Convert a Webpage to PDF in Linux.md b/published/202110/20211021 How to Convert a Webpage to PDF in Linux.md new file mode 100644 index 0000000000..aa2a32d884 --- /dev/null +++ b/published/202110/20211021 How to Convert a Webpage to PDF in Linux.md @@ -0,0 +1,133 @@ +[#]: subject: "How to Convert a Webpage to PDF in Linux" +[#]: via: "https://itsfoss.com/convert-webpage-pdf-linux/" +[#]: author: "Ankush Das https://itsfoss.com/author/ankush/" +[#]: collector: "lujun9972" +[#]: translator: "geekpi" +[#]: reviewer: "wxy" +[#]: publisher: "wxy" +[#]: url: "https://linux.cn/article-13928-1.html" + +如何在 Linux 下将网页转换为 PDF 文件 +====== + +![](https://img.linux.net.cn/data/attachment/album/202110/28/111738tncncbml6jwcz6s8.jpg) + +当你将某些资源存档或用于教育目的时,将网页保存为 PDF 是很方便的。 + +但是,你如何在 Linux 中把一个网页转换成 PDF? + +你可以选择使用每个 Linux 发行版上的网页浏览器(GUI),或者使用终端将网页变成 PDF 文件。 + +在这里,我将提到这两种方法来帮助你完成工作。 + +### 方法 1:使用网页浏览器将网页转换为 PDF 文件 + +尽管我在本教程中使用的是 Mozilla Firefox,但你也可以用任何 [可用于 Linux 的最佳浏览器][1] 做同样的事情。 + +![][2] + +1、加载你想转换的网页。 + +2、在浏览器菜单中找到“**打印**”选项,或使用键盘快捷键 `Ctrl + P`。 + +3、默认情况下,它应该让你把它保存为 PDF。你需要点击“保存”,然后选择目的地并保存网页。 + +![Save webpage as PDF in Mozilla Firefox][3] + +这种简单方法的一个主要问题是,它包括页面上的所有元素。这可能包括评论、页脚等。你可以用一个 PDF 编辑器来删除部分内容,但这是一个额外的任务。 + +更好的选择是利用一个浏览器扩展,如 [Print Friendly][4]。它允许你在下载 PDF 之前编辑和删除网页的部分内容。 + +### 方法 2:使用终端将网页转换为 PDF 或图片 + +你可能已经知道,你可以 [在 Linux 终端浏览互联网][5],甚至 [使用命令行下载文件][6]。这并不奇怪,因为你可以在终端中做更多的事情,包括将网页下载为 PDF。 + +一个灵巧的开源命令行工具 `wkhtmltopdf` 和 `wkhtmltoimage` 可以帮到你,让你把任何 HTML 网页转换成 PDF 或图像文件。 + +它使用 Qt WebKit 渲染引擎来完成这个任务。你可以浏览它的 [GitHub页面][7] 了解更多信息。 + +你应该能够从你的 Linux 发行版的默认仓库中安装它。对于基于 Ubuntu 的发行版,你可以输入以下命令: + +``` +sudo apt install wkhtmltopdf +``` + +无论你想把它转换为 PDF 还是图像文件,它的使用都是非常直接的: + +![][8] + +要将一个网页转换成 PDF,请输入: + +``` +wkhtmltopdf URL/domain filename.pdf +``` + +比如,类似于这样: + +``` +wkhtmltopdf linuxmint.com mint.pdf +``` + +你可以选择使用 `https://linuxmint.com` 这样完整的 URL 或使用域名,如上面的例子所示。 + +默认情况下,生成的文件将保存在主目录下。 + +在转换网页时,你还可以得到一些好玩的选项。 + +例如,你可以**对 PDF 文件应用灰度过滤器**,在同一文件中**制作多个页面副本**,以及在转换过程中**排除**图像。 + +灰度过滤器不一定对每个网页都有效,但你可以用命令试试: + +``` +wkhtmltopdf -g google.com googlepage.pdf +``` + +要在同一个 PDF 文件中复制多个页面,命令是: + +``` +wkhtmltopdf --copies 2 linuxmint.com mint.pdf +``` + +而且,如果你想排除网页中的图像,只需输入: + +``` +wkhtmltopdf --no-images linuxmint.com mint.pdf +``` + +此外,如果你想把一个网页转换为图像,命令是这样的: + +``` +wkhtmltoimage linuxmint.com mint.png +``` + +注意,与使用浏览器的 GUI 方法不同,通过终端使用这些工具有其局限性。它似乎不能成功转换利用任何 `