作为更大的备份恢复方案的一部分,我试图获取 ubuntu 16.04 服务器已安装软件包的简明列表。我希望该列表尽可能简短,并且即使在五年后的新 LTS 版本的 ubuntu 上也可能有用。
请考虑以下情形:
第 1 天:我在一台机器上安装了 ubuntu 16.04 服务器。
第二天:我安装php-fpm
第 3 天:我安装了nginx
、php
和sendmail
第 4 天:我安装了atanks
。不,我不知道为什么要在无头服务器上安装图形游戏。目的只是为了将更多手动安装的内容添加到 apt 的数据库中。
第 5 天:我的服务器在熊熊烈火中爆炸。也许是坦克爆炸造成的。无论如何,我需要根据备份创建一个新服务器。
在我的备份脚本中,我希望能够根据过去几天的 apt-get 活动生成以下行:
apt-get install atanks nginx php php-fpm sendmail
那么我们该怎么做呢?
首先,我尝试了一些恰当的查询,
apt-mark showmanual
但他们列出的软件包似乎比我手动安装的多出数百个。
其次,我发现debfoster
:
安装 ubuntu 后,我会运行:
sudo apt-get update
sudo apt-get -y install debfoster
sudo debfoster -q
sudo cp /var/lib/debfoster/keepers ~/startkeepers
并且正常的服务器操作可以继续。我或服务器的其他用户可能会安装任意数量的软件包。
在我的备份脚本中,我将包含以下内容:
sudo debfoster -q
sudo echo $(diff --new-line-format="" --unchanged-line-format="" /var/lib/debfoster/keepers ~/startkeepers) > apt-get.list
然后我可以使用以下命令在新安装上恢复:
apt-get install -y $(cat apt-get.list)
不幸的是,由于不同的软件包要么安装要么不安装某些推荐的软件包,这种方法不能完美地发挥作用。
存储后startkeepers
,我运行
sudo apt-get install -y nginx php-fpm python-certbot-nginx sendmail composer php-mbstring php-xml php-zip php-mysql
sudo debfoster -q
sudo echo $(diff --new-line-format="" --unchanged-line-format="" /var/lib/debfoster/keepers ~/startkeepers) | tr ' ' '\n'
最后一行输出如下:
composer
php-fpm
php-mbstring
php-mysql
php-xml
php-zip
python-certbot-nginx
sendmail
缺少了... nginx!这让我很害怕,但后来我意识到这nginx
一定是 的依赖项python-certbot-nginx
,然后我确认了这一点。所以也许这种方法最终会奏效?
我sudo apt-get upgrade
在我的测试服务器上运行,使用后输出保持不变
sudo debfoster -q
sudo echo $(diff --new-line-format="" --unchanged-line-format="" /var/lib/debfoster/keepers ~/startkeepers) | tr ' ' '\n'
但是,在我的真实服务器上(我试图为其配置此脚本复制),还有另外两行我认为不应该存在的内容:
linux-headers-4.4.0-112-generic
linux-image-4.4.0-112-generic
我没有手动安装它们……并且不想在另一台服务器上安装它们,除非有人认为它们是必要的,否则再次这样做。可能是 apt-update 吗?
TLDR;有什么可靠的方法可以跟踪与服务器版本无关的手动安装软件包列表,其中手动是指用户知道如何安装的内容,而不是通过升级安装的内容,或者无论 Linux 头文件和内核版本如何安装?任何能改善我流程的方法都会受到赞赏,debfoster
考虑到它的开发人员,使用 apt 工具而不是 会获得加分声明 apt 支持其所有功能。