[ Content | View menu ]

Теоретические основы HTTP LiveStreaming для iPod, iPhone и iPad

21.07.2011

Пару недель назад в свободное от основной работы время безуспешно пытался подружить Adobe Flash Media Server с iPhone и iPad посредством Red5, установленного на FreeBSD. Не получилось (не встал xuggler, а без него не заработал mpeg-ts), но ссылки остались.

Спецификации iPhone и iPad, из которых следует, что поддерживаются профили H.264 Main Profile Level 3.1 и Simple с аудио AAC-LC до 160 Kbps, 48 кГц

HTTP Live Streaming с точек зрения:

A Review of HTTP LiveStreaming — подробный разбор технологии в сравнении с RTP/RTSP и Adobe Flash Media. Изначально этот обзор был опубликован на сайте автора, но по каким-то причинам файл отсутствует и доступен только в кэше гугла.

linux - 0 комментариев

Конвертация Unix-style путей в UNC в Midnight Commander

25.06.2011

Тестовые релизы нашего продукта мы выкладываем в шару \\fs\testing, а готовые сборки и обновления для клиентов — в \\fs\release. У меня эти шары примонтированы соответственно как /mnt/testing и /mnt/release, и при составлении писем о выпуске релиза приходится вручную менять пути вида /mnt/testing/product/version_major/version_minor на \\fs\testing\product\…

Однажды мне это надоело и я добавил такую запись в ~/.mc/menu:

+ d /mnt/
p   Copy path in windows format to clipboard
    pwd|perl -ne 's|^/([^/])|//\1|g; s|/mnt/(products\|testing)|/fs/\1|g; s|/|\\|g;print'|xclip &

Теперь, если текущий каталог в Midnight Commander начинается на “/mnt/”, в меню F2 появляется пункт “Convert path to windows format”, при активации которого в буфер обмена помещается “правильный” UNC-путь к текущему каталогу.

О том, почему в Windows используются неправильные слэши, можно узнать из этой статьи.

Заметка из черновиков годовой давности, сейчас выкладываю другие релизы в другие шары :)

linux - 0 комментариев

Пакетная система Debian: низкоуровневая работа с deb-пакетами

22.10.2010

Формат deb-пакета

Краеугольный камень пакетной системы Debian — это deb-пакет (см. deb(5)), представляющий из себя архив формата ar, внутри которого содержится три файла:
1. debian-binary — текстовый файл, содержащий версию формата deb-пакета, в данный момент это 2.0. Программы, работающие с deb-пакетами, должны читать только первую строку этого файла и не падать, если минорная версия вдруг поменяется (например, станет 2.1).
2. control.tar.gz — служебная информация о пакете, скрипты, вспомогательные файлы (см deb-control(5)). Должен содержать только файлы, единственная папка, которая может присутствовать — “.” (текущая директория). В этот архив обязательно должен входить файл control, его минимальное содержимое рассмотрим чуть ниже.
3. data.tar — собственно файлы, устанавливаемые в систему. Чаще всего этот файл сжат каким-нибудь архиватором (поддерживаются расширения .gz, .xz, .bz2, .lzma), чаще всего в архивах встречается data.tar.gz.
read more…

linux - 7 комментариев

Проблема “SSL input filter read failed” и её решение

06.09.2010

Потратил половину своих выходных на выяснение причин неработоспособности прикрученного мной к одному апачу 2.2.16 модуля mod_ssl. Скрипт, вроде бы нормально работающий на 80 порту, напрочь отказывался работать через https, при этом выдавалась пустая страница, а в логах при перезапуске апача появлялась строчка, свидетельствующая лишь о том, что используется самоподписанный сертификат:

[warn] RSA server certificate is a CA certificate (BasicConstraints: CA == TRUE !?)

Включив подробные логи (LogLevel debug), получил для каждого запроса на пару порядков больше информации, из которой наиболее полезным оказалось вот это:

[Sat Sep 04 20:43:54 2010] [debug] ssl_engine_io.c(1893): OpenSSL: I/O error,
5 bytes expected to read on BIO#8074a22e0 [mem: 8074e5000]
[Sat Sep 04 20:43:54 2010] [info] [client XX.XX.XX.XX] (70007)The timeout
specified has expired: SSL input filter read failed.

Безрезультатно промаявшись с этим еще пару часов, отправился спать с мыслью поставить потом nginx в качестве SSL-прокси.

В понедельник программисты посоветовали обратить внимание на .htaccess, в котором, в частности, активно эксплуатировался mod_rewrite и устанавливались настройки php. Временное удаление .htaccess вызвало ошибку 403 по нужному адресу (это был отличный результат, поскольку ранее никаких ошибок не выдавалось вообще). А отключение php_value error_reporting 0, приведшее к заполнению экрана ошибками PHP, окончательно развеяло все сомнения: проблема была вовсе не в mod_ssl, а в пользовательском скрипте; mod_ssl ничего не получал и возвращал ошибку.

Мораль на будущее: надо быть проще и искать корни очевидных ошибок на поверхности, а nginx все равно не помешает.

Note for english-speaking visitors with the same error from google: try to check your php scripts or other backends, they can fail and not return any data to mod_ssl

linux - 0 комментариев

Следующий месяц в GNU date

31.08.2010

Если 31 августа спросить у GNU date, какой будет следующий месяц, результат будет немного странным:

$ date
Tue Aug 31 11:32:35 UTC 2010
$ date +"%Y-%m" --date "next month"
2010-10
$ date +"%Y-%m" --date "next month"
2010-10

Документация GNU date (см info date Relative items in date strings) специально обращает внимание на эту проблему и рекомендует вычислять следующий месяц не для сегодняшнего числа, а для 15 числа текущего месяца:

$ date +"%Y-%m" --date "$(date +%Y-%m-15) next month"
2010-09

linux - 1 комментарий

Извлечение данных из виртуальных дисков VirtualBox

21.07.2010

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

К счастью, можно легко преобразовать vdi из динамического формата в статический с помощью многоцелевой утилиты vboxmanage, входящей в состав пакета virtualbox:

vboxmanage clonehd --variant static debian.vdi temp.vdi

Теперь у нас есть файл temp.vdi, внутри которого где-то присутствует образ искомой файловой системы; для ее корректного извлечения нужно вычислить смещение образа относительно начала файла. В половине найденных по запросу “mount vdi linux” статей рекомендуется использовать для этих целей утилиту vditool, предназначенную на самом деле для внутреннего тестирования функциональности виртуальных дисков в VirtualBox. Раньше бинарник vditool можно было отдельно скачать с сайта virtualbox.org, но теперь его там по понятным причинам нет (желающие могут скомпилировать его самостоятельно: vditool.cpp)

Мы, как всегда, пойдем другим путем и воспользуемся подручными средствами. Первые 512 байт нашего vdi-файла — его заголовок, в котором можно разобраться, воспользовавшись, например, этим мануалом или непосредственно описанием структуры заголовка vdi в исходниках VirtualBox. Из этих источников следует, что образ размечен следующим образом:
512 байт: заголовок
4 * N + X: карта мегабайтных блоков, здесь N ­— количество мегабайт в виртуальном жестком диске, а X — выравнивание получившегося числа до ближайшей верхней 512-байтной границы
512 + 4*N + выравнивание: смещение данных

Зная точный размер виртуального диска, можно легко вычислить смещение вручную:

$ vboxmanage showhdinfo f8e0de05-1419-405d-92d9-8358dc1e6bec
VirtualBox Command Line Management Interface Version 3.0.8_OSE
(C) 2005-2009 Sun Microsystems, Inc.
All rights reserved.

UUID:                 f8e0de05-1419-405d-92d9-8358dc1e6bec
Accessible:           yes
Description:
Logical size:         4095 MBytes
Current size on disk: 2637 MBytes
Type:                 normal (base)
Storage format:       VDI
In use by VMs:        debian (UUID: f1f8221a-6542-4dfe-9062-5397f429da4b)
Location:             /home/bvk/.VirtualBox/HardDisks/debian.vdi

(UUID нужного диска можно узнать из вывода команды vboxmanage list hhds). Здесь выравненное до 512 значение размера карты блоков равно 16384, а смещение данных — 16896.
А можно и вытащить смещение непосредственно из заголовка vdi. Например, вот начало моего четырёхгигового виртуального диска:

$ head -c 512 temp.vdi |hexdump  -C
00000000  3c 3c 3c 20 53 75 6e 20  56 69 72 74 75 61 6c 42  |< << Sun VirtualB|
00000010  6f 78 20 44 69 73 6b 20  49 6d 61 67 65 20 3e 3e  |ox Disk Image >>|
00000020  3e 0a 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |>...............|
00000030  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
00000040  7f 10 da be 01 00 01 00  80 01 00 00 02 00 00 00  |................|
00000050  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00000150  00 00 00 00 00 02 00 00  00 42 00 00 00 00 00 00  |.........B......|
00000160  00 00 00 00 00 00 00 00  00 02 00 00 00 00 00 00  |................|
00000170  00 00 f0 ff 00 00 00 00  00 00 10 00 00 00 00 00  |................|
00000180  ff 0f 00 00 ff 0f 00 00  db fa c4 c9 fd 13 ea 49  |...............I|
00000190  9e ae 4e 47 43 3f a0 3c  46 37 6c be e6 fd 02 40  |..NGC?.<f7l ....@|
000001a0  a7 63 44 3f 6e 3f 26 d8  00 00 00 00 00 00 00 00  |.cD?n?&.........|
000001b0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
000001c0  00 00 00 00 00 00 00 00  0a 02 00 00 ff 00 00 00  |................|
000001d0  3f 00 00 00 00 02 00 00  00 00 00 00 00 00 00 00  |?...............|
000001e0  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
*
00000200

Жирным шрифтом выделены необходимые четыре байта offsetData по смещению 0×0158. Можно искать их визуально, помня о little-endian-порядке байт (в этом случае искомое значение равно 0×00004200), а можно воспользоваться простенькой командой:

$ head -c 348 temp.vdi |tail -c 4|perl -ne 'print unpack("L",$_),"\n"'
16896

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

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

$ dd if=temp.vdi bs=512 count=1 skip=$((16896/512))|file -
1+0 records in
1+0 records out
512 bytes (512 B) copied, 3.9397e-05 s, 13.0 MB/s
/dev/stdin: x86 boot sector; partition 1: ID=0x83, active, starthead 1,
startsector 63, 7903917 sectors; partition 2: ID=0x5, starthead 0, startsector
7903980, 481950 sectors, code offset 0x4c

Жесткий диск содержит 2 раздела: основной размером 3859 мегабайт, начинающийся с 63 сектора (1 сектор — 512 байт), и расширенный 235 мегабайт, отведенный установщиком Debian под swap (вот это сюрприз на виртуалке). Для очистки совести проверяем заголовок первого раздела:

$ dd if=temp.vdi bs=512 count=3 skip=$((16896/512+63))|file -
3+0 records in
3+0 records out
1536 bytes (1.5 kB) copied, 4.7716e-05 s, 32.2 MB/s
/dev/stdin: Linux rev 1.0 ext3 filesystem data,
UUID=5ac94027-bf6e-43bc-9c3e-8a7830fe4ff8 (needs journal recovery) (large files)

То, что надо! Осталось смонтировать. Несколько лет назад пришлось бы дополнительно извлекать все 7903917 секторов в отдельный файл и монтировать его, но сейчас можно просто указать смещение от начала файла как опцию mount (оставшиеся расширенный раздел и swap внутри него будут проигнорированы):

$ sudo mount -o loop,offset=$((16896+63*512)) temp.vdi mnt
$ ls mnt/
bin   cdrom  etc   initrd.img      lib         media  opt   root  selinux  sys  usr  vmlinuz
boot  dev    home  initrd.img.old  lost+found  mnt    proc  sbin  srv      tmp  var  vmlinuz.old

Задача решена, все свободны.

linux - 7 комментариев

Линус Торвальдс о Eee PC

29.01.2010

В предыдущем посте — небольшая история о том, как в Linux была улучшена поддержка устройств экстра-маленького размера благодаря покупки Линусом Торвальдсом вышивальной машинки :) В письме Линуса в рассылку util-linux-ng@kernel.org было упомянуто, что для управления этой машинкой он использует Eee PC с Fedora 12 на борту. Как пользователь Eee PC 701g с почти двухлетним стажем, я заинтересовался и написал Линусу письмо с несколькими вопросами о его опыте использования этих компьютеров. Получилось мини-интервью, которое и предлагается вашему вниманию.

Q: Какие модели Eee PC Вы используете?
A: У меня их две штуки: 701 и 901.

Q: Это основной компьютер или один из дополнительных?
A: Нет, конечно же, это не основной компьютер. Atom тормозной как грех. Я считаю, что процессоры с прямым выполнением команд (in-order execution) — преступление против человечности, и я уверен в том, что если Intel не предпримет значительных шагов (т.е. сделает Atom out-of-order), ARM Cortex A9 захватит рынок low-end машин.

У меня есть пара нетбуков, потому что я люблю маленькие компьютеры и использую их в поездках. Но они никогда не могли бы служить основными машинами для разработки или чем-то вроде этого.

701 слишком мелкий для того, чтобы быть полезным. Экран крошечный и у него непозволительно маленькое разрешение. Клавиатуру едва можно использовать. 901 намного лучше и мог бы быть неплохим помощником в поездках, но разрешение тоже слишком маленькое (9 дюймов нормально, но 1024×600 юзабельно только для смартфонов, а для лэптопов подошло бы как минимум 1366×768, как мне кажется)

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

ВНИМАНИЕ! Наверно, следует заметить, что мои требования могут быть завышенными по сравнению с требованиями многих других людей. Моя основная машина — Nehalem 3.2 GHz c 6 GB RAM и двумя быстрыми SSD-дисками от Intel. Поэтому мои представления о том, какая производительность может считаться “приемлемой”, могут не совпадать с представлениями других.

Q: какие задачи Eee PC помогает Вам выполнять?
A: Сейчас 701 работает тестовым стендом для совершенно различных вещей — я держу его поблизости в основном как 32-битный x86-стенд (все мои основные машины — x86-64, поэтому, если мне нужно проверить, что 32 бита еще работают, я использую 701).

901 я иногда использовал в поездках как лэптоп, и в основном он меня удовлетворял, но, откровенно говоря, существуют нормальные ноутбуки, которые намного-намного-намного лучше.

Например, я немного поигрался с машинами, основанными на CULV Core 2 Duo (вместо Atom) с экраном 1366×768 и внезапно обнаружил, что может быть намного более мощная (чем eeepc — прим.пер.) сборка. Она больше по размерам (10 дюймов), потребляет больше энергии, но оно того стоит.

Q: приобрели ли Вы эти нетбуки самостоятельно или они были подарены?
A: Оба Eee PC были подарены. 10″ CULV Core2 было самым достойным приобретением, на которое я потратил свои деньги.

Q: сколько времени Вы проводите перед этим нетбуком? Достаточен ли его размер для Вас?
A: См. выше. 701 и близко не стоял. 901 вполне пригоден к использованию, и если бы у него не было такое маленькое разрешение, он мог бы быть неплохим помощником в путешествиях.

Q: производились ли какие-нибудь аппаратные модификации?
A: в оба добавил памяти, вроде сейчас в обоих по 2 Гб (возможно, 701 был с 512 мегабайтами, и я проапгрейдил до гигабайта, слишком лениво проверять). И еще в оба добавил ПЗУ: в 701 — быструю SD-карточку (понятие “быстрая” тут весьма относительно, но для SD-карточки неплохой результат), в 901 — Mini-PCI SSD.

Мне нравятся high-end SSD (например, интеловские замены жестким дискам), но те, что используются в low-end нетбуках, страдают от ужасающе отвратительной скорости записи. Поэтому SSD в этих нетбуках, как правило, медленнее, чем реальные диски.

Q: и еще один, более общий вопрос. Как Ваше рабочее время распределено между кодированием и административной/политической/социальной деятельностью?
A: Сейчас кодирую очень мало. Практически всё время занято обсуждениями с другими разработчиками и внесением их изменений в ядро.

linux - 20 комментариев

Линус Торвальдс о машинках для вышивания

Часть первая.
На Рождество Санта Клаус подарил Туве Торвальдс машинку для вышивания. Среди прочих достоинств эта машинка имеет USB-интерфейс, по которому можно закачивать заранее приобретённые шаблоны вышивки в специальном закрытом формате. При подключении к компьютеру это чудо техники через минуту определяется как USB mass storage с файловой системой FAT12, при этом закачивание небольших файлов происходит очень долго и зачастую не приводит ни к каким результатам: о возникающих ошибках пользователю ничего не сообщается. Таково всё проприетарное ПО, — сетует Линус, — закрытые форматы, кривые прошивки, невнятные ошибки… Проблема предпросмотра шаблонов вышивок в формате PES на компьютере оказалась самой простой и теперь на git.kernel.org имеется специальная программа pesconvert для обслуживания вышивальных машинок.

Часть вторая.
Линус пишет письмо в рассылку util-linux-ng@vger.kernel.org с детальным описанием длительного процесса определения типов разделов и ФС на маленьком, медленном и подглючивающем блочном устройстве. После активного обсуждения (которое, несмотря на явную гиковость, можно читать как захватывающий детектив) было найдено несколько узких мест в утилите blkid, пытающейся определить более чем 50 типов файловых систем по их сигнатурам, что приводит к неоднократному чтению 69 килобайт с устройства, и в сумме объём прочитанных данных, с учётом упреждающего чтения, составляет около половины объёма всего устройства. Учитывая тот факт, что скорость обмена данными у этой штуки составляет 16 килобайт в секунду, простое определение единственного fat-раздела занимает около 30 секунд (всё это нужно для того, чтобы udev смог корректно примонтировать это устройство).

Совместными усилиями задержка была сведена к рекордному минимуму в полсекунды. Для этого Karel Zak (главный мейнтейнер util-linux-ng) добавил в blkid несколько опций, ограничивающих количество возможных ФС и объём читаемых данных для очень маленьких устройств (зачем пытаться определить raid на диске размером с полдискеты?), Линус немного оптимизировал кое-какие системные вызовы и теперь в ближайшем выпуске util-linux-ng будет заявлена поддержка очень маленьких дисков, а в ядре Linux, чем черт не шутит — частичная поддержка неких вышивальных машинок.

Часть третья последует, не пропустите.

linux - 11 комментариев

Несколько ссылок по истории computer science

25.01.2010

Несколько месяцев назад заинтересовался причинами появления управляющих кодов ASCII в их нынешнем виде. Раскопки привели меня к первым терминалам в Multics, терминалы — к телетайпам, телетайпы — к телеграфным аппаратам. Тема чрезвычайно интересная, но полноценного поста у меня так и не вышло по разным причинам. Просто накидаю сюда ссылок для интересующихся (в основном на английском).

Unix и его предшественники
Multicians.org — один из основных сайтов по предыстории Unix. В основном описывает различные аспекты ОС Multics (включая рекламную брошюру (4 Мб)), но содержит также массу сведений и о ранних вариантах Unix, и о CTSS.

Unix history — основной сайт по истории Unix.

Концепция иерархической файловой системы впервые была описана в 1965 году и сильно отличалась от ныне используемой. В частности, в качестве разделителя каталогово предлагалось использовать двоеточие, а на уровень выше можно было ссылаться как на *; у каждого файла присутствовал специальный атрибут TRAP, в котором можно было указать свою процедуру проверки прав доступа к этому файлу. Но уже в Multics реализация файловой системы значительно отличалась от данного проекта иной, а в Unix и вовсе приняла привычный нам вид.

The Evolution of the Unix Time-sharing System (Dennis M. Ritchie, 1979) — краткая история Unix, рассказанная одним из её создателей.

The Restoration of Early UNIX Artifacts — опыт восстановления файлов с древней ленты, содержащей один из самых первых релизов Unix. В конце документа несколько интересных ссылок.

Исходный код Unix — отсканированная распечатка тщательно прокомментированных ассемблерных кодов Unix. Датируется 1972 годом. 11 мегабайт.

Excavating ancient abbreviations in Linux ­— история происхождения некоторых аббревиатур, используемых в UNIX/Linux (для чтения оригинала требуется
регистрация, поэтому ссылка на кэш гугла).

Буду благодарен за PDF/DJVU версию книги “A quarter century of Unix” by Peter Salus :)

Терминалы
Коллекция информации о текстовых терминалах, отправная точка исследований.

Рассказ одного из создателей Multics о первых терминалах и опыте удалённой домашней работы (70-е годы, суперкрутые модемы на 1200 бод) (en)

Краткая история терминалов DEC (в т.ч. VT100)

Что такое “smart terminal” и чем он отличается от “dumb terminal”. В
основном тем, что умеет проверять пользовательский ввод уже на стороне терминала, а не передаёт его серверу.

Телеграф
К вопросу о возникновении телеграфа множество интересных сведений из истории телеграфной связи

История телеграфа в России

Телеграфное дело. Пособие для сержантов и старших специалистов войск связи — раритет :) Книжка 1946 года выпуска, доступно и понятно описывает теорию электротехники и электроники по состоянию на момент окончания Великой Отечественной войны, а также знакомит читателя с основными понятиями телеграфной связи.

linux - 1 комментарий

Создание chroot-окружения в Debian средствами debootstrap

20.01.2010

Для тестирования различных версий нашего продукта (внутри — БД под управлением mysql и интерфейс к ней на PHP под Apache2) требуется быстро создавать многочисленные chroot-окружения на выделенном сервере и управляться с ними.

В базовой системе (lenny) оставляем только функционал, необходимый для управления всем хозяйством, лично мне необходимы mc, openssh, vim, bash_completion и иногда svn. Также неплохо поиметь где-нибудь (да хоть на этой же машине) кэширующий прокси для репозиториев debian, типа apt-proxy или apt-cacher, чтобы не создавать излишнюю нагрузку на региональные зеркала. У нас используется apt-cacher, работающий по адресу http://apt:3142.

Debootstrap ­— основная рабочая лошадка:

apt-get install debootstrap
debootstrap --include=mc,ssh,vim lenny /systems/lenny http://apt:3142/ftp.debian.org/debian/

Первый аргумент — название релиза, второй — путь, куда устанавливается система, третий — адрес репозитория. В опции –include через запятую указываются пакеты, которые необходимы, но не входят в минимальную базовую систему. Debootstrap выкачивает из репозитория и устанавливает минимальный набор пакетов, теоретически сразу после этого можно делать chroot /systems/lenny и переходить к работе, но осталась еще несколько немаловажных доделок:

Добавляем идентификатор системы, который будет отображаться в скобках в приглашении шелла (читай — bash), выполняемом в chroot-окружении:

echo lenny > /systems/lenny/etc/debian_chroot

Но работа в основном ведется от имени root, а в squeeze и sid у root’а в .bashrc переменная окружения PS1 переопределяется и этот идентификатор пропадает. Поэтому если делаем виртуалку squeeze, то строчку с PS1 в /root/.bashrc лучше закомментировать:

sed -i 's/^\(export PS1.*\)$/#\1/g' /systems/squeeze/root/.bashrc

Монтируем /dev/pts — виртуальную файловую систему, которая динамически создаёт файлы терминалов /dev/pts/X для каждого нового подключения; это необходимо для нормального функционирования многих программ, работающих с терминалом, в т.ч. скриптов postinst и config пакета mysql-server:

mount -t devpts devpts /systems/lenny/dev/pts

Монтируем /proc (реально proc в новом месте будет содержать ту же информацию, что и общесистемный /proc):

mount -t proc proc /systems/lenny/proc

Чтобы apt-get не ругался на неподписанные пакеты при установке, необходимо обновить файл Release.gpg, т.к. по умолчанию debootstrap его не устанавливает. Это проще всего сделать обновлением индексных файлов репозитория:

chroot /systems/lenny apt-get update

После этого уже можно делать chroot /systems/lenny, устанавливать и настраивать пакеты, запускать/останавливать сервисы и т.д. Главная проблема при этом ­— следить за тем, чтобы сервисы в разных chroot’ах не конфликтовали, пытаясь занять порт на одном IP-адресе. Обычно добавляются виртуальные сетевые интерфейсы и им назначаются виртуальные же IP-адреса, которые и указываются в настройках сервисов.

Disclaimer: данная заметка описывает мой персональный опыт и не претендует на полноту. Комментарии и дополнения приветствуются.

linux - 4 комментария

Как не пропустить момент установки нового ядра с помощью команды watch

13.01.2010

Выдержка из man 1 watch (входит в комплект утилит procps в Debian Lenny):

You can watch for your administrator to install the latest kernel with

        watch uname -r

(Note that -p isn’t guaranteed to work across reboots, especially
in the face of ntpdate or other bootup time-changing mechanisms)

linux - 0 комментариев

Разделение аргументов в shebang

28.12.2009

В комментариях к прошлогоднему переводу Bash Pitfalls внимательный flavi задался вопросом, почему при попытке выполнить скрипт, в начале которого написано

#!/bin/bash --posix --verbose

выдаётся ошибка

/bin/bash: --posix --verbose: invalid option

в то время как в интерактивном режиме bash нормально запускается с такой комбинацией опций; более того, если в shebang’е оставить только одну из этих опций, то скрипт также запускается без ошибок.

Поначалу я предположил, что --posix запрещает опции, не определённые стандартом POSIX на sh. Но тогда попытка выполнить bash --posix --norc также приводила бы к ошибке, и конструкция #!/bin/bash --verbose --norc работала бы нормально, а это не так.

Пришлось разбираться более плотно. В bash (1) я вычитал следующее (выделение — моё):

If the program is a file beginning with #!, the remainder of the first line specifies an interpreter for the program. The shell executes the specified interpreter on operating systems that do not handle this executable format themselves. The arguments to the interpreter consist of a single optional argument following the interpreter name on the first line of the program, followed by the name of the program, followed by the command arguments, if any.

Т.е. в shebang можно задавать только один аргумент; кроме того, bash самостоятельно анализирует shebang и вызывает указанный интерпретатор только в случае, если система сама не может выполнить этот скрипт.

Сам файл передаётся на выполнение с помощью системного вызова execve (2) (это я вычитал в файле execute_cmd.c в исходном коде bash), в man-странице которого и разъясняется политика партии по поводу разбиения аргументов интерпретатора:

On Linux, the entire string following the interpreter name is passed as a single argument to the interpreter, and this string can include white space.

Таким образом, в самом первом примере у bash в argv оказывается не два аргумента --verbose и --norc, а один --verbose --norc, что и приводит к ошибке, и вина bash лишь в том, что он не разбивает свои аргументы на части, как это делает, например, Perl.

Причина такого странного поведения операционной системы (казалось бы, что сложного в том, чтобы просто разбить строку на части по пробелам или символам табуляции) описана, например, в этой дискуссии LKML или, более подробно, в письме Garance A Drosihn в рассылку freebsd-arch. Вкратце, если бы механизм механизм обработки shebang (в Linux — linux/fs/binfmt_script.c) передавал все аргументы интерпретатору, то для некоторых из них было бы затруднительно отделить аругменты интерпретатора от собственно аргументов вызываемого скрипта. По крайней мере, так было еще на заре развития Unix и с тех пор большая часть Unix-систем передаёт все аргументы как единую строку.

linux - 3 комментария

Басни про git

27.12.2009

Пытающимся отвыкнуть от идеологии CVS и SVN — рассказ о концепциях распределённых систем контроля версий.

Более подробное введение

ага, для ссылок есть твиттер и del.icio.us, но ЭТУ ссылку я уже однажды потерял. Так что пусть тут побудет, в назидание.

linux - 0 комментариев

Detach tab и постоянная строка статуса в Firefox 3.0/Iceweasel

23.12.2009

Функция “detach tab”, актуальная при наличии двух мониторов, в Firefox 3.0 (он же Iceweasel в Debian) в явном виде отсутствует, но хотя на пустое место вкладку перетащить нельзя (как, например, в gnome-terminal), работает простое перетаскивание вкладок между окнами. Таким образом, чтобы отделить вкладку в отдельное окно, нужно сначала создать это окно (Ctrl+N), сделать его видимым одновременно с основным и перетащить туда эту вкладку. В Firefox 3.5 для выделения вкладки в новое окно есть пункт “Open in a new window” в контекстном меню вкладки.

Чтобы в режиме fullscreen строка статуса всегда оставалась видимой, нужно создать файл настроек интерфейса %profiledir%/chrome/userChrome.css (или скопировать его из userChrome-example.css из той же папке) со следующим содержанием:

@namespace url("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul");
#status-bar
{
	visibility: visible;
}

Ещё несколько примеров того, как можно настроить Firefox под себя без использования расширений (актуально и по состоянию на октябрь 2014 год)

linux - 0 комментариев

Ищем веб-разработчика в Нижнем Новгороде

01.12.2009

Требования: PHP или Python, SQL, JS, Flex (последнее не обязательно, но очень приветствуется).

Необходимо понимать и уметь применять на практике парадигму ООП, знать основные паттерны проектирования веб-приложений, желательно иметь опыт работы с веб-фреймворками.

Дополнительные требования: Linux, shell-скрипты; понимание принципов работы voip-технологий также будет несомненным плюсом.

Приветствуется опыт администрирования Linux, Apache, СУБД MySQL, Postgresql, Oracle.

Чуть подробнее тут.

Работа в офисе.

Зарплата по результатам собеседования (от 20 т.р.)

Резюме присылайте мне (адрес на специальной страничке) или прямо в отдел кадров с пометкой, откуда взяли :)

linux - 1 комментарий