Skip to content
dotfiles, รายการแพ็กเกจ, SSH key + agent

dotfiles, รายการแพ็กเกจ, SSH key + agent

เอาของจากเครื่องหลักมาโดยไม่พัง: กรองแพ็กเกจ, Stow อย่างปลอดภัย, แยกค่าเฉพาะเครื่อง
Bring the main machine’s setup over safely

ใช้ทำอะไร (Purpose)

GitHub (dotfiles) ──clone──► ~/dotfiles ──stow──► symlink ใน ~ ──► i3, kitty, zsh ...
                              packages-pacman.txt ──กรอง──► pacman

1. เน็ต + SSH (บูตครั้งแรก ที่หน้าเครื่อง)

nmcli device status
ping -c 3 archlinux.org          # ใช้ชื่อโดเมน = ทดสอบ DNS ไปด้วย
sudo pacman -S openssh           # sudo ครั้งแรก = ทดสอบไฟล์ 10-wheel
sudo systemctl enable --now sshd
sudo pacman -S kitty-terminfo    # SSH จาก kitty → ไม่งั้น nvim/less เพี้ยน
error ของ pingชั้นที่พัง
Temporary failure in name resolutionDNS
Network is unreachableไม่มี IP/route
100% packet lossgateway/firewall

SSH เข้า IP เดิมของตอนบูต ISO → เตือน REMOTE HOST IDENTIFICATION HAS CHANGED = คาดไว้ (host key ใหม่) แก้ด้วย ssh-keygen -R <IP> / ปกติคือสัญญาณ MITM

2. SSH key ต่อหน้าที่ + ต่อเครื่อง

หน้าที่ไฟล์alias
GitHubid_ed25519_personalgithub-personal
เครื่องในบ้านid_ed25519_lanp15, …
DigitalOceanid_ed25519_doknupan, …
  • แต่ละเครื่องสร้าง key เอง ห้าม copy private key → เครื่องหาย ถอดเฉพาะ key นั้น
  • GitHub ไม่ให้ใช้ key เดียวกับสองบัญชี → รวมบัญชีฝึกเข้าบัญชีหลัก (Transfer ownership, ประวัติมาครบ)
ssh-keygen -t ed25519 -C "<user>@p15" -f ~/.ssh/id_ed25519_personal
cat > ~/.ssh/config <<'EOF'
Host github-personal
    HostName github.com
    User git
    IdentityFile ~/.ssh/id_ed25519_personal
    IdentitiesOnly yes
EOF
ssh -T git@github-personal       # Hi <github-user>!
git clone git@github-personal:<github-user>/dotfiles.git ~/dotfiles

IdentitiesOnly yes = ไม่ยื่น key ทั้งพวงให้ server (กันเปิดเผยว่ามี key อะไร)

3. กรองรายการแพ็กเกจ (repo เปลี่ยนตั้งแต่ T440p)

grep -Ein 'nvidia|xf86-video|vulkan|ucode|lightdm|sddm|gdm|pulseaudio|pipewire|xfce' ~/dotfiles/packages-pacman.txt
ตัดเหตุผล
lib32-nvidia-utilsอยู่ใน multilib ที่ไม่ได้เปิด → target not found ยกเลิกทั้งรายการ
pulseaudioต้นเหตุปัญหาบน T440p (ชน PipeWire)
xf86-video-intelไดรเวอร์เก่า ไม่แนะนำกับ Intel รุ่นใหม่ ขัดกับ prime-run

allowlist แทน blocklist (ตัดของ AUR ที่หลุดมาในรายการอัตโนมัติ):

{ grep -vxE 'lib32-nvidia-utils|pulseaudio|xf86-video-intel' ~/dotfiles/packages-pacman.txt | grep -Fxf <(pacman -Slq); printf '%s\n' pipewire pipewire-pulse pipewire-alsa pipewire-jack wireplumber ollama-cuda; } | sudo pacman -S --needed -
  • grep -Fxf <(pacman -Slq) = เก็บเฉพาะชื่อที่มีจริงใน repo (intersection ของสองเซต)
  • เติมชุด PipeWire ใน รอบเดียวกัน → pacman เลือก pipewire-jack แทน jack2 ตั้งแต่ต้น
  • ตรวจบรรทัด Packages (N) ก่อนกด Y: ไม่มี jack2, มี ollama-cuda

4. Stow อย่างปลอดภัย

mkdir -p ~/.config ~/.local/bin              # กัน tree folding (สำคัญมาก)
cd ~/dotfiles && stow -t ~ -nv git i3 i3status-rust kitty nvim x11 zsh
stow -t ~ -v git i3 i3status-rust kitty nvim x11 zsh

tree folding: ถ้า ~/.config ยังไม่มี Stow จะ link ทั้งโฟลเดอร์ เข้า repo → ทุกโปรแกรมเขียน config ลง repo (เหมือน route summarization ที่รวบกว้างเกิน)

ป้องกันไฟล์ชน (ชนะ T440p 4 ขั้น):

  • ไม่รัน git config --global ก่อน stow (ไม่งั้นมี .gitconfig จริงชน)
  • เมนู zsh ครั้งแรกกด q ไม่ใช่ 0 (0 สร้าง .zshrc เปล่า)

5. โปรแกรมที่ config เรียกแต่ไม่มี

for c in setxkbmap dex nm-applet xss-lock i3lock autorandr pactl tmux kitty dmenu_run i3status-rs picom; do command -v "$c" >/dev/null || echo "MISSING: $c"; done
sudo pacman -S --needed dex xss-lock picom
sudo systemctl enable ly@tty2.service

6. ค่าเฉพาะเครื่อง: local.conf

kitty.conf (git, ทุกเครื่อง)  ... globinclude local.conf   ← บรรทัดสุดท้าย
local.conf (ไม่เข้า git)      symbol_map U+0E00-U+0E7F Tlwg Mono
.gitignore                    **/local.conf

template กลาง + ค่าเฉพาะอุปกรณ์ (แบบ config management ใน network)

  • ความต่าง ถาวร ระหว่างเครื่อง → local.conf
  • การเปลี่ยน ชั่วคราว/ทดลอง → branch

7. ssh-agent

systemctl --user cat ssh-agent.service           # socket activation (แบบ inetd)
systemctl --user enable --now ssh-agent.socket
ls -l $XDG_RUNTIME_DIR/ssh-agent.socket          # srw-rw-rw- แต่...
ls -ld $XDG_RUNTIME_DIR                          # drwx------ = ปลอดภัย (ดูทั้ง path)
cat >> ~/.ssh/config <<'EOF'

Host *
    IdentityAgent ${XDG_RUNTIME_DIR}/ssh-agent.socket
    AddKeysToAgent 4h
EOF
  • Host * อยู่ท้ายสุด (ssh ใช้ค่าแรกที่เจอ = ACL เฉพาะก่อน default)
  • 4h = session timeout ของ key

ปัญหาที่เคยเจอ & สิ่งที่ทายผิด (Troubleshooting)

เหตุการณ์บทเรียน
target not found 6 ตัว (yay, ttf-sarabun, …)รายการสร้างด้วย -Qqe → ควรใช้ -Qqen แยก AUR
libfprint-2-tod1-broadcomของเครื่อง Dell เดิม P15 ใช้ Synaptics
ตัด ttf-sarabun แล้วลืมถามว่าทำหน้าที่อะไรไม่มีฟอนต์ไทย → ตัดแพ็กเกจต้องรู้หน้าที่ของมัน
ทาย socket rw------- ได้ rw-rw-rw-สิทธิ์ต้องดูทั้ง path (defense in depth)
config เรียก pavucontrol/dex/picom แต่รายการไม่มีตรวจ command -v ทุกโปรแกรมที่ config เรียก
วิเคราะห์ kitty.conf ของ MSI แทนของ P15ตรวจว่าหลักฐานมาจากเครื่องไหน ก่อนสรุป

คำถามชวนคิด

  1. ทำไม allowlist (grep -Fxf) จึงปลอดภัยกว่าการเพิ่มชื่อใน blocklist ไปเรื่อยๆ ยกตัวอย่างการใช้หลักเดียวกันในงาน firewall ของคุณ
  2. ถ้าลูกทีมเผลอ stow ก่อนสร้าง ~/.config ไปแล้ว คุณจะตรวจอย่างไรว่าเกิด folding และจะแก้โดยไม่ทำ config ในเครื่องหายได้อย่างไร
  3. ssh-agent ที่ถือ key 4 ชั่วโมงเพิ่มความเสี่ยงแบบไหน และในสถานการณ์ไหนคุณจะลดเวลาลงหรือปิด agent ทิ้ง