mirror of
https://github.com/LCTT/TranslateProject.git
synced 2025-01-01 21:50:13 +08:00
commit
ddf894de8f
@ -1,46 +1,43 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: (chunibyo-wly)
|
||||
[#]: reviewer: ( )
|
||||
[#]: publisher: ( )
|
||||
[#]: url: ( )
|
||||
[#]: 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 平台部署、缩放与管理图像识别深度学习模型。
|
||||
|
||||
![Brain on a computer screen][1]
|
||||
> 了解如何使用 Kubermatic Kubernetes 平台来部署、扩展与管理图像识别预测的深度学习模型。
|
||||
|
||||
随着企业增加了对人工智能(AI)、机器学习(ML)与深度学习(DL)的使用,出现了一个关键问题:如何将机器学习的发展进行规模化与产业化?这些讨论经常聚焦于机器学习模型本身;然而,模型仅仅只是完整解决方案的其中一环。为了达到生产环境的应用和规模,模型的开发过程必须还包括一个可以说明开发前后关键活动以及可公用部署的可重复过程。
|
||||
![](https://img.linux.net.cn/data/attachment/album/202109/01/233417ryy87hyza7jmgy33.jpg)
|
||||
|
||||
本文演示了如何使用[Kubermatic Kubernetes Platform][2]对图像识别预测的深度学习模型进行部署,缩放与管理。
|
||||
随着企业增加了对人工智能(AI)、机器学习(ML)与深度学习(DL)的使用,出现了一个关键问题:如何将机器学习的开发进行规模化与产业化?这些讨论经常聚焦于机器学习模型本身;然而,模型仅仅只是完整解决方案的其中一环。为了达到生产环境的应用和规模,模型的开发过程必须还包括一个可以说明开发前后关键活动以及可公用部署的可重复过程。
|
||||
|
||||
Kubermatic Kubernetes 平台是一个可以与机器学习/深度学习工作流结合进行完整集群生命周期管理的一个自动且灵活的开源生产级 Kubernetes 集群管理工具。
|
||||
本文演示了如何使用 [Kubermatic Kubernetes 平台][2] 对图像识别预测的深度学习模型进行部署、扩展与管理。
|
||||
|
||||
Kubermatic Kubernetes 平台是一个生产级的开源 Kubernetes 集群管理工具,提供灵活性和自动化,与机器学习/深度学习工作流程整合,具有完整的集群生命周期管理。
|
||||
|
||||
### 开始
|
||||
|
||||
这个例子部署了一个图像识别的深度学习模型。它使用了包含 60,000 张分属 10 个类别的 32x32 彩色图 [CIFAR-10][3] 像数据集,同时使用了 [Apache MXNet][5] 的 [Gluon][4] 与 NVIDIA GPUs 进行加速计算。如果你希望使用 CIFAR-10 数据集的预训练模型,可以查阅 [getting started guide][6]。
|
||||
这个例子部署了一个用于图像识别的深度学习模型。它使用了 [CIFAR-10][3] 数据集,包含了 60,000 张分属 10 个类别的 32x32 彩色图,同时使用了 [Apache MXNet][5] 的 [Gluon][4] 与 NVIDIA GPU 进行加速计算。如果你希望使用 CIFAR-10 数据集的预训练模型,可以查阅其 [入门指南][6]。
|
||||
|
||||
使用训练集中的样本对模型训练 200 次,只要训练误差保持缓慢减少,就可以保证模型不会过拟合。下方图展示了训练的过程:
|
||||
|
||||
![深度学习模型训练 loss 图][7]
|
||||
|
||||
(Chaimaa Zyami, [CC BY-SA 4.0][8])
|
||||
|
||||
训练结束后,必须保存模型训练所得到的参数,以便稍后可以加载它们:
|
||||
|
||||
|
||||
```python
|
||||
```
|
||||
file_name = "net.params"
|
||||
net.save_parameters(file_name)
|
||||
```
|
||||
|
||||
一旦你的模型训练好了,就可以用 Flask 服务器来封装它。下方的程序演示了如何接收 request 中的一张图片作为参数并且在 response 中返回模型的预测结果:
|
||||
一旦你的模型训练好了,就可以用 Flask 服务器来封装它。下方的程序演示了如何接收请求中的一张图片作为参数,并在响应中返回模型的预测结果:
|
||||
|
||||
|
||||
```python
|
||||
```
|
||||
from gluoncv.model_zoo import get_model
|
||||
import matplotlib.pyplot as plt
|
||||
from mxnet import gluon, nd, image
|
||||
@ -80,156 +77,166 @@ if __name__ == '__main__':
|
||||
|
||||
在将模型部署到 Kubernetes 前,你需要先安装 Docker 并使用你的模型创建一个镜像。
|
||||
|
||||
1. 下载、安装并启动 Docker:
|
||||
```bash
|
||||
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
|
||||
1. 下载、安装并启动 Docker:
|
||||
|
||||
sudo yum-config-manager --add-repo <https://download.docker.com/linux/centos/docker-ce.repo>
|
||||
```
|
||||
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
|
||||
sudo yum-config-manager --add-repo <https://download.docker.com/linux/centos/docker-ce.repo>
|
||||
sudo yum install docker-ce
|
||||
sudo systemctl start docker
|
||||
```
|
||||
|
||||
sudo yum install docker-ce
|
||||
2. 创建一个你用来管理代码与依赖的文件夹:
|
||||
|
||||
sudo systemctl start docker
|
||||
```
|
||||
mkdir kubermatic-dl
|
||||
cd kubermatic-dl
|
||||
```
|
||||
|
||||
```
|
||||
2. 创建一个你用来管理代码与依赖的文件夹:
|
||||
```bash
|
||||
mkdir kubermatic-dl
|
||||
cd kubermatic-dl
|
||||
```
|
||||
3. 创建 `requirements.txt` 文件管理代码运行时需要的所有依赖:
|
||||
|
||||
3. 创建 `requirements.txt` 文件管理代码运行时需要的所有依赖:
|
||||
```
|
||||
flask
|
||||
gluoncv
|
||||
matplotlib
|
||||
mxnet
|
||||
requests
|
||||
Pillow
|
||||
```
|
||||
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"]
|
||||
```
|
||||
4. 创建 `Dockerfile`,Docker 将根据这个文件创建镜像:
|
||||
|
||||
这个 Dockerfile 主要可以分为三个部分。首先,Docker 会下载 Python 的基础镜像。然后,Docker 会使用 Python 的包管理工具 `pip` 安装 `requirements.txt` 记录的包。最后,Docker 会通过执行 `python app.py` 来运行你的脚本。
|
||||
```
|
||||
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` 来运行你的脚本。
|
||||
|
||||
1. 构建 Docker 容器: `sudo docker build -t kubermatic-dl:latest .` 这条命令使用 `kubermatic-dl` 镜像为你当前工作目录的代码创建了一个容器。
|
||||
|
||||
2. 使用 `sudo docker run -d -p 5000:5000 kubermatic-dl` 命令检查你的容器可以在你的主机上正常运行。
|
||||
|
||||
3. 使用 `sudo docker ps -a` 命令查看你本地容器的运行状态:
|
||||
|
||||
![查看容器的运行状态][9]
|
||||
|
||||
(Chaimaa Zyami, [CC BY-SA 4.0][8])
|
||||
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`
|
||||
1. 在终端中登录 Docker Hub 账号:
|
||||
|
||||
```
|
||||
sudo docker login
|
||||
```
|
||||
|
||||
2. 给你的镜像打上 tag ,这样你的模型上传到 Docker Hub 后也能拥有版本信息
|
||||
```bash
|
||||
sudo docker tag <your-image-id> <your-docker-hub-name>/<your-app-name>
|
||||
2. 给你的镜像打上标签,这样你的模型上传到 Docker Hub 后也能拥有版本信息:
|
||||
|
||||
sudo docker push <your-docker-hub-name>/<your-app-name>
|
||||
```
|
||||
```
|
||||
sudo docker tag <your-image-id> <your-docker-hub-name>/<your-app-name>
|
||||
|
||||
![给镜像打上 tag][11]
|
||||
|
||||
(Chaimaa Zyami, [CC BY-SA 4.0][8])
|
||||
|
||||
3. 使用 `sudo docker images` 命令检查你的镜像的 ID。
|
||||
sudo docker push <your-docker-hub-name>/<your-app-name>
|
||||
```
|
||||
|
||||
![给镜像打上 tag][11]
|
||||
|
||||
3. 使用
|
||||
|
||||
```
|
||||
sudo docker images
|
||||
```
|
||||
|
||||
命令检查你的镜像的 ID。
|
||||
|
||||
### 部署你的模型到 Kubernetes 集群
|
||||
|
||||
1. 首先在 Kubermatic Kubernetes 平台创建一个项目, 然后根据 [快速开始][12] 创建一个 Kubernetes 集群。
|
||||
1. 首先在 Kubermatic Kubernetes 平台创建一个项目, 然后根据 [快速开始][12] 创建一个 Kubernetes 集群。
|
||||
|
||||
![创建一个 Kubernetes 集群][13]
|
||||
![创建一个 Kubernetes 集群][13]
|
||||
|
||||
(Chaimaa Zyami, [CC BY-SA 4.0][8])
|
||||
2. 下载用于访问你的集群的 `kubeconfig`,将它放置在下载目录中,并记得设置合适的环境变量,使得你的环境能找到它:
|
||||
|
||||
2. 下载用于访问你的集群的 `kubeconfig`,将它放置在下载目录中,并记得设置合适的环境变量,使得你的环境能找到它:
|
||||
![Kubernetes 集群示例][14]
|
||||
|
||||
![Kubernetes 集群示例][14]
|
||||
3. 使用 `kubectl` 命令检查集群信息,例如,需要检查 `kube-system` 是否在你的集群正常启动了就可以使用命令 `kubectl cluster-info`:
|
||||
|
||||
(Chaimaa Zyami, [CC BY-SA 4.0][8])
|
||||
![查看集群信息][15]
|
||||
|
||||
3. 使用 `kubectl` 命令检查集群信息,例如,需要检查 `kube-system` 是否在你的集群正常启动了就可以使用命令 `kubectl cluster-info`
|
||||
4. 为了在集群中运行容器,你需要创建一个部署用的配置文件(`deployment.yaml`),再运行 `apply` 命令将其应用于集群中:
|
||||
|
||||
![查看集群信息][15]
|
||||
```
|
||||
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
|
||||
|
||||
(Chaimaa Zyami, [CC BY-SA 4.0][8])
|
||||
```
|
||||
|
||||
```
|
||||
kubectl apply -f deployment.yaml`
|
||||
```
|
||||
|
||||
4. 为了在集群中运行容器,你需要创建一个部署用的配置文件(`deployment.yaml`),再运行 `apply` 命令将其应用于集群中:
|
||||
```yaml
|
||||
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
|
||||
5. 为了将你的部署开放到公网环境,你需要一个能够给你的容器创建外部可达 IP 地址的服务:
|
||||
|
||||
```
|
||||
kubectl expose deployment kubermatic-dl-deployment --type=LoadBalancer --port 80 --target-port 5000`
|
||||
```
|
||||
|
||||
``` `kubectl apply -f deployment.yaml`
|
||||
```
|
||||
6. 就快大功告成了!首先检查你布署的服务的状态,然后通过 IP 请求的你图像识别 API:
|
||||
|
||||
```
|
||||
kubectl get service
|
||||
```
|
||||
|
||||
5. 为了将你的部署开放到公网环境,你需要一个能够给你的容器创建外部可达 IP 地址的服务:`kubectl expose deployment kubermatic-dl-deployment --type=LoadBalancer --port 80 --target-port 5000`
|
||||
![获取请求图像识别 API 的 IP 地址][16]
|
||||
|
||||
6. 就快大功告成了!首先检查你布署的服务的状态,然后通过 IP 请求的你图像识别 API:`kubectl get service`
|
||||
|
||||
|
||||
![获取请求图像识别 API 的 IP 地址][16]
|
||||
|
||||
(Chaimaa Zyami, [CC BY-SA 4.0][8])
|
||||
|
||||
7. 最后根据你的外部 IP 使用以下两张图片对你的图像识别服务进行测试:
|
||||
|
||||
![马][17]
|
||||
|
||||
(Chaimaa Zyami, [CC BY-SA 4.0][8])
|
||||
|
||||
![狗][18]
|
||||
|
||||
(Chaimaa Zyami, [CC BY-SA 4.0][8])
|
||||
|
||||
![测试 API][19]
|
||||
|
||||
(Chaimaa Zyami, [CC BY-SA 4.0][8])
|
||||
7. 最后根据你的外部 IP 使用以下两张图片对你的图像识别服务进行测试:
|
||||
|
||||
![马][17]
|
||||
|
||||
![狗][18]
|
||||
|
||||
![测试 API][19]
|
||||
|
||||
### 总结
|
||||
|
||||
|
||||
在这篇教程中,你可以创建一个深度学习模型,并且使用 Flask 提供 [REST API][20] 服务。它介绍了如何将应用放在 Docker 容器中,如何将这个镜像上传到 Docker Hub 中,以及如何使用 Kubernetes 部署你的服务。只需几个简单的命令,你就可以使用 Kubermatic Kubernetes 平台部署该应用程序,并且开放服务给别人使用。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
@ -238,8 +245,8 @@ via: https://opensource.com/article/20/9/deep-learning-model-kubernetes
|
||||
|
||||
作者:[Chaimaa Zyani][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[译者ID](https://github.com/chunibyo-wly)
|
||||
校对:[校对者ID](https://github.com/校对者ID)
|
||||
译者:[chunibyo-wly](https://github.com/chunibyo-wly)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
@ -3,16 +3,16 @@
|
||||
[#]: author: "Ankush Das https://itsfoss.com/author/ankush/"
|
||||
[#]: collector: "lujun9972"
|
||||
[#]: translator: "geekpi"
|
||||
[#]: reviewer: " "
|
||||
[#]: publisher: " "
|
||||
[#]: url: " "
|
||||
[#]: reviewer: "wxy"
|
||||
[#]: publisher: "wxy"
|
||||
[#]: url: "https://linux.cn/article-13743-1.html"
|
||||
|
||||
Ulauncher:一个超级实用的 Linux 应用启动器
|
||||
======
|
||||
|
||||
_**简介:**_ _Ulauncher 是一个快速的应用启动器,支持扩展和快捷方式,帮助你在 Linux 中快速访问应用和文件。_
|
||||
> Ulauncher 是一个快速应用启动器,支持扩展和快捷方式,帮助你在 Linux 中快速访问应用和文件。
|
||||
|
||||
一个应用启动器可以让你快速访问或打开一个应用,而无需在应用菜单图标上徘徊。
|
||||
应用启动器可以让你快速访问或打开一个应用,而无需在应用菜单图标上徘徊。
|
||||
|
||||
在默认情况下,我发现 Pop!_OS 的应用启动器超级方便。但是,并不是每个 Linux 发行版都提供开箱即用的应用启动器。
|
||||
|
||||
@ -32,9 +32,9 @@ Ulauncher 是一个使用 Python 还有 GTK+ 构建的快速应用启动器。
|
||||
|
||||
Ulauncher 中的选项非常非常易于访问且易于定制。一些关键的亮点包括:
|
||||
|
||||
* 模糊搜索算法,让你找到应用,即使你拼错了它们
|
||||
* 记住你在同一会话中最后搜索的应用
|
||||
* 经常使用的应用显示(可选)
|
||||
* 模糊搜索算法可以让你即使拼错了,也能找到应用
|
||||
* 可以记住你在同一会话中最后搜索的应用
|
||||
* 显示经常使用的应用(可选)
|
||||
* 自定义颜色主题
|
||||
* 预设颜色主题,包括一个黑暗主题
|
||||
* 召唤启动器的快捷方式可以轻松定制
|
||||
@ -42,45 +42,43 @@ Ulauncher 中的选项非常非常易于访问且易于定制。一些关键的
|
||||
* 支持扩展,以获得额外的功能(表情符号、天气、速度测试、笔记、密码管理器等)
|
||||
* 浏览谷歌、维基百科和 Stack Overflow 等网站的快捷方式
|
||||
|
||||
|
||||
|
||||
它几乎提供了你在一个应用启动器中所期望的所有有用的能力,甚至更好。
|
||||
|
||||
### 如何在 Linux 中使用 Ulauncher?
|
||||
|
||||
默认情况下,首次从应用菜单打开应用启动器后,你需要按 **Ctrl + Space** 打开应用启动器。
|
||||
默认情况下,首次从应用菜单中打开应用启动器后,你需要按 `Ctrl + Space` 打开应用启动器。
|
||||
|
||||
开始输入以搜索一个应用。而且,如果你正在寻找一个文件或目录,开始输入 “**~**” 或者 “**/**” (忽略引号)。
|
||||
输入以搜索一个应用。如果你正在寻找一个文件或目录,输入以 `~` 或者 `/` 开始。
|
||||
|
||||
![][2]
|
||||
|
||||
有一些默认的快捷键,如 “**g XYZ**”,其中 XYZ 是你想在谷歌中搜索的搜索词。
|
||||
有一些默认的快捷键,如 `g XYZ`,其中 “XYZ” 是你想在谷歌中搜索的搜索词。
|
||||
|
||||
![][3]
|
||||
|
||||
同样,你可以通过 “**wiki**” 和 “**so**” 快捷键,直接在维基百科或 Stack Overflow 搜索。
|
||||
同样,你可以通过 `wiki` 和 `so` 快捷键,直接在维基百科或 Stack Overflow 搜索。
|
||||
|
||||
在没有任何扩展的情况下,你也可以直接计算内容,并将结果直接复制到键盘上。
|
||||
在没有任何扩展的情况下,你也可以直接计算内容,并将结果直接复制到剪贴板。
|
||||
|
||||
![][4]
|
||||
|
||||
这在快速计算时应该很方便,不需要单独启动计算器应用。
|
||||
|
||||
你可以前往它的[扩展页面][5],浏览有用的扩展,以及指导你如何使用它的截图。
|
||||
你可以前往它的 [扩展页面][5],浏览有用的扩展,以及指导你如何使用它的截图。
|
||||
|
||||
要改变它的工作方式,启用频繁的应用显示,并调整主题,请点击启动器右侧的齿轮图标。
|
||||
要改变它的工作方式,启用显示经常使用的应用,并调整主题,请点击启动器右侧的齿轮图标。
|
||||
|
||||
![][6]
|
||||
|
||||
你可以把它设置为自动启动。但是,如果它在你的支持 Systemd 的发行版上不工作,你可以参考它的 GitHub 页面,把它添加到服务管理器中。
|
||||
|
||||
这些选项是非常只管,且易于定制,如下图所示。
|
||||
这些选项是非常直观,且易于定制,如下图所示。
|
||||
|
||||
![][7]
|
||||
|
||||
### 在 Linux 中安装 Ulauncher
|
||||
|
||||
Ulauncher 为基于 Debian 或 Ubuntu 的发行版提供了一个 **.deb** 包。如果你是 Linux 新手,你可以探索[如何安装 Deb 文件][8] 。
|
||||
Ulauncher 为基于 Debian 或 Ubuntu 的发行版提供了一个 deb 包。如果你是 Linux 新手,你可以了解一下 [如何安装 Deb 文件][8] 。
|
||||
|
||||
在这两种情况下,你也可以添加它的 PPA,并通过终端按照下面的命令来安装它:
|
||||
|
||||
@ -92,13 +90,13 @@ sudo apt install ulauncher
|
||||
|
||||
你也可以在 [AUR][9] 中找到它,用于 Arch 和 Fedora 的默认仓库。
|
||||
|
||||
对于更多信息,你可以前往其官方网站或 [GitHub页面][10]。
|
||||
对于更多信息,你可以前往其官方网站或 [GitHub 页面][10]。
|
||||
|
||||
[Ulauncher][11]
|
||||
- [Ulauncher][11]
|
||||
|
||||
Ulauncher 应该是任何 Linux 发行版中一个令人印象深刻的补充。特别是,如果你想要一个像 Pop!_OS 提供的快速启动器的功能,这是一个值得考虑的奇妙选择。
|
||||
|
||||
_你试过 Ulauncher了吗?欢迎你就这如何帮助你快速完成工作分享你的想法。_
|
||||
你试过 Ulauncher了吗?欢迎你就如何帮助你快速完成工作分享你的想法。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
@ -107,7 +105,7 @@ via: https://itsfoss.com/ulauncher/
|
||||
作者:[Ankush Das][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/) 荣誉推出
|
||||
|
@ -1,5 +1,5 @@
|
||||
[#]: collector: (lujun9972)
|
||||
[#]: translator: ( )
|
||||
[#]: translator: (YungeG)
|
||||
[#]: reviewer: ( )
|
||||
[#]: publisher: ( )
|
||||
[#]: url: ( )
|
||||
|
@ -2,7 +2,7 @@
|
||||
[#]: via: "https://opensource.com/article/21/8/share-printer-cups"
|
||||
[#]: author: "Seth Kenlon https://opensource.com/users/seth"
|
||||
[#]: collector: "lujun9972"
|
||||
[#]: translator: " "
|
||||
[#]: translator: "fisherue "
|
||||
[#]: reviewer: " "
|
||||
[#]: publisher: " "
|
||||
[#]: url: " "
|
||||
@ -99,7 +99,7 @@ via: https://opensource.com/article/21/8/share-printer-cups
|
||||
|
||||
作者:[Seth Kenlon][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[译者ID](https://github.com/译者ID)
|
||||
译者:[译者ID](https://github.com/fisherue)
|
||||
校对:[校对者ID](https://github.com/校对者ID)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
@ -2,7 +2,7 @@
|
||||
[#]: via: "https://opensource.com/article/21/8/container-image"
|
||||
[#]: author: "Nived V https://opensource.com/users/nivedv"
|
||||
[#]: collector: "lujun9972"
|
||||
[#]: translator: " "
|
||||
[#]: translator: "geekpi"
|
||||
[#]: reviewer: " "
|
||||
[#]: publisher: " "
|
||||
[#]: url: " "
|
||||
|
@ -0,0 +1,255 @@
|
||||
[#]: 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: " "
|
||||
[#]: reviewer: " "
|
||||
[#]: publisher: " "
|
||||
[#]: url: " "
|
||||
|
||||
20 essential Linux commands for every user
|
||||
======
|
||||
From new user to power user, here are 20 Linux commands that will make
|
||||
your life easier.
|
||||
![Command line prompt][1]
|
||||
|
||||
Typing commands into a darkened terminal window may seem antiquated to some, but for many computer users, it's the most efficient, most accessible, and clearest way to accomplish nearly any task a computer is capable of performing. These days, thanks to all the projects that bring open source commands to non-open platforms like macOS and Windows, terminal commands are relevant to everybody, not just Linux and BSD users. It may surprise you to learn that there are thousands of commands installed on an average [POSIX][2] computer, but of course, a good many of those aren't really intended to be used, at least not directly or regularly. Some commands are more universally useful than others, and still fewer are absolutely essential for effective terminal use.
|
||||
|
||||
Here are the top 20 commands a terminal user might find themselves using:
|
||||
|
||||
### cd
|
||||
|
||||
Outside of a terminal, you click on icons to move from one folder to another, but in the terminal, you use `cd`. The `cd` command, which stands for _change directory_, is how you move through a Linux system. It's the fastest and most direct route from one place to another.
|
||||
|
||||
For instance, on the desktop, when you want to move from your home directory (the place you keep all of your folders) to a folder called `presentations`, then you might first have to open your `Documents` folder, then open a folder called `work`, then a `projects` folder, and then the `conference` folder, and finally the `presentations` folder, which contains your exciting LibreOffice Impress slideshow. That's a lot of double-clicking. It may also be a lot of moving around on the screen, depending on where new windows appear, and a lot of waypoints for your brain to track. Many people circumvent this seemingly minor task by keeping _everything_ on their desktop.
|
||||
|
||||
Terminal users avoid this issue by just typing:
|
||||
|
||||
|
||||
```
|
||||
`$ cd ~/Documents/work/projects/conference/presentations`
|
||||
```
|
||||
|
||||
Experienced terminal users don't even bother typing all of that. They use the **Tab** key to autocomplete the words for them. And sometimes, you don't even have to resort to autocompletion. You can use wildcards instead:
|
||||
|
||||
|
||||
```
|
||||
`$ cd ~/Doc*/work/*/conf*/p*`
|
||||
```
|
||||
|
||||
### pwd
|
||||
|
||||
In the words of Buckaroo Banzai: "No matter where you go, there you are."
|
||||
|
||||
When you need to figure out where exactly that is, you use the `pwd` command. The `pwd` stands for _print working directory,_ and that's exactly what it does. The `--physical` (or just `-P` in some implementations) shows your location with all symlinks resolved.
|
||||
|
||||
|
||||
```
|
||||
$ pwd
|
||||
/home/tux/presentation
|
||||
|
||||
$ pwd --physical
|
||||
/home/tux/Documents/work/projects/conference/presentations
|
||||
```
|
||||
|
||||
### sed
|
||||
|
||||
Better known as `sed`, the stream editor is a powerful bulk _find and replace_ command, but it's also a legitimate text editor. You can learn to use it by reading my [introductory article][3], and then become an expert with my [advanced tutorial and cheat sheet][4].
|
||||
|
||||
### grep
|
||||
|
||||
The `grep` command is so ubiquitous that it's often used as a verb ("I'll grep through some files") and a gerund ("grepping some output"). It's a key component when parsing text in your shell, whether you're looking through log files or parsing the output of some other command. It's a way for the busy user to focus on specific information. Given just how much data there is in the computing world, there's no wonder it's a popular command. Go grok grep by reading my [introductory article][5], and then download the [cheat sheet][6].
|
||||
|
||||
### file
|
||||
|
||||
Use the `file` command when you need to know what type of data a file contains:
|
||||
|
||||
|
||||
```
|
||||
$ file example.foo
|
||||
example.foo: RIFF (little-endian) data, Web/P image [...]
|
||||
|
||||
$ file example.bar
|
||||
example.bar: ELF 64-bit LSB executable, x86-64 [...]
|
||||
```
|
||||
|
||||
The `file` command isn't magic, of course. It only reports based on how a file identifies itself, and files can be wrong, corrupted, or disguised. A rigorous inspection with [`hexdump`][7] provides more certainty, but for casual use, the `file` command is convenient.
|
||||
|
||||
### awk
|
||||
|
||||
Awk isn't just a command; it's a literal [programming language][8]. [Download our free Awk ebook][9], learn it, and you'll be writing scripts you never thought possible.
|
||||
|
||||
### curl
|
||||
|
||||
The `curl` command is a [non-interactive web browser][10] for your terminal. It's a [development tool][11] for web and API developers. It's a complex command for its flexibility, but it's worth learning if you want to interact with network services from your terminal smoothly.
|
||||
|
||||
Download our free [`curl` cheat sheet][12], so you can internalize its many options.
|
||||
|
||||
### ps
|
||||
|
||||
Managing your system's resources is mostly up to the kernel, but when you prefer or require a manual approach, there's the `ps` command. Learn about `ps` in my [monitor your Linux system with procps-ng][13] article.
|
||||
|
||||
### cat
|
||||
|
||||
The [`cat` command][14] is short for _concatenate_, and it was very useful once for joining files that had been split (with a command intuitively called `split`) into several small files due to size limitations. Today, `cat` is mostly used as a way to dump the contents of a text file into your terminal for quick reference, unless you use `head`, `tail`, `more`, or `less` for that.
|
||||
|
||||
Despite its almost deprecated original purpose, and despite that several other commands also perform its secondary function, `cat` is still a useful utility. For instance, it can be a stand-in for the copy (`cp`) command:
|
||||
|
||||
|
||||
```
|
||||
`$ cat myfile.ogg > /backups/myfile.ogg`
|
||||
```
|
||||
|
||||
It can reveal inconvenient invisible characters in files. The **Tab** character, which breaks [YAML][15], shows up as `^I` with the `--show-tabs` option:
|
||||
|
||||
|
||||
```
|
||||
$ 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
|
||||
```
|
||||
|
||||
It can show non-printing characters with `--show-nonprinting`, mark the ends of lines with `--show-ends`, provide line numbers with `--number`, and more.
|
||||
|
||||
### find
|
||||
|
||||
The `find` command helps you find files, but thanks to its many options, it can help you find files with a variety of filters and parameters. Learn the basics from my [introductory article][16].
|
||||
|
||||
And in case you've been wondering why the most fundamental command of all, the humble [`ls` command][17], isn't on this list, it's because of the flexibility of `find`. Not only can find list files:
|
||||
|
||||
|
||||
```
|
||||
$ find .
|
||||
./bar.txt
|
||||
./baz.xml
|
||||
./foo.txt
|
||||
[...]
|
||||
```
|
||||
|
||||
It can also provide long listings:
|
||||
|
||||
|
||||
```
|
||||
$ 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
|
||||
[...]
|
||||
```
|
||||
|
||||
It's a technicality, but a neat trick to know.
|
||||
|
||||
### tar
|
||||
|
||||
People sometimes joke about Linux commands by citing BSD's `tar` syntax. In spite of its reputation, the `tar` command can actually be very intuitive. Read my [how to unzip a tar.gz file][18] article to learn the simple secret to rattling off a `tar` command on demand.
|
||||
|
||||
### more or less or most
|
||||
|
||||
Pagers are like `cat`, except they pause their output at the bottom of your screen until you scroll down for more. It's a simple application, but there's nuance to each implementation. Do you scroll with arrow keys or the spacebar? Do you have to quit manually, or does the pager exit at the end of the file it's displaying? What's your preferred search behavior? Choose your favorite pager and set it in your `.bashrc`!
|
||||
|
||||
### ssh and scp
|
||||
|
||||
OpenSSH not only helps secure connections to remote systems it also enables other commands. For instance, for many users, it's their `.ssh` directory that makes it possible for them to interact smoothly with Git repositories, post updates to a website, or log in to their cloud's control plane.
|
||||
|
||||
### mv
|
||||
|
||||
The `mv` command does double-duty: It both [moves files][19] and it [renames files][20]. It has several available safeguards, including `--interactive` and `--no-clobber` options to avoid clobbering an existing file, a `--backup` command to ensure data is preserved until it is verified at its new location, and the `--update` option to ensure that an older version doesn't replace a newer file.
|
||||
|
||||
### sudo
|
||||
|
||||
When you have a single user with a known user name and _all_ the privileges on a system, that user quickly becomes the target of attacks. By eliminating the need for a literal `root` user, the `sudo` command elegantly removes important information about your system from general knowledge. That's not all it does, though. With `sudo`, you can easily manage privileges down to individual commands, users, and groups. You can enable password-less execution of select commands, record user sessions, verify commands with digest validation, [and more][21].
|
||||
|
||||
### alias
|
||||
|
||||
Turn long commands into easy-to-remember shortcuts by using the `alias` command:
|
||||
|
||||
|
||||
```
|
||||
`$ alias ls='ls --classify --almost-all --ignore-backups --color'`
|
||||
```
|
||||
|
||||
### clear
|
||||
|
||||
Sometimes your terminal gets cluttered. There's nothing like a nice, fresh screen after typing `clear` (or pressing **Ctrl+L** in some shells).
|
||||
|
||||
### setfacl
|
||||
|
||||
Traditionally, POSIX file permissions were determined by `chown` and `chmod`. Systems have become more complex, though, so there's a command to provide a little more flexibility. The `setfacl` command lets you create an [Access Control List (ACL)][22], granting permissions to arbitrary users and setting default permissions for folders and the contents created within them.
|
||||
|
||||
### netcat
|
||||
|
||||
Not every user needs netcat (`nc`), but few who use it ever want to give it up. The `nc` command is an all-purpose network connection tool.
|
||||
|
||||
It can connect to a port, similar to `telnet`:
|
||||
|
||||
|
||||
```
|
||||
`$ nc -u 192.168.0.12 80`
|
||||
```
|
||||
|
||||
It can ping a port, similar to `ping`:
|
||||
|
||||
|
||||
```
|
||||
`$ nc -zvn 192.168.0.12 25`
|
||||
```
|
||||
|
||||
It can probe for open ports, similar to `nmap`:
|
||||
|
||||
|
||||
```
|
||||
`$ nc -zv 192.168.0.12 25-80`
|
||||
```
|
||||
|
||||
And that's just a small sample.
|
||||
|
||||
### you
|
||||
|
||||
The Linux terminal is, in part, about creative problem-solving. When you learn commands, you're also learning building blocks you can use to create your own commands. Many of the commands in my [shell history][23] are shell scripts I've written myself. The result is that my workflow is customized to how I want to work. Essential commands in your shell can also be the ones you design for your own efficacy and comfort. Spend some time getting to know some great commands, and then build your own. And when you hit upon something really good, make it open source so you can share your ideas with others!
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/21/9/essential-linux-commands
|
||||
|
||||
作者:[Seth Kenlon][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[译者ID](https://github.com/译者ID)
|
||||
校对:[校对者ID](https://github.com/校对者ID)
|
||||
|
||||
本文由 [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
|
@ -0,0 +1,212 @@
|
||||
[#]: subject: "Control your Raspberry Pi remotely with your smartphone"
|
||||
[#]: via: "https://opensource.com/article/21/9/raspberry-pi-remote-control"
|
||||
[#]: author: "Stephan Avenwedde https://opensource.com/users/hansic99"
|
||||
[#]: collector: "lujun9972"
|
||||
[#]: translator: " "
|
||||
[#]: reviewer: " "
|
||||
[#]: publisher: " "
|
||||
[#]: url: " "
|
||||
|
||||
Control your Raspberry Pi remotely with your smartphone
|
||||
======
|
||||
Control the GPIOs of your Raspberry Pi remotely with your smartphone.
|
||||
![A person looking at a phone][1]
|
||||
|
||||
Wouldn't it be nice to control the general-purpose input/outputs (GPIOs) of the Raspberry Pi remotely with your smartphone? If you can answer the question in the affirmative, I would like to introduce you to a simple way to implement this. Writing this article, I have no specific application in mind, but I can think of combining it with lawn irrigation, any illumination, or a garage door opener.
|
||||
|
||||
Anyway, all you need to get started is a Raspberry Pi and a smartphone. The actual logic is already available on GitHub, so even without programming skills, you will be able to follow the steps described in this article.
|
||||
|
||||
### Architecture
|
||||
|
||||
We do the major work with [Pythonic][2]—a graphical Python programming framework I develop in my leisure. Pythonic brings a [Telegram][3] bot programming element with it, which acts as our smartphone interface. A significant advantage of this setup is that it is scalable regarding the number of clients: You can decide whether you want to control the GPIOs only by yourself, share them with your relatives or friends, or share the control capabilities with the public. Of course, a prerequisite is permanent internet access to communicate between the Telegram server and the client. To establish internet access, you could use either the Ethernet interface or the WiFi functionality of the Raspberry Pi.
|
||||
|
||||
### Install Pythonic
|
||||
|
||||
To get started, you have to install Pythonic on your Raspberry Pi. The easiest way of doing that is to flash the SD card with the preconfigured Pythonic image available on [sourceforge.net][4].
|
||||
|
||||
Download and unzip the image and flash it to the SD card of the Raspberry Pi. On Windows, you can use [balenaEtcha][5] for it. On Linux, you can do it with the onboard tools.
|
||||
|
||||
1. Plugin the SD card and check under which device it is showing up by typing `lsblk -p`.
|
||||
|
||||
![Using lsblk -p to check under which device your SD card shows ][6]
|
||||
|
||||
(Stephan Avenwedde, [CC-BY SA 4.0][7])
|
||||
|
||||
2. In the screenshot above, the SD card device is `/dev/sdc`, and my systems automatically mounted two partitions that were found on it. If this is the case, unmount it by typing `umount /dev/sdc1 && umount /dev/sdc2`.
|
||||
|
||||
3. Flash the SD card with the following command: `dd if=~/Downloads/Pythonic-1.7.img of=/dev/sdc bs=32M, conv=fsync`.
|
||||
**Attention***: *This will delete all previous files on the SD card.
|
||||
|
||||
4. The flashing process will take a while.
|
||||
Once the process is finished, put the SD card back in your Raspberry Pi and boot it up.
|
||||
|
||||
|
||||
|
||||
|
||||
### Establishing a connection
|
||||
|
||||
The Pythonic image has no pre-installed desktop. The whole configuration is web-based, so you must establish a TCP/IP connection. It is straightforward to connect using an ordinary internet router. If you don't have access to such a router, you can also establish a connection over the onboard universal asynchronous receiver/transmitter ****(UART) device to configure the Ethernet or WiFi interface.
|
||||
|
||||
#### Locale DNS
|
||||
|
||||
By default, the Pythonic image is configured to acquire an IP address by DHCP. Your internet router at home usually runs a DHCP server that distributes IP addresses to connected devices. Make a connection between a free Ethernet port of your internet router and the Ethernet port on your Raspberry Pi and boot it up.
|
||||
|
||||
You can now try to access the web-based GUI from a device within your local network. If the DNS in your local network works properly, open a browser and navigate to http ://PythonicRPI:7000/ to open the programming GUI.
|
||||
|
||||
#### Locale IP
|
||||
|
||||
I assume your router also offers a graphical configuration GUI. The configuration GUI provides information about the devices in your local network. You can find the IP address of your local router by typing `ip route`.
|
||||
|
||||
In my case, the route is available under 192.168.188.1. Now login to your router's configuration page and check which IP was the Raspberry Pi given.
|
||||
|
||||
![Viewing active connections][8]
|
||||
|
||||
(Stephan Avenwedde, [CC-BY SA 4.0][7])
|
||||
|
||||
In my network, the Raspberry Pi is available under 192.168.188.63, so I can access the GUI at http ://192.168.188.63:7000/.
|
||||
|
||||
#### UART
|
||||
|
||||
Put the SD card back into the card reader and mount the _boot_ partition. Open the _config.txt_ on the _boot_ partition and add the following line to the end:
|
||||
|
||||
|
||||
```
|
||||
`enable_uart=1`
|
||||
```
|
||||
|
||||
Put the SD card back in the Raspberry Pi and boot it up. You can now establish a console connection with a UART-USB converter to set up a static IP address or configure a WiFi connection.
|
||||
|
||||
![Establishing a UART connection][9]
|
||||
|
||||
(Stephan Avenwedde, [CC-BY SA 4.0][7])
|
||||
|
||||
The default connection parameters are:
|
||||
|
||||
* TxD: GPIO14
|
||||
* RxD: GPIO15
|
||||
* Ground: Pin 6 or 14
|
||||
* Baud rate: 115200
|
||||
* Data bits: 8
|
||||
* Parity bit: None
|
||||
* Stop bits: 1
|
||||
|
||||
|
||||
|
||||
You can find more information on [elinux.org][10].
|
||||
|
||||
### Uploading the configuration
|
||||
|
||||
To proceed with the upcoming steps, download the example files from [github][11] to your local hard drive.
|
||||
|
||||
![GitHub example files repository ][12]
|
||||
|
||||
(Stephan Avenwedde, [CC-BY SA 4.0][7])
|
||||
|
||||
The example consists of several files of two elementary types:
|
||||
|
||||
* `*.py-files`—Contains the actual implementation of specific functionality.
|
||||
* `current_config.json`—This file describes the configured elements, the links between the elements, and the variable configuration of the elements.
|
||||
|
||||
|
||||
|
||||
This example is a slightly modified version of the already available reference implementation. You can access it by dragging and dropping the files from the left sidebar to the working area.
|
||||
|
||||
Now upload the configuration to your target:
|
||||
|
||||
![Pythonic GUI overview][13]
|
||||
|
||||
(Stephan Avenwedde, [CC-BY SA 4.0][7])
|
||||
|
||||
With the blue-marked button, you upload the `current_config.json` to the target. You can upload only valid configuration files. After uploading, you can find the file on the target under `/home/pythonic/Pythonic/current_config.json`.
|
||||
|
||||
With the green-marked button, you upload each `*.py-files`. Afterward, the `*.py-files` can be found under `/home/pythonic/Pythonic/executables`.
|
||||
|
||||
It is possible to upload any kind of file to the `executables` folder because I plan to support binary executables in the future.
|
||||
|
||||
However, so that the configuration works, the actual implementation must be available for each element described in `current_config.json`.
|
||||
|
||||
### Setup a Telegram Bot
|
||||
|
||||
The configuration should now look like this:
|
||||
|
||||
![Pythonic GPIO remote configuration][14]
|
||||
|
||||
(Stephan Avenwedde, [CC-BY SA 4.0][7])
|
||||
|
||||
Well done! But this setup won't work yet. Try to start this configuration by clicking **Play** on the _ManualScheduler - 0x5f8125f5_ element. The connected Telegram element will start but then immediately quit. This is because the Telegram element needs some additional configuration: Right-click on the Telegram element. You should now see pop-up windows like this:
|
||||
|
||||
![Pop-up for Phythonic GPIO remote Telegram][15]
|
||||
|
||||
(Stephan Avenwedde, [CC-BY SA 4.0][7])
|
||||
|
||||
You have to provide a Telegram bot token to communicate with the server. The process of creating a bot token is described on [core.telegram.org][16].
|
||||
|
||||
In a nutshell: Start a chat with the [BotFather][17] and create a bot with the `/newbot` command. At the end of the process, the BotFather will provide you a token that you can copy and paste to the Telegram element.
|
||||
|
||||
That's it. Now you should be able to start the Telegram element by clicking on the play button on the _ManualScheduler - 0x5f8125f5_ element. The Telegram element should now be active, which can be seen from the green frame.
|
||||
|
||||
![ Active RPI Telegram element][18]
|
||||
|
||||
(Stephan Avenwedde, [CC-BY SA 4.0][7])
|
||||
|
||||
The spinning bar on the bottom info line indicates a working connection with the backend.
|
||||
|
||||
Start a chat with your newly created bot by typing _@<name-of-your-bot>_ in the search field of Telegram. Click **Start** to get the initial state of the GPIOs. I named my bot _RPIremoteIO_:
|
||||
|
||||
![Start RPI Telegram][19]
|
||||
|
||||
(Stephan Avenwedde, [CC-BY SA 4.0][7])
|
||||
|
||||
### Debugging and Modification
|
||||
|
||||
Open a new tab in your browser and navigate to http ://PythonicRPI:8000/. This will open the pre-installed [code-server][20] IDE. On the left pane, click on the files button and open `telegram_2ca7cd73.py` :
|
||||
|
||||
![RPI code server IDE][21]
|
||||
|
||||
(Stephan Avenwedde, [CC-BY SA 4.0][7])
|
||||
|
||||
You should now be able to start debugging and follow the path of execution like in the following screen recording:
|
||||
|
||||
<https://youtu.be/IjJehKq7YCc>
|
||||
|
||||
The Telegram element uses an [inline keyboard][22] which shows the target state of GPIO4 and GPIO5. This way, several users could control the state of GPIOs without disturbing each other because the new target state for the GPIOs is always provided to all subscribers.
|
||||
|
||||
### Conclusion
|
||||
|
||||
With this example, you should get a feeling of how everything connects. You can adapt the example as you like: Change or add additional GPIOs, use the analog features or get the input state on demand. If you connect a suitable relay, you could also drive higher loads with the Raspberry Pi. I am sure you will do something great with it!
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/21/9/raspberry-pi-remote-control
|
||||
|
||||
作者:[Stephan Avenwedde][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[译者ID](https://github.com/译者ID)
|
||||
校对:[校对者ID](https://github.com/校对者ID)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://opensource.com/users/hansic99
|
||||
[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/hANSIc99/Pythonic
|
||||
[3]: https://telegram.org/
|
||||
[4]: https://sourceforge.net/projects/pythonicrpi/
|
||||
[5]: https://www.balena.io/etcher/
|
||||
[6]: https://opensource.com/sites/default/files/uploads/pi_gen_lsblk_mounted_1.png (Using lsblk -p to check under which device your SD card shows )
|
||||
[7]: https://creativecommons.org/licenses/by-sa/4.0/
|
||||
[8]: https://opensource.com/sites/default/files/uploads/active_connections.png (Viewing active connections)
|
||||
[9]: https://opensource.com/sites/default/files/uploads/pythonic_rpi_uart.jpg (Establishing a UART connection)
|
||||
[10]: https://elinux.org/RPi_Serial_Connection
|
||||
[11]: https://github.com/hANSIc99/Pythonic/tree/master/examples/rpi_telegram_remote_io
|
||||
[12]: https://opensource.com/sites/default/files/uploads/github_example_remote_gpio.png (GitHub example files repository )
|
||||
[13]: https://opensource.com/sites/default/files/uploads/pythonic_gui_overview.png (Pythonic GUI overview)
|
||||
[14]: https://opensource.com/sites/default/files/uploads/pythonic_gpio_remote_config.png (Pythonic GPIO remote configuration)
|
||||
[15]: https://opensource.com/sites/default/files/uploads/pythonic_gpio_remote_telegram.png (Pop-up for Phythonic GPIO remote Telegram)
|
||||
[16]: https://core.telegram.org/bots#6-botfather
|
||||
[17]: https://t.me/botfather
|
||||
[18]: https://opensource.com/sites/default/files/uploads/rpi_telegram_active.png (Active RPI Telegram element)
|
||||
[19]: https://opensource.com/sites/default/files/uploads/rpi_start_telegram.png (Start RPI Telegram)
|
||||
[20]: https://github.com/cdr/code-server
|
||||
[21]: https://opensource.com/sites/default/files/uploads/rpi_code-server_ide.png (RPI code server IDE)
|
||||
[22]: https://core.telegram.org/bots#inline-keyboards-and-on-the-fly-updating
|
297
sources/tech/20210901 Getting ready for Fedora Linux.md
Normal file
297
sources/tech/20210901 Getting ready for Fedora Linux.md
Normal file
@ -0,0 +1,297 @@
|
||||
[#]: subject: "Getting ready for Fedora Linux"
|
||||
[#]: via: "https://fedoramagazine.org/getting-ready-for-fedora-linux/"
|
||||
[#]: author: "Hanku Lee https://fedoramagazine.org/author/hankuoffroad/"
|
||||
[#]: collector: "lujun9972"
|
||||
[#]: translator: " "
|
||||
[#]: reviewer: " "
|
||||
[#]: publisher: " "
|
||||
[#]: url: " "
|
||||
|
||||
Getting ready for Fedora Linux
|
||||
======
|
||||
|
||||
![][1]
|
||||
|
||||
Photo by [Jacques Bopp][2] on [Unsplash][3]
|
||||
|
||||
### Introduction
|
||||
|
||||
Why does Linux remain vastly invisible to ordinary folks who make general use of computers? This article steps through the process to move to Fedora Linux Workstation for non-Linux users. It also describes features of the GUI (Graphic User Interface) and CLI (Command Line Interface) for the newcomer. This is a quick introduction, not an in-depth course.
|
||||
|
||||
### Installation and configuration are straightforward
|
||||
|
||||
Supposedly, a bootable USB drive is the most baffling experience of starting Linux for a beginner. In all fairness, installation with Fedora Media Writer and Anaconda is intuitive.
|
||||
|
||||
##### Step-by-step installation process
|
||||
|
||||
1. [Make a Fedora USB stick][4]: 5 to 7 minutes depending on USB speed
|
||||
2. [Understand disk partitions and Linux file systems][5]
|
||||
3. [Boot from a USB device][6]
|
||||
4. [Install][7] with the Fedora installer, Anaconda: 15 to 20 minutes
|
||||
5. Software updates: 5 minutes
|
||||
|
||||
|
||||
|
||||
Following this procedure, it is easy to help family and friends install Fedora Linux.
|
||||
|
||||
##### Package management and configuration
|
||||
|
||||
Instead of configuring the OS manually, adding tools and applications you need, you may choose a functional bundle from [Fedora Labs][8] for a specific use case. Design Suite, Scientific, Python Classroom, and more, are available. Plus, all processes are complete without the command line.
|
||||
|
||||
##### Connecting devices and services
|
||||
|
||||
* [Add a USB printer][9]: Fedora Linux detects most printers in a few seconds. Some may require the drivers.
|
||||
* Configure a USB keyboard: Refer to simple [work-around][10] for a mechanical keyboard.
|
||||
* [Sync with Google Drive][11]: Add an account either after installation, or at any time afterward.
|
||||
|
||||
|
||||
|
||||
### Desktop customization is easy
|
||||
|
||||
The default [GNOME desktop][12] is decent and free from distractions.
|
||||
|
||||
A shortlist to highlight desktop benefits:
|
||||
|
||||
* Simplicity: Clean design, fluid and elegant application grid.
|
||||
* Reduced user effort: No alerts for paid services or long list of user consent.
|
||||
* Accommodating software: GNOME requires little specialist knowledge or technical ability.
|
||||
* Neat layout of system _Settings_: Larger icons and a better layout.
|
||||
|
||||
|
||||
|
||||
The image below shows the applications and desktops currently available. Get here by selecting “Activities” and then the “Show Applications” icon at the bottom of the screen at the far right. There you will find LibreOffice for your document, spreadsheet, and presentation creation. Also available is Firefox for your web browsing. More applications are added using the _Software_ icon (second from right at the bottom of the screen).
|
||||
|
||||
![GNOME desktop][13]
|
||||
|
||||
##### Enable touchpad click (tapping)
|
||||
|
||||
A change for [touchpad settings][14] is required for laptop users.
|
||||
|
||||
1. Go to _Activies > Show Applications > Settings > Mouse & Touchpad > Touchpad_
|
||||
2. Change the default behavior of touchpad settings (double click) to tap-to-click (single tap) using the built-in touchpad
|
||||
3. Select ‘Tap to Click’
|
||||
|
||||
|
||||
|
||||
##### Add user accounts using the users settings tool
|
||||
|
||||
During installation, you set up your first login account. For training or demo purposes, it is common to create a new user account.
|
||||
|
||||
1. Add users: Go to _Settings > Users > Unlock > Authentication> Add user_
|
||||
2. Click at the top of the screen at the far right and then navigate to Power Off / Log out, and Select _Switch User_ to relogin as the new user.
|
||||
|
||||
|
||||
|
||||
### Fedora Linux is beginner-friendly
|
||||
|
||||
Yes, Fedora Linux caters to a broader selection of users. Since that is the case, why not dip into the shallow end of the Fedora community?
|
||||
|
||||
* [Fedora Docs][15]: Clarity of self-help content is outstanding.
|
||||
* Ask Fedora: Get help for anything about Fedora Linux.
|
||||
* Magazine: Useful tips and user story are engaging. Make a suggestion to write about.
|
||||
* Nest with Fedora: Warm welcome virtually from Fedora Linux community.
|
||||
* Release parties.
|
||||
|
||||
|
||||
|
||||
### Command line interface is powerful
|
||||
|
||||
The command line is a way of giving instructions to a computer (shell) using a terminal. To be fair, the real power behind Fedora Linux is the Bash shell that empowers users to be problem solvers. The good news is that the text-based command is universally compatible across different versions of Linux. The Bash shell comes with the Fedora Linux, so there is no need to install it.
|
||||
|
||||
The following will give you a feeling for the command line. However, you can accomplish many if not all day-to-day tasks without using the command line.
|
||||
|
||||
#### How to use commands?
|
||||
|
||||
Access the command line by selecting “Activities” and then the “Show Applications” icon at the bottom of the screen at the far right. Select _Terminal_.
|
||||
|
||||
#### Understand the shell prompt
|
||||
|
||||
The standard shell prompt looks like this:
|
||||
|
||||
```
|
||||
[hank@fedora_test ~]$
|
||||
```
|
||||
|
||||
The shell prompt waits for a command.
|
||||
|
||||
It shows the name of the user (hank), the computer being used (fedora_test), and the current working directory within the filesystem (~, meaning the user’s home directory). The last character of the prompt, $, indicates that this is a normal user’s prompt.
|
||||
|
||||
#### Enter commands
|
||||
|
||||
What common tasks should a beginner try out with command lines?
|
||||
|
||||
* Command line information is available from the [Fedora Magazine][16] and [other sites][17].
|
||||
* Use _ls_ and _cd_ to list and navigate your file system.
|
||||
* Make new directories (folders) with _mkdir_.
|
||||
* Delete files with _rm_.
|
||||
* Use _lsblk_ command to display partition details.
|
||||
|
||||
|
||||
|
||||
#### How to deal with the error messages
|
||||
|
||||
* Be attentive to error messages in the terminal. Common errors are missing arguments, typo of file name.
|
||||
* Pause to think about why that happened.
|
||||
* Figure out the correct syntax using the _man_ command. For example:
|
||||
_man ls_
|
||||
displays the manual page for the _ls_ command.
|
||||
|
||||
|
||||
|
||||
#### Perform administration tasks using _sudo_
|
||||
|
||||
When a user executes commands for installation, removal, or change of software, [the _sudo_ command][18] allows users to gain administrative or root access. The actions that required _sudo_ command are often called ‘the administrative tasks’. Sudo stands for **SuperUser DO**. The syntax for the _sudo_ command is as follows:
|
||||
|
||||
```
|
||||
sudo [COMMAND]
|
||||
```
|
||||
|
||||
1. Replace _COMMAND_ with the command to run as the root user.
|
||||
2. Enter password
|
||||
|
||||
|
||||
|
||||
What are the most used _sudo_ commands to start with?
|
||||
|
||||
* List privileges
|
||||
|
||||
|
||||
|
||||
```
|
||||
sudo -l
|
||||
```
|
||||
|
||||
* Install a package
|
||||
|
||||
|
||||
|
||||
```
|
||||
sudo dnf install [package name]
|
||||
```
|
||||
|
||||
* Update a package
|
||||
|
||||
|
||||
|
||||
```
|
||||
sudo dnf update [package name]
|
||||
```
|
||||
|
||||
* List all packages
|
||||
|
||||
|
||||
|
||||
```
|
||||
sudo dnf grouplist [package name]
|
||||
```
|
||||
|
||||
* Manage disk partitions
|
||||
|
||||
|
||||
|
||||
```
|
||||
sudo fdisk -l
|
||||
```
|
||||
|
||||
### Built-in text editor is light and efficient
|
||||
|
||||
[Nano][19] is the default command-line-based text editor for Fedora Linux. [vi][20] is another one often used on Fedora Linux. Both are light and fast. Which to us is a personal choice, really. Nano and vi remain essential tools for editing config files and writing scripts. Generally, Nano is much simpler to work with than vi but vi can be more powerful when you get used to it.
|
||||
|
||||
##### What does a beginner benefit from a text editor?
|
||||
|
||||
* Learn fundamentals of computing
|
||||
|
||||
|
||||
|
||||
Linux offers a vast range of customization options and monitoring. Shell scripts make it possible to add new functionality and the editor is used to create the scripts.
|
||||
|
||||
* Build cool things for home automation
|
||||
|
||||
|
||||
|
||||
Raspberry Pi is a testing ground to build awesome projects for homes. [Fedora can be installed on Raspberry Pi][21]. Schools use the tiny microcomputer for IT training and experiment. Instead of a visual editor, it is easier to use a light and simple Nano editor to write files.
|
||||
|
||||
* Test proof of concept with the public cloud services
|
||||
|
||||
|
||||
|
||||
Most of the public cloud suppliers offer free sandbox account to spin up a virtual machine or configure the network. Cloud servers run Linux OS, so editing configuration files require a text editor. Without installing additional software, it is easy to invoke Nano on a remote server.
|
||||
|
||||
##### How to use Nano text editor
|
||||
|
||||
Type _nano_ and file name after the shell prompt $ and press Enter.
|
||||
|
||||
```
|
||||
[hank@fedora_test ~]$ nano [filename]
|
||||
```
|
||||
|
||||
Note that many of the most used commands are displayed at the bottom of the nano screen. The symbol ^ in Nano means to press the Ctrl key.
|
||||
|
||||
* Use the arrow keys on the keyboard to move up and down, left and right.
|
||||
* Edit file.
|
||||
* Get built-in help by pressing ^G
|
||||
* Exit by entering ^X and Y to save your file and return to the shell prompt.
|
||||
|
||||
|
||||
|
||||
##### Examples of file extensions used for configuration or shell scripts
|
||||
|
||||
* .cfg: User-configurable files in the /etc directory.
|
||||
* .yaml: A popular type of configuration file with cross-language data portability.
|
||||
* .json: JSON is a lightweight & open standard format for storing and transporting data.
|
||||
* .sh: A shell script used universally for Unix/Linux systems.
|
||||
|
||||
|
||||
|
||||
Above all, this is not a comprehensive guide on Nano or vi. Yet, adventurous learners should be aware of text editors for their next step in becoming accomplished in Fedora Linux.
|
||||
|
||||
### Conclusion
|
||||
|
||||
Does Fedora Workstation simplify the user experience of a beginner with Linux? Yes, absolutely. It is entirely possible to create a desktop quickly and get the job done without installing additional software or extensions.
|
||||
|
||||
Taking it to the next level, how to get more people into Fedora Linux?
|
||||
|
||||
* Make Fedora Linux device available at home. A repurposed computer with the above guide is a starting point.
|
||||
* Demonstrate [cool things][22] with Fedora Linux.
|
||||
* Share [power user tips][23] with shell scripts.
|
||||
* Get involved with Open Source Software community such as the [Fedora project][24].
|
||||
|
||||
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://fedoramagazine.org/getting-ready-for-fedora-linux/
|
||||
|
||||
作者:[Hanku Lee][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[译者ID](https://github.com/译者ID)
|
||||
校对:[校对者ID](https://github.com/校对者ID)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://fedoramagazine.org/author/hankuoffroad/
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://fedoramagazine.org/wp-content/uploads/2021/08/ready_for_fedora-816x345.jpg
|
||||
[2]: https://unsplash.com/@jacquesbopp?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText
|
||||
[3]: https://unsplash.com/?utm_source=unsplash&utm_medium=referral&utm_content=creditCopyText
|
||||
[4]: https://fedoramagazine.org/make-fedora-usb-stick/
|
||||
[5]: https://docs.fedoraproject.org/en-US/fedora/rawhide/install-guide/appendixes/Disk_Partitions/
|
||||
[6]: https://docs.fedoraproject.org/en-US/fedora/rawhide/install-guide/install/Booting_the_Installation/
|
||||
[7]: https://docs.fedoraproject.org/en-US/fedora/rawhide/install-guide/install/Installing_Using_Anaconda/
|
||||
[8]: https://labs.fedoraproject.org/
|
||||
[9]: https://docs.fedoraproject.org/en-US/Fedora/14/html/User_Guide/chap-User_Guide-Printing.html
|
||||
[10]: https://venthur.de/2021-04-30-keychron-c1-on-linux.html
|
||||
[11]: https://fedoramagazine.org/connect-your-google-drive-to-fedora-workstation/
|
||||
[12]: https://developer.gnome.org/hig/principles.html
|
||||
[13]: https://fedoramagazine.org/wp-content/uploads/2021/08/Screenshot-from-2021-08-12-23-27-13-1024x576.png
|
||||
[14]: https://help.gnome.org/users/gnome-help/stable/mouse-touchpad-click.html.en
|
||||
[15]: https://docs.fedoraproject.org/en-US/docs/
|
||||
[16]: https://fedoramagazine.org/?s=command+line
|
||||
[17]: https://www.redhat.com/sysadmin/essential-linux-commands
|
||||
[18]: https://fedoramagazine.org/howto-use-sudo/
|
||||
[19]: https://fedoramagazine.org/gnu-nano-minimalist-console-editor/
|
||||
[20]: https://www.redhat.com/sysadmin/vim-commands
|
||||
[21]: https://docs.fedoraproject.org/en-US/quick-docs/raspberry-pi/
|
||||
[22]: https://fedoramagazine.org/automatically-light-up-a-sign-when-your-webcam-is-in-use/
|
||||
[23]: https://fedoramagazine.org/?s=bash
|
||||
[24]: https://docs.fedoraproject.org/en-US/project/
|
97
sources/tech/20210901 What are container runtimes.md
Normal file
97
sources/tech/20210901 What are container runtimes.md
Normal file
@ -0,0 +1,97 @@
|
||||
[#]: 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: " "
|
||||
[#]: reviewer: " "
|
||||
[#]: publisher: " "
|
||||
[#]: url: " "
|
||||
|
||||
What are container runtimes?
|
||||
======
|
||||
Take a deep dive into container runtimes so you can understand how
|
||||
container environments are built.
|
||||
![Ships at sea on the web][1]
|
||||
|
||||
In my examination of [container images][2], I discussed container fundamentals, but now it's time to delve deeper into container runtimes so you can understand how container environments are built. The information in this article is in part extracted from the [official documentation][3] of the Open Container Initiative (OCI), the open standard for containers, so this information is relevant regardless of your container engine.
|
||||
|
||||
### Container runtimes
|
||||
|
||||
So what really happens in the backend when you run a command like `podman run` or `docker run` command? Here is a step-by-step overview for you:
|
||||
|
||||
1. The image is pulled from an image registry if it not available locally
|
||||
2. The image is extracted onto a copy-on-write filesystem, and all the container layers overlay each other to create a merged filesystem
|
||||
3. A container mount point is prepared
|
||||
4. Metadata is set from the container image, including settings like overriding CMD, ENTRYPOINT from user inputs, setting up SECCOMP rules, etc., to ensure container runs as expected
|
||||
5. The kernel is alerted to assign some sort of isolation, such as process, networking, and filesystem, to this container (namespaces)
|
||||
6. The kernel is also alerted to assign some resource limits like CPU or memory limits to this container (cgroups)
|
||||
7. A system call (syscall) is passed to the kernel to start the container
|
||||
8. SELinux/AppArmor is set up
|
||||
|
||||
|
||||
|
||||
Container runtimes take care of all of the above. When we think about container runtimes, the things that come to mind are probably runc, lxc, containerd, rkt, cri-o, and so on. Well, you are not wrong. These are container engines and container runtimes, and each is built for different situations.
|
||||
|
||||
_Container runtimes_ focus more on running containers, setting up namespace and cgroups for containers, and are also called lower-level container runtimes. Higher-level container runtimes or container engines focus on formats, unpacking, management, and image-sharing. They also provide APIs for developers.
|
||||
|
||||
### Open Container Initiative (OCI)
|
||||
|
||||
The Open Container Initiative (OCI) is a Linux Foundation project. Its purpose is to design certain open standards or a structure around how to work with container runtimes and container image formats. It was established in June 2015 by Docker, rkt, CoreOS, and other industry leaders.
|
||||
|
||||
It does this using two specifications:
|
||||
|
||||
#### 1\. Image Specification (image-spec)
|
||||
|
||||
The goal of this specification is to enable the creation of interoperable tools for building, transporting, and preparing a container image to run.
|
||||
|
||||
The high-level components of the spec include:
|
||||
|
||||
* [Image Manifest][4] — a document describing the elements that make up a container image
|
||||
* [Image Index][5] — an annotated index of image manifests
|
||||
* [Image Layout][6] — a filesystem layout representing the contents of an image
|
||||
* [Filesystem Layer][7] — a changeset that describes a container’s filesystem
|
||||
* [Image Configuration][8] — a document determining layer ordering and configuration of the image suitable for translation into a [runtime bundle][9]
|
||||
* [Conversion][10] — a document explaining how this translation should occur
|
||||
* [Descriptor][11] — a reference that describes the type, metadata, and content address of referenced content
|
||||
|
||||
|
||||
|
||||
#### 2\. Runtime specification (runtime-spec)
|
||||
|
||||
This specification aims to define the configuration, execution environment, and lifecycle of a container. The config.json file provides the container configuration for all supported platforms and details the field that enables the creation of a container. The execution environment is detailed along with the common actions defined for a container’s lifecycle to ensure that applications running inside a container have a consistent environment between runtimes.
|
||||
|
||||
The Linux container specification uses various kernel features, including namespaces, cgroups, capabilities, LSM, and filesystem jails to fulfill the spec.
|
||||
|
||||
### Now you know
|
||||
|
||||
Container runtimes are managed by the OCI specifications to provide consistency and interoperability. Many people use containers without the need to understand how they work, but understanding containers is a valuable advantage when you need to troubleshoot or optimize how you use them.
|
||||
|
||||
* * *
|
||||
|
||||
_This article is based on a [techbeatly][12] article and has been adapted with permission._
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/article/21/9/container-runtimes
|
||||
|
||||
作者:[Nived V][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[译者ID](https://github.com/译者ID)
|
||||
校对:[校对者ID](https://github.com/校对者ID)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://opensource.com/users/nivedv
|
||||
[b]: https://github.com/lujun9972
|
||||
[1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/kubernetes_containers_ship_lead.png?itok=9EUnSwci (Ships at sea on the web)
|
||||
[2]: https://opensource.com/article/21/8/container-fundamentals-2
|
||||
[3]: https://github.com/opencontainers
|
||||
[4]: https://github.com/opencontainers/image-spec/blob/master/manifest.md
|
||||
[5]: https://github.com/opencontainers/image-spec/blob/master/image-index.md
|
||||
[6]: https://github.com/opencontainers/image-spec/blob/master/image-layout.md
|
||||
[7]: https://github.com/opencontainers/image-spec/blob/master/layer.md
|
||||
[8]: https://github.com/opencontainers/image-spec/blob/master/config.md
|
||||
[9]: https://github.com/opencontainers/runtime-spec
|
||||
[10]: https://github.com/opencontainers/image-spec/blob/master/conversion.md
|
||||
[11]: https://github.com/opencontainers/image-spec/blob/master/descriptor.md
|
||||
[12]: https://medium.com/techbeatly/container-runtimes-deep-dive-77eb0e511939
|
@ -0,0 +1,404 @@
|
||||
[#]: subject: "Best Web Browsers for Ubuntu and Other Linux Distributions"
|
||||
[#]: via: "https://itsfoss.com/best-browsers-ubuntu-linux/"
|
||||
[#]: author: "Ankush Das https://itsfoss.com/author/ankush/"
|
||||
[#]: collector: "lujun9972"
|
||||
[#]: translator: " "
|
||||
[#]: reviewer: " "
|
||||
[#]: publisher: " "
|
||||
[#]: url: " "
|
||||
|
||||
Best Web Browsers for Ubuntu and Other Linux Distributions
|
||||
======
|
||||
|
||||
There is no such thing as the perfect web browser. It all depends on what you prefer and what you use it for.
|
||||
|
||||
But, what are your best options when it comes to web browsers for Linux?
|
||||
|
||||
In this article, I try to highlight the best web browsers that you can pick for Ubuntu and other Linux.
|
||||
|
||||
**Note:** We have tried and tested these browsers on Ubuntu. But, you should be able to install it on any Linux distribution of your choice.
|
||||
|
||||
### Top Web Browsers for Linux
|
||||
|
||||
![Illustration for web browser running in Ubuntu Linux][1]
|
||||
|
||||
Every browser offers something unique. And, when it comes to the Linux platform, there are some interesting exclusive choices as well.
|
||||
|
||||
_**Before you see this list, please note that it is not a ranking list. The browser listed at number 1 should not be considered better than the ones at 2, 3 or 10.**_
|
||||
|
||||
Non-FOSS alert!
|
||||
|
||||
Some applications mentioned here are not open source. They are listed here because they are available on Linux and the article’s focus is on Linux. We have a separate [dedicated list of open source web browsers][2] as well.
|
||||
|
||||
### 1\. Vivaldi
|
||||
|
||||
![][3]
|
||||
|
||||
**Pros**
|
||||
|
||||
* Sidebar for quick web application access
|
||||
* Calendar and Email integration
|
||||
* Unique tab management
|
||||
* Pomodoro feature
|
||||
* Mobile app available
|
||||
|
||||
|
||||
|
||||
**Cons**
|
||||
|
||||
* Resource-heavy when using a variety of features
|
||||
* Not 100% open-source
|
||||
|
||||
|
||||
|
||||
Vivaldi is an impressive browser that has been getting more attention from Linux users more than ever.
|
||||
|
||||
While it is not 100% open-source, you can find most of its source code (except for its UI) online.
|
||||
|
||||
With [Vivaldi 4.0 release][4], they have been focusing more on improving the experience for Linux users. You can set clock timers to increase your work productivity, use the built-in translation for web pages, track your calendar, add shortcuts to web applications, and multi-task at its peak with this browser.
|
||||
|
||||
Even though it is a fast web browser, I wouldn’t bet on it as the “fastest” or lightest. You need a good amount of memory (RAM) to make use of all the features while you work on stuff.
|
||||
|
||||
Overall, it is a feature-rich web browser. So, if you need something with as many as features possible to multi-task, Vivaldi can be your choice.
|
||||
|
||||
[Vivaldi][5]
|
||||
|
||||
#### How to Install Vivaldi on Linux?
|
||||
|
||||
Vivaldi offers both **.deb** and **.rpm** packages to let you directly install it in your Linux system.
|
||||
|
||||
You can refer to our resources to [install Deb files][6] and [install RPM files][7] in case you are new to Linux.
|
||||
|
||||
### 2\. Mozilla Firefox
|
||||
|
||||
![][8]
|
||||
|
||||
**Pros**
|
||||
|
||||
* Privacy protection
|
||||
* Not based on Chrome engine
|
||||
* Open Source
|
||||
* Firefox Account services
|
||||
|
||||
|
||||
|
||||
**Cons**
|
||||
|
||||
* User Experience changes with major updates
|
||||
|
||||
|
||||
|
||||
Firefox is the default web browser for most Linux distributions. Hence, it is an obvious choice to start with.
|
||||
|
||||
In addition to being open-source, it offers some of the best privacy protection features. And, with the right settings, you can turn it into one of the most secure browsers similar to Tor Browser (which is also based on Firefox).
|
||||
|
||||
Not just limited to its security, but Firefox also offers useful integrated features like Pocket (to save web pages and read later), VPN, email alias, breach monitor, and more when you sign in with your Firefox account.
|
||||
|
||||
[Firefox][9]
|
||||
|
||||
#### How to Install Firefox on Linux?
|
||||
|
||||
It should already come pre-installed in your Linux distribution. But, if it is not present, you can search for it in the software center or install it using the terminal with the following command:
|
||||
|
||||
```
|
||||
sudo apt install firefox
|
||||
```
|
||||
|
||||
### 3\. Chromium
|
||||
|
||||
![][10]
|
||||
|
||||
**Pros**
|
||||
|
||||
* Open Source Chrome alternative
|
||||
* Similar features to Google Chrome
|
||||
|
||||
|
||||
|
||||
**Cons**
|
||||
|
||||
* Lacks certain features that Google Chrome offers
|
||||
|
||||
|
||||
|
||||
Chromium is the open-source alternative and the base for Google Chrome and many other chrome-based browsers.
|
||||
|
||||
If you do not want to use Google Chrome, chromium’s your best bet to get the same experience on Linux.
|
||||
|
||||
Even though Google controls Chromium and [has been locking down Chrome][11], it is a good option for Linux systems.
|
||||
|
||||
[Chromium][12]
|
||||
|
||||
#### How to Install Chromium on Linux?
|
||||
|
||||
You should be able to find it easily in the software center. But, if you need help, refer to our [installation guide for Chromium][13].
|
||||
|
||||
### 4\. Google Chrome
|
||||
|
||||
![][14]
|
||||
|
||||
**Pros**
|
||||
|
||||
* Seamless integration with Google services
|
||||
|
||||
|
||||
|
||||
**Cons**
|
||||
|
||||
* Not open-source
|
||||
|
||||
|
||||
|
||||
Google Chrome is an excellent web browser unless you do not want to opt for a proprietary solution or products by Google.
|
||||
|
||||
You get all the essential features and the ability to integrate all Google services. If you prefer using Google Chrome on Android and want to sync across multiple platforms, it is an obvious choice for desktop Linux.
|
||||
|
||||
If you were looking for a simple and capable web browser while using Google services, Google Chrome can be a great pick.
|
||||
|
||||
[Google Chrome][15]
|
||||
|
||||
#### How to Install Google Chrome on Linux?
|
||||
|
||||
Google Chrome offers both Deb and RPM packages to let you install on any Ubuntu-based or Fedora/openSUSE distribution.
|
||||
|
||||
If you need help with the installation, I should point you to our guide on [installing Google Chrome on Linux][16].
|
||||
|
||||
### 5\. Brave Browser
|
||||
|
||||
![][17]
|
||||
|
||||
**Pros**
|
||||
|
||||
* Privacy protection features
|
||||
* Performance
|
||||
|
||||
|
||||
|
||||
**Cons**
|
||||
|
||||
* No account-based sync
|
||||
|
||||
|
||||
|
||||
Brrave browser is one of the most popular Linux browsers.
|
||||
|
||||
It is an open-source project and is based on chromium. It offers several useful privacy protection features and is known for its blazing fast performance.
|
||||
|
||||
Unlike any other browsers, you can get rewards even if you block advertisements on websites. The rewards you collect can only be used to give back to your favorite websites. This way, you get to block ads and also support the website.
|
||||
|
||||
You can expect a faster user experience with minimum resource usage.
|
||||
|
||||
We also have a detailed [comparison article on Brave vs Firefox][18], if you need to decide between the two.
|
||||
|
||||
Brave
|
||||
|
||||
#### How to Install Brave on Linux?
|
||||
|
||||
Unlike some other web browsers, you cannot directly find a package or in the software center. You need to enter some commands in the terminal to install the browser.
|
||||
|
||||
Fret not, you can follow our [instructions to install brave browser][19] to proceed.
|
||||
|
||||
### 6\. Opera
|
||||
|
||||
![][20]
|
||||
|
||||
**Pros**
|
||||
|
||||
* Free VPN in-built
|
||||
* Extra features
|
||||
|
||||
|
||||
|
||||
**Cons**
|
||||
|
||||
* Not open source
|
||||
|
||||
|
||||
|
||||
While Opera is not the most popular choice, it is definitely a useful browser for Linux users.
|
||||
|
||||
It comes with a built-in VPN and adblocker. So, you should have the basic privacy protection sorted with the help of the Opera web browser.
|
||||
|
||||
You can quickly access popular chat messengers right from the sidebar without needing to launch a separate app or window. This is similar to Vivaldi considering the side chat messenger web apps but the user experience is significantly different.
|
||||
|
||||
Overall, it is a good pick if you want a free VPN as an added bonus to other essential browsing features.
|
||||
|
||||
It is worth noting that Opera offers a unique [Opera GX][21] browser which lets you tweak/enforce limit on system resources when using a browser along with gaming activities. This was still in development for Linux at the time of writing, if it is available by the time you read it, that could be a fantastic option!
|
||||
|
||||
[Opera][22]
|
||||
|
||||
#### How to Install Opera?
|
||||
|
||||
Opera provides Deb package for Linux. You just head to its official website to download and install it.
|
||||
|
||||
### 7\. Microsoft Edge
|
||||
|
||||
![][23]
|
||||
|
||||
**Pros**
|
||||
|
||||
* Convenient option for Windows users who also use Linux
|
||||
|
||||
|
||||
|
||||
**Cons**
|
||||
|
||||
* Not open-source
|
||||
* Still in Beta
|
||||
|
||||
|
||||
|
||||
Microsoft Edge has surpassed Mozilla Firefox in terms of its popularity. Not just because it’s the default Windows browser, but it also offers a promising web experience while based on Chrome.
|
||||
|
||||
At the time of writing this article, Microsoft Edge is available as a beta release for Linux. It works fine at the moment, but lacks quite a few features normally available for Windows.
|
||||
|
||||
Overall, you should find most of the essential features available.
|
||||
|
||||
If you use Windows and Linux as your desktop platforms, Microsoft Edge can come in handy as the preferred web browser.
|
||||
|
||||
[Microsoft Edge][24]
|
||||
|
||||
#### How to install Microsoft Edge on Linux?
|
||||
|
||||
It is currently available through Microsoft Insiders channel as a beta. So, this could change once the stable release is out.
|
||||
|
||||
For now, you can get the Deb/RPM file through the Microsoft Edge insiders web page and install it.
|
||||
|
||||
You can also have a look at our how-to article on [installing Microsoft Edge on Linux][25].
|
||||
|
||||
### Unique Web Browsers for Linux
|
||||
|
||||
Most of the users prefer to stick with the mainstream options because of security updates and future upgrades, but there are some different options as well. And, some exclusive to Linux users.
|
||||
|
||||
### 8\. GNOME Web or Epiphany
|
||||
|
||||
![][26]
|
||||
|
||||
**Pros**
|
||||
|
||||
* Minimal
|
||||
* Open Source
|
||||
|
||||
|
||||
|
||||
**Cons**
|
||||
|
||||
* Lacks many features
|
||||
* No cross-platform support
|
||||
|
||||
|
||||
|
||||
Epiphany browser is the default GNOME browser. elementary OS utilizes it as its default web browser.
|
||||
|
||||
It is a minimal browser that offers a clean and elegant user experience. You cannot sync your bookmarks or history, so you need to manually export them if you want to back them up or transfer to another browser.
|
||||
|
||||
[GNOME Web][27]
|
||||
|
||||
#### How to Install GNOME Web?
|
||||
|
||||
You may find it pre-installed in some Linux distros. If not, you can check out its [Flatpak package][28] to install the latest version on any Linux distro.
|
||||
|
||||
### 9\. Falkon
|
||||
|
||||
![][29]
|
||||
|
||||
**Pros**
|
||||
|
||||
* Firefox-based alternative
|
||||
|
||||
|
||||
|
||||
**Cons**
|
||||
|
||||
* Not a replacement to Firefox
|
||||
* No cross-platform support
|
||||
|
||||
|
||||
|
||||
Falkon is a Firefox-based browser with privacy in mind. It should be good enough for basic web browsing, but it may not be a solution for your daily driver.
|
||||
|
||||
You can explore more about it and get the installation instructions in our dedicated [article on Falkon browser][30].
|
||||
|
||||
[Falkon][31]
|
||||
|
||||
### 10\. Nyxt
|
||||
|
||||
![][32]
|
||||
|
||||
**Pros**
|
||||
|
||||
* Highly customizable
|
||||
* Keyboard use focused
|
||||
|
||||
|
||||
|
||||
**Cons**
|
||||
|
||||
* Suitable for certain users
|
||||
* Lack of cross-platform support
|
||||
|
||||
|
||||
|
||||
Nyxt is an interesting web browser built for power keyboard users. You can browse and navigate the web using keyboard shortcuts.
|
||||
|
||||
To know more about it and the installation instructions, go through our detailed article on [Nyxt browser][33].
|
||||
|
||||
Nyxt
|
||||
|
||||
### Wrapping Up
|
||||
|
||||
When it comes to Linux, you get a variety of choices available to pick. I have deliberately skipped [command line based web browsers like Lynx][34] here.
|
||||
|
||||
So, what would be your selection for the best web browser?
|
||||
|
||||
Moreover, I’d be curious to know what do you look for when installing a web browser for your system?
|
||||
|
||||
Feel free to share your thoughts in the comments below.
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://itsfoss.com/best-browsers-ubuntu-linux/
|
||||
|
||||
作者:[Ankush Das][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[译者ID](https://github.com/译者ID)
|
||||
校对:[校对者ID](https://github.com/校对者ID)
|
||||
|
||||
本文由 [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/09/web-browser-ubuntu.png?resize=800%2C450&ssl=1
|
||||
[2]: https://itsfoss.com/open-source-browsers-linux/
|
||||
[3]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/08/vivaldi-screenshot.png?resize=800%2C502&ssl=1
|
||||
[4]: https://news.itsfoss.com/vivaldi-4-0-release/
|
||||
[5]: https://vivaldi.com
|
||||
[6]: https://itsfoss.com/install-deb-files-ubuntu/
|
||||
[7]: https://itsfoss.com/install-rpm-files-fedora/
|
||||
[8]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/08/firefox-proton.png?resize=800%2C450&ssl=1
|
||||
[9]: https://www.mozilla.org/en-US/firefox/new/
|
||||
[10]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/08/chromium-screenshot.png?resize=800%2C558&ssl=1
|
||||
[11]: https://news.itsfoss.com/is-google-locking-down-chrome/
|
||||
[12]: https://www.chromium.org
|
||||
[13]: https://itsfoss.com/install-chromium-ubuntu/
|
||||
[14]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/08/google-chrome-screenshot.png?resize=800%2C557&ssl=1
|
||||
[15]: https://www.google.com/chrome/
|
||||
[16]: https://itsfoss.com/install-chrome-ubuntu/
|
||||
[17]: https://i2.wp.com/itsfoss.com/wp-content/uploads/2021/07/brave-ui-new.jpg?resize=800%2C450&ssl=1
|
||||
[18]: https://itsfoss.com/brave-vs-firefox/
|
||||
[19]: https://itsfoss.com/brave-web-browser/
|
||||
[20]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/08/opera-screenshot.png?resize=800%2C543&ssl=1
|
||||
[21]: https://www.opera.com/gx
|
||||
[22]: https://www.opera.com/
|
||||
[23]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2021/04/microsoft-edge-on-linux.png?resize=800%2C439&ssl=1
|
||||
[24]: https://www.microsoftedgeinsider.com/en-us/
|
||||
[25]: https://itsfoss.com/microsoft-edge-linux/
|
||||
[26]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/08/gnome-web.png?resize=800%2C450&ssl=1
|
||||
[27]: https://apps.gnome.org/en-GB/app/org.gnome.Epiphany/
|
||||
[28]: https://flathub.org/apps/details/org.gnome.Epiphany
|
||||
[29]: https://i0.wp.com/itsfoss.com/wp-content/uploads/2019/12/falkon-browser-1.png?resize=800%2C450&ssl=1
|
||||
[30]: https://itsfoss.com/falkon-browser/
|
||||
[31]: https://www.falkon.org
|
||||
[32]: https://i1.wp.com/itsfoss.com/wp-content/uploads/2021/05/nyxt-browser-settings.png?resize=800%2C617&ssl=1
|
||||
[33]: https://itsfoss.com/nyxt-browser/
|
||||
[34]: https://itsfoss.com/terminal-web-browsers/
|
@ -7,34 +7,34 @@
|
||||
[#]: publisher: " "
|
||||
[#]: url: " "
|
||||
|
||||
How to Download Audio Only Using youtube-dl
|
||||
如何使用 youtube-dl 只下载音频
|
||||
======
|
||||
|
||||
[youtube-dl][1] is a versatile command line tool for downloading videos from YouTube and many other websites. I use it for making back up of my own YouTube videos.
|
||||
[youtube-dl][1] 是一个多功能的命令行工具,用于从 YouTube 和许多其他网站下载视频。我用它来做我自己的 YouTube 视频的备份。
|
||||
|
||||
By default, you [use youtube-dl for downloading videos][2]. How about extracting only the audio with youtubde-dl? That’s very simple actually. Let me show you the steps.
|
||||
默认情况下,你[使用 youtube-dl 下载视频][2]。用 youtube-dl 只提取音频怎么样? 其实很简单。让我告诉你步骤。
|
||||
|
||||
Attention
|
||||
注意
|
||||
|
||||
Downloading videos from websites could be against their policies. It’s up to you if you choose to download videos or audio.
|
||||
从网站下载视频可能违反他们的政策。这取决于你是否选择下载视频或音频。
|
||||
|
||||
### Download only audio with youtube-dl
|
||||
### 使用 youtube-dl 只下载音频
|
||||
|
||||
Please make sure that you have installed youtube-dl on your Linux distribution first.
|
||||
请确保你已经在你的 Linux 发行版上安装了 youtube-dl。
|
||||
|
||||
```
|
||||
sudo snap install youtube-dl
|
||||
```
|
||||
|
||||
If you only want to download audio from a YouTube video, you can use the -x option with youtube-dl. This extract-audio option converts the video files to audio-only files.
|
||||
如果你只想从 YouTube 视频中下载音频,你可以使用 youtube-dl 的 -x 选项。这个提取音频的选项将视频文件转换为纯音频文件。
|
||||
|
||||
```
|
||||
youtube-dl -x video_URL
|
||||
```
|
||||
|
||||
The file is saved in the same directory from where you ran the youtube-dl command.
|
||||
该文件被保存在你运行 youtube-dl 命令的同一目录下。
|
||||
|
||||
Here’s an example where I downloaded the voice-over of our Zorin OS 16 review video.
|
||||
这是我下载 Zorin OS 16 评论视频的画外音的示例。
|
||||
|
||||
```
|
||||
youtube-dl -x https://www.youtube.com/watch?v=m_PmLG7HqbQ
|
||||
@ -45,15 +45,15 @@ youtube-dl -x https://www.youtube.com/watch?v=m_PmLG7HqbQ
|
||||
[ffmpeg] Post-process file Zorin OS 16 Review - It's a Visual Masterpiece-m_PmLG7HqbQ.m4a exists, skipping
|
||||
```
|
||||
|
||||
Did you notice the audio format? It is in .m4a format. You may specify the audio format to something of your choice.
|
||||
你注意到音频格式了吗?它是 .m4a 格式。你可以把音频格式指定为你所选择的格式。
|
||||
|
||||
Say you want to extract the audio in MP3 format. You can use it like this:
|
||||
比如你想提取 MP3 格式的音频。你可以像这样使用它:
|
||||
|
||||
```
|
||||
youtube-dl -x --audio-format mp3 video_URL
|
||||
```
|
||||
|
||||
Here’s the same example I showed previously. You can see that it [uses ffmpeg to convert][3] the m4a file into mp3.
|
||||
下面是我之前展示的同一个例子。你可以看到它[使用 ffmpeg 转换][3] m4a 文件为 mp3:
|
||||
|
||||
```
|
||||
youtube-dl -x --audio-format mp3 https://www.youtube.com/watch?v=m_PmLG7HqbQ
|
||||
@ -65,33 +65,33 @@ youtube-dl -x --audio-format mp3 https://www.youtube.com/watch?v=m_PmLG7HqbQ
|
||||
Deleting original file Zorin OS 16 Review - It's a Visual Masterpiece-m_PmLG7HqbQ.m4a (pass -k to keep)
|
||||
```
|
||||
|
||||
### Download entire YouTube playlist in MP3 format
|
||||
### 以 MP3 格式下载整个 YouTube 播放列表
|
||||
|
||||
Yes, you can totally do that. The main thing is to get the URL of the playlist here. It is typically in the following format:
|
||||
是的,你完全可以这样做。最主要的是要在这里得到播放列表的 URL。它通常是以下格式:
|
||||
|
||||
```
|
||||
https://www.youtube.com/playlist?list=XXXXXXXXXXXXXXXXXXX
|
||||
```
|
||||
|
||||
To get the URL of a playlist, click on its name when the playlist is being displayed in the right sidebar.
|
||||
要获得一个播放列表的 URL,当播放列表显示在右边栏时,点击其名称。
|
||||
|
||||
![Click on the playlist title][4]
|
||||
|
||||
It will take you to the playlist page and you can copy the URL here.
|
||||
它将带你到播放列表页面,你可以在这里复制 URL。
|
||||
|
||||
![Grab the playlist URL][5]
|
||||
|
||||
Now that you have the playlist URL, you can use it to download the audio files in MP3 format in the following fashion:
|
||||
现在你有了播放列表的 URL,你可以用它来下载 MP3 格式的音频文件,方法如下:
|
||||
|
||||
```
|
||||
youtube-dl --extract-audio --audio-format mp3 -o "%(title)s.%(ext)s" playlist_URL
|
||||
```
|
||||
|
||||
That scary looking `-o "%(title)s.%(ext)s"` specifies the output file (with option -o) and instructs it to use the title of the video and the extension (mp3 in this case) for naming the audio files.
|
||||
那个看起来很可怕的 `-o "%(title)s.%(ext)s"` 指定了输出文件(带选项 -o),并指示它使用视频的标题和扩展名(本例为 mp3)来命名音频文件。
|
||||
|
||||
![][6]
|
||||
|
||||
I hope you find this quick tip helpful. Enjoy the audio files :)
|
||||
我希望你觉得这个技巧对你有帮助。享受音频文件吧 :)
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
@ -99,7 +99,7 @@ via: https://itsfoss.com/youtube-dl-audio-only/
|
||||
|
||||
作者:[Abhishek Prakash][a]
|
||||
选题:[lujun9972][b]
|
||||
译者:[译者ID](https://github.com/译者ID)
|
||||
译者:[geekpi](https://github.com/geekpi)
|
||||
校对:[校对者ID](https://github.com/校对者ID)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
Loading…
Reference in New Issue
Block a user