Bagaimana cara menghapus X Server dan Desktop Manager saat berjalan sebagai server tanpa kepala?

88

Saya menggunakan Raspberry Pi saya sebagai server tanpa kepala yang dapat saya ssh. Saya tidak memerlukan X Server, LXDE dll.

Saya menjalankan Raspbian "wheezy". Saya sudah menonaktifkan "Mulai desktop saat boot" menggunakan raspi-configseperti yang dijelaskan di sini . Tapi saya terus mendapatkan banyak pembaruan paket untuk semua hal-hal desktop yang tidak saya gunakan (saya menjalankan apticron untuk memberi tahu saya tentang pembaruan yang tertunda melalui email), jadi saya ingin sepenuhnya apt-get removesemua paket yang tidak perlu untuk menghindari pembaruan yang tidak perlu ini.

Paket mana yang harus saya hapus?

Sejauh ini, saya telah datang dengan yang berikut:

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

Saya membuat daftar di atas dengan melihat kecakapan untuk semua paket dalam Paket Terpasang -> x11 -> bagian utama yang bukan "instalasi otomatis".

Untuk beberapa alasan ketika saya menjalankan ini, apt-getberi tahu saya bahwa:

The following extra packages will be installed:
  libutempter0 xbitmaps xterm

yang tampaknya sedikit aneh untuk operasi penghapusan .

Apakah ada cara yang lebih mudah? Apakah ada paket "super" yang memiliki semua hal-hal grafis ini dan dapat dihapus, dengan semua ketergantungannya? Dari pemahaman saya, sepertinya ini tidak mungkin, karena hal-hal ini belum diinstal secara otomatis, artinya saya perlu melacak semuanya dan menghapus semuanya secara eksplisit.

Hari
sumber

Jawaban:

85

TL; DR atau "Just scorch my pi"

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

(Ulangi apt-get autoremove --purgesampai tidak ada anak yatim yang tersisa)

Penjelasan lebih lanjut

Jika paket foo bergantung pada paket libfoo lain dan Anda menghapus paket libfoo , dependen ( foo ) juga dihapus. Karena Foo memiliki tergantung garis menentukan libfoo , itu akan rusak untuk meninggalkan foo jika libfoo telah dihapus. Kebalikannya tidak benar: menghapus foo tidak menghapus libfoo secara otomatis. Paket xfoo lain mungkin juga bergantung pada libfoo, jadi apt tidak hanya menghapusnya (walaupun apt akan melacak jika diinstal hanya sebagai efek samping dari menginstal foo dan menawarkan untuk menghapusnya secara otomatis jika Anda memintanya, selama tidak ada orang lain yang bergantung padanya)

Paket-paket meta bergantung pada sekumpulan paket lain dengan cara yang sama seperti foo bergantung pada libfoo , jadi ketika Anda menghapus paket meta, sedikit saja yang biasanya dihapus. Sebagai contoh, mungkin ada dua paket meta yang bergantung pada xterm (mungkin lxsession dan xfsession), tetapi menghapus satu atau keduanya tidak akan menghapus instalan xterm karena xterm tidak rusak tanpa lxsession atau xfsession. Paket meta umumnya di atas pohon dependensi, bukan di bawah, dan beberapa hal cenderung bergantung langsung pada meta-paket. Meta-paket terutama menyediakan cara mudah untuk menginstal satu set paket yang masuk akal sekaligus, tetapi mereka tidak menghapus alat.

Jadi, jika Anda ingin menghanguskan semua yang bergantung pada X11, Anda harus menargetkan kumpulan dasar pustaka libx11 yang pada akhirnya semua aplikasi x11 harus bergantung pada:

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

Ini akan (mensimulasikan) menghapus semua yang akhirnya bergantung pada libx11 -. *, Dan juga akan menghapus paket apa pun yang diinstal sebagai dependensi program X11 bahkan jika mereka tidak secara langsung bergantung pada X11 itu sendiri (CUPS dan Ghostscript biasanya diinstal sebagai efek samping dari menginstal lingkungan desktop). Perintah kedua akan menghapus anak yatim berikutnya sampai tidak ada yang tersisa. Hapus "--auto-hapus" jika Anda ingin melakukan langkah ini nanti atau tidak melakukannya sama sekali, atau cukup tambahkan kembali paket secara manual setelah membersihkan GUI.

Hapus opsi --dry-run untuk benar-benar melakukan operasi setelah Anda memeriksa bahwa itu tidak akan menghapus paket yang tidak ingin Anda hapus.)

Saya lebih suka membersihkan dan membersihkan efek samping, dan menambahkannya kembali sesuai kebutuhan. Juga, saya pergi ke depan dan menguji ini pada pi saya sendiri, dan reboot ke server yang sangat sederhana tetapi fungsional. :)

Mengapa menghapus menginstal sesuatu?

Strategi di atas memecahkan masalah yang disebutkan, tetapi masih ada rasa ingin tahu mengapa operasi penghapusan menghasilkan paket yang diinstal .

Di jantung setiap manajer paket adalah pemecah kepuasan dari beberapa jenis. Ketika Anda memberi tahu manajer paket untuk menginstal beberapa paket, menghapus beberapa paket, atau memutakhirkan beberapa paket, yang benar-benar Anda minta lakukan adalah menyelesaikan keadaan instalasi perangkat lunak yang diinginkan berikutnya dengan serangkaian paket yang tersedia. Solusi ini mungkin termasuk menginstal paket tambahan (dependensi), menghapus paket yang ada (konflik, jeda), menurunkan versi / meningkatkan paket tertentu (tingkat kompatibilitas), atau kombinasi keduanya. Jadi, sementara itu agak berlawanan dengan intuisi bahwa pemecah menentukan bahwa beberapa paket perlu diinstal agar paket lain dihapusMasuk akal. Ini adalah masalah manajemen ketergantungan buruk yang dipecahkan oleh manajer paket.

Contoh konkret: Diberikan satu set aplikasi Java yang sudah diinstal, semuanya tergantung pada runtime yang kompatibel dengan java yang saat ini kebetulan openjdk-7-jre . Anda kemudian meminta manajer paket untuk memecahkan instalasi alat Java baru yang menyatakan suatu konflik dengan openjdk-7-jre tetapi bekerja dengan oracle-7-jre (kedua paket umum memberikan sebuah java-7-runtime ). Solver akan mengusulkan penghapusan dari openjdk-7-jre dan menginstal dari oracle-java-7-jresebagai solusi untuk keadaan yang Anda inginkan agar paket baru diinstal tanpa merusak paket yang ada.

Dalam hal ini spesifik kasus, xterm adalah paket yang menyediakan dependensi virtual yang disebut x-terminal-emulator ( xterm , lxterminal , dan aterm semua memberikan sebuah x-terminal-emulator ), sehingga kemungkinan bahwa dalam menghilangkan lxterminal (sebagai bagian dari menghapus lxde), solver menemukan paket terinstal yang ada ( transcode sebagai contoh yang mungkin) yang memerlukan beberapa jenis x-terminal-emulator , sehingga solver memilih untuk menginstal xterm (yang memerlukan libutempter0 dan xbitmaps, menjelaskan paket-paket lain untuk diinstal) untuk memenuhi ketergantungan yang rusak. Tanpa melihat paket database, saya akan berhipotesis bahwa ini adalah skenario yang paling mungkin.

Untuk menemukan paket yang saat ini bergantung pada xterm (atau alternatif), gunakan perintah apt-cache rdepends (menggunakan sakelar --installed untuk membatasi hanya paket yang diinstal):

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

Ketergantungan yang dimulai dengan karakter alternatif '|' berarti bahwa paket tergantung pada xterm atau sesuatu yang disediakannya (bahwa ada sesuatu x-terminal-emulator dalam kasus ini). The clusterssh paket tergantung pada xterm eksplisit , dan tidak memungkinkan untuk alternatif. Ini adalah daftar pendek dari paket-paket yang menyebabkan xterm diperlukan.

Bagaimana dengan deborphan?

Fungsionalitas pelacakan anak yatim dimasukkan ke dalam apt-get melalui fungsionalitas 'autoremove' pada tahun 2010 (Debian bug 582791 ) yang menjadikan deborphan sebagian besar berlebihan dan pada dasarnya usang. Tidak seperti deborphan dan solusi lain seperti itu, apt-get langsung melacak paket mana yang diinstal secara eksplisit dan paket mana yang diinstal sebagai efek samping atau ketergantungan dari paket yang diinstal secara eksplisit. Misalnya, jika administrator menginstal foo, libfoo diinstal sebagai efek samping dan apt-get autoremove akan , pada kenyataannya, menghapus libfoo jika autoremove (atau --auto-remove) ditentukan saat menghapus foo.

Pendekatan yang diambil oleh deborphan adalah kumpulan tebakan. Misalnya, tebakan bahwa pustaka terinstal yang tidak memiliki dependen harus berupa anak yatim: Jika libfoo diinstal, tetapi bukan foo atau xfoo , deborphan dapat memutuskan bahwa itu haruslah yatim piatu. Satu mode kegagalan di sini adalah bahwa perpustakaan mungkin secara khusus diinstal untuk alat yang mereka sediakan (libxml2 untuk xmllint sebelum dipaket ulang menjadi libxml2-utils) atau hanya tersedia untuk tujuan pengembangan. Paket seperti itu bukan yatim piatu. Selain itu, deborphan berfokus pada perpustakaan, sehingga merindukan sejumlah anak yatim non-perpustakaan yang sesuai trek (paket usang vs paket yatim) .

Maxx Daymon
sumber
2
Brilliant bekerja untukku, terima kasih. Itu memang menghapus muninkarena beberapa alasan, tetapi saya bisa mengembalikannya dengan cukup mudah setelahnya.
Hari
4
Bakar itu! Saya harus mengutip 'libx11-.*'untuk mencegah shell dari globbing.
1
@ Maxx, jawaban yang bagus, tetapi dalam semua skenario Anda, Anda tidak menggambarkan bagaimana itu ketika ia menjalankan apa apt-get removeyang diinginkannya install xtermdan dua lainnya. Saya juga pernah mengalami ini dan tidak bisa menyelesaikannya.
Madivad
2
Bersih, raspbian unexpanded menginstal, setelah apt-get upgrade, dist-upgrade: rootfs ... 94% /. Setelah apt-get remove --auto-remove --purge libx11 -. *: rootfs ... 51% /Jawaban yang bagus, terima kasih banyak!
Daniel F
2
Dan setelah 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

Baris pertama menginstal deborphanyang akan menghapus semua paket yatim.

Baris kedua menghapus paket inti dari sistem X11 LXDE, Samba (Windows File Sharing), font, Gnome, dan hal-hal lain yang berkaitan dengan lingkungan desktop Raspberry Pi.

Baris ketiga menghapus semua paket yatim yang terdeteksi oleh deborphan.

Baris keempat menghapus semua paket yang tidak dibutuhkan.

Baris kelima membersihkan cache paket.

Fabio
sumber
3
Selamat datang di Raspberry Pi Stack Exchange! Meskipun ini secara teknis dapat menjawab pertanyaan, akan lebih baik untuk menyertakan beberapa penjelasan tentang cara kerjanya dan apa yang sebenarnya dilakukannya.
RPiAwesomeness
1
Menjalankan perintah-perintah itu pada pemasangan Raspbian yang baru, saya beralih dari yang bebas dari gigabyte pada kartu SD 4GB menjadi 2,5GB gratis. Bagi saya setidaknya ini adalah jawaban yang benar.
merampok
2
Jawaban yang diterima sangat mendalam tetapi sebenarnya tidak memberikan daftar untuk menyelesaikan masalah OP. Jawaban ini mungkin barebone, tetapi sebenarnya memenuhi apa yang sebenarnya dibutuhkan OP (dan saya)
portforwardpodcast
Mengapa menghapus samba? Ini bukan aplikasi GUI. Mungkin diperlukan untuk jaringan.
Dogweather
9

1 /. Untuk menghapus semua desktop yang baru saja saya lakukan (pergi membuat sepoci kopi. Berjalan-jalanlah ini akan memakan waktu cukup lama) ...
apt-get remove --auto-remove --purge libx11-.*

2 /. Kemudian saya menginstal deborphan untuk menyingkirkan file yatim ...
sudo apt-get install deborphan

Jika Anda ingin melihat apa yang telah yatim piatu, lakukan ini ...
deborphan -sz

3 /. Lalu saya menghapus semua file yatim ...
sudo apt-get remove --purge $(deborphan)

Akhirnya lakukan ini untuk menghapus paket yang tidak perlu yang tidak yatim ...
sudo apt-get autoremove

Hasil akhir: Tanpa kepala dan bersih seperti peluit

James
sumber
2
apt-get remove --dry-runtidak melakukan apa pun , tetapi mencetak pesan di layar.
lenik
7

Memiliki lihat di sini tapi gulir ke bawah ke bagian tentang tasksel.

Berjalan tasksel --list-tasksdi pi melalui wifi ssh memberi saya (setelah sekitar 30 detik):

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

Jadi, tasksel remove desktopharus melakukan apa yang Anda inginkan [lihat komentar] . Halaman manual sedikit singkat dan misterius, mungkin karena tasksel sebagian besar ditujukan untuk pengelola debian. Jika ini berhasil, beri tahu kami;)

goldilocks
sumber
Terima kasih, saya belum pernah mendengarnya tasksel, meskipun saya memiliki cukup banyak pengalaman Ubuntu. Sayangnya saya mencoba ini, butuh beberapa saat untuk menjalankan remove desktopperintah tetapi semua paket "grafis" itu masih ada aptitude.
Hari
Saya juga tidak, tapi saya sedikit gelisah ketika saya perhatikan hanya menghapus beberapa komponen X dasar tidak menarik seluruh tumpukan ketergantungan, yang saya pikir akan melakukannya. Saya menemukan halaman yang lebih baik untuk tasksel, dan benar-benar menjalankan aplikasi ncurses ( taskseltanpa opsi). Cukup yakin sekarang 'u' berarti metapackages tidak diinstal, dan jika Anda menginstal 'desktop', Anda akan mendapatkan lebih dari sekadar versi lxde wiki.debian.org/tasksel Jadi tidak ada dadu. Saya melihat metapackage "xorg" dari apt-cache search metapackagesebenarnya tidak diinstal juga. Salahkan raspbians kurasa.
goldilocks
2
Saya akan membiarkan jawaban ini untuk menyelamatkan seseorang dari jalan buntu, atau siapa pun dapat menjelaskan lebih baik.
goldilocks
5

Atau, Anda dapat mencoba gambar minimal Raspbian ini: http://www.linuxsystems.it/raspbian-wheezy-armhf-raspberry-pi-minimal-image/

Harun
sumber
2
Sama sekali tidak menjawab pertanyaan. Pertanyaannya adalah bagaimana cara menghapus X, bukan bagaimana menginstal OS baru tanpa X. Sebaiknya dibiarkan sebagai komentar, coba ajukan pertanyaan Anda sendiri atau berikan jawaban yang berguna untuk mendapatkan perwakilan yang diperlukan untuk meninggalkan komentar. Tautan yang bagus.
Impuls
3

Berdasarkan informasi tasksel, dimungkinkan untuk mengetahui, bahwa ada tugas-paket meta-desktop, yang merujuk semua paket terkait GUI lainnya. Jadi hanya

sudo apt-get remove task-desktop

Ini akan menghapus banyak paket lain (terkait GUI / Desktop).

Latar Belakang: nama paket task-desktopdapat ditemukan dengan menjalankan perintah tasksel berikut:

tasksel --list-tasks
tasksel --task-packages desktop
geekQ
sumber
0

Pilihan lain adalah menggunakan aptitude yang harus selalu Anda sukai, jika Anda akan melakukan lebih dari sekadar menginstal atau menghapus beberapa paket.

Mulai aptitude sebagai root dengan mengetik sudo aptitude. Dalam tampilan Paket standar aptitude entri daftar terakhir adalah Tasksdi mana Anda dapat memilih berbagai opsi yang terdaftar oleh tasksel. Menavigasi item dengan j, kdan enter. Tandai item yang akan dihapus dengan memasukkan _(garis bawah) pada item yang disorot. Ini hanya menyiapkan tindakan. Untuk menjalankan tindakan, tekan g.

Baca tentang kecakapan dalam manual debian .

BdN3504
sumber
0

Ketikkan kode ini:

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
Raspbian
sumber
1
Jadi, untuk memperjelas, satu-satunya perbedaan antara baris perintah OP dan Anda, adalah penggunaan purgeen lieu remove?
Greenonline