Cập nhật tự động với unattended-upgrades trên Debian và Ubuntu

theanh

Administrator
Nhân viên
Các bản phát hành Linux thường xuyên nhận được bản cập nhật và các bản cập nhật bảo mật nên được cài đặt ngay lập tức. Debian và Ubuntu sử dụng hệ thống APT và mặc dù việc cài đặt tất cả các bản cập nhật đang chờ xử lý theo cách thủ công tương đối dễ dàng, nhưng người quản trị có thể không nhớ thực hiện hoặc thích ngủ vào ban đêm thay vì kiểm tra các bản cập nhật. Bài viết này chủ yếu dành cho các cài đặt máy chủ.

Việc cập nhật và cài đặt các gói theo cách thủ công bằng apt upgrade vẫn có thể thực hiện được khi sử dụng unattended-upgrades. Nếu một bản nâng cấp được bắt đầu bởi unattended-upgrades tình cờ đang chạy khi apt được sử dụng từ dòng lệnh, hệ thống apt sẽ thông báo cho người dùng rằng một hoạt động đã đang diễn ra và người dùng phải đợi cho đến khi hoạt động đó hoàn tất trước khi tiếp tục phát hành các lệnh apt.

Một cách dễ dàng dành cho các quản trị viên bận rộn​

Cài đặt unattended-upgrades, kiểm tra xem nó đã được bật chưa và theo dõi hoạt động của chúng từ các tệp nhật ký.
Mã:
apt install unattended-upgrades
Mã:
dpkg-reconfigure -plow unattended-upgrades
Lệnh dpkg-reconfigure -command hiển thị hộp thoại hỏi có muốn tự động tải xuống và cài đặt các bản cập nhật bảo mật ổn định hay không. Kiểm tra xem câu trả lời có không.

unattended-upgrades kiểm tra các bản cập nhật hai lần mỗi ngày vào những thời điểm ngẫu nhiên và cài đặt các bản cập nhật bảo mật ổn định.

Theo dõi những gì đang xảy ra bằng cách đọc các tệp nhật ký trong thư mục /var/log/unattended-upgrades/ và tệp /var/log/dpkg.log.

Nơi tìm tài liệu​

Tệp cấu hình /etc/apt/apt.conf.d/50unattend-upgrades có tài liệu hướng dẫn trong phần bình luận. Tài liệu này sẽ tham chiếu đến tệp đó từ bây giờ là 50unattend-upgrades.

Tệp readme /usr/share/doc/unattend-upgrades/README.md.gz có hướng dẫn hữu ích. Có thể đọc tệp này bằng lệnh zless (có trong gói gzip). Tài liệu này từ bây giờ sẽ gọi tệp đó là README.

Wiki Debian có một trang https://wiki.debian.org/UnattendedUpgrades.

Tài liệu máy chủ Ubuntu trang có một chương "Cập nhật tự động" về unattended-upgrades.

Trang hướng dẫn của unattended-upgrade, man unattended-upgrade.

Cấu hình nâng cao​

Sử dụng cách dễ dàng, bạn sẽ nhận thấy không phải tất cả các bản nâng cấp đều được cài đặt tự động. Bạn cũng có thể muốn kiểm soát nhiều hơn những gì đang diễn ra tự động ngoài việc cài đặt các bản cập nhật.

Tệp cấu hình /etc/apt/apt.conf.d/50unattended-upgrades có tài liệu hướng dẫn trong phần bình luận, vì vậy hãy đọc tệp để kiểm tra những cấu hình nào khả dụng. Rất hữu ích là cấu hình unattended-upgrades để gửi email khi có sự cố xảy ra.

Điều quan trọng là phải biết rằng tệp cấu hình được tạo bởi quá trình cài đặt hoặc nâng cấp gói unattended-upgrades, vì vậy khi bản thân unattended-upgrades được nâng cấp hoặc khi chuyển sang phiên bản hệ điều hành tiếp theo, các chỉnh sửa được thực hiện trong tệp này sẽ gây ra xung đột và phải được giải quyết thủ công. Tệp tài liệu README gợi ý tạo tệp 52unattended-upgrades-local thay vì sửa đổi tệp cấu hình gốc.

Nếu muốn, bạn có thể kiểm tra tệp /etc/apt/apt.conf.d/20auto-upgrades xem tệp có chứa những dòng này không:
Mã:
APT::Periodic::Update-Package-Lists "1";APT::Periodic::Unattended-Upgrade "1";
Nếu bạn chạy lệnh dpkg-reconfigure -command và trả lời có thì các dòng này sẽ có ở đó. Các dòng này điều khiển việc bật unattended-upgrades.

Gửi email​

Để gửi email hoạt động, máy chủ phải có hệ thống email đang hoạt động có thể gửi email. Trước tiên, hãy xác minh điều đó.

Cho phép gửi email từ unattended-upgrades bằng cách chỉnh sửa tệp cấu hình 52unattended-upgrades-local (tạo tệp nếu tệp này không tồn tại trong thư mục /etc/apt/apt.conf/). Sao chép dòng
Mã:
//Unattended-Upgrade::Mail "";
từ 50unattended-upgrades, bỏ chú thích và thêm địa chỉ email mục tiêu vào giữa dấu ngoặc kép "-".

Ngoài ra còn có một thiết lập để cấu hình nếu email luôn được gửi khi unattended-upgrades thực hiện nâng cấp hoặc chỉ khi có lỗi.
Mã:
// Đặt giá trị này thành "true" để chỉ nhận email khi có lỗi. Mặc định// là luôn gửi email nếu Unattended-Upgrade::Mail được đặt//Unattended-Upgrade::MailOnlyOnError "false";
Nếu bạn muốn thay đổi cài đặt, hãy sao chép các dòng đến 52unattended-upgrades-local, bỏ chú thích dòng cài đặt và đổi "false" thành "true".

Kiểm tra bằng
Mã:
unattended-upgrade --dry-run -d
là một ý tưởng hay sau khi sửa đổi tệp cấu hình.

Ít nhất là trên Debian 10, 11 và Ubuntu 22.04, cài đặt unattended-upgrades tạo liên kết tượng trưng unattended-upgrades đến unattended-upgrade trong thư mục /usr/bin/ và/hoặc /bin/, do đó cả hai lệnh đều hoạt động giống nhau.
Mã:
$ ls -lhi /bin/unattended-upgrade*11404505 -rwxr-xr-x 1 root root 98K tammi 15 2022 /bin/unattended-upgrade11407087 lrwxrwxrwx 1 root root 18 tammi 15 2022 /bin/unattended-upgrades -> unattended-upgrade

Thêm kho lưu trữ​

Việc thêm kho lưu trữ để tự động cập nhật từ được thực hiện bằng cách thêm các dòng vào Unattended-Upgrade::Origins-Pattern. Có tài liệu về điều này trong tệp cấu hình.

README hướng dẫn các thiết lập trong tệp cấu hình sau 52unattended-upgrades-local để ghi đè các thiết lập mặc định. Tôi đã thử và thấy rằng cài đặt Unattended-Upgfade::Origins-Pattern không ghi đè hoàn toàn những gì đã được thiết lập trong tệp mặc định, thay vào đó, nó được thêm vào mặc định. Vì vậy, không cần phải sao chép toàn bộ Unattended-Upgrade::Origins-Pattern mặc định, nó có thể được thêm vào.

Ví dụ, gói goaccess không tự động nâng cấp khi được cài đặt từ Kho lưu trữ GoAccess chính thức. Nó sẽ tự động nâng cấp nếu được cài đặt từ kho lưu trữ Debian thông thường (có sẵn từ cả hai kho lưu trữ). Thêm kho lưu trữ GoAccess vào Origins-Pattern sẽ khiến unattended-upgrades thực hiện nâng cấp.

Kiểm tra tình huống bằng apt list --upgradable:
Mã:
root@posti:~# LANG=C apt list --upgradableĐang liệt kê... Xonggoaccess/unknown 2:1.6.3-buster amd64 [có thể nâng cấp từ: 2:1.6.2-buster]php-tcpdf/buster-backports 6.5.0+dfsg1-1~bpo10+1 all [có thể nâng cấp từ: 6.3.5+dfsg1-1~bpo10+1]root@posti:~#
Vì vậy, có hai gói không được unattended-upgrades tự động nâng cấp. Kiểm tra goaccess cho thấy nó đến từ GoAccess Official Repository (và một phiên bản cũ hơn từ kho lưu trữ Debian thông thường).
Mã:
root@posti:~# LANG=C apt policy goaccessgoaccess: Đã cài đặt: 2:1.6.2-buster Ứng viên: 2:1.6.3-buster Bảng phiên bản: 2:1.6.3-buster 500 500 https://deb.goaccess.io buster/main amd64 Các gói *** 2:1.6.2-buster 100 100 /var/lib/dpkg/status 1:1.2-4+b10 500 500 http://mirror.hetzner.de/debian/packages buster/main amd64 Các gói 500 http://deb.debian.org/debian buster/main amd64 Các gói root@posti:~#
Đang chạy unattended-upgrade --dry-run -d hiển thị nguồn gốc của các gói chưa được cài đặt. Điều này có thể giúp tìm ra những gì cần thêm vào Origins-Pattern.

Kiểm tra nhật ký từ lần chạy nâng cấp không giám sát gần đây nhất sẽ hiển thị nguồn gốc nào được xem xét khi nâng cấp tự động:
Mã:
2022-09-05 08:28:08,955 THÔNG TIN Kiểm tra xem hệ thống có đang chạy bằng pin hay không bị bỏ qua. Vui lòng cài đặt gói powermgmt-base để kiểm tra trạng thái nguồn và bỏ qua việc cài đặt các bản cập nhật khi hệ thống đang chạy bằng pin.2022-09-05 08:28:08,960 THÔNG TIN Danh sách đen ban đầu:2022-09-05 08:28:08,960 THÔNG TIN Danh sách trắng ban đầu:2022-09-05 08:28:08,960 THÔNG TIN Bắt đầu tập lệnh nâng cấp không giám sát2022-09-05 08:28:08,960 THÔNG TIN Nguồn gốc được phép là:origin=Debian,codename=buster,label=Debian,origin=Debian,codename=buster,label=Debian-Security
Kho lưu trữ GoAccess vẫn chưa có ở đó, vì vậy bây giờ tôi thêm nó vào /etc/apt/apt.conf.d/52unattended-upgrades-local.

Ngoài ra, nếu bạn đã cài đặt unattended-upgrades trên máy tính xách tay, hãy cân nhắc cài đặt powermgmt-base. Sử dụng unattended-upgrades không bắt đầu nâng cấp khi chạy bằng nguồn pin, giống như thông báo thông tin trong nhật ký. Nếu chạy trên máy chủ luôn chạy bằng nguồn điện trực tuyến, thông báo thông tin đó không còn hiển thị với Unattended-Upgrade::OnlyOnACPower "false"; được thêm vào cấu hình.
Mã:
Unattended-Upgrade::Origins-Pattern {// Taleman đã thêm GoAccess 2022-09-05 "o=GoAccess Repository, n=buster, l=Official GoAccess Repository";};Unattended-Upgrade::OnlyOnACPower "false";
apt policy không hiển thị trường a cho GoAccess, vì vậy tôi đã sử dụng o, n và l. Tìm thông tin về các trường này trong README.

Hỗ trợ thay thế biến cho ${distro_id} chứa đầu ra của lsb_release -i và ${distro_codename} chứa đầu ra của lsb_release -c. Vì vậy, thay vì n=buster, tôi có thể viết n=${distro_codename}.

Có hai gói không được nâng cấp tự động, gói còn lại vẫn chưa được nâng cấp là php-tcpdf. Tất nhiên, có thể nâng cấp bằng apt upgrade nhưng có thể thêm vào unattended-upgrades để tự động nâng cấp. Quy trình này giống như đối với goaccess.

Trước tiên, hãy kiểm tra tình huống bằng apt policy php-tcpdf. Điều đó cho thấy nó được cài đặt từ phần buster-backports của kho lưu trữ Debian.

Từ unattended-upgrades.log có thể thấy buster-backports không nằm trong số các nguồn gốc được phép. Nó nằm trong tệp 50unattended-upgrades nhưng đã được chú thích. Để bật tính năng này, hãy sao chép dòng
Mã:
// "o=Debian Backports,a=${distro_codename}-backports,l=Debian Backports";
vào 52unattended-upgrades-local bên trong thiết lập Origins-Pattern và bỏ chú thích.

Sau khi chỉnh sửa tệp, hãy kiểm tra bằng unattended-upgrades --dry-run -d kho lưu trữ đã thêm hiện nằm trong số "Nguồn gốc được phép" và php-tcpd nằm trong số các gói sẽ được nâng cấp.

Kiểm soát thời gian​

Unattended-upgrades chạy vào những thời điểm ngẫu nhiên để giảm tải cho các máy chủ kho lưu trữ. Điều này nhằm tránh các đợt tải đột biến lớn có thể xảy ra nếu tất cả các máy chủ bắt đầu thực hiện cập nhật cùng một lúc. Hãy cân nhắc kỹ nếu bạn quyết định thay đổi hành vi này. Nếu bạn chạy kho lưu trữ của riêng mình hoặc kho lưu trữ phản chiếu, thì các đợt tải đột biến sẽ ảnh hưởng đến máy chủ kho lưu trữ của bạn và bạn sẽ tránh làm phiền những người quản trị kho lưu trữ trên Internet.

Systemd kiểm soát thời điểm bắt đầu unattended-upgrades. Tệp /lib/systemd/system/apt-daily.timer có phần Timer bắt đầu các hoạt động tải xuống apt hai lần mỗi ngày với độ trễ ngẫu nhiên là 12 giờ. Tôi khuyên bạn không nên sửa đổi phần này hoặc có lý do rất chính đáng để sửa đổi.

Các cấu hình thời gian còn lại được thực hiện trong các tệp 50unattended-upgrades và 52unattended-upgrades-local.

Cài đặt Unattended-Upgrade::Update-Days kiểm soát các ngày trong tuần unattended-upgrades chạy. Mặc định là trống, nghĩa là chạy hàng ngày. Có thể cấu hình để chỉ chạy vào thứ Bảy và Chủ Nhật.
Khởi động lại tự động​
Unattended-upgrades có thể được thiết lập để khởi động lại khi các bản cập nhật đã cài đặt yêu cầu khởi động lại. Có thể cấu hình để thực hiện ngay lập tức hoặc vào thời điểm mong muốn. Các cấu hình này sử dụng các thiết lập
Mã:
//Unattended-Upgrade::Automatic-Reboot "false";//Unattended-Upgrade::Automatic-Reboot-WithUsers "true";//Unattended-Upgrade::Automatic-Reboot-Time "02:00";
Mặc định là không tự động khởi động lại. Nếu bạn thay đổi thiết lập thành "true", khởi động lại sẽ diễn ra ngay sau khi nâng cấp được cài đặt. Automatic-Reboot-Time có thể được thiết lập để khởi động lại vào thời điểm mong muốn nếu có các bản cập nhật đã cài đặt yêu cầu khởi động lại.

Danh sách đen, Danh sách trắng​

Danh sách đen ngăn không cho một gói, nếu không sẽ được unattended-upgrades nâng cấp, được nâng cấp. Thiết lập Package-Blacklist chứa các biểu thức chính quy. Nếu tên gói khớp, thì gói đó sẽ bị loại khỏi quá trình nâng cấp tự động.

Tôi chưa sử dụng tính năng này, tôi nghĩ tính năng này có thể hữu ích hơn nếu chạy bản phát hành phát triển trong đó việc ngăn chặn việc nâng cấp tự động các gói quan trọng là hợp lý. Tệp cấu hình 50unattended-upgrades cung cấp các ví dụ về các gói bị đưa vào danh sách đen.

Tệp README cho biết về thiết lập Package-Whitelist. Mô tả có nội dung "Chỉ các gói khớp với các biểu thức chính quy trong danh sách này mới được đánh dấu để nâng cấp". Không có ví dụ nào để làm rõ trong trường hợp nào thì nên thiết lập danh sách trắng. Theo các thử nghiệm của tôi, có vẻ như việc thêm các gói vào danh sách trắng có nghĩa là chỉ những gói đó được tự động nâng cấp, không có gì khác.

Kết luận​

Bây giờ bạn đã biết unattended-upgrades có thể làm gì và cách để nó thực hiện những gì bạn muốn.

Có những trường hợp unattended-upgrades không thực hiện nâng cấp vì lệnh apt upgrade giữ lại một gói. Điều này xảy ra khi việc nâng cấp sẽ xóa một gói hoặc cài đặt một gói đã gỡ cài đặt trước đó. Để thực hiện nâng cấp, hãy tự thực hiện bằng lệnh apt full-upgrade có thể xóa các gói hoặc cài đặt các gói mới đã gỡ cài đặt trước đó. Nếu unattended upgrades được định cấu hình để gửi e-mail, e-mail sẽ chứa dòng
Mã:
Các gói có nguồn gốc có thể nâng cấp nhưng được giữ lại:
Ví dụ cuối cùng về 52unattended-upgrades-local từ một trong các máy chủ của tôi:
Mã:
Unattended-Upgrade::Origins-Pattern {// Taleman đã thêm 2022-09-05 "o=GoAccess Repository, n=buster, l=Official GoAccess Repository"; "o=Debian Backports,a=${distro_codename}-backports,l=Debian Backports"; "origin=deb.sury.org,archive=${distro_codename}";};Unattended-Upgrade::Mail "[emailprotected]";Unattended-Upgrade::OnlyOnACPower "false";
 
Back
Bên trên