Commands
The ones worth not having to look up twice. What you want to do on the left, the command that does it on the right — anything in <angle-brackets> is a placeholder.
Triage
First minute on a sick box
- Uptime and load averages
uptime - Kernel errors and warnings
dmesg -T --level=err,warn | tail -50 - Failed systemd units
systemctl --failed - Errors logged since boot
journalctl -p err -b - Pressure stall: is CPU, memory or I/O actually contended
grep . /proc/pressure/* - Run queue, swapping, CPU split
vmstat 1 5 - Disk latency and saturation
iostat -xz 1 3 - Network throughput per interface
sar -n DEV 1 5 - TCP retransmits per second
sar -n TCP,ETCP 1 5 - Load per CPU core
mpstat -P ALL 1 3 - CPU and disk I/O per process
pidstat -u -d 1 3 - Top memory consumers
ps aux --sort=-%mem | head - Top CPU consumers
ps aux --sort=-%cpu | head - Processes stuck in D state (hung on I/O or NFS)
ps -eo stat,pid,wchan:32,cmd | awk '$1 ~ /^D/' - Dump stacks of blocked tasks to the kernel log
echo w > /proc/sysrq-trigger && dmesg -T | tail -100 - OOM killer activity
journalctl -k -g 'killed process' - Machine check and hardware errors
journalctl -k -g 'mce|machine check|hardware error' - Recent reboots and shutdowns
last -x reboot shutdown | head - Load earlier today, from sysstat history (Debian path)
sar -q -f /var/log/sysstat/sa<day-of-month>
Memory
- Memory and swap
free -h - Available memory, dirty pages, kernel slab
grep -E 'MemAvailable|Dirty|Slab|SUnreclaim' /proc/meminfo - Kernel caches by size (memory gone but no process owns it)
slabtop -o -s c | head -20 - Processes using the most swap
grep VmSwap /proc/[0-9]*/status | sort -k2 -n | tail
Limits that fail quietly
- System-wide file handles: used, free, max
cat /proc/sys/fs/file-nr - Open files of a process against its limit
ls /proc/<pid>/fd | wc -l && grep 'open files' /proc/<pid>/limits - Conntrack table full (drops new connections)
cat /proc/sys/net/netfilter/nf_conntrack_count /proc/sys/net/netfilter/nf_conntrack_max - Threads in use against the PID limit
ps -eLf | wc -l && cat /proc/sys/kernel/pid_max - Clock offset (breaks TLS, Kerberos, etcd)
chronyc tracking - Time, timezone and NTP sync state
timedatectl
Out of space
- Usage per real filesystem
df -hT -x tmpfs -x devtmpfs -x overlay - Inodes exhausted (df shows space, writes still fail)
df -i - Largest directories on one filesystem
du -xh --max-depth=1 / | sort -h | tail -20 - Interactive disk usage browser
ncdu -x / - Files over 1 GB
find / -xdev -type f -size +1G -exec ls -lh {} + - Deleted files still held open
lsof +L1 - Free a deleted-but-open file without restarting its process
: > /proc/<pid>/fd/<fd> - Empty a live log without breaking the writer
truncate -s 0 <file> - df and du disagree: look under the mountpoints
mkdir -p /mnt/rootfs && mount --bind / /mnt/rootfs && du -xh --max-depth=1 /mnt/rootfs | sort -h - ext4: shrink the 5% root reserve on a data disk
tune2fs -m 1 /dev/<device> - Shrink the systemd journal
journalctl --vacuum-size=500M
Windows: first look
- Last boot time
(Get-CimInstance Win32_OperatingSystem).LastBootUpTime - Why it rebooted: 41 unexpected, 1074 initiated, 6008 dirty shutdown
Get-WinEvent -FilterHashtable @{LogName='System'; Id=41,1074,6008} -MaxEvents 10 | Format-List TimeCreated, Id, Message - Blue screens: bugchecks on record
Get-WinEvent -FilterHashtable @{LogName='System'; ProviderName='Microsoft-Windows-WER-SystemErrorReporting'; Id=1001} -MaxEvents 5 | Format-List TimeCreated, Message - Critical and error events, last 24 hours
Get-WinEvent -FilterHashtable @{LogName='System','Application'; Level=1,2; StartTime=(Get-Date).AddDays(-1)} | Select-Object TimeCreated, ProviderName, Id, Message - CPU, free memory and disk latency, live (English counter names)
Get-Counter '\Processor(_Total)\% Processor Time', '\Memory\Available MBytes', '\LogicalDisk(_Total)\Avg. Disk sec/Transfer' -SampleInterval 2 -MaxSamples 5 - Processes with the most CPU time
Get-Process | Sort-Object CPU -Descending | Select-Object -First 10 Name, Id, CPU - Processes with the most memory
Get-Process | Sort-Object WorkingSet64 -Descending | Select-Object -First 10 Name, Id, @{n='MB'; e={[int]($_.WorkingSet64 / 1MB)}} - Automatic services that are not running
Get-CimInstance Win32_Service -Filter "StartMode='Auto' AND State<>'Running'" | Select-Object Name, DisplayName, ExitCode - Free space per volume
Get-Volume | Where-Object DriveLetter | Select-Object DriveLetter, FileSystemLabel, @{n='FreeGB'; e={[int]($_.SizeRemaining / 1GB)}}, @{n='SizeGB'; e={[int]($_.Size / 1GB)}} - Reboot pending (servicing or Windows Update)
'Component Based Servicing\RebootPending', 'WindowsUpdate\Auto Update\RebootRequired' | ForEach-Object { Test-Path "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\$_" }
System
systemd
- Status and last log lines
systemctl status <unit> - Start now and at boot
systemctl enable --now <unit> - Reload after editing unit files
systemctl daemon-reload - Override a unit without touching the vendor file
systemctl edit <unit> - Unit file as systemd sees it, drop-ins included
systemctl cat <unit> - Effective limits and restart policy
systemctl show <unit> -p Restart,MemoryMax,LimitNOFILE,TasksMax - After “start request repeated too quickly”
systemctl reset-failed <unit> && systemctl start <unit> - Keep a unit from starting, even as a dependency
systemctl mask <unit> - Check a unit file before loading it
systemd-analyze verify <file>.service - Run one command with a memory and CPU cap
systemd-run --scope -p MemoryMax=2G -p CPUQuota=50% <command> - CPU, memory and I/O per cgroup, live
systemd-cgtop - Timers with last and next run
systemctl list-timers --all - Every user’s crontab (jobs outside systemd timers)
for u in $(cut -d: -f1 /etc/passwd); do crontab -l -u "$u" 2>/dev/null | sed "s/^/$u: /"; done - What slowed down boot
systemd-analyze blame
Logs
- Follow one unit
journalctl -u <unit> -f - Last hour, all units
journalctl --since "1 hour ago" - Exact time window
journalctl --since "2026-01-01 10:00" --until "2026-01-01 10:30" - Previous boot (what happened before the crash)
journalctl -b -1 -e - Boots on record, to pick one for -b
journalctl --list-boots - Kernel messages only
journalctl -k - Everything sudo ran
journalctl _COMM=sudo - Keep logs across reboots
mkdir -p /var/log/journal && systemctl restart systemd-journald - Follow a plain log file across rotation
tail -F <file>
Processes
- Find a process by name
pgrep -a <name> - Process tree
ps -ef --forest - Files a process has open
lsof -p <pid> - Who is using a port
ss -tlnp 'sport = :<port>' - Environment of a running process
tr '\0' '\n' < /proc/<pid>/environ - Binary and working directory of a process
ls -l /proc/<pid>/exe /proc/<pid>/cwd - Kernel stack of a hung process
cat /proc/<pid>/stack - Trace system calls
strace -f -p <pid> - Only file and network syscalls, timestamped
strace -f -tt -e trace=%file,%network -p <pid> - Hottest functions, live
perf top -p <pid> - De-prioritise CPU and disk for a noisy job
renice -n 19 -p <pid> && ionice -c3 -p <pid> - Watch a command, highlighting what changed
watch -n1 -d '<command>' - Session that survives logout
tmux new -s <name> - Reattach to it
tmux attach -t <name>
Files and text
- Files changed in the last day
find <dir> -type f -mtime -1 - Delete files older than 30 days (run with -print first)
find <dir> -type f -mtime +30 -delete - Top talkers in a log: count and rank one column
awk '{print $1}' <log> | sort | uniq -c | sort -rn | head - “Operation not permitted” as root: immutable bit
lsattr <file> && chattr -i <file> - Compare one file across two hosts
diff <(ssh <host-a> cat <file>) <(ssh <host-b> cat <file>) - Run a command on many hosts in parallel
xargs -P 10 -I{} ssh -o BatchMode=yes {} '<command>' < <hosts-file> - Pack a directory
tar -czf <archive>.tar.gz <dir> - Unpack into a directory
tar -xzf <archive>.tar.gz -C <dir> - List an archive without unpacking
tar -tzf <archive>.tar.gz | head
Users and security
- Change owner recursively
chown -R <user>:<group> <dir> - Directories 755, files 644
find <dir> -type d -exec chmod 755 {} + && find <dir> -type f -exec chmod 644 {} + - Add a user to a group (next login)
usermod -aG <group> <user> - Show ACLs
getfacl <path> - Grant one user access via ACL
setfacl -m u:<user>:rwx <path> - Default ACL so new files inherit group access
setfacl -R -d -m g:<group>:rwX <dir> - Password and account expiry (service account locked out)
chage -l <user> - SELinux denials, recent
ausearch -m avc -ts recent - Reset SELinux labels after moving files
restorecon -Rv <path> - Allow a service on a non-standard port under SELinux
semanage port -a -t http_port_t -p tcp <port> - Failed SSH logins today
journalctl -u ssh -u sshd -g 'Failed password|Invalid user' --since today
Packages
- Debian: installed and candidate version, and which repo
apt-cache policy <package> - Debian: which package owns a file
dpkg -S <path> - Debian: finish an interrupted upgrade
dpkg --configure -a && apt -f install - Debian: pin a package version
apt-mark hold <package> - Debian: reboot required, and by what
cat /var/run/reboot-required.pkgs - Debian: services still running old libraries
needrestart -r l - RHEL: which package owns a file
rpm -qf <path> - RHEL: which package provides a binary
dnf provides '*/<binary>' - RHEL: undo a transaction
dnf history && dnf history undo <id> - RHEL: reboot required
dnf needs-restarting -r
Boot and rescue
- Root is read-only in emergency mode
mount -o remount,rw / - Chroot into a broken install from a live ISO
mount /dev/<root> /mnt && for d in dev proc sys run; do mount --rbind /$d /mnt/$d; done && chroot /mnt - Kernel command line the system booted with
cat /proc/cmdline - UEFI boot entries and order
efibootmgr -v - Debian: rebuild every initramfs
update-initramfs -u -k all - RHEL: rebuild every initramfs
dracut -f --regenerate-all - Debian: reinstall GRUB on a BIOS disk
grub-install /dev/<disk> && update-grub
Hardware
- Hardware event log (PSU, DIMM, fan faults)
ipmitool sel elist | tail -20 - Sensors: temperatures, fans, voltages
ipmitool sdr elist - BMC network settings from the host
ipmitool lan print 1 - BMC unresponsive: cold-reset it from the host
ipmitool mc reset cold - Serial number / Dell service tag
dmidecode -s system-serial-number - DIMMs per slot with size and speed
dmidecode -t memory | grep -E 'Locator|Size|Speed' - CPU model, sockets, cores, flags
lscpu - ECC errors per memory controller
grep . /sys/devices/system/edac/mc/mc*/[cu]e_count - PCIe link trained below its capability
lspci -vv -s <bus:dev.fn> | grep -E 'LnkCap|LnkSta' - NUMA layout (pin VMs and IRQs to one node)
numactl --hardware - CPU temperatures and fans
sensors
NixOS: rebuild
- Build and switch
sudo nixos-rebuild switch --flake .#<host> - Activate without a boot entry
sudo nixos-rebuild test --flake .#<host> - Apply on next boot only (kernel, init changes)
sudo nixos-rebuild boot --flake .#<host> - Build only, change nothing
nixos-rebuild build --flake .#<host> - Deploy to a remote machine
nixos-rebuild switch --flake .#<host> --target-host <user>@<host> --sudo - Back to the previous generation
sudo nixos-rebuild switch --rollback - What changed since the last boot
nix store diff-closures /run/booted-system /run/current-system
NixOS: flakes and store
- Update all inputs
nix flake update - Update one input
nix flake update <input> - Evaluate every output before deploying
nix flake check - Evaluate an option
nix eval .#nixosConfigurations.<host>.config.<option> - Explore the config in a REPL
nix repl --expr 'builtins.getFlake (toString ./.)' - System generations
nix-env --list-generations --profile /nix/var/nix/profiles/system - Closure size of the running system
nix path-info -Sh /run/current-system - GC frees nothing: find what still roots it
nix-store --gc --print-roots | grep -v '^/proc' - Delete old generations and garbage
sudo nix-collect-garbage --delete-older-than 14d - Deduplicate the store
nix store optimise - Store corruption: verify and repair
sudo nix-store --verify --check-contents --repair - Try a package without installing
nix shell nixpkgs#<package>
Windows: repair and updates
- Repair the component store first (needs Windows Update or a source)
DISM /Online /Cleanup-Image /RestoreHealth - Then repair system files
sfc /scannow - What sfc could not repair
Select-String -Path C:\Windows\Logs\CBS\CBS.log -Pattern '\[SR\] Cannot repair' - Shrink WinSxS by removing superseded components
DISM /Online /Cleanup-Image /StartComponentCleanup - Recently installed updates
Get-HotFix | Sort-Object InstalledOn -Descending | Select-Object -First 10 HotFixID, Description, InstalledOn - Find an update’s package name to remove it
DISM /Online /Get-Packages /Format:Table | findstr <kb-number> - Remove it
DISM /Online /Remove-Package /PackageName:<package-name> - Readable Windows Update log (written to the desktop)
Get-WindowsUpdateLog - Updates fail behind a proxy: the WinHTTP proxy setting
netsh winhttp show proxy - Online scan of a volume, no downtime
Repair-Volume -DriveLetter <letter> -Scan
Windows: services and tasks
- Service stuck in Stopping: its PID (sc.exe, since sc is an alias)
sc.exe queryex <service> - Then kill it
taskkill /PID <pid> /F - Why a service will not start: Service Control Manager events
Get-WinEvent -FilterHashtable @{LogName='System'; ProviderName='Service Control Manager'} -MaxEvents 20 | Select-Object TimeCreated, Id, Message - Scheduled tasks whose last run failed (ignoring running and never-run)
Get-ScheduledTask | Where-Object State -ne 'Disabled' | Get-ScheduledTaskInfo | Where-Object LastTaskResult -notin 0, 267009, 267011 | Select-Object TaskName, LastRunTime, LastTaskResult - Which process holds a file (Sysinternals Handle)
handle.exe -accepteula <name>
Windows: Active Directory
- Replication summary across all DCs
repadmin /replsummary - Replication partners and last result for one DC
repadmin /showrepl <dc> - DC health across the forest, errors only
dcdiag /e /q - Which DC this machine authenticates against
nltest /dsgetdc:<domain> - FSMO role holders
netdom query fsmo - “Trust relationship failed”: repair the secure channel (Windows PowerShell 5.1, local admin)
Test-ComputerSecureChannel -Repair -Credential <domain>\<admin> - Locked-out accounts
Search-ADAccount -LockedOut | Select-Object Name, SamAccountName, LastLogonDate - Which machine keeps locking an account (event 4740 on the PDC)
Get-WinEvent -ComputerName (Get-ADDomain).PDCEmulator -FilterHashtable @{LogName='Security'; Id=4740} -MaxEvents 20 | Select-Object TimeCreated, @{n='User'; e={$_.Properties[0].Value}}, @{n='Caller'; e={$_.Properties[1].Value}} - Unlock the account
Unlock-ADAccount -Identity <user> - Applied Group Policy, as a report
gpresult /h C:\Temp\gpresult.html /f - Reapply Group Policy now
gpupdate /force - Kerberos tickets: list, then purge after a group change
klist; klist purge
Storage
Disks
- Block devices with filesystems and UUIDs
lsblk -f - Model, serial, size, rotational, transport
lsblk -o NAME,SIZE,MODEL,SERIAL,ROTA,TRAN - Logical and physical sector size (pick ashift)
lsblk -o NAME,LOG-SEC,PHY-SEC - Stable device names
ls -l /dev/disk/by-id/ - Partition table
parted /dev/<disk> print - Find a newly hot-added disk (SCSI host rescan)
echo "- - -" | tee /sys/class/scsi_host/host*/scan - See a disk’s new size after growing it (device rescan)
echo 1 > /sys/class/block/<disk>/device/rescan - Same for NVMe namespaces
nvme ns-rescan /dev/<nvme-controller> - Detach a disk cleanly before pulling it
echo 1 > /sys/block/<disk>/device/delete - Re-read the partition table without rebooting
partprobe /dev/<disk> - Grow a partition into the new space
growpart /dev/<disk> <partition-number> - Find a physical drive: hold its activity LED on
dd if=/dev/<disk> of=/dev/null bs=1M status=progress - Wipe filesystem, RAID and LVM signatures (destroys data)
wipefs -a /dev/<disk> - Also clear GPT, including the backup at the end
sgdisk --zap-all /dev/<disk> - “Device busy” on a wipe: leftover device-mapper entries
dmsetup ls && dmsetup remove <name>
Filesystems and mounts
- Grow ext4 online
resize2fs /dev/<device> - Grow XFS online (takes the mountpoint, not the device)
xfs_growfs <mountpoint> - Force a full ext4 check (unmounted)
e2fsck -f /dev/<device> - Repair XFS (fsck.xfs does nothing)
xfs_repair /dev/<device> - Mount tree
findmnt - fstab entry that will not hang boot if the disk is missing
UUID=<uuid> /mnt/<name> ext4 defaults,noatime,nofail,x-systemd.device-timeout=10s 0 2 - Test fstab without rebooting
systemctl daemon-reload && findmnt --verify && mount -a - Who keeps a mount busy
fuser -vm <mountpoint> - Detach a busy mount
umount -l <mountpoint> - Why a filesystem went read-only
dmesg -T | grep -iE 'remount|i/o error|ext4-fs error|xfs' - Trim all mounted SSDs
fstrim -av
Disk health and performance
- SMART verdict and attributes
smartctl -H -A /dev/<disk> - SMART for a disk behind a PERC / MegaRAID
smartctl -a -d megaraid,<n> /dev/sda - Start a long self-test
smartctl -t long /dev/<disk> - Self-test results
smartctl -l selftest /dev/<disk> - NVMe health and wear
nvme smart-log /dev/<nvme> - Spin down a SATA disk now
hdparm -y /dev/<disk> - Spin down a SAS disk now
sdparm --command=stop /dev/<disk> - Live I/O per process
iotop -o - I/O latency of a directory, like ping
ioping -c 10 <dir> - Random 4k read/write benchmark
fio --name=rand --filename=<file> --size=1G --rw=randrw --bs=4k --direct=1 --runtime=30 --time_based --group_reporting
NFS and SMB
- Server: apply /etc/exports changes
exportfs -ra - Exports a server offers
showmount -e <server> - Mount NFS
mount -t nfs4 <server>:/<export> <mountpoint> - Mount options actually negotiated
nfsstat -m - Stale NFS handle: drop the mount
umount -f -l <mountpoint> - List SMB shares
smbclient -L //<server> -U <user> - Mount SMB with a credentials file
mount -t cifs //<server>/<share> <mountpoint> -o credentials=/root/.smbcred,uid=<uid>,gid=<gid>,vers=3.0
LVM
- Physical volumes, groups, logical volumes
pvs && vgs && lvs - Which disks back each LV
lvs -a -o +devices - Thin pool data and metadata fill
lvs -o lv_name,data_percent,metadata_percent <vg> - Activate a VG after moving disks
vgchange -ay <vg> - Metadata backups (undo a bad change)
vgcfgrestore --list <vg> - Initialise a physical volume
pvcreate /dev/<partition> - Create a volume group
vgcreate <vg> /dev/<partition> - Fixed-size logical volume
lvcreate -n <lv> -L 50G <vg> - Logical volume from all free space
lvcreate -n <lv> -l 100%FREE <vg> - Thin pool
lvcreate --type thin-pool -n <pool> -L 100G <vg>
LVM: grow and shrink
- Add a disk to a VG
vgextend <vg> /dev/<partition> - PV after its disk was enlarged (rescan the disk first)
pvresize /dev/<partition> - Grow LV and filesystem together
lvextend -r -L +10G /dev/<vg>/<lv> - Grow into all free space
lvextend -r -l +100%FREE /dev/<vg>/<lv> - Shrink LV and ext4 (unmounted; XFS cannot shrink)
lvreduce -r -L 20G /dev/<vg>/<lv> - Grow a thin pool
lvextend -L +50G <vg>/<pool> - Thin pool metadata filling up (full means corruption)
lvextend --poolmetadatasize +1G <vg>/<pool> - Evacuate a disk
pvmove /dev/<partition> - Then drop it from the VG
vgreduce <vg> /dev/<partition>
LVM: snapshots and rescue
- Snapshot an LV
lvcreate -s -n <snap> -L 5G /dev/<vg>/<lv> - Roll back to the snapshot
lvconvert --merge /dev/<vg>/<snap> - Drop the snapshot
lvremove /dev/<vg>/<snap> - Two VGs with the same name: rename one by UUID
vgs -o vg_name,vg_uuid && vgrename <vg-uuid> <new-name> - Map partitions inside an LV (VM disk) to mount them
kpartx -av /dev/<vg>/<lv>
ZFS: pools
- Only pools with problems
zpool status -x - Files hit by permanent errors
zpool status -v <pool> - Capacity per vdev
zpool list -v - Mirror by stable disk IDs
zpool create -o ashift=12 <pool> mirror /dev/disk/by-id/<disk-a> /dev/disk/by-id/<disk-b> - ashift of an existing pool
zdb -C <pool> | grep ashift - Replace a failed disk
zpool replace <pool> <old-disk> /dev/disk/by-id/<new-disk> - Use the space after replacing with bigger disks
zpool set autoexpand=on <pool> && zpool online -e <pool> <disk> - Start a scrub
zpool scrub <pool> - Reset error counters after fixing the cause
zpool clear <pool> - Latency per vdev, live
zpool iostat -vl 2 - Who ran what against a pool
zpool history <pool> | tail -20 - Old ZFS label blocking reuse of a disk
zpool labelclear -f /dev/<disk> - Find pools to import
zpool import - Import by stable IDs
zpool import -d /dev/disk/by-id <pool> - Import read-only for rescue
zpool import -o readonly=on -R /mnt <pool>
ZFS: datasets and snapshots
- Usage per dataset
zfs list -o name,used,avail,refer,mountpoint - Where the space went: data, snapshots, children
zfs list -o space -r <pool> - Dataset with zstd compression
zfs create -o compression=zstd <pool>/<dataset> - Compression ratio achieved
zfs get compressratio <pool>/<dataset> - Only properties set by hand
zfs get -s local all <pool>/<dataset> - Cap a dataset
zfs set quota=100G <pool>/<dataset> - Snapshot recursively
zfs snapshot -r <pool>/<dataset>@<name> - Snapshots, oldest first
zfs list -t snapshot -o name,used,creation -s creation - Preview destroying a range of snapshots
zfs destroy -nv <pool>/<dataset>@<first>%<last> - Roll back (destroys later snapshots)
zfs rollback -r <pool>/<dataset>@<name> - Full send to another host
zfs send <pool>/<dataset>@<name> | ssh <host> zfs receive <pool>/<dataset> - Incremental send, one step
zfs send -i @<old> <pool>/<dataset>@<new> | ssh <host> zfs receive <pool>/<dataset> - Incremental send with every snapshot in between
zfs send -I @<old> <pool>/<dataset>@<new> | ssh <host> zfs receive <pool>/<dataset>
ZFS: ARC
- ARC size and hit rate
arc_summary | head -40 - Live ARC stats
arcstat 1 - Cap ARC at 8 GB now
echo $((8 * 1024**3)) > /sys/module/zfs/parameters/zfs_arc_max - Cap ARC at 8 GB across reboots
echo "options zfs zfs_arc_max=8589934592" > /etc/modprobe.d/zfs.conf && update-initramfs -u -k all
Windows: files and storage
- Mirror a folder with permissions, logged (/MIR deletes extras; add /L to preview)
robocopy <src> <dst> /MIR /COPY:DATS /DCOPY:DAT /MT:16 /R:1 /W:1 /LOG:C:\Temp\robocopy.log - Largest files on a drive
Get-ChildItem <drive>:\ -Recurse -File -ErrorAction SilentlyContinue | Sort-Object Length -Descending | Select-Object -First 20 FullName, @{n='MB'; e={[int]($_.Length / 1MB)}} - NTFS permissions
icacls <path> - Access denied even as admin: take ownership, reset ACLs to inherited
takeown /F <path> /R /D Y; icacls <path> /reset /T /C - New disk shows Offline (SAN policy): bring it online and writable
Set-Disk -Number <n> -IsOffline $false; Set-Disk -Number <n> -IsReadOnly $false - Grew a VM disk: rescan, then extend the partition to the end
Update-HostStorageCache; Resize-Partition -DriveLetter <letter> -Size (Get-PartitionSupportedSize -DriveLetter <letter>).SizeMax - Backup fails: VSS writers in a failed state
vssadmin list writers - Shadow copy storage per volume
vssadmin list shadowstorage - File server: who has a file open
Get-SmbOpenFile | Where-Object Path -like '*<name>*' | Select-Object ClientComputerName, ClientUserName, Path, FileId - Close that handle
Close-SmbOpenFile -FileId <file-id> -Force - Share permissions (NTFS permissions apply on top)
Get-SmbShareAccess -Name <share>
Network
Interfaces and routes
- Addresses, one line per interface
ip -br a - Which route and source IP a destination takes
ip route get <ip> - Policy routing (Tailscale, VPNs, multi-WAN add rules)
ip rule && ip route show table all - ARP / neighbour table
ip neigh - Add an address until reboot
ip addr add <ip>/<prefix> dev <iface> - RX/TX errors and drops on an interface
ip -s link show <iface> - Link speed and driver
ethtool <iface> && ethtool -i <iface> - NIC counters: CRC errors point at cable or optic
ethtool -S <iface> | grep -iE 'err|drop|crc' - Bond state and active slave
cat /proc/net/bonding/<bond> - Bridge members
bridge link - VLANs on a VLAN-aware bridge
bridge vlan show - Someone else has this IP
arping -D -I <iface> -c 3 <ip> - Reverse-path filter dropping asymmetric traffic
sysctl net.ipv4.conf.all.rp_filter net.ipv4.conf.<iface>.rp_filter - Apply /etc/network/interfaces (Proxmox, ifupdown2)
ifreload -a - NetworkManager: static IPv4 on a connection
nmcli con mod <connection> ipv4.method manual ipv4.addresses <ip>/<prefix> ipv4.gateway <gateway> && nmcli con up <connection>
Ports and connections
- Listening sockets with processes
ss -tulpn - Socket totals
ss -s - Established connections on a port
ss -tnp state established '( sport = :<port> or dport = :<port> )' - RTT, retransmits and window per connection
ss -ti dst <ip> - Is a remote port open
nc -zv <host> <port> - Talk to one backend, bypassing DNS and load balancer
curl -v --resolve <host>:443:<ip> https://<host>/ - HTTP status and timings
curl -o /dev/null -s -w '%{http_code} dns=%{time_namelookup}s connect=%{time_connect}s tls=%{time_appconnect}s total=%{time_total}s\n' <url> - Certificate a server presents: subject, SANs, dates
openssl s_client -connect <host>:443 -servername <host> </dev/null 2>/dev/null | openssl x509 -noout -subject -ext subjectAltName -dates - Expiry of a certificate file
openssl x509 -in <cert>.pem -noout -enddate
DNS
- Just the answer
dig +short <name> - Ask a specific resolver
dig @<server> <name> A - What the system resolver returns (/etc/hosts, nsswitch)
getent hosts <name> - Follow delegation from the root
dig +trace <name> - Reverse lookup
dig -x <ip> - systemd-resolved state per link
resolvectl status - Flush the local cache
resolvectl flush-caches
Path and packets
- Loss and latency per hop
mtr -rwc 50 <host> - Largest packet that fits: 1472 for 1500 MTU, 1252 for 1280
ping -M do -s 1472 <host> - Watch traffic on a port
tcpdump -ni <iface> port <port> - Capture on every interface, bridges included
tcpdump -ni any host <ip> - Capture a host to a file for Wireshark
tcpdump -ni <iface> -w <file>.pcap host <ip> - Throughput test: server
iperf3 -s - Throughput test: client, 4 streams
iperf3 -c <server> -P 4 - TCP retransmits and drops, system-wide
nstat -az | grep -iE 'retrans|drop' - Bandwidth per connection
iftop -i <iface>
Firewall and NAT
- nftables ruleset
nft list ruleset - iptables with counters
iptables -L -n -v --line-numbers - NAT rules (Docker and Kubernetes write here)
iptables -t nat -L -n -v - Tracked connections to a host
conntrack -L -d <ip> - Drop tracked state after changing rules
conntrack -D -d <ip> - ufw status
ufw status verbose - ufw: SSH from one subnet
ufw allow from <cidr> to any port 22 proto tcp - firewalld zone rules
firewall-cmd --list-all - firewalld: open a port
firewall-cmd --permanent --add-port=<port>/tcp && firewall-cmd --reload - Enable IPv4 forwarding now
sysctl -w net.ipv4.ip_forward=1 - IPv4 forwarding across reboots
echo 'net.ipv4.ip_forward=1' > /etc/sysctl.d/99-forward.conf && sysctl --system
Tailscale
- Peers and connection type
tailscale status - Direct or relayed through DERP
tailscale ping <node> - NAT type and DERP latency
tailscale netcheck - Advertise a subnet
tailscale set --advertise-routes=<cidr> - Accept subnets from other routers
tailscale set --accept-routes - Route through an exit node
tailscale set --exit-node=<node>
SSH
- New key pair
ssh-keygen -t ed25519 -C "<comment>" - Install a public key on a host
ssh-copy-id -i ~/.ssh/id_ed25519.pub <user>@<host> - Key auth refused: fix permissions
chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys - Kill a frozen session (press Enter first)
~. - Verbose handshake
ssh -vvv <user>@<host> - Old switch, iDRAC or iLO rejects the key algorithm
ssh -o HostKeyAlgorithms=+ssh-rsa -o PubkeyAcceptedAlgorithms=+ssh-rsa <host> - Forget a changed host key
ssh-keygen -R <host> - Trust a host key non-interactively
ssh-keyscan -H <host> >> ~/.ssh/known_hosts - Fingerprint of a server key
ssh-keygen -lf /etc/ssh/ssh_host_ed25519_key.pub - Validate sshd_config before restarting
sshd -t - Effective sshd setting for a given user
sshd -T -C user=<user> | grep -i <option>
SSH tunnels
- Reach a remote-only port locally
ssh -N -L 8080:localhost:<remote-port> <host> - Reach a web UI behind a bastion
ssh -N -L 8443:<target>:443 <bastion> - Expose a local port on the remote
ssh -N -R 9000:localhost:<local-port> <host> - SOCKS proxy through a host
ssh -N -D 1080 <host> - Hop through a bastion
ssh -J <bastion> <host>
Copy and transfer
- Mirror a directory, preserving everything
rsync -aHAX --info=progress2 --delete <src>/ <dst>/ - Preview what rsync would change
rsync -aHAXn --delete --itemize-changes <src>/ <dst>/ - Verify a copy by checksum: list files that differ
rsync -rcn --out-format='%n' <src>/ <dst>/ - Push over SSH, compressed
rsync -az --info=progress2 <src>/ <user>@<host>:<dst>/ - Resumable, throttled copy over SSH
rsync -aHAX --partial --bwlimit=50M --info=progress2 <src>/ <user>@<host>:<dst>/ - Stream a directory over SSH
tar -cf - <dir> | ssh <host> 'tar -xf - -C <dst>' - Serve the current directory over HTTP
python3 -m http.server 8000
Windows: network
- Addresses, gateway and DNS per interface
Get-NetIPConfiguration - Is a port reachable
Test-NetConnection <host> -Port <port> - Trace the route
Test-NetConnection <host> -TraceRoute - Resolve against a specific DNS server
Resolve-DnsName <name> -Server <server> - Flush the DNS client cache
Clear-DnsClientCache - Listening ports with their process
Get-NetTCPConnection -State Listen | Select-Object LocalAddress, LocalPort, @{n='Process'; e={(Get-Process -Id $_.OwningProcess).ProcessName}} | Sort-Object LocalPort - Network marked Public blocks sharing and remoting: make it Private
Set-NetConnectionProfile -InterfaceAlias <interface> -NetworkCategory Private - Firewall state per profile
Get-NetFirewallProfile | Select-Object Name, Enabled, DefaultInboundAction - Allow an inbound port
New-NetFirewallRule -DisplayName "<name>" -Direction Inbound -Protocol TCP -LocalPort <port> -Action Allow - Capture full packets with the built-in tool
pktmon start --capture --pkt-size 0 --file-name <file>.etl - Stop, and convert the capture for Wireshark
pktmon stop; pktmon etl2pcap <file>.etl --out <file>.pcapng - Time source and last sync
w32tm /query /status - Clock offset against a domain controller
w32tm /stripchart /computer:<dc> /samples:5 /dataonly - Force a time resync
w32tm /resync /force
Windows: remote management
- Is WinRM answering
Test-WSMan <host> - Run a command on several servers
Invoke-Command -ComputerName <host-a>, <host-b> -ScriptBlock { <command> } - Interactive remote session
Enter-PSSession -ComputerName <host> - Who is logged on (RDP sessions)
quser /server:<host> - Log off a stuck session
logoff <session-id> /server:<host> - Enable RDP and its firewall rule
Set-ItemProperty 'HKLM:\System\CurrentControlSet\Control\Terminal Server' -Name fDenyTSConnections -Value 0; Enable-NetFirewallRule -DisplayGroup 'Remote Desktop' - Installed software (not Win32_Product, which triggers MSI repairs)
Get-ItemProperty HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\*, HKLM:\Software\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\* | Where-Object DisplayName | Select-Object DisplayName, DisplayVersion | Sort-Object DisplayName - Installed roles and features
Get-WindowsFeature | Where-Object Installed
Virtualization
Proxmox: VMs
- List VMs
qm list - Clean shutdown
qm shutdown <vmid> - Hard stop
qm stop <vmid> - Stop a VM that holds a lock
qm stop <vmid> --skiplock - QEMU process ignoring stop: kill it
kill -9 "$(cat /var/run/qemu-server/<vmid>.pid)" - Clear a stale lock
qm unlock <vmid> - Show config
qm config <vmid> - Full KVM command line a VM starts with
qm showcmd <vmid> --pretty - Serial console
qm terminal <vmid> - Grow a disk (then rescan it inside the guest)
qm disk resize <vmid> scsi0 +10G - Move a disk to another storage, live
qm disk move <vmid> scsi0 <storage> --delete 1 - Import a cloud image as a disk
qm disk import <vmid> <image>.qcow2 <storage> - Import an OVF export
qm importovf <vmid> <file>.ovf <storage> - Pick up orphaned disk images on storages
qm disk rescan --vmid <vmid> - Snapshot
qm snapshot <vmid> <name> - Roll back to a snapshot
qm rollback <vmid> <name> - Full clone of a template
qm clone <template-id> <new-id> --name <name> --full - Live migrate
qm migrate <vmid> <node> --online - IPs via guest agent
qm guest cmd <vmid> network-get-interfaces - Mount a stopped VM’s partition from a ZFS zvol
mount /dev/zvol/<pool>/vm-<vmid>-disk-<n>-part<p> /mnt
Proxmox: containers
- List containers
pct list - Shell inside
pct enter <ctid> - Run one command
pct exec <ctid> -- <command> - Grow the root disk
pct resize <ctid> rootfs +5G - Bind-mount a host directory
pct set <ctid> -mp0 <host-path>,mp=<container-path> - Unprivileged bind mount: host UID = 100000 + container UID
chown -R 100000:100000 <host-path> - Copy a file in
pct push <ctid> <file> <container-path> - Mount a container’s rootfs on the host (rescue)
pct mount <ctid> - Check a container’s filesystem
pct fsck <ctid> - Clear a stale lock
pct unlock <ctid>
Proxmox: host, storage and backup
- Versions of every PVE package
pveversion -v - Core services
systemctl status pveproxy pvedaemon pve-cluster - Web UI unreachable: restart its services
systemctl restart pveproxy pvedaemon - Cluster quorum
pvecm status - Lost quorum, /etc/pve read-only (last resort)
pvecm expected 1 - Regenerate node certificates
pvecm updatecerts --force - ESPs in sync on a ZFS or UEFI root
proxmox-boot-tool status - Upgrade (dist-upgrade; plain apt upgrade can break PVE)
apt update && apt dist-upgrade - Storage pools and usage
pvesm status - What is on a storage
pvesm list <storage> - Back up now
vzdump <vmid> --storage <storage> --mode snapshot --compress zstd - Restore a VM
qmrestore <backup>.vma.zst <new-id> --storage <storage> - Restore a container
pct restore <new-id> <backup>.tar.zst --storage <storage>
KVM: passthrough and libvirt
- CPU virtualization flags present
grep -Ec '(vmx|svm)' /proc/cpuinfo - IOMMU enabled
dmesg | grep -e DMAR -e IOMMU - Devices per IOMMU group
for d in /sys/kernel/iommu_groups/*/devices/*; do g=${d#*/iommu_groups/}; printf 'group %s\t' "${g%%/*}"; lspci -nns "${d##*/}"; done - Driver bound to a device (vfio-pci or not)
lspci -nnk -s <bus:dev.fn> - Nested virtualization on (Intel)
cat /sys/module/kvm_intel/parameters/nested - libvirt domains
virsh list --all - libvirt: guest IPs
virsh domifaddr <domain> - Disks attached to a domain
virsh domblklist <domain> - Image format and size
qemu-img info <disk> - Convert VMDK to qcow2
qemu-img convert -p -f vmdk -O qcow2 <in>.vmdk <out>.qcow2
Hyper-V
- VMs with state, uptime and memory
Get-VM | Select-Object Name, State, Uptime, CPUUsage, MemoryAssigned - Force a VM off
Stop-VM -Name <vm> -TurnOff - VM stuck Stopping: kill its worker process
Get-CimInstance Win32_Process -Filter "Name='vmwp.exe'" | Where-Object CommandLine -match (Get-VM <vm>).VMId | ForEach-Object { Stop-Process -Id $_.ProcessId -Force } - Checkpoints of a VM
Get-VMCheckpoint -VMName <vm> - Delete all checkpoints, merging them into the disk
Get-VMCheckpoint -VMName <vm> | Remove-VMCheckpoint - Grow a VHDX (then extend the partition in the guest)
Resize-VHD -Path <path>.vhdx -SizeBytes 200GB - Virtual switches and the adapters behind them
Get-VMSwitch | Select-Object Name, SwitchType, NetAdapterInterfaceDescription
ESXi: host and logs
- Version and build
vmware -vl - Enable and start SSH from the ESXi shell
vim-cmd hostsvc/enable_ssh && vim-cmd hostsvc/start_ssh - Enter maintenance mode
esxcli system maintenanceMode set --enable true - Leave maintenance mode
esxcli system maintenanceMode set --enable false - Reboot (host must be in maintenance mode)
esxcli system shutdown reboot --reason "<reason>" - Host client or vCenter lost the host: restart management agents
/etc/init.d/hostd restart && /etc/init.d/vpxa restart - Restart every management service (heavier)
services.sh restart - Vendor, model and serial
esxcli hardware platform get - NTP servers and state
esxcli system ntp get - Back up the host configuration (prints a download URL)
vim-cmd hostsvc/firmware/sync_config && vim-cmd hostsvc/firmware/backup_config - Support bundle for VMware / Broadcom
vm-support - Storage, network and driver events
tail -f /var/log/vmkernel.log - Host agent: VM operations, API calls
tail -f /var/log/hostd.log - Hardware and connectivity observations
tail -f /var/log/vobd.log - Why a VM failed to power on
tail -100 /vmfs/volumes/<datastore>/<vm>/vmware.log - Send logs to a remote syslog
esxcli system syslog config set --loghost='udp://<ip>:514' && esxcli system syslog reload && esxcli network firewall ruleset set -r syslog -e true
ESXi: VMs and snapshots
- Registered VMs with their IDs
vim-cmd vmsvc/getallvms - Power state
vim-cmd vmsvc/power.getstate <vmid> - Power on
vim-cmd vmsvc/power.on <vmid> - Guest shutdown (needs VMware Tools)
vim-cmd vmsvc/power.shutdown <vmid> - Hard power off
vim-cmd vmsvc/power.off <vmid> - VM will not power off: find its world ID
esxcli vm process list - Then kill it: soft, then hard, then force
esxcli vm process kill --type=soft --world-id=<world-id> - Guest IP from VMware Tools
vim-cmd vmsvc/get.guest <vmid> | grep -m1 ipAddress - Register a VM from its .vmx
vim-cmd solo/registervm /vmfs/volumes/<datastore>/<vm>/<vm>.vmx - Unregister (files stay on the datastore)
vim-cmd vmsvc/unregister <vmid> - Reload a .vmx after editing it by hand
vim-cmd vmsvc/reload <vmid> - Stuck on a question (“moved or copied?”): list it
vim-cmd vmsvc/message <vmid> - Answer it
vim-cmd vmsvc/message <vmid> <message-id> <choice> - Snapshot tree
vim-cmd vmsvc/get.snapshotinfo <vmid> - Create a snapshot without memory
vim-cmd vmsvc/snapshot.create <vmid> <name> <description> 0 0 - Delete all snapshots (consolidates into the base disk)
vim-cmd vmsvc/snapshot.removeall <vmid> - Delta disks left behind
find /vmfs/volumes/<datastore>/<vm>/ -name '*-0000*.vmdk'
ESXi: storage and virtual disks
- Datastores with capacity and free space
esxcli storage filesystem list - See a new or grown LUN: rescan every adapter
esxcli storage core adapter rescan --all - Refresh VMFS volumes after the rescan
vmkfstools -V - Devices with their naa IDs
esxcli storage core device list - Paths per device and their state
esxcli storage core path list - Multipathing policy per device
esxcli storage nmp device list - SMART data for a local disk
esxcli storage core device smart get -d <naa-id> - Mount an NFS v3 datastore
esxcli storage nfs add -H <server> -s /<export> -v <datastore-name> - Copied or replicated LUN not mounting: VMFS snapshot volumes
esxcli storage vmfs snapshot list - Mount it keeping its signature
esxcli storage vmfs snapshot mount -l <volume-label> - Reclaim freed blocks on thin-provisioned storage
esxcli storage vmfs unmap -l <datastore> - Grow a VMDK to a new total size (VM off)
vmkfstools -X 100G /vmfs/volumes/<datastore>/<vm>/<vm>.vmdk - Clone a disk as thin
vmkfstools -i <source>.vmdk -d thin <dest>.vmdk - Return zeroed blocks of a thin disk (VM off)
vmkfstools -K <disk>.vmdk - Check a VMDK for consistency
vmkfstools -x check <disk>.vmdk - “File is locked”: which host holds the lock (MAC in the output)
vmkfstools -D /vmfs/volumes/<datastore>/<vm>/<file>
ESXi: network
- VMkernel interfaces with IPs
esxcli network ip interface ipv4 get - Physical NICs: link, speed, driver
esxcli network nic list - Driver and firmware of one NIC
esxcli network nic get -n <vmnic> - Standard vSwitches and uplinks
esxcli network vswitch standard list - Port groups and VLAN IDs
esxcli network vswitch standard portgroup list - Set the VLAN on a port group
esxcli network vswitch standard portgroup set -p "<portgroup>" -v <vlan-id> - Ping out a specific vmk, jumbo frames, no fragmenting
vmkping -I <vmk> -d -s 8972 <ip> - Routes and neighbour table
esxcli network ip route ipv4 list && esxcli network ip neighbor list - Which uplink and port a VM uses: find its world ID
esxcli network vm list - Then its ports, MAC and team uplink
esxcli network vm port list -w <world-id> - Capture on a vmk to a file
pktcap-uw --vmk <vmk> -o /tmp/<file>.pcap - Capture on a physical uplink
pktcap-uw --uplink <vmnic> -o /tmp/<file>.pcap - Management IP lost: set vmk0 from the shell
esxcli network ip interface ipv4 set -i vmk0 -t static -I <ip> -N <netmask> -g <gateway> - Firewall rulesets
esxcli network firewall ruleset list
ESXi: performance and patching
- Live stats: c CPU, m memory, d/u/v disk, n network
esxtop - CPU contention: watch %RDY (>5% per vCPU) and %CSTP
esxtop # then press c - Disk latency: DAVG is the array, KAVG the host
esxtop # then press u - Record 5 minutes for later analysis
esxtop -b -d 5 -n 60 > /tmp/esxtop.csv - Installed VIBs
esxcli software vib list - Image profiles inside an offline depot
esxcli software sources profile list -d /vmfs/volumes/<datastore>/<depot>.zip - Preview an update
esxcli software profile update -d /vmfs/volumes/<datastore>/<depot>.zip -p <profile> --dry-run - Apply it (maintenance mode, then reboot)
esxcli software profile update -d /vmfs/volumes/<datastore>/<depot>.zip -p <profile> - Install a driver or component VIB
esxcli software vib install -d /vmfs/volumes/<datastore>/<bundle>.zip - Allow community-supported drivers
esxcli software acceptance set --level=CommunitySupported
ESXi: PowerCLI
- Connect to vCenter or a host
Connect-VIServer -Server <server> - VMs with power state and size
Get-VM | Select-Object Name, PowerState, NumCpu, MemoryGB | Sort-Object Name - Snapshots older than a week
Get-VM | Get-Snapshot | Where-Object { $_.Created -lt (Get-Date).AddDays(-7) } | Select-Object VM, Name, Created, SizeGB - VMs whose disks need consolidation
Get-VM | Where-Object { $_.ExtensionData.Runtime.ConsolidationNeeded } | Select-Object Name - Start SSH on every host
Get-VMHost | Get-VMHostService | Where-Object Key -eq "TSM-SSH" | Start-VMHostService
ESXi to Proxmox
- Add the ESXi host as an import source on Proxmox
pvesm add esxi <storage-id> --server <esxi-host> --username root --password '<password>' --skip-cert-verification 1 - Before exporting: remove every snapshot
vim-cmd vmsvc/snapshot.removeall <vmid> - Import a copied VMDK into a Proxmox VM
qm disk import <vmid> <vm>.vmdk <storage> --format raw - Guest NIC renamed after the move (ens192 becomes ens18)
ip -br link
Containers
Docker
- Running, with status and ports
docker ps --format 'table {{.Names}}\t{{.Status}}\t{{.Ports}}' - Follow logs
docker logs -f --tail 100 <container> - Throwaway container
docker run --rm -it <image> sh - Why it exited
docker inspect -f '{{.State.ExitCode}} oom={{.State.OOMKilled}} {{.State.Error}}' <container> - Restart loops and other events, last 10 minutes
docker events --since 10m - Container IPs
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}} {{end}}' <container> - CPU and memory snapshot
docker stats --no-stream - Log file on disk (the one filling /var)
docker inspect -f '{{.LogPath}}' <container> - Writable layer size per container
docker ps -s - Files changed inside a container
docker diff <container> - Copy a file out
docker cp <container>:<path> <dest> - Change restart policy
docker update --restart unless-stopped <container> - Host PID of every container
docker ps -q | xargs docker inspect -f '{{.State.Pid}} {{.Name}}' - Run host tools inside a container’s network namespace
nsenter -t "$(docker inspect -f '{{.State.Pid}}' <container>)" -n ss -tlnp
Docker Compose
- Update images and recreate
docker compose pull && docker compose up -d - Rebuild and recreate
docker compose up -d --build - Recreate one service even if unchanged
docker compose up -d --force-recreate <service> - Follow one service
docker compose logs -f <service> - Final config after env files and merges
docker compose config - Every compose project on the host
docker compose ls - Tear down, volumes too (destroys data)
docker compose down -v
Docker: images and cleanup
- Disk used by images, containers, volumes, build cache
docker system df -v - Remove everything unused except volumes
docker system prune -a - Build cache (often the biggest)
docker builder prune - Unused images older than a week
docker image prune -a --filter "until=168h" - Remove unused anonymous volumes
docker volume prune - Multi-arch build and push
docker buildx build --platform linux/amd64,linux/arm64 -t <name>:<tag> --push . - Architectures and digest of a remote image
docker buildx imagetools inspect <image> - Layers and their sizes
docker history <image> - Export an image for an offline host
docker save <image> | gzip > <image>.tar.gz - Import it
docker load -i <image>.tar.gz
Docker: daemon, networks, volumes
- Networks and their members
docker network inspect <network> - Debug a container’s network with a full toolbox
docker run --rm -it --network container:<container> nicolaka/netshoot - Publish on localhost only (published ports bypass ufw)
docker run -d -p 127.0.0.1:<host-port>:<container-port> <image> - Back up a named volume
docker run --rm -v <volume>:/data -v "$PWD":/backup alpine tar -czf /backup/<volume>.tar.gz -C /data . - Cap container logs (/etc/docker/daemon.json)
{ "log-driver": "json-file", "log-opts": { "max-size": "10m", "max-file": "3" } } - Keep Docker networks off your LAN ranges (daemon.json)
{ "default-address-pools": [{ "base": "10.200.0.0/16", "size": 24 }] }
Kubernetes: inspect
- Switch cluster
kubectl config use-context <context> - Default namespace for this context
kubectl config set-context --current --namespace=<ns> - Field docs for any resource
kubectl explain <resource>.spec - Pods not running, cluster-wide
kubectl get pods -A --field-selector=status.phase!=Running - Why a pod is stuck
kubectl describe pod <pod> - Events, newest last
kubectl get events -A --sort-by=.metadata.creationTimestamp - Warnings only
kubectl get events -A --field-selector type=Warning --sort-by=.metadata.creationTimestamp - Events for one object
kubectl get events -n <ns> --field-selector involvedObject.name=<name> - Pods by restart count
kubectl get pods -A --sort-by='.status.containerStatuses[0].restartCount' - Why the last container died (OOMKilled, exit code)
kubectl get pod <pod> -o jsonpath='{.status.containerStatuses[*].lastState}' - Node usage
kubectl top nodes - Heaviest pods
kubectl top pods -A --sort-by=memory - Requests and limits against what a node has
kubectl describe node <node> | grep -A 10 'Allocated resources' - Service with no endpoints: selector matches nothing
kubectl get endpointslices -l kubernetes.io/service-name=<service> - Decode a secret key
kubectl get secret <name> -o jsonpath='{.data.<key>}' | base64 -d - Decode every key of a secret
kubectl get secret <name> -o json | jq '.data | map_values(@base64d)' - Every image running
kubectl get pods -A -o jsonpath='{range .items[*]}{.spec.containers[*].image}{"\n"}{end}' | sort -u - API server health, check by check
kubectl get --raw='/readyz?verbose'
Kubernetes: debug
- Follow a container’s logs
kubectl logs -f <pod> -c <container> - Logs from before the crash
kubectl logs --previous <pod> - Logs across a label
kubectl logs -l app=<app> --all-containers --prefix --since=1h - Shell inside
kubectl exec -it <pod> -- sh - Debug container in a distroless pod
kubectl debug -it <pod> --image=busybox --target=<container> - Shell on a node, host filesystem at /host
kubectl debug node/<node> -it --image=busybox - Forward a service locally
kubectl port-forward svc/<service> 8080:<port> - Cluster DNS works?
kubectl run dns-test --rm -it --image=busybox:1.36 --restart=Never -- nslookup kubernetes.default - Copy a file out of a pod
kubectl cp <ns>/<pod>:<path> <dest> - What a service account can do
kubectl auth can-i --list --as=system:serviceaccount:<ns>:<sa> - Containers on a node without the API
crictl ps -a
Kubernetes: workloads and nodes
- Restart pods of a deployment
kubectl rollout restart deploy/<name> - Wait for a rollout
kubectl rollout status deploy/<name> - Undo the last rollout
kubectl rollout undo deploy/<name> - Scale to zero
kubectl scale deploy/<name> --replicas=0 - See what apply would change
kubectl diff -f <file>.yaml - YAML skeleton without creating anything
kubectl create deploy <name> --image=<image> --dry-run=client -o yaml - Drain for maintenance
kubectl drain <node> --ignore-daemonsets --delete-emptydir-data - Back into service
kubectl uncordon <node> - Pods on one node
kubectl get pods -A -o wide --field-selector spec.nodeName=<node>
Kubernetes: stuck resources
- Namespace stuck Terminating: what is left in it
kubectl api-resources --verbs=list --namespaced -o name | xargs -n1 kubectl get -n <ns> --ignore-not-found --show-kind - Resource held by finalizers
kubectl patch <kind> <name> -n <ns> --type=merge -p '{"metadata":{"finalizers":null}}' - Pod stuck Terminating on a dead node
kubectl delete pod <pod> --grace-period=0 --force - Volume will not attach: stale attachments
kubectl get volumeattachment - Clear out evicted and failed pods
kubectl delete pods -A --field-selector=status.phase=Failed - kubeadm: certificate expiry
kubeadm certs check-expiration
Helm
- Add and refresh a repo
helm repo add <repo> <url> && helm repo update - Chart’s default values
helm show values <repo>/<chart> - Install or upgrade
helm upgrade --install <release> <repo>/<chart> -n <ns> --create-namespace -f values.yaml - Render manifests locally
helm template <release> <repo>/<chart> -f values.yaml - Releases stuck pending or failed
helm list -A --pending --failed - Values a release was deployed with
helm get values <release> -n <ns> - Manifests a release actually applied
helm get manifest <release> -n <ns> - Revisions of a release
helm history <release> -n <ns> - Roll back (also unsticks pending-upgrade)
helm rollback <release> <revision> -n <ns>
Flux
- Controllers healthy
flux check - Everything Flux manages
flux get all -A - Only what is failing
flux get all -A --status-selector ready=false - Pull git and apply now
flux reconcile kustomization flux-system --with-source - Reconcile one Helm release
flux reconcile helmrelease <name> -n <ns> --with-source - Local changes against the cluster, before pushing
flux diff kustomization <name> --path <path> - Pause GitOps for manual work
flux suspend kustomization <name> - Resume it
flux resume kustomization <name> - Controller errors
flux logs -A --level=error
Talos
- Cluster health from one node
talosctl -n <ip> health - Live node dashboard
talosctl -n <ip> dashboard - Services and their state
talosctl -n <ip> services - Kubelet logs
talosctl -n <ip> logs kubelet - Kernel log
talosctl -n <ip> dmesg - Pod containers on a node
talosctl -n <ip> containers -k - Disks Talos sees
talosctl -n <ip> get disks - etcd members
talosctl -n <ip> etcd members - etcd health and leader
talosctl -n <ip> etcd status - Snapshot etcd
talosctl -n <ip> etcd snapshot <file>.snapshot - Apply a changed machine config
talosctl -n <ip> apply-config -f <node>.yaml - Patch the machine config
talosctl -n <ip> patch mc --patch @<patch>.yaml - Upgrade Talos on a node
talosctl -n <ip> upgrade --image <installer-image>:<version> - Preview a Kubernetes upgrade
talosctl -n <ip> upgrade-k8s --to <version> --dry-run - Upgrade Kubernetes
talosctl -n <ip> upgrade-k8s --to <version> - Fetch kubeconfig
talosctl -n <ip> kubeconfig