GNU/Linux >> Belajar Linux >  >> Linux

Membangun wadah dengan tangan menggunakan ruang nama:Ruang nama UTS

Artikel ini dibuat berdasarkan artikel saya sebelumnya tentang ruang nama, 7 ruang nama Linux yang paling banyak digunakan, dan seri saya tentang Membangun wadah Linux dengan tangan menggunakan ruang nama, menggunakan ruang nama mount, dan menggunakan ruang nama PID. Artikel ini membahas namespace UTS dan hubungannya dengan container.

Pengamat biasa sering salah memahami namespace Unix Timesharing System (UTS), terutama karena namanya tidak lagi sesuai dengan tujuannya. Terlepas dari namanya, namespace UTS sebenarnya mengontrol nama host dan domain NIS. Berikut adalah cara halaman manual menjelaskan ruang nama UTS:

Pengidentifikasi ini disetel menggunakan sethostname(2) dan setdomainname(2) , dan dapat diambil menggunakan uname(2) , gethostname(2) , dan getdomainname(2) . Perubahan yang dibuat pada pengidentifikasi ini terlihat oleh semua proses lain di ruang nama UTS yang sama, tetapi tidak terlihat oleh proses di ruang nama UTS lainnya.

Ini berarti bahwa beberapa alat modern (systemd dan lainnya) mungkin tidak menyebabkan perubahan yang Anda harapkan.

Seperti yang dapat Anda bayangkan, mungkin ada beberapa kasus penggunaan di mana Anda mungkin ingin proses memiliki nama host yang berbeda. Server web, misalnya, cenderung memberikan peringatan jika nama host tidak cocok dengan sertifikat SSL yang mereka layani. Di sisi lain, beberapa proses mungkin melampirkan nama host ke proses jaringan. Nama host yang salah dapat menyebabkan koneksi gagal atau ditolak atau berbagai masalah lainnya.

Dengan semua itu, mari masuk ke beberapa contoh.

Jelajahi ruang nama UTS

Anda dapat memanggil namespace UTS dengan:

$ unshare --uts /bin/bash

Namun, Anda mungkin memperhatikan bahwa begitu Anda berada di namespace baru, menggunakan hostnamectl set-hostname tidak mengubah nama host di namespace baru.

# unshare --uts
# hostname
bastion.stratus.lab
# hostnamectl set-hostname tux
# hostname
bastion.stratus.lab

Namun, jika Anda membuka shell baru, nama host sebenarnya telah berubah:

[user@host ~]$ ssh root@bastion
Last login: Tue Dec 7 08:17:48 2021 from 192.168.99.198
[root@tux ~]# hostname
tux

Kenapa ini? Systemd tidak menjalankan sethostname panggilan sistem. Sebagai gantinya, systemd menyelesaikan tugas dengan menghubungkan ke soket. Karena soket dikaitkan dengan namespace lama, nama host namespace lama disesuaikan tetapi bukan namespace baru.

Menggunakan ruang nama root

Di artikel mount namespace saya, saya menulis:

Sekarang setelah Anda berada di dalam namespace baru, Anda mungkin tidak berharap untuk melihat titik pemasangan asli dari host. Namun, ini tidak terjadi. Alasan untuk ini adalah bahwa systemd secara default membagikan titik pemasangan secara rekursif dengan semua ruang nama baru.

Seperti yang terjadi, systemd memperoleh banyak informasinya dari /run , yang dibagi ke dalam namespace yang saya buat di sini.

Dalam artikel mount namespace, saya memasang tmpfs ke namespace baru pada direktori yang tidak ingin saya bagikan dengan namespace lama.

Saya dapat menonaktifkan sebagian besar panggilan systemd dengan memasang namespace baru dengan opsi berikut:

$ unshare --mount --uts /bin/bash

Kemudian remount /run :

$ mount -t tmpfs tmpfs /run

Seluruh proses terlihat seperti ini:

# unshare --fork --mount --uts /bin/bash
# mount -t tmpfs tmpfs /run
# hostnamectl set-hostname bastion.stratus.lab
System has not been booted with systemd as init system (PID 1). Can't operate.
Failed to connect to bus: Host is down
# hostname tux
# hostname
tux

Saya dapat mengkonfirmasi ini dengan membuka shell baru ke kotak:

[user@host ~]$ ssh root@bastion
Last login: Tue Dec 7 08:33:04 2021 from 192.168.99.198
[root@bastion ~]# hostname
bastion.stratus.lab

Saya dapat menemukan namespace yang sesuai dengan menggunakan lsns perintah:

[root@bastion ~]# lsns |grep uts
4026531838 uts 133 1 root /usr/lib/systemd/systemd --switched-root --system --deserialize 31
4026532250 uts 1 645 root /usr/lib/systemd/systemd-udevd
4026532405 uts 1 743 root /usr/lib/systemd/systemd-logind
4026532479 mnt 2 11507 root unshare --fork --mount --uts /bin/bash
4026532480 uts 2 11507 root unshare --fork --mount --uts /bin/bash

Saya kemudian dapat memasukkan namespace dengan nsenter perintah:

[root@bastion ~]# nsenter -t 11507 -a 
[root@tux /]#

Menggunakan ruang nama pengguna

Dalam artikel ruang nama pengguna saya, saya menyebutkan beberapa pertimbangan tambahan saat membuat ruang nama sebagai pengguna yang tidak memiliki hak istimewa:

Saat Anda membuat ruang nama pengguna baru, pengguna Anda saat ini akan dipetakan ke pengguna bukan siapa-siapa . Ini karena, secara default, tidak ada pemetaan ID pengguna yang dilakukan. Saat tidak ada pemetaan yang ditentukan, namespace hanya menggunakan aturan sistem Anda untuk menentukan cara menangani pengguna yang tidak ditentukan.

Lihat kembali artikel tersebut untuk mengetahui lebih lanjut tentang pemetaan pengguna. Dalam hal ini, saya ingin memiliki root pengguna dipetakan secara otomatis. Dengan cara ini, saya memiliki "root" di namespace baru. (Sekali lagi, lihat artikel ruang nama pengguna untuk diskusi tentang ruang nama dan izin).

Jika saya mempraktikkan pelajaran gabungan saya di host CentOS Stream 9, saya mengamati:

ocp@bastion ~  $ unshare --map-root-user --user --mount --uts --fork /bin/bash
root@bastion ~  $ hostnamectl set-hostname tux
Could not set static hostname: Interactive authentication required.

Ini karena cara polkit dikonfigurasi pada keluarga distribusi RHEL. Distribusi lain tidak selalu membuang kesalahan ini. Arch Linux (tanpa polkit) khusus konfigurasi), misalnya, masih memungkinkan wadah untuk mengubah nama host. Oleh karena itu, terlepas dari distribusi Anda, tetap merupakan praktik keamanan yang baik untuk me-remount /run .

Penting untuk dicatat bahwa output dari lsns mungkin lebih mudah dibaca dengan menggunakan --fork saat membuat ruang nama.

Berikut tampilannya tanpa --fork bendera:

[root@bastion ~]# lsns |grep uts
4026531838 uts 135 1 root /usr/lib/systemd/systemd --switched-root --system --deserialize 31
4026532250 uts 1 645 root /usr/lib/systemd/systemd-udevd
4026532405 uts 1 743 root /usr/lib/systemd/systemd-logind
4026532414 uts 1 11962 ocp /bin/bash

Dan dengan --fork bendera:

[root@bastion ~]# lsns |grep uts
4026531838 uts 134 1 root /usr/lib/systemd/systemd --switched-root --system --deserialize 31
4026532250 uts 1 645 root /usr/lib/systemd/systemd-udevd
4026532405 uts 1 743 root /usr/lib/systemd/systemd-logind
4026532412 user 2 11939 ocp unshare --map-root-user --user --mount --uts --fork /bin/bash

Sementara --fork tidak sepenuhnya diperlukan dalam skenario ini, mungkin berguna atau bahkan diperlukan jika ruang nama PID baru diperlukan (lihat artikel ruang nama PID saya untuk informasi lebih lanjut).

Menutup

Namespace UTS bukanlah namespace Linux yang paling rumit. Namun, ini cukup berguna, terutama dalam konteks container.

Untuk memaksimalkan namespace UTS, gabungkan dengan mount namespace, minimal, saat menggunakan root namespace dan mount dan namespace pengguna saat muncul dari pengguna yang tidak memiliki hak istimewa.

[ Unduh lembar contekan Linux perantara untuk menyimpan perintah utama di ujung jari Anda. ]

Dalam artikel saya berikutnya, saya akan membahas net namespace dan cara menggunakannya untuk mengaktifkan namespace agar memiliki IP dan port space sendiri.


Linux
  1. Memecahkan masalah menggunakan sistem file proc di Linux

  2. Demystifying namespace dan container di Linux

  3. Membangun kepercayaan di komunitas Linux

  1. Linux – Bagaimana Cara Mendaftar Namespace Di Linux?

  2. Linux – Apa itu Namespace Uts?

  3. Menggunakan –exclude Dengan Perintah Du?

  1. 7 namespace Linux yang paling banyak digunakan

  2. Menggunakan Antarmuka Catur Universal

  3. Menjalankan aplikasi Qt melalui web