Dengan skrip init (atau dengan openrc) saya selalu dapat menjalankan layanan dari root instalasi yang berbeda.
tetapi ketika saya berlari chroot /somepath/to_root /usr/bin/systemctl start someservice
saya mendapat:
Running in chroot, ignoring request.
Apakah ada cara untuk memaksa systemd menjalankan layanan?
Pembaruan:
Saya lupa mengatakan sistem host saya menjalankan skrip init atau openrc, tetapi tidak pernah systemd, dan bahwa saya menggunakan chroot untuk memecahkan masalah sistem Unix yang bahkan tidak dapat meluncurkan shell minimal.
Jawaban:
Masalah yang terkenal di distro systemd (Arch Linux, OpenSUSE, Fedora).
Systemd menggantikan sysvinit, dan memberikan satu keuntungan besar atas ini. Di sysvinit, ketika Anda meminta layanan untuk memulai, ia mewarisi konteks eksekusi dari orang yang memanggil skrip, yang meliputi variabel lingkungan, ulimit, dan sebagainya. Systemd memperbaiki hal ini sebaliknya dengan memberi tahu daemon, yang akan memulai layanan dalam lingkungan yang terdefinisi dengan baik, sehat, dan konstan, di mana tentu saja kinerja layanan lebih mudah diprediksi, karena lingkungan selalu sama.
Ini menyiratkan bahwa, ketika saya memanggil systemctl dari dalam chroot, itu tidak relevan bahwa saya di dalam chroot, lingkungan yang akan diwarisi masih dari PID 1, bukan yang saya miliki saat ini. Tetapi ini menjadi lebih buruk dari ini: karena soket komunikasi diletakkan di dalam / run / systemd, sebuah proses di chroot bahkan tidak akan dapat berbicara dengan sistem init!
Jadi bagaimana Anda melakukan chroot di distro systemd?
Jika semua yang Anda ingin lakukan adalah memiliki wadah Linux, halaman Arch Wiki ini akan memberi tahu Anda cara mengatur wadah Linux dalam waktu kurang dari 30 detik, terima kasih
systemd-nspawn
.Jika Anda benar-benar menginginkan lingkungan chroot, halaman Web yang indah dan sebening kristal ini akan memberi Anda dua solusi yang berfungsi (yang kedua adalah versi modifikasi dari yang ditawarkan di titik # 1).
sumber
systemd-nspawn
tetapi saya tidak bisa menjalankannya. Dan Tidak, ini bukan untuk wadah karena layanan harus digunakan oleh tuan rumah dan arsitektur target.systemd-nspawn
gagal dengan "Tidak berjalan pada sistem systemd." kecuali tuan rumah menggunakan systemd juga.systemd-nspawn
, maka menunjuk ke root baru tidak akan membantu. Entah host sudah memilikinya (karena menjalankan systemd), dalam hal ini versi host dapat digunakan, atau host tidak memilikinya, tetapi versi root yang baru tidak akan berfungsi.systemd
akan menolak dijalankan dichroot
systemd
hanya mengabaikan "layanan", jadi saya hanya menjalankan perintah daemon secara manual.Jadi, bukannya
saya menggunakan
sumber
startx
akan bekerja untukXorg
.Beberapa tahun belakangan saya harus mengakui bahwa hanya ada satu solusi untuk sebagian besar masalah praktis Systemd. Karena kesalahannya adalah Systemd sendiri
Saya benar-benar muak dengan Systemd karena saya punya masalah yang tidak pernah saya hadapi dengan hal-hal seperti Upstart atau Openrc:
systemd-udevd
yang membutuhkansystemd-init
yang membutuhkansystemd-boot
paket yang tidak dapat diinstal pada saat yang sama daripadagrub2
juga tidak dapat membaca gambar kernel dari partisi reiser4.networkd
.Satu-satunya solusi:
Systemd adalah kompleks unessary untuk memecahkan masalah: seperti alsa, bukan ossv4. Jadi jika Anda memiliki sesuatu yang menggunakan systemd cukup hapus semua data:
dan instal sesuatu yang tidak menggunakannya sama sekali sambil menyelesaikan masalah SysV Init seperti Gentoo dengan Openrc.
Mengenai sistem pertanyaan saya, membuat hal-hal seperti registri Windows®: jika sebagian dari itu kacau, maka sudah berakhir.
sumber
Tidak. Layanan dijalankan oleh systemd (pid 1), bukan oleh systemctl secara langsung (yang hanya mengirimkan permintaan awal), dan karena systemd berjalan di luar chroot, maka layanannya juga akan dijalankan.
Meskipun secara teknis dimungkinkan untuk mengimplementasikan ini (dengan membuat systemctl entah bagaimana meneruskan akarnya ke systemd), itu agak tidak mungkin terjadi karena sudah ada alat untuk membuat kontainer penuh (
systemd-nspawn /somepath/to_root
). Anda selalu dapat menghubungi milis .sumber
RootDirectory=
juga karena Anda sangat kekurangan upvotes. (-:RootDirectory
danchroot
perintah?pid 1
init?Menghadapi masalah ini sekali mencoba memunculkan jaringan dalam mode penyelamatan menggunakan konfigurasi jaringan dari chroot. Akhirnya ini bekerja untuk saya:
atau:
sumber
Jika Anda meluncurkan layanan gaya inetd dengan aktivasi soket, pertimbangkan untuk meluncurkan stunnel sebagai gantinya dengan file konfigurasi yang menentukan chroot dan biner Anda sebagai target peluncuran gaya inetd.
Perhatikan bahwa Anda mungkin memiliki masalah SELINUX. Pada sistem Oracle Linux 7.1, saya harus "chcon -v --type = stunnel_etc_t" pada semua file yang perlu dibaca oleh stunnel.
Anda harus menggunakan enkripsi TLS di sisi klien soket (yaitu, stunnel lain dengan "client = yes" di konfigurasi). Beri tahu saya jika Anda ingin detail lebih lanjut tentang ini.
sumber
Anda dapat menggunakan
nohup
perintah untuk memulai layanan di chroot. Untuk memulaihttpd
layanan misalnya, saya melakukannya seperti ini.untuk menghentikannya
pkill httpd
sumber
Running in chroot, ignoring request.
. Saya tidak berpikir Anda melakukannya sepanjang waktu chroot. Memang, skrip startup membutuhkan systemd.