SSD Nodes Learn 🎉 VPS $5.50/মাস থেকে
নির্দেশিকা Matt Connorদ্বারা Matt Connor

apt update ডুপ্লিকেট সোর্স এরর কীভাবে সমাধান করবেন

apt update কমান্ড চালানোর সময় Target is configured multiple times এরর কেন আসে এবং কীভাবে legacy .list ও deb822 .sources ফাইল খুঁজে ডুপ্লিকেট এন্ট্রি মুছে ফেলবেন তা জানুন।

ডুপ্লিকেট apt sources ত্রুটির অর্থ কী

ডুপ্লিকেট apt sources-এর অর্থ হলো একটি রিপোজিটরি দুটি ভিন্ন ফাইলে ঘোষণা করা হয়েছে এবং APT (advanced package tool) উভয় কপিই খুঁজে পেয়েছে। Ubuntu 24.04 এবং তার পরবর্তী ভার্সনগুলোতে সাধারণত কোনো থার্ড-পার্টি ইন্সটল স্ক্রিপ্ট একটি পুরনো এক লাইনের .list ফাইল তৈরি করলে এমনটি ঘটে, যেখানে ওই একই রিপোজিটরির জন্য একটি deb822 .sources ফাইল আগে থেকেই ডিস্কে থাকে। এতে কোনো ফাইল নষ্ট হয় না এবং কোনো প্যাকেজ ঝুঁকির মুখে পড়ে না। দুটি ঘোষণার মধ্যে একটি মুছে ফেললেই এই বার্তাটি চলে যাবে।

মানুষ সাধারণত সার্চ বক্সে এই লাইনটি পেস্ট করে:

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 ডাউনলোড করে জানতে পারে একটি রিপোজিটরি কী কী প্যাকেজ অফার করে, এবং stable/binary-amd64/Packages সেই ইনডেক্সের আওতাভুক্ত কম্পোনেন্ট (stable) ও আর্কিটেকচার (amd64)-এর নাম নির্দেশ করে। সুতরাং apt আপনাকে জানাচ্ছে যে, stable কম্পোনেন্টের জন্য amd64 ইনডেক্সটি docker.list ফাইলের 1 নম্বর লাইনে এবং পুনরায় docker.sources ফাইলের 1 নম্বর লাইনে কনফিগার করা আছে।

apt 3.0 এবং তার পরবর্তী ভার্সনগুলোতে, অর্থাৎ Ubuntu 25.04 এবং Debian 13 থেকে, একই বার্তা W:-এর পরিবর্তে Warning: দিয়ে শুরু হয়। প্রিফিক্সের পরের টেক্সট একই থাকে।

এই সতর্কবার্তাটি সাধারণ একটি সমস্যা। apt দুটি ঘোষণাকে একত্রিত করে এবং আপডেট প্রক্রিয়াটি সম্পন্ন হয়, কারণ উভয়ই একই কী (key) ব্যবহার করে একই আর্কাইভকে বর্ণনা করে। জটিল ক্ষেত্রে প্রক্রিয়াটি পুরোপুরি বন্ধ হয়ে যায়:

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 কাজ করতে অস্বীকৃতি জানায় কারণ দুটি ঘোষণায় একটি আর্কাইভের জন্য ভিন্ন ভিন্ন সাইনিং কী (signing key) উল্লেখ করা হয়েছে। apt দুটি অভিন্ন ঘোষণাকে একত্রিত করতে পারে, কিন্তু দুটি Signed-By মানের মধ্যে কোনো একটিকে বেছে নিতে পারে না। কারণ ভুলটি বেছে নিলে প্যাকেজ সিগনেচারগুলো এমন একটি কী-এর বিপরীতে যাচাই হবে যা দিয়ে আর্কাইভের মালিক কখনোই সাইন করেননি। ফলে apt কোনো সোর্সই পড়তে পারে না। আপনি নিজে ফাইলগুলো এডিট না করা পর্যন্ত apt update এবং apt install উভয়ই ওই একই দুটি লাইন দেখিয়ে ব্যর্থ হবে।

ডুপ্লিকেট ফাইলটি যেভাবে তৈরি হয়

দুটি ফরম্যাট আলাদা আলাদা এক্সটেনশনসহ ভিন্ন ফাইলে থাকে, তাই ডিস্কে এদের সহাবস্থানে কোনো বাধা নেই। apt এই ওভারল্যাপটি অনেক দেরিতে শনাক্ত করে, যখন এটি প্রতিটি সোর্স ফাইলকে ইনডেক্স টার্গেটের তালিকায় প্রসারিত করে যা এটি সংগ্রহ করতে চায়। সেই মুহূর্ত পর্যন্ত docker.list এবং docker.sources দুটি সম্পূর্ণ আলাদা ফাইল হিসেবে থাকে।

সাধারণ চারটি ঘটনার কারণে এই জোড়া ফাইল তৈরি হয়:

  • কোনো ভেন্ডর ইনস্টল স্ক্রিপ্ট, অথবা পুরনো কোনো পোস্ট থেকে কপি করা কমান্ড, /etc/apt/sources.list.d/vendor.list ফাইলে একটি tee লাইন লিখে রাখে।
  • পরবর্তীতে ভেন্ডরের নিজস্ব প্যাকেজ /etc/apt/sources.list.d/vendor.sources ফাইলটি রিলিজ করে এবং আপনার সিস্টেমে তা ইনস্টল করে।
  • Ubuntu 24.04 এবং তার পরবর্তী ভার্সনে add-apt-repository deb822 ফরম্যাটের .sources ফাইল তৈরি করে, ফলে আপনি আগে হাতে যে PPA (personal package archive) .list হিসেবে যোগ করেছিলেন, তা এখন .sources হিসেবে ফিরে আসে।
  • রিলিজ আপগ্রেডের সময় ডিস্ট্রিবিউশনের নিজস্ব সোর্স ফাইলগুলোকে deb822 ফরম্যাটে নতুন করে লেখা হয়, কিন্তু আপনার হাতে লেখা .list ফাইলটি সেগুলোর পাশে অপরিবর্তিত থেকে যায়।

প্রতিটি পাথ বা পথই আলাদাভাবে যুক্তিসঙ্গত। যখন একই সার্ভারে এর মধ্যে দুটি ঘটনা ঘটে—যা প্রায়ই কয়েক মাসের ব্যবধানে হয়—তখনই ডুপ্লিকেট ফাইলটি তৈরি হয়।

পাশাপাশি দুটি ফরম্যাট

পুরানো ফরম্যাটে প্রতিটি রিপোজিটরির জন্য একটি লাইন থাকে এবং এর প্রতিটি অংশ অবস্থান-ভিত্তিক।

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), এরপর সুইট এবং সবশেষে এক বা একাধিক কম্পোনেন্ট। যেহেতু এর অর্থ অবস্থানের ওপর নির্ভর করে, তাই ভুল জায়গায় একটি স্পেস থাকলে apt-এর পড়ার ধরন বদলে যায়।

deb822 একই বিষয়কে নামযুক্ত ফিল্ডের একটি স্তবক (stanza) হিসেবে প্রকাশ করে। এই নামটি এসেছে RFC 822 থেকে, যা হলো মেইল হেডার স্টাইল এবং ডেবিয়ান এটি প্যাকেজ কন্ট্রোল ফাইলের জন্য আগে থেকেই ব্যবহার করে আসছে।

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

একই রিপোজিটরি, একই কি (key), নতুন কিছু যোগ করা হয়নি। ম্যাপিংটি সরাসরি: deb হয়ে যায় Types, আর্কাইভ অ্যাড্রেস হয়ে যায় URIs, সুইট হয়ে যায় Suites, কম্পোনেন্টগুলো হয়ে যায় Components এবং প্রতিটি বন্ধনীভুক্ত অপশন নিজস্ব ফিল্ডে পরিণত হয়, ফলে signed-by= হয়ে যায় Signed-By: এবং arch= হয়ে যায় Architectures:

প্রতিটি ফিল্ডের নাম বহুবচন কারণ প্রতিটি ফিল্ড স্পেস দিয়ে আলাদা করা একটি তালিকা গ্রহণ করে। একটি স্তবকে থাকা Suites: noble noble-updates noble-backports তিনটি আলাদা deb লাইনকে প্রতিস্থাপন করে। একটি ফাঁকা লাইন স্তবকের সমাপ্তি নির্দেশ করে, তাই একটি একক .sources ফাইলে একাধিক রিপোজিটরি রাখা সম্ভব। deb822 এমন সব সেটিংসও বহন করে যা এক লাইনের ফরম্যাটে সঠিকভাবে কাজ করে না: রিপোজিটরি বন্ধ করার জন্য Enabled: no, Trusted, Check-Valid-Until এবং সরাসরি Signed-By-এ পেস্ট করা একটি ইনলাইন কি, যেখানে প্রতিটি লাইন এক স্পেস ইনডেন্ট করা থাকে এবং ফাঁকা লাইনগুলোকে একটি ডট হিসেবে লেখা হয়।

প্রতিটি ফাইলের অবস্থান

  • /etc/apt/sources.list: মূল একক ফাইল। Ubuntu 24.04 এবং এর পরবর্তী সংস্করণগুলোতে এটি সাধারণত খালি থাকে অথবা নতুন অবস্থানের দিকে নির্দেশকারী একটি মন্তব্য ধারণ করে।
  • /etc/apt/sources.list.d/*.list: এক লাইনের এন্ট্রি, সাধারণত প্রতিটি রিপোজিটরির জন্য একটি ফাইল।
  • /etc/apt/sources.list.d/*.sources: deb822 স্ট্যানজা। Ubuntu 24.04 এবং এর পরবর্তী সংস্করণগুলো ডিস্ট্রিবিউশনের নিজস্ব রিপোজিটরিগুলোকে এখানে রাখে, যা ubuntu.sources-এ অবস্থিত।
  • /etc/apt/keyrings/: আপনার যোগ করা কি (key) গুলো এখানে থাকে। /usr/share/keyrings/ প্যাকেজের সাথে আসা কি (key) গুলো ধারণ করে।

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 এবং noble suite-কে নির্দেশ করে, তাই এগুলো একই রিপোজিটরি যা দুইবার লেখা হয়েছে। এদের Signed-By পাথগুলোও ভিন্ন, যার ফলে আগে দেখানো Conflicting values এররটি তৈরি হয়।

এই ধাপের জন্য apt কমান্ডের পরিবর্তে grep ব্যবহার করুন। যখন 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.

এখন নিশ্চিত করুন যে এডিট করার পরেও রিপোজিটরি ঠিকঠাক কাজ করছে:

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

যদি কোনো ভেন্ডরের ডকুমেন্টেশনে এখনও এক লাইনের ফাইলের কথা উল্লেখ থাকে, তবে আপনি সেটি রাখতে পারেন এবং পরিবর্তে .sources ফাইলটি মুছে ফেলতে পারেন। একটি নিয়মই সব ক্ষেত্রে প্রযোজ্য: একটি নির্দিষ্ট আর্কাইভ এবং সুইটের জন্য শুধুমাত্র একটি ফাইলই ঘোষণা থাকতে পারবে।

কেন একটি অকার্যকর থার্ড-পার্টি সোর্স apt update-কে আটকে দেয়

পার্শ্ববর্তী ব্যর্থতাটি ভিন্ন মনে হলেও এর মূল কারণ একই, যা হলো এমন একটি থার্ড-পার্টি সোর্স যা apt ব্যবহার করতে পারছে না। প্রথম সংস্করণটি হলো একটি অনুপস্থিত কী (key):

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 সেই সুইটের জন্য কিছুই প্রকাশ করেনি, তাই সার্ভারে পাথটি বিদ্যমান নেই এবং অনুরোধটি 404 রিটার্ন করে। আপনার অন্যান্য রিপোজিটরিগুলো এখনও আপডেট হয় এবং আপনার কাছে থাকা প্যাকেজগুলো অক্ষত থাকে। তবে, রানটি নন-জিরো (non-zero) এক্সিট কোড দেয়, তাই যে কোনো স্ক্রিপ্ট যা apt update-এর এক্সিট স্ট্যাটাস চেক করে তা এখন প্রতিবার চালানোর সময় একটি ব্যর্থতার রিপোর্ট দেয়। এই কারণেই একটি অকার্যকর সোর্স unattended security upgrades কনফিগার করা বক্সে পরিষ্কার করা জরুরি: কারণ প্রতিদিনের এই অপ্রয়োজনীয় সতর্কবার্তার ভিড়েই প্রকৃত ব্যর্থতাগুলো লুকিয়ে থাকে।

বাকিগুলো ঠিক রেখে একটি সোর্স নিষ্ক্রিয় করা

একটি deb822 ফাইলের ক্ষেত্রে, স্ট্যানজাতে একটি ফিল্ড যোগ করুন এবং ফাইলটি সেভ করুন:

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 ম্যানুয়াল স্ট্যানজার প্রতিটি লাইন কমেন্ট আউট করার পরিবর্তে এই পদ্ধতিটি ব্যবহারের পরামর্শ দেয়, কারণ এটি বাতিল করা সহজ। এক লাইনের ফাইলের ক্ষেত্রে, লাইনের শুরুতে একটি # বসান। উভয় ফরম্যাটের জন্যই, ফাইলটিকে /etc/apt/sources.list.d/ থেকে সরিয়ে ফেলাও কাজ করে; যখন কোনো রিপোজিটরি স্থায়ীভাবে মুছে ফেলার প্রয়োজন হয়, তখন এই বিকল্পটি বেছে নিন।

আবার sudo apt update চালান। সেই রিপোজিটরির জন্য Err: ব্লকটি অদৃশ্য হয়ে যাবে এবং এক্সিট স্ট্যাটাস 0 ফিরে আসবে, যা আপনি পরের লাইনে echo $? দিয়ে যাচাই করতে পারেন।

কখনোই sudo rm /etc/apt/sources.list.d/* দিয়ে কোনো ত্রুটিপূর্ণ সোর্স ঠিক করার চেষ্টা করবেন না। Ubuntu 24.04 এবং এর পরবর্তী ভার্সনগুলোতে এটি ubuntu.sources মুছে ফেলে, যেখানে ডিস্ট্রিবিউশনের নিজস্ব রিপোজিটরিগুলো থাকে। ফলে 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-এর জায়গায় lsb_release -cs থেকে আপনার নিজস্ব রিলিজের নাম বসান, তারপর sudo apt update চালান।

লিগ্যাসি .list ফাইলগুলোকে deb822 ফরম্যাটে রূপান্তর

আগস্ট 2026 থেকে, apt 3.0 এবং এর পরবর্তী সংস্করণগুলোতে এর জন্য একটি কনভার্টার যুক্ত করা হয়েছে। Debian 13 এবং Ubuntu 25.04 ও এর পরবর্তী প্রতিটি রিলিজ, যার মধ্যে 26.04-ও অন্তর্ভুক্ত, এতে এই সুবিধা রয়েছে। সংস্করণটি যাচাই করুন এবং তারপর নিচের কমান্ডটি চালান:

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 ফাইলযুক্ত সিস্টেমে এই ধরনের ডুপ্লিকেট ফাইল তৈরির সুযোগ থাকে না।

সার্ভারে থার্ড-পার্টি সোর্সগুলো গুছিয়ে রাখা

সার্ভারের ক্ষেত্রে থার্ড-পার্টি রিপোজিটরিগুলো সময়ের সাথে সবচেয়ে দ্রুত পুরোনো হয়ে যায়। প্রতিটি রিপোজিটরি হলো অন্য কারো দেওয়া একটি প্রতিশ্রুতি যে তারা আপনার Ubuntu রিলিজের জন্য প্যাকেজ আপডেট দিয়ে যাবে। আর একটি রিলিজ আপগ্রেড করার সময় একই দিনে এই সবগুলোর প্রতিশ্রুতি যাচাই হয়ে যায়।

  • শুধুমাত্র তখনই থার্ড-পার্টি রিপোজিটরি যোগ করুন যখন ডিস্ট্রিবিউশন প্যাকেজ দিয়ে কাজ চলে না। একটি সাধারণ LAMP stack on Ubuntu 24.04-এর জন্য কোনো থার্ড-পার্টি সোর্সের প্রয়োজন নেই: Ubuntu আর্কাইভে এর প্রয়োজনীয় প্রতিটি প্যাকেজ থাকে এবং রিলিজের পুরো সময়জুড়ে সেগুলোর নিরাপত্তা আপডেট পাওয়া যায়।
  • কি (keys) গুলোকে /etc/apt/keyrings/ ডিরেক্টরিতে রাখুন, প্রতি ভেন্ডরের জন্য একটি করে ফাইল এবং মোড 644 ব্যবহার করুন। আনপ্রিভিলেজড _apt ইউজার ডাউনলোড করার কাজ করে এবং তাকে কি ফাইলটি পড়তে হয়, তাই শুধুমাত্র root-এর পড়ার উপযোগী কি ফাইল থাকলে প্রতিবার ফেচ করার সময় পারমিশন এরর দেখা দেবে।
  • প্রতিটি স্ট্যানজাতে Signed-By ব্যবহার করে সরাসরি সেই নির্দিষ্ট ফাইলের দিকে নির্দেশ করুন। /etc/apt/trusted.gpg বা /etc/apt/trusted.gpg.d/-তে রাখা কি সার্ভারের সব রিপোজিটরির জন্য ট্রাস্টেড হয়ে যায়, যার মানে হলো কয়েক বছর আগে যোগ করা কোনো ভেন্ডর কি যেকোনো জায়গা থেকে আসা প্যাকেজকে বৈধতা দিতে পারে।
  • রিলিজ আপগ্রেডের আগে আপনার সোর্সগুলো পড়ুন এবং নিশ্চিত করুন যে প্রতিটি ভেন্ডর সেই সুইটের জন্য প্যাকেজ পাবলিশ করেছে যেটিতে আপনি আপগ্রেড করছেন।

পুরোনো গ্লোবাল কি-রিংয়ে থাকা একটি কি প্রতিটি আপডেটের সময় নিজেকে জানান দেয়:

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.

সেই একক কি-টিকে আলাদা ফাইলে এক্সপোর্ট করুন, তারপর স্ট্যানজাতে সেটির পাথ উল্লেখ করুন:

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 যোগ করুন এবং sudo apt update চালান। যখন কোনো রিপোজিটরি পুরোনো কি-রিংয়ের ওপর নির্ভর করবে না, তখন এই সতর্কতা বন্ধ হয়ে যাবে এবং আপনি sudo gpg --no-default-keyring --keyring /etc/apt/trusted.gpg --delete-key 7EA0A9C3F273FCD8 দিয়ে সেই এন্ট্রিটি মুছে ফেলতে পারবেন।

আরও একটি অভ্যাস সবচেয়ে বেশি ঝামেলা কমায়। do-release-upgrade আপগ্রেডের সময় থার্ড-পার্টি সোর্সগুলোকে ডিজেবল করে দেয় এবং পরে সেগুলো বন্ধই রাখে। হাতে ধরে একটি একটি করে সেগুলো চালু করতে গেলেই মূলত ডুপ্লিকেট ডিক্লারেশন তৈরি হয়। শুরু করার আগে the Ubuntu 24.04 to 26.04 upgrade guide পড়ুন এবং আপনার কোন কোন রিপোজিটরি প্রয়োজন তা লিখে রাখুন। নতুন তৈরি করা মেশিনের ক্ষেত্রে, সোর্সগুলো ঠিক করার সবচেয়ে উপযুক্ত সময় হলো the first ten minutes on a new VPS, যখন সার্ভারে শুধুমাত্র Ubuntu-এর নিজস্ব এন্ট্রিগুলো থাকে।

FAQ

কেন apt বলে যে একটি টার্গেট একাধিকবার কনফিগার করা হয়েছে?

কারণ /etc/apt/sources.list.d/-এর অধীনে দুটি ফাইল একই রিপোজিটরি, স্যুট এবং কম্পোনেন্ট ঘোষণা করে। বার্তাটিতে লাইন নম্বরসহ উভয় ফাইলের নাম উল্লেখ থাকে, যেমন docker.list:1 এবং docker.sources:1। apt এগুলোকে মার্জ করে কাজ চালিয়ে নেয়, তাই আপডেট প্রক্রিয়াটি কাজ করে। তবে ডুপ্লিকেট এন্ট্রি মুছে ফেলা ভালো: যদি দুটি ফাইল ভিন্ন সাইনিং কি (signing key) নির্দেশ করে, তবে apt E: Conflicting values set for option Signed-By ত্রুটি দেখিয়ে কাজ বন্ধ করে দেয় এবং কোনো সোর্স ফাইলই পড়ে না, যা apt install-কেও বাধাগ্রস্ত করে।

আমার কি .list ফাইল রাখা উচিত নাকি .sources ফাইল?

.sources ফাইলটি রাখুন। deb822 হলো সেই ফরম্যাট যা Ubuntu 24.04 এবং নতুন ভার্সনে add-apt-repository ব্যবহার করে। এতে স্কয়ার ব্র্যাকেটের পজিশনাল টেক্সটের পরিবর্তে প্রতিটি সেটিংয়ের জন্য আলাদা নামযুক্ত ফিল্ড থাকে এবং ডিস্ট্রিবিউশনগুলো এই ফরম্যাটের দিকেই এগোচ্ছে। .list ফাইলটি মুছে ফেলার আগে নিশ্চিত করুন যে .sources ফাইলের ভেতরের Signed-By পাথটি এমন একটি কি-কে নির্দেশ করছে যা ls -l /etc/apt/keyrings/ কমান্ডের মাধ্যমে বিদ্যমান। পুরনো ফাইলটিকে ডিরেক্টরির ভেতরে রিনেম না করে /etc/apt/sources.list.d/ থেকে সরিয়ে ফেলুন, কারণ ডিরেক্টরিতে পড়ে থাকা কোনো .bak নামের ফাইল থাকলে apt প্রতিবার চালানোর সময় একটি ইগনোরড-ফাইল নোটিশ দেখাবে।

একটি apt রিপোজিটরি মুছে না ফেলে কীভাবে বন্ধ করব?

একটি deb822 .sources ফাইলে, স্ট্যানজাতে Enabled: no যোগ করুন। একটি এক লাইনের .list ফাইলে, লাইনের শুরুতে একটি # বসান। যেকোনো ক্ষেত্রেই, এরপর sudo apt update চালান, তাহলে ওই রিপোজিটরির জন্য Err: ব্লকটি অদৃশ্য হয়ে যাবে। যখন কোনো থার্ড-পার্টি রিপোজিটরিতে আপনার Ubuntu রিলিজের জন্য কোনো প্যাকেজ থাকে না এবং এর 404 ত্রুটির কারণে apt update নন-জিরো এক্সিট কোড দেয়, তখন এটিই সঠিক সমাধান।

এক লাইনের sources.list ফরম্যাট কি উঠে যাচ্ছে?

এটি ডেপ্রিকেটেড (deprecated), তবে পুরোপুরি সরানো হয়নি। apt এখনো .list ফাইলগুলো পড়ে এবং দীর্ঘ সময় ধরে পড়বে, তাই আপনার সার্ভারে আগামীকালই কিছু ভেঙে পড়বে না। নতুন টুলিং deb822 ফরম্যাটে লেখে: Ubuntu 24.04 এবং নতুন ভার্সনগুলো ডিস্ট্রিবিউশন রিপোজিটরিগুলোকে /etc/apt/sources.list.d/ubuntu.sources-এ রাখে এবং add-apt-repository এখন .sources ফাইল তৈরি করে। apt 3.0 এবং নতুন ভার্সনে, sudo apt modernize-sources আপনার কাছে থাকা পুরনো ফাইলগুলোকে কনভার্ট করতে পারে।

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