Comments 90
Все правильно, только в конец надо добавить:
echo «test… test… test...» | perl -e '$??s:;s:s;;$?::s;;=]=>%-{
echo «test… test… test...» | perl -e '$??s:;s:s;;$?::s;;=]=>%-{
;) Не смог удержаться…
В скрипте из статьи нет ни одной завуалированной комманды, и по нему совершенно точно можно понять что он как минимум безвреден обладая базовыми знаниями линукса.
rm -rf / – это как минимум, не совсем корректно. Могли бы уже и сломать перловую часть, все равно визуально было бы понятно. Ну или взять что-то не настолько убойное, хотя бы :(){ :|:& };:, если так хотелось подшутить.
rm -rf / – это как минимум, не совсем корректно. Могли бы уже и сломать перловую часть, все равно визуально было бы понятно. Ну или взять что-то не настолько убойное, хотя бы :(){ :|:& };:, если так хотелось подшутить.
Я с вами совершенно согласен, в части, что любой обладающий базовыми знаниями линукса определит безвредность скрипта.
Потому не обладая этими самыми базовыми знаниями писать статью на хабре — глупо. Для этого есть раздел вопросов и ответов.
Далее, учитывая параною топикстартера, я на 100% был уверен в безобидности шутки ;)
Кроме того мой второй комментарий является спойлером, он насторожил бы и не параноика ;)
Потому не обладая этими самыми базовыми знаниями писать статью на хабре — глупо. Для этого есть раздел вопросов и ответов.
Далее, учитывая параною топикстартера, я на 100% был уверен в безобидности шутки ;)
Кроме того мой второй комментарий является спойлером, он насторожил бы и не параноика ;)
Я написал пост не потому, что решил блеснуть тем, что в чем-то разобрался (мой вклад минимален, учитывая, что исходный «рецепт» написан не мой), а просто потому, что знаю, что данная проблема для многих актуальна, но редко кто заморачивается, чтобы ее решить. Видимо поэтому быстрых и легких решений сходу найти не удалось. Уверен, что мое потраченное время (и время хабраюзеров, давших альтернативные варианты в комментариях) пойдет на пользу хотя бы нескольким людям — а значит, пост написан не зря. В конце концов все мы здесь сидим именно для обмена знаниями.
А ваш первый комментарий многим людям помог?
А ваш первый комментарий многим людям помог?
Учитывая что мой первый комментарий является шуткой — возможно кто-то улыбнулся с нуба, с вас то-есть ;)
Однако если посмотреть на мою карму, скорее получилось наоборот, он дал возможность почувствовать власть и поднять чсв достаточно большому числу людей, что наверное тоже не так уж и плохо, если относиться к этому философски. А как к этому будешь относиться после того как тебя слили? ;) Только так.
Думаю я заблуждался, и возможно эта статья кому-то полезна, раз уж она на главной ;)
Но я все еще уверен, что патч Бармина вы бы не применили ;)
Однако если посмотреть на мою карму, скорее получилось наоборот, он дал возможность почувствовать власть и поднять чсв достаточно большому числу людей, что наверное тоже не так уж и плохо, если относиться к этому философски. А как к этому будешь относиться после того как тебя слили? ;) Только так.
Думаю я заблуждался, и возможно эта статья кому-то полезна, раз уж она на главной ;)
Но я все еще уверен, что патч Бармина вы бы не применили ;)
1) Вас никто не оскорблял. Если вы в чем-то одном гений, то это не значит что во всем остальном — тоже, однако это не дает повода другим людям называть вас «нубом» — это как минимум не этично. У меня нет острой необходимости изучать shell скрипт, поэтому я его и не знаю. Это не мешает мне более чем успешно использовать убунту в качестве основной системы и выполнять несложные команды для достижения целей.
2) Не я один читаю это пост. Ваш «патч Бармина» может запустить кто угодно. Даже несмотря на крайне маленький шанс такого события в it-сообществе, такая вероятность все равно есть. Кстати, статьи на хабре видны извне и без аккаунта в системе, значит ваша шутка могла пойти и дальше — об этом вы не подумали?
3) Карма — имхо, показатель не сколько знаний, сколько адекватности человека. Ваши знания могут быть очень высокими в данной области, но преподнесли вы их так, что другим это не понравилось. Можно было дать простой вариант команды или указать на ошибку, верно? О чсв, кажется, стоит задуматься вам самому.
4) Насчет паранойи — во-первых, исходный скрипт все же немного изменен. Во-вторых, я не уверен, что он работает в 100% случаев и не удалит текущее ядро в каком-то особенном случае. И, конечно, мог бы не комментировать строчку удаления, потому что в моем случае все сработало корректно, однако, оказалось, что у ValdikSS данный код удалил бы текущее ядро. Почему же вы не указали на эту потенциальную проблему?
5) Нужность поста — вопрос, конечно, спорный. Я бы не написал его, если б не знал, что проблема актуальна. Но не мне судить, и не вам — решает само сообщество.
2) Не я один читаю это пост. Ваш «патч Бармина» может запустить кто угодно. Даже несмотря на крайне маленький шанс такого события в it-сообществе, такая вероятность все равно есть. Кстати, статьи на хабре видны извне и без аккаунта в системе, значит ваша шутка могла пойти и дальше — об этом вы не подумали?
3) Карма — имхо, показатель не сколько знаний, сколько адекватности человека. Ваши знания могут быть очень высокими в данной области, но преподнесли вы их так, что другим это не понравилось. Можно было дать простой вариант команды или указать на ошибку, верно? О чсв, кажется, стоит задуматься вам самому.
4) Насчет паранойи — во-первых, исходный скрипт все же немного изменен. Во-вторых, я не уверен, что он работает в 100% случаев и не удалит текущее ядро в каком-то особенном случае. И, конечно, мог бы не комментировать строчку удаления, потому что в моем случае все сработало корректно, однако, оказалось, что у ValdikSS данный код удалил бы текущее ядро. Почему же вы не указали на эту потенциальную проблему?
5) Нужность поста — вопрос, конечно, спорный. Я бы не написал его, если б не знал, что проблема актуальна. Но не мне судить, и не вам — решает само сообщество.
Я с вами совершенно согласен, в части, что любой обладающий базовыми знаниями линукса определит безвредность скрипта.
По-моему, «знание Линукса» и «знание Perl» не совсем одно и то же.
Вы писали о знаниях перл?
вы писали следующее:
«В скрипте из статьи нет ни одной завуалированной комманды, и по нему совершенно точно можно понять что он как минимум безвреден обладая базовыми знаниями линукса.»
По этому поводу я написал следующее:
«я с вами согласен… Потому не обладая этими самыми базовыми знаниями писать статью на хабре — глупо. Для этого есть раздел вопросов и ответов.»
Ведь автор не написал решение, а написал найденное решение у которого закомментирована ключевая строка и задал вопрос, а правильно ли я делаю дорогое хабрасоообщество.
А обладай он минимальными знаниями этот вопрос не возник бы.
А по делу, то он должен был задать этот вопрос в разделе «вопросы и ответы», он для того и предназначен.
А по поводу патча бармина и знаний перл я написал следующее
"… я на 100% был уверен в безобидности шутки"
вы писали следующее:
«В скрипте из статьи нет ни одной завуалированной комманды, и по нему совершенно точно можно понять что он как минимум безвреден обладая базовыми знаниями линукса.»
По этому поводу я написал следующее:
«я с вами согласен… Потому не обладая этими самыми базовыми знаниями писать статью на хабре — глупо. Для этого есть раздел вопросов и ответов.»
Ведь автор не написал решение, а написал найденное решение у которого закомментирована ключевая строка и задал вопрос, а правильно ли я делаю дорогое хабрасоообщество.
А обладай он минимальными знаниями этот вопрос не возник бы.
А по делу, то он должен был задать этот вопрос в разделе «вопросы и ответы», он для того и предназначен.
А по поводу патча бармина и знаний перл я написал следующее
"… я на 100% был уверен в безобидности шутки"
Можно просто в одну строчку
dpkg-query -l linux-image-* | grep ^ii | grep -v e-g | head -n -1 | awk '{ print $2 }' | xargs sudo aptitude -y purge
valdikss@valdesktop ~ $ dpkg-query -l linux-image-* | grep ^ii | grep -v e-g | head -n -1 | awk '{ print $2 }'
linux-image-2.6.35-28-generic
linux-image-2.6.38-ck1-val
valdikss@valdesktop ~ $ uname -a
Linux valdesktop 2.6.38-ck1-val #4 SMP PREEMPT Thu Mar 24 15:38:17 OMST 2011 i686 GNU/Linux
valdikss@valdesktop ~ $
Т.е. он удалит мое текущее ядро.
dpkg -l linux-image-* | grep ii | grep -v e-g | grep -v `uname -a | awk '{print $3}'` | awk '{ print $2 }'
dpkg -l linux-{image,headers}-* | grep ii | grep -v generic | grep -v `uname -a | awk '{print $3}'` | awk '{ print $2 }'
а это еще и headers удалит ненужные
а это еще и headers удалит ненужные
dpkg -l linux-{image,headers}-* | grep ii | grep -v generic | grep -v `uname -r` | awk '{ print $2 }'
еще короче
еще короче
А заголовки от текущего ядра системе не нужны?
А они не удаляться. uname -r выдает 2.6.38-ck1-val, что отсеивает и linux-image-2.6.38-ck1-val, и linux-headers-2.6.38-ck1-val
удалятся*
В чем я туплю?
leenq@leenq-laptop:~$ dpkg -l linux-{image,headers}-* | grep ii | grep -v generic | grep -v `uname -r` | awk '{ print $2 }'
linux-headers-2.6.35-22
linux-headers-2.6.35-23
linux-headers-2.6.35-24
linux-headers-2.6.35-25
linux-headers-2.6.35-27
linux-headers-2.6.35-28
leenq@leenq-laptop:~$ uname -r
2.6.35-28-generic
Хм. Раз у вас ядро -generic, то и хидеры должны быть 2.6.35-28-generic. Смотрю сейчас у себя на linux-headers-2.6.35-28 и linux-headers-2.6.35-28-generic — в не-generic хидеры от разных архитектур, но еще и хидеры некоторых драйверов, инклюды, а в -generic все для x86. Может быть, можно удалить не-generic, но не уверен. Вроде, -generic все дублирует.
не-generic в любом случае при компиляции не будет использоваться, если вы компилируете под -generic ядром.
Ага, понял, спасибо :) Выношу ваш вариант в конец поста как наиболее вероятный в качестве окончательного (с учетом того, что те, кто компилирует под другими ядрами сами разбираются в том, что делают).
Окончательный вариант будет такой:
dpkg -l linux-{image,headers}-* | grep ii | grep -v generic | grep -v `uname -r` | awk '{ print $2 }' | xargs apt-get -y purge
dpkg -l linux-{image,headers}-* | grep ii | grep -v generic | grep -v `uname -r` | awk '{ print $2 }' | xargs apt-get -y purge
Мне она хедеры всё таки снесла подчистую, пришлось вручную ставить. Снесла из-за пакета linux-headers-server, похоже.
Сейчас она хочет удалить вот такие пакеты:
linux-headers-2.6.35-28
linux-headers-server
linux-image-server
Сейчас она хочет удалить вот такие пакеты:
linux-headers-2.6.35-28
linux-headers-server
linux-image-server
Почему-то не работает, если не пишу два раза «sudo» (через «su» тоже никак; 10.04.2 x86-64).
Соответственно у меня вот какой вопрос: правильна ли строчка
sudo dpkg -l linux-{image,headers}-* | grep ii | grep -v generic | grep -v `uname -r` | awk '{ print $2 }' | xargs sudo apt-get -y purge
Или нужно второе sudo прямо перед «xargs» влепливать?
Соответственно у меня вот какой вопрос: правильна ли строчка
sudo dpkg -l linux-{image,headers}-* | grep ii | grep -v generic | grep -v `uname -r` | awk '{ print $2 }' | xargs sudo apt-get -y purge
Или нужно второе sudo прямо перед «xargs» влепливать?
dpkg -l linux-{image,headers}-* | grep ii | grep -v generic | grep -v `uname -r` | awk '{ print $2 }'
что-нибудь пишет? Sudo нигде больше не нужно. Попробуйте еще не xargs sudo, а sudo xargs. Перед dpkg sudo не надо.
что-нибудь пишет? Sudo нигде больше не нужно. Попробуйте еще не xargs sudo, а sudo xargs. Перед dpkg sudo не надо.
Ничего не пишет — появляется строка ввода.
sudo xargs работает так же, как и xargs sudo — выводится «0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.» — поэтому и хотел поинтересоваться, как правильнее писать.
sudo xargs работает так же, как и xargs sudo — выводится «0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.» — поэтому и хотел поинтересоваться, как правильнее писать.
Если появляется строка ввода — где-то не закрыта какая-нибудь кавычка. Вы уверены, что скопировали правильно? У меня все работает.
А, я о другом подумал. Тогда убирайте по одной команде с конца(вместе с |) и покажите, когда начнет что-нибудь писать.
Так у вас только одно ядро и стоит. uname -r вам скажет «2.6.32-30-generic»
Так и есть. Но мой вопрос был про расстановку sudo.
Я еще и ошибку нашел.
Окончательный вариант: dpkg -l linux-{image,headers}-* | grep ii | grep -v [a-z]-generic | grep -v `uname -r` | awk '{ print $2 }'
Окончательный вариант: dpkg -l linux-{image,headers}-* | grep ii | grep -v [a-z]-generic | grep -v `uname -r` | awk '{ print $2 }'
Странно, у меня в linux-headers-2.6.35-28-generic зависимость на linux-headers-2.6.35-28. Отсюда сносятся все хидеры, а от них и драйвер нвидии.
Поправил, спасибо. Я смотрю у многих возникают проблемы с заголовками, может их все-таки стоит исключить из удаления?
Можно и исключить. Тогда так:
dpkg -l linux-image-* | grep ii | grep -v [a-z]-generic | grep -v `uname -r` | awk '{ print $2 }'
dpkg -l linux-image-* | grep ii | grep -v [a-z]-generic | grep -v `uname -r` | awk '{ print $2 }'
Но ведь старые заголовки то незачем оставлять. В общем, вот мой вариант (подсмотрел в скрипте ubucleaner):
dpkg -l | grep ii | awk '{print $2}' | grep -E 'linux-(image|headers|ubuntu-modules|restricted-modules)' | grep -vE 'linux-(image|headers|restricted-modules)-(generic|i386|server|common|rt|xen)' | grep -v $(uname -r|sed 's/-*[a-z]//g'|sed 's/-386//g') | xargs apt-get -y purge
Хоть и длинный, но работать должен у всех =)
dpkg -l | grep ii | awk '{print $2}' | grep -E 'linux-(image|headers|ubuntu-modules|restricted-modules)' | grep -vE 'linux-(image|headers|restricted-modules)-(generic|i386|server|common|rt|xen)' | grep -v $(uname -r|sed 's/-*[a-z]//g'|sed 's/-386//g') | xargs apt-get -y purge
Хоть и длинный, но работать должен у всех =)
sudo aptitude purge ~ilinux-image-.*\(\!`uname -r`\)
>на случай если где-то допустил критическую ошибку
для этого есть два удобных трюка:
1. перед командой писать echo, тогда на экран выведется команда, которая бы запустилась. ее же можно прямо тут выделить и запустить.
2. Улучшенный вариант предыдущего трюка подходит для больших скриптов. В начале объявляем любую переменную ( dfg=echo ), и дальше перед всеми командами ставим эту переменную ( $dfg rm -rf ${DEFINETLY_NOT_ROT} ). В итоговом варианте просто делаем dfg= и все сразу работает.
для этого есть два удобных трюка:
1. перед командой писать echo, тогда на экран выведется команда, которая бы запустилась. ее же можно прямо тут выделить и запустить.
2. Улучшенный вариант предыдущего трюка подходит для больших скриптов. В начале объявляем любую переменную ( dfg=echo ), и дальше перед всеми командами ставим эту переменную ( $dfg rm -rf ${DEFINETLY_NOT_ROT} ). В итоговом варианте просто делаем dfg= и все сразу работает.
Я, может, лезу не в своё дело, но у меня убунта при очередном ежедневном обновлении просто взяла, спросила, и почистила список старых ядер. За что ей большое спасибо.
P.S. Natty 11.04 alpha.
P.S. Natty 11.04 alpha.
мда…
Как-то не понял я критерия определения, которе ядро старое, а которое не старое. У меня он предлагает удалить все ядра.
Ядра специально кладут в пакеты с разными именами, чтобы старые ядра не удалялись сами при обновлении, и после тестирования нового ядра можно принять решение об удалении старого.
Так что первый комментарий описывает этот рецепт довольно точно.
Как-то не понял я критерия определения, которе ядро старое, а которое не старое. У меня он предлагает удалить все ядра.
Ядра специально кладут в пакеты с разными именами, чтобы старые ядра не удалялись сами при обновлении, и после тестирования нового ядра можно принять решение об удалении старого.
Так что первый комментарий описывает этот рецепт довольно точно.
Первоначальный скрипт просто брал список ядер и вычитал из него одну строчку. Конечно, это несовсем верно, хотя в большинстве случаев сработает нормально. Потому я и закомментировал критическую строчку.
Сейчас из комментариев получился более корректный вариант, добавленный в конец поста: он берет список всех ядер (и заголовков) и исключает из него текущее.
Запускаете вы этот скрипт-команду в любом случае вручную и сознательно, т.к. он требует подтверждение прав (а если ваша система успешно заработала под новым ядром, то старые, в принципе, можно удалить?)
Сейчас из комментариев получился более корректный вариант, добавленный в конец поста: он берет список всех ядер (и заголовков) и исключает из него текущее.
Запускаете вы этот скрипт-команду в любом случае вручную и сознательно, т.к. он требует подтверждение прав (а если ваша система успешно заработала под новым ядром, то старые, в принципе, можно удалить?)
Не вижу особого смысла делать это автоматически, а вообще есть такая полезная программа ubuntu-tweak. Много чего умеет в том числе и очищать систему. Одним из пунктов является очистка старых ядер.
Вот не знаю почему, но данная софтина у меня всегда ассоциировалась со всякими:
- WindowsXP tweak
- Registry cleaner
- Fine tune your windows now
- Boot 10 times faster
- RAM cleaner
- Enlarge...
Очень зря. На самом деле достаточно удобная и простая софтина. По меньшей мере, с её помощью удобно добавлять PPA репозитарии на свежеустановленную систему. Ну всякие Skype, Kepass, Dropbox и т.д. и т.п.
Да их и так можно добавлять, без всяких дополнительных программ.
И да, не только из консоли.
И да, не только из консоли.
Можно, но так их искать не надо. Все популярные собраны в одном месте и разбиты по категориям.
Ну это уже «на любителя». Мне самому как-то привычнее добавлять, чем доверять программе с подозрительным названием.
Слово «tweak» в названии программы всегда меня настораживало :)
Слово «tweak» в названии программы всегда меня настораживало :)
> По меньшей мере, с её помощью удобно добавлять PPA репозитарии на свежеустановленную систему.
Полистал список PPA в Ubuntu Tweak, нашёл удобный bittorrent-клиент Flush, о котором раньше не знал.
Внешне понравился, буду пробовать. Спасибо.
Полистал список PPA в Ubuntu Tweak, нашёл удобный bittorrent-клиент Flush, о котором раньше не знал.
Внешне понравился, буду пробовать. Спасибо.
launchpad.net/computer-janitor поможет тебе удалить осиротевшие пакеты, плюс в 11.04 в основном меню только самое свежее ядро, остальные — в подменю
Для любителей Перла:
dpkg-query -l linux-{image,headers}-* | sudo apt-get -y purge $(perl -ne "split,print \$_[1],' ' if(/^ii/&&! /generic/&&! /\Q`uname -r`\E/)")
Вопрос немного «сбоку»… А как сразу после устанвки нового ядра запустить какой нибудь скриптик чтобы например пересобрался бинарный драйвер?
я юзаю для этого синаптик менеджер, поиск по linux-image и удаляю старые.
Ubuntu-tweak.
Не автоматически, зато когда приспичит.
Все равно нужно burg-update мне делать, т.к. grub только поддоном для burga служит.
Если автомат как-то криво сработает — можно остаться без ядра совсем. А это печально…
Не автоматически, зато когда приспичит.
Все равно нужно burg-update мне делать, т.к. grub только поддоном для burga служит.
Если автомат как-то криво сработает — можно остаться без ядра совсем. А это печально…
У меня под убунтой список ядер остался на месте, зато успешно убились дрова на видеокарту(nvidia).
Не все йогурты одинаково полезны.
Не все йогурты одинаково полезны.
Я не спец, но мне кажется просто достаточно переустановить дяро (синаптек или как там его, там поиск linux-image-generic правый клик на «Отметить для повторной установки»). У меня что-то было похожее когда я хотел повыёживатся и поставить какое-то более свежее ядро чем сама ставится типа 2.6.38)
Возможно можно из консольки, но я только недавно с виндовса :)
Возможно можно из консольки, но я только недавно с виндовса :)
Я использую ubucleaner скрипт www.ubuntugeek.com/ubucleaner-simple-bash-script-to-keep-your-ubuntu-system-clean.html
Работает юез нареканий. Кроме удаления ядер удаляет также stale пакеты.
Работает юез нареканий. Кроме удаления ядер удаляет также stale пакеты.
Не хватило вам терпения, но Шатлворд думает об этом…
После очередного обновления версии убунты, в грубе должна появиться строчка Previous Linux versions
habreffect.ru/files/486/2ad654be0/IMAG0086.jpg
После очередного обновления версии убунты, в грубе должна появиться строчка Previous Linux versions
habreffect.ru/files/486/2ad654be0/IMAG0086.jpg
Проблема же не только в том, что строчки со старым ядром занимают место в GRUB-меню.
Старые же ядра ещё и занимают место в /boot. И если под /boot на диске выделен отдельный маленький раздельчик, то он так скоро переполнится. А значит старые ядра не только нужно скрывать в меню, но и действительно удалять их с /boot раздела.
Старые же ядра ещё и занимают место в /boot. И если под /boot на диске выделен отдельный маленький раздельчик, то он так скоро переполнится. А значит старые ядра не только нужно скрывать в меню, но и действительно удалять их с /boot раздела.
Не запускайте, если есть проприетарные дрова для радеона. Выносит.
хотелось бы чтоб параллельно удалялись директории старых модулей в /lib/modules/
Да, бесит, когда я GRUB-е видишь огромное количество доступных ядер, но-таки не кажется ли вам, что стоить удалять все, кроме последних двух ядер, текущую и предыдущую. Ко мне не раз обращались обычные юзеры ( моя девушка, например) и я удалял смело все, кроме последней, но порой система работает с новым ядром не так хорошо, как ожидалось, например alsa подводит ( с alsa-ой проблем после апдейта не встречался, но были другие ошибки). Я все к тому, что как в Windows есть «Последняя удачная конфигурация», так и тут оставить путь к отступлению…
Мне — кажется, но, к сожалению, сделать такую выборку корректно еще сложнее :( Опять же большинству пользователей подойдет исходный вариант скрипта, где нужно «head -n -1» поправить на «head -n -2» — и это, по идее, сработает. Но во многих других отдельных ситуациях такой вариант будет неприятно фатален.
Спасибо за элегантное решение :)
Меня тоже одно время «беспокоил» растущий список загрузки в grub
Меня тоже одно время «беспокоил» растущий список загрузки в grub
В аську прислали коммент:
Конструкцию вида "… | grep ii |… | awk '{ print $2 }'" можно сократить до "… | awk /ii/'{print$2}'" и использовать стиль «apt-get -y purge `ИНСТРУКЦИЯ ВЫБОРКИ-РАЗБОРА`»
Конструкцию вида "… | grep ii |… | awk '{ print $2 }'" можно сократить до "… | awk /ii/'{print$2}'" и использовать стиль «apt-get -y purge `ИНСТРУКЦИЯ ВЫБОРКИ-РАЗБОРА`»
Sign up to leave a comment.
Автоматическое удаление старых ядер