воскресенье, 6 декабря 2009 г.

Инноватор ли Microsoft?

David A. Wheeler
26 марта 2001 c небольшими изменениями на 11 сентября 2006

Введение
Джим Оллчин, (бывший исполнительный директор MS – прим. перев.) пытается убедить правительство США, что программное обеспечение (ПО) с открытыми исходными кодами (или, по крайней мере, Общественная публичная лицензия – General Public License) это угроза для США и интеллектуальной собственности. При этом одним из его аргументов служит утверждение, что ПО с открытым исходным кодом представляет собой угрозу для инноваций. В своих последних “судебных разбирательствах”, Microsoft также использует аргумент “инноваций” в качестве оправдания для своих собственных (хорошо известных и признанных судом незаконными) методов ведения бизнеса.
Однако после изучения приводимых ими доказательств, я сделал вывод, что Microsoft в реальности НЕ является инноватором, поэтому ее претензии на отмену решений суда, потому что “они инноваторы” явно не обоснованны. Суд определил, что методы ведения бизнеса Microsoft незаконны: популярность ее продуктов вызвана отнюдь не инновациями, а тем, что она “подсаживает” клиентов на свой продукт (ведь без клиентов не будет прибыли) [*]. Однако это не делает из Microsoft новатора, по крайней мере, в области IT-технологий. Нет ничего плохого в том, что какая-то компания не является новатором. Но для отмены судебных решений о наказании за незаконную деятельность и накладывании новых ограничений на конкурентов через суд (как они это любят делать – прим. перев.), должны быть серьезные доказательства наличия инноваций.
Ниже я приведу доказательства того, что:

  1. Ни одна из ключевых инноваций программного обеспечения не является собственной разработкой компании Microsoft;
  2. Все важные продукты Microsoft в основном представляют собой копии существовавших ранее продуктов, и
  3. Существующие ключевые технологии Microsoft также не являются инновационными.

Microsoft не является новатором, и поэтому она не должна использовать термин “инновации” ни для защиты собственных интересов, ни в качестве аргумента для убеждения других в том, что ПО с открытым исходным кодом (ОSS) представляет собой угрозу для процесса создания инноваций (поскольку для подтверждения этого нет никаких серьезных доказательств).
Но для начала мы должны определить термин “инновация”. “Инновацией” не является простое комбинирование нескольких функций в одном продукте – это описывается термином “интеграция” и не требует каких-либо “инноваций”, а только серьезного объема работы. В частности, если компания интегрирует функции в один продукт для того, чтобы препятствовать своим клиентам использовать конкурирующие продукты (хорошо известная практика Microsoft) – то это “хищничество”, а не инновации.
“Инновация” – это не конечный продукт, хотя некий продукт может реализовать или иметь в своем составе какие-то инновации. Новая реализация какого-то продукта, созданная для того, чтобы, например, сделать то же самое, но на другом компьютере (системе, архитектуре), также не является инновацией. Инновация – это новая идея. И в данном контексте, имеется в виду что это новая идея в технологиях ПО.

Microsoft никогда не являлась разработчиком своего основного программного обеспечения

Ну что ж, давайте попробуем определить понятие “наиболее важные (ключевые) технические нововведения в области программного обеспечения” и увидеть, автором каких из них является Microsoft. Несколько лет назад я заинтересовался темой того, “что являлось наиболее важными инновациями в программном обеспечении”, и поэтому составил собственный список различных событий, имеющих отношение к компьютерному миру. Я использовал множество различных источников, чтобы не упустить ничего важного. Например, я использовал информацию из архива истории компьютеров IEEE (IEEE - институт инженеров электрики и электроники – прим. перев.), виртуальный музей вычислительной техники и интернет-хронологию Гоббса. Я не обнаружил существования общепринятого списка наиболее важных инноваций в программном обеспечении, поэтому возможно, что это самый точный список. Понятно, что до 1975 года у Microsoft не могло быть никаких инноваций, так как они тогда только появились, но я хотел создать список ключевых инновационных технологий в ПО вообще, потому что так нагляднее можно увидеть, что именно они собой представляют. Таким образом становится очевидно, что то, что некоторые принимают за инновации Microsoft, на самом деле существовало задолго до ее появления.
Мои результаты (список основных инноваций в программном обеспечении), приведены здесь (чуть позже постараюсь осилить перевод и его – прим. перев.). Список интересен тем, что он включает в себя графический пользовательский интерфейс, текстовые процессоры и многое другое, что мы принимаем сегодня как должное. Ничего из приведенного там не было создано Microsoft. Проще говоря, нет никаких доказательств того, что Microsoft когда-либо создавала какие-либо важные инновации в ПО.
Некоторые из приведенных инноваций являются необходимыми для создания продуктов, однако этот уровень достигается каждым программистом, разрабатывающим какой-либо продукт (независимо от того, создаются проприетарные продукты или свободное/открытое ПО). И, наоборот, некоторые из приведенных инноваций (например, TCP/IP и World Wide Web) первоначально были реализованы и распространялись как свободное/открытое ПО. Если вы хотите увидеть реальные инновации, то свободное/открытое ПО имеет лучший послужной список по количеству инноваций, чем программное обеспечение Microsoft.

Продукты Microsoft не инновационны

Ниже я привел то, что я понимаю как ключевые продукты Microsoft, и обнаружил, что ни один из них не является принципиально инновационным, либо это просто новая реализация уже существующих продуктов:

  1. Бейсик/BASIC: Microsoft появилась в 1975 году, но сам BASIC был изобретен еще в 1964 году, да и то был лишь еще одним из многих языков программирования.
  2. В 1981 г Microsoft выпустила MS-DOS. Данное название было просто новым именем данным Microsoft для QDos – “Quick and Dirty Operating System” (”Операционная система сделанная кое-как, на скорую руку, дешево и сердито” – прим. перев.), написанной Тимом Патерсоном из Seattle Computer Products за 6 недель незадолго до этого. Патерсон написал QDos с помощью купленного им руководства для CP/M и использовал это руководство в качестве основы для своей собственной программы, поэтому QDos сама по себе не несла ничего нового. Когда IBM вела c Microsoft переговоры относительно нового ПО для своих новых PC, Microsoft быстро купила QDos и переименовала его, что и позволило ей заключить сделку с IBM (это отражено в фильме “Пираты Кремниевой долины” – прим. перев.). Естественно, такое понятие операционной системы устарело уже в 1981 году, так что MS-DOS никак не тянет на инновацию. Позже, Microsoft добавила в нее такие функции, как поддержка каталогов, но они так же не были чем-то новым и их идея была взята из другой операционной системы (UNIX).
  3. Windows: В 1983 году Microsoft объявила, что она будет заниматься разработкой Windows. Windows 1.0 была окончательно выпущена ноября 1985 года (с двухлетним опозданием), но она работала очень плохо и имела мало приложений. Так было пока не наступило 22 мая 1990 года, когда была выпущена Windows 3.0, которая получила всеобщую поддержку и признание. Интерфейс Windows сильно напоминал интерфейс Apple Macintosh, который, в свою очередь, напоминал интерфейс Xerox PARC, который напоминал оригинальное изобретение Дугласа Энгельбарта, сделанное еще в 1968 году (графический интерфейс с использованием мыши). Поскольку Windows являлась копией Macintosh, который также базировался на основе более ранних работ, Windows также не может считаться инновацией.
  4. Windows NT/2000: В Microsoft Windows NT наконец-то появилась (с ограничениями) возможность многопользовательской работы и возможность защиты памяти, что позволяло использовать ее для работы в качестве сервера, однако это было сделано с обильным заимствованием идей из уже существовавших VAX VMS и UNIX-систем (которые также не были первыми из подобных операционных систем).
  5. Word: Это просто еще один текстовый процессор, который Microsoft начала разрабатывать в 1983 году. Lexitron и Linolex разработали в 1972 году первую экран-ориентированную систему обработки текстов, уже существовавшую до Microsoft и точно также им предшествовал WordStar (1979).
  6. Excel: табличный процессор, реализованный существенно позже своих предшественников - VisiCalc (1978) и Lotus 1-2-3.
  7. Access: Еще одна система баз данных. Поскольку она является реляционной, основная инновация которую она она воплощает – это модель Кодда, которая была разработана в 1970 году (Microsoft тогда еще не существовало).
  8. Internet Explorer (IE): Internet Explorer не является оригинальной разработкой Microsoft, он всего лишь слегка расширенный в возможностях старый веб-браузер NCSA Mosaic. По меньшей мере, до версии 5.5. выбрав пункт меню “Неlp”-”About” можно было увидеть, он основан на NCSA Mosaic. NCSA Mosaic (TM) был разработан в Национальном центре суперкомпьютерных приложений (NCSA) при университете Иллинойса в Урбана-Шампейн (the University of Illinois at Urbana-Champaign). Распространялся данный браузер по лицензионному соглашению со Spyglass, Inc. Резюме – веб-браузеры (и IE) не являются инновацией Microsoft.
  9. Active Directory: это еще одна реализация Lightweight Directory Access Protocol (LDAP), который восходит к концу 80-х годов (задолго до “Active Directory”), с собственным вариантом MIT Kerberos от Microsoft. Резюме, тоже никаких серьезных инноваций.

Есть, конечно, и другие продукты Microsoft, просто я не могу их все перечислить в столь короткой статье. Но конечно, если Майкрософт когда-нибудь создаст какой-нибудь свой собственный инновационный продукт, то он мог бы стать одним из лучших в ряду себе подобных. Вместо этого, мы находим, что основные продукты Microsoft – это большей частью реализации ранее существовавших продуктов. Нет ничего плохого в попытке повторного воссоздания таких же продуктов чуть лучше и дешевле, чем кто либо другой, а пользователи даже рады видеть данный тип конкуренции! Однако, это НЕ инновации.

Технологии Microsoft не инновационные

Даже если весь продукт не является инновационным в целом, он может включать в себя (реализовывать) некоторые инновации. Ведь так или иначе разработчики все равно привносят какие-то инновации; грубо говоря, разработчик тщательно продумывает каждую деталь и наверняка привносит в работу свои идеи.
Итак, давайте взглянем на некоторые технологии от Microsoft, и посмотрим, есть ли у них какие-либо инновации, которые значительно лучше, чем у других компаний или в свободном/открытом ПО:

  1. COM/DCOM: Это основные механизмы коммуникации в Windows, которые позволяют программам находить, вызывать друг друга и поддерживать “компонентное программирование”. Однако, это просто еще одна реализация удаленного вызова процедур (RPC), конечно же не первая, и к тому же COM даже не может работать по сети!
  2. SMB/CIFS: Протокол Microsoft для обмена файлам и работы с принтерами. Но не они изобрели его. Дополнительные сведения об этом приведены здесь
  3. . NET: Часто бывает затруднительно прийти к соглашению об определении .NET, что затрудняет его анализ. Наилучшее описание я нашел здесь – Sean Wilson’s “.NET – So What? (в оригинале приведена нерабочая ссылка – прим. перев.) Здесь говорится: “.Net – общее название для огромного количества различных инициатив Microsoft, включающее в себя несколько направлений: средства разработки, серверы, клиенты, веб-служб XML. Приложения исполняются внутри “.NET Framework”, которая по существу является аналогом Java (поддержка загрузки кода с использованием промежуточного формата). .NET Framework целенаправленно разработан для поддержки нескольких языков программирования, что не являлось целью разработки Java. Но в то же время инфраструктура Java также поддерживает несколько языков и разные устаревшие технологии (такие, как UCSD p-код и ANDF), которые были специально разработаны для этого много лет назад. В начале своей статьи он говорит, что .NET не особенно инновационен по идеям… Многие из заложенных в него идей уже были реализованы ранее и прекрасно известны.
  4. Сводные таблицы: В 1986 году Пито Саласу пришла в голову идея сводных таблиц в электронных таблицах, когда он работал в Lotus Development Corporation Group. Они были продемонстрированы в 1987 году, и программы, в которых они были реализованы (ныне Lotus Improv) были выпущен в 1988 году. Lotus Improv был выпущен для Windows в 1993 году. В Excel сводных таблиц не было до релиза Excel 97. (Source: “Pivot Table Data Crunching” by Bill Jelen and Michael Alexander).

Некоторые могут заметить, что у Microsoft имеются некоторые патенты. К сожалению, патенты на программное обеспечение, не свидетельствуют об инновациях, а говорят только о том, что заявитель имеет достаточно денег, чтобы представить многие патентные заявки. База данных существующих работ в области программного обеспечения, используемая патентными экспертами, является неадекватной, причем экспертам в данной области, как правило, платят меньше, чем остальным (что снижает их количество и квалификацию), патентные эксперты имеют очень мало времени для рассмотрения каждой заявки на патент и большой соблазн просто принять заявку (с незначительными изменениями), чем отклонять запрос как некорректный. В результате, часто предоставляются патенты в области программного обеспечения на уже существующие или очевидные идеи. Действительно, США в 2007 году решение Верховного суда усилило внутренние правила проверки патентов на “очевидность”, потому что многие патенты были предоставлены на очевидные идеи, в результате чего действие таких патентов, вероятно, неосуществимо. Даже если вы и примете такую неправдоподобную идею о том, что патенты на программное обеспечение отражают инновации и захотите сравнить количество идей с разработчиками свободного/бесплатного ПО, то станет ясно, почему многие лидеры в области свободного ПО сильно озадачены вопросами применения патентов. Это наводит на мысль о том, что подсчет патентов из сообщества свободного ПО по-прежнему не позволит провести беспристрастное сравнение количества идей (потому что там не принято патентовать идеи и поэтому нельзя использовать патенты как сравнительный показатель количества идей – прим. перев.). Многие страны не позволяют патентовать идеи в ПО, но в США это возможно, а также там существует целый ряд организаций, которые противостоят идее патентов на ПО. Более подробную информацию о проблемах с патентами на программное обеспечение, можно посмотреть на сайте таких организаций, как League for Programming Freedom (Лига за свободу программирования).

Заключение

Я показал, что:

  1. Ни одна из существующих инноваций программного обеспечения не была предложена Microsoft,
  2. Ключевые продукты Microsoft – в основном копии существующих продуктов, и
  3. Ключевые технологии Microsoft не являются инновационными.

Microsoft всегда “висели на хвосте” у тех, кто является реальными инноваторами. Возможно, Microsoft имеет талант в мелочах, но нет абсолютно никаких доказательств того, что они более талантливы, чем какая-либо другая группа разработчиков.

Я не считаю плохой компанию, которая не является инновационной. В конце концов, цель Microsoft (или любой другой компании) – зарабатывание денег для своих акционеров, а не создание инноваций. Но утверждать, что вы инноватор, если вы им не являетесь – лицемерно. Оправдание незаконных действий во имя инноваций, когда этих инноваций не было — лицемерно вдвойне. И, если этот аргумент является центральным для убеждения правительства в том, что ему не следует поощрять свободное/открытое ПО, то простой анализ быстро приводит к выводу о его (аргумента) неправильности.

Только Microsoft, кажется, считает, что свободное/бесплатное ПО является основной проблемой для компьютерной индустрии. Множество ключевых нововведений пришли из сообщества свободного/бесплатного ПО, включая практически весь Интернет, поэтому очевидно, что такое ПО стимулирует инновации, а не наоборот. С другой стороны, свободное ПО получило в настоящее время широкое признание, и тому есть много причин. Например, многие крупные компании (такие как IBM, HP и Sun) осуществляют поддержку открытых проектов. Даже аналогичные Microsoft компании, продающие проприетарное программное обеспечение, такие как Oracle, находят способы, чтобы взаимодействовать со свободными проектами.

В этом контексте, заявление Оллчина:”меня волнует поддержка правительством ПО с открытым исходным кодом и я не думаю, что у нас есть достаточно грамотных политиков, чтобы понимать данную угрозу”, имеет скрытый подтекст.

Вместо этого создается ощущение, что Microsoft просто не хочет изменить свою бизнес-модель с учетом изменяющихся условий окружающей среды и желаний своих клиентов. Это слишком плохо, ведь ничто не мешает Microsoft изменить свой подход к ведению бизнеса. Ну что ж, многие ранее существовавшие монополии сделали ту же ошибку. Я не против Microsoft и я не против проприетарного программного обеспечения. Более того, я рад похвалить Microsoft или любую другую компанию, если она делает хорошие и правильные вещи. Однако, меня беспокоит, когда любая организация делает такие явно неправдоподобные заявления. И тем более неправильно, что Microsoft оправдывает свои незаконные действия, претендуя на инновации, которых у них никогда не было.

(c) Copyright by D. Wheeler
Перевод А. Чернышев



Источник: freeschool.altlinux.ru.

вторник, 1 декабря 2009 г.

Аналог reply-to из PF в IPFW

Нашел интересную статью с описанием работы межсетевого экрана IPFW. В частности, упомянута реализация действия, аналогичного reply-to из PF:
«
Тот факт, что на самом деле "перепрыгивание" выполняется на параметры действия, позволяет использовать это для интересных вещей. В частности, с использованием появившегося во FreeBSD 6.2 параметра tag на каждый пакет можно навешивать внутриядерный тег, что в применении со skipto позволяет сделать, к примеру, запоминание, с какого шлюза пришел входящий пакет на машине с каналами к двум разным провайдерам, и ответные пакеты отправлять в тот канал, откуда они пришли (допустим, у вашей машины только один IP-адрес, и сделать fwd на базе внешнего адреса не получится), т.е. реализовать аналог reply-to из PF:

ipfw add 100 skipto 300 tag 1 in recv $ext_if1 keep-state
ipfw add 200 skipto 300 tag 2 in recv $ext_if2 keep-state
ipfw add 300 allow { recv $ext_if1 or recv $ext_if2 } # входящие снаружи
ipfw add 400 allow in recv $int_if # разрешить ответы на внутреннем проходе
ipfw add 500 fwd $gw1 tagged 1 # остались ответы на внешнем интерфейсе,
ipfw add 600 fwd $gw2 tagged 2 # зарулим их куда надо
»

суббота, 28 ноября 2009 г.

Трансляция PPTP (GRE) на шлюзе с PF

Как известно, межсетевой экран PF, портированный в FreeBSD из OpenBSD, не может корректно транслировать (NAT) GRE-протокол и, к примеру, из локальной сети невозможно создать несколько одновременных соединений к внешнему серверу VPN PPTP.
Одним из способов решения проблемы является трансляция PPTP-соединений родным IPFW с «ядерным» NAT. При этом вовсе необязательно компилировать ядро. Все описанные действия проверены в FreeBSD версии 7.2. Но должно работать и в других версиях, где есть поддержка «ядерного» NAT для IPFW.

В «/etc/rc.conf» добавляем

#Включаем IPFW
firewall_enable="YES"
# Подгружаем модуль ядра ipfw_nat
firewall_nat_enable="YES"
# Указываем путь к скрипту загрузки правил
firewall_script="/etc/ipfw.script"
Создаем файл «/etc/ipfw.script»
#!/bin/sh

/sbin/ipfw -q /dev/stdin <<RULES
flush
#em0 - внешний интерфейс шлюза
nat 10 config if em0
#Правила для трансляции PPTP-соединения
add 10 nat 10 gre from any to any
add 11 nat 10 tcp from any to any dst-port pptp
add 12 nat 10 tcp from any pptp to any
# Разрешаем весь трафик
add allow all from any to any

RULES
Делаем скрипт исполняемым
# chmod +x /etc/ipfw.script
Добавляем в правила PF
# Запрещаем PF транслировать PPTP-соединения
no nat on $external_if proto gre all
no nat on $external_if proto tcp from any to any port = pptp
no nat on $external_if proto tcp from any port = pptp to any

... skip ...

# Пропускаем PPTP-соединения
pass quick on $external_if inet proto tcp from any to any port 1723
pass quick on $external_if inet proto tcp from any port 1723 to any
pass quick on $external_if inet proto gre from any to any
После всех сделанных изменений перезагружаемся.

четверг, 26 ноября 2009 г.

Неужто??!

Чиновникам велено осваивать безбумажные технологии

Цитата: «Через год чиновникам будет запрещено требовать от граждан справки, если эти данные уже есть в государственных или муниципальных информационных фондах. Такое решение принято российским правительством. Это означает, что ведомства должны будут сами обмениваться необходимой информацией, а не заставлять граждан стоять в бесконечных очередях. Это, кстати, - составная часть той самой программы "электронного правительства", о которой в своем послании говорил и президент Дмитрий Медведев.»

Не верю!

вторник, 24 ноября 2009 г.

debconf и /tmp с флагом noexec

Если раздел «/tmp» смонтирован с флагом noexec в процессе установки пакетов на этапе предварительной настройки появляются ошибки, похожие на такую

Can't exec "/tmp/fprobe-ulog.config.48931": Permission denied at /usr/share/perl/5.10/IPC/Open3.pm line 168.
open2: exec of /tmp/fprobe-ulog.config.48931 configure failed at /usr/share/perl5/Debconf/ConfModule.pm line 59
не удалось выполнить начальную настройку пакета fprobe-ulog, код ошибки 255
На launchpad.net подобный багрепорт уже добавлен. Как временное решение в конфиг «/etc/apt/apt.conf» добавляем строку
APT::ExtractTemplates::TempDir "/var/tmp";
предписывающую aptitude и apt-get использовать директорию «/var/tmp» вместо «/tmp».

суббота, 14 ноября 2009 г.

Запрет запуска второй копии скрипта

Пример кода с пояснениями

#!/bin/sh

pid_file=/tmp/script-name.pid

#########################
# Создаем файл с правом только на чтение
# и вписываем туда идентификатор процесса (pid)
umask 333
(echo $$ > "$pid_file") 2>/dev/null

#########################
# Если процесс уже запущен, то попытка записи pid
# в файл будет завершена с ошибкой
if [ $? -ne 0 ]
then
umask 22

echo "Already started :("
exit 1
fi

umask 22
#########################
# Что-то долго делаем...
#########################

#########################
# Удаляем файл с pid
rm -f "$pid_file"

воскресенье, 1 ноября 2009 г.

WiFi vs Ubuntu Karmic Koala

Радость от обновления Ubuntu на своем ноутбуке (Dell Vostro A860) до версии 9.10 Karmic Koala омрачилась нерабочим вайфаем. Причем в логах наблюдалась абсолютная тишина. Модуль ath5k грузится без ошибки и правильно распознает чип от Atheros. А Network Manager скупо пишет "Устройство не готово".
После продолжительного гугления выяснилось, что все дело в некорректной работе функциональной кнопки (Fn + F11), отвечающей за включение/отключение вайфая и блютуза. К слову – я им никогда и не пользовался, так как казалось, она как-то не так работает.

$ tail /sys/class/rfkill/*/{state,name,type,persistent}
==> /sys/class/rfkill/rfkill1/state <==
0

==> /sys/class/rfkill/rfkill2/state <==
0

==> /sys/class/rfkill/rfkill3/state <==
0

==> /sys/class/rfkill/rfkill1/name <==
phy0

==> /sys/class/rfkill/rfkill2/name <==
dell-wifi

==> /sys/class/rfkill/rfkill3/name <==
dell-bluetooth

==> /sys/class/rfkill/rfkill1/type <==
wlan

==> /sys/class/rfkill/rfkill2/type <==
wlan

==> /sys/class/rfkill/rfkill3/type <==
bluetooth

==> /sys/class/rfkill/rfkill1/persistent <==
0

==> /sys/class/rfkill/rfkill2/persistent <==
0

==> /sys/class/rfkill/rfkill3/persistent <==
0
Как видим, rfkill1 и rfkill2 имеют тип wlan. Состояние (state) у обоих равно 0, означающему SOFT LOCK. Кроме состояния 0 могут быть 1 и 2, UNLOCK и HARD LOCK соответственно.
Вся проблема состоит в том, что при нажатии на упомянутую ранее функциональную кнопку состояние переключается только между значениями SOFT LOCK и HARD LOCK, минуя UNLOCK. Из-за этого блокируется переход интерфейса файвая в активный режим, наглядно демонстрируемый командой
$ sudo ifconfig wlan0 up
SIOCSIFFLAGS: Unknown error 132
Решение состоит в принудительном переводе в состояние UNLOCK.
Для этого пишем простой скрипт
#!/bin/sh

for i in /sys/class/rfkill/rfkill*/type;
do
type="`cat $i`"
if [ "$type" = "wlan" ];
then
n="`echo $i | sed -r 's%/type$%%'`";
echo 1 > ${n}/state;
fi;
done;
Сохраняем скрипт в файл «/usr/local/sbin/unlock-wlan» и делаем его исполняемым
$ sudo chmod +x /usr/local/sbin/unlock-wlan
После ручного запуска скрипта надо перезапускать Network Manager – иначе он ничего не заметит.
Теперь настраиваем Upstart для исполнения нашего скрипта при загрузке системы, перед стартом Network Manager. Для этого создаем файл «/etc/init/unlock-wlan.conf»
# unlock-wlan - unlock wireless device
#

description "unlock wireless device"

# Скрипт запускается перед настройкой сетевых интерфейсов
start on starting networking

task

exec /usr/local/sbin/unlock-wlan

пятница, 30 октября 2009 г.

воскресенье, 4 октября 2009 г.

Ответ на свой вопрос, заданный министру связи РФ

На днях я по электронной почте получил ответ на вопрос, заданный в ходе онлайн-конференции министра Щеголева Игоря Олеговича 2 сентября сего года. Чем был несколько удивлен.
Собственно сам текст вопроса таков: «Когда на Дальнем Востоке (к примеру - в Якутии) появятся ДОСТУПНЫЕ безлимитные тарифы, а не 2 рубля за мегабайт? До сих пор в Якутске ни у одного из интернет-провайдеров нет вменяемых цен, не говоря уже о доступных простому человеку безлимитных тарифах. У всех цена за мегабайт крутится около двух рублей, с небольшой разницей. Для сравнения - в Москве безлимитный тариф стоит от ста рублей. У нас же - триста рублей - только абоненская плата без учета интернет-трафика.»

Вопрос видимо переадресовали ОАО «Дальсвязь», владельцу самого крупного интернет-провайдера Якутии ОАО «Сахателеком».
Ответ был таков: «Уважаемый абонент!
К сожалению, на сегодняшний день «ОАО Сахателеком» не имеет возможности предоставить безлимитные тарифные планы по доступным ценам для массового рынка. Сложившаяся ситуация обусловлена несколькими объективными факторами, в т.ч. отсутствием у ОАО «Сахателеком» собственной технической инфраструктуры (собственных зоновых цифровых каналов связи (ВОЛС, ЦРРЛ) на большинстве направлений), а также высокой стоимостью аренды каналов по этим направлениям как цифровых, так и спутниковых.
Тем не менее, ОАО «Сахателеком» проводит целенаправленную политику по повышению привлекательности тарифных планов на услуги доступа в интернет для пользователей с целью увеличения проникновения на рынок ШПД: снижает тарифы на подключение к услугам ШПД, вводит более привлекательные тарифные планы на интернет-трафик и т.д.

_____________________________________
Департамент информационно-аналитического обеспечения ОАО "Дальсвязь"
тел. (4232) 208 500, доб. 1100, 1101, 1102, 1104
факс (4232) 40 80 30
http://www.dsv.ru»

Только вот совсем незаметно то, что «Сахателеком» снижает свои цены.

воскресенье, 20 сентября 2009 г.

Онлайновые сервисы для сисадмина

Создал сайт «ping.propheta.ru» с онлайновыми сервисами для системных администраторов. Пока доступны только два сервиса «IP Calculator» и «Сведения о посетителе». Но в дальнейшем планирую добавить ещё.
Буду рад если выскажете свои пожелания и предложения по развитию сайта.

UPD: Добавил сервис WHOIS. Через него можно получить информацию как по IP-адресу, так и по доменному имени.

суббота, 8 августа 2009 г.

ЛОР отжигает :)

Порадовал коммент новости из ЛОРа о покупке гуглом On2 – разработчика кодеков и алгоритмов для сжатия видео, в своё время разработавшего и открывшего исходные коды VP3 (будущий кодек theora):

Открыть кодек - $106.5 млн.
Дать пинка m$ и adobe с их flash и $ilverlight - бесценно.

суббота, 27 июня 2009 г.

Какой дистрибутив установлен linux на компьютер

можно узнать с помощью утилиты lsb_release.
Пример использования

$ lsb_release -irc
Distributor ID: Ubuntu
Release: 9.04
Codename: jaunty
Если этой утилиты в исследуемой системе нет, то версию дистрибутивов, основанных на Debian/RedHat/Gentoo можно узнать так (спасибо Ярославу Шаповалу)
$ cat /etc/*release*
в дистрибутивах, основанных на Slackware
$ cat /etc/slackware-version
в SUSE
$ cat /etc/issue

суббота, 13 июня 2009 г.

Настройка DHCP клиента в Ubuntu

Дополнительная настройка DHCP-клиента может понадобится когда у вас есть локальный DNS-сервер или если DHCP-сервер провайдера работает с перебоями.

Пример файла конфигурации «/etc/dhcp3/dhclient.conf»

#
# dhcp3-client 3.1.1-5ubuntu8
#
# Сюда вписываем локальный адрес DNS-сервера
prepend domain-name-servers 127.0.0.1;

# Какие данные нужно затребовать с DHCP-сервера
request subnet-mask, broadcast-address, time-offset, routers,
# Комментируем, так как у нас локальный DNS-сервер
# domain-name, domain-name-servers, domain-search, host-name,
netbios-name-servers, netbios-scope, interface-mtu,
rfc3442-classless-static-routes, ntp-servers;

#
# dhclient будет использовать эти настройки, в то время,
# когда недоступен DHCP-сервер провайдера.
#
# Если не знаете что писать - загляните в файл
# /var/lib/dhcp3/dhclient.leases
#
lease {
interface "eth1";
fixed-address 72.xxx.xxx.xxx;
option subnet-mask 255.255.xxx.xxx;
option time-offset 32400;
# Если прописать адреса роутеров, dhclient проверит наличие
# первого роутера. В случае, если роутер не ответил
# на пинг, этот блок (lease) отбрасывается.
option routers 72.xxx.xxx.1;
option dhcp-lease-time 1800;
option dhcp-message-type 5;
option domain-name-servers 127.0.0.1;
option dhcp-server-identifier 72.xxx.xxx.xxx;
# По документации следующие строки должны быть
# в обязательном порядке. Время желательно
# выставить как можно большее, чтобы не стало
# просроченным.
renew 2 2037/01/12 00:00:00;
rebind 2 2037/01/12 00:00:00;
expire 2 2037/01/12 00:00:00;
}
Более подробно о других настройках можно прочитать в «man dhclient.conf»

понедельник, 8 июня 2009 г.

Работа Ubuntu Linux без носителя

Нужно было добиться загрузки Ubuntu в оперативную память компьютера и дальнейшей работы без носителя, с которого он был загружен. Решение получилось достаточно простым.
Вкратце идея такая: initrd.img изменяется так, чтобы, после загрузки и старта ядра, с носителя в память копировался файл со сжатым образом файловой системы корневого раздела (SquashFS). Далее поверх корневого раздела монтируется aufs-tmpfs и стартует Ubuntu.

Ниже будет описание как создать загрузочный iso-образ и бутовую USB-флешку.

  1. Создаем директории
    $ mkdir -p ~/ubuntu-ram/{etc,tmp,image,scripts}

  2. Устанавливаем необходимые пакеты
    $ sudo aptitude install lilo mtools genisoimage debootstrap syslinux squashfs-tools

  3. Копируем настройки initramfs
    Конфиги initramfs для iso-образа
    $ cp -a /etc/initramfs-tools ~/ubuntu-ram/etc/iso
    Конфиги initramfs для iso-образа
    $ cp -a /etc/initramfs-tools ~/ubuntu-ram/etc/usb

  4. Настраиваем окружение загружаемой системы
    $ export IMGROOT=~/ubuntu-ram/image
    $ sudo -E -s
    # debootstrap jaunty $IMGROOT http://mirror.ubuntu.optilink.ru/ubuntu/
    # echo "aufs / aufs rw 0 0" > $IMGROOT/etc/fstab
    # cp /etc/apt/sources.list $IMGROOT/etc/apt/
    # cp /etc/resolv.conf $IMGROOT/etc/
    # cat <<EOF > $IMGROOT/etc/hosts
    127.0.0.1 localhost.localdomain localhost
    127.0.1.1 hostname.domain hostname
    EOF

    # cat <<EOF > $IMGROOT/etc/network/interfaces
    auto lo
    iface lo loopback
    EOF

    # echo "hostname.domain" > $IMGROOT/etc/hostname
    # mount -t proc none $IMGROOT/proc
    # mount -o bind /dev $IMGROOT/dev
    # mount -t devpts none $IMGROOT/dev/pts
    # mount -t sysfs none $IMGROOT/sys
    Входим в изолированное окружение
    # chroot $IMGROOT bash
    Создаем аккаунт администратора и русскую локаль. Также разрешаем группе adm использование команды sudo
    # adduser --gecos 'System Administrator' demiurg
    # usermod -a -G adm demiurg
    # echo "@adm ALL=NOPASSWD: ALL" >> $IMGROOT/etc/sudoers
    # locale-gen ru_RU.UTF-8
    Устанавливаем ядро и требуемые утилиты
    # aptitude update
    # aptitude install linux-image-server grub aufs-tools squashfs-tools
    Настраиваем часовой пояс и консоль
    # dpkg-reconfigure tzdata
    # dpkg-reconfigure console-setup
    Далее система настраивается под себя (ставим дополнительные программы, правим конфиги под себя).

    Выходим из изолированного окружения
    # aptitude clean
    # exit
    Отмонтируем файловые системы
    # umount $IMGROOT/proc
    # umount $IMGROOT/dev/pts
    # umount $IMGROOT/dev
    # umount $IMGROOT/sys
    Выходим из режима суперпользователя
    # exit
    $

  5. Переходим к настройке конфигов initramfs для iso-образа
    Создаём так называемый хук (hook) - скрипт, вызываемый утилитой initramfs
    $ cat <<EOF > $IMGROOT/../etc/iso/hooks/load_modules
    #!/bin/sh
    set -e

    PREREQ=""

    prereqs () {
    echo "$PREREQ"
    }

    case $1 in
    prereqs)
    prereqs
    exit 0
    ;;
    esac

    . /usr/share/initramfs-tools/hook-functions

    force_load squashfs
    force_load isofs
    force_load aufs

    exit 0
    EOF
    $ chmod +x $IMGROOT/../etc/iso/hooks/load_modules
    Создаем скрипты, выполняющиеся во время загрузки initrd
    Скрипт, закидывающий образ системы в память
    $ cat <<EOF > $IMGROOT/../etc/iso/scripts/init-premount/udev_into_ram
    #!/bin/sh

    PREREQ=""

    prereqs () {
    echo "$PREREQ"
    }

    case $1 in
    prereqs)
    prereqs
    exit 0
    ;;
    esac

    mknod /dev/loop0 b 7 0
    mkdir /disk

    WAIT_COUNT=15
    while [ ! -e /dev/scd0 ] && [ "$WAIT_COUNT" -gt 0 ]
    do
    tmp=$((WAIT_COUNT-=1))
    sleep 1
    done

    echo -n "Please wait... "
    mount -t iso9660 -o ro /dev/scd0 /disk
    cp /disk/root.sqfs /
    echo "done"
    umount /disk && rm -Rf /disk
    EOF
    $ chmod +x $IMGROOT/../etc/iso/scripts/init-premount/udev_into_ram
    Скрипт, монтирующий файловую систему aufs
    $ cat <<EOF > $IMGROOT/../etc/iso/scripts/init-bottom/aufs_root
    #!/bin/sh
    #
    # https://help.ubuntu.com/community/aufsRootFileSystemOnUsbFlash
    #
    # Copyright 2008 Nicholas A. Schembri State College PA USA
    #
    # This program is free software: you can redistribute it and/or modify
    # it under the terms of the GNU General Public License as published by
    # the Free Software Foundation, either version 3 of the License, or
    # (at your option) any later version.
    #
    # This program is distributed in the hope that it will be useful,
    # but WITHOUT ANY WARRANTY; without even the implied warranty of
    # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    # GNU General Public License for more details.
    #
    # You should have received a copy of the GNU General Public License
    # along with this program. If not, see
    # <http://www.gnu.org/licenses/>.

    # Thank you Voyage Linux for the idea, http://voyage.hk/ Great job on release 0.5
    #
    # Tested with 8.04.1
    #
    #
    # ****************************************************************************************
    #
    # Change log
    #
    # 2008.08.01 Added debugging comments in "drop to a shell" section. grub option aufs=tmpfs-debug will stop the init script.
    # reviewed *********** fix fstab on tmpfs ******************
    # rootaufs failed when system was booted with /dev/xxx and fstab had uuid= info.
    # BlaYO pointed out the best and simplest solution was to use grep -v. Grep replaces a sed one liner.
    # Add the comment block to fstab
    #
    #
    #

    case $1 in
    prereqs)
    exit 0
    ;;
    esac

    export aufs

    for x in $(cat /proc/cmdline); do
    case $x in
    root=*)
    ROOTNAME=${x#root=}
    ;;
    aufs=*)
    aufs=${x#aufs=}
    case $aufs in
    tmpfs-debug)
    aufs=tmpfs
    aufsdebug=1
    ;;
    esac
    ;;
    esac
    done

    if [ "$aufs" != "tmpfs" ]; then
    #not set in boot loader
    #I'm not loved. good bye
    exit 0
    fi

    # This is a simple overview of the steps needed to use aufs on the root file system and see the /rw and /ro branches.
    # initramfs init-botton script
    # move the root file system to aufs/unionfs readonly /ro
    # root is mounted on ${rootmnt}
    # create tmpfs on /rw
    # create a aufs using /ro and /rw
    # put some files on the tmpfs to fix mtab and fstab
    # move aufs to rootmnt to finish the init process.
    # No changes to the root file system are made by this script.
    #
    # Why!
    # This will allow you to use a usb flash drive and control what is written to the drive.
    # no need to rebuild the squashfs file just to add a program.
    # boot to single user mode. The system works the way you expect. boot aufs=tmpfs and no changes are written to the flash.
    # run ubuntu on an eeePC .

    # Install
    # Install ubuntu 8.04 Hardy. Hardy has aufs installed by default
    # apt-get update
    # apt-get dist-upgrade
    # apt-get install aufs-tools
    # echo aufs >> /etc/initramfs-tools/modules
    # put this file in /etc/initramfs-tools/scripts/init-bottom/rootaufs
    # chmod 0755 rootaufs
    # # clean up menu.lst
    # update-grub
    # update-initramfs -u
    # vi /boot/grub/menu.lst
    # add aufs=tmpfs to the default entry.
    # do not add this line to single user mode.
    # boot to single user mode in order to install software.
    # note: if your home account is on the root file system, your files are in ram and not saved.
    #


    echo
    echo " root-aufs: Setting up aufs on ${rootmnt} as root file system "
    echo

    modprobe -q --use-blacklist aufs
    if [ $? -ne 0 ]; then
    echo root-aufs error: Failed to load aufs.ko
    exit 0
    fi

    #make the mount points on the init root file system
    mkdir /aufs
    mkdir /rw
    mkdir /ro

    # mount the temp file system and move real root out of the way
    mount -t tmpfs aufs-tmpfs /rw
    mount --move ${rootmnt} /ro
    if [ $? -ne 0 ]; then
    echo root-aufs error: ${rootmnt} failed to move to /ro
    exit 0
    fi


    mount -t aufs -o dirs=/rw:/ro=ro aufs /aufs
    if [ $? -ne 0 ]; then
    echo root-aufs error: Failed to mount /aufs files system
    exit 0
    fi


    #test for mount points on aufs file system
    [ -d /aufs/ro ] || mkdir /aufs/ro
    [ -d /aufs/rw ] || mkdir /aufs/rw

    # the real root file system is hidden on /ro of the init file system. move it to /ro
    mount --move /ro /aufs/ro
    if [ $? -ne 0 ]; then
    echo root-aufs error: Failed to move /ro /aufs/ro
    exit 0
    fi

    # tmpfs file system is hidden on /rw
    mount --move /rw /aufs/rw
    if [ $? -ne 0 ]; then
    echo root-aufs error: Failed to move /rw /aufs/rw
    exit 0
    fi



    #*********** fix fstab on tmpfs ******************
    # test for /dev/sdx
    # this is not on the real file system. This is created on the tmpfs each time the system boots.
    # The init process will try to mount the root filesystem listed in fstab. / and swap must be removed.
    # the root file system must be mounted on /ro not on /

    if [ "$aufsdebug" -eq 1 ]; then
    echo " root-aufs debug: Remove the root file system and swap from fstab "
    echo
    echo
    echo " ROOTNAME $ROOTNAME "
    echo " resume $resume "
    echo
    echo ' BlaYO pointed out that grep can be used to quickly remove '
    echo ' the root file system from fstab. '
    echo
    echo ' Thank you BlaYO for the debug info.'
    echo

    fi
    # old code
    # I'm sure that sed can do this in one step but I want to correct on the rootname not matching the root in fstab.
    #cat /aufs/ro/etc/fstab|sed -e s/$ROOTNAME/\#$ROOTNAME/ -e s/$resume/\#$resume/ >/aufs/etc/fstab

    #Add the comment block to fstab
    cat <<EOF >/aufs/etc/fstab
    #
    # RootAufs has mounted the root file system in ram
    #
    # This fstab is in ram and the real fstab can be found /ro/etc/fstab
    # the root file system ' / ' has been removed.
    # All Swap files have been removed.
    #

    EOF

    #remove root and swap from fstab
    cat /aufs/ro/etc/fstab|grep -v ' / ' | grep -v swap >>/aufs/etc/fstab
    if [ $? -ne 0 ]; then
    echo root-aufs error: Failed to create /aufs/etc/fstab
    #exit 0
    fi




    # add the read only file system to fstab
    #ROOTTYPE=$(/lib/udev/vol_id -t ${ROOT})
    ROOTTYPE=$(cat /proc/mounts|grep ${ROOT}|cut -d' ' -f3)
    ROOTOPTIONS=$(cat /proc/mounts|grep ${ROOT}|cut -d' ' -f4)
    echo /dev/loop0 /ro squashfs ro,relatime 0 0 >>/aufs/etc/fstab

    # S22mount on debian systems is not mounting /ro correctly after boot
    # add to rc.local to correct what you see from df
    #replace last case of exit with #exit
    cat /aufs/ro/etc/rc.local|sed 's/\(.*\)exit/\1\#exit/' >/aufs/etc/rc.local
    echo mount -f /ro >>/aufs/etc/rc.local

    # add back the root file system. mtab seems to be created by one of the init proceses.
    echo "echo aufs / aufs rw,xino=/rw/.aufs.xino,br:/rw=rw:/ro=ro 0 0 >>/etc/mtab" >>/aufs/etc/rc.local
    echo "echo aufs-tmpfs /rw tmpfs rw 0 0 >>/etc/mtab" >>/aufs/etc/rc.local
    echo exit 0 >>/aufs/etc/rc.local


    #build remountrw
    echo \#!/bin/sh >/aufs/bin/remountrw
    echo mount -o remount,rw ${ROOT} >>/aufs/bin/remountrw
    chmod 0700 /aufs/bin/remountrw

    #build remountro
    echo \#!/bin/sh >/aufs/bin/remountro
    echo mount -o remount,ro ${ROOT} >>/aufs/bin/remountro
    chmod 0700 /aufs/bin/remountro

    # This should drop to a shell. (rewrite)
    if [ "$aufsdebug" -eq 1 ]; then
    echo
    echo " root-aufs debug: mount --move /aufs ${rootmnt} "
    echo
    echo ' root-aufs debug: init will stop here. '
    echo
    exit 0
    fi

    mount --move /aufs ${rootmnt}

    exit 0
    EOF
    $ chmod +x $IMGROOT/../etc/iso/scripts/init-bottom/aufs_root
    На этом настройка initramfs заканчивается.

  6. Создаём скрипт, создающий iso-образ и сохраняем его в файле «~/ubuntu-ram/scripts/make-iso.sh»
    #!/bin/sh
    WORKDIR=/path/to/ubuntu-ram
    SQUASHFS_ROOT=$WORKDIR/image/
    ISO_ROOT=$WORKDIR/tmp/

    rm -Rf $ISO_ROOT/*

    # Получаем версию ядра в окружении
    version=$(basename $(readlink $SQUASHFS_ROOT/initrd.img))
    version=${version#initrd.img-}

    mount -o bind $WORKDIR/etc/iso $SQUASHFS_ROOT/etc/initramfs-tools
    chroot $SQUASHFS_ROOT mkinitramfs -v -o /boot/initrd.img-$version $version
    umount $SQUASHFS_ROOT/etc/initramfs-tools

    mkdir $ISO_ROOT/isolinux
    cp $SQUASHFS_ROOT/boot/initrd.img-$version $ISO_ROOT/isolinux/initrd.gz
    cp $SQUASHFS_ROOT/boot/vmlinuz-$version $ISO_ROOT/isolinux/vmlinuz
    cp /usr/lib/syslinux/isolinux.bin $ISO_ROOT/isolinux/
    cat <<EOF > $ISO_ROOT/isolinux/isolinux.cfg
    DEFAULT server
    TIMEOUT 1
    LABEL server
    menu label ^Server
    kernel vmlinuz
    append initrd=initrd.gz root=/root.sqfs loop=/dev/loop0 rootfstype=squashfs aufs=tmpfs ro
    EOF

    #
    mksquashfs $SQUASHFS_ROOT $ISO_ROOT/root.sqfs \
    -e $SQUASHFS_ROOT/boot/* \
    $SQUASHFS_ROOT/initrd.img \
    $SQUASHFS_ROOT/vmlinuz

    # Создаём ISO
    mkisofs -o $WORKDIR/image.iso -r \
    -V "MYUSBSERVER" -v -no-emul-boot \
    -boot-load-size 4 -boot-info-table \
    -b isolinux/isolinux.bin \
    -c isolinux/isolinux.boot $ISO_ROOT
    Делаем его исполняемым
    $ chmod +x ~/ubuntu-ram/scripts/make-iso.sh
    После выполнения скрипта в директории «~/ubuntu-ram» будет создан требуемый iso-образ.

  7. Создание загрузочной USB флешки.
    Создаём хук
    $ cat <<EOF > ~/ubuntu-ram/etc/usb/hooks/load_modules
    #!/bin/sh
    set -e

    PREREQ=""

    prereqs () {
    echo "$PREREQ"
    }

    case $1 in
    prereqs)
    prereqs
    exit 0
    ;;
    esac

    . /usr/share/initramfs-tools/hook-functions

    force_load usb_storage
    force_load squashfs
    force_load vfat
    force_load aufs

    exit 0
    EOF
    $ chmod +x ~/ubuntu-ram/etc/usb/hooks/load_modules
    Копируем скрипт «etc/iso/scripts/init-bottom/aufs_root» в «etc/usb/scripts/init-bottom/aufs_root».
    Пишем скрипт, загружающий систему из USB-флешки в оперативную память
    $ cat <<EOF > ~/ubuntu-ram/etc/usb/scripts/init-premount/udev_into_ram
    #!/bin/sh

    PREREQ=""

    prereqs () {
    echo "$PREREQ"
    }

    case $1 in
    prereqs)
    prereqs
    exit 0
    ;;
    esac

    mknod /dev/loop0 b 7 0
    mkdir /disk

    WAIT_COUNT=15
    while [ ! -e /dev/disk/by-label/MYUSBSERVER ] && [ "$WAIT_COUNT" -gt 0 ]
    do
    tmp=$((WAIT_COUNT-=1))
    sleep 1
    done

    echo -n "Please wait... "
    mount -t vfat -o ro /dev/disk/by-label/MYUSBSERVER /disk
    cp /disk/root.sqfs /
    echo "done"
    umount /disk && rm -Rf /disk
    EOF
    $ chmod +x $IMGROOT/../etc/usb/scripts/init-premount/udev_into_ram
    Ниже приведён скрипт создающий бутовую USB-флешку. Скрипт сохраняется в файл «~/ubuntu-ram/scripts/make-usb.sh»
    #!/bin/sh

    WORKDIR=/path/to/ubuntu-ram
    SQUASHFS_ROOT=$WORKDIR/image/
    ISO_ROOT=$WORKDIR/tmp/

    rm -Rf $ISO_ROOT/*

    # Получаем версию ядра в окружении
    version=$(basename $(readlink $SQUASHFS_ROOT/initrd.img))
    version=${version#initrd.img-}

    mount -o bind $WORKDIR/etc/usb $SQUASHFS_ROOT/etc/initramfs-tools
    chroot $SQUASHFS_ROOT mkinitramfs -v -o /boot/initrd.img-$version $version
    umount $SQUASHFS_ROOT/etc/initramfs-tools

    mkdir $ISO_ROOT/isolinux
    cp $SQUASHFS_ROOT/boot/initrd.img-$version $ISO_ROOT/initrd.gz
    cp $SQUASHFS_ROOT/boot/vmlinuz-$version $ISO_ROOT/vmlinuz
    cat <<EOF > $ISO_ROOT/syslinux.cfg
    DEFAULT server
    TIMEOUT 1
    LABEL server
    menu label ^Server
    kernel vmlinuz
    append initrd=initrd.gz root=/root.sqfs loop=/dev/loop0 rootfstype=squashfs aufs=tmpfs ro
    EOF

    #
    mksquashfs $SQUASHFS_ROOT $ISO_ROOT/root.sqfs \
    -e $SQUASHFS_ROOT/boot/* \
    $SQUASHFS_ROOT/initrd.img \
    $SQUASHFS_ROOT/vmlinuz

    echo "Please insert USB flash drive and press Enter"
    read
    # /dev/sdX - Ваша USB-флешка
    lilo -M /dev/sdX
    lilo -A /dev/sdX 1
    mkfs.vfat /dev/sdX1
    syslinux -f /dev/sdX1
    mlabel -i /dev/sdX1 ::MYUSBSERVER
    mount -t vfat /dev/sdX1 /mnt
    cp -a $ISO_ROOT/* /mnt
    umount /mnt
    exit 0
    Делаем скрипт исполняемым
    $ chmod +x ~/ubuntu-ram/scripts/make-usb.sh

суббота, 30 мая 2009 г.

Нужна ваша помощь

Подскажите где за наличные в Москве можно купить корпус и мамку (проц желательно intel atom с пассивным охлаждением) форм-фактора mini-ITX. Срочно, воскресенье — крайний срок.

UPD: Всем спасибо, сабж доставлен - буду теперь ваять домашний сервер :)

Может и баян, но улыбнуло

Помогите Microsoft в борьбе с пиратскими версиями Windows — установите своим друзьям Linux!

понедельник, 25 мая 2009 г.

SANE vs EPSON Perfection V300 PHOTO

Sane для работы с этим сканером требуются проприетарные драйвера. В репозитарии Ubunty 9.04 Jaunty готовых пакетов не оказалось. Но после недолгих поисков в Launchpad.Net нашлось то, что нужно.
Подключаем репозитарий PPA

deb http://ppa.launchpad.net/doctormo/ppa/ubuntu jaunty main
deb-src http://ppa.launchpad.net/doctormo/ppa/ubuntu jaunty main
Добавляем ключи PPA
$ wget -O- 'http://keyserver.ubuntu.com:11371/pks/lookup?op=get&search=0x15A579BF113659DF' | sudo apt-key add -
Ставим требуемые драйвера
$ sudo apt-get update
$ sudo apt-get install iscan iscan-plugins
Создаем правило udev для сканера и сохраняем в файл «/etc/udev/rules.d/50-epson-v300.rules». Этим мы переопределим права на файл устройства. Иначе он будет доступен только для суперпользователя.
SUBSYSTEMS=="usb", ATTRS{idVendor}=="04b8", ATTRS{idProduct}=="0131", MODE="660", GROUP="scanner"
Перезагружаем HAL
$ sudo invoke-rc.d hal restart
Теперь к компьютеру подключаем сканер и запускаем xsane.

четверг, 7 мая 2009 г.

В поисках пиратской винды милиция пошла по домам

Как пишет в своем блоге Vlad2000Plus, на Александра Иванчикова-Нееловского из Екатеринбурга завели уголовное дело из-за пиратского софта, обнаруженного на его домашнем компьютере. Стоимость «похищенного» оценили в 125 тысяч рублей и это только продукты некой компании Microsoft.
Раньше ловили того, кто ставит другим. Теперь мы дожили до того времени, когда начали ловить тех, кто занимается «домашним пиратством».

Я лично рад этому. Честно. Как написали в комментах: «по-моему логично. нет денег на винду - ставь линукс».

понедельник, 4 мая 2009 г.

Скрипт для корректного выключения гостевых хостов в libvirt

Ввиду неспособности libvirt-bin корректно отключать гостевые хосты при выключении/ребуте сервера, решил написать свой скрипт

#!/bin/sh
### BEGIN INIT INFO
# Provides: kvm-shutdown
# Required-Start: $remote_fs
# Required-Stop: $remote_fs
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Shutdown Guest KVM Hosts
# Description: Shutdown Guest KVM Hosts
### END INIT INFO

# Author: Князь <demiurg (at) propheta.ru>
#

# Do NOT "set -e"

# PATH should only include /usr/* if it runs after the mountnfs.sh script
PATH=/sbin:/usr/sbin:/bin:/usr/bin
DESC="Shutdown Guest KVM Hosts"
NAME=kvm-shutdown
SCRIPTNAME=/etc/init.d/$NAME

# Exit if the package is not installed
[ -x "/usr/bin/virsh" ] || exit 0
[ -S "/var/run/libvirt/libvirt-sock" ] || exit 0

# Load the VERBOSE setting and other rcS variables
. /lib/init/vars.sh

# Define LSB log_* functions.
# Depend on lsb-base (>= 3.0-6) to ensure that this file is present.
. /lib/lsb/init-functions

export LANG=C

#
# Function that stops the daemon/service
#
virsh_list()
{
virsh list 2>/dev/null | grep -E 'running$' | awk '{ print $2 }'
}

do_stop()
{
LIST=$(virsh_list)
for i in $LIST;
do
virsh shutdown $i 1>/dev/null 2>/dev/null
echo
echo -n "Shutdown $i ";
while [ "$(virsh_list | grep $i)" ];
do
echo -n '.'
sleep 2
done;
done;
if [ "$LIST" ]; then echo; fi;
}

case "$1" in
stop)
[ "$VERBOSE" != no ] && log_daemon_msg "Activating $DESC" "$NAME"
do_stop
case "$?" in
0|1)
[ "$VERBOSE" != no ] && log_end_msg 0
break
;;
2)
[ "$VERBOSE" != no ] && log_end_msg 1
break
;;
esac
break
;;
*)
echo "Usage: $SCRIPTNAME stop" >&2
exit 3
;;
esac
Сохраняем скрипт в файл «/etc/init.d/kvm-shutdown» и делаем его исполняемым
$ sudo chmod +x /etc/init.d/kvm-shutdown
Создаем символические ссылки в rc0, rc1, rc6
$ sudo ln -s ../init.d/kvm-shutdown /etc/rc0.d/K19kvm-shutdown
$ sudo ln -s ../init.d/kvm-shutdown /etc/rc1.d/K19kvm-shutdown
$ sudo ln -s ../init.d/kvm-shutdown /etc/rc6.d/K19kvm-shutdown
Префикс K19 выбран для того, чтобы скрипт запускался перед «/etc/init.d/libvirt-bin» (префикс K20)

пятница, 24 апреля 2009 г.

X-Forwarded-For и Squid

На днях выяснилось, что Squid, несмотря на запрет выдавать «X-Forwarded-For», пропускает данный http-заголовок наружу в том случае если сгенерирован нижестоящим прокси-сервером.
Проблема решилась одной строкой в конфиге Squid

header_access X-Forwarded-For deny all

понедельник, 23 марта 2009 г.

Местный провайдер отжигает

Крупнейший интернет-провайдер нашей республики, если не сказать монополист местной связи вообще, «Сахателеком» известил своих клиентов о том, что начиная с 1 апреля текущего года начнёт взимать плату за пока бесплатный входящий трафик со своих почтовых серверов. Плата будет приравнена к ценам за «внешний» интернет.

Интересно узнать, впереди ли мы всей страны с таким вот «нововведением»?

Теперь я в IRC сети ZeroLife

Меня можно найти на каналах #propheta и #freebsd (irc.zerolife.ru:6667). Список других серверов IRC сети ZeroLife можно найти вот тут. Сеть образовалась совсем недавно, но активно развивается. :)

суббота, 14 марта 2009 г.

xargs: многопоточная обработка

Благодаря посту Владимира Бредникова узнал, что xargs благодаря двум ключам помогает организовать многопоточную обработку файлов:

-n X
Ограничивает количество передаваемых вашей программе аргументов. По умолчанию xargs передаёт программе довольно большое число аргументов, поэтому для обработки одного файла за один раз нужно указывать эту опцию.
-P X
Устанавливает количество одновременно выполняемых процессов. По умолчанию xargs запускает только один процесс, но в нашем случае нужно увеличить это число до количества процессоров.
Например, в паре с утилитой find можно в несколько потоков обработать множество картинок, размер которых больше одного мегабайта
$ find ~/Photos -iname '*.jpg' -and -size +1M -print0 | \
xargs -0 -n 1 -P 2 -I'{}' convert '{}' -resize '800x600>' -quality 100 '{}'
P.S. Надо почаще заглядывать в man :)

пятница, 13 марта 2009 г.

Простая конфигурация Netflow для сбора данных о трафике в FreeBSD

Чтобы конфигурация netflow загружалась во время запуска системы добавляем в «/etc/rc.local» следующие строки

PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/sbin:/usr/local/bin

/usr/sbin/ngctl -f - << EOF

mkpeer if0: tee lower left
name if0:lower tee0
connect if0: if0:lower upper right
mkpeer tee0: one2many left2right many0
name tee0:left2right one2many0
connect tee0: one2many0: right2left many1
mkpeer one2many0: netflow one iface0
name one2many0:one netflow
mkpeer netflow: ksocket export inet/dgram/udp
msg netflow: setifindex { iface=0 index=0 }
msg netflow:export connect inet/127.0.0.1:7771

EOF
«if0» меняем на свой интерфейс. Если надо собирать данные с нескольких сетевых интерфейсов, множим блок «/usr/sbin/ngctl -f - << EOF ... EOF» и в каждом дополнительном блоке вместо «if0» вписываем нужный сетевой интерфейс. Так же меняем порядковые номера нодов и значение параметра «iface».
Чтобы загрузились необходимые модули добавляем в файл «/boot/loader.conf»
netgraph_load="YES"
ng_netflow_load="YES"
ng_socket_load="YES"
ng_tee_load="YES"
ng_iface_load="YES"
ng_one2many_load="YES"
ng_ksocket_load="YES"
ng_ether_load="YES"
Следующим шагом ставим коллектор netflow-трафика, прослушивающий порт «7771» по адресу «127.0.0.1».

среда, 11 марта 2009 г.

Samba + pam_mkhomedir

Возникла необходимость, чтобы при входе на сервер с «samba» для вошедшего пользователя домена создавалась локальная домашняя папка (если отсутствует).

Сперва убедитесь что smbd собран с поддержкой PAM

$ smbd -b | grep WITH_PAM
WITH_PAM
Если PAM не поддерживается, соберите Samba из исходников с ключом «--with-pam».
В файл «etc/smb.conf» (секция «global») добавляем
obey pam restrictions = Yes
Создаем шару для домашних папок пользователей
[homes]
valid users = DOMAIN\%S
read only = no
browseable = no
create mode = 0600
directory mode = 0700
По умолчанию Samba считает, что домашние папки пользователей находятся в «/home/DOMAIN/user». Если вы хотите разместить их в другом месте, задайте явно параметр «template homedir» в секции «global» и рестартуйте winbindd.
Нужно создать директорию «/home/DOMAIN», так как pam_mkhomedir не умеет создавать вложенные директории
$ sudo mkdir /home/DOMAIN
Добавляем в файл «pam.d/samba»
session    required    pam_mkhomedir.so umask=0077
Под занавес ребутаем smbd.

вторник, 3 марта 2009 г.

vsftpd и pam_mkhomedir: «OOPS: Cannot change directory»

Столкнулся с тем, что модуль PAM pam_mkhomedir отказался работать с vsftpd. После захода на FTP не создаются домашние каталоги пользователей и соединение прерывается сообщением сервера об ошибке 500 «OOPS: Cannot change directory». А поиск в интернете ничего вразумительного не дал.
Как оказалось все решается одной строкой в «vsftpd.conf»:

session_support="YES"
Проблема возникает из-за того, что vsftpd по умолчанию не трогает модули сервиса session в PAM.

среда, 25 февраля 2009 г.

Старт всероссийской акции по борьбе с навязыванием предустановленных ОС

Стартовала бессрочная всероссийская акция "Остановим OEM-беззаконие!", направленная на принуждение производителей компьютеров к разработке механизма возврата предустановленной Операционной Системы. В процессе акции осуществляется прием обращений по фактам нарушения прав покупателей.

Проблема возникла в силу определенной трудности, а подчас и невозможности приобрести компьютер без предустановленной ОС. Производитель компьютера решает этот вопрос за покупателя, ставя последнего перед решенным за него фактом. Предустановленная ОС — это хорошо и удобно, если покупатель технически малокомпетентен. Но отсутствие проработанного механизма отказа при этом — нарушают права людей, не желающих по тем или иным причинам приобретать и использовать предустановленную ОС.

Наиболее остро проблема проявилась на рынке ноутбуков с предустановленной MS Vista. Согласно Российскому законодательству, запрещается обуславливать покупку товара приобретением другого. Также в связи с преобладанием на рынке ОС продукции Microsoft происходит нарушение конкуренции и притеснение рынка альтернативных ОС. Данные нарушения попадают под юрисдикцию Федеральной Антимонопольной Службы, которая уже заинтересовалась проблемой и проводит необходимые проверки среди ведущих брендов, реализующих продукцию на территории России.

Источник: www.opennet.ru

пятница, 13 февраля 2009 г.

Решение проблемы некорректного GPG-ключа в Ubuntu

Иногда, при обновлении списка доступных пакетов может случиться такая ошибка

W: GPG error: http://mirror.ubuntu.com hardy-updates Release: The following signatures were
invalid: BADSIG 40976EAF437D05B5 Ubuntu Archive Automatic Signing Key <ftpmaster@ubuntu.com>
W: You may want to run apt-get update to correct these problems
Решение
$ sudo apt-get update -o Acquire::http::No-Cache=True

пятница, 6 февраля 2009 г.

SUPHP и загрузка файла на сайт

Столкнулся с тем, что после загрузки на сайт файл недоступен для просмотра. Владельцем файлу назначается владелец вызываемого скрипта, но с правами доступа на чтение/запись только владельцу. В результате веб-сервер не может его прочитать. Пробовал поиграться с параметрами в «suphp.conf» — безрезультатно.
Решил проблему таким образом. Создал файл «/etc/php5/prepend.inc» и в «php.ini» путь к нему присвоил параметру «auto_prepend_file»

<?php
if (!empty($_FILES)) {
function __xxx4pre_fix_upload_umask(& $files) {
if (is_array($files)) {
foreach ($files AS & $file)
__xxx4pre_fix_upload_umask($file);
}
else {
if (is_uploaded_file($files))
chmod($files, 0644);
}
}

__xxx4pre_fix_upload_umask($_FILES);
}
Теперь у загруженных файлов права доступа будут принудительно меняться на «0644».

суббота, 31 января 2009 г.

Настройка PPPoE (ADSL) в FreeBSD

Редактируем файл «/etc/ppp/ppp.conf»:

default:
set log Phase tun command
set ifaddr 10.0.0.1/0 10.0.0.2/0

disable ipv6cp
set speed sync
set mru 1492
set mtu 1492
set ctsrts off

# monitor line quality
enable lqr

adsl:
# Ниже вместо if0 ставим свой интерфейс (ethernet),
# по которому будем соединяться с провайдером.
set device PPPoE:if0
# Данные авторизации
set authname YOUR_NAME
set authkey YOUR_PASSWORD
set dial
set login
add default HISADDR
Проверяем написанное в интерактивном режиме
$ sudo ppp adsl
ppp on machine> set log +debug
ppp ON machine> dial
ppp ON machine>
Ppp ON machine>
PPp ON machine>
PPP ON machine>
При установке соединения с провайдером пользователь будет оповещаться о ходе подключения последовательным изменением регистра трёх букв «p» в консоли «ppp» со строчного на прописной.
Первая прописная буква оповещает о пройденном этапе проверки линии (LCP). Вторая буква — об успешной авторизации. Третья — вашей машине был присвоен IP адрес. Это означает что ваша машина успешно соединилась с сервером провайдера и теперь находится в сети.
Чтобы запустить ppp при загрузке системы необходимо добавить следующие строки в файл «/etc/rc.conf»:
ppp_enable="YES"
# Постоянное соединение. Восстанавливается после обрыва.
ppp_mode="dedicated"
# Если машина - шлюз в локальной сети.
ppp_nat="YES"
ppp_profile="adsl"
Если при попытке установки соединения выдается сообщение «Network is unreachable» закомментируйте приведенную ниже строку в «/etc/ppp/ppp.conf»
set dial
Другая причина ошибки может заключаться в неверном адресе шлюза провайдера.