คำสั่ง apt: ติดตั้ง อัปเดต และลบแพ็กเกจใน Ubuntu และ Debian
apt คือตัวจัดการแพ็กเกจของ Ubuntu และ Debian: sudo apt update อัปเดตรายการแพ็กเกจ sudo apt upgrade ติดตั้งการอัปเดต sudo apt install ชื่อ ติดตั้งแพ็กเกจ sudo apt remove ลบออก (purge ลบพร้อมคอนฟิก) และ apt autoremove ลบ dependency ที่ไม่จำเป็น ค้นหาด้วย apt search และ apt show ส่วน dependency ที่เสียหายแก้ด้วย sudo apt --fix-broken install
apt เป็นตัวจัดการแพ็กเกจมาตรฐานของ Ubuntu, Debian และดิสโทรที่สร้างจากทั้งสอง (Linux Mint, Pop!_OS) มันดาวน์โหลดโปรแกรมจากที่เก็บแพ็กเกจ ติดตั้ง dependency ให้อัตโนมัติ และอัปเดตระบบด้วยคำสั่งเดียว ด้านล่างเป็นคำสั่ง apt ทั้งหมดที่ใช้ในงานประจำวัน จัดกลุ่มตามงาน พร้อมข้อผิดพลาดที่พบบ่อยและวิธีแก้
apt ทำงานอย่างไร
แพ็กเกจคือไฟล์เก็บถาวร .deb ที่มีโปรแกรม เมทาดาทา และรายการ dependency ที่เก็บแพ็กเกจคือเซิร์ฟเวอร์ที่เก็บแพ็กเกจเหล่านั้น ที่อยู่ของมันอยู่ใน /etc/apt/sources.list และไดเรกทอรี /etc/apt/sources.list.d/ apt เก็บสำเนารายการแพ็กเกจที่มีอยู่ไว้ในเครื่อง และเทียบกับสำเนานี้ตอนติดตั้ง จึงต้องอัปเดตอย่างสม่ำเสมอ
เบื้องหลัง apt เรียก dpkg ระดับต่ำซึ่งแตกไฟล์และลงทะเบียนแพ็กเกจ แต่แก้ dependency ไม่ได้ คำสั่ง apt-get และ apt-cache เป็นอินเทอร์เฟซเก่าที่มีความสามารถเดียวกัน เอาต์พุตคงที่และเหมาะกับสคริปต์ ส่วน apt เป็นตัวห่อหุ้มรุ่นใหม่สำหรับคน มีแถบความคืบหน้า สี และคำสั่งที่สั้นกว่า
คำสั่งที่เปลี่ยนแปลงระบบแทบทั้งหมดต้องใช้สิทธิ์ผู้ดูแล จึงรันผ่าน sudo การค้นหาและดูข้อมูลทำได้โดยไม่ต้องใช้ sudo
ชีตสรุป: คำสั่ง apt หลัก
| คำสั่ง | ทำอะไร |
|---|---|
sudo apt update | อัปเดตรายการแพ็กเกจจากที่เก็บ |
sudo apt upgrade | ติดตั้งการอัปเดตโดยไม่ลบแพ็กเกจ |
sudo apt full-upgrade | อัปเดตพร้อมลบ/แทนที่แพ็กเกจเมื่อจำเป็น |
sudo apt install แพ็กเกจ | ติดตั้งแพ็กเกจพร้อม dependency |
sudo apt reinstall แพ็กเกจ | ติดตั้งแพ็กเกจใหม่ |
sudo apt remove แพ็กเกจ | ลบแพ็กเกจ เก็บไฟล์คอนฟิก |
sudo apt purge แพ็กเกจ | ลบแพ็กเกจพร้อมไฟล์คอนฟิกของระบบ |
sudo apt autoremove | ลบ dependency ที่ไม่จำเป็นแล้ว |
apt search คำ | ค้นหาแพ็กเกจจากชื่อและคำอธิบาย |
apt show แพ็กเกจ | คำอธิบาย เวอร์ชัน dependency ขนาด |
apt list --installed | รายการแพ็กเกจที่ติดตั้งแล้ว |
apt list --upgradable | แพ็กเกจที่อัปเดตได้ |
apt policy แพ็กเกจ | เวอร์ชันที่ติดตั้งและที่มีอยู่ รวมถึงแหล่งที่มา |
sudo apt clean | ล้างแคชไฟล์ .deb ที่ดาวน์โหลดแล้ว |
sudo apt --fix-broken install | แก้ dependency ที่เสียหาย |
apt update และ apt upgrade: อัปเดตระบบอย่างไร
นี่เป็นสองการทำงานที่ต่างกัน และมักสับสนกัน apt update ไม่ติดตั้งอะไรเลย เพียงดาวน์โหลดรายการแพ็กเกจล่าสุด ส่วน apt upgrade ติดตั้งเวอร์ชันใหม่ของโปรแกรมที่ติดตั้งอยู่แล้ว โดยอ้างอิงรายการเหล่านั้น
$ sudo apt update
Hit:1 http://archive.ubuntu.com/ubuntu noble InRelease
Get:2 http://security.ubuntu.com/ubuntu noble-security InRelease [126 kB]
...
12 packages can be upgraded. Run 'apt list --upgradable' to see them.
$ apt list --upgradable
$ sudo apt upgrade
คำสั่งที่ใช้บ่อยสำหรับเซิร์ฟเวอร์คือบรรทัดเดียว พร้อมยืนยันอัตโนมัติ:
sudo apt update && sudo apt upgrade -y
upgrade ต่างจาก full-upgrade อย่างไร
apt upgrade อาจติดตั้ง dependency ใหม่ได้ แต่จะไม่ลบแพ็กเกจที่ติดตั้งอยู่แล้วเด็ดขาด หากการอัปเดตต้องลบบางอย่าง (เช่น เมื่อเปลี่ยนเวอร์ชันเคอร์เนลหรือไลบรารี) แพ็กเกจนั้นจะถูก «เก็บไว้ก่อน» และจะปรากฏบรรทัด The following packages have been kept back ส่วน apt full-upgrade (เทียบเท่า apt-get dist-upgrade) อนุญาตให้ลบและทำการอัปเดตให้เสร็จ ก่อนรันให้อ่านให้ดีว่า apt จะลบอะไรบ้าง
อัปเดตเฉพาะแพ็กเกจเดียว
sudo apt install --only-upgrade nginx
หากแพ็กเกจยังไม่ได้ติดตั้ง คำสั่งที่มี --only-upgrade จะไม่ติดตั้งให้ ซึ่งป้องกันการติดตั้งโดยบังเอิญ
apt install: ติดตั้งแพ็กเกจ
sudo apt install nginx # แพ็กเกจเดียว
sudo apt install git curl htop # หลายแพ็กเกจพร้อมกัน
sudo apt install -y docker.io # ไม่ถามยืนยัน Y/n
sudo apt install nginx=1.24.0-2ubuntu7 # เวอร์ชันที่ระบุ
sudo apt install --no-install-recommends ffmpeg # ไม่รวมแพ็กเกจที่แนะนำ
sudo apt install ./google-chrome-stable_current_amd64.deb # ไฟล์ .deb ในเครื่อง
ก่อนติดตั้ง apt แสดงแพ็กเกจที่จะเพิ่มและพื้นที่ที่ต้องใช้ แล้วขอการยืนยัน แฟลก -y ตอบ «ใช่» อัตโนมัติ สะดวกในสคริปต์และ Dockerfile แต่ในการทำงานแบบโต้ตอบควรอ่านรายการก่อน
ตามค่าเริ่มต้น apt ติดตั้งทั้ง dependency ที่จำเป็น (Depends) และแพ็กเกจที่แนะนำ (Recommends) บนเซิร์ฟเวอร์และในคอนเทนเนอร์ --no-install-recommends ช่วยลดขนาดได้มาก
ติดตั้งไฟล์ .deb: apt หรือ dpkg -i
ควรติดตั้ง .deb ที่ดาวน์โหลดมาด้วย apt install ./ไฟล์.deb โดยพาธต้องมี ./ หรือเป็นพาธเต็ม มิฉะนั้น apt จะค้นหาแพ็กเกจชื่อนั้นในที่เก็บ ต่างจาก dpkg -i ตรงที่ apt จะดาวน์โหลด dependency ที่ขาดให้เอง หากคุณติดตั้งแพ็กเกจผ่าน dpkg แล้วเจอข้อผิดพลาด dependency ให้แก้ด้วย sudo apt --fix-broken install
sudo dpkg -i package.deb
sudo apt --fix-broken install
apt remove, purge และ autoremove: ลบแพ็กเกจ
| คำสั่ง | โปรแกรม | คอนฟิกใน /etc | Dependency |
|---|---|---|---|
apt remove | ถูกลบ | คงอยู่ | คงอยู่ |
apt purge | ถูกลบ | ถูกลบ | คงอยู่ |
apt autoremove | — | — | ลบที่ไม่จำเป็น |
sudo apt remove nginx
sudo apt purge nginx # เหมือนกันบวกคอนฟิก
sudo apt autoremove # เศษ dependency
sudo apt autoremove --purge # เศษ dependency พร้อมคอนฟิกของมัน
remove เหมาะเมื่อคุณอาจจะกลับมาใช้โปรแกรมและอยากเก็บการตั้งค่าไว้ ส่วน purge ใช้สำหรับติดตั้งใหม่จากศูนย์ โปรดทราบว่าไม่มีคำสั่งใดในสามตัวนี้ลบไฟล์ในโฮมไดเรกทอรีของผู้ใช้ (เช่น ~/.config)
หาแพ็กเกจที่ถูกลบแต่ยังเหลือคอนฟิกได้ สถานะของมันคือ rc:
dpkg -l | grep '^rc'
ค้นหาแพ็กเกจและดูข้อมูล
apt search postgresql # ค้นหาจากชื่อและคำอธิบาย
apt search --names-only '^php8' # เฉพาะชื่อ ใช้นิพจน์ปรกติได้
apt show htop # เวอร์ชัน ขนาด dependency คำอธิบาย
apt policy docker.io # เวอร์ชันที่มีและมาจากที่ใด
apt list --installed | grep python3
apt-cache depends curl # แพ็กเกจนี้ขึ้นกับอะไร
apt-cache rdepends libssl3 # ใครขึ้นกับแพ็กเกจนี้
ไฟล์นี้เป็นของแพ็กเกจใด
$ dpkg -S /usr/bin/curl
curl: /usr/bin/curl
$ dpkg -L curl # ไฟล์ที่แพ็กเกจติดตั้งไว้
หากยังไม่มีคำสั่งในระบบ Ubuntu จะแนะนำแพ็กเกจให้ทันทีเมื่อพยายามรันคำสั่งนั้น (ข้อความ Command 'tree' not found, but can be installed with: sudo apt install tree) สำหรับค้นหาไฟล์ในแพ็กเกจที่ยังไม่ได้ติดตั้ง มียูทิลิตี apt-file: apt-file search bin/dig หลังจาก sudo apt-file update
ล็อกเวอร์ชัน: apt-mark hold
บางครั้งแพ็กเกจไม่ควรถูกอัปเดต เช่น เวอร์ชันของ DBMS หรือเคอร์เนลบนโปรดักชันที่เปลี่ยนได้เฉพาะด้วยมือ ในกรณีนี้ให้ «แช่แข็ง» แพ็กเกจ:
sudo apt-mark hold postgresql-16
apt-mark showhold
sudo apt-mark unhold postgresql-16
อีกคู่คำสั่งที่มีประโยชน์คือ apt-mark manual และ apt-mark auto แพ็กเกจที่ติดตั้งมาเป็น dependency จะถูกทำเครื่องหมายว่าอัตโนมัติ และจะอยู่ในขอบเขตของ autoremove เมื่อไม่มีใครใช้ การทำเครื่องหมาย manual จะปกป้องแพ็กเกจนั้นจากการถูกลบ
ที่เก็บแพ็กเกจ: วิธีเพิ่มและตำแหน่งของมัน
รายการแหล่งอยู่ใน /etc/apt/sources.list และไฟล์ /etc/apt/sources.list.d/*.list ใน Ubuntu 24.04 และ Debian 12 ขึ้นไป รูปแบบ deb822 ที่มีนามสกุล .sources ถูกใช้มากขึ้นเรื่อยๆ (เช่น /etc/apt/sources.list.d/ubuntu.sources)
ที่เก็บของบุคคลที่สามพร้อมคีย์
วิธีที่ทันสมัยคือเก็บคีย์ของที่เก็บแยกไว้ และผูกกับที่เก็บด้วย signed-by คำสั่ง apt-key ล้าสมัยและถูกลบออกในเวอร์ชันใหม่
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo $VERSION_CODENAME) stable" | sudo tee /etc/apt/sources.list.d/docker.list
sudo apt update
sudo apt install docker-ce
PPA ใน Ubuntu
sudo add-apt-repository ppa:deadsnakes/ppa
sudo apt update
sudo add-apt-repository --remove ppa:deadsnakes/ppa
PPA คือที่เก็บส่วนตัวบน Launchpad เพิ่มเฉพาะที่คุณไว้วางใจ เพราะแพ็กเกจจากที่นั่นถูกติดตั้งด้วยสิทธิ์ root
แคชและพื้นที่ดิสก์
แพ็กเกจที่ดาวน์โหลดแล้วจะเก็บไว้ใน /var/cache/apt/archives/ บนดิสก์เล็กและใน Docker image ควรล้างแคชเป็นประจำ
du -sh /var/cache/apt/archives
sudo apt clean # ลบแคช .deb ทั้งหมด
sudo apt autoclean # ลบเฉพาะเวอร์ชันที่ล้าสมัย
ใน Dockerfile นิยมเขียนการติดตั้งในเลเยอร์เดียวและลบรายการแพ็กเกจทันที:
RUN apt-get update \
&& apt-get install -y --no-install-recommends curl ca-certificates \
&& rm -rf /var/lib/apt/lists/*
ในสคริปต์นิยมใช้ apt-get แทน apt เพราะ apt มีอินเทอร์เฟซที่ไม่คงที่ และจะเตือนชัดเจน (WARNING: apt does not have a stable CLI interface) เพื่อไม่ให้ตัวติดตั้งถามคำถาม ให้เพิ่ม DEBIAN_FRONTEND=noninteractive
ข้อผิดพลาดที่พบบ่อยของ apt และวิธีแก้
Could not get lock /var/lib/dpkg/lock-frontend
มีโปรเซสอื่นกำลังทำงานกับแพ็กเกจอยู่: เทอร์มินัลอีกหน้าต่างที่รัน apt, «Software Center» หรือการอัปเดตอัตโนมัติเบื้องหลัง unattended-upgrades รอสักครู่แล้วตรวจว่าใครถือล็อกอยู่:
ps aux | grep -E 'apt|dpkg'
อย่าลบไฟล์ล็อกด้วยมือขณะที่โปรเซสยังทำงาน เพราะการติดตั้งที่ถูกขัดจังหวะอาจทำให้ระบบอยู่ในสถานะไม่สอดคล้องกัน หากโปรเซสค้างหรือถูกฆ่าไปแล้ว ให้รัน sudo dpkg --configure -a หลังจากนั้น
Unable to locate package
apt ไม่พบแพ็กเกจ สาเหตุที่พบบ่อยที่สุดคือยังไม่ได้รัน sudo apt update บนระบบที่เพิ่งติดตั้ง พิมพ์ชื่อผิด หรือแพ็กเกจอยู่ในคอมโพเนนต์ที่ปิดอยู่ (universe ใน Ubuntu) เปิดคอมโพเนนต์ได้ด้วย sudo add-apt-repository universe
Unmet dependencies / held broken packages
Dependency ไม่ตรงกัน มักเกิดหลังติดตั้ง .deb ด้วยมือ หรือผสมที่เก็บของดิสโทรต่างเวอร์ชัน
sudo apt --fix-broken install
sudo dpkg --configure -a
apt policy แพ็กเกจที่มีปัญหา
dpkg was interrupted
การติดตั้งถูกขัดจังหวะ (ปิดเทอร์มินัล ไฟดับ) ข้อความบอกวิธีแก้ไว้แล้ว: sudo dpkg --configure -a
NO_PUBKEY เมื่อ apt update
ที่เก็บของบุคคลที่สามไม่มีคีย์ลงนามหรือคีย์ล้าสมัย ดาวน์โหลดคีย์ล่าสุดจากเว็บไซต์ของโปรเจกต์มาไว้ที่ /etc/apt/keyrings/ แล้วระบุใน signed-by ตามตัวอย่าง Docker ด้านบน
การอัปเดตความปลอดภัยอัตโนมัติ
Ubuntu Server มีแพ็กเกจ unattended-upgrades ติดตั้งอยู่ตามค่าเริ่มต้น ซึ่งจะติดตั้งการอัปเดตความปลอดภัยให้เอง ตรวจสอบและเปิดใช้งานได้ดังนี้:
sudo apt install unattended-upgrades
sudo dpkg-reconfigure -plow unattended-upgrades
cat /var/log/unattended-upgrades/unattended-upgrades.log
ต้องรีบูตหลังอัปเดตหรือไม่ บอกได้จากไฟล์ /var/run/reboot-required หากไฟล์นี้มีอยู่ แสดงว่าเคอร์เนลหรือไลบรารีสำคัญถูกอัปเดต
สรุป
คำสั่ง apt พื้นฐานอยู่ในวงจรสั้นๆ: update ก่อนทำอะไรทุกครั้ง, install เพื่อติดตั้ง, upgrade เพื่ออัปเดต, remove หรือ purge เพื่อลบ และ autoremove เพื่อเก็บกวาด สำหรับเวอร์ชันมี apt policy และ apt-mark hold สำหรับความเสียหายมี --fix-broken install และ dpkg --configure -a ส่วนในสคริปต์ใช้ apt-get การจัดการแพ็กเกจถูกอธิบายพร้อมตัวอย่างจริงในคอร์ส Linux
คำถามที่พบบ่อย
apt ต่างจาก apt-get อย่างไร?
ทั้งสองเป็นอินเทอร์เฟซของระบบแพ็กเกจเดียวกัน apt สะดวกกว่าเมื่อทำงานในเทอร์มินัล (มีความคืบหน้า สี และคำสั่งสั้น) ส่วน apt-get มีเอาต์พุตที่คงที่และแนะนำให้ใช้ในสคริปต์และ Dockerfile
ต้องรัน apt update ทุกครั้งก่อนติดตั้งหรือไม่?
ควรทำ หากรายการไม่ได้อัปเดตมานาน มิฉะนั้น apt อาจหาแพ็กเกจไม่พบ หรือพยายามดาวน์โหลดเวอร์ชันที่ไม่มีอยู่บนมิเรอร์แล้ว แล้วแสดงข้อผิดพลาด 404
จะดูประวัติการติดตั้งและการลบของ apt ได้ที่ไหน?
ประวัติเก็บไว้ที่ /var/log/apt/history.log (รายการเก่าอยู่ในไฟล์เก็บถาวร history.log.N.gz) ส่วนล็อกละเอียดของ dpkg อยู่ที่ /var/log/dpkg.log
จะย้อนแพ็กเกจกลับไปเวอร์ชันก่อนหน้าได้อย่างไร?
ดูเวอร์ชันที่มีด้วย apt policy แพ็กเกจ แล้วติดตั้งเวอร์ชันที่ต้องการด้วย sudo apt install แพ็กเกจ=เวอร์ชัน จากนั้นล็อกด้วย apt-mark hold เพื่อไม่ให้การอัปเดตครั้งถัดไปนำเวอร์ชันใหม่กลับมา
ใช้ apt บน CentOS หรือ Fedora ได้หรือไม่?
ไม่ได้ เพราะรูปแบบแพ็กเกจต่างกัน (rpm) และมีตัวจัดการของตัวเองคือ dnf และ yum apt ทำงานบน Debian, Ubuntu และดิสโทรที่มาจากทั้งสองเท่านั้น
หัวข้อนี้สอนอย่างละเอียดพร้อมฝึกปฏิบัติในคอร์ส “Linux: с нуля до уверенного администрирования”
ไปที่คอร์ส