GNU/Linux >> Belajar Linux >  >> Linux

Mengelola perangkat keras Anda yang terpasang di Linux dengan systemd-udevd

Linux melakukan pekerjaan yang hebat secara otomatis mengenali, memuat, dan mengekspos perangkat keras yang terpasang dari vendor yang tak terhitung jumlahnya. Faktanya, fitur inilah yang, bertahun-tahun yang lalu, meyakinkan saya untuk bersikeras bahwa majikan saya mengubah seluruh infrastrukturnya ke Linux. Titik masalahnya adalah cara perusahaan tertentu di Redmond tidak dapat memuat driver untuk kartu jaringan terintegrasi di desktop Compaq kami sementara Linux melakukannya dengan mudah.

Pada tahun-tahun sejak itu, perpustakaan perangkat yang dikenali Linux telah berkembang pesat seiring dengan kecanggihan prosesnya. Dan bintang acara itu adalah udev. Tugas Udev adalah mendengarkan kejadian dari kernel Linux yang melibatkan perubahan status perangkat. Ini bisa berupa perangkat USB baru yang dicolokkan atau dicabut, atau mungkin mouse nirkabel yang offline karena tenggelam dalam kopi yang tumpah.

Tugas Udev adalah menangani semua perubahan status dengan, misalnya, menetapkan nama atau izin melalui perangkat yang diakses. Catatan perubahan tersebut dapat diakses melalui dmesg. Karena dmesg biasanya mengeluarkan ribuan entri, sebaiknya filter hasilnya. Contoh di bawah menunjukkan cara Linux mengidentifikasi antarmuka WiFi saya. Ini menunjukkan chipset yang digunakan perangkat nirkabel saya (ath9k ), nama asli yang ditetapkan di awal proses (wlan0 ), dan nama permanen besar dan jelek yang saat ini digunakan (wlxec086b1ef0b3 ):

$ dmesg | grep wlan
[    5.396874] ath9k_htc 1-3:1.0 wlxec086b1ef0b3:diganti namanya dari wlan0

Dalam artikel ini, saya akan membahas mengapa ada orang yang ingin menggunakan nama seperti itu. Sepanjang jalan, saya akan menjelajahi anatomi file konfigurasi udev dan kemudian menunjukkan cara membuat perubahan pada pengaturan udev, termasuk cara mengedit cara sistem memberi nama perangkat. Artikel ini didasarkan pada modul dari kursus baru saya, Pengoptimalan Sistem Linux.

Memahami sistem konfigurasi udev

Pada mesin systemd, operasi udev dikelola oleh systemd-udevd daemon. Anda dapat memeriksa status daemon udev dengan cara systemd biasa menggunakan systemctl status systemd-udevd .

Lebih banyak sumber daya Linux

  • Lembar contekan perintah Linux
  • Lembar contekan perintah Linux tingkat lanjut
  • Kursus online gratis:Ikhtisar Teknis RHEL
  • Lembar contekan jaringan Linux
  • Lembar contekan SELinux
  • Lembar contekan perintah umum Linux
  • Apa itu container Linux?
  • Artikel Linux terbaru kami

Secara teknis, udev bekerja dengan mencoba mencocokkan setiap peristiwa sistem yang diterimanya dengan serangkaian aturan yang ditemukan di /lib/udev/rules.d/ atau /etc/udev/rules.d/ direktori. File aturan termasuk kunci kecocokan dan kunci penetapan. Kumpulan kunci kecocokan yang tersedia mencakup tindakan , nama , dan subsistem . Ini berarti bahwa jika perangkat dengan nama tertentu yang merupakan bagian dari subsistem tertentu terdeteksi, maka perangkat tersebut akan diberi konfigurasi prasetel.

Kemudian, pasangan kunci/nilai "penugasan" digunakan untuk menerapkan konfigurasi yang diinginkan. Anda dapat, misalnya, menetapkan nama baru ke perangkat, mengaitkannya dengan symlink sistem file, atau membatasi akses ke pemilik atau grup tertentu. Berikut kutipan dari aturan seperti itu dari workstation saya:

$ cat /lib/udev/rules.d/73-usb-net-by-mac.rules
# Gunakan nama berbasis MAC untuk antarmuka jaringan yang secara langsung atau tidak langsung
# pada USB dan memiliki alamat MAC (stabil) yang dikelola secara universal (bit kedua
# adalah 0). Jangan lakukan ini saat ifnames dinonaktifkan melalui baris perintah kernel atau
# menyesuaikan/menonaktifkan 99-default.link (atau sebelumnya 80-net-setup-link.rules).

IMPORT {cmdline}="net.ifnames"
ENV{net.ifnames}=="0", GOTO="usb_net_by_mac_end"

ACTION=="add", SUBSYSTEM=="net ", SUBSYSTEMS=="usb", NAME=="", \
    ATTR{address}=="?[014589cd]:*", \
    TEST!="/etc/udev/rules .d/80-net-setup-link.rules", \
    TEST!="/etc/systemd/network/99-default.link", \
    IMPORT{builtin}="net_id" , NAME="$env{ID_NET_NAME_MAC}"

tambahkan action memberitahu udev untuk dijalankan setiap kali perangkat baru dicolokkan yang merupakan bagian dari subsistem jaringan dan adalah perangkat USB. Selain itu, jika saya memahaminya dengan benar, aturan hanya akan berlaku jika perangkat memiliki alamat MAC yang terdiri dari karakter dalam rentang tertentu dan, sebagai tambahan, hanya jika 80-net-setup-link.rules dan 99-default.link file tidak ada.

Dengan asumsi semua kondisi ini terpenuhi, ID antarmuka akan diubah agar sesuai dengan alamat MAC perangkat. Ingat entri dmesg sebelumnya yang menunjukkan bagaimana nama antarmuka saya diubah dari wlan0 ke wlxec086b1ef0b3 yang jahat itu nama? Itu adalah hasil dari eksekusi aturan ini. Bagaimana aku tahu? Karena ec:08:6b:1e:f0:b3 adalah alamat MAC perangkat (dikurangi titik dua):

$ ifconfig -a
wlxec086b1ef0b3:flags=4163  mtu 1500
        inet 192.168.0.103  netmask 255.255.255.0  broadcast 192.168.0 . 
   

        ether ec:08:6b:1e:f0:b3  txqueuelen 1000  (Ethernet)
        Paket RX 684,5 MB)<69 byte (714,5 MB) br />        Kesalahan RX 0  turun 0  melampaui 0  bingkai 0
        Paket TX 472448  byte 201773965 (201,7 MB)
        Kesalahan TX 0  menjatuhkan 0 melampaui 0  pembawa 0  pratabrakan 0
Aturan udev ini ada secara default di Linux. Saya tidak harus menulisnya sendiri. Tetapi mengapa repot—terutama melihat betapa sulitnya bekerja dengan penunjukan antarmuka seperti itu? Perhatikan kedua komentar yang disertakan dengan aturan:

# Gunakan nama berbasis MAC untuk antarmuka jaringan yang secara langsung atau tidak langsung
# pada USB dan memiliki alamat MAC (stabil) yang diatur secara universal (bit kedua
# adalah 0). Jangan lakukan ini saat ifnames dinonaktifkan melalui baris perintah kernel atau
# menyesuaikan/menonaktifkan 99-default.link (atau sebelumnya 80-net-setup-link.rules).

Perhatikan bagaimana aturan ini dirancang khusus untuk antarmuka jaringan berbasis USB. Tidak seperti kartu antarmuka jaringan (NIC) PCI, perangkat USB kemungkinan besar akan dilepas dan diganti dari waktu ke waktu. Artinya, tidak ada jaminan bahwa ID mereka tidak akan berubah. Mereka bisa menjadi wlan0 suatu hari dan wlan3 selanjutnya. Agar aplikasi tidak membingungkan, tetapkan ID absolut perangkat—seperti yang diberikan ke antarmuka USB saya.

Memanipulasi pengaturan udev

Untuk trik saya berikutnya, saya akan mengambil alamat MAC dan ID saat ini untuk antarmuka jaringan Ethernet pada mesin virtual VirtualBox dan kemudian menggunakan informasi itu untuk membuat aturan udev baru yang akan mengubah ID antarmuka. Mengapa? Yah, mungkin saya berencana untuk bekerja dengan perangkat dari baris perintah, dan mengetik nama panjang itu bisa mengganggu. Begini cara kerjanya.

Sebelum saya dapat mengubah ID saya, saya harus menonaktifkan konfigurasi jaringan Netplan saat ini. Itu akan memaksa Linux untuk memperhatikan konfigurasi baru. Ini file konfigurasi antarmuka jaringan saya saat ini di /etc/netplan/ direktori:

$ less /etc/netplan/50-cloud-init.yaml
# File ini dihasilkan dari informasi yang diberikan oleh
# sumber data. Perubahannya tidak akan bertahan di seluruh instance.
# Untuk menonaktifkan kemampuan konfigurasi jaringan cloud-init, tulis file
# /etc/cloud/cloud.cfg.d/99-disable-network-config .cfg dengan berikut:
# network:{config:disabled}
network:
    ethernets:
        enp0s3:
            alamat:[]
            dhcp4:benar
    versi:2

50-cloud-init.yaml file berisi definisi antarmuka yang sangat mendasar. Tetapi itu juga mencakup beberapa informasi penting tentang menonaktifkan konfigurasi di komentar. Untuk melakukannya, saya akan pindah ke /etc/cloud/cloud.cfg.d direktori dan buat file baru bernama 99-disable-network-config.cfg dan tambahkan jaringan:{config:disabled} string.

Meskipun saya belum menguji metode ini pada distro selain Ubuntu, metode ini seharusnya bekerja pada semua rasa Linux dengan systemd (yang hampir semuanya). Apa pun yang Anda gunakan, Anda akan melihat cara menulis file konfigurasi udev dan mengujinya.

Selanjutnya, saya perlu mengumpulkan beberapa informasi sistem. Menjalankan ip perintah melaporkan bahwa antarmuka Ethernet saya disebut enp0s3 dan alamat MAC-nya adalah 08:00:27:1d:28:10 :

$ ip a
2:enp0s3: mtu 1500 qdisc fq_codel state UP grup default qlen 1000
    link/ether 08:00:27:1d:28:10 brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.115/24 brd 192.168.0.255 lingkup global dynamic enp0s3

Sekarang, saya akan membuat file baru bernama peristent-net.rules di /etc/udev/rules.d direktori. Saya akan memberi nama file yang dimulai dengan angka rendah, 10:

$ cat /etc/udev/rules.d/10-persistent-network.rules
ACTION=="add", SUBSYSTEM=="net",ATTR{address}=="08:00:27:1h:28:10",NAME="eth3"

Semakin rendah angkanya, semakin awal Linux akan mengeksekusi file tersebut, dan saya ingin yang ini berjalan lebih awal. File berisi kode yang akan memberi nama eth3 ke perangkat jaringan saat ditambahkan—asalkan alamatnya cocok dengan 08:00:27:1d:28:10 , yang merupakan alamat MAC antarmuka saya.

Setelah saya menyimpan file dan mem-boot ulang mesin, nama antarmuka baru saya harus dimainkan. Saya mungkin perlu masuk langsung ke mesin virtual saya dan menggunakan dhclient untuk secara manual membuat Linux meminta alamat IP pada jaringan yang baru dinamai ini. Membuka sesi SSH mungkin tidak mungkin dilakukan tanpa melakukannya terlebih dahulu:

$ sudo dhclient eth3 

Selesai. Jadi Anda sekarang dapat memaksa udev untuk membuat komputer Anda merujuk ke NIC seperti yang Anda inginkan. Namun yang lebih penting, Anda memiliki alat untuk mengetahui cara mengelola apa pun perangkat bermasalah.


Linux
  1. Pantau sistem Linux Anda di terminal Anda dengan procps-ng

  2. Pindai keamanan Linux Anda dengan Lynis

  3. Mengelola partisi di Linux dengan fdisk

  1. Dengarkan musik favorit Anda di Linux dengan Juk

  2. Gunakan lspci di Linux untuk melihat perangkat keras Anda

  3. Perintah Linux untuk menampilkan informasi perangkat keras Anda

  1. Pantau Java Anda di Linux dengan jconsole

  2. Pantau server Linux Anda dengan Checkmk

  3. Buka potensi tersembunyi Chromebook Anda dengan Linux