এই 'অ্যাপট-গেট রিমুভ' নির্দেশনাটি কী করে?


10

নিম্নলিখিত কোডটি কী করে?

আমি এটি ইন্টারনেটে পেয়েছি তাই আমি এটি অনুলিপি করে টার্মিনালে আটকালাম কিন্তু যখন আমি একটি নতুন কার্নেল ইনস্টল করেছি তখন এটি কেবল পুরানোটিকে সনাক্ত করে।

sudo apt-get remove --purge $(dpkg -l 'linux-image-*' | sed '/^ii/!d;/'"$(uname -r | sed "s/\(.*\)-\([^0-9]\+\)/\1/")"'/d;s/^[^ ]* [^ ]* \([^ ]*\).*/\1/;/[0-9]/!d')

দ্বিতীয় অংশটি একটি নিয়মিত প্রকাশ, ফাইলের নামটি কেমন হওয়া উচিত তা নির্ধারণ করে তবে কোন ফাইলটির নাম ঠিক তা নয়। এটি কোনও কার্নেলটি ইনস্টল করছে যা আপনার উদ্দেশ্য বা এটি আদেশটি সরিয়ে দেয় এমনটি আবিষ্কার করছে?
নিক্লাস লিন্ডস্কোগ

এই কোডটি কোনও কার্নেল ইনস্টল করবে না , তবে তাদের সরান ! এই সিড-কমান্ডটি ঠিক কী করে তা আমি দেখতে পাচ্ছি না তবে এটি আউটপুট প্রক্রিয়া করে dpkg -l 'linux-image-*'যা সমস্ত ইনস্টল করা কার্নেল প্যাকেজ তালিকাভুক্ত করে এবং এর মধ্যে কিছুগুলি মুছে ফেলার জন্য ফিল্টার করে দেয় apt-get remove
বাইট কমান্ডার

16
আঙ্গুলের বেঁচে থাকার একটি খুব ভাল নিয়ম: আপনি যদি কোনও কোড কী করেন তা জানেন না, তবে সেই কোডটি টার্মিনালে রাখবেন না যতক্ষণ না কেউ জানেন যে এটি কী করে আপনাকে বলে না। আপনি যদি সর্বাধিক টু ডেট কার্নেলটি পেতে চেষ্টা করছেন তবে আপনি যে কোডটি বুঝতে পারছেন না তার পরিবর্তে আপনি জিজ্ঞাসাবাবু / প্রশ্ন / ১১৯০৮০/২ দেখতে চাইতে পারেন।
কর্নেল ট্রোগডোর

ডিস্কের চারপাশে বসে থাকা পুরানো কার্নেলগুলি ডিস্কের স্থান গ্রহণ এবং update-grub(প্যাকেজ পোস্টিনস্ট) ধীর গতির ব্যতীত কোনও সমস্যার কারণ হতে পারে না । যদি আপনি উদ্বিগ্ন থাকেন যে আপনি যে কার্নেলটি আপগ্রেড করার চেষ্টা করছেন সেটি আপনি আসলে বুট করেননি, তবে চালান uname -aবা এমনকি করুনdmesg | less
পিটার কর্ডেস

7
"আমি এটি ইন্টারনেটে পেয়েছি তাই আমি এটি অনুলিপি করে টার্মিনালে আটকালাম" NO NO NO NO NO। দুর্ঘটনাক্রমে আপনি ভয়াবহ কাজগুলি শেষ করবেন। চলমান কোড আপনি আপনার সিস্টেমে কুপোকাত করা এবং কুকুরছানাটিকে লাথি মারার মতো ভয়ঙ্কর জিনিসের ফলাফল বুঝতে পারবেন না ।
জার্নিম্যান গীক

উত্তর:


12

কোডগুলি একের পর এক ভেঙে ফেলুন (আমার সিস্টেমের জন্য):

$ dpkg -l 'linux-image-*'
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name                          Version             Architecture        Description
+++-=============================-===================-===================-================================================================
un  linux-image-3.0               <none>              <none>              (no description available)
ii  linux-image-3.13.0-32-generic 3.13.0-32.57        amd64               Linux kernel image for version 3.13.0 on 64 bit x86 SMP
ii  linux-image-extra-3.13.0-32-g 3.13.0-32.57        amd64               Linux kernel extra modules for version 3.13.0 on 64 bit x86 SMP
ii  linux-image-generic           3.13.0.32.38        amd64               Generic Linux kernel image


$ dpkg -l 'linux-image-*' | sed '/^ii/!d'
ii  linux-image-3.13.0-32-generic                         3.13.0-32.57                                        amd64        Linux kernel image for version 3.13.0 on 64 bit x86 SMP
ii  linux-image-extra-3.13.0-32-generic                   3.13.0-32.57                                        amd64        Linux kernel extra modules for version 3.13.0 on 64 bit x86 SMP
ii  linux-image-generic                                   3.13.0.32.38                                        amd64        Generic Linux kernel image


$ uname -r | sed 's/\(.*\)-\([^0-9]\+\)/\1/'
3.13.0-32



$ dpkg -l 'linux-image-*' | sed '/^ii/!d' | sed "/$(uname -r | sed 's/\(.*\)-\([^0-9]\+\)/\1/')/d"
ii  linux-image-generic                                   3.13.0.32.38                                        amd64        Generic Linux kernel image



$ dpkg -l 'linux-image-*' | sed '/^ii/!d' | sed "/$(uname -r | sed 's/\(.*\)-\([^0-9]\+\)/\1/')/d" | sed 's/^[^ ]* [^ ]* \([^ ]*\).*/\1/'
linux-image-generic



$ dpkg -l 'linux-image-*' | sed '/^ii/!d' | sed "/$(uname -r | sed 's/\(.*\)-\([^0-9]\+\)/\1/')/d" | sed 's/^[^ ]* [^ ]* \([^ ]*\).*/\1/' | sed '/[0-9]/!d'
## No output

সুতরাং এটি কিছুই করবে না:

$ sudo apt-get remove --purge $(dpkg -l 'linux-image-*' | sed '/^ii/!d;/'"$(uname -r | sed "s/\(.*\)-\([^0-9]\+\)/\1/")"'/d;s/^[^ ]* [^ ]* \([^ ]*\).*/\1/;/[0-9]/!d')

আপনি দেখতে পাচ্ছেন এটি আমার বর্তমান কার্নেল মেটা প্যাকেজটি অপসারণের খুব কাছাকাছি ছিল linux-image-generic 3.13.0.32.38 amd64 Generic Linux kernel image (এই শেষ sed '/[0-9]/!d'লাইনের জন্য ধন্যবাদ ), যা ভুল।

সংক্ষেপে, এই টুকরোটির sedকয়েকটি বিষয় রয়েছে। আপনার পুরানো কার্নেলগুলি অপসারণ করতে আপনার এড়ানো উচিত।

সম্পাদনা করুন:

আমি ইতিমধ্যে বলেছি যে sedকমান্ডের সমস্যা আছে। এক্সটেনশনের খাতিরে আমি ফর্মটির সাথে শেষ দুটি লাইন সরিয়ে ফেলছি যা আমার বর্তমান দৃশ্যে আসলে কাজ করা উচিত।

পরিবর্তিত আকারে শেষ দুটি লাইন:

sed -r 's/^[^ ]* *(([a-z]|-)*)(-[a-z]*) *(([0-9]|-)*)\..*/\1-\4\3/'

তাই:

$ dpkg -l 'linux-image-*' | sed '/^ii/!d;/'"$(uname -r | 
sed "s/\(.*\)-\([^0-9]\+\)/\1/")"'/d' | 
sed -r 's/^[^ ]* *(([a-z]|-)*(-[a-z]*) *(([0-9]|\.|-)*)\..*/\1\-\4\3/'

Outpus:

linux-image-3.13.0.32-generic

খুব বিপজ্জনক যে !!

--dry-runসম্পূর্ণ apt-get removeকমান্ডটি দিয়ে এই বিষয়টি আমার সিস্টেমে কী করবে তা দেখানো হচ্ছে :

$ sudo apt-get remove --dry-run $(dpkg -l 'linux-image-*' | 
sed '/^ii/!d;/'"$(uname -r | sed "s/\(.*\)-\([^0-9]\+\)/\1/")"'/d' | 
sed -r 's/^[^ ]* *(([a-z]|-)*)(-[a-z]*) *(([0-9]|\.|-)*)\..*/\1\-\4\3/')


Reading package lists... Done
Building dependency tree       
Reading state information... Done
Note, selecting 'linux-image-3.13.0-32-generic' for regex 'linux-image-3.13.0.32-generic'
The following package was automatically installed and is no longer required:
  linux-headers-generic
Use 'apt-get autoremove' to remove it.
The following packages will be REMOVED:
  linux-generic linux-image-3.13.0-32-generic
  linux-image-extra-3.13.0-32-generic linux-image-generic
0 upgraded, 0 newly installed, 4 to remove and 0 not upgraded.
Remv linux-generic [3.13.0.32.38]
Remv linux-image-generic [3.13.0.32.38]
Remv linux-image-extra-3.13.0-32-generic [3.13.0-32.57]
Remv linux-image-3.13.0-32-generic [3.13.0-32.57]

আপনি যেহেতু দেখেন এটি আমার সমস্ত বর্তমান কার্নেলগুলি সরিয়ে ফেলবে, এছাড়াও নোট করুন যে এটি আমার বর্তমান দৃশ্যের সাথে মেলে একটি সিমুলেশন এবং আসলটি sedউন্নত করা যেতে পারে।

** মনে রাখবেন যে ওলি ইতিমধ্যে উল্লিখিতreboot হিসাবে কার্নেল আপগ্রেড করার পরে যদি করণীয় হয় তবে আসল কোডটি কাজ করবে ।

EDIT2:

এখানে একটি সহজ তবে দৃust় স্ক্রিপ্ট যা সমস্ত পরিস্থিতি বিবেচনা করবে এবং প্রকৃত পুরানো কার্নেলগুলি সরিয়ে ফেলবে:

#!/bin/bash
kernels=( $(grep -Po "^linux-image-[^-]+-[^-]+-generic\b" < <(dpkg --get-selections)) )
cur_rel=$(grep -Po ".*(?=-[a-z]*$)" < <(uname -r))

for kernel in "${kernels[@]}"; do
    ker_rel=$(grep -Po "[0-9].*(?=-[a-z]*)" <<< "$kernel")
    dpkg --compare-versions "$ker_rel" gt "$cur_rel" && { echo "Please Restart your computer first"; break; }
    dpkg --compare-versions "$ker_rel" lt "$cur_rel" && sudo apt-get remove "$kernel"
done

আপনার যদি বর্তমানের তুলনায় নতুন কোনও সংস্করণ থাকে তবে এটি আপনাকে প্রথমে কম্পিউটার পুনরায় চালু করার জন্য একটি সতর্কতা দেবে। এছাড়াও মনে রাখবেন যে কোনও পুরানো কার্নেলগুলি কোনও ভাল কারণে সংরক্ষণ করা হয়েছে যার কারণ আপনি যদি কোনওরকমভাবে আপনার বর্তমান কার্নেলটিকে বিশৃঙ্খল করে দেন যা আপনার সিস্টেমকে অস্থিতিশীল করে তোলে তবে আপনার কোনও পুরানো কার্নেলটিতে বুট করতে সক্ষম হওয়া উচিত।


উম, অপেক্ষা, কি? আপনি আসল, কার্যকারী কোডটি অন্য কোনও কোডের সাথে প্রতিস্থাপন করেন যা আপনার মনে হয় "আসলে" (!!) সেখানে থাকা উচিত ", লক্ষ্য করুন যে আপনার" স্থির "কোডটি ভেঙে গেছে এবং আপনার বর্তমান কার্নেলটি মুছে ফেলবে, এবং এইভাবে সিদ্ধান্তে পৌঁছে যে মূল কোডটি" খুব বিপজ্জনক !! "? ডব্লিউটিএফ? -1।
ইলমারি করোনেন

মূল কোডটির সমালোচনা করার পক্ষে অবশ্যই যুক্তিসঙ্গত কারণ রয়েছে, যেমন অলির উত্তরে যেমন উল্লেখ করা হয়েছে, এবং আমি নিশ্চিত যে সেড কোডটি আরও শক্তিশালী করা যেতে পারে। তবে এই বাস্তবতাটি রয়ে গেছে যে, সাধারণ পরিস্থিতিতে (যেমন আপনি আপনার শেষ কার্নেল আপগ্রেড করার পরে পুনরায় বুট করেছেন) মূল কোডটি কাজ করে, যেখানে আপনার পরিবর্তিত সংস্করণটি কাজ করে না।
ইলমারি করোনেন

1
সবার আগে আপনার ব্যবহার করা শেষ শব্দটি ব্যবহার করা উচিত নয়..আপনি কি প্রকৃত কোডটি চালিত করেছেন? apt-getঅংশ অপসারণ এবং আপনি কি আউটপুট পেয়েছেন?
হিমাইল

@ ইলমারি কারোনেন: ভাল, আমি আপনার সাথে কয়েক দফায় দ্বিতীয়, আমি উত্তরটি পরিবর্তন করেছি ..
হিমাইল

কেন, হ্যাঁ, আমি না আপনার পরিবর্তিত কমান্ড (সংস্করণ যে পরে একটি অনুপস্থিত প্রথম বন্ধনী কারণে বিপর্যস্ত নয় চালানো (([a-z]|-)*হলো,) ছাড়া apt-getএটা সমালোচনা এর আগের অংশ। আমার সিস্টেম, এটি নিম্নলিখিত পংক্তিগুলি আউটপুট: linux-image-3.13-, linux-image-3.13-, linux-image-extra-3.13-, linux-image-extra-3.13-, linux-image-3.13.0.49-generic। এটা কি সত্যিই আপনি কি উদ্দেশ্যে? (এছাড়াও, বোনাস পয়েন্টগুলি যদি আপনি বুঝতে পারেন যে আমি আসলে কোন কার্নেলগুলি ইনস্টল করেছি))
ইলমারি করোনেন

12

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

এখানে কোডের অনেকগুলি বিট রয়েছে যা এই জাতীয় কিছু করে এবং এটি এটি ভাল উদাহরণ নয় । এটি সহজেই বর্তমানের তুলনায় নতুন কার্নেলগুলি মুছে ফেলতে পারে এবং সেইসাথে মেটা-প্যাকেজ যা ইনস্টল করে ( linux-genericএট আল) আপনার যদি আপগ্রেড থাকে এবং পুনরায় বুট না করে।


2
এবং এটি মোটেই ভাল ধারণা নয়। এই পুরানো কার্নেলগুলি কারণ হিসাবে রাখা হয়, ডিফল্টরূপে কেবলমাত্র 2 টি পুরাতন এবং একটি বর্তমান রয়েছে।
বড়ফু আলবিনো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.