2018年10月

iptables 是一款控制系统进出流量的强大配置工具。

现代 Linux 内核带有一个叫 Netfilter 的数据包过滤框架。Netfilter 提供了允许、丢弃以及修改等操作来控制进出系统的流量数据包。基于 Netfilter 框架的用户层命令行工具 iptables 提供了强大的防火墙配置功能,允许你添加规则来构建防火墙策略。iptables 丰富复杂的功能以及其巴洛克式命令语法可能让人难以驾驭。我们就来探讨一下其中的一些功能,提供一些系统管理员解决某些问题需要的使用技巧。

避免封锁自己

应用场景:假设你将对公司服务器上的防火墙规则进行修改,你需要避免封锁你自己以及其他同事的情况(这将会带来一定时间和金钱的损失,也许一旦发生马上就有部门打电话找你了)

技巧 #1: 开始之前先备份一下 iptables 配置文件。

用如下命令备份配置文件:

/sbin/iptables-save > /root/iptables-works

技巧 #2: 更妥当的做法,给文件加上时间戳。

用如下命令加时间戳:

/sbin/iptables-save > /root/iptables-works-`date +%F`

然后你就可以生成如下名字的文件:

/root/iptables-works-2018-09-11

这样万一使得系统不工作了,你也可以很快的利用备份文件恢复原状:

/sbin/iptables-restore < /root/iptables-works-2018-09-11

技巧 #3: 每次创建 iptables 配置文件副本时,都创建一个指向最新的文件的链接。

ln –s /root/iptables-works-`date +%F` /root/iptables-works-latest

技巧 #4: 将特定规则放在策略顶部,底部放置通用规则。

避免在策略顶部使用如下的一些通用规则:

iptables -A INPUT -p tcp --dport 22 -j DROP

你在规则中指定的条件越多,封锁自己的可能性就越小。不要使用上面非常通用的规则,而是使用如下的规则:

iptables -A INPUT -p tcp --dport 22 –s 10.0.0.0/8 –d 192.168.100.101 -j DROP

此规则表示在 INPUT 链尾追加一条新规则,将源地址为 10.0.0.0/8、 目的地址是 192.168.100.101、目的端口号是 22--dport 22 ) 的 TCP(-p tcp )数据包通通丢弃掉。

还有很多方法可以设置更具体的规则。例如,使用 -i eth0 将会限制这条规则作用于 eth0 网卡,对 eth1 网卡则不生效。

技巧 #5: 在策略规则顶部将你的 IP 列入白名单。

这是一个有效地避免封锁自己的设置:

iptables -I INPUT -s <your IP> -j ACCEPT

你需要将该规则添加到策略首位置。-I 表示则策略首部插入规则,-A 表示在策略尾部追加规则。

技巧 #6: 理解现有策略中的所有规则。

不犯错就已经成功了一半。如果你了解 iptables 策略背后的工作原理,使用起来更为得心应手。如果有必要,可以绘制流程图来理清数据包的走向。还要记住:策略的预期效果和实际效果可能完全是两回事。

设置防火墙策略

应用场景:你希望给工作站配置具有限制性策略的防火墙。

技巧 #1: 设置默认规则为丢弃

# Set a default policy of DROP
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT DROP [0:0]

技巧 #2: 将用户完成工作所需的最少量服务设置为允许

该策略需要允许工作站能通过 DHCP(-p udp --dport 67:68 -sport 67:68)来获取 IP 地址、子网掩码以及其他一些信息。对于远程操作,需要允许 SSH 服务(-dport 22),邮件服务(--dport 25),DNS 服务(--dport 53),ping 功能(-p icmp),NTP 服务(--dport 123 --sport 123)以及 HTTP 服务(-dport 80)和 HTTPS 服务(--dport 443)。

# Set a default policy of DROP
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT DROP [0:0]

# Accept any related or established connections
-I INPUT  1 -m state --state RELATED,ESTABLISHED -j ACCEPT
-I OUTPUT 1 -m state --state RELATED,ESTABLISHED -j ACCEPT

# Allow all traffic on the loopback interface
-A INPUT -i lo -j ACCEPT
-A OUTPUT -o lo -j ACCEPT

# Allow outbound DHCP request
-A OUTPUT –o eth0 -p udp --dport 67:68 --sport 67:68 -j ACCEPT

# Allow inbound SSH
-A INPUT -i eth0 -p tcp -m tcp --dport 22 -m state --state NEW  -j ACCEPT

# Allow outbound email
-A OUTPUT -i eth0 -p tcp -m tcp --dport 25 -m state --state NEW  -j ACCEPT

# Outbound DNS lookups
-A OUTPUT -o eth0 -p udp -m udp --dport 53 -j ACCEPT

# Outbound PING requests
-A OUTPUT –o eth0 -p icmp -j ACCEPT

# Outbound Network Time Protocol (NTP) requests
-A OUTPUT –o eth0 -p udp --dport 123 --sport 123 -j ACCEPT

# Outbound HTTP
-A OUTPUT -o eth0 -p tcp -m tcp --dport 80 -m state --state NEW -j ACCEPT
-A OUTPUT -o eth0 -p tcp -m tcp --dport 443 -m state --state NEW -j ACCEPT

COMMIT

限制 IP 地址范围

应用场景:贵公司的 CEO 认为员工在 Facebook 上花费过多的时间,需要采取一些限制措施。CEO 命令下达给 CIO,CIO 命令 CISO,最终任务由你来执行。你决定阻止一切到 Facebook 的访问连接。首先你使用 host 或者 whois 命令来获取 Facebook 的 IP 地址。

host -t a www.facebook.com
www.facebook.com is an alias for star.c10r.facebook.com.
star.c10r.facebook.com has address 31.13.65.17
whois 31.13.65.17 | grep inetnum
inetnum:        31.13.64.0 - 31.13.127.255

然后使用 CIDR 到 IPv4 转换 页面来将其转换为 CIDR 表示法。然后你得到 31.13.64.0/18 的地址。输入以下命令来阻止对 Facebook 的访问:

iptables -A OUTPUT -p tcp -i eth0 –o eth1 –d 31.13.64.0/18 -j DROP

按时间规定做限制 - 场景1

应用场景:公司员工强烈反对限制一切对 Facebook 的访问,这导致了 CEO 放宽了要求(考虑到员工的反对以及他的助理提醒说她负责更新他的 Facebook 页面)。然后 CEO 决定允许在午餐时间访问 Facebook(中午 12 点到下午 1 点之间)。假设默认规则是丢弃,使用 iptables 的时间功能便可以实现。

iptables –A OUTPUT -p tcp -m multiport --dport http,https -i eth0 -o eth1 -m time --timestart 12:00 –timestop 13:00 –d 31.13.64.0/18 -j ACCEPT

该命令中指定在中午12点(--timestart 12:00)到下午 1 点(--timestop 13:00)之间允许(-j ACCEPT)到 Facebook.com (-d [31.13.64.0/18][5])的 http 以及 https (-m multiport --dport http,https)的访问。

按时间规定做限制 - 场景2

应用场景:在计划系统维护期间,你需要设置凌晨 2 点到 3 点之间拒绝所有的 TCP 和 UDP 访问,这样维护任务就不会受到干扰。使用两个 iptables 规则可实现:

iptables -A INPUT -p tcp -m time --timestart 02:00 --timestop 03:00 -j DROP
iptables -A INPUT -p udp -m time --timestart 02:00 --timestop 03:00 -j DROP

该规则禁止(-j DROP)在凌晨2点(--timestart 02:00)到凌晨3点(--timestop 03:00)之间的 TCP 和 UDP (-p tcp and -p udp)的数据进入(-A INPUT)访问。

限制连接数量

应用场景:你的 web 服务器有可能受到来自世界各地的 DoS 攻击,为了避免这些攻击,你可以限制单个 IP 地址到你的 web 服务器创建连接的数量:

iptables –A INPUT –p tcp –syn -m multiport -–dport http,https –m connlimit -–connlimit-above 20 –j REJECT -–reject-with-tcp-reset

分析一下上面的命令。如果单个主机在一分钟之内新建立(-p tcp -syn)超过 20 个(-connlimit-above 20)到你的 web 服务器(--dport http,https)的连接,服务器将拒绝(-j REJECT)建立新的连接,然后通知对方新建连接被拒绝(--reject-with-tcp-reset)。

监控 iptables 规则

应用场景:由于数据包会遍历链中的规则,iptables 遵循 “首次匹配获胜” 的原则,因此经常匹配的规则应该靠近策略的顶部,而不太频繁匹配的规则应该接近底部。 你怎么知道哪些规则使用最多或最少,可以在顶部或底部附近监控?

技巧 #1: 查看规则被访问了多少次

使用命令:

iptables -L -v -n –line-numbers

-L 选项列出链中的所有规则。因为没有指定具体哪条链,所有链规则都会被输出,使用 -v 选项显示详细信息,-n 选项则显示数字格式的数据包和字节计数器,每个规则开头的数值表示该规则在链中的位置。

根据数据包和字节计数的结果,你可以将访问频率最高的规则放到顶部,将访问频率最低的规则放到底部。

技巧 #2: 删除不必要的规则

哪条规则从来没有被访问过?这些可以被清除掉。用如下命令查看:

iptables -nvL | grep -v "0     0"

注意:两个数字 0 之间不是 Tab 键,而是 5 个空格。

技巧 #3: 监控正在发生什么

可能你也想像使用 top 命令一样来实时监控 iptables 的情况。使用如下命令来动态监视 iptables 中的活动,并仅显示正在遍历的规则:

watch --interval=5 'iptables -nvL | grep -v "0     0"'

watch 命令通过参数 iptables -nvL | grep -v “0 0“ 每隔 5 秒输出 iptables 的动态。这条命令允许你查看数据包和字节计数的变化。

输出日志

应用场景:经理觉得你这个防火墙员工的工作质量杠杠的,但如果能有网络流量活动日志最好了。有时候这比写一份有关工作的报告更有效。

使用工具 FWLogwatch 基于 iptables 防火墙记录来生成日志报告。FWLogwatch 工具支持很多形式的报告并且也提供了很多分析功能。它生成的日志以及月报告使得管理员可以节省大量时间并且还更好地管理网络,甚至减少未被注意的潜在攻击。

这里是一个 FWLogwatch 生成的报告示例:

不要满足于允许和丢弃规则

本文中已经涵盖了 iptables 的很多方面,从避免封锁自己、配置 iptables 防火墙以及监控 iptables 中的活动等等方面介绍了 iptables。你可以从这里开始探索 iptables 甚至获取更多的使用技巧。


via: https://opensource.com/article/18/10/iptables-tips-and-tricks

作者:Gary Smith 选题:lujun9972 译者:jrg 校对:wxy

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

前段时间,我写了一篇在安装 Windows 后在 Arch Linux 上如何重新安装 Grub的教程。

几周前,我不得不在我的笔记本上从头开始重新安装 Arch Linux,同时我发现安装 Grub 并不像我想的那么简单。

出于这个原因,由于在新安装 Arch Linux 时在 UEFI bios 中安装 Grub 并不容易,所以我要写这篇教程。

定位 EFI 分区

在 Arch Linux 上安装 Grub 的第一件重要事情是定位 EFI 分区。让我们运行以下命令以找到此分区:

# fdisk -l

我们需要检查标记为 EFI System 的分区,我这里是 /dev/sda2

之后,我们需要在例如 /boot/efi 上挂载这个分区:

# mkdir /boot/efi
# mount /dev/sdb2 /boot/efi

另一件重要的事情是将此分区添加到 /etc/fstab 中。

安装 Grub

现在我们可以在我们的系统中安装 Grub:

# grub-mkconfig -o /boot/grub/grub.cfg
# grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=GRUB

自动将 Windows 添加到 Grub 菜单中

为了自动将 Windows 条目添加到 Grub 菜单,我们需要安装 os-prober:

# pacman -Sy os-prober

要添加它,让我们运行以下命令:

# os-prober
# grub-mkconfig -o /boot/grub/grub.cfg
# grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=GRUB

你可以在这里找到更多关于在 Arch Linux 上 Grub 的信息。


via: http://fasterland.net/how-to-install-grub-on-arch-linux-uefi.html

作者:Francesco Mondello 选题:lujun9972 译者:geekpi 校对:wxy

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

本文为 Grank(Github Rank)的简介及相关思路的介绍。

在深圳刚刚结束的 CosCon 2018 大会上发布了《中国开源调查报告》,Grank 作为其中数据篇的部分数据提供者,构建了一个 Github 项目活跃度、社区化的模型,并以 Python 实现。

项目地址: https://github.com/lctt/grank/

Grank 模型

我们认为,一个健康的开源项目应该体现为以下两个方面:

  • 项目的活跃度趋势
  • 项目的社区化(去中心化)程度

而这两个方面分别有多个因素组成:

活跃度和活跃度趋势

项目的活跃度,我们定义为项目的提交数、 拉取请求数和贡献者数(其它数据,如代码行数、文件数、issue 数、 fork 数、star 数,要么是权重相对低得多,要么是代表意义不够确定,此处忽略不计入模型)。

但是,对于不同的项目,其横向比较其活跃度,或有不同的活跃度形态,或不具备可比性。很难说一个项目比另外一个项目的提交数高,而拉取请求(PR)数低代表的确切含义。因此我们不认为对不同项目的这些数据进行绝对值的比较有太多的科学意义。

所以,我们认为一个项目本身的活跃度变化的趋势和幅度,会更有项目间比较的意义。

如果以三维空间来描述一个项目的活跃度,以提交数、拉取请求数、贡献者数为三维,可以确定在某个时间点某个项目的坐标,那么计算一段时间内,该坐标点的移动轨迹和速率,可以真实的反映该项目的活跃度趋势。

考虑到按周工作的作息时间的普遍影响,我们以一个工作周作为一个时间采样点,然后计算连续的几周内该坐标的移动速率。这反映了该项目的发展速度。

社区化程度

开源诞生于社区,繁荣于社区,根植于社区,虽然现在大型组织、商业公司也纷纷投身于开源生态,但是我们认为,开源项目的生命力仍然在于社区。我们并不否认机构、商业公司对开源的巨大贡献和影响力,但是如果一个开源项目变成了一家或几家大企业的私人游戏,其必然失去开源项目的生命力,它或许会在商业上取得成功,但是那个成功不是开源项目的成功模式。

因此,我们认为需要有一个评估开源项目的社区化(去中心化)程度的指标。项目(尤其是软件项目)的一个重要属性是开发人员的社区化身份,因此,我们以实际向项目贡献了代码的人员的社区化离散程度来评估项目的社区化程度。

每个参与项目开发的人员均有其身份属性,这个身份可能是企业雇佣身份,也可能是社区志愿者身份。我们通过对项目的提交中的提交者数据进行收集,然后根据开发人员的身份信息、邮件后缀等依优先级来判断其所属身份。然后对这些信息进行聚类,以一个离散评估模型来评估该数据集的离散程度。

虽然项目越中心化,其发展风险越高,但是,并不是社区化程度越高的项目就越健康,过于离散的项目也容易出现项目分裂、迭代缓慢等问题。这显然是存在一个适当的区域。

Grank 的结果长什么样子?

多项目活跃度:

多项目社区化:

单项目社区化及活跃度:

使用方法

  1. 使用 pip 安装项目 pip install grank
  2. 获取 Github 的 Personal Access Token
  3. 使用 grank login 设置 Token
  4. 使用 grank config 设置社区化企业关键词
  5. 使用 grank analy <owner> [<repository>] 来分析特定用户 /组织和项目,比如 grank analy lctt grank,分析结果可以在执行命令目录的 result 目录中找到。
  6. 使用命令行模式操作,如 grank --token=XXXX --start=2018-01-01 --stop=2018-05-21 --askrule=0 --rule=inc analy <owner> <repository> 其中 token 必须指定,其他可以使用缺省设置

Grank 是如何实现的?

Grank 使用 Github 的 GraphQL 来完成数据抓取的工作,抓取项目的所有提交和拉取请求来进行分析,并使用 Pandas、numpy、pandas 进行数据的分析,最终得出结果。

此外,Grank 目前为命令行工具,采用了 Click 来编写命令行的支持。

Grank 能够为你带来什么?

  1. 评估自己的项目情况
  2. 学习 Python 项目编写
  3. 了解 Click 的使用
  4. 了解 pytest 的使用。

项目地址:https://github.com/LCTT/Grank

Pypi 地址:https://pypi.org/project/Grank/

Facebook 在人工智能项目中广泛使用自己的开源 AI 框架 PyTorch,最近,他们已经发布了 PyTorch 1.0 的预览版本。

如果你尚不了解,PyTorch 是一个基于 Python 的科学计算库。

PyTorch 利用 GPU 超强的运算能力 来实现复杂的 张量 计算 和 深度神经网络。 因此, 它被世界各地的研究人员和开发人员广泛使用。

这一新的可以投入使用的 预览版 已于 2018 年 10 月 2 日周二在旧金山 The Midway 举办的 PyTorch 开发人员大会 宣布。

PyTorch 1.0 候选版本的亮点

PyTorhc is Python based open source AI framework from Facebook

候选版本中的一些主要新功能包括:

1、 JIT

JIT 是一个编译工具集,使研究和生产更加接近。 它包含一个基于 Python 语言的叫做 Torch Script 的脚本语言,也有能使现有代码与它自己兼容的方法。

2、 全新的 torch.distributed 库: “C10D”

“C10D” 能够在不同的后端上启用异步操作, 并在较慢的网络上提高性能。

3、 C++ 前端 (实验性功能)

虽然它被特别提到是一个不稳定的 API (估计是在预发行版中), 这是一个 PyTorch 后端的纯 C++ 接口, 遵循 API 和建立的 Python 前端的体系结构,以实现高性能、低延迟的研究和开发直接安装在硬件上的 C++ 应用程序。

想要了解更多,可以在 GitHub 上查看完整的 更新说明

第一个 PyTorch 1.0 的稳定版本将在夏季发布。(LCTT 译注:此信息可能有误)

在 Linux 上安装 PyTorch

为了安装 PyTorch v1.0rc0, 开发人员建议使用 conda, 同时也可以按照本地安装页面所示,使用其他方法可以安装,所有必要的细节详见文档。

前提

  • Linux
  • Pip
  • Python
  • CUDA (对于使用 Nvidia GPU 的用户)

我们已经知道如何安装和使用 Pip,那就让我们来了解如何使用 Pip 安装 PyTorch。

请注意,PyTorch 具有 GPU 和仅限 CPU 的不同安装包。你应该安装一个适合你硬件的安装包。

安装 PyTorch 的旧版本和稳定版

如果你想在 GPU 机器上安装稳定版(0.4 版本),使用:

pip install torch torchvision

使用以下两个命令,来安装仅用于 CPU 的稳定版:

pip install http://download.pytorch.org/whl/cpu/torch-0.4.1-cp27-cp27mu-linux_x86_64.whl
pip install torchvision

安装 PyTorch 1.0 候选版本

使用如下命令安装 PyTorch 1.0 RC GPU 版本:

pip install torch_nightly -f https://download.pytorch.org/whl/nightly/cu92/torch_nightly.html

如果没有GPU,并且更喜欢使用 仅限 CPU 版本,使用如下命令:

pip install torch_nightly -f https://download.pytorch.org/whl/nightly/cpu/torch_nightly.html

验证 PyTorch 安装

使用如下简单的命令,启动终端上的 python 控制台:

python

现在,按行输入下面的示例代码以验证您的安装:

from __future__ import print_function
import torch
x = torch.rand(5, 3)
print(x)

你应该得到如下输出:

tensor([[0.3380, 0.3845, 0.3217],
 [0.8337, 0.9050, 0.2650],
 [0.2979, 0.7141, 0.9069],
 [0.1449, 0.1132, 0.1375],
 [0.4675, 0.3947, 0.1426]])

若要检查是否可以使用 PyTorch 的 GPU 功能, 可以使用以下示例代码:

import torch
torch.cuda.is_available()

输出结果应该是:

True

支持 PyTorch 的 AMD GPU 仍在开发中, 因此, 尚未按报告提供完整的测试覆盖,如果您有 AMD GPU ,请在这里提出建议。

现在让我们来看看一些广泛使用 PyTorch 的研究项目:

基于 PyTorch 的持续研究项目

领先的 GPU 制造商英伟达在更新这方面最近的发展,你也可以阅读正在进行的合作的研究。

我们应该如何应对这种 PyTorch 的能力?

想到 Facebook 在社交媒体算法中应用如此令人惊叹的创新项目, 我们是否应该感激这一切或是感到惊恐?这几乎是天网)! 这一新改进的发布的 PyTorch 肯定会推动事情进一步向前! 在下方评论,随时与我们分享您的想法!


via: https://itsfoss.com/pytorch-open-source-ai-framework/

作者:Avimanyu Bandyopadhyay 选题:lujun9972 译者:distant1219 校对:wxy

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

学习一些 Linux ls 命令最有用的变化。

我在 Linux 中最先学到的命令之一就是 ls。了解系统中文件所在目录中的内容非常重要。能够查看和修改不仅仅是一些文件还有所有文件也很重要。

我的第一个 Linux 备忘录是单页 Linux 手册,它于 1999 年发布,成了我的首选参考资料。当我开始探索 Linux 时,我把它贴在桌子上并经常参考它。它在第一页第一列的底部介绍了 ls -l 列出文件的命令。

之后,我将学习这个最基本命令的其它迭代。通过 ls 命令,我开始了解 Linux 文件权限的复杂性,以及哪些是我的文件,哪些需要 root 或者 sudo 权限来修改。随着时间的推移,我习惯了使用命令行,虽然我仍然使用 ls -l 来查找目录中的文件,但我经常使用 ls -al,这样我就可以看到可能需要更改的隐藏文件,比如那些配置文件。

根据 Eric Fischer 在 Linux 文档项目中关于 ls 命令的文章,该命令的起源可以追溯到 1961 年 MIT 的 相容分时系统 Compatible Time-Sharing System (CTSS)上的 listf 命令。当 CTSS 被 Multics 代替时,命令变为 list,并有像 list -all 的开关。根据维基百科ls 出现在 AT&T Unix 的原始版本中。我们今天在 Linux 系统上使用的 ls 命令来自 GNU Core Utilities

大多数时候,我只使用几个迭代的命令。我通常用 lsls -al 查看目录内容,但是你还应该熟悉许多其它选项。

ls -l 提供了一个简单的目录列表:

在我的 Fedora 28 系统的手册页中,我发现 ls 还有许多其它选项,所有这些选项都提供了有关 Linux 文件系统的有趣且有用的信息。通过在命令提示符下输入 man ls,我们可以开始探索其它一些选项:

要按文件大小对目录进行排序,请使用 ls -lS

要以相反的顺序列出内容,请使用 ls -lr

要按列列出内容,请使用 ls -c

ls -al 提供了同一目录中所有文件的列表:

以下是我认为有用且有趣的一些其它选项:

  • 仅列出目录中的 .txt 文件:ls *.txt
  • 按文件大小列出:ls -s
  • 按时间和日期排序:ls -t
  • 按扩展名排序:ls -X
  • 按文件大小排序:ls -S
  • 带有文件大小的长格式:ls -ls

要生成指定格式的目录列表并将其定向到文件供以后查看,请输入 ls -al > mydirectorylist。最后,我找到的一个更奇特的命令是 ls -R,它提供了计算机上所有目录及其内容的递归列表。

有关 ls 命令的所有迭代的完整列表,请参阅 GNU Core Utilities


via: https://opensource.com/article/18/10/ls-command

作者:Don Watkins 选题:lujun9972 译者:geekpi 校对:pityonline

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

在双系统引导的状态下,你可以将已安装的 Linux 发行版替换为另一个发行版,同时还可以保留原本的个人数据。

How to Replace One Linux Distribution With Another From Dual Boot

假设你的电脑上已经以双系统的形式安装了 Ubuntu 和 Windows,但经过将 Linux Mint 与 Ubuntu 比较之后,你又觉得 Linux Mint 会更适合自己的时候,你会怎样做?又该如何在删除 Ubuntu 的同时在双系统中安装 Mint 呢?

你或许觉得应该首先从在双系统中卸载 Ubuntu,然后使用 Linux Mint 重新安装成双系统。但实际上并不需要这么麻烦。

如果你已经在双系统引导中安装了一种 Linux 发行版,就可以轻松替换成另一个发行版了,而且也不必卸载已有的 Linux 发行版,只需要删除其所在的分区,然后在腾出的磁盘空间上安装另一个 Linux 发行版就可以了。

与此同时,更换 Linux 发行版后,仍然会保留原本 home 目录中包含所有文件。

下面就来详细介绍一下。

在双系统引导中替换 Linux 发行版

https://youtu.be/ptF2RUehbKs

这是我的演示范例。我使用双系统引导同时安装了 Windows 10 和 Linux Mint 19,然后我会把 Linux Mint 19 替换成 Elementary OS 5,同时在替换后保留我的个人文件(包括音乐、图片、视频和 home 目录中的文件)。

你需要做好以下这些准备:

  • 使用 Linux 和 Windows 双系统引导
  • 需要安装的 Linux 发行版的 USB live 版
  • 在外部磁盘备份 Windows 和 Linux 中的重要文件(并非必要,但建议备份一下)

在替换 Linux 发行版时要记住保留你的 home 目录

如果想让个人文件在安装新 Linux 系统的过程中不受影响,原有的 Linux 系统必须具有单独的 root 目录和 home 目录。你可能会发现我的双系统引导教程在安装过程中不选择“与 Windows 共存”选项,而选择“其它”选项,然后手动创建 root 和 home 分区。所以,手动创建单独的 home 分区也算是一个磨刀不误砍柴工的操作。因为如果要在不丢失文件的情况下,将现有的 Linux 发行版替换为另一个发行版,需要将 home 目录存放在一个单独的分区上。

不过,你必须记住现有 Linux 系统的用户名和密码才能使用与新系统中相同的 home 目录。

如果你没有单独的 home 分区,也可以后续再进行创建。但这并不是推荐做法,因为这个过程会比较复杂,有可能会把你的系统搞乱。

下面来看看如何替换到另一个 Linux 发行版。

步骤 1:为新的 Linux 发行版创建一个 USB live 版

尽管上文中已经提到了它,但我还是要重复一次以免忽略。

你可以使用 Windows 或 Linux 中的启动盘创建器(例如 Etcher)来创建 USB live 版,这个过程比较简单,这里不再详细叙述。

步骤 2:启动 USB live 版并安装 Linux

你应该已经使用过双系统启动,对这个过程不会陌生。使用 USB live 版重新启动系统,在启动时反复按 F10 或 F12 进入 BIOS 设置。选择从 USB 启动,就可以看到进入 live 环境或立即安装的选项。

在安装过程中,进入“安装类型”界面时,选择“其它”选项。

Replacing one Linux with another from dual boot

在这里选择“其它”选项

步骤 3:准备分区操作

下图是分区界面。你会看到使用 Ext4 文件系统类型来安装 Linux。

Identifying Linux partition in dual boot

确定 Linux 的安装位置

在上图中,标记为 Linux Mint 19 的 Ext4 分区是 root 分区,大小为 82691 MB 的第二个 Ext4 分区是 home 分区。在这里我这里没有使用交换空间

如果你只有一个 Ext4 分区,就意味着你的 home 目录与 root 目录位于同一分区。在这种情况下,你就无法保留 home 目录中的文件了,这个时候我建议将重要文件复制到外部磁盘,否则这些文件将不会保留。

然后是删除 root 分区。选择 root 分区,然后点击 - 号,这个操作释放了一些磁盘空间。

Delete root partition of your existing Linux install

删除 root 分区

磁盘空间释放出来后,点击 + 号。

Create root partition for the new Linux

创建新的 root 分区

现在已经在可用空间中创建一个新分区。如果你之前的 Linux 系统中只有一个 root 分区,就应该在这里创建 root 分区和 home 分区。如果需要,还可以创建交换分区。

如果你之前已经有 root 分区和 home 分区,那么只需要从已删除的 root 分区创建 root 分区就可以了。

Create root partition for the new Linux

创建 root 分区

你可能有疑问,为什么要经过“删除”和“添加”两个过程,而不使用“更改”选项。这是因为以前使用“更改”选项好像没有效果,所以我更喜欢用 -+。这是迷信吗?也许是吧。

这里有一个重要的步骤,对新创建的 root 分区进行格式化。在没有更改分区大小的情况下,默认是不会对分区进行格式化的。如果分区没有被格式化,之后可能会出现问题。

格式化 root 分区很重要

如果你在新的 Linux 系统上已经划分了单独的 home 分区,选中它并点击更改。

Recreate home partition

修改已有的 home 分区

然后指定将其作为 home 分区挂载即可。

Specify the home mount point

指定 home 分区的挂载点

如果你还有交换分区,可以重复与 home 分区相同的步骤,唯一不同的是要指定将空间用作交换空间。

现在的状态应该是有一个 root 分区(将被格式化)和一个 home 分区(如果需要,还可以使用交换分区)。点击“立即安装”可以开始安装。

Verify partitions while replacing one Linux with another

检查分区情况

接下来的几个界面就很熟悉了,要重点注意的是创建用户和密码的步骤。如果你之前有一个单独的 home 分区,并且还想使用相同的 home 目录,那你必须使用和之前相同的用户名和密码,至于设备名称则可以任意指定。

To keep the home partition intact, use the previous user and password

要保持 home 分区不变,请使用之前的用户名和密码

接下来只要静待安装完成,不需执行任何操作。

Wait for installation to finish

等待安装完成

安装完成后重新启动系统,你就能使用新的 Linux 发行版。

在以上的例子中,我可以在新的 Linux Mint 19 中使用原有的 Elementary OS 中的整个 home 目录,并且其中所有视频和图片都原封不动。岂不美哉?


via: https://itsfoss.com/replace-linux-from-dual-boot/

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

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