更新

更新

我时不时地需要重新安装Linux系统(主要是基于Ubuntu的发行版)。重新安装我需要的每个软件的过程真的很无聊而且耗时。有什么软件可以帮助我吗? Windows 上有 Ninite,Linux 上还有其他东西吗?

编辑:感谢您的所有回答!我选择了 Ansible,它是一个很棒的工具。

答案1

保存并恢复所有包

在基于 Debian/Ubuntu 的系统上,您可以将已安装软件包的列表转储到文件中

dpkg --get-selections > my_package_list.txt

并通过运行再次安装它们

apt-cache dumpavail | sudo dpkg --merge-avail
sudo dpkg --set-selections < my_package_list.txt
sudo apt-get dselect-upgrade

第一行确保dpkg的数据库是最新的(现在大多数人使用apt安装维护自己数据库的软件包),第二行导入您保存的选择,第三条命令安装所选的软件包。请参阅Debian 管理员手册了解详情。

如果您已从第三方存储库安装了软件包,则需要在执行上述恢复步骤之前添加这些存储库。

仅保存和恢复显式安装的包

资质自动安装依赖项(例如应用程序所需的库)。这些包被标记为“自动”,当不再需要时可以自动删除。如果您想保留这些“自动”标志,我们将无法使用,dpkg因为它不会跟踪自动安装的软件包。相反,我们必须使用稍微神秘的

LC_ALL=C aptitude search -F '%p %C' '~i!~M' > my_package_list.txt

这将搜索所有已安装 ( ~i) 且未 ( !) 标记为自动 ( ~M) 的软件包。对于每个匹配的包,将打印包名称 ( %p) 和状态 ( %C) (这模仿 的输出dpkg --get-selections)。LC_ALL=C确保所有输出均以英语完成,无需翻译为母语。使用上面提到的命令安装此列表中的软件包。请参阅aptitude 用户手册了解详情。

答案2

Ansible 是一种开源软件配置、配置管理和应用程序部署工具。它可以在许多类 Unix 系统上运行,并且可以配置类 Unix 系统以及 Microsoft Windows。它包含自己的声明性语言来描述系统配置

(从维基百科.)主页(Github)

同一类别中还有其他几个。阅读有关应该为您提供词汇来搜索其他内容,并在需要时进行比较。尼克斯是一个较新的竞争者。有人说“比较复杂,但也许刚刚好”。也在现场。

myhost主机名、模块的 Ansible 示例apt(替换为yum或其他):

ansible -K -i myhost, -m apt -a "name=tcpdump,tmux state=present" --become myhost

列表“tcpdump,tmux”可以用逗号扩展。 (事实上​​,主机名myhost在命令行中出现了两次,因为我们没有使用固定的主机清单列表,而是一个临时的主机清单列表,末尾带有逗号。)

这只是触及了表面,Ansible 拥有广泛的模块集合

答案3

如果您只想安装一堆软件包,那么简单的一行代码就可以做到:

sudo bash -c 'for package in "tmux" "htop" "gimp"; do apt install -y --no-upgrade "$package"; done'

该循环并不是绝对必要的,但如果没有它,如果 apt 无法找到列表中的任何程序,它将无法安装任何其他软件包。例如,如果您切换到发行版的更新版本并且较旧的软件包不再位于存储库中,则可能会发生这种情况。如果您喜欢全有或全无,请使用

sudo apt install -y --no-upgrade tmux htop gimp

如果您还想保存配置,搜索词将是“dotfiles”。这就是类 Unix 系统中的配置的名称,因为它们大多以“.”开头。

保存这些内容的一种快速而肮脏的方法是将所有这些配置目录复制到新系统。更好的方法是使用 git 等工具将它们置于版本控制之下。我使用 git、dotbot 和手写脚本的组合来设置我的系统。

更新

到目前为止,讨论中遗漏的一点是,它apt通常不是除了最基本的功能之外所需的唯一包管理系统。其他包管理工具可能有snap、、、等等。 Alex Stragies 的答案中隐含地解决了这一问题。包含大量模块,包括管理包的模块,除了和。由于我的答案重点是编写您自己的脚本,因此我想对此进行扩展。对于大多数任务来说,通常应该首选经过良好测试的框架,但在我看来,自行编写的代码在灵活性方面具有优势。pipcondacargoAnsibleaptsnappipAnsible

小示例框架

我用 python 编写了一段小代码,它将举例说明这样一个框架的外观。

#!/usr/bin/env python3

import os
import re
import sys
import subprocess

def read_package_list(path):
    package_list=[]
    try:
        with open(os.path.realpath(path)) as f:
            for line in f:
                match = re.search(r'^(?!\s*$)(?!#)\w+',line)
                if match:
                    package_list.append(match.group(0))
            return package_list
    except Exception as e:
        print(e.message)
        print(e.args)
        sys.exit(1)    
    return package_list

def install_packages(command,package_list,err_log):
    try:
        with open(err_log,'w+') as f:
            for p in package_list:
                print('executing '+command+' '+str(p))
                out=subprocess.run(command+' '+p,shell=True,stderr=f)
    except Exception as e:
        print(e.message)
        print(e.args)
        sys.exit(1)

def main():
    args = sys.argv[1:]
    package_list = read_package_list(args[1])
    err_log=os.path.realpath(args[2])
    install_packages(args[0],package_list,err_log)

if __name__ == '__main__':
    main()

基本成分是一个处理由换行符 ( ) 分隔的包列表的函数read_package_list和一个在 shell 中执行安装程序命令的函数 ( install_packages)。#读取包列表时,仅包含空格的行和以 开头的行将被忽略。处理main可以在命令行上给出的参数,如installer command, packagefile, errorlog

这给了我什么?

那么你可以使用任何你喜欢的安装程序命令

./installerscript.py 'apt install --dry-run' myaptpackages.txt apt_err.log
./installerscript.py 'snap install' mysnaps.txt snap_err.log
./installerscript.py 'pip install --user' mypy.txt py_err.log
./installerscript.py 'git clone' repos.txt git_err.log

如果保留一份应该以相同方式处理的软件包列表,这可能会有所帮助。一旦存在这样的框架,就很容易对其进行改进。例如,可以自定义记录安装过程的方式或自定义命令行参数的处理。另一方面是脚本可能不应该像当前那样以 root 身份执行每个命令(如果以 root 身份运行)。

答案4

如果您从命令行安装软件,那么执行

grep "^sudo apt install" ~/.bash_history > system-setup.sh

系统设置完成后,将为您提供一个脚本,您可以在下次需要时重复使用该脚本(经过一些编辑)来设置新安装的系统。

相关内容