Cara Konfigurasi dnf-automatic di Rocky dan AlmaLinux
Ketahui cara menetapkan dnf-automatic untuk kemas kini keselamatan automatik di Rocky Linux 9 dan AlmaLinux 9. Panduan ini merangkumi tetapan systemd timer dan e-mel.
Apakah fungsi dnf-automatic pada Rocky Linux dan AlmaLinux
dnf-automatic ialah cara untuk mendapatkan kemas kini keselamatan tanpa pengawasan pada Rocky Linux dan AlmaLinux. Ia merupakan satu program kecil yang dimulakan oleh systemd timer, yang membaca /etc/dnf/automatic.conf dan melaksanakan apa yang dibenarkan oleh fail tersebut. Pemasangannya hanya memerlukan satu arahan. Selebihnya panduan ini adalah mengenai tetapan yang menentukan sama ada ia melindungi pelayan atau sekadar beroperasi tanpa melakukan apa-apa.
Jika anda datang daripada Debian atau Ubuntu, ini adalah tugas yang sama dengan apa yang dilakukan oleh unattended-upgrades pada VPS Ubuntu. Satu perbezaan lebih penting daripada yang lain: maksud perkataan "security" kepada pengurus pakej. Pada Ubuntu, ia merupakan arkib berasingan. Pada keluarga RHEL, ia adalah metadata yang dilampirkan pada nasihat (advisory) yang diterbitkan, dan metadata tersebut boleh hilang atau tidak dikemas kini. Jika anda menghalakan dnf-automatic kepada repositori yang tiada data nasihat, ia tidak akan memasang apa-apa walaupun melaporkan kejayaan.
Panduan ini ditulis berdasarkan Rocky Linux 9 dan AlmaLinux 9, yang menggunakan DNF 4 (DNF ialah pengurus pakej bagi keluarga RHEL), setakat Ogos 2026. Keluaran versi 10 telah beralih kepada DNF5 dan nama-namanya berubah di sana, jadi ia mempunyai bahagian tersendiri di penghujung panduan ini. Setiap arahan di bawah adalah untuk anda jalankan pada pelayan anda sendiri, dengan output yang sepatutnya anda jangkakan di sebelahnya.
Pasang dnf-automatic dan baca konfigurasi yang disertakan
Mendayakan kemas kini automatik adalah sebahagian daripada persediaan yang perlu dilakukan dalam sepuluh minit pertama pada VPS baharu, sebaik sahaja anda mempunyai pengguna bukan root dan firewall.
sudo dnf install -y dnf-automatic
rpm -q dnf dnf-automatic
systemctl is-enabled dnf-automatic.timersystemctl is-enabled mencetak disabled pada pemasangan baharu, kerana memasang pakej tersebut tidak memulakan apa-apa. Itulah sebab paling biasa mengapa pelayan yang "mempunyai dnf-automatic" tidak pernah melaksanakan satu pun kemas kini.
Versi DNF penting untuk satu pilihan. Tetapan reboot tiba dalam DNF 4.15, dan Red Hat telah memindahkan ciri tersebut ke dalam dnf-4.14.0-6.el9 pada November 2023 melalui nasihat RHBA-2023:6645. Rocky 9 dan AlmaLinux 9 membina semula pakej tersebut, jadi pelayan semasa mempunyainya manakala pelayan yang tidak dikemas kini sejak 2023 tidak mempunyainya.
Fail konfigurasi ialah /etc/dnf/automatic.conf. Salinan yang disertakan menyenaraikan setiap pilihan yang difahami oleh binaan ini, bersama nilai lalainya yang diletakkan dalam komen. Baca fail tersebut sekali sebelum anda menyuntingnya, kerana fail itu merupakan sumber kebenaran bagi versi anda.
Dua suis yang menentukan tindakan yang diambil
download_updates dan apply_updates dalam bahagian [commands] menentukan kelakuan sistem. Kedua-duanya ditetapkan kepada no secara lalai pada EL9 (enterprise Linux 9, asas kongsi bagi Rocky 9 dan AlmaLinux 9), jadi dnf-automatic yang tidak disunting dan anda aktifkan hanya akan memberitahu anda apa yang tersedia.
- Kedua-duanya
no: dnf-automatic melaporkan kemas kini yang tersedia dan tidak mengubah apa-apa pada pelayan. download_updates = yesdenganapply_updates = no: pakej dimuat turun ke dalam cache DNF. Pemasangan kemudiannya menjadi pantas dan tidak memerlukan rangkaian, tetapi tiada perubahan dilakukan pada malam tersebut.- Kedua-duanya
yesdenganupgrade_type = default: setiap kemas kini yang tersedia akan dipasang, sama ada berkaitan keselamatan atau tidak. - Kedua-duanya
yesdenganupgrade_type = security: hanya pakej yang dinamakan dalam nasihat keselamatan (security advisory) akan dipasang.
Titik permulaan yang munasabah untuk VPS yang menghadap ke awam:
[commands]
upgrade_type = security
download_updates = yes
apply_updates = yes
random_sleep = 0
network_online_timeout = 60
reboot = nevernetwork_online_timeout ialah jumlah saat proses menunggu rangkaian yang berfungsi sebelum berhenti, yang penting bagi pelayan yang baru sahaja but. random_sleep ialah cara lama untuk menyebarkan beban merentasi banyak mesin, dan pemasa (timer) kini melaksanakan tugas tersebut. Jalankan systemctl cat dnf-automatic.service untuk melihat flag tepat yang dihantar oleh servis tersebut.
Buktikan fail tersebut melakukan apa yang anda jangkakan, tanpa perlu menunggu sehingga 06:00:
sudo systemctl start dnf-automatic.service
sudo journalctl -u dnf-automatic.service -n 50 --no-pagerJurnal menunjukkan apa yang dipertimbangkan oleh proses tersebut dan apa yang telah dilakukannya. Anda juga boleh memaksa satu kelakuan daripada baris perintah, yang mengatasi fail tersebut untuk proses itu sahaja:
sudo dnf-automatic --downloadupdates --no-installupdatesApakah maksud sebenar upgrade_type = security pada Rocky dan Alma
DNF tidak menentukan sama ada sesuatu kemas kini adalah kemas kini keselamatan dengan membandingkan nombor versi. Ia membaca metadata errata: satu fail bernama updateinfo.xml yang diterbitkan di dalam repositori, di mana setiap nasihat (advisory) menyenaraikan pakej yang membaikinya. AlmaLinux menerbitkan ini sebagai nasihat ALSA, manakala Rocky menerbitkannya sebagai RLSA. upgrade_type = security membina penapis daripada metadata tersebut dan hanya menaik taraf pakej yang sepadan dengannya.
Dua akibat berlaku, dan kedua-duanya mengejutkan pengguna.
Pertama, tiada metadata bermakna tiada kemas kini. Jika repositori tidak membawa updateinfo.xml, penapis tidak memadankan apa-apa dan proses tersebut berakhir dengan baris ini dalam jurnal:
No security updates needed, but 3 updates availablePelayan tidak ditampal (patched), dan tiada apa-apa yang melaporkan kegagalan. Semak sendiri:
dnf updateinfo list --security
dnf check-updateJika dnf check-update menyenaraikan pakej manakala dnf updateinfo list --security tidak mencetak apa-apa, sama ada tiada kemas kini tertunda yang membawa nasihat, atau repositori tersebut tidak mempunyai data nasihat untuk dibaca. Rocky dan AlmaLinux kedua-duanya menerbitkannya, jadi pada kedua-dua sistem tersebut, senarai kosong biasanya adalah tepat. CentOS Stream tidak menerbitkannya sama sekali.
Kedua, mod keselamatan bukanlah perubahan minimum. dnf-automatic menambah penapis keselamatan dan kemudian menjalankan laluan naik taraf biasa, jadi pakej yang dinamakan dalam nasihat akan beralih ke versi terbaharu dalam repositori dan menarik dependensinya bersama. Langkah yang lebih kecil, iaitu beralih hanya ke versi terawal yang membaiki nasihat tersebut, adalah dnf upgrade-minimal --security yang dijalankan secara manual. dnf-automatic tidak mempunyai tetapan untuk perkara ini.
Satu lagi amaran terpakai untuk Rocky. Rocky menjana errata daripada data Red Hat melalui saluran paipnya sendiri, dan saluran paip itu pernah ketinggalan. Pada September 2025, pengguna melaporkan bahawa updateinfo.xml BaseOS Rocky 9 tidak berubah sejak Disember 2024, jadi --security terlepas nasihat terkini, dan kakitangan Rocky mengesahkan ia sebagai isu yang diketahui. Jika anda bergantung pada upgrade_type = security, bandingkan senarai nasihat dengan pengumuman RLSA terkini dari semasa ke semasa. Pada pelayan yang mana liputan lebih penting daripada kawalan perubahan, upgrade_type = default mengikut jadual yang anda pilih adalah tetapan yang lebih selamat.
Timer systemd yang melaksanakannya
sudo systemctl enable --now dnf-automatic.timer
systemctl list-timers dnf-automatic.timerlist-timers sepatutnya memaparkan satu baris dengan masa NEXT kira-kira sehari dari sekarang. Jadual yang kosong bermakna timer tidak diaktifkan, jadi tiada apa-apa yang akan dilaksanakan.
Timer yang dibekalkan akan dicetuskan pada *-*-* 6:00 dengan RandomizedDelaySec=60m dan Persistent=true. Kelewatan rawak mengagihkan beban merentasi satu jam supaya setiap pelayan tidak mencapai mirror pada saat yang sama. Persistent=true bermakna mesin yang dimatikan pada pukul 06:00 akan melaksanakan tugasan yang terlepas sejurus selepas ia dihidupkan, bukannya melangkau hari tersebut.
Tukar jadual dengan menggunakan drop-in. Jangan sunting unit yang dibekalkan, kerana naik taraf pakej akan menggantikan fail di bawah /usr/lib/systemd/system.
sudo systemctl edit dnf-automatic.timer[Timer]
OnCalendar=
OnCalendar=*-*-* 03:30
RandomizedDelaySec=30mBaris OnCalendar= yang kosong adalah wajib. OnCalendar bersifat terkumpul, jadi tanpa tetapan semula tersebut, anda akan mengekalkan entri pukul 06:00 dan menambah entri kedua, lalu tugasan tersebut akan dilaksanakan dua kali sehari. Sahkan hasilnya dengan systemctl list-timers dnf-automatic.timer dan baca lajur NEXT. Peraturan drop-in yang sama terpakai untuk apa-apa sahaja yang anda jadualkan, yang diterangkan dalam menulis unit perkhidmatan dan timer systemd.
Sekarang, perangkapnya. Pakej tersebut membekalkan tiga lagi timer: dnf-automatic-notifyonly.timer, dnf-automatic-download.timer dan dnf-automatic-install.timer. Setiap satunya memulakan program yang sama dengan flag baris perintah, dan flag tersebut mengatasi download_updates dan apply_updates daripada fail konfigurasi anda. Aktifkan salah satu daripadanya di samping dnf-automatic.timer dan tugasan tersebut akan dilaksanakan dua kali dengan dua kelakuan berbeza, yang kelihatan seolah-olah fail konfigurasi anda diabaikan. Aktifkan satu timer dan semak:
systemctl list-unit-files 'dnf-automatic*'Bagaimanakah saya tahu bila sesuatu perisian dipasang?
emit_via dalam bahagian [emitters] mengawal pelaporan. Di bawah systemd, pemancar stdio menulis ke dalam journal, yang merupakan pilihan paling boleh diharap kerana ia tidak memerlukan pemasangan perisian tambahan:
sudo journalctl -u dnf-automatic.service --since -7d --no-pagerPemancar motd menulis laporan ke dalam /etc/motd dan menggantikan kandungan fail tersebut. Jika anda menyimpan banner log masuk di sana, jangan gunakan pemancar ini.
Pemancar email membuka sambungan SMTP (simple mail transfer protocol) ke email_host pada email_port, yang secara lalai ditetapkan kepada localhost dan 25. VPS yang baharu tidak mempunyai sebarang servis yang mendengar pada port tersebut, jadi sambungan akan ditolak dan tiada e-mel dihantar. Jalankan ss -lnt | grep ':25' sebelum anda bergantung kepadanya, dan sediakan Postfix sebagai relay-only jika outputnya kosong. Apabila e-mel berfungsi, subjek e-mel akan tertera Updates applied on 'web01'., dengan mengambil nama daripada system_name.
Untuk tujuan lain, pemancar command menyerahkan laporan kepada program anda melalui standard input:
[emitters]
emit_via = stdio, command
system_name = web01.example.com
send_error_messages = yes
[command]
command_format = /usr/local/bin/notify-ops
stdin_format = {body}send_error_messages secara lalai ditetapkan kepada no, yang bermaksud kegagalan dalam pelaksanaan tidak akan dilaporkan langsung. Aktifkan tetapan ini. Sistem patching yang hanya mengumumkan kejayaan adalah lebih buruk daripada tiada sistem langsung, kerana ketiadaan laporan dianggap sebagai petanda sistem sihat.
dnf-automatic tidak memulakan semula servis anda
Memasang pakej akan menggantikan fail pada cakera. Proses yang sedang berjalan mengekalkan kod lama dalam memori, jadi pustaka yang telah ditampal tidak memberi kesan kepada daemon yang bermula sejak bulan lepas. Jurang antara pemasangan dan keberkesanan inilah sebab mengapa penampalan tanpa pengawasan memerlukan polisi mulakan semula, bukan sekadar polisi pemasangan.
sudo dnf install -y dnf-plugins-core
dnf needs-restarting -s
dnf needs-restarting -r-s menyenaraikan servis systemd yang failnya berubah selepas ia dimulakan. -r menjawab satu soalan, dan mencetak salah satu daripada dua blok:
Core libraries or services have been updated since boot-up:
* kernel
Reboot is required to fully utilize these updates.No core libraries or services have been updated since boot-up.
Reboot should not be necessary.-r bukanlah analisis yang mendalam. Ia menyemak senarai pakej tetap: kernel, kernel-core, kernel-rt, glibc, linux-firmware, systemd, dbus, dbus-broker, dbus-daemon dan microcode_ctl. Jika salah satu daripadanya dipasang selepas but terakhir, anda akan mendapat jawapan pertama. Tambahkan nama pakej anda sendiri dalam fail yang berakhir dengan .conf di bawah /etc/dnf/plugins/needs-restarting.d/ apabila sesuatu yang lain pada mesin tersebut juga memerlukan but semula untuk berkuat kuasa.
Satu peringatan untuk skrip: dnf needs-restarting -r keluar dengan status bukan sifar apabila but semula diperlukan dan apabila arahan itu sendiri gagal, jadi status keluar sahaja tidak dapat membezakan kedua-duanya. Baca teks output tersebut.
Memulakan semula servis adalah langkah yang lebih kecil dan biasanya merupakan tindakan yang betul. Mulakan semula daemon SSH daripada sesi SSH kedua yang sudah dibuka, supaya konfigurasi yang salah tidak menyebabkan anda terkunci keluar. Kernel baharu adalah kes di mana hanya but semula dapat membantu, kerana kernel yang sedang berjalan tidak boleh digantikan secara terus.
Adakah pelayan perlu but semula secara automatik?
[commands]
reboot = when-needed
reboot_command = shutdown -r +5 'Rebooting after applying package updates'reboot = never ialah tetapan lalai. when-changed akan melakukan but semula selepas sebarang kemas kini digunakan. when-needed hanya melakukan but semula apabila pemeriksaan di sebalik needs-restarting -r menyatakan pakej teras telah diganti, iaitu pilihan yang diingini oleh kebanyakan pemilik pelayan tunggal, digandingkan dengan tetingkap masa yang dipilih sendiri. Nilai lalai reboot_command memberikan pengguna yang sedang log masuk amaran selama lima minit melalui shutdown, dan anda boleh memanjangkan tempoh tersebut.
Selesaikan dua perkara sebelum anda mengaktifkan fungsi ini. Setiap servis yang anda harapkan perlu bermula secara automatik semasa but, yang biasanya merupakan kelalaian bagi Docker Compose stack yang dimulakan secara manual. Anda juga memerlukan akses konsol atau mod pemulihan daripada penyedia anda, kerana kernel yang gagal but tidak boleh dibaiki melalui SSH. Jika salah satu daripada perkara ini tiada, kekalkan reboot = never dan lakukan but semula secara manual selepas membaca log journal.
Rocky, AlmaLinux dan CentOS Stream: perbezaan antara keduanya
Pada Rocky 9 dan AlmaLinux 9, semua perkara di atas adalah sama, termasuk laluan konfigurasi dan nama unit. Kedua-duanya menerbitkan errata, jadi upgrade_type = security mempunyai data untuk ditapis.
CentOS Stream adalah pengecualian, dan ia merupakan kes yang sukar. Repositori Stream tidak membawa updateinfo.xml, jadi penapis keselamatan tidak akan pernah sepadan dan setiap pelaksanaan melaporkan No security updates needed. Pada Stream, gunakan upgrade_type = default dan terima hakikat bahawa anda mengambil setiap kemas kini. Stream juga berjalan lebih awal daripada RHEL, jadi tetapan tersebut lebih kerap berubah pada kotak Stream berbanding tetapan yang sama pada Rocky atau AlmaLinux.
Rocky 10 dan AlmaLinux 10 telah beralih kepada DNF5, yang menamakan semula beberapa perkara. Dokumentasi DNF5 huluan memberikan pemasa sebagai dnf5-automatic.timer, meletakkan lalai yang dibekalkan dalam /usr/share/dnf5/dnf5-plugins/automatic.conf dengan penggantian anda masih dalam /etc/dnf/automatic.conf, menetapkan lalai download_updates kepada yes dan bukannya no, serta menambah distro-sync sebagai upgrade_type. Pertanyaan nasihat ialah dnf advisory list, dengan updateinfo dikekalkan sebagai alias. Sahkan perkara yang sebenarnya dipasang oleh keluaran anda sebelum menyalin nama pakej atau unit daripada panduan yang ditulis untuk versi 9:
dnf list --available '*automatic*'
systemctl list-unit-files '*automatic*'Banyak panduan yang diterbitkan untuk topik ini masih hanya meliputi Rocky 8. Set pilihan telah berkembang sejak panduan tersebut ditulis, jadi semak fail yang mempunyai komen pada kotak anda sendiri dan bukannya mempercayai artikel lama.
Mod kegagalan dan rentetan yang akan anda lihat
Tiada apa-apa yang berjalan. systemctl list-timers dnf-automatic.timer mencetak jadual kosong dan systemctl is-enabled dnf-automatic.timer mencetak disabled. Pakej telah dipasang, tetapi pemasa tidak pernah dipasang.
Tugasan berjalan dan tidak memasang apa-apa. Jurnal mengandungi No security updates needed, but 3 updates available. Penapis keselamatan tidak memadankan apa-apa, sama ada kerana tiada perkara tertunda yang membawa nasihat atau kerana repositori tidak menerbitkan data nasihat.
Satu tetapan kelihatan diabaikan. DNF mencatat pilihan yang tidak diketahui dalam automatic.conf pada tahap nyahpepijat dan kemudian menggunakan tetapan lalai, jadi kunci yang tersalah eja tidak mengubah apa-apa dan tidak memberi amaran kepada sesiapa. Tulis apply_update = yes dan apply_updates kekal pada no, jadi kotak tersebut memuat turun selama-lamanya dan tidak pernah memasang. Selepas sebarang suntingan, jalankan sudo systemctl start dnf-automatic.service dan baca jurnal tersebut dan bukannya mempercayai fail itu.
Tugasan berjalan dua kali sehari. Dua pemasa telah didayakan. systemctl list-unit-files 'dnf-automatic*' menunjukkan yang mana satu, dan pemasa tambahan menghantar flag yang mengatasi fail konfigurasi anda.
Tiada e-mel sampai. Sama ada tiada apa-apa yang mendengar pada port 25 untuk pemancar email, atau send_error_messages masih no dan satu-satunya perkara yang patut dilaporkan adalah ralat.
Servis yang telah ditampal masih melaporkan versi lama. Fail pada cakera adalah baharu dan proses dalam memori adalah lama. dnf needs-restarting -s menamakan servis yang perlu dimulakan semula.
FAQ
Adakah dnf-automatic hanya memasang kemas kini keselamatan pada Rocky Linux?
Hanya jika anda menetapkan upgrade_type = security dalam /etc/dnf/automatic.conf, dan hanya jika repositori anda menerbitkan metadata errata. Rocky Linux dan AlmaLinux kedua-duanya menerbitkannya, jadi penapis tersebut mempunyai advisori untuk dipadankan. Nilai lalai yang dibekalkan ialah upgrade_type = default, yang memasang setiap kemas kini yang tersedia sebaik sahaja apply_updates = yes.
Mengapa dnf-automatic melaporkan "No security updates needed, but 3 updates available"?
DNF menentukan perkara yang dikira sebagai kemas kini keselamatan dengan membaca updateinfo.xml daripada repositori, di mana setiap advisori menyenaraikan pakej yang membaikinya. Apabila metadata tersebut tiada atau lapuk, penapis keselamatan tidak memadankan apa-apa manakala kemas kini biasa masih belum selesai, yang menghasilkan baris tersebut. Ini dijangkakan pada CentOS Stream, yang tidak menerbitkan sebarang errata langsung. Pada Rocky atau AlmaLinux, bandingkan dnf updateinfo list --security dengan dnf check-update dan pastikan metadata anda adalah terkini.
Adakah dnf-automatic akan memulakan semula pelayan saya selepas kemas kini kernel?
Tidak, melainkan anda memintanya. Pilihan reboot ditetapkan kepada never secara lalai. Tetapkan reboot = when-needed dan proses tersebut hanya akan memulakan semula apabila pemeriksaan di sebalik dnf needs-restarting -r mendapati bahawa pakej teras seperti kernel atau glibc telah digantikan sejak but. reboot = when-changed memulakan semula selepas sebarang kemas kini digunakan. Kedua-duanya menggunakan reboot_command, yang ditetapkan kepada shutdown -r +5 secara lalai dengan mesej amaran kepada pengguna yang sedang log masuk.
Bagaimanakah cara saya menukar masa dnf-automatic dijalankan?
Jalankan sudo systemctl edit dnf-automatic.timer dan tambah bahagian [Timer] dengan baris OnCalendar= yang kosong diikuti dengan jadual anda, contohnya OnCalendar=*-*-* 03:30. Baris kosong diperlukan kerana OnCalendar terkumpul, jadi jika meninggalkannya, ia akan mengekalkan masa 06:00 yang dibekalkan dan menambah masa kedua. Sahkan dengan systemctl list-timers dnf-automatic.timer dan baca lajur NEXT.
Adakah saya masih perlu memeriksa pelayan yang menampal dirinya sendiri?
Ya. dnf-automatic memasang pakej dan berhenti di situ. Ia tidak memulakan semula daemon, dan ia tidak melaporkan apa-apa yang akan anda lihat melainkan emit_via menamakan pemancar yang anda benar-benar baca. Tetapkan emit_via kepada stdio sekurang-kurangnya, aktifkan send_error_messages supaya kegagalan juga dilaporkan, dan jalankan dnf needs-restarting -s selepas tetingkap tampalan untuk mencari servis yang masih menjalankan kod lama.