Bekerja dengan paket di lingkungan yang terisolasi. Menggunakan set data dan penjara zfs

Di artikel sebelumnya, kami menjelaskan cara kerja sistem distribusi plugin di versi ICS yang baru. Hari ini kita akan berbicara tentang cara menerapkan satu plugin dalam sistem.

Yang terbaik adalah menjalankan setiap plugin di kotak pasir yang disesuaikan secara khusus dengan persyaratan plugin. Selain itu, dalam lingkungan yang memungkinkan sistem berinteraksi dengan plugin dan plugin satu sama lain. Berikut ini, untuk memahami bahwa ini berlaku untuk penanganan paket standar, kita akan menggunakan istilah "paket".



Apa yang harus dipilih?



Apa yang digunakan untuk ini dalam banyak kasus? Docker, tentu saja!



pkg install docker



pkg: Tidak ada paket yang tersedia untuk menginstal 'docker' yang cocok ditemukan di repositori







Docker tidak memiliki dukungan resmi FreeBSD, dan tentu saja tidak ada paket seperti itu di repositori. Di versi IKS sebelumnya, kami menggunakan port docker yang ditulis sendiri secara tidak resmi, tetapi dukungannya cukup melelahkan, dan selain itu, banyak jebakan muncul saat menggunakannya.







Tetapi FreeBSD memiliki dukungan aslinya sendiri untuk lingkungan yang terisolasi. Itu disebut penjara dan tidak lebih buruk untuk tujuan kita daripada buruh pelabuhan. Perlu dicatat bahwa ini muncul jauh lebih awal daripada container di Linux. Mari kita lihat bagaimana wadah tipikal dikonfigurasi (sel dalam terminologi bsd).



Mempersiapkan dataset dan menginstal paket



Pertama-tama, Anda perlu membuat kumpulan data tempat sel paket akan dikonfigurasi. Sistem kami menggunakan sistem file ZFS, yang memungkinkan kami membuat sejumlah kumpulan data yang diwariskan.



Secara default, sistem memiliki kumpulan data dengan dunia dasar FreeBSD, tempat kami membuat snapshot (snapshot):



zfs snapshot zp000111 / freebsd @ snap



zp000111 adalah nama kumpulan sistem file root kami. Kita bisa melihatnya melalui perintah zfs mount . zp000111 / freebsd adalah nama dataset yang menyimpan dunia. Nama foto ditunjukkan melalui simbol @ . Kami membuat snapshot ini sekali dan di masa mendatang semua dataset untuk paket akan diwarisi darinya.



Dari snapshot ini, kami membuat klon tempat paket kami akan hidup:



zfs clone zp000111 / freebsd @ snap zp000111 / packets / <packet_name>



Pertama, kami akan memasang dataset ke sistem saat ini:



mount -t zfs zp000111 / packets / < packet_name> / mnt / packets / <packet_name>



Dan sekarang kita dapat menginstal paket yang diperlukan ke dalamnya:



pkg -r / mnt / packets / <packet_name> install -y <packet_name>



Sakelar -r memastikan instalasi di dalam direktori yang ditentukan.



Jika perlu, kita dapat menginstal paket lain yang diperlukan, misalnya mc untuk memudahkan pekerjaan di dalam paket.



Kami melakukan unmount. Ini tidak perlu, tetapi berguna untuk terus memulai sel di masa mendatang:



umount / mnt / packets / <packet_name>



Persiapan sel



Pertama, Anda perlu memutuskan penyimpanan data paket dalam sistem produksi. Biarlah / usr / local / share / packets.



Tambahkan direktori <packet_name>



mkdir / usr / local / share / packets / <packet_name> ke dalamnya



Sekarang buat file dengan mount point <packet_name> .fstab. Ini berisi informasi untuk jail tentang direktori mana dalam



set data yang di-mount yang disinkronkan: / usr / local / share / packets / <packet_name> / mnt / packets / <packet_name> / usr / local / share / data nullfs rw 0 0



Ini adalah bagaimana kami menginformasikan bahwa direktori / usr / local / share / data akan terhubung ke direktori di sistem kerja kami dalam paket terpasang kami. Ini adalah sebuah penjara (sistem file nullfs), baik membaca dan menulis diperbolehkan untuk bertukar data dengan sistem eksternal (rw), menyimpan informasi tentang sistem file dan memeriksa integritasnya tidak diperlukan (0 dan 0).



Kami menyimpan file di tempat yang nyaman, misalnya, di /usr/local/etc/packets/<packet_name>/<packet_name>.fstab



Sekarang kita perlu menyiapkan file konfigurasi untuk jail paket kami.



Konfigurasi tipikal dengan pengaturan minimal terlihat seperti ini
host.hostname = "<packet_name>";

path = " /mnt/packets/<packet_name>";

interface = ยซem0ยป;

ip4.addr = 192.168.0.1;

allow.raw_sockets = 1;

exec.start = "/bin/sh /etc/rc";

exec.stop = "/bin/sh /etc/rc.shutdown;";

exec.clean;

enforce_statfs = 0;

mount.devfs;

mount.fstab = /usr/local/etc/packets/<packet_name>/<packet_name>.fstab;



Kami menentukan salah satu kartu jaringan dalam sistem sebagai antarmuka. Kami memberinya alamat ip, yang akan tersedia dari luar. Selain itu, agar fungsi jaringan berfungsi, seperti ping atau traceroute, kami mengaktifkan opsi allow.raw_sockets.



Bagian perintah exec menentukan perintah mana yang akan dijalankan untuk memulai dan mematikan sistem di dalam jail. Karena ini adalah dunia FreeBSD standar, kami menentukan jalur dasar untuk menghidupkan dan mematikan sistem.



Dengan tiga opsi terakhir, kami mengizinkan pemasangan sistem eksternal, menghubungkan perangkat fisik, dan memasang folder data kami di dalam jail ke folder eksternal sesuai dengan file fstab yang dibuat.



Kami menyimpan file kami di tempat yang nyaman, misalnya, di direktori yang sama /usr/local/etc/packets/<packet_name>/<packet_name>.jail.conf





Kami siap untuk meluncurkan paket di dalam kandang. Mari kita mulai dengan memasang kumpulan data paket:



mount -t zfs zp000111 / packets / <packet_name> / mnt / packets / <packet_name>



Sekarang kita dapat menjalankan



jail : jail -f / usr / local / etc / packets / <packet_name> / <packet_name> .jail.conf -c <packet_name>



Dengan opsi -r, kita menentukan jalur ke file konfigurasi, dan -c perlu membuat jail baru dengan nama yang ditentukan.



Sel kita sudah dimulai, kita bisa memeriksanya:



jls -j <packet_name>



Sebuah baris dengan nama sel dan id-nya di sistem jail akan ditampilkan.



Sekarang, jika kita perlu masuk ke sistem kerja dari paket tersebut, jalankan perintah:



jexec <jail_id>/ bin / tcsh



Untuk menghentikan



jail



dan melepas paket, jalankan perintah sebaliknya: jail -f /usr/local/etc/packets/<packet_name>/<packet_name>.jail.conf -r <packet_name> umount / mnt / packets / <packet_name >



Selain itu, semua data yang disimpan oleh paket di folder / usr / local / share / data dari sistem filenya akan tersedia di bawah jalur / usr / local / share / packets / <packet_name> di sistem eksternal.



Total



Jadi, kami telah menciptakan lingkungan yang terisolasi untuk paket kami.



Sel di luar akan melakukan ping ke alamat yang ditentukan, dan, karenanya, semua layanan jaringan yang dibesarkan di dalamnya juga akan tersedia di dalamnya. Dan karena data pengguna disimpan dalam folder eksternal pada sistem produksi, maka mudah untuk disimpan dan dicadangkan.



Sistem serupa akan bekerja di versi baru IKS , yang akan membuat penggunaannya lebih mudah dan menyenangkan.



Sekian untuk hari ini, terima kasih atas perhatiannya!



All Articles