LINUX
************************************************** Linux 4 work zápisky **************************************************
USEFUL
# clear // ~ cls
# wc <file> // word count
# tree -L <1-x> // stromovitá struktura o specifikovaných vrstvách (-L)
# systemctl list-timers // list timers on events
************************************************** ACCOUNTS (higher level administration) ********************************
/etc/passwd //uživatelé
/etc/shadow //hesla
/etc/group //skupiny
/etc/gshadow //hesla skupin
# sudo id <user> // vypíše ID usera
useradd, userdel - používat ve skriptech, low level příkazy
ADD / REMOVE USERS
# adduser <name> // přidá uživatele s domovskou složkou do které nakopíruje vše z /etc/skel
# adduser <name> --uid <id> // přidá uživatele se specifickým ID
# adduser --home <custom_path> <name> // vytvoří uživatele se specifickou home složkou
# adduser --disabled-password <name> // přidá uživatele se zakázaným heslem
# adduser --ingroup <groupname> <name> // přidá uživatele do specifické skupiny (jako jeho primární skupina)
# deluser --remove-home <name> // odebere uživatele i s jeho domovskou složkou (i s jeho skupinou)
# deluser --remove-all-files <name> // odebere uživatele i soubory v jeho vlastnictví
# deluser --system <name> // odebere systémového uživatele
konfigurace -> /etc/adduser; /etc/deluser;
ADD / REMOVE GROUPS
# addgroup <name> // přidá skupinu
# addgroup --gid <gid> <name> // přidá skupinu se specifickým gid
# addgroup --system --gid <gid> <name> // přidá systémovou skupinu se specifickým gid
# delgroup <name> // smaže skupinu
# delgroup --only-if-empty // smaže skupinu pouze když je prázdná
MODIFYING USERS / GROUPS
# passwd <name> // změna hesla uživatele
# adduser <name> <groupname> // přidá uživatele do skupiny
# deluser <name> <groupname> // smaže uživatele ze skupiny
# getent group <groupname> // zobrazi members skupiny
# usermod -g <groupname> <name> // změní primární skupinu uživatele
# usermod -aG <groupname> <name> // přidá uživatele do sekundární skupiny
# usermod -G <group1,group2> <name> // upraví sekundární skupiny uživatele POUZE na ty, které specifikuju
# gpasswd -d <name> <groupname> // odebere uživatele ze specifikované skupiny
# usermod -l <newname> <oldname> // přejmenuju uživatele, /home složka zůstává stejně pojmenovaná
# usermod -L username // zamkne účet
# usermod -U username // odemkne účet
************************************************** PERMISSIONS AND OWNERSHIP **************************************************
# ls -la
- | r w x | r w x | r w x | 1 | name | group name | size | last modification | filename
1) " - " - files; " d " - directories; " l " - symlinks
2) user owner permissions
3) group owner permissions
4) permissions for others
5) hard link count
6) user owner
7) group owner
CHMOD
# chmod <0-7,0-7,0-7> <file> // změní permissions souboru
# chmod -R <0-7,0-7,0-7> <directory> // rekurzivně změní permissions složky
numeric model: // toto kombinuji a sčítám do jednotlivých polí rwx
r - (100) - 4
w - (010) - 2
x - (001) - 1
# chmod 1<0-7,0-7,0-7> <folder> // přidá STICKY BIT - ve složce mohou mazat soubory pouze jejich majitelé
CHOWN
# chown <name>:<group> <filename> // změní ownership souboru
# chown -R <name>:<group> <directory> // rekurzivně změní ownership složky
# chown --preserve-root -R <name>:<group> <directory> // změní ownership rekurzivně, ale zachová rootovský ownership
************************************************** GREP AND SEARCHING **************************************************
# cat <file> // ukáže obsah souboru
# head -n 10 <file> // ukáže prvních 10 lines souboru
# tail -n 10 <file> // ukáže posledních 10 lines souboru
# wc <file> // word count; output <words>,<lines>,<bytes>
# grep "text" <file> // hledat text v souboru
# grep -i "text" <file> // case insensitive hledání
# grep -r "text" /directory // rekurzivní search textu v podadresářích
************************************************** FILE OPERATIONS **************************************************
# touch <name.extension> // vytvoří soubor
# mkdir <name> // vytvoří složku
# cp <name1> <name2> // zkopíruje soubor; parametr "-r" - kopíruje složky rekurzivně
# mv <name1> <name2> // přejmenuje či přesune soubor
# rm <name> // remove specified file; parametr "-f" - force; "-r" - rekurzivně
# gzip <file> // komprese souboru, můžu přidat parametr "-<1-9>" kdy 1 je nejmenší a 9 největší komprese
# gzip -k <file> // komprese souboru, originál je zachován
# gunzip <file> // dekomprese souboru
# zcat <file> // podívám se na obsah souboru bez dekomprese
# tar <options> <name> <path to directory> // vytvoření archivu
-c - vytvoření archivu
-x - extrahování archivu
-f - specifikace jména archivu
-v - verbose - vypisuj porgress
-z komprese pomocí gzip
# tar -cvf backup.tar /home/user/docs // vytvoří archiv ze složky docs
# tar -xvf backup.tar -C /destination // extrahuje archiv
# scp file.txt user@remote_host:/home/user/ // přenos souboru přes SSH (local -> remote)
# scp user@remote_host:/path/to/file.txt /local/path/ // přenos souboru přes SSH (remote -> local)
// (-r) - rekurzivně pro složky, (-P <port>) - specifikuju port SSH
************************************************** NETWORK *******************************************************
# ip a
# ifconfig
# iwconfig
DISABLE IPv6
# nano /etc/sysctl.conf // edit systémové konfigurace
add lines at the end:
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1
# sysctl -p // apply changes
************************************************** TIME & DATE *******************************************************
# timedatectl status // status check
# dpkg-reconfigure tzdata // reconfigure timezone data
# timedatectl set-ntp on // turn on NTP over internet
************************************************** SSH ENABLING **************************************************
default port 22 (tcp)
# apt install openssh-server // instalovat package se serverem
# systemctl status ssh // status procesu ssh serveru
# ufw allow ssh // povolí ssh (defaultně port 22) ve firewallu
SETTINGS:
/etc/ssh/sshd_config // pozor, ssh - client; sshd - ssh daemon (server)
PORT CHANGE:
1) v sshd configu změním Port <xxx>
2) # ufw allow <port>/<protocol> // povolení ve firewallu (např ufw allow 1998/tcp)
3) # ufw status // kontrola pravidel ve firewallu
4) # systemctl restart sshd && systemctl restart ufw // restart services
5) # ss -tuln | grep <port> // kontrola nastavení portu
BANNER
- vytvořim soubor s bannerem, v sshd_config přidám řádek:
Banner /cesta/k/nemu
# systemctl reload ssh // reload aby se propsala změna
************************************************** MOTD CHANGES **************************************************
defaultně se generuje MOTD ze souborů v /etc/update-motd.d/
# sudo chmod -x /etc/update-motd.d/* // zruší defaultní MOTD
pokud chci custom, musím vytvořit custom soubor:
# sudo nano /etc/motd
***************************************************** MOUNTING AND UNMOUNTING, STORAGE **************************
# lsblk // info o storages a partitions
# blkid // info o storage hw (UUID etc.)
# mount <what> <where> // mount do složky, většinou # mount /dev/sda1 /kam/chci
# umount <what>
Permanent mounting:
# blkid // zkopiruju si UUID nebo PARTUUID
# sudo nano /etc/fstab // otevřu fstable
+ přidám řádek:
PARTUUID=<partuuid> <mountpoint> <filesystem> <mountoptions> <dumpoption> <fsckorder>
filesystem - ext4, ntfs, exfat
mount options - defaults (include rw, suid, dev, exec, auto, nouser, async), nofail (při nenačtení disku nejsou problemy s bootem)
dump option - nechávat na 0, asi legacy?
fsck options - 0 (dont check fs on boot), 1 (check root (/) fs first), 2 (check non-root partitions after root)
PŘÍKLAD: PARTUUID=abcd1234-01 /srv/External_SSD ext4 defaults,noatime,nofail 0 2
FORMATTING:
Identify:
# lsblk
Unmount:
# umount /dev/sda1 // force s parametrem "-l"
Format:
# fdisk /dev/sda // spustí fdisk pro celý sda
FDISK:
- m - prints help
- p - print všech partitions
- d - delete partition
- w - write all changes
- n - new partition
Create FS:
sudo mkfs.ext4 /dev/sda1
sudo mkfs.ntfs /dev/sda1
sudo mkfs.exfat /dev/sda1
# df -h path // zobrazí velikost + free space složky
***************************************************** STORAGE AND RAID ******************************************
Redundant Array of Independent Disks
- disks are working in parallel
RAID0
- striping
- data in blocks across all drives, good I/O performance but faluty drive causes the whole array to fail
- good for extreme performance, no overhead, easy to implement
- if one drive fails, all data is lost
RAID1
- data is mirrored onto the second drive, easy data recovery
- ideal for mission critical storage
- all data is written twice = overall storage space is halved
RAID5
- striping with parity
- requires 3-16 drives
- data isn't duplicated, it's striped across multiple disks in blocks
- a parity checksum is written for each block, this parity data is not written to a fixed drive but it is spread across all drives
- using the parity data, PC can recalculate data of a specific data block
- can withstand a single drive failure without losing data in the array
- ideal for file storage servers due to fault tolerance; read speeds good, write speeds slower due to parity calculing operations
- rebuilding a failed drive can take hours
RAID6
- striping with double parity
- like RAID6, but the parity data is written to two drives
- requires 4 drives minimum, but can withstand 2 simultaneous drive failures
RAID10
- combining, mirroring, striping
- combining RAID1 and RAID0 (RAID0 is mirrored)
USEFUL COMMANDS FOR STORAGE:
# lsblk //lists connected storage devices
# sudo fdisk -l //check connected storage
# sudo parted -l //check connected storage
# dmesg | grep -i "sda\|ata\|usb\|scsi" //views kernel messages related to the disks
# lsusb //lists usb devices
# lspci | grep -i "sata" //lists sata devices
Verifying kernel module:
# lsmod | grep ata //checks if kernel module is loaded for sata
# sudo modprobe ahci //manually loads kernel module (ahci, ata_piix, libata)
# lsmod | grep usb //checks if kernel module is loaded for usb
# sudo modprobe usb_storage //manually loads kernel module (usb_storage, uas)
***** RAID1: *****
- connect two disks with the same size
# sudo apt install mdadm
# sudo lsblk //get the names of the disks that I want to configure as RAID
# sudo fdisk <device, for example /dev/sda> //configure partitions -> primary (p); partition number - leave defalut; first and last sector leave default
//partition: Linux RAID Autodetect
# sudo mdadm --create /dev/md0 --level=mirror --raid-devices=2 /dev/sdb1 /dev/sdc1 //create RAID1
- now create a partition on the new /dev/md0
# sudo mdadm --detail <path to device>
Recovery on failure:
# sudo mdadm --detail <path to raid> //should say State: clean, degraded
- remove the faulty harddrive
# lsblk
# sudo fdisk /dev/sdc //initialize disk as Linux RAID autodetect
# sudo mdadm --manage /dev/md0 --add /dev/sdc1
***************************************************** SCREEN ******************************************
screen // starts a new session
screen -S <name> // name a session
screen -r <name or id> // reattach a screen
screen -ls // list screens
screen -X -S <name or id> quit // quit a session
screen -wipe // kill all screens
ctrl+A then D // detach a screen but keep it running
ctrl+A then C // create window
ctrl+A then N // next window
ctrl+A then P // previous window
ctrl+A then K // kill window
***************************************************** MAIL FROM SERVER ******************************************
# sudo apt update
# sudo apt install msmtp msmtp-mta // install packages
# nano ~/.msmtprc // create a config file in current user home directory
CONFIGURATION:
/////////////////
defaults
auth on
tls on
tls_trust_file /etc/ssl/certs/ca-certificates.crt
logfile ~/.msmtp.log
account gmail
host smtp.gmail.com
port 587
from your.email@gmail.com
user your.email@gmail.com
password your-app-password // paste without breaks, generate this from Google Account → Security → "App Passwords"
account default : gmail
/////////////////
# chmod 600 ~/.msmtprc // set permissions
SENDING EMAILS:
# echo -e "From: sklep-srv-1@sklepmajstr.cz\nTo: system.operatorts@gmail.com\nSubject: Hello\n\nTest from server" | msmtp -t
# echo -e "From: sklep-srv-1@sklepmajstr.cz\nTo: system.operatorts@gmail.com\nSubject: Ahuj Bibinex\n\nVláďovi smrdí nohy" | msmtp -t
******* USE MAIL *******
sudo apt install mailutils
echo "Message body" | mail -s "Subject line" system.operators@gmail.com
***************************************************** HOME ASSISTANT ******************************************
# sudo apt update && sudo apt upgrade -y
# sudo apt install -y python3 python3-venv python3-pip libffi-dev libssl-dev autoconf build-essential libopenjp2-7 libtiff5 libturbojpeg0-dev tzdata
// if E: Unable to locate package libtiff5, then # sudo apt install -y libtiff-dev libopenjp2-7 libturbojpeg0-dev
# sudo useradd -rm homeassistant -G dialout
# sudo passwd homeassistant
# sudo -u homeassistant -s
# cd /home/homeassistant
# python3 -m venv environment // create virtual environment
# source environment/bin/activate // switch to virtual environment
# pip install --upgrade pip //
# pip install homeassistant // install home assistant
# hass // run home assistant, will be at http://<your-server-ip>:8123
CREATE AS SERVICE:
sudo nano /etc/systemd/system/home-assistant.service
.................................
[Unit]
Description=Home Assistant
After=network.target
[Service]
Type=simple
User=homeassistant
ExecStart=/home/homeassistant/environment/bin/hass -c "/home/homeassistant/.homeassistant"
Restart=on-failure
[Install]
WantedBy=multi-user.target
.................................
sudo systemctl daemon-reload
sudo systemctl enable home-assistant
sudo systemctl start home-assistant
TROUBLESHOOT:
source /home/homeassistant/environment/bin/activate
pip install isal
pip install zlib-ng
pip install --upgrade pip setuptools wheel
pip install "pyspeex-noise==1.0.2"
pip install "netifaces==0.11.0"
pip install "aiodiscover==2.1.0"
deactivate
sudo apt update
sudo apt install -y python3-dev build-essential pkg-config cmake libspeexdsp-dev
PYTHON 3.13 UPDATE:
# sudo apt update
# sudo apt install -y software-properties-common
# sudo add-apt-repository -y ppa:deadsnakes/ppa
# sudo apt update
# sudo apt install -y python3.13 python3.13-venv python3.13-dev
# sudo apt install -y build-essential pkg-config cmake libffi-dev libssl-dev \
libopenjp2-7 libtiff-dev libturbojpeg0-dev libspeexdsp-dev
# sudo systemctl stop home-assistant
Create new venv alongside the old one
# sudo -u homeassistant -H bash -c '
python3.13 -m venv /home/homeassistant/environment-3.13
source /home/homeassistant/environment-3.13/bin/activate
pip install --upgrade pip setuptools wheel
pip install --upgrade homeassistant
# optional perf extra
pip install isal
deactivate
'
# sudo -u homeassistant -H bash -c '
source /home/homeassistant/environment-3.13/bin/activate
pip install "pyspeex-noise==1.0.2" "netifaces==0.11.0"
deactivate
'