SSD Nodes Learn 🎉 VPS เริ่ม $5.50/เดือน
คู่มือ Matt Connorโดย Matt Connor · อัปเดตเมื่อ 2026-08-13

วิธีแก้ไขข้อผิดพลาด apt source list ซ้ำซ้อนบน Ubuntu

แก้ไขปัญหา apt update แจ้งเตือน Target is configured multiple times ด้วยการลบไฟล์ .list หรือ .sources ที่ซ้ำซ้อนออก เรียนรู้วิธีตรวจสอบตำแหน่งไฟล์และจัดการ deb822 ให้ถูกต้อง

ความหมายของข้อผิดพลาดแหล่งที่มา apt ซ้ำซ้อน

ข้อผิดพลาดแหล่งที่มา apt ซ้ำซ้อนหมายความว่ามีการประกาศ repository เดียวกันไว้สองครั้งในไฟล์ที่แตกต่างกันสองไฟล์ และ APT (advanced package tool) ได้ตรวจพบสำเนาทั้งสองชุด บน Ubuntu 24.04 และรุ่นที่ใหม่กว่า ปัญหานี้มักเกิดจากสคริปต์ติดตั้งของบุคคลที่สามเขียนไฟล์ .list แบบบรรทัดเดียวแบบเก่าลงไป ในขณะที่มีไฟล์ .sources แบบ deb822 สำหรับ repository เดียวกันนั้นอยู่ในดิสก์อยู่แล้ว ระบบไม่ได้เสียหายและไม่มีแพ็กเกจใดตกอยู่ในความเสี่ยง ให้ลบการประกาศชุดใดชุดหนึ่งออกแล้วข้อความแจ้งเตือนจะหายไป

นี่คือบรรทัดที่ผู้คนมักคัดลอกไปวางในช่องค้นหา:

W: Target Packages (stable/binary-amd64/Packages) is configured multiple times in /etc/apt/sources.list.d/docker.list:1 and /etc/apt/sources.list.d/docker.sources:1

ให้อ่านจากส่วนท้ายของข้อความ จะพบว่ามีสองไฟล์ที่แต่ละไฟล์ระบุหมายเลขบรรทัดไว้ ซึ่งประกาศสิ่งเดียวกัน Target Packages คือดัชนีที่ apt ดาวน์โหลดมาเพื่อเรียนรู้ว่า repository นั้นมีแพ็กเกจอะไรบ้าง และ stable/binary-amd64/Packages คือชื่อส่วนประกอบ (stable) และสถาปัตยกรรม (amd64) ที่ดัชนีนั้นครอบคลุม ดังนั้น apt กำลังแจ้งให้คุณทราบว่าดัชนี amd64 สำหรับส่วนประกอบ stable ถูกกำหนดค่าไว้ใน docker.list ที่บรรทัด 1 และถูกกำหนดไว้อีกครั้งใน docker.sources ที่บรรทัด 1

บน apt 3.0 และรุ่นที่ใหม่กว่า ซึ่งหมายถึง Ubuntu 25.04 เป็นต้นไป และ Debian 13 ข้อความเดียวกันจะขึ้นต้นด้วย Warning: แทนที่จะเป็น W: โดยข้อความหลังจากส่วนนำหน้าจะเหมือนเดิม

คำเตือนนั้นเป็นกรณีที่ไม่รุนแรง apt จะรวมการประกาศทั้งสองเข้าด้วยกันและยังคงดำเนินการอัปเดตได้ตามปกติ เนื่องจากทั้งสองอธิบายถึงที่เก็บถาวรเดียวกันด้วยคีย์เดียวกัน ส่วนกรณีที่รุนแรงจะทำให้ทุกอย่างหยุดชะงัก:

E: Conflicting values set for option Signed-By regarding source https://download.docker.com/linux/ubuntu/ noble: /usr/share/keyrings/docker-archive-keyring.gpg != /etc/apt/keyrings/docker.asc
E: The list of sources could not be read.

ในกรณีนี้ apt จะปฏิเสธการทำงานเนื่องจากการประกาศทั้งสองระบุคีย์การลงนามที่แตกต่างกันสำหรับที่เก็บถาวรเดียว apt จะรวมการประกาศที่เหมือนกันสองชุดเข้าด้วยกันได้ แต่จะไม่เลือกค่า Signed-By ระหว่างสองค่า เพราะการเลือกค่าที่ผิดหมายถึงการตรวจสอบลายเซ็นแพ็กเกจด้วยคีย์ที่เจ้าของที่เก็บถาวรไม่ได้ใช้ลงนาม ดังนั้น apt จึงไม่อ่านแหล่งที่มาใดๆ เลย ทั้ง apt update และ apt install จะล้มเหลวด้วยสองบรรทัดเดียวกันนั้นจนกว่าคุณจะแก้ไขไฟล์ด้วยตนเอง

สาเหตุของการเกิดไฟล์ซ้ำ

รูปแบบทั้งสองประเภทถูกจัดเก็บไว้ในไฟล์แยกกันโดยมีนามสกุลไฟล์ต่างกัน ดังนั้นจึงไม่มีข้อจำกัดในระดับดิสก์ที่ป้องกันไม่ให้ไฟล์ทั้งสองมีอยู่พร้อมกันได้ apt จะตรวจพบความซ้ำซ้อนนี้ในภายหลัง เมื่อระบบขยายรายการไฟล์ source ทั้งหมดออกเป็นรายการเป้าหมายของดัชนีที่ต้องการดาวน์โหลด จนกว่าจะถึงเวลานั้น docker.list และ docker.sources จะถือเป็นไฟล์ที่ไม่เกี่ยวข้องกัน

เหตุการณ์ปกติ 4 ประการที่ทำให้เกิดไฟล์คู่กันนี้คือ:

  • สคริปต์ติดตั้งของผู้ให้บริการ หรือคำสั่งที่คัดลอกมาจากบทความเก่า เขียนไฟล์ /etc/apt/sources.list.d/vendor.list พร้อมบรรทัด tee
  • แพ็กเกจของผู้ให้บริการเองในภายหลังได้รวมไฟล์ /etc/apt/sources.list.d/vendor.sources มาด้วยและติดตั้งลงในระบบของคุณ
  • add-apt-repository บน Ubuntu 24.04 และเวอร์ชันใหม่กว่า จะเขียนไฟล์ deb822 .sources ดังนั้น PPA (personal package archive) ที่คุณเคยเพิ่มด้วยตนเองในรูปแบบ .list จึงกลับมาปรากฏในรูปแบบ .sources
  • การอัปเกรดรุ่นของระบบปฏิบัติการ (release upgrade) ได้เขียนไฟล์ source ของตัวระบบเองใหม่เป็นรูปแบบ deb822 แต่ยังคงทิ้งไฟล์ .list ที่คุณเขียนไว้เองเดิมไว้โดยไม่มีการแก้ไข

แต่ละเส้นทางถือเป็นเรื่องปกติในตัวมันเอง ความซ้ำซ้อนจะเกิดขึ้นเมื่อเหตุการณ์เหล่านี้สองอย่างเกิดขึ้นบนเครื่องเดียวกัน ซึ่งมักจะทิ้งช่วงห่างกันหลายเดือน

เปรียบเทียบสองรูปแบบเคียงข้างกัน

รูปแบบเก่าคือหนึ่งบรรทัดต่อหนึ่ง repository และทุกส่วนของบรรทัดมีตำแหน่งที่กำหนดไว้ตายตัว

deb [arch=amd64 signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu noble stable

ลำดับของข้อมูลถูกกำหนดไว้ชัดเจน ได้แก่ ประเภท (deb สำหรับแพ็กเกจไบนารี, deb-src สำหรับแพ็กเกจซอร์สโค้ด) ตามด้วยตัวเลือกในวงเล็บก้ามปู, URI (uniform resource identifier) ของคลังเก็บ, suite และตามด้วย component ตั้งแต่หนึ่งรายการขึ้นไป เนื่องจากความหมายขึ้นอยู่กับตำแหน่งที่วาง หากเว้นวรรคผิดตำแหน่งจะทำให้ apt อ่านค่าเปลี่ยนไปทันที

รูปแบบ deb822 ระบุข้อมูลเดียวกันในลักษณะของ stanza ที่มีฟิลด์ระบุชื่อกำกับ ชื่อนี้มาจาก RFC 822 ซึ่งเป็นรูปแบบส่วนหัวของอีเมลที่ Debian ใช้งานอยู่แล้วสำหรับไฟล์ควบคุมแพ็กเกจ

Types: deb
URIs: https://download.docker.com/linux/ubuntu
Suites: noble
Components: stable
Architectures: amd64
Signed-By: /etc/apt/keyrings/docker.asc

เป็น repository เดียวกัน กุญแจเดียวกัน ไม่มีการเพิ่มข้อมูลใดๆ การจับคู่ข้อมูลเป็นแบบโดยตรง: deb เปลี่ยนเป็น Types, ที่อยู่ของคลังเก็บเปลี่ยนเป็น URIs, suite เปลี่ยนเป็น Suites, component เปลี่ยนเป็น Components และตัวเลือกในวงเล็บแต่ละรายการจะกลายเป็นฟิลด์ของตัวเอง ดังนั้น signed-by= จึงกลายเป็น Signed-By: และ arch= กลายเป็น Architectures:

ชื่อฟิลด์ทุกชื่อเป็นพหูพจน์เนื่องจากทุกฟิลด์รองรับรายการที่คั่นด้วยช่องว่าง Suites: noble noble-updates noble-backports ในหนึ่ง stanza สามารถแทนที่บรรทัด deb แบบเดิมได้ถึงสามบรรทัด บรรทัดว่างจะเป็นตัวกำหนดจุดสิ้นสุดของ stanza ดังนั้นไฟล์ .sources เพียงไฟล์เดียวจึงสามารถเก็บ repository ได้หลายแห่ง นอกจากนี้ deb822 ยังรองรับการตั้งค่าที่รูปแบบบรรทัดเดียวจัดการได้ยาก เช่น Enabled: no สำหรับปิดการใช้งาน repository, Trusted, Check-Valid-Until และการใส่กุญแจแบบ inline โดยวางลงใน Signed-By โดยตรง ซึ่งแต่ละบรรทัดต้องย่อหน้าหนึ่งช่องว่าง และบรรทัดว่างจะถูกเขียนแทนด้วยจุดหนึ่งจุด

ตำแหน่งที่จัดเก็บไฟล์แต่ละประเภท

  • /etc/apt/sources.list: ไฟล์เดี่ยวแบบดั้งเดิม บน Ubuntu 24.04 และเวอร์ชันใหม่กว่า ไฟล์นี้มักจะว่างเปล่าหรือมีเพียงข้อความหมายเหตุที่ชี้ไปยังตำแหน่งใหม่เท่านั้น
  • /etc/apt/sources.list.d/*.list: รายการแบบบรรทัดเดียว โดยปกติจะเป็นหนึ่งไฟล์ต่อหนึ่ง repository
  • /etc/apt/sources.list.d/*.sources: สแตนซาในรูปแบบ deb822 บน Ubuntu 24.04 และเวอร์ชันใหม่กว่า ระบบจะเก็บ repository ของตัว distribution เองไว้ที่นี่ ใน ubuntu.sources
  • /etc/apt/keyrings/: ตำแหน่งสำหรับเก็บคีย์ที่คุณเพิ่มเข้ามาเอง ส่วน /usr/share/keyrings/ จะเก็บคีย์ที่มาพร้อมกับแพ็กเกจ

apt จะอ่านเฉพาะไฟล์ที่ลงท้ายด้วย .list หรือ .sources เท่านั้น และชื่อไฟล์สามารถประกอบด้วยตัวอักษร ตัวเลข ขีดล่าง ขีดกลาง และจุด หากไฟล์มีนามสกุลอื่น ระบบจะข้ามไฟล์นั้นไปพร้อมกับแสดงการแจ้งเตือน ซึ่งเป็นประเด็นสำคัญสำหรับการแก้ไขที่ระบุไว้ด้านล่างนี้

ค้นหาคู่ไฟล์ที่ซ้ำกัน

เริ่มต้นด้วยการแสดงรายการไฟล์ในไดเรกทอรี:

ls -l /etc/apt/sources.list.d/
-rw-r--r-- 1 root root  195 Aug  3 09:12 docker.list
-rw-r--r-- 1 root root  254 Aug  9 14:40 docker.sources
-rw-r--r-- 1 root root 2683 Jun 11 08:02 ubuntu.sources

ไฟล์สองไฟล์ที่มีชื่อต้นเหมือนกันแต่มีนามสกุลต่างกันมักจะเป็นคู่ที่ซ้ำกัน แต่อย่าเพิ่งเชื่อชื่อไฟล์เหล่านั้น ให้ตรวจสอบเนื้อหาภายใน เพราะไฟล์ที่ซ้ำกันอาจซ่อนอยู่ในไฟล์ที่ตั้งชื่ออะไรก็ได้:

grep -rn -E '^(deb |deb-src |Types:|URIs:|Suites:|Signed-By:)' /etc/apt/sources.list /etc/apt/sources.list.d/
/etc/apt/sources.list.d/docker.list:1:deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu noble stable
/etc/apt/sources.list.d/docker.sources:1:Types: deb
/etc/apt/sources.list.d/docker.sources:2:URIs: https://download.docker.com/linux/ubuntu
/etc/apt/sources.list.d/docker.sources:3:Suites: noble
/etc/apt/sources.list.d/docker.sources:6:Signed-By: /etc/apt/keyrings/docker.asc

คู่ที่ซ้ำกันคือรายการสองรายการที่มี host เดียวกันและ suite เดียวกัน ทั้งสองชี้ไปที่ https://download.docker.com/linux/ubuntu และ suite noble จึงถือว่าเป็น repository เดียวกันที่ถูกเขียนซ้ำสองครั้ง นอกจากนี้เส้นทาง Signed-By ของทั้งสองยังไม่ตรงกัน ซึ่งเป็นสาเหตุที่ทำให้เกิดข้อผิดพลาด Conflicting values ที่แสดงไว้ก่อนหน้านี้

ให้ใช้ grep แทนคำสั่ง apt สำหรับขั้นตอนนี้ เนื่องจากเมื่อ apt หยุดทำงานเพราะเกิดข้อขัดแย้ง มันจะไม่สามารถแสดงรายการแหล่งที่มาของคุณได้เช่นกัน ดังนั้น apt-cache policy จึงแสดงข้อผิดพลาดเดิมแทนที่จะให้คำตอบที่คุณต้องการ

แก้ไขปัญหา: เก็บไฟล์ deb822 ไว้และลบไฟล์รูปแบบเก่าออก

ให้เก็บไฟล์ .sources ไว้ เนื่องจากเป็นรูปแบบที่เครื่องมือ apt ใช้งานในปัจจุบัน และเป็นทิศทางที่ทั้ง Debian และ Ubuntu กำลังมุ่งไป ก่อนที่จะลบไฟล์ใดๆ ให้ตรวจสอบว่าพาธของคีย์ใดมีอยู่จริงในดิสก์:

ls -l /etc/apt/keyrings/ /usr/share/keyrings/ | grep -i docker
-rw-r--r-- 1 root root 4813 Aug  9 14:40 docker.asc

มีเพียง /etc/apt/keyrings/docker.asc เท่านั้นที่มีอยู่จริง ดังนั้นไฟล์ deb822 จึงเป็นไฟล์ที่ถูกต้อง และไฟล์ .list กำลังชี้ไปยังคีย์ที่ถูกลบออกไปแล้ว หากไฟล์ที่คุณต้องการเก็บไว้มีการระบุชื่อคีย์ที่หายไป ให้คัดลอกพาธที่ใช้งานได้ลงไปในไฟล์นั้นก่อน จากนั้นจึงลบอีกไฟล์หนึ่งทิ้ง

ให้ย้ายไฟล์รูปแบบเก่าออกจากไดเรกทอรีแทนการลบทิ้งทันที:

sudo mkdir -p /root/apt-sources-backup
sudo mv /etc/apt/sources.list.d/docker.list /root/apt-sources-backup/
sudo apt update

การเปลี่ยนชื่อไฟล์เป็น docker.list.bak และทิ้งไว้ในที่เดิมก็สามารถทำได้เช่นกัน เพราะ apt จะเพิกเฉยต่อส่วนขยายที่ไม่รู้จัก แต่การทำเช่นนั้นจะทำให้ทุกครั้งที่รัน apt จะแสดงข้อความนี้:

N: Ignoring file 'docker.list.bak' in directory '/etc/apt/sources.list.d/' as it has an invalid filename extension

การย้ายไฟล์ไปไว้ที่อื่นจะช่วยไม่ให้ข้อความแจ้งเตือนดังกล่าวปรากฏบนหน้าจอของคุณ และยังคงเก็บไฟล์สำรองไว้ได้ ผลลัพธ์ของ apt update ที่สมบูรณ์หลังจากนั้นจะมีลักษณะดังนี้ โดยไม่มีบรรทัดที่ระบุชื่อไฟล์ซ้ำซ้อนกัน:

Hit:1 http://archive.ubuntu.com/ubuntu noble InRelease
Get:2 https://download.docker.com/linux/ubuntu noble InRelease [48.8 kB]
Get:3 http://security.ubuntu.com/ubuntu noble-security InRelease [126 kB]
Fetched 175 kB in 1s (146 kB/s)
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
All packages are up to date.

จากนั้นยืนยันว่า repository ยังคงใช้งานได้ปกติหลังจากการแก้ไข:

apt-cache policy | grep download.docker.com
 500 https://download.docker.com/linux/ubuntu noble/stable amd64 Packages
     origin download.docker.com

หากเอกสารของผู้ให้บริการซอฟต์แวร์ยังคงอ้างอิงถึงไฟล์แบบบรรทัดเดียว คุณสามารถเลือกเก็บไฟล์นั้นไว้และลบไฟล์ .sources ออกแทนได้ โดยมีกฎตัดสินเพียงข้อเดียวคือ: ต้องมีไฟล์เพียงไฟล์เดียวเท่านั้นที่ประกาศ archive และ suite นั้นๆ

เหตุใดแหล่งซอฟต์แวร์ภายนอกที่เสียหายจึงทำให้ apt update หยุดชะงัก

ความล้มเหลวที่เกิดขึ้นในลักษณะใกล้เคียงกันนี้มีสาเหตุมาจากรากเหง้าเดียวกัน นั่นคือแหล่งซอฟต์แวร์ภายนอกที่ apt ไม่สามารถใช้งานได้ กรณีแรกคือปัญหาคีย์สูญหาย:

Err:5 https://download.docker.com/linux/ubuntu noble InRelease
  The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 7EA0A9C3F273FCD8
E: The repository 'https://download.docker.com/linux/ubuntu noble InRelease' is not signed.
N: Updating from such a repository can't be done securely, and is therefore disabled by default.

ฟิลด์ Signed-By หายไป หรือชี้ไปยังไฟล์ที่ไม่ใช่คีย์ที่ใช้งานได้ ทำให้ apt ไม่สามารถตรวจสอบลายเซ็นบนไฟล์ InRelease ของคลังซอฟต์แวร์นั้นได้ ระบบจึงละทิ้งคลังซอฟต์แวร์ทั้งหมดนั้นแทนที่จะเชื่อถือรายการแพ็กเกจที่ไม่สามารถตรวจสอบได้ ให้ตรวจสอบไฟล์คีย์ด้วยตนเอง:

ls -l /etc/apt/keyrings/docker.asc
gpg --show-keys /etc/apt/keyrings/docker.asc

คีย์ที่ใช้งานได้จะแสดงบรรทัด pub พร้อมรหัสคีย์ และบรรทัด uid ที่ระบุชื่อผู้ให้บริการ หากแสดง gpg: no valid OpenPGP data found. หมายความว่าไฟล์ดังกล่าวไม่ใช่คีย์ ซึ่งมักเกิดจากการที่การดาวน์โหลดบันทึกหน้าแจ้งข้อผิดพลาดแทน เนื่องจาก URL ของคีย์มีการเปลี่ยนแปลง ให้ดาวน์โหลดคีย์ใหม่อีกครั้ง ตรวจสอบไฟล์ แล้วจึงรัน apt update

กรณีที่สองเกิดขึ้นหลังจากมีการอัปเกรดรุ่นของระบบ:

Err:6 https://ppa.launchpadcontent.net/ondrej/php/ubuntu plucky InRelease
  404  Not Found [IP: 10.0.0.80 443]
E: The repository 'https://ppa.launchpadcontent.net/ondrej/php/ubuntu plucky Release' does not have a Release file.

PPA ไม่ได้เผยแพร่ข้อมูลใดๆ สำหรับชุดซอฟต์แวร์นั้น ทำให้ path ดังกล่าวไม่มีอยู่บนเซิร์ฟเวอร์และคำขอส่งกลับค่า 404 คลังซอฟต์แวร์อื่นของคุณยังคงอัปเดตได้ตามปกติ และแพ็กเกจที่คุณมีอยู่แล้วจะไม่ได้รับผลกระทบ อย่างไรก็ตาม การทำงานจะสิ้นสุดด้วยสถานะ non-zero ดังนั้นสคริปต์ใดก็ตามที่ตรวจสอบสถานะการทำงานของ apt update จะรายงานความล้มเหลวทุกครั้งที่รัน นี่คือเหตุผลว่าทำไมแหล่งซอฟต์แวร์ที่ตายแล้วจึงควรถูกลบออกบนเครื่องที่มีการตั้งค่า การอัปเดตความปลอดภัยอัตโนมัติ ไว้ เพราะเสียงแจ้งเตือนที่เกิดขึ้นทุกวันอาจบดบังความล้มเหลวที่แท้จริงได้

การปิดใช้งานแหล่งที่มาหนึ่งรายการโดยไม่กระทบส่วนอื่น

สำหรับไฟล์รูปแบบ deb822 ให้เพิ่มฟิลด์หนึ่งรายการลงใน stanza แล้วบันทึกไฟล์:

Types: deb
URIs: https://ppa.launchpadcontent.net/ondrej/php/ubuntu
Suites: plucky
Components: main
Signed-By: /etc/apt/keyrings/ondrej-php.asc
Enabled: no

คู่มือของ apt แนะนำวิธีนี้มากกว่าการใส่เครื่องหมายคอมเมนต์หน้าทุกบรรทัดใน stanza และยังสามารถยกเลิกการตั้งค่าได้ง่ายกว่า สำหรับไฟล์แบบบรรทัดเดียว ให้ใส่ # ไว้ที่ต้นบรรทัด สำหรับทั้งสองรูปแบบ การย้ายไฟล์ออกจาก /etc/apt/sources.list.d/ ก็เป็นวิธีที่ใช้ได้เช่นกัน และเป็นตัวเลือกที่ควรเลือกเมื่อต้องการลบ repository นั้นออกอย่างถาวร

เรียกใช้ sudo apt update อีกครั้ง บล็อก Err: สำหรับ repository นั้นจะหายไป และสถานะการทำงานจะกลับเป็น 0 ซึ่งคุณสามารถตรวจสอบได้ด้วย echo $? ในบรรทัดถัดไป

ห้ามแก้ไขแหล่งที่มาที่เสียหายด้วย sudo rm /etc/apt/sources.list.d/* โดยเด็ดขาด บน Ubuntu 24.04 และเวอร์ชันที่ใหม่กว่า คำสั่งนี้จะลบ ubuntu.sources ซึ่งเป็นที่เก็บ repository หลักของ distribution ทิ้งไป ส่งผลให้ apt ไม่มีรายการแพ็กเกจเหลืออยู่เลย และจะรายงานข้อผิดพลาด E: Unable to locate package curl สำหรับซอฟต์แวร์ที่มีอยู่จริง หากคุณได้เรียกใช้คำสั่งนี้ไปแล้ว ให้เขียนไฟล์กลับคืน:

Types: deb
URIs: http://archive.ubuntu.com/ubuntu/
Suites: noble noble-updates noble-backports
Components: main restricted universe multiverse
Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg

Types: deb
URIs: http://security.ubuntu.com/ubuntu/
Suites: noble-security
Components: main restricted universe multiverse
Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg

บันทึกไฟล์ดังกล่าวเป็น /etc/apt/sources.list.d/ubuntu.sources โดยแทนที่ noble ด้วยชื่อ release ของคุณจาก lsb_release -cs จากนั้นเรียกใช้ sudo apt update

การแปลงไฟล์ .list แบบเดิมเป็นรูปแบบ deb822

ตั้งแต่เดือนสิงหาคม 2026 เป็นต้นไป apt เวอร์ชัน 3.0 ขึ้นไปได้รวมเครื่องมือแปลงไฟล์นี้มาให้ด้วย โดย Debian 13, Ubuntu 25.04 และทุกรุ่นหลังจากนั้นรวมถึง 26.04 จะมีเครื่องมือนี้ติดตั้งมาให้ ให้ตรวจสอบเวอร์ชันของ apt แล้วเรียกใช้งานคำสั่งดังนี้:

apt --version
sudo apt modernize-sources

คำสั่งนี้จะเขียนไฟล์บรรทัดเดียวที่อยู่ใน /etc/apt/sources.list.d/ ใหม่ให้เป็นไฟล์ deb822 ใน .sources ให้ตรวจสอบข้อความที่แสดงผลออกมา จากนั้นให้ตรวจสอบรายการไฟล์ในไดเรกทอรีด้วยตนเองและรัน apt update ก่อนที่จะเชื่อถือผลลัพธ์ สำหรับ Ubuntu 24.04 นั้นมาพร้อมกับ apt เวอร์ชันเก่าที่ไม่มีคำสั่งย่อยนี้ ซึ่งคำสั่งจะตอบกลับมาว่า E: Invalid operation modernize-sources ในรุ่นดังกล่าว ให้ทำการแปลงด้วยตนเองโดยใช้การจับคู่ฟิลด์ตามที่ระบุไว้ข้างต้น

การแปลงไฟล์ในปัจจุบันถือเป็นทางเลือก เนื่องจาก apt ยังคงอ่านได้ทั้งสองรูปแบบ แต่การดำเนินการนี้คุ้มค่าสำหรับเซิร์ฟเวอร์ที่คุณวางแผนจะใช้งานในระยะยาว เนื่องจากเครื่องมือทุกตัวที่เขียนไฟล์แหล่งที่มาในปัจจุบันจะเขียนเป็นรูปแบบ deb822 ทั้งสิ้น และเครื่องที่ใช้เฉพาะไฟล์ .sources จะไม่เกิดปัญหาไฟล์ซ้ำซ้อนในลักษณะนี้อีกต่อไป

การจัดการ third-party sources บนเซิร์ฟเวอร์ให้เป็นระเบียบ

Third-party repositories เป็นส่วนของเซิร์ฟเวอร์ที่เสื่อมสภาพเร็วที่สุด แต่ละแหล่งคือคำสัญญาจากผู้อื่นว่าจะคอยอัปเดตซอฟต์แวร์ให้ Ubuntu release ของคุณ ซึ่งการอัปเกรด release จะเป็นการทดสอบคำสัญญาเหล่านั้นทั้งหมดในคราวเดียว

  • เพิ่ม third-party repository เฉพาะเมื่อแพ็กเกจมาตรฐานของ distribution ไม่สามารถใช้งานได้เท่านั้น การติดตั้ง LAMP stack บน Ubuntu 24.04 แบบปกติไม่จำเป็นต้องใช้แหล่งภายนอกเลย เนื่องจาก Ubuntu archive มีแพ็กเกจที่จำเป็นครบถ้วนและมีการอัปเดตความปลอดภัยตลอดอายุการใช้งานของ release นั้นๆ
  • เก็บ key ไว้ใน /etc/apt/keyrings/ โดยใช้ไฟล์แยกตามผู้ให้บริการและตั้งค่า mode เป็น 644 ผู้ใช้ _apt ซึ่งไม่มีสิทธิ์พิเศษเป็นผู้ดาวน์โหลดและจำเป็นต้องอ่าน key ดังนั้นหากไฟล์ key อ่านได้เฉพาะ root จะทำให้เกิดข้อผิดพลาดด้านสิทธิ์ (permission error) ทุกครั้งที่มีการดึงข้อมูลจาก repository นั้น
  • ระบุ Signed-By ให้ชี้ไปยังไฟล์นั้นโดยตรงในทุก stanza การวาง key ไว้ใน /etc/apt/trusted.gpg หรือ /etc/apt/trusted.gpg.d/ จะทำให้ key นั้นได้รับความเชื่อถือสำหรับทุก repository ในเครื่อง ซึ่งหมายความว่า key ของผู้ให้บริการที่เพิ่มไว้เมื่อหลายปีก่อนอาจใช้ตรวจสอบแพ็กเกจจากแหล่งใดก็ได้
  • ก่อนการอัปเกรด release ให้ตรวจสอบ sources ของคุณและดูว่าผู้ให้บริการแต่ละรายมีการเผยแพร่แพ็กเกจสำหรับ suite ที่คุณกำลังจะย้ายไปแล้วหรือไม่

Key ที่อยู่ใน global keyring แบบเก่าจะแจ้งเตือนทุกครั้งที่มีการอัปเดต:

W: https://download.docker.com/linux/ubuntu/dists/noble/InRelease: Key is stored in legacy trusted.gpg keyring (/etc/apt/trusted.gpg), see the DEPRECATION section in apt-key(8) for details.

ให้ export key นั้นออกมาเป็นไฟล์ของตัวเอง แล้วระบุ stanza ให้ชี้ไปที่ไฟล์ดังกล่าว:

gpg --no-default-keyring --keyring /etc/apt/trusted.gpg --export 7EA0A9C3F273FCD8 | sudo tee /etc/apt/keyrings/docker.gpg > /dev/null
sudo chmod 644 /etc/apt/keyrings/docker.gpg

เพิ่ม Signed-By: /etc/apt/keyrings/docker.gpg ลงใน stanza ของ repository นั้นแล้วรัน sudo apt update คำเตือนจะหายไปเมื่อไม่มี repository ใดใช้งาน global keyring แบบเก่าอีกต่อไป จากนั้นคุณจึงสามารถลบรายการดังกล่าวออกด้วย sudo gpg --no-default-keyring --keyring /etc/apt/trusted.gpg --delete-key 7EA0A9C3F273FCD8

อีกหนึ่งนิสัยที่จะช่วยลดปัญหาได้มากที่สุดคือ การที่ do-release-upgrade จะปิดการใช้งาน third-party sources ระหว่างการอัปเกรดและคงสถานะปิดไว้หลังจากนั้น การกลับมาเปิดใช้งานด้วยตนเองทีละรายการคือสาเหตุหลักที่ทำให้เกิดการประกาศซ้ำซ้อน อ่าน คู่มือการอัปเกรด Ubuntu 24.04 ไปยัง 26.04 ก่อนเริ่มดำเนินการ และจดบันทึกไว้ว่าคุณยังจำเป็นต้องใช้ repository ใดบ้าง สำหรับเครื่องที่คุณเพิ่งสร้างขึ้น ช่วงเวลาที่เหมาะสมที่สุดในการจัดการ sources ให้ถูกต้องคือระหว่าง สิบนาทีแรกบน VPS ใหม่ ในขณะที่รายการในเครื่องยังมีเพียงรายการที่มาพร้อมกับ Ubuntu เท่านั้น

FAQ

ทำไม apt ถึงแจ้งเตือนว่ามีการตั้งค่า target ซ้ำหลายครั้ง?

เพราะมีไฟล์สองไฟล์ภายใต้ /etc/apt/sources.list.d/ ประกาศ repository, suite และ component เดียวกัน ข้อความแจ้งเตือนจะระบุชื่อไฟล์ทั้งสองพร้อมเลขบรรทัด เช่น docker.list:1 และ docker.sources:1 ตัว apt จะรวมการตั้งค่าเข้าด้วยกันและทำงานต่อได้ตามปกติ ดังนั้นการอัปเดตจึงยังคงใช้งานได้ อย่างไรก็ตาม ควรลบรายการที่ซ้ำออก เพราะทันทีที่ไฟล์ทั้งสองระบุ signing key ที่ต่างกัน apt จะหยุดทำงานพร้อมข้อความ E: Conflicting values set for option Signed-By และปฏิเสธที่จะอ่าน source ใดๆ เลย ซึ่งจะทำให้ apt install ไม่สามารถทำงานได้เช่นกัน

ควรเก็บไฟล์ .list หรือไฟล์ .sources ไว้?

ควรเก็บไฟล์ .sources ไว้ รูปแบบ deb822 คือสิ่งที่ add-apt-repository ใช้เขียนบน Ubuntu 24.04 และเวอร์ชันที่ใหม่กว่า โดยจะเก็บค่าการตั้งค่าแบบระบุชื่อฟิลด์แทนการใช้ข้อความตามตำแหน่งในวงเล็บเหลี่ยม ซึ่งเป็นทิศทางที่การแจกจ่ายซอฟต์แวร์กำลังมุ่งไป ก่อนจะลบไฟล์ .list ให้ยืนยันก่อนว่า path ของ Signed-By ภายในไฟล์ .sources ชี้ไปยัง key ที่มีอยู่จริงด้วยคำสั่ง ls -l /etc/apt/keyrings/ ให้ย้ายไฟล์เก่าออกจาก /etc/apt/sources.list.d/ แทนการเปลี่ยนชื่อไฟล์ภายในไดเรกทอรีนั้น เพราะชื่อไฟล์ที่มีนามสกุล .bak หลงเหลืออยู่จะทำให้ apt แสดงข้อความแจ้งเตือนไฟล์ที่ถูกละเว้นในการทำงานทุกครั้ง

จะปิดการใช้งาน apt repository โดยไม่ต้องลบออกได้อย่างไร?

ในไฟล์ .sources รูปแบบ deb822 ให้เพิ่ม Enabled: no ลงใน stanza นั้น สำหรับไฟล์รูปแบบบรรทัดเดียว .list ให้ใส่ # ไว้ที่หน้าบรรทัด ไม่ว่าจะใช้วิธีใด ให้รัน sudo apt update หลังจากนั้น แล้วบล็อก Err: สำหรับ repository นั้นจะหายไป นี่เป็นวิธีที่ถูกต้องเมื่อ repository ของบุคคลที่สามยังไม่มีแพ็กเกจสำหรับ Ubuntu เวอร์ชันที่คุณใช้งาน และข้อผิดพลาด 404 ทำให้ apt update จบการทำงานด้วยสถานะ non-zero

รูปแบบ sources.list แบบบรรทัดเดียวจะถูกยกเลิกหรือไม่?

รูปแบบนี้ถูกประกาศว่าเลิกใช้แล้ว (deprecated) แต่ยังไม่ได้ถูกถอดออก apt ยังคงอ่านไฟล์ .list ได้และจะยังคงอ่านได้ต่อไปอีกนาน ดังนั้นไม่มีสิ่งใดบนเซิร์ฟเวอร์ของคุณที่จะเสียหายในวันพรุ่งนี้ เครื่องมือใหม่ๆ จะเขียนในรูปแบบ deb822 โดย Ubuntu 24.04 และเวอร์ชันที่ใหม่กว่าจะเก็บ repository ของระบบไว้ใน /etc/apt/sources.list.d/ubuntu.sources และ add-apt-repository จะเขียนไฟล์ในรูปแบบ .sources สำหรับ apt 3.0 และเวอร์ชันที่ใหม่กว่า สามารถใช้ sudo apt modernize-sources เพื่อแปลงไฟล์ที่คุณมีอยู่ให้เป็นรูปแบบใหม่ได้

#apt#ubuntu#deb822#package-management#troubleshooting