重装系统真的是件麻烦事!尤其是当你需要重装一系列之前使用的程序/软件包的时候。
由于本人主要使用 Anaconda 环境以及 Python 语言编程,本文简单记录一下 Ubuntu 下通过 apt 安装的 package,以及 Anaconda Python 环境中 package 的备份方法。
Ubuntu 软件包备份¶
使用 apt-clone 包就能备份系统上已安装软件列表
安装apt-clone¶
sudo apt install apt-clone
备份¶
新建个文件夹保存备份文件,之后直接开始备份就好了
mkdir ~/mypackages
sudo apt-clone clone ~/mypackages
not installable: sogoupinyin, atom, lantern version mismatch: libwebkit2gtk-4.0-37, unattended-upgrades, liblouis-data, firefox-locale-en, ubuntu-release-upgrader-core, ubuntu-release-upgrader-gtk, gir1.2-webkit2-4.0, update-manager-core, firefox-locale-zh-hans, python3-louis, update-manager, python3-distupgrade, libjavascriptcoregtk-4.0-18, gir1.2-javascriptcoregtk-4.0, python3-update-manager, firefox, liblouis14
Note that you can use --with-dpkg-repack to include those packges in the clone file.
~/mypackages
文件夹下应该有一个名为apt-clone-state-ubuntu.tar.gz
压缩包
cd ~/mypackages
tar -xvf apt-clone-state-ubuntu.tar.gz
解压之后文件夹结构大概如下
.
├── etc
│ └── apt
│ ├── preferences.d
│ ├── sources.list
│ ├── sources.list.d
│ │ ├── google-chrome.list
│ │ ├── notepadqq-team-ubuntu-notepadqq-bionic.list
│ │ ├── numix-ubuntu-ppa-bionic.list
│ │ ├── sogoupinyin.list
│ │ ├── vscode.list
│ │ └── webupd8team-ubuntu-atom-bionic.list
│ ├── trusted.gpg
│ └── trusted.gpg.d
│ ├── microsoft.gpg
│ ├── notepadqq-team_ubuntu_notepadqq.gpg
│ ├── numix_ubuntu_ppa.gpg
│ ├── sogou-archive-keyring.gpg -> /usr/share/keyrings/sogou-archive-keyring.gpg
│ ├── ubuntu-keyring-2012-archive.gpg
│ ├── ubuntu-keyring-2012-cdimage.gpg
│ └── webupd8team_ubuntu_atom.gpg
└── var
└── lib
└── apt-clone
├── extended_states
├── foreign.pkgs
├── installed.pkgs
└── uname
8 directories, 19 files
其中 var/lib/apt-clone/installed.pkgs 记录已安装的包,另外 apt-clone 还会备份软件源等其他一些设置。
恢复安装¶
apt-clone info mypackages/apt-clone-state-ubuntu.tar.gz # 查看备份包信息
使用如下命令在新系统中恢复安装备份的软件包
sudo apt-clone restore apt-clone-state-ubuntu.tar.gz
Anaconda 环境中的Python包备份¶
原生pip备份¶
freeze命令
pip freeze > ~/mypackages/requirements.txt
requirements.txt
文件长这个样子
alabaster==0.7.11
anaconda-client==1.7.2
anaconda-navigator==1.9.2
anaconda-project==0.8.2
appdirs==1.4.3
asn1crypto==0.24.0
astroid==2.0.4
astropy==3.0.4
atomicwrites==1.2.1
attrs==18.2.0
Automat==0.7.0
autopep8==1.4
Babel==2.6.0
内容包括版本信息,似乎没有找到不输出版本号备份包名的方法,安装时似乎也没有忽略版本号的方法,如果想安装相应包的最新版本,可以在安装完成后再升级一遍。
再次安装时只需
pip install -r requirements.txt
上述命令会在将所有安装文件下载完毕后统一安装,因此一旦某个 package 出错就可能导致其他 package 也无法安装。
可以使用以下命令分别安装每个 package
cat requirements.txt | xargs -n1 pip install
也可以在安装软件时保存 cache 方便以后安装
pip install -r requirements.txt -d your_download_dir
pip install -r requirements.txt --no-index --find-links=file://your_download_dir
类似的 pip list 也可以输出所有包,但和 freeze 还是有一定区别的。
pip freeze 和 pip list 的区别¶
1.一般来说 pip freeze 会比 pip list 的包少几个,因为pip , wheel , setuptools 等包,是自带的而无法(un)install的,考虑到pip freeze的用途,所以这些包并没有显示。
如果一定要显示所有包,可以加上参数-all,即pip freeze -all
2.格式区别
pip freeze 出的格式可以直接作为 requirements.txt 文件使用,而 pip list 输出格式大致如下
Package Version
---------------------------------- -----------
alabaster 0.7.12
anaconda-client 1.7.2
anaconda-navigator 1.9.2
anaconda-project 0.8.2
appdirs 1.4.3
asn1crypto 0.24.0
astroid 2.0.4
astropy 3.0.4
无法直接作为 requirements.txt 文件使用。
pipdeptree 依赖分析工具¶
使用 pipdeptree 可以分析当前 Python 环境中所有 package 之间的依赖关系
pip install pipdeptree
pipdeptree # 分析依赖关系
pipdeptree --reverse --packages xxx # 某个 package 为何被安装
conda备份¶
conda list --export > mypackages/package-list.txt # 导出pkg列表
conda create -n myenv --file package-list.txt # 依列表创建新环境
myenv 为环境名,package-list.txt为之前备份的pkg列表
使用--offline
选项禁用不必要的下载,而是从root或其他环境中复制可复用的包
注:conda 备份文件用于恢复时,对通过 pip 安装的 package 不太友好