コマンド集 / Linux
Linux サーバー運用コマンド集
Proxmox 上の Ubuntu/Debian(LXC と cloud image の VM)で systemd・journalctl・apt・ネットワーク・ディスク・SSH・cloud-init・時刻同期を扱うコマンドを引ける。
Proxmox 上の Debian 13 非特権 LXC と、Ubuntu 24.04 / Debian 13 の cloud image から払い出した VM 向け。到達は SSH 鍵(1Password の SSH エージェント)が主で、LXC はホストから pct exec で入る。
systemd と journalctl#
サービスの状態#
「Running」でも動いているとは限らない。状態と、そのサービス自身の応答を分けて見る。
systemctl status <unit>
systemctl is-active dns cloudflared
systemctl list-units --failed
systemctl list-timers --all
⚠️ 自動更新などの timer はコンテナの中にある。ホスト側で list-timers を見ても出ない。
ログを読む#
journalctl -u <unit> --no-pager -n 50
journalctl -u <unit> -f
journalctl -t <syslog識別子> --since "1 hour ago"
journalctl -p err -b
journalctl --since today | grep -c "<同じ形のエラー>"
⚠️ 件数だけ数えていると見えない。同じ形にまとめて数えると、2 番目に多いエラーが初めて見えた実例あり。
有効化・再読込#
ユニットファイルを書き換えたら daemon-reload。
systemctl daemon-reload
systemctl enable --now <unit>
systemctl restart <unit>
⚠️ LXC の sshd は socket 起動なので reload では落ちる(Cannot bind any address)。CT では restart。
apt の更新#
更新の流れ#
apt update
apt list --upgradable
apt full-upgrade -y
apt autoremove -y
[ -f /var/run/reboot-required ] && cat /var/run/reboot-required
⚠️ 冗長ペア(DNS 2 台など)は同時に更新しない。片方ずつ、更新後にサービスの応答を確かめてから次へ。
再起動が要るプロセス#
needrestart -b
ネットワークを見る#
アドレス・リンク・経路#
ip -br addr
ip -br link show master vmbr0
ip route
ip route get <宛先IP>
⚠️ USB NIC は ignore_routes_with_linkdown=1 が無いと、リンクが死んでも default 経路が残り続けてフェイルオーバーしない。
待ち受けと接続#
ホスト単位ではなくポート単位で見る。同じホストの別ポートが通るなら経路の問題ではない。
ss -tlnp
ss -ulnp
ss -tunap | grep ESTAB
⚠️ 落とされたポートは RST が返らず沈黙する。長いタイムアウトのツールでまとめて測ると、呼び出し側(qm guest exec など)が先にタイムアウトする。
名前解決#
dig はキャッシュを迂回する。dig と getaddrinfo(getent)の食い違いが決め手になる。
resolvectl status
cat /etc/resolv.conf
dig @<DNSサーバーのIP> <名前> +short
getent hosts <名前>
⚠️ 1 つの名前だけ失敗して同じゾーンの兄弟が通るなら、サーバーでも経路でもなくクライアントのキャッシュ。
到達確認#
ping -c 3 <宛先IP>
curl -sS -o /dev/null -w '%{http_code}\n' https://<名前>/
timeout 3 bash -c 'cat < /dev/null > /dev/tcp/<宛先IP>/<ポート>' && echo open
NIC の設定(ethtool)#
WoL の受信、EEE(省電力イーサネット)によるリンクフラップ対策。
ethtool nic0 | grep Wake-on
ethtool -s nic0 wol g
ethtool --set-eee nic0 eee off
⚠️ 冗長構成では「片系だけ設定された状態」が特に見つけにくい。Wake-on は両ノードで確認する。
interfaces の再適用#
ifreload -a
⚠️ 過去に事故がある。リモートから打つなら二次経路を確保してから。IPv6 を sysctl で無効化すると ifreload が壊れた実績があるので v6 スタックは維持する。
ディスクと容量#
空きを見る#
df -h
du -xh --max-depth=1 / 2>/dev/null | sort -h | tail -15
lsblk
findmnt -t ext4,xfs
ジャーナルを縮める#
journalctl --disk-usage
journalctl --vacuum-size=200M
thin provisioning に空きを返す#
VM で discard を有効にしていれば、ゲスト側の fstrim でホストの thin pool に返る。
fstrim -av
⚠️ qemu-guest-agent が入っていないと PVE 側からの fstrim も、IP の表示も、正常な停止も効かない。cloud image には入っていないので雛形の側で仕込む。
メモリの見方#
free の used/free だけで判断しない。新しい負荷に使える量は MemAvailable だけ。
grep -E 'MemTotal|MemAvailable|AnonPages' /proc/meminfo
SSH#
鍵の確認#
エージェントに鍵が載っているか、置いてある公開鍵が何かを指紋で見る。
ssh-add -l
ssh-keygen -lf ~/.ssh/id_ed25519.pub
ssh-keygen -lf /root/.ssh/authorized_keys
⚠️ 鍵を消す前に使い手を全部数える。題名は用途を表さない。指紋で grep -r してから消す。
公開鍵を置く#
mkdir -p /root/.ssh && chmod 700 /root/.ssh
cat >> /root/.ssh/authorized_keys <<'KEY'
ssh-ed25519 AAAA... <鍵の名前>
KEY
chmod 600 /root/.ssh/authorized_keys
設定を検証してから反映する#
壊れた設定で reload すると、その場で締め出される(鍵の道も一緒に死ぬ)。
mkdir -p /run/sshd
sshd -t
sshd -T | grep -iE 'passwordauthentication|permitrootlogin|trustedusercakeys'
systemctl restart ssh
⚠️ sshd -t / sshd -T は /run/sshd が無いと fatal で落ちる。コンテナには無いことがある。「設定ファイルを置けた」=「効いた」ではないので sshd -T に sshd 自身に言わせる。
ハードニング(到達が盤石になってから)#
sshd_config.d/ に置き、フォールバック(コンソール・二次経路)を先に確保する。
PasswordAuthentication no
PermitRootLogin prohibit-password
証明書認証(CA を信頼する)#
Cloudflare Access などの SSH CA を受け入れる形。鍵を配らずに済む。
TrustedUserCAKeys /etc/ssh/<ca>.pub
⚠️ 信頼する相手を 1 つ増やす。1 台ずつ、理由を持って足す。鍵での SSH は残す。
1Password SSH エージェント(Windows 端末側)#
標準の ssh-agent と同じ名前付きパイプを取り合うので、Microsoft 側を止める。
Stop-Service ssh-agent
Set-Service ssh-agent -StartupType Disabled
⚠️ 止めた後、1Password を完全に終了して起動し直す。起動時にしかパイプを取りに行かない。
cloud-init#
状態とログ#
cloud-init status --long
cat /var/log/cloud-init-output.log
systemctl status qemu-guest-agent
⚠️ 払い出し直後に早く見すぎると「失敗」に見える。cloud-init が終わるまで待つ。
クローン前のリセット#
雛形にする VM の中で 1 度きり。machine-id を空にしないと全クローンが同じ ID を持つ。
cloud-init clean --logs
truncate -s 0 /etc/machine-id
rm -f /var/lib/dbus/machine-id && ln -s /etc/machine-id /var/lib/dbus/machine-id
取り込む image のチェックサム#
雛形にする前に配布元の一覧と突き合わせる。書式が配布元で違う。
sha256sum <image>.qcow2
⚠️ Debian は <hash> <ファイル名>、Rocky は SHA256 (<ファイル名>) = <hash>。片方だけ想定すると必ず不一致で止まる。
時刻同期#
状態#
Kerberos のクロックスキュー許容は 5 分。AD 参加機は特に。
timedatectl
timedatectl timesync-status
chronyc tracking
設定#
timedatectl set-timezone Asia/Tokyo
timedatectl set-ntp true
LXC 固有#
ホストから操作する#
pct exec <ctid> -- /usr/bin/systemctl is-active <unit>
pct push <ctid> <ローカルのファイル> <CT内のパス>
pct enter <ctid>
⚠️ pct exec の PATH は最小。フルパス必須。