分类 技术 下的文章

通过为流行的代码编辑器编写自己的扩展来添加缺失的功能。

Visual Studio Code(VS Code)是微软为 Linux、Windows 和 macOS 创建的跨平台代码编辑器。遗憾的是,微软版本的 VS Code 是在 Microsoft Software License 下发布的,这不是一个开源的许可证。然而,它的源代码是开源的,在 MIT 许可证下由 VSCodium 项目发布。

VSCodium 和 VS Code一样,支持扩展、内嵌式 Git 控制、GitHub 集成、语法高亮、调试、智能代码补完、代码片段等。换句话说,对于大多数用户来说,使用 VS Code 和 VSCodium 没有什么区别,而且后者是完全开源的!

什么是 VS Code 扩展?

扩展 extension 可以让你为 VS Code 或 VSCodium 添加功能。你可以在 GUI 中或从终端安装扩展。

你也可以构建自己的扩展。有几个你可能想学习如何构建扩展的原因:

  1. 想要添加一些功能: 如果缺失你想要的功能,你可以创建一个扩展来添加它。
  2. 为了乐趣和学习: 扩展 API 允许你探索 VSCodium 是如何工作的,这是一件有趣的事情。
  3. 为了提高您的技能: 创建扩展可以提高你的编程技能。
  4. 为了成名: 创建一个对他人有用的扩展可以提高你的公众形象。

安装工具

在你开始之前,你必须已经安装了 Node.jsnpm 和 VS Code 或 VSCodium

要生成一个扩展,你还需要以下工具:Yeoman,是一个开源的客户端脚手架工具,可以帮助你搭建新项目;以及 vscode-generator-code,是 VS Code 团队创建的 Yeoman 生成器。

构建一个扩展

在本教程中,你将构建一个扩展,它可以为应用程序初始化一个 Docker 镜像。

生成一个扩展骨架

要在全局范围内安装并运行 Yeoman 生成器,请在命令提示符或终端中输入以下内容:

npm install -g yo generator-code

导航到要生成扩展的文件夹,键入以下命令,然后按回车:

yo code

根据提示,你必须回答一些关于你的扩展的问题:

  • 你想创建什么类型的扩展? 使用上下箭头选择其中一个选项。在本文中,我将只介绍第一个选项,New Extension (TypeScript)
  • 你的扩展名称是什么? 输入你的扩展名称。我的叫 initdockerapp。(我相信你会有一个更好的名字。)
  • 你的扩展的标识符是什么? 请保持原样。
  • 你的扩展的描述是什么? 写一些关于你的扩展的内容(你可以现在填写或稍后编辑它)。
  • 初始化 Git 仓库? 这将初始化一个 Git 仓库,你可以稍后添加 set-remote
  • 使用哪个包管理器? 你可以选择 yarnnpm;我使用 npm

按回车键后,就会开始安装所需的依赖项。最后显示:

"Your extension initdockerapp has been created!"

干的漂亮!

检查项目的结构

检查你生成的东西和项目结构。导航到新的文件夹,并在终端中键入 cd initdockerapp

一旦你进入该目录,键入 .code。它将在你的编辑器中打开,看起来像这样。

 title=

(Hussain Ansari, CC BY-SA 4.0

最需要注意的两个文件是 src 文件夹内的 package.jsonextension.ts

package.json

首先来看看 package.json,它应该是这样的:

{
        "name": "initdockerapp",
        "displayName": "initdockerapp",
        "description": "",
        "version": "0.0.1",
        "engines": {
                "vscode": "^1.44.0"
        },
        "categories": [
                "Other"
        ],
        "activationEvents": [
                "onCommand:initdockerapp.initialize"
        ],
        "main": "./out/extension.js",
        "contributes": {
                "commands": [
                        {
                                "command": "initdockerapp.initialize",
                                "title": "Initialize A Docker Application"
                        }
                ]
        },
        "scripts": {
                "vscode:prepublish": "npm run compile",
                "compile": "tsc -p ./",
                "lint": "eslint src --ext ts",
                "watch": "tsc -watch -p ./",
                "pretest": "npm run compile && npm run lint",
                "test": "node ./out/test/runTest.js"
        },
        "devDependencies": {
                "@types/vscode": "^1.44.0",
                "@types/glob": "^7.1.1",
                "@types/mocha": "^7.0.2",
                "@types/node": "^13.11.0",
                "eslint": "^6.8.0",
                "@typescript-eslint/parser": "^2.26.0",
                "@typescript-eslint/eslint-plugin": "^2.26.0",
                "glob": "^7.1.6",
                "mocha": "^7.1.1",
                "typescript": "^3.8.3",
                "vscode-test": "^1.3.0"
        }
}
{
        "name": "initdockerapp",
        "displayName": "initdockerapp",
        "description": "",
        "version": "0.0.1",
        "engines": {
                "vscode": "^1.44.0"
        },
        "categories": [
                "Other"
        ],
        "activationEvents": [
                "onCommand:initdockerapp.initialize"
        ],
        "main": "./out/extension.js",
        "contributes": {
                "commands": [
                        {
                                "command": "initdockerapp.initialize",
                                "title": "Initialize A Docker Application"
                        }
                ]
        },
        "scripts": {
                "vscode:prepublish": "npm run compile",
                "compile": "tsc -p ./",
                "lint": "eslint src --ext ts",
                "watch": "tsc -watch -p ./",
                "pretest": "npm run compile && npm run lint",
                "test": "node ./out/test/runTest.js"
        },
        "devDependencies": {
                "@types/vscode": "^1.44.0",
                "@types/glob": "^7.1.1",
                "@types/mocha": "^7.0.2",
                "@types/node": "^13.11.0",
                "eslint": "^6.8.0",
                "@typescript-eslint/parser": "^2.26.0",
                "@typescript-eslint/eslint-plugin": "^2.26.0",
                "glob": "^7.1.6",
                "mocha": "^7.1.1",
                "typescript": "^3.8.3",
                "vscode-test": "^1.3.0"
        }
}

如果你是 Node.js 开发者,其中一些可能看起来很熟悉,因为 namedescriptionversionscripts 是 Node.js 项目的常见部分。

有几个部分是非常重要的:

  • engines:说明该扩展将支持哪个版本的 VS Code / VSCodium。
  • categories:设置扩展类型;你可以从 LanguagesSnippetsLintersThemesDebuggersFormattersKeymapsOther中选择。
  • contributes:可用于与你的扩展一起运行的命令清单。
  • main:扩展的入口点。
  • activationEvents:指定激活事件发生的时间。具体来说,这决定了扩展何时会被加载到你的编辑器中。扩展是懒加载的,所以在激活事件触发之前,它们不会被激活。

src/extension.ts

接下来看看 src/extension.ts,它应该是这样的:

// The module 'vscode' contains the VSCodium extensibility API
// Import the module and reference it with the alias vscode in your code below
import * as vscode from "vscode";
const fs = require("fs");
const path = require("path");

// this method is called when your extension is activated
// your extension is activated the very first time the command is executed
export function activate(context: vscode.ExtensionContext) {

        // Use the console to output diagnostic information (console.log) and errors (console.error)
        // This line of code will only be executed once when your extension is activated
        console.log('Congratulations, your extension "initdockerapp" is now active!');
       
        // The command has been defined in the package.json file
        // Now provide the implementation of the command with registerCommand
        // The commandId parameter must match the command field in package.json
        let disposable = vscode.commands.registerCommand('initdockerapp.initialize', () => {
                // The code you place here will be executed every time your command is executed

                let fileContent =`
                FROM node:alpine
                WORKDIR /usr/src/app

                COPY package.json .
                RUN npm install
               
                COPY . .
               
                EXPOSE 3000
                CMD ["npm", "start"]
                `;
               
                fs.writeFile(path.join(vscode.workspace.rootPath, "Dockerfile"), fileContent, (err:any) => {
                        if (err) {
                                return vscode.window.showErrorMessage("Failed to initialize docker file!");
                        }
                        vscode.window.showInformationMessage("Dockerfile has been created!");
                });
        });

        context.subscriptions.push(disposable);
}

// this method is called when your extension is deactivated
export function deactivate() {}

这是为你的扩展写代码的地方。已经有一些自动生成的代码了,我再来分析一下。

注意,vscode.command.registerCommand 里面的 initdockerapp.initializepackage.json 里面的命令是一样的。它需要两个参数。

  1. 要注册的命令名称
  2. 执行命令的功能

另一个需要注意的函数是 fs.writeFile,这是你写在 vscode.command.registerCommand 函数里面的。这将在你的项目根目录下创建一个 Dockerfile,并在其中附加代码来创建一个 Docker 镜像。

调试扩展

现在你已经写好了扩展,是时候调试它了。点击“Run”菜单,选择“Start Debugging”(或者直接按 F5)打开调试窗口。

在调试窗口里面点击“Add Folder”或“Clone Repository”按钮,打开该项目。

接下来,用 Ctrl+Shift+P(在 macOS 上,用 Command 键代替 Ctrl)打开命令面板,运行 Initialize A Docker Application

  • 第一次运行此命令时,自 VSCodium 启动后,激活函数尚未执行。因此,调用激活函数,并由激活 函数注册该命令。
  • 如果命令已注册,那么它将被执行。

你会看到右下角有一条信息,上面写着:Dockerfile has been created!。这就创建了一个 Dockerfile,里面有一些预定义的代码,看起来是这样的:

 title=

(Hussain Ansari, CC BY-SA 4.0

总结

有许多有用的 API 可以帮助你创建你想要构建的扩展。VS Code 扩展 API 还有许多其他强大的方法可以使用。

你可以在 VS Code 扩展 API 文档中了解更多关于 VS Code API 的信息。


via: https://opensource.com/article/20/6/vs-code-extension

作者:Ashique Hussain Ansari 选题:lujun9972 译者:wxy 校对:wxy

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

了解如何通过这些 Ansible 模块实现几乎任何事情。

在我成长的时候,我爷爷在他的花园里有一个棚子。他经常会花几个小时在那里制作和修复东西。这是在我们有互联网之前的事情,所以我花了很多时间看他在那个棚子里创造东西。虽然棚子里有很多工具,从钻头到车床到电器配件,还有很多东西我至今都无法辨认,但他使用的只是他手头的一小部分。然而,他能做到的事情似乎永远没有极限。

我之所以告诉你这个故事,是因为我觉得我的职业生涯是在一个隐喻的棚子里度过的。计算机也是如此多的工具,都在一个狭小(虚拟?)的空间里。而工具棚中又有工具棚 —— 我最喜欢的是 Ansible。最近的 2.9 版本有 3,681 个模块! **3,681 个啊!**当我在 2013 年夏天第一次开始使用 Ansible 时,1.2.1 版本只有 113 个模块,然而,正如我当时写的,我仍然可以实现任何我想象到的东西。

模块是 Ansible 的支柱,是让重任轻装上阵的齿轮。它们被设计为做好一项工作,从而实现了 Unix 哲学。我们就是这样来把这么多的模块捆绑在一起,作为乐团的指挥,Ansible 现在有很多乐器可以听从它的指挥。

回顾一下我多年来的 Ansible 剧本和角色的 Git 仓库,我发现我只用了 35 个模块。这个小的子集被用来构建大型基础设施。不过,我想知道如果用一个更小的子集可以实现什么?当我回顾这 35 个模块时,我在思考,我能否只用 5 个模块就能达到同样的效果。因此,以下是我最喜欢的五个模块,顺序无关。

5. authorized\_key

SSH 是 Ansible 的核心,至少对于除了 Windows 以外的几乎所有其他功能都是如此。在 Ansible 中高效使用 SSH 的关键(没有双关语)是……密钥!顺便提一下,你可以用 SSH 密钥为安全性做很多非常酷的事情。值得仔细阅读 sshd 手册页中的 “authorized\_keys” 部分。如果你需要精细的用户访问控制,管理 SSH 密钥可能会变得很费力,尽管我可以用接下来的两个我最爱的模块中的任何一个,但我更喜欢使用 authorized\_key 这个模块,因为它可以通过变量轻松管理

4. file

除了显而易见的将文件放置在某个地方的功能外,file 模块还可以设置所有权和权限。我想说的是,这样一个模块就能带来很多的好处。很大一部分安全问题也与设置权限有关,所以 file 模块和 authorized\_key 可以很好地配合在一起使用。

3. template

操作文件内容的方法太多了,我看到很多人都在使用 lineinfile。我自己也用它做过小任务。但是,template 模块就清晰多了,因为你维护了整个文件的上下文。我更喜欢以任何人都可以轻松理解的方式编写 Ansible 的内容 —— 对我而言,这意味着容易理解正在发生的事情。template 的使用意味着能够看到你正在放置内容的整个文件、全部你正在改变的变量。

2. uri

当前发布版中的许多模块利用 Ansible 作为编排工具。它们与另一个服务对话,而不是做一些具体的事情,比如把一个文件放到一个地方。通常,这种对话也是通过 HTTP 进行的。在许多这样的模块出现之前,你可以直接使用 uri 模块对 API 进行编程。它是一个强大的访问工具,可以使你能够做很多事情。在我的 Ansible 虚拟棚子里,我不会少了它。

1. shell

这是我们工具包里的王牌、瑞士军刀。如果你为如何控制其他东西而非常苦恼,别说,说就是 shell。有人会说,我们这样说是让 Ansible 成为了 Bash 脚本 —— 但是,我想说的是,这还是有点好处的,因为可以在你的剧本和角色中使用 name 参数记录下每一步。对我来说,这就像一个很大的奖励一样。早在我还在做咨询的时候,我曾经帮助一个数据库管理员(DBA)迁移到 Ansible。这位 DBA 并不喜欢改变,对改变工作方法也是推三阻四。于是,为了简化迁移到 Ansible 方式,我们在 Ansible 中使用 shell 模块调用了一些现有的数据库管理脚本。并在任务中附带了翔实的 name 声明。

通过这五个模块,你可以实现很多事情。是的,为完成特定任务而设计的模块会让你的生活更加轻松。但是,借助简单的工程设计,你几乎可以事半功倍。Ansible 开发者 Brian Coca 是这方面的大师,他的技巧和窍门讲座总是值得一看。


你觉得我喜欢的五大模块怎么样?如果你也必须限制在这么多模块,你会选择哪五个,为什么?在下面的评论中告诉我吧!


via: https://opensource.com/article/19/11/ansible-modules

作者:Mark Phillips 选题:lujun9972 译者:wxy 校对:wxy

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

与大多数 Linux 发行版一样,Fedora 并未默认安装专有的 Nvidia 驱动。

默认的开源 Nouveau 驱动 "https://en.wikipedia.org/wiki/Nouveau_(software)")在大多数情况下都可以使用,但是你可能会遇到屏幕撕裂等问题。

如果遇到此类图形/视频问题,那么可能需要在 Fedora 中安装官方专有的 Nvidia 驱动。让我告诉你如何安装。

在 Fedora 中安装 Nvidia 驱动

我在本教程中使用 Fedora 32,但它应适用于其他 Fedora 版本。

步骤 1

在做其他任何操作之前,请先确保你的系统是最新的。你可以使用软件中心,也可以在终端中使用以下命令:

`sudo dnf update`

步骤 2

由于 Fedora 没有提供 Nvidia 驱动,因此你需要在系统中添加 RPMFusion 仓库。你可以在终端中使用以下命令:

`sudo dnf install https://download1.rpmfusion.org/free/fedora/rpmfusion-free-release-$(rpm -E %fedora).noarch.rpm https://download1.rpmfusion.org/nonfree/fedora/rpmfusion-nonfree-release-$(rpm -E %fedora).noarch.rpm`

不喜欢终端么?那使用 GUI 的方法添加 RPMFusion 仓库。

如果你使用 Firefox,那么还可以从浏览器添加 RPMFusion 仓库。进入这个配置页面,然后向下滚动到 “Graphical Setup via Firefox web browser”。单击自由和非自由仓库的链接。这将下载 .rpm 文件,并安装仓库。

你可以双击下载的 RPM 文件进行安装。

步骤 3

现在,你需要确定 Linux 系统中有哪些显卡(或芯片)。打开终端并输入以下命令:

`lspci -vnn | grep VGA`

接下来,你需要查找与该芯片对应的驱动。你可以在此处找到 Nvidia 芯片的列表。你也可以使用此工具搜索设备。

注意:请记住,即使 Nvidia 列表显示了更多驱动,但也只有三个驱动可以安装。Nvidia 驱动支持最新的显卡。nvidia-390 和 nvidia-340 驱动支持旧设备。

步骤 4

要安装所需的驱动,请在终端中输入以下一个命令。下面的命令是用于我的显卡的命令。根据你的系统相应调整。

`sudo dnf install akmod-nvidia sudo dnf install xorg-x11-drv-nvidia-390xx akmod-nvidia-390xx sudo dnf install xorg-x11-drv-nvidia-340xx akmod-nvidia-340xx`

步骤 5

要使更改生效,请重启系统。你的系统重启可能需要比较长的时间,因为它将 Nvidia 驱动注入到 Linux 内核中。

重启并登录系统后,你会看到更好的视觉效果,并且不会出现屏幕撕裂的情况。

额外的提示

这是可选步骤,但建议这样做。添加 RPMFusion 仓库时,你可以访问常规仓库中不可用的多媒体包。

此命令将为使用 gstreamer 的应用安装软件包:

`sudo dnf groupupdate multimedia --setop="install_weak_deps=False" --exclude=PackageKit-gstreamer-plugin`

此命令将安装声音和视频软件包所需的包:

`sudo dnf groupupdate sound-and-video`

希望本教程对在 Fedora 上安装 Nvidia 驱动很有用。


via: https://itsfoss.com/install-nvidia-drivers-fedora/

作者:John Paul 选题:lujun9972 译者:geekpi 校对:wxy

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

符号链接是指向另一个文件的 Linux 文件。如果删除了被引用的文件,符号链接会保留,但不会显示有问题,除非你尝试使用它。以下是查找和删除指向文件已被删除的符号链接的简单方法。

符号链接 symbolic link 在 Linux 系统上扮演了非常有用的角色。它们可以帮助你记住重要文件在系统上的位置,使你更容易访问这些文件,并让你不必为了更方便访问大文件而复制它们,从而节省了大量的空间。

什么是符号链接?

通常称它们为“符号链接”或“软链接”,符号链接是非常小的文件。实际上,符号链接真正包含的是它指向的文件的名称,通常包含路径(相对于当前位置或绝对路径)。如果有个名为 ref1 的文件指向名为 /apps/refs/ref-2020 的文件,那么 ref1 的长度将为 19 个字符,即使 ref-202 文件有 2TB。如果指向 ./ref-2020,那么长度仅为 10 个字符。如果指向 ref-2020,那么只有 8 个字节。

如果你执行 vi ref1 之类的命令(其中 ref1 是符号链接的名称),你将编辑 ref1 指向的文件,而不是符号链接本身的内容。Linux 系统知道如何使用符号链接,并且可以做正确的事。同样,如果你使用诸如 catmoreheadtail 之类的命令,那么将查看引用文件的内容。

另一方面,如果删除符号链接,你将删除该链接,而不是引用的文件。再说一次,Linux 知道怎么做。符号链接使得使用和共享文件更加容易,仅此而已。

符号链接损坏时

当一个符号链接所指向的文件从系统中删除或重新命名时,符号链接将不再起作用。符号链接只不过是存储在某个特定目录中的引用而已,它不会随着指向它的文件发生变化而更新或删除。它一直指向被引用的文件,即使这个文件早已消失。

如果你尝试使用指向一个不存在的文件的符号链接,那么将出现如下错误:

$ tail whassup
tail: cannot open 'whassup' for reading: No such file or directory

如果你尝试访问指向自身的符号链接(是的,奇怪的事情发生了),你将看到类似以下的内容:

$ cat loopy
cat: loopy: Too many levels of symbolic links
$ ls -l loopy
lrwxrwxrwx 1 shs shs 5 May 28 18:07 loopy -> loopy

而且,如果(上面的)长列表的第一个字母没有引起你的注意,这表示该文件是符号链接。rwxrwxrwx 权限是标准权限,并不反映符号链接指向的文件的权限。

查找损坏的符号链接

find 命令有一个选项,能让你找到指向不再存在的文件的符号链接。此命令列出当前目录中的符号链接:

$ find . -type l

l (小写字母 L)告诉 find 命令查找符号链接。

另一方面,下面的命令在当前目录中查找指向不存在的文件的符号链接:

$ find . -xtype l

为了避免在该命令尝试查找你无权检查的文件或目录时发生错误,你可以将所有错误输出到 /dev/null,如下所示:

$ find . -xtype l 2>/dev/null

你也可以使用此命令找到损坏的符号链接。它比前面的更长,但做的是同样的事情:

$ find . -type l ! -exec test -e {} \; -print 2>/dev/null

如何处理损坏的符号链接

除非你知道符号链接引用的文件会被替换,否则最好的方法是直接删除损坏的链接。实际上,如果需要,你可以使用一条命令查找并删除损坏的符号链接,如:

$ find . -xtype l 2>/dev/null -exec rm {} \;

该命令的 rm {} 部分会变成“删除文件”的命令

如果你想将符号链接与不同的文件相关联,你必须先删除该符号链接,然后重新创建它,使其指向新文件。这是一个例子:

$ rm ref1
$ ln -s /apps/data/newfile ref1

总结

符号链接使引用的文件更易于查找和使用,但有时它会比那些宣传去年已经关闭的餐馆的路标还过分。find 命令可以帮助你摆脱损坏的符号链接,或者提醒你没有你可能仍然需要的文件。


via: https://www.networkworld.com/article/3546252/how-to-find-and-remove-broken-symlinks-on-linux.html

作者:Sandra Henry-Stocker 选题:lujun9972 译者:geekpi 校对:wxy

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

Ubuntu 20.04 LTS 版本发布了。这对 Linux Mint 用户来说也是一个好消息。一个新的 Ubuntu LTS 版本意味着新的 Linux Mint 主要版本也将很快随之出现。

为什么这么说呢?因为 Linux Mint 是基于 Ubuntu 的长期支持(LTS)版本的。Mint 18 系列是基于 Ubuntu 16.04 LTS,Mint 19 是基于 Ubuntu 18.04 LTS 等等。

与 Ubuntu 不同,Linux Mint 没有固定的发布时间表。根据以往的趋势,我可以做出一个明智的猜测,Linux Mint 20 应该会在今年 6 月发布。

Linux Mint 20 “Ulyana” 即将推出的新功能

让我们来看看代号为 Ulyana 的 Linux Mint 20 中提出的一些主要新功能和变化。

1. 提高 Nemo 文件管理器的性能

Nemo 文件管理器计划中的性能改进之一是它处理缩略图的方式。你可能还没有意识到,但缩略图的生成需要相当多的系统资源(以及磁盘空间)。试着打开一个有几千张图片的文件夹,你会发现 CPU 的消耗会上升。

在 Linux Mint 20 中,其目标是优先考虑内容和导航,并尽可能地延迟缩略图的渲染。这意味着在缩略图渲染之前,文件夹的内容会以通用图标显示出来。这不会让人觉得赏心悦目,但你会注意到性能的改善。

2. 两种焕然一新的颜色变体

默认情况下,Linux Mint 是绿色/薄荷色的风格。还有一些其它的颜色点缀。Linux Mint 20 新添加了两种可爱的的粉红色和青蓝色。

这里是新的粉红色风格:

以及新的青蓝色风格:

3. 没有过度偏重于 Snap 包

Ubuntu 20.04 将 snap 包的优先级放在了通常的 apt 包之前。事实上,如果你在 Ubuntu 20.04 中使用 apt 命令安装 Chromium 浏览器时,它会自动安装 snap 版本。

Linux Mint 团队显然对此不满意,他们确认 Mint 20 将不会安装 snaps 或 snapd。它还将禁止 apt 使用 snapd。

你仍然可以自己手动安装 snap 包。只是不会由 apt 来安装它们。

4. 有了这个新工具,跨网络共享文件变得很简单。

Linux Mint 20 将提供一个新的 GUI 工具,可以轻松地在本地网络上共享文件,而无需任何额外的配置。

5. 更好地整合了 Electron 应用程序的桌面

Electron 是一个开源框架,它允许使用 Web 技术构建跨平台的桌面应用程序。有些人称它为懒惰的方法,因为应用程序运行在 Chromium 浏览器之上。然而,这可以让开发人员轻松地将他们的应用程序提供给 Linux(和 macOS)。Linux 上的 Slack 就是众多这样的例子之一。

Linux Mint 20 将对 Electron 应用提供更好的支持,并改进系统托盘和桌面通知的集成。

6. 改进的支持多显示器的比例缩放功能

一个提议的改变是在 Linux Mint 20 中加入支持多显示器的比例缩放功能。如果你有一个 HiDPI 和非 HiDPI 显示器的组合,你可以为它们每一个选择不同的分辨率、刷新率和不同的分数缩放。

在 Mint 20 的登录屏幕,可以让你跨多个显示器拉伸显示背景。

7. 改进对 Nvidia Optimus 的支持

在 Mint 20 中,Nvidia prime 小程序会显示 GPU 渲染器。你也可以直接从系统托盘中的菜单中选择切换到哪块卡。

你也可以使用 Nvidia “On-Demand” 模式。在这种模式下,将使用英特尔卡来渲染会话。而如视频播放器或视频编辑器这样的兼容应用程序可以在应用程序菜单中打开时使用 Nvidia GPU。

8. 不再支持 32 位

虽然 Ubuntu 18.04 在两年前就放弃了 32 位 ISO,但 Linux Mint 19 系列一直提供 32 位 ISO 的下载和安装。

这种情况在 Linux Mint 20 中有所改变。Linux Mint 20 已经没有 32 位版本了。这是因为 32 位支持从 Ubuntu 20.04 中完全消失了。

还有什么?

Cinnamon 4.6 桌面版的发布带来了很多视觉上的变化。

在 Ubuntu 20.04 中,应该会有一些“引擎盖下”的变化,比如 Linux Kernel 5.4,取消了 Python 2 的支持,加入 Wireguard VPN 等。

随着开发的进展,我会在本文中更新更多的功能。敬请期待。


via: https://itsfoss.com/linux-mint-20/

作者:Abhishek Prakash 选题:lujun9972 译者:wxy 校对:wxy

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

本教程教你如何在 Linux 系统上以 exFAT 格式格式化 USB 盘。同时包括 GUI 和命令行两种方法。

长期以来,FAT 是用于格式化磁盘文件系统的默认选择。它与几乎所有主要操作系统兼容。

FAT 文件系统的一个主要问题是你不能传输大于 4GB 的文件。这意味着即使你的 USB 盘有 32GB 的可用空间,如果你尝试传输 ISO 镜像或其他大于 4GB 的文件,传输也会失败。

这会在 Linux 中创建 Windows 的可启动 USB 盘的情况下造成问题。你不能使用 NTFS,并且 FAT 文件系统有 4GB 的大小限制。

为了克服 FAT 文件系统的限制,微软推出了 exFAT 文件系统。在本教程中,我将向你展示如何使用 exFAT 文件系统中格式化 USB 盘。

先决条件

Linux kernel 5.4 开始,Linux 内核本身中启用了 exFAT 文件系统支持。检查正在运行的 Linux 内核版本。如果是内核 5.4 或更高版本,那么应该没问题。

不然,你必须启用 exFAT 支持。在基于 Ubuntu 的发行版中,你可以安装以下软件包:

sudo apt install exfat-fuse exfat-utils

方法 1:使用 GNOME 磁盘工具将磁盘格式化为 exFAT

使用 “GNOME 磁盘” 格式化驱动器是一项简单的工作。它预装在许多 Linux 发行版中。

插入外部 USB 盘。在菜单中查找 “Disk”,然后打开 “GNOME 磁盘” 应用。第一步,选择要格式化的驱动器,然后按照我的步骤操作。

警告:请注意你要选择格式化的磁盘。请勿意外格式化主磁盘。

诸如 Ext4、NTFS、FAT 之类的常用文件系统将首先出现。要使用 exFAT,请选择 “其它”,然后单击 “下一步”。

最后一步:在此页面上选择 exFAT 文件系统,然后单击 “创建”。完成了!

看到在 Linux 中以图形方式创建 exFAT 磁盘有多么容易了吧?现在,让我向你展示终端方法。

方法 2:在 Linux 命令行中将磁盘格式化为 exFAT(适用于高级用户)

fdisk 是一个交互式命令行程序,它可在硬盘上创建和操作分区表和分区。实际上,它被认为是 Linux 最佳分区工具之一。

插入外部硬盘,然后在终端中输入以下命令:

sudo fdisk -l

这将列出计算机中的所有硬盘和分区。识别出要在外部硬盘上格式化的分区。应该会提示磁盘大小。对我而言,USB 盘被标记为 /dev/sdb1

识别出 USB 盘后,请使用以下命令将它格式化为 exfat。将 /dev/sdXn 替换为你的磁盘 ID。LABEL 是你要为磁盘命名的名称,例如 DataMyUSB 等。

sudo mkfs.exfat -n LABEL /dev/sdXn

可选地,运行 fsck 检查,以确保格式化正确。

sudo fsck.exfat /dev/sdXn

就是这样。享受 exFAT 盘吧。

你是否成功创建了exFAT 盘?

我希望你觉得本教程足够简单,并建立坚实的分区知识基础的第一步。

从长远来看,有时简单易用的技巧将让你拥有一个更好的 Linux。


via: https://itsfoss.com/format-exfat-linux/

作者:Dimitrios Savvopoulos 选题:lujun9972 译者:geekpi 校对:wxy

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