Konfiguracja i konserwacja systemu Linux Ubuntu

Wpis ma charakter rozwojowy i będzie aktualizowany w miarę pojawienia się nowych informacji związanych z tematem aktualizacji i konserwacji systemu Ubuntu.

Pierwsze kroki po instalacji systemu Ubuntu 22.04 w maszynie wirtualnej Proxmox VE

Aktualizacja systemu

sudo apt update && sudo apt upgrade
sudo reboot

Konfiguracja nienadzorowanych automatycznych instalacji

# instalacja pakietów unattended-upgrades (domyślnie zainstalowany w Ubuntu 22.04) 
sudo apt install unattended-upgrades

# sprawdzenie stanu usługi unattended-upgrades (domyślnie włączona w Ubuntu 22.04) 
sudo systemctl status unattended-upgrades.service

# edycja parametrów usługi unattended-upgrades
# domyślnie są włączone apps-security oraz infra-security 
nano /etc/apt/apt.conf.d/50unattended-upgrades

Unattended-Upgrade::Allowed-Origins {
        "${distro_id}:${distro_codename}";
        "${distro_id}:${distro_codename}-security";
        // Extended Security Maintenance; doesn't necessarily exist for
        // every release and this system may not have it installed, but if
        // available, the policy for updates is such that unattended-upgrades
        // should also install from here by default.
        "${distro_id}ESMApps:${distro_codename}-apps-security";
        "${distro_id}ESM:${distro_codename}-infra-security";
//      "${distro_id}:${distro_codename}-updates";
//      "${distro_id}:${distro_codename}-proposed";
//      "${distro_id}:${distro_codename}-backports";
};


sudo systemctl restart unattended-upgrades.service

Instalacja qemu guest agent

sudo apt install qemu-guest-agent
sudo systemctl start qemu-guest-agent

# z konsoli serwera Proxmox
qm agent 222 ping

Ustawienie strefy czasowej

# sprawdzenie aktualnej strefy czasowej
sudo timedatectl

# sprawdzenie dostępnych stref czasowych
sudo timedatectl list-timezones

# ustawienie strefy czasowe
sudo timedatectl set-timezone Europe/Warsaw

Ustawienie synchronizacji czasu

# sprawdzenie statusu domyślnej usługi synchronizacji czasu 
sudo systemctl status systemd-timesyncd

# włączenie / wyłączenie synchronizacji czasu
sudo timedatectl set-ntp on
sudo timedatectl set-ntp off

# ustawienie własnych serwerów czasu 
sudo nano /etc/systemd/timesyncd.conf

[Time]
NTP=tempus1.gum.gov.pl tempus2.gum.gov.pl
FallbackNTP=ntp.ubuntu.com

# restart po zmianach konfiruacji
sudo systemctl restart systemd-timesyncd

# sprawdzenie czasu
timedatectl

Ustawienie nazwy serwera

# zmiana nazwy na np. lab.netapps.ovh
sudo hostnamectl set-hostname lab.netapps.ovh

# sprawdzenie nazwy
hostname

# należy jeszcze sprawdzić /etc/hosts
sudo /etc/hosts

127.0.1.1 lab lab.netapps.ovh

Ustawienie dynamicznego adresu IP serwera

# edycja pliku yaml z połączeniem 
# bardzo ważne są wszystkie wcięcia
sudo nano /etc/netplan/50-cloud-init.yaml

# zatwierdzenie zmian w systemie 
sudo netplan apply

Ustawienia stałego adresu ip serwera

# edycja pliku yaml z połączeniem
# bardzo ważne są wszystkie wcięcia
sudo nano /etc/netplan/00-installer-config.yaml

# zatwierdzenie zmian w systemie
sudo netplan apply

Więcej informacji na temat konfiguracji stałego adresu ip w Ubuntu 22.04 jest na stronie https://vitux.com/how-to-configure-networking-with-netplan-on-ubuntu/

Zmiana parametru swappiness w systemie Ubuntu

# sprawdzenie obecnego poziomu swappiness
sudo cat /proc/sys/vm/swappiness
30

# ustawienie parametru swappiness do czasu restartu serwera
sudo sysctl vm.swappiness=60

# ustawienie wielkości swappiness na stałe
sudo echo "vm.swappiness=0" | sudo tee -a /etc/sysctl.d/99-swappiness.conf

Ustawienia swap w systemie Ubuntu

# sprawdzenie czy jest obecnie swap
sudo swapon --show

# wyłączenie obecnego swapa
sudo swapoff /swap.img
rm -rf /swap.img

# dodanie nowego pliku swap
sudo fallocate -l 4G /var/swap
mkswap -f /var/swap
chmod 0600 /var/swap
sudo swapon /var/swap

# dopisanie do /etc/fstab aby swap był montowany automatycznie podczas startu systemu
nano /etc/fstab
/var/swap       none    swap    sw      0       0

Ustawienie profilu tuned-adm

# instalacja tuned
sudo apt install tuned tuned-utils tuned-utils-systemtap

# ustawienie profilu najlepszego dla maszyny wirtualnej
sudo tuned-adm profile virtual-guest

# sprawdzenie aktualnego profilu
sudo tuned-adm active

Instalacja przydatnego oprogramowania

# oprogramowanie użytkowe
sudo apt install mc net-tools mc screen gnupg2 curl git wget nano unzip ncdu bzip2 unrar bc vim lynx nmap sshpass

# oprogramowanie testujące 
sudo apt install sysbench stress vnstat sysstat htop atop iftop btop nmon glances

# klient FUSE
sudo apt-get install sshfs

# klient NFS
sudo apt-get install portmap nfs-common

# klient SMB/CIFS
sudo apt-get install cifs-utils

Konfiguracja serwera OpenSSH w systemie Ubuntu

Więcej informacji na ten temat można znaleźć na stronie Instalacja i konfiguracja serwera OpenSSH w systemie Ubuntu – IT Admin (vblog.ovh)

Zarządzanie dyskami i partycjami EXT4 / LVM w systemie Ubuntu

Więcej informacji na ten temat można znaleźć na stronie Zmiana rozmiaru dysku podłączonego do maszyny wirtualnej w systemie Linux na Proxmox VE – IT Admin (vblog.ovh)

Konserwacja systemu Ubuntu

Zarządzanie usługami w systemie Ubuntu

# lista obecnie uruchomionych usług

sudo systemctl list-units --type=service --state=running

  UNIT                        LOAD   ACTIVE SUB     DESCRIPTION
  cron.service                loaded active running Regular background program processing daemon
  dbus.service                loaded active running D-Bus System Message Bus
  [email protected]          loaded active running Getty on tty1
  irqbalance.service          loaded active running irqbalance daemon
  ModemManager.service        loaded active running Modem Manager
  multipathd.service          loaded active running Device-Mapper Multipath Device Controller
  networkd-dispatcher.service loaded active running Dispatcher daemon for systemd-networkd
  polkit.service              loaded active running Authorization Manager
  qemu-guest-agent.service    loaded active running QEMU Guest Agent
  rsyslog.service             loaded active running System Logging Service
  snapd.service               loaded active running Snap Daemon
  ssh.service                 loaded active running OpenBSD Secure Shell server
  systemd-journald.service    loaded active running Journal Service
  systemd-logind.service      loaded active running User Login Management
  systemd-networkd.service    loaded active running Network Configuration
  systemd-resolved.service    loaded active running Network Name Resolution
  systemd-timesyncd.service   loaded active running Network Time Synchronization
  systemd-udevd.service       loaded active running Rule-based Manager for Device Events and Files
  udisks2.service             loaded active running Disk Manager
  unattended-upgrades.service loaded active running Unattended Upgrades Shutdown
  [email protected]           loaded active running User Manager for UID 1000

LOAD   = Reflects whether the unit definition was properly loaded.
ACTIVE = The high-level unit activation state, i.e. generalization of SUB.
SUB    = The low-level unit activation state, values depend on unit type.
21 loaded units listed.

# sprawdzenie powiązań z innymi usługami
sudo systemctl list-dependencies multi-user.target | grep Modem
● ├─ModemManager.service

# zatrzymanie usługi
sudo systemctl stop ModemManager

# wyłączenie usługi
sudo systemctl disable ModemManager

# usunięcie pakietów związanych z usługą
sudo apt-get purge modemmanager

Analiza która usługa spowalnia wyłączanie systemu

sudo journalctl -u systemd-shutdownd
lub 
sudo journalctl -rb -1

# po logach widać, że zbyt długo zamyka się jedna z usług tutaj icinga2
# dodajemy / zmieniamy 
# TimeoutStartSec=1m
# KillMode=process
# TimeoutSec=60

sudo nano /usr/lib/systemd/system/icinga2.service

[Unit]
Description=Icinga host/service/network monitoring system
Documentation=https://icinga.com/docs/icinga2/latest/
After=network-online.target postgresql.service mariadb.service carbon-cache.service carbon-relay.service

[Service]
Type=notify
UMask=0007
EnvironmentFile=/usr/lib/icinga2/icinga2
EnvironmentFile=/etc/default/icinga2
ExecStartPre=/usr/lib/icinga2/prepare-dirs /usr/lib/icinga2/icinga2
ExecStart=/usr/sbin/icinga2 daemon -e ${ICINGA2_ERROR_LOG}
ExecReload=/usr/lib/icinga2/safe-reload /usr/lib/icinga2/icinga2
TimeoutStartSec=1m
KillMode=process
TimeoutSec=60
PIDFile=/run/icinga2/icinga2.pid

[Install]
WantedBy=multi-user.target


# po zmianach w definicji usług
systemctl daemon-reload

Format historii poleceń konsoli w bashrc

# dla aktualnego użytkownika (nie root-a)
nano ~/.bashrc

# lub przechodzimy na konto root-a
sudo su --
nano /root/.bashrc
# zwiększamy rozmiar historii poleceń
HISTSIZE=10000
HISTFILESIZE=20000

# na samym dole dodajemy format daty dla polecenia history
# np. 4 2023-05-31, 10:36:32 htop
export HISTTIMEFORMAT='%F, %T '

# dodaj następujący wiersz, jeśli chcesz dołączyć polecenia do pliku historii zamiast nadpisywania
shopt -s histappend

# Bash domyślnie zapisuje sesję w pliku historii bash dopiero po zakończeniu sesji. 
# Aby zmienić to domyślne zachowanie i sprawić, by natychmiast zapisywało każde wykonane polecenie dodaj na końcu
PROMPT_COMMAND='history -a'

Kolorowanie składni nano

# dla każdego użytkownika systemowego
find /usr/share/nano/ -iname "*.nanorc" -exec echo include {} \; >> ~/.nanorc

crontab harmonogram zadań w systemie Ubuntu

# edycja crontab usera linuser
crontab -e -u linusr

# wyświetlenie crontaba usera linuser
crontab -l -u linusr

# podgląd crontab w inny sposób
cat /var/spool/cron/crontabs/root

# systemowe crony są w /etc/cron.d/ oraz /etc/cron.daily/ /etc/cron.hourly/ /etc/cron.monthly/ itd.
# dodawane tam wpisy powinny mieć uprawnienia root-a i kończyć się nową linią

Symulator ustawień crontab https://crontab.guru/  .Więcej informacji o crontab można znaleźć na tej stronie https://www.digitalocean.com/community/tutorials/how-to-use-cron-to-automate-tasks-ubuntu-1804

Analiza logów systemowych Ubuntu

syslog: Plik syslog zawiera ogólne dzienniki aktywności systemu. Zawiera informacje o zdarzeniach systemowych, uruchamianiu i zatrzymywaniu usług, komunikatach jądra i innych działaniach związanych z systemem.

auth.log: Plik auth.log zawiera dzienniki związane z uwierzytelnianiem. Rejestruje zdarzenia związane z uwierzytelnianiem użytkownika, takie jak udane i nieudane próby logowania, zmiany hasła i błędy uwierzytelniania.

kern.log: Plik kern.log przechowuje komunikaty związane z jądrem. Rejestruje zdarzenia jądra, takie jak błędy sprzętowe, informacje o sterownikach urządzeń oraz szczegóły ładowania/rozładowywania modułów jądra.

dpkg.log: Plik dpkg.log przechowuje dziennik działań zarządzania pakietami wykonywanych za pomocą polecenia dpkg. Rejestruje instalacje pakietów, uaktualnienia i usunięcia.

boot.log: Plik boot.log zawiera informacje związane z procesem uruchamiania systemu. Rejestruje komunikaty podczas sekwencji rozruchu, w tym inicjalizację jądra, uruchomione usługi i inne zdarzenia związane z rozruchem.

ufw.log: Jeśli włączona jest nieskomplikowana zapora sieciowa (UFW), plik ufw.log zawiera dzienniki związane z zaporą ogniową. Rejestruje zmiany reguł zapory, zablokowane połączenia i inne zdarzenia związane z zaporą.

Szukanie błędów przy pomocy dmesg

Jeśli masz problemy z nierozpoznawaniem sprzętu lub jego nieprawidłowym działaniem, dmesg może rzucić trochę światła na ten problem. Użyj dmesg, aby przejrzeć wiadomości od najwyższego poziomu do każdego niższego poziomu, szukając błędów lub ostrzeżeń, które wspominają o elemencie sprzętowym lub mogą mieć związek z problemem. Użyj dmesg, aby wyszukać jakąkolwiek wzmiankę o odpowiednim obiekcie, aby zobaczyć, czy zawierają one przydatne informacje. Przeprowadź potok dmesg przez grep i poszukaj powiązanych ciągów lub identyfikatorów, takich jak producent produktu lub numery modeli.
Użyj opcji –follow i oglądaj wiadomości dmesg w czasie rzeczywistym.

# znacznik czasowy -T humad readable
sudo dmesg -T
sudo dmesg | last -10
sudo dmesg | grep -i usb
sudo dmesg | grep -i sda
sudo dmesg | grep -E "memory|tty|dma"
sudo dmesg -l debug,notice
sudo dmesg -f daemon

kern: Kernel messages.
user: User-level messages.
mail: Mail system.
daemon: System daemons.
auth: Security/authorization messages.
syslog: Internal syslogd messages.
lpr: Line printer subsystem.
news: Network news subsystem.

Usuwanie niepotrzebnego oprogramowania systemowego Ubuntu

# sprawdzenie wersji zainstalowanych kerneli
dpkg --list | egrep -i --color 'linux-image|linux-headers'

ii linux-headers-5.15.0-73 5.15.0-73.80 all Header files related to Linux kernel version 5.15.0
ii linux-headers-5.15.0-73-generic 5.15.0-73.80 amd64 Linux kernel headers for version 5.15.0 on 64 bit x86 SMP
ii linux-headers-generic 5.15.0.73.71 amd64 Generic Linux kernel headers
ii linux-image-5.15.0-73-generic 5.15.0-73.80 amd64 Signed kernel image generic
ii linux-image-generic 5.15.0.73.71 amd64 Generic Linux kernel image

# sprawdzamy którą wersję aktualnie kernela używamy
uname -r
5.15.0-73-generic

# jeśli są jakieś stare i niepotrzebne wersje kernelato usuwamy je poleceniem
sudo apt remove --purge linux-headers-5.15.0-70-generic

# usunięcie niepotrzebnych już wersji oprogramowania
sudo apt-get autoremove --purge

# wyczyszczenie lokalnego repozytorium ze ściągniętych pakietów
sudo apt-get autoclean

Zarządzanie rozmiarem dziennika logów systemu Ubuntu

Domyślnie systemd-journald zapewnia usunięcie starszych rekordów dziennika lub plików dziennika logów, aby zachować pewną ilość wolnego miejsca na dysku.  Możemy użyć journalctl do zarządzania rozmiarem dziennika.

# sprawdzenie zajętości systemu przez logi
sudo journalctl --disk-usage

sudo nano /etc/systemd/journald.conf

[Journal]
#Storage=auto
Compress=yes
#Seal=yes
#SplitMode=uid
#SyncIntervalSec=5m
#RateLimitIntervalSec=30s
#RateLimitBurst=10000
SystemMaxUse=50M
#SystemKeepFree=
SystemMaxFileSize=10M
#SystemMaxFiles=100
#RuntimeMaxUse=
#RuntimeKeepFree=
#RuntimeMaxFileSize=
#RuntimeMaxFiles=100
#MaxRetentionSec=
#MaxFileSec=1month
#ForwardToSyslog=yes
#ForwardToKMsg=no
#ForwardToConsole=no
#ForwardToWall=yes
#TTYPath=/dev/console
#MaxLevelStore=debug
#MaxLevelSyslog=debug
#MaxLevelKMsg=notice
#MaxLevelConsole=info
#MaxLevelWall=emerg
#LineMax=48K
#ReadKMsg=yes
#Audit=no

# restart usługi journald
sudo systemctl restart systemd-journald

# przycięcie już istniejących zbyt dużych logów
sudo journalctl --vacuum-size=50M

# weryfikacja po zmianach zajętości logów
sudo journalctl --disk-usage

Zarządzanie MOTD w systemie Ubuntu

# wyłączenie MOTD w systemie Ubuntu
sudo chmod -x /etc/update-motd.d/*

# włączenie MOTD w systemie Ubuntu
sudo chmod o+rx /etc/update-motd.d/*

# ustawienie neofetch jako MOTD w systemie
sudo chmod -x /etc/update-motd.d/*
sudo apt-get install neofetch
sudo bash -c $'echo "neofetch" >> /etc/profile.d/mymotd.sh && chmod +x /etc/profile.d/mymotd.sh'

Usunięcie z komunikatu no codec found przy starcie maszyny wirtualnej

sudo nano /etc/modprobe.d/blacklist.conf

blacklist floppy
blacklist snd_hda_intel

# po zapisaniu zmian
sudo update-initramfs -u
reboot