作为无头服务器运行时,如何卸载X Server和Desktop Manager?


88

我将Raspberry Pi用作无头服务器,可以将其插入。我不需要X Server,LXDE等。

我正在运行Raspbian“喘不过气来”。我已经raspi-config按照此处所述禁用“启动时启动桌面” 。但是对于所有我不使用的桌面设备,我一直得到很多软件包更新(我运行apticron通过电子邮件通知我即将进行的更新),因此,我希望完全使用apt-get remove所有不必要的软件包,以避免这些不必要的更新。

我应该删除哪些包裹?

到目前为止,我已经提出了以下建议:

sudo apt-get remove desktop-base lightdm lxappearance lxde-common lxde-icon-theme lxinput lxpanel lxpolkit lxrandr lxsession-edit lxshortcut lxtask lxterminal obconf openbox raspberrypi-artwork xarchiver xinit xserver-xorg xserver-xorg-video-fbdev

我通过查看“已安装的软件包-> x11->主要部分”中不是“自动安装”的所有软件包的适应性来做出上述列表。

由于某种原因,当我运行此命令时,apt-get告诉我:

The following extra packages will be installed:
  libutempter0 xbitmaps xterm

对于删除操作而言,这似乎有些奇怪。

有更容易的方法吗?是否有一个“超级”程序包,它拥有所有这些图形内容并且可以删除,并带有所有依赖项?据我了解,这似乎是不可能的,因为这些东西尚未自动安装,这意味着我需要跟踪所有它们并显式删除它们。

Answers:


85

TL; DR或“只是烧焦我的pi”

sudo apt-get remove --auto-remove --purge 'libx11-.*'
sudo apt-get autoremove --purge

(重复apt-get autoremove --purge直到没有孤儿为止)

进一步说明

如果软件包foo 依赖于另一个软件包libfoo,并且您删除了libfoo软件包,则依赖项(foo)也将被删除。因为Foo有一个指定libfoo依赖行,所以如果删除了libfoo,则留下foo将被破坏。事实并非如此:删除foo 不会自动删除libfoo。另一个包xfoo可能取决于libfoo,因此容易将不只是删除它(尽管如果它被安装容易将跟踪作为安装的副作用FOO 并主动提出删除要求,只要没有其他人仍然依赖它)

元软件包依赖于一组其他软件包,就像foo依赖libfoo一样,因此,当您删除元软件包时,通常不会删除其他软件包。例如,可能有两个依赖于xterm的元软件包(也许是lxsession和xfsession),但是卸载一个或两个都不会卸载xterm,因为没有lxsession或xfsession不会破坏xterm。通常,元软件包位于依赖关系树的顶部,而不是底层,并且几乎没有什么东西直接依赖于元软件包。元软件包主要提供一种方便的方式来立即安装一组合理的软件包,但它们不是卸载工具。

因此,如果您想烧焦所有依赖X11的内容,则需要定位所有x11应用最终必须依赖的基本libx11库集:

sudo apt-get remove --dry-run --auto-remove --purge 'libx11-.*'
sudo apt-get autoremove --dry-run --purge

这将(模拟)删除最终依赖于libx11-。*的所有内容,还将删除所有作为X11程序依赖项安装的软件包,即使它们并不直接依赖于X11本身(通常安装了CUPS和Ghostscript)作为安装桌面环境的副作用)。第二个命令将删除后续的孤儿,直到没有孤儿为止。如果要稍后执行此步骤或根本不执行此步骤,请删除“ --auto-remove”,或者在清除GUI后手动重新添加软件包。

在检查它不会删除您不打算删除的软件包之后,请删除--dry-run选项以实际执行该操作。)

我更喜欢清理和清除副作用,然后根据需要将其重新添加。另外,我继续在自己的pi上对其进行了测试,然后重新启动到了非常精简但功能正常的服务器上。:)

为什么删除会安装某些东西?

上面的策略解决了上述问题,但是仍然存在为什么执行删除操作会导致安装软件包的好奇心。

每个软件包管理器的核心都是某种可满足性的解决方案。当您告诉程序包管理器安装某些程序包,删除某些程序包或升级某些程序包时,您真正要执行的操作是在给定可用程序包集的情况下解决软件安装的下一个所需状态。该解决方案可以包括安装其他软件包(依赖项),删除现有软件包(冲突,中断),降级/升级特定软件包(兼容性级别)或其组合。因此,虽然求解器确​​定需要安装某些软件包才能删除其他软件包是有点违反直觉的,,这很合理。是程序包管理器解决的棘手的依赖管理问题。

一个具体示例:给定已经安装了一组Java应用程序,它们都依赖于Java兼容的运行时,该运行时恰好是openjdk-7-jre。然后你问的软件包管理器解决安装一个新的Java工具,声明了的冲突OpenJDK的-7的JRE,但工作Oracle的7-JRE(两个软件包一般提供一个Java的7-运行)。求解器会提出拆除OpenJDK的-7,JRE安装甲骨文的Java 7 JRE作为在不破坏现有软件包的情况下安装新软件包的理想状态的解决方案。

在这种特定情况下,xterm是一个软件包,提供了一个称为x-terminal-emulator的虚拟依赖xtermlxterminalaterm提供了一个x-terminal-emulator),因此很可能在删除lxterminal时(作为一部分)除去LXDE),解算器中发现的现有的已安装的包(转码,需要作为一个可能的示例)某些的x终端仿真器,所以解算器选择安装的xterm(要求libutempter0xbitmaps,说明要安装的其他软件包),以解决否则损坏的依赖性。在没有看到软件包数据库的情况下,我假设这是最可能的情况。

要发现当前取决于xterm(或替代项)的软件包,请使用apt-cache rdepends命令(使用--installed开关将其限制为仅安装的软件包):

$ apt-cache --installed rdepends xterm
xterm
Reverse Depends:
    |xorg
     clusterssh
    |xinit
    |tk8.5
    |tk8.4
    |transcode

以替换字符“ |”开头的依赖项 表示软件包依赖于xterm或它提供的东西(在这种情况下,东西是x-terminal-emulator)。该clusterssh软件包依赖的xterm 明确,并且不允许替代。这是导致需要xterm的软件包的简短列表。

那德博芬呢?

通过2010年“的autoremove”功能(Debian错误跟踪孤儿的功能被纳入易于得到582791渲染使用deborphan)大多是多余的,基本上是过时的。与deborphan和其他类似解决方案不同,apt-get 直接跟踪显式安装了哪些软件包,以及哪些软件包作为显式安装的软件包的副作用或依赖性而安装。例如,如果管理员安装了foo,则libfoo被安装为副作用,而apt-get autoremove 实际上删除foo(如果在删除foo时指定了autoremove(或--auto-remove))。

deborphan采取的方法是猜测的集合。例如,猜测没有依赖库的已安装库必须是孤立的:如果安装了libfoo,但是fooxfoo都没有,则deborphan可能会决定它必须是孤立的。此处的一种失败模式是,可能为它们提供的工具专门安装了库(在将XMLlint重新打包为libxml2-utils之前,将它们用于xmllint)或仅用于开发目的。这样的包不是孤儿。此外,deborphan专注于库,因此它错过了许多易于跟踪的非库孤儿(过时的包与孤立的包)


2
辉煌为我工作,谢谢。它确实munin由于某种原因也被删除了,但是之后我可以很容易地将其放回去。

4
烧焦!我不得不引用'libx11-.*'以防止外壳滚动。

1
@Maxx,很好的答案,但是在您所有的情况下,您都没有描述他运行apt-get remove它想要的install xterm以及另外两个时的情况。我也经历过,无法解决。
Madivad

2
干净,未展开raspbian安装,易于得到升级,DIST升级后:rootfs ... 94% /。apt-get remove --auto-remove --purge libx11-。*之后:很好的rootfs ... 51% /答案,非常感谢!
Daniel F

2
在apt-get autoremove之后:rootfs ... 41% /...
Daniel F

27
sudo apt-get install deborphan
sudo apt-get autoremove --purge libx11-.* lxde-.* raspberrypi-artwork xkb-data omxplayer penguinspuzzle sgml-base xml-core alsa-.* cifs-.* samba-.* fonts-.* desktop-* gnome-.*
sudo apt-get autoremove --purge $(deborphan)
sudo apt-get autoremove --purge
sudo apt-get autoclean

第一行安装deborphan将删除所有孤立的软件包。

第二行删除了X11系统LXDE,Samba(Windows文件共享),字体,Gnome以及与Raspberry Pi桌面环境相关的其他内容的核心软件包。

第三行删除deborphan检测到的所有孤立软件包。

第四行删除所有不需要的软件包。

第五行清除程序包缓存。


3
欢迎来到Raspberry Pi Stack Exchange!尽管从技术上讲这可以回答问题,但最好包括一些解释,说明其工作方式以及其确切作用。
RPiAwesomeness

1
在全新的Raspbian安装上运行这些命令,我​​从4GB SD卡上的不到1 GB的可用空间变为2.5GB的可用空间。至少对我来说,这是正确的答案。

2
接受的答案非常深入,但实际上并没有列出完成OP问题的列表。这个答案可能是准系统,但实际上可以完成OP(和我)的实际需求
portforwardpodcast 2015年

为什么要卸载samba?这不是GUI应用程序。联网可能是必需的。
Dogweather

9

1 /。要删除我刚刚做过的所有台式机(去煮一壶咖啡。散步,这将需要一段时间)...
apt-get remove --auto-remove --purge libx11-.*

2 /。然后我安装了deborphan来摆脱孤立的文件...
sudo apt-get install deborphan

如果您想查看孤儿,请执行此操作...
deborphan -sz

3 /。然后我删除了所有孤立文件...
sudo apt-get remove --purge $(deborphan)

最后,执行此操作以删除不需要孤立的不必要的程序包...
sudo apt-get autoremove

最终结果:无头清洁


2
apt-get remove --dry-run绝对不执行任何操作,但在屏幕上显示消息。
lenik 2014年

7

这里看看,但向下滚动到有关的部分tasksel

tasksel --list-tasks通过wifi ssh在pi上运行给我(大约30秒后):

u desktop   Debian desktop environment
u web-server    Web server
u print-server  Print server
u database-server   SQL database
u dns-server    DNS Server
u file-server   File server
u mail-server   Mail server
u ssh-server    SSH server
u laptop    Laptop

因此,tasksel remove desktop应做您想做的事[请参阅评论]。手册页有点简短和神秘,这也许是因为taskel主要用于debian维护者。如果这样做有效,请告诉我们;)


谢谢,tasksel尽管我确实有相当多的Ubuntu经验,但我从未听说过。不幸的是,我尝试了这一点,花了一些时间运行remove desktop命令,但是根据所述,所有那些“图形”包仍然存在aptitude

我也没有,但是当我发现只是删除一些基本的X组件并不能拉动整个依赖堆栈时,我有点不安,我以为会。我找到了一个更好的taskel页面,并实际上启动了ncurses应用程序(tasksel无选项)。可以肯定的是,现在的'u'意味着未安装元软件包,如果您安装'desktop',您将获得的不仅仅是lxde版本的wiki.debian.org/tasksel,因此没有任何限制。我注意到“ xorg”元数据包apt-cache search metapackage也未实际安装。怪我猜是树莓派。
goldilocks

2
我将保留这个答案,以免别人死胡同,或者万一有人可以说得更好。
goldilocks


3

根据taskel信息,可以发现存在一个元包任务桌面,该桌面引用了所有其他与GUI相关的包。所以就

sudo apt-get remove task-desktop

这将删除大量其他软件包(与GUI / Desktop相关)。

背景:task-desktop可通过运行以下taskel命令找到包的名称:

tasksel --list-tasks
tasksel --task-packages desktop

0

另一个选择是使用aptitude,如果您要做的不仅仅是安装或删除一些软件包,则应始终选择使用aptitude。

通过键入root来启动aptitude sudo aptitude。在aptitude的标准Packages视图中,最后一个列表条目Tasks位于其中,您可以选择taskel列出的各种选项。通过与项目导航jkenter_在突出显示的项目上输入(下划线),标记要清除的项目。这只是准备动作。要执行操作,请按g

在debian手册中阅读有关能力的信息


0

输入以下代码:

sudo apt-get purge desktop-base lightdm lxappearance lxde-common lxde-icon-theme lxinput lxpanel lxpolkit lxrandr lxsession-edit lxshortcut lxtask lxterminal obconf openbox raspberrypi-artwork xarchiver xinit xserver-xorg xserver-xorg-video-fbdev

1
因此,为了澄清起见,OP的命令行与您的命令行之间的唯一区别是使用purge代替remove吗?
Greenonline '16
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.