コマンド集 / 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 はキャッシュを迂回する。diggetaddrinfogetent)の食い違いが決め手になる。

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 は最小。フルパス必須。