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 ──กรอง──► pacman1. เน็ต + 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 resolution | DNS |
| Network is unreachable | ไม่มี IP/route |
| 100% packet loss | gateway/firewall |
SSH เข้า IP เดิมของตอนบูต ISO → เตือน REMOTE HOST IDENTIFICATION HAS CHANGED = คาดไว้ (host key ใหม่) แก้ด้วย ssh-keygen -R <IP> / ปกติคือสัญญาณ MITM
2. SSH key ต่อหน้าที่ + ต่อเครื่อง
| หน้าที่ | ไฟล์ | alias |
|---|---|---|
| GitHub | id_ed25519_personal | github-personal |
| เครื่องในบ้าน | id_ed25519_lan | p15, … |
| DigitalOcean | id_ed25519_do | knupan, … |
- แต่ละเครื่องสร้าง 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 ~/dotfilesIdentitiesOnly 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 zshtree 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.service6. ค่าเฉพาะเครื่อง: local.conf
kitty.conf (git, ทุกเครื่อง) ... globinclude local.conf ← บรรทัดสุดท้าย
local.conf (ไม่เข้า git) symbol_map U+0E00-U+0E7F Tlwg Mono
.gitignore **/local.conftemplate กลาง + ค่าเฉพาะอุปกรณ์ (แบบ 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
EOFHost *อยู่ท้ายสุด (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 | ตรวจว่าหลักฐานมาจากเครื่องไหน ก่อนสรุป |
คำถามชวนคิด
- ทำไม allowlist (
grep -Fxf) จึงปลอดภัยกว่าการเพิ่มชื่อใน blocklist ไปเรื่อยๆ ยกตัวอย่างการใช้หลักเดียวกันในงาน firewall ของคุณ - ถ้าลูกทีมเผลอ stow ก่อนสร้าง
~/.configไปแล้ว คุณจะตรวจอย่างไรว่าเกิด folding และจะแก้โดยไม่ทำ config ในเครื่องหายได้อย่างไร - ssh-agent ที่ถือ key 4 ชั่วโมงเพิ่มความเสี่ยงแบบไหน และในสถานการณ์ไหนคุณจะลดเวลาลงหรือปิด agent ทิ้ง