DISCLAIMER. English language used here only for compatibility (ASCII only), so any suggestions about my bad grammar (and not only it) will be greatly appreciated.

среда, 14 декабря 2011 г.

initramfs and noexec /tmp

If during creation of new initramfs by update-initramfs (called by e.g.
kernel postinst script) /tmp is mounted with 'noexec', initramfs will be
slightly different and may report errors, like

E: /scripts/local-premount/resume failed with return 255.

понедельник, 12 декабря 2011 г.

shell's 'errexit' option and variable definition.

Shell's option 'errexit' works unexpectedly when command returning non-zero
is called in `local` variable definition statement.

среда, 30 ноября 2011 г.

Do not mount LV by UUID from fstab.

I should not reference LV in fstab by UUID, because if i have snapshot of this
LV, it is unknown which one (origin or snapshot) will be mounted.

вторник, 22 ноября 2011 г.

xargs, arguments separator and escapes.

xargs uses blanks (not only newlines!) to split input line into arguments.
Though, there is some options, which turns this defailt off implicitly or
explicitly.

Here is summary:

    +--------+--------------------+---------------------+
    | Option | Argument separator | Escapes             |
    +--------+--------------------+---------------------+
    | -L     | blank              | Interpreted (work)  |
    +--------+--------------------+---------------------+
    | -d     | user defined       | Literal (not work)  | 
    +--------+--------------------+---------------------+
    | -I     | newline            | Interpreted (work)  |
    +--------+--------------------+---------------------+

четверг, 4 августа 2011 г.

LVM snapshots and corresponding DM tables

Here is just a few illustrations (with some text) for chapter about snapshot
and snapshot-origin device mapper's targets from
RedHat's Logical Volume Manager Administration Guide.
Also, here i make some assumptions about how this works, which seems logical,
but unproved since i don't check LVM's sources.

понедельник, 11 июля 2011 г.

This icq..

Upd5. 2012-11-16. Suggested here stunnel config is insecure. See icq through stunnel: enable certificate verification for improvement.

This icq, this damned icq.. doesn't log in! As i expected, though.

воскресенье, 8 мая 2011 г.

Variable assignment in bash `eval`

Here is example of variable assignment in eval:

    (
        v="a\" b";
        eval "r=\"$v\"";
        declare -p r
    )

Such assignment lead to error due to unmatched double quote. Here is corrected
version of above example

    (
        v="a\" b";
        eval "r=\"\$v\"";
        declare -p r
    )

And here is example of executing arbitrary command through such incorrect eval
construction:

    (
        v="a\"; ls; \":";
        eval "r=\"$v\"";
        declare -p r
    )

Note a colon (':') in 'v' value: bash does not even complain about incorrect
syntax - all is correct and all will work fine!

So, it's safe (perhaps) to use parameter expansion to form variable's name for
assign to, like

    (
        v="arr";
        eval "${v}[1]=123";
        declare -p arr;
        eval "r=\${${v}[1]}";
        declare -p r
    )

because here bash's own constrains on characters in variable name applied, and
bash checks this. But it's _not_ safe to expand variable up to value in the
main script - do it in eval script instead.

Note, the same also applies to indirect reference: do not use it to expand up
to value in main script in eval constructions. Here is flawed example:

    (
        j=var;
        var="a\"; ls; \":";
        i=r;
        eval "$i=\"${!j}\"";
        declare -p r;
    )

and now corrected version

    (
        j=var;
        var="a\"; ls; \":";
        i=r;
        eval "$i=\"\${$j}\"";
        declare -p r;
    )

or with indirect reference

    (
        j=var;
        var="a\"; ls; \":";
        i=r;
        eval "$i=\"\${!j}\"";
        declare -p r;
    )


вторник, 22 марта 2011 г.

Отчет об автопробеге "Весенний Quest" 6-8 марта 2011 года. Экипаж №47

(отформатированная версия оригинала с форума "Магистрали" )

https://lh4.googleusercontent.com/_5gQ9RxQ_3Sw/TYkEezQ3xNI/AAAAAAAAAMI/C8HFg-QwgsQ/s800/IMG_9269_360x480.JPG

06 марта. День первый. Москва - Поленово - Савино - Дворяниново - Тула

https://lh5.googleusercontent.com/_5gQ9RxQ_3Sw/TYkEo-nUuCI/AAAAAAAAAMM/eXllJ257K9M/s800/IMG_9166_480x360.JPG

Стартовали в Москве не рано: чуть-чуть поспали-поели, скачали задание, поразгадывали, нашли все точки и выехали около 16 часов. Заехали в Поленово. Пожалели, что надо быстро уезжать, решили приехать как-нибудь не спеша и отправились в Савино искать музей Руднева. Уже стемнело, но в музее еще горел свет - сидел охранник - поэтому нашли быстро и поехали дальше. В Русятино оказалось на удивление много прохожих, спросили у них про усадьбу. На подъезде к Дворяниново встречные собаки бросались под колеса и лаяли. В полной темноте остановились перед шлагбаумом и потихоньку пошли с фонарем искать усадебный дом и памятник Болотову. Тихо, звезды в небе, никого... Нашли! Что ж уже поздно, в Острецово решили не ехать - поехали в Тулу.

07 марта. День второй. Тула - Новомосковск - Куликово поле - Богородицк - Дедилово - Тула

https://lh5.googleusercontent.com/_5gQ9RxQ_3Sw/TYkEuzScJVI/AAAAAAAAAMQ/EkAqoSTfHMI/s800/IMG_9086_480x360.JPG

Утром в 7 часов около тульского Кремля были остановлены для проверки документов стражем ДПС, получили от него добрые напутствия и поехали собирать КП. Большинство адресов нашли еще дома. А вот памятник хвосту искали долго: проехали дважды, не ожидали, что он такой маленький. Очень симпатичный дракоша! Потом запаслись пряниками на фабрике, позавтракали и поехали на Куликово поле.

https://lh6.googleusercontent.com/_5gQ9RxQ_3Sw/TYkE0ZsjP_I/AAAAAAAAAMU/VVcVZHqSStU/s800/IMG_9141_480x360.JPG

В Бородинском встретились с экипажем 10 (привет!), постояли у Кургана Бессмертия, потом - Новомосковск и Куликово поле. Здесь, конечно, трудно заблудиться - указатели кругом понаставлены. Проехали по степям, собрали все КП. Два раза Дон пересекали. Особенно понравился большой голубой фургон среди степи с надписью "Живая рыба". К сожалению, не успели заснять.

https://lh5.googleusercontent.com/_5gQ9RxQ_3Sw/TYkE6HmrH_I/AAAAAAAAAMY/3wtwz3Tb-lw/s800/IMG_9152_480x360.JPG

Обратно повернули в Крестах (чтобы не возвращаться той же дорогой) и по Р142 поехали в Богородицк. В поисках КП объехали в городе все парки-скверы (их оказалось три). Наконец, нашли усадьбу и памятник Болотову. Сфотографировали колокольню в лучах заходящего солнца и решили возвращаться в Тулу, поскольку поняли, что намеченный на день план мы уже не выполним и до Малоярославца, где нас ждет заказанная гостиница, уже не доедем. По пути отыскали красивую церковь (КП-59) в Дедилово. Для фото подсветили ее своими фарами, и тут включили подсветку.

08 марта. День третий. Тула - Алексин - Таруса - Кременки - Жуков - Малоярославец - Москва

https://lh3.googleusercontent.com/_5gQ9RxQ_3Sw/TYkFBfmADBI/AAAAAAAAAMc/5s511y_zjq0/s800/IMG_9278_480x360.JPG

Искали неправильное Богучарово, у тракториста выяснили, что до бывшей усадьбы не добраться, да и колокольни там нет. Развернулись, уехали на Алексин. В Алексине были в 9 часов. Остановились посмотреть карту, смотрим - стоим около магазина при хлебзаводе, и он работает, и в нем продают свежий хлеб! Купили. Очень вкусный был батон. Поехали искать КП. Чтобы не бегать по всему парку Жалка в поисках скульптуры, решили взять "языка": пожилой мужчина вызвался нас проводить. Двигаясь неспешным ходом, он рассказывал об истории парка, замечательных деревянных скульптурах - сказочный городок - и даже прочитал отрывки из своих стихов, за которые когда-то получил награду, а теперь с трудом вспомнил.

https://lh4.googleusercontent.com/_5gQ9RxQ_3Sw/TYkFHNpqtfI/AAAAAAAAAMg/8RKO-uOI7Ss/s800/IMG_9267_480x360.JPG

Дальше - Таруса. По нашему маршруту мы должны были ехать через Колосово и Вознесенье, но слегка промахнулись с нужным поворотом и поехали по кольцевой дороге через деревни (Савватеево, Жуково, Кузнецы). Сделав почетный круг по полям, местами скребя брюхом, вырулили на Колосово. Там - налево проулком в одну машину, не без труда преодолев крутой скользкий подъем за речкой и никого не встретив, добрались до Тарусы. Город понравился, давно хотели сюда попасть. Жаль, что точки нашли быстро и не пришлось поездить по городу.

https://lh3.googleusercontent.com/_5gQ9RxQ_3Sw/TYkFO-PCxoI/AAAAAAAAAMk/yjQMlq1rBT8/s800/IMG_9295_360x480.JPG

Дальше - Кременки, Стрелковка, Жуков. Очень понравилась дорога вдоль Протвы. Времени оставалось немного - завтра на работу, - из оставшихся точек в районе Обнинска выбрали Малоярославец. Правда, на пересечении М3 и А101 свернули не туда - на Калугу. Зато в поселке Спас-Загорье, через который мы теперь ехали на Малоярославец, увидели красивую церковь. В Малоярославце очень понравился Черноостровсикй монастырь и памятник солдату, возлагающему венок (КП-31), в Сквере 1812 года. К сожалению не попали в Боровск, Калугу. Как-нибудь вернемся.

Заключение.

https://lh6.googleusercontent.com/_5gQ9RxQ_3Sw/TYkTUju-ZeI/AAAAAAAAANc/iq7NxZM9cGA/s800/IMG_9314_360x270.JPG

Общий пробег составил 958 км. Маршрут понравился, но было мало дней, жаль, что все не успели. Это наша вторая поездка. Первой был Новогодний quest, недавно получили дипломы по почте. Обрадовались! Спасибо организаторам! Ждем новых встреч!

А также отдельная благодарность создателям открытой и бесплатной карты OpenStreetMap и навигационной программы Navit.

вторник, 1 февраля 2011 г.

Intel AMT IDE Redirection and linux

(updated version)

    Shortly: it works -)

    Now with more details.  Module 'ata_generic' (CONFIG_ATA_GENERIC) may drive
    IDER controller.  Though, it will not take over this device without option
    'all_generic_ide=1' (perhaps, because IDER controller match with "any"
    alias, but not device-specific one?):

        # modinfo ata_generic
        ..
        alias:          pci:v*d*sv*sd*bc01sc01i*
        ..

    So, we should load it like

        # modprobe ata_generic all_generic_ide=1

    Now we can check, that it successfully takes over IDER controller

        # lspci -nn | grep IDER
        00:03.2 IDE interface [0101]: Intel Corporation Mobile PM965/GM965 PT IDER Controller [8086:2a06] (rev 0c)
        # ls -l /sys/bus/pci/devices/0000:00:03.2/driver
        lrwxrwxrwx 1 root root 0 Jan 31 17:44 /sys/bus/pci/devices/0000:00:03.2/driver -> ../../../bus/pci/drivers/ata_generic

    But in order to have kernel see scsi targets on this IDER controller, we
    need to enable IDE Redirection in remote management console (you may use
    Manageability Commander Tool from Intel Manageability Developer Tool Kit
    for testing). There will be two scsi targets on this scsi host: floppy
    (bus=0, id=0, lun=0)  and cdrom (bus=0, id=1, lun=0). Floppy will be
    handled by sd, and cdrom by sr_mod:

        # ls -l /sys/bus/pci/devices/0000:00:03.2/host21/
        total 0
        drwxr-xr-x 2 root root    0 Jan 31 18:16 power
        drwxr-xr-x 3 root root    0 Jan 31 18:16 scsi_host
        lrwxrwxrwx 1 root root    0 Jan 31 17:44 subsystem -> ../../../../bus/scsi
        drwxr-xr-x 4 root root    0 Jan 31 17:44 target21:0:0
        drwxr-xr-x 4 root root    0 Jan 31 17:44 target21:0:1
        -rw-r--r-- 1 root root 4096 Jan 31 17:44 uevent
        # ls -l /sys/bus/pci/devices/0000:00:03.2/host21/target21:0:0/21:0:0:0/driver
        lrwxrwxrwx 1 root root 0 Jan 31 17:44 /sys/bus/pci/devices/0000:00:03.2/host21/target21:0:0/21:0:0:0/driver -> ../../../../../../bus/scsi/drivers/sd
        # ls -l /sys/bus/pci/devices/0000:00:03.2/host21/target21:0:1/21:0:1:0/driver
        lrwxrwxrwx 1 root root 0 Jan 31 17:45 /sys/bus/pci/devices/0000:00:03.2/host21/target21:0:1/21:0:1:0/driver -> ../../../../../../bus/scsi/drivers/sr

    And now the only left is to make these modules autoload during boot.  Here
    is one thing to note: we should load all specific ata modules (for other
    hardware, if any) _before_ 'ata_generic'.  Otherwise with parameter
    'all_generic_ide' it'll take over all available ata controllers.  Order of
    ata drivers and scsi drivers (sr_mod, sd) does not matter. So, something
    like this should be written in modprobe.conf:
    
        modprobe.conf:

            options ata_generic all_generic_ide=1
            install ata_generic /sbin/modprobe ata_piix ; /sbin/modprobe --ignore-install ata_generic

    or

        modprobe.conf:

            options ata_generic all_generic_ide=1
            install ata_generic /sbin/modprobe ata_piix ; /sbin/modprobe --ignore-install ata_generic $CMDLINE_OPTS

    though, adding $CMDLINE_OPTS (to add all options from the command line) is
    useless here - 'ata_generic' has only one option.


    Also there is another one module, which can drive IDER controller -
    'ide_pci_generic' (CONFIG_BLK_DEV_GENERIC). Unlike 'ata_generic', which
    uses libata, this module uses old ATA subsystem (CONFIG_IDE) (are terms
    here used correctly?). If you use this driver, cdrom drive will no longer
    be present as scsi device. Now it'll be handled by 'ide_cd' driver
    (CONFIG_BLK_DEV_IDECD).  'ide_pci_generic' driver also requires option
    'all_generic_ide' set in order to take over any device.

    Here are some results from booting linux with different ATA drivers used
    (though root partition in these tests is on the hard drive).

    All three boot scenarios require SATA AHCI controller to be in
    compatibility mode, otherwise ATA drivers can not work with it and kernel
    can't access root partition.
    1. ata_piix.  Here ata_piix driver is compiled in and handles all ATA
       controllers.  It correctly takes over AHCI controller (in
       compatiblility mode) and over PATA controller.  ata_generic was loaded
       as module later to handle IDER controller.

       Here is some info about such system config:

            # ls -l /sys/bus/pci/devices/*/driver
            ..
            lrwxrwxrwx 1 root root 0 Feb  1 13:06 /sys/bus/pci/devices/0000:00:03.2/driver -> ../../../bus/pci/drivers/ata_generic
            ..
            lrwxrwxrwx 1 root root 0 Feb  1 13:06 /sys/bus/pci/devices/0000:00:1f.2/driver -> ../../../bus/pci/drivers/ata_piix
            ..
            # lspci -nn | grep IDE
            00:03.2 IDE interface [0101]: Intel Corporation Mobile PM965/GM965 PT IDER Controller [8086:2a06] (rev 0c)
            00:1f.2 IDE interface [0101]: Intel Corporation 82801HBM/HEM (ICH8M/ICH8M-E) SATA IDE Controller [8086:2828] (rev 03)
            # ls -l /sys/bus/pci/devices/0000\:00\:1f.2/
            total 0
            ..
            lrwxrwxrwx 1 root root    0 Feb  1 13:06 driver -> ../../../bus/pci/drivers/ata_piix
            ..
            drwxr-xr-x 5 root root    0 Feb  1  2011 host0
            drwxr-xr-x 5 root root    0 Feb  1  2011 host1
            ..
            # ls -l /sys/bus/pci/devices/0000\:00\:1f.2/host0/
            total 0
            drwxr-xr-x 2 root root    0 Feb  1 13:13 power
            drwxr-xr-x 3 root root    0 Feb  1  2011 scsi_host
            lrwxrwxrwx 1 root root    0 Feb  1  2011 subsystem -> ../../../../bus/scsi
            drwxr-xr-x 4 root root    0 Feb  1  2011 target0:0:0
            -rw-r--r-- 1 root root 4096 Feb  1  2011 uevent
            # ls -l /sys/bus/pci/devices/0000\:00\:1f.2/host0/target0\:0\:0/0\:0\:0\:0/driver
            lrwxrwxrwx 1 root root 0 Feb  1 13:13 /sys/bus/pci/devices/0000:00:1f.2/host0/target0:0:0/0:0:0:0/driver -> ../../../../../../bus/scsi/drivers/sd
            # ls -l /sys/bus/pci/devices/0000\:00\:1f.2/host1/
            total 0
            drwxr-xr-x 2 root root    0 Feb  1 13:11 power
            drwxr-xr-x 3 root root    0 Feb  1  2011 scsi_host
            lrwxrwxrwx 1 root root    0 Feb  1  2011 subsystem -> ../../../../bus/scsi
            drwxr-xr-x 4 root root    0 Feb  1  2011 target1:0:0
            -rw-r--r-- 1 root root 4096 Feb  1  2011 uevent
            # ls -l /sys/bus/pci/devices/0000\:00\:1f.2/host1/target1\:0\:0/1\:0\:0\:0/driver
            lrwxrwxrwx 1 root root 0 Feb  1 13:09 /sys/bus/pci/devices/0000:00:1f.2/host1/target1:0:0/1:0:0:0/driver -> ../../../../../../bus/scsi/drivers/sr


    2. ata_generic.  Here ata_generic driver is compiled in and handles all
       ATA controllers.  It successfully takes over AHCI controller (in
       compatibility mode), PATA controller and IDER controller. Though, if
       IDE Redirection is enabled in management console (kernel can see
       devices attached to IDER controller), ATA devices may be named in not
       the order you expect, so 'root=' kernel parameter should be adjust
       correspondingly (or udev from initramfs should be used).  To take over
       any device this driver requires 'all-generic-ide' option set at kernel
       command line:

            ata_generic.all_generic_ide=1

       or

            ata-generic.all-generic-ide=1

       Here is some info about such system config:

            # ls -l /sys/bus/pci/devices/*/driver
            ..
            lrwxrwxrwx 1 root root 0 Feb  1 14:20 /sys/bus/pci/devices/0000:00:03.2/driver -> ../../../bus/pci/drivers/ata_generic
            ..
            lrwxrwxrwx 1 root root 0 Feb  1 14:20 /sys/bus/pci/devices/0000:00:1f.2/driver -> ../../../bus/pci/drivers/ata_generic
            ..
            # lspci -nn | grep IDE
            00:03.2 IDE interface [0101]: Intel Corporation Mobile PM965/GM965 PT IDER Controller [8086:2a06] (rev 0c)
            00:1f.2 IDE interface [0101]: Intel Corporation 82801HBM/HEM (ICH8M/ICH8M-E) SATA IDE Controller [8086:2828] (rev 03)
            # ls -l /sys/bus/pci/devices/0000\:00\:03.2/
            ..
            lrwxrwxrwx 1 root root    0 Feb  1 14:20 driver -> ../../../bus/pci/drivers/ata_generic
            ..
            drwxr-xr-x 6 root root    0 Feb  1  2011 host0
            drwxr-xr-x 4 root root    0 Feb  1  2011 host1
            ..
            # readlink -f /sys/class/block/sda/device
            /sys/devices/pci0000:00/0000:00:03.2/host0/target0:0:0/0:0:0:0
            # ls -l /sys/bus/pci/devices/0000\:00\:1f.2/host2/
            total 0
            drwxr-xr-x 2 root root    0 Feb  1 14:23 power
            drwxr-xr-x 3 root root    0 Feb  1  2011 scsi_host
            lrwxrwxrwx 1 root root    0 Feb  1  2011 subsystem -> ../../../../bus/scsi
            drwxr-xr-x 4 root root    0 Feb  1  2011 target2:0:0
            -rw-r--r-- 1 root root 4096 Feb  1  2011 uevent
            # ls -l /sys/bus/pci/devices/0000:00:1f.2/host2/target2:0:0/2:0:0:0/driver
            lrwxrwxrwx 1 root root 0 Feb  1 14:23 /sys/bus/pci/devices/0000:00:1f.2/host2/target2:0:0/2:0:0:0/driver -> ../../../../../../bus/scsi/drivers/sd
            # ls -l /sys/bus/pci/devices/0000:00:1f.2/host3/
            total 0
            drwxr-xr-x 2 root root    0 Feb  1 14:24 power
            drwxr-xr-x 3 root root    0 Feb  1  2011 scsi_host
            lrwxrwxrwx 1 root root    0 Feb  1  2011 subsystem -> ../../../../bus/scsi
            drwxr-xr-x 4 root root    0 Feb  1  2011 target3:0:0
            -rw-r--r-- 1 root root 4096 Feb  1  2011 uevent
            # ls -l /sys/bus/pci/devices/0000:00:1f.2/host3/target3:0:0/3:0:0:0/driver
            lrwxrwxrwx 1 root root 0 Feb  1 14:24 /sys/bus/pci/devices/0000:00:1f.2/host3/target3:0:0/3:0:0:0/driver -> ../../../../../../bus/scsi/drivers/sr
            # ls -l /sys/class/block/sd*
            lrwxrwxrwx 1 root root 0 Feb  1  2011 /sys/class/block/sda -> ../../devices/pci0000:00/0000:00:03.2/host0/target0:0:0/0:0:0:0/block/sda
            lrwxrwxrwx 1 root root 0 Feb  1  2011 /sys/class/block/sdb -> ../../devices/pci0000:00/0000:00:1f.2/host2/target2:0:0/2:0:0:0/block/sdb
            lrwxrwxrwx 1 root root 0 Feb  1  2011 /sys/class/block/sdb1 -> ../../devices/pci0000:00/0000:00:1f.2/host2/target2:0:0/2:0:0:0/block/sdb/sdb1
            lrwxrwxrwx 1 root root 0 Feb  1  2011 /sys/class/block/sdb2 -> ../../devices/pci0000:00/0000:00:1f.2/host2/target2:0:0/2:0:0:0/block/sdb/sdb2
            lrwxrwxrwx 1 root root 0 Feb  1  2011 /sys/class/block/sdb3 -> ../../devices/pci0000:00/0000:00:1f.2/host2/target2:0:0/2:0:0:0/block/sdb/sdb3
            lrwxrwxrwx 1 root root 0 Feb  1  2011 /sys/class/block/sdb4 -> ../../devices/pci0000:00/0000:00:1f.2/host2/target2:0:0/2:0:0:0/block/sdb/sdb4
            lrwxrwxrwx 1 root root 0 Feb  1  2011 /sys/class/block/sdb5 -> ../../devices/pci0000:00/0000:00:1f.2/host2/target2:0:0/2:0:0:0/block/sdb/sdb5
            lrwxrwxrwx 1 root root 0 Feb  1  2011 /sys/class/block/sdb6 -> ../../devices/pci0000:00/0000:00:1f.2/host2/target2:0:0/2:0:0:0/block/sdb/sdb6


    3. ide_pci_generic.  Here ide_pci_generic driver is compiled in and
       handles all ATA controllers. This driver represents old IDE subsystem,
       and noticeable difference from new ATA subsystem (libata) is that it
       names devices as /dev/hd* instead of /dev/sd*.  As well as ata_generic
       it successfully takes over all AHCI, PATA and IDER controllers. Device
       names here are also different from all what was before, so, 'root='
       kernel parameter should be adjusted. To take over any device this
       driver requires 'all-generic-ide' option set at kernel command line:

            ide-pci-generic.all-generic-ide

       or

            ide-pci-generic.all-generic-ide

       Here is some info about such system config:

            # ls -l /sys/bus/pci/devices/*/driver
            ..
            lrwxrwxrwx 1 root root 0 Feb  1 14:49 /sys/bus/pci/devices/0000:00:03.2/driver -> ../../../bus/pci/drivers/PCI_IDE
            ..
            lrwxrwxrwx 1 root root 0 Feb  1 14:49 /sys/bus/pci/devices/0000:00:1f.2/driver -> ../../../bus/pci/drivers/PCI_IDE
            ..
            # ls -l /sys/bus/pci/devices/0000:00:03.2/
            total 0
            ..
            lrwxrwxrwx 1 root root    0 Feb  1 14:49 driver -> ../../../bus/pci/drivers/PCI_IDE
            ..
            drwxr-xr-x 6 root root    0 Feb  1  2011 ide0
            drwxr-xr-x 4 root root    0 Feb  1  2011 ide1
            ..
            # ls -l /sys/bus/pci/devices/0000:00:03.2/ide0/
            total 0
            drwxr-xr-x 3 root root    0 Feb  1  2011 0.0
            drwxr-xr-x 5 root root    0 Feb  1  2011 0.1
            drwxr-xr-x 3 root root    0 Feb  1  2011 ide_port
            drwxr-xr-x 2 root root    0 Feb  1 14:49 power
            -rw-r--r-- 1 root root 4096 Feb  1  2011 uevent
            # ls -l /sys/bus/pci/devices/0000:00:03.2/ide0/0.0/
            (no 'driver' symlink - module required for floppy to work was not compiled (what module is needed?))
            # ls -l /sys/bus/pci/devices/0000:00:03.2/ide0/0.1/
            ..
            lrwxrwxrwx 1 root root    0 Feb  1 14:50 driver -> ../../../../../bus/ide/drivers/ide-cdrom
            ..
            # ls -l /sys/bus/pci/devices/0000:00:1f.2/
            ..
            lrwxrwxrwx 1 root root    0 Feb  1 14:49 driver -> ../../../bus/pci/drivers/PCI_IDE
            ..
            drwxr-xr-x 5 root root    0 Feb  1  2011 ide2
            drwxr-xr-x 5 root root    0 Feb  1  2011 ide3
            ..
            # ls -l /sys/bus/pci/devices/0000:00:1f.2/ide2/
            total 0
            drwxr-xr-x 5 root root    0 Feb  1  2011 2.0
            drwxr-xr-x 3 root root    0 Feb  1  2011 ide_port
            drwxr-xr-x 2 root root    0 Feb  1 14:51 power
            -rw-r--r-- 1 root root 4096 Feb  1  2011 uevent
            # ls -l /sys/bus/pci/devices/0000:00:1f.2/ide2/2.0/
            ..
            lrwxrwxrwx 1 root root    0 Feb  1 14:51 driver -> ../../../../../bus/ide/drivers/ide-gd
            ..
            # ls -l /sys/bus/pci/devices/0000:00:1f.2/ide2/2.0/block/
            total 0
            drwxr-xr-x 12 root root 0 Feb  1  2011 hde
            # ls -l /sys/bus/pci/devices/0000:00:1f.2/ide3/
            total 0
            drwxr-xr-x 5 root root    0 Feb  1  2011 3.0
            drwxr-xr-x 3 root root    0 Feb  1  2011 ide_port
            drwxr-xr-x 2 root root    0 Feb  1 14:51 power
            -rw-r--r-- 1 root root 4096 Feb  1  2011 uevent
            # ls -l /sys/bus/pci/devices/0000:00:1f.2/ide3/3.0/
            ..
            lrwxrwxrwx 1 root root    0 Feb  1 14:52 driver -> ../../../../../bus/ide/drivers/ide-cdrom
            ..
            # ls -l /sys/bus/pci/devices/0000:00:1f.2/ide3/3.0/block/
            total 0
            drwxr-xr-x 6 root root 0 Feb  1  2011 hdg
            # ls -l /sys/class/block/hd*
            lrwxrwxrwx 1 root root 0 Feb  1  2011 /sys/class/block/hdb -> ../../devices/pci0000:00/0000:00:03.2/ide0/0.1/block/hdb
            lrwxrwxrwx 1 root root 0 Feb  1  2011 /sys/class/block/hde -> ../../devices/pci0000:00/0000:00:1f.2/ide2/2.0/block/hde
            lrwxrwxrwx 1 root root 0 Feb  1  2011 /sys/class/block/hde1 -> ../../devices/pci0000:00/0000:00:1f.2/ide2/2.0/block/hde/hde1
            lrwxrwxrwx 1 root root 0 Feb  1  2011 /sys/class/block/hde2 -> ../../devices/pci0000:00/0000:00:1f.2/ide2/2.0/block/hde/hde2
            lrwxrwxrwx 1 root root 0 Feb  1  2011 /sys/class/block/hde3 -> ../../devices/pci0000:00/0000:00:1f.2/ide2/2.0/block/hde/hde3
            lrwxrwxrwx 1 root root 0 Feb  1  2011 /sys/class/block/hde4 -> ../../devices/pci0000:00/0000:00:1f.2/ide2/2.0/block/hde/hde4
            lrwxrwxrwx 1 root root 0 Feb  1  2011 /sys/class/block/hde5 -> ../../devices/pci0000:00/0000:00:1f.2/ide2/2.0/block/hde/hde5
            lrwxrwxrwx 1 root root 0 Feb  1  2011 /sys/class/block/hde6 -> ../../devices/pci0000:00/0000:00:1f.2/ide2/2.0/block/hde/hde6
            lrwxrwxrwx 1 root root 0 Feb  1  2011 /sys/class/block/hdg -> ../../devices/pci0000:00/0000:00:1f.2/ide3/3.0/block/hdg
            # ls -l /sys/bus/pci/drivers/PCI_IDE/module
            lrwxrwxrwx 1 root root 0 Feb  1 15:01 /sys/bus/pci/drivers/PCI_IDE/module -> ../../../../module/ide_pci_generic


    Hence, to boot linux from cdrom drive on IDER controller, we just need to
    have compiled into the kernel either ata_generic or ide_pci_generic
    driver.  I test this with gentoo livecd and SystemRescueCd. First one has
    ide_pci_generic driver compiled in and should be booted like

        gentoo ide-pci-generic.all-generic-ide

    second one has ata_generic driver compiled and should be booted like

        <..system rescue cd boot options..> ata-generic.all-generic-ide=1

    PS. This was tested on motherboard with Intel PM965 chipset (Centrino
    vPro) with AMT 2.6 (or 2.5?) and kernel 2.6.36.

понедельник, 31 января 2011 г.

Speed comparison for some framebuffer drivers

Speed comparison for frambuffer drivers (uvesafb, vesafb) in two modes:
    - with 8bpp  (1680x1050-8@60) and
    - with 32bpp (1680x1050-32@60).


 *========*=============================================================================================*
 #   \    #                                        scroll method                                        #
 #     \  #-------------------------------*------------------------------*------------------------------*
 # mtrr  \# redraw                        | ypan                         | ywrap                        # 
 *--------*===============================*==============================*==============================*
 #        #                                       uvesafb                                               #
 #        #                                      ---------                                              #
 # 0      #                               #                              # (2.180s, --) @ (12.261s, fb) #
 # 2 (wb) # (15.010s, --) @ (58.550s, fb) # (2.180s, --) @ (12.155s, fb) # (2.180s, --) @ (12.157s, fb) #
 # 3 (wc) # (2.202s,  --) @ (4.230s,  --) # (1.011s, --) @ (6.715s,  -b) # (1.011s, --) @ (6.720s,  -b) #
 *========*=============================================================================================*
 #        #                                       vesafb                                                #
 #        #                                      --------                                               #
 # 0      #                               #                              #                              #
 # 2 (wb) #                               #                              # (3.181s, ??) @ (12.305s, ??) #
 # 3 (wc) # (2.256s,  ??) @ (4.312s,  ??) # (0.235s, ??) @               # (0.289s, ??) @ (6.762s,  ??) #
 *========*=============================================================================================*
 vga text console = (1.263s, --)

 where

    (`cat`_time, [forward_scroll_lag][backward_scroll_lag]) @ (  ...   )
                  8 bpp                                     @   32 bpp

    (TIMEs, [f-][b-]) @ (..)
        
        () @    before @ is measurements for 8bpp mode.
        @ ()    after @ is measurements for 32bpp mode.
        TIME    is real time for command `time cat kernel-parameters.txt`.
        f       means that forward scroll lags in `less` or `vim`.
        b       means that backward scroll lags in `less` or `vim`.
        -       means that scroll in corresponding direction does not lag.


Notes:
    - As expected 'ypan'/'ywrap' scroll methods are faster than 'redraw' for
      both 8bpp and 32bpp with mtrr=2. But with mtrr=3 for 32bpp unexpectedly
      'redraw' scroll method becomes the fastest. Though for 8bpp situation
      remains the same.
    - Also, that's strange, but i don't notice any scroll lag with 'redraw'
      scroll and mtrr=2 for 8bpp, though `cat` time for this mode is long
      enough.
    - results for vesafb is almost the same as for uvesafb, though `cat` time
      for 8bpp with mtrr=3 and 'ywrap'/'ypan' scroll is even lesser (and,
      also, suprisingly lesser, than for vga text console).
    - For mtrr=4 results are the same as for mtrr=2.

Notes for XFree86 Video Timings howto

Some typo in Chapter 11.2 in time to ticks conversion formulas

   Should be

        VR = VAT * HSF (but not VSF!);
        (VFL - VR) = VBT * HSF (but not VSF!);


Definition notes {{{

    dot clock tick = horizontal tick
    dot = raster dot

        All four terms used here interchangeable. Though dot clock tick
        generally refers to time needed to process (draw?) one dot, here it's
        also used to measure horizontal scan line length: we take scan line
        length as number of dot clock ticks passed until monitor have finished
        to draw it.

    scan line tick = vertical tick
    scan line

        These three terms here also used interchangeable. Scan line tick is
        time needed to process (draw?) one horizontal scan line, but it's also
        can be used to measure vertical screen length.

}}}
Frames and frequencies (in ticks) {{{

    DCF = RR * HFL * VFL, (RR == VSF)
    DCF = HFL * HSF
    HSF = VFL * VSF

    where {{{

        DCF (driving clock frequency / dot clock frequency)

            Number of dots (pixels) per second video adapter can emit.  DCF
            should match to monitor's video bandwidth - higher DCF will have
            no effect.

        RR  (refresh rate)

            Number of times per second entire screen is repainted.  (RR is the
            same as VSF);

        HSF (horizontal sync frequency)

            Number of times per second the monitor can write a horizontal scan
            line (HFL dot clock ticks in length).

        VSF (vertical sync frequency)

            Number of times per second the monitor can write a full screen
            (VFL scan line ticks in length). (The same as RR);

        HFL (horizontal frame length)

            Number of dot clock ticks needed for monitor to scan one
            horizontal line, including the inactive left and right borders;

        VFL (vertical frame length)

            Number of scan line ticks needed for monitor to scan entire
            screen, including the inactive top and bottom borders;

    }}}

    On the one hand, HFL is simply number of dots in one horizontal scan line
    and VFL is simply number of scan lines in the entire screen. But we know
    time required to scan one raster dot (duration of one dot clock tick)

        (1 / DCF),

    and time required to scan one horizontal line (duration of one scan line
    tick)

        (1 / HSF)

    so we also can represent HFL and VFL in seconds (see below).

}}}
Sync pulses (in ticks) {{{

    HFL = HR + HGT1 + HSP + HGT2
    VFL = VR + HGT2 + VSP + VGT2
    HB  = HGT1 + HSP + HGT2
    VB  = VGT1 + VSP + VGT2

    where {{{

        HR (horizontal resolution)

            Number of visible horizontal ticks (dot clock ticks). Or simply
            number of visible raster dots;

        VR (vertical resolution)

            Number of visible vertical ticks (scan line ticks). Or simply
            number of visible horizontal scan lines;

        HGT1 (horizontal guard time 1)

            Number of dot clock ticks to wait before sending HSP;

        HSP (horizontal sync pulse)

            Length in dot clock ticks of horizontal sync pulse;

        HGT2 (horizontal guard time 2)

            Number of dot clock ticks between end of HSP and end of horizontal
            frame;

        VGT1 (vertical guard time 1)

            Number of vertical ticks (scan lines) to wait before sending VSP;

        VSP (vertical sync pulse)

            Length in vertical ticks (scan lines) of vertical sync pulse;

        VGT2 (vertical guard time 2)

            Number of vertical ticks (scan lines) between end of VSP and end
            of vertical frame;

        HB (horizontal blanking)

            Length of horizontal blanking interval (see below) in dot clock
            ticks.

        VB (vertical blanking)

            Length of vertical blanking interval (see below) in scan line
            ticks.

    }}}

    HGT1 (VGT1) also called Front Porch and HGT2 (VGT2) - Back Porch.
    Horizontal (vertical) blanking interval - is interval, when beam turned
    off. It consists from three phases: Front porch, Sync pulse, Back porch.
        - Front porch - the beam is black (== blank) and still moving right
          (past the end of the visible part of scan line, but still at the
          same scan line);
        - Sync pulse  - the beam is blacker than black and rapidly moving from
          right physical screen edge to the left to start scan next line;
        - Back porch  - the beam is black (== blank) and moving right again
          (already at the next (now current) scan line, but before the start
          of its visible part);

    Hence, actually what we call horizontal frame locates on two scan lines,
    but if we map all its parts onto one line, they will not overlap. Here is
    illustration:

                        time
    ------------------------------------------------------------------>

     | Scan line N           | Between    | Scan line (N + 1)
     |                       | scanlines  |
     |                       |            |
    >> HR        >> Front   >> sync      >> Back    >> HR        >> ..
    >>           >> porch   >> pulse     >> porch   >>           >> ..
    >> (visible) >> (black) >> (blacker) >> (black) >> (visible) >> ..
     |                                               |
     |      Horizontal frame N                       |


    and here is another one illustration:

                  |      HR (visible) || Front   | 
                  |                   || porch   | 
                  |                   || (black) | 
      R           =====>=====>======>==___>___>___R
      R                                          /R - sync pulse,
      R ..<.........<.........<.........<........ R - move beam to the left
      R/                                          R - (blacker than black)
      R___>___>___=====>                          R
       | Back    |
       | porch   |
       | (black) |

    where

        =       Beam turned on, visible ticks.
        _       Beam turned off, black.
        .       Beam turned off, blacker than black.
        R       Physical screen borders.
        <       Beam moving to the right.
        >       Beam moving to the left.

}}}
Frames and syncs in seconds {{{

    HR = HAt * DCF
    HB = HBt * DCF

    VR = VAt * HSF
    VB = VBt * HSF

    HFL = HFt * DCF
    VFL = VFt * HSF

    where {{{

        HAt (horizontal active time)

            Time (in seconds) needed by monitor to scan HR raster dots.  Or,
            in other words, time required for HR dot clock ticks.

        VAt (vertical active time)

            Time (in seconds) needed by monitor to scan VR scan lines.  Or, in
            other words, time required for VR scan line ticks.

        HBt (horizontal blank time)

            Time (in seconds) needed for HB dot clock ticks.

        VBt (vertical blank time)

            Time (in seconds) needed for VB scan line ticks.

        HFt (horizontal frame time)

            Time (in seconds) needed for HFL dot clock ticks.

        VFt (vertical frame time)

            Time (in seconds) needed for VFL scan line ticks.

        }}}

}}}
Common notes {{{

    HFL is overall number of raster dots in one horizontal frame, or, in other
    words, in the one horizontal scan line. But the screen physical dimensions
    are constant, though HFL (as well as HR) may vary. So, physical length (in
    milimeters) of one raster dot depends from overall number of raster dots in
    horizontal frame, i.e. depends from HFL.  If we increase HFL, then physical
    length of one raster dot will decrease, and, hence, with constant HR,
    physical length of visible area will decrease and black margins will
    increase. And vice versa: if we decrease HFL, then physical length of one
    raster dot will increase, and, hence, with constant HR, physical length of
    visible part of horizontal frame will increase and black margins will
    decrease.

    Duration of Front porch controls the size of right black margin.  Duration
    of Back porch controls the size of left black margin.

    Hence, to move image to the right (left), we should move sync signal
    relative to HB interval to the left (right), effectively changing front
    and back porches.  To squeeze (stretch) image in both (right/left or
    up/down) directions (with constant HR or VR) we should change HFL (VFL)
    and move sync signal in the same relative position in the HB interval, as
    it was before, effectively changing raster dot physical length, and hence
    area occupied by visible part of horizontal (vertical) frame.  To change
    all four visible area's dimensions (with constant RR), we should change
    DCF, effectively changing (HFL * VFL) product.

}}}

четверг, 13 января 2011 г.

Отчет о Новогоднем путешествии "Новогодний Quest 3-8 января 2011 года". Экипаж №40

(отформатированная версия оригинала с форума "Магистрали" )

http://lh6.ggpht.com/_5gQ9RxQ_3Sw/TS8xSx9vd0I/AAAAAAAAAHo/9dIb3P-7mUE/s800/IMG_8896_360x480.JPG

3 января. Первый день путешествия Москва - Покров - Владимир

Мы совсем новички - пилот сел за руль три месяца назад. В таких поездках никогда не участвовали.

http://lh5.ggpht.com/_5gQ9RxQ_3Sw/TS8xSyRSjKI/AAAAAAAAAHs/g8lNpesF9bo/s800/IMG_8664_360x480.JPG

В 8-00 получили задание. Посмотрели карты, бегло пробежали контрольные точки, определили маршрут, около 13 часов выехали. Хотелось поскорее куда-нибудь доехать и отгадать загадку. Первым на нашем пути был Покров. В придорожном магазине нам указали, где стоит памятный крест и шоколадная фея. Радостно взяв свои первые КП, мы бросились к первому встречному мужчине с вопросом об островном монастыре. Мужчина оказался иностранцем, а женщина с ним - его жена - журналисткой. Они давно хотели съездить на остров, но никак не получается. Так в чем же дело? Поехали с нами! По пути наши новые знакомые рассказали нам историю монастыря. Журналистка в свое время сняла о нем фильм. В монастыре, поговорив с сестрами и объяснив кто мы, к нам пригласили матушку, которая открыла нам двери уже запертой церкви. В церкви нас попросили помочь перенести к алтарю целый ящик свечей. Мы, конечно, все сделали, и нам пообещали за это прощение грехов. Если бы все было так просто! Потом мы привезли наших знакомых домой, пообещали выслать им фотографии и поехали во Владимир, поскольку там была забронирована гостиница ( "Золотое кольцо"), которая на ближайшее время становилась нашей базой. С третьего раза заехали на парковку (все куда-то не туда тянуло), поселились в двухместном стандарте (горячая вода + завтрак + интернет, только распечатать несколько листов нам нигде в городе так и не удалось).

4 января. Второй день путешествия Владимир - Лакинск - Петушки - Покров - Новоселово - Владимир

http://lh3.ggpht.com/_5gQ9RxQ_3Sw/TS8rhJ2zSpI/AAAAAAAAAF8/iw2CqeJoLO0/s800/IMG_8584_480x360.JPG

Был посвящен городам на трассе Москва - Владимир. Лакинск особых трудностей не вызвал. Первые встречные мужики подробно рассказали, где найти памятный камень Лакину и как он выглядит. Спортсменов сами заметили. Поразились и порадовались их энергии и напору. Уличные КП в Петушках нашли быстро, посетили неохваченные в первый день музеи и собрали музейные КП. Пожалели, что нет времени отведать горячего шоколода. Решили обязательно приехать потом.

http://lh5.ggpht.com/_5gQ9RxQ_3Sw/TS8rhKPd7xI/AAAAAAAAAGA/GrOUkSEyJHg/s800/IMG_8629_480x360.JPG

А вот памятник Гагарину поискали. Сначала проскочили поворот на мемориал, потом заехали слишком далеко к Андреевской церкви. Там встретили других участников автопробега. Служитель музея рассказал, где стоит стела, и после фотографирования мы уехали. Тихое торжественное место.

5 января. Третий день путешествия Владимир - Суздаль - Гаврилов Посад - Суздаль

http://lh4.ggpht.com/_5gQ9RxQ_3Sw/TS8sBuviCII/AAAAAAAAAGQ/UN8c9sH-GTg/s800/IMG_8735_480x360.JPG

Утром собрали все КП по Владимиру. Трижды пытались попасть с улицы Горького на Большую московскую, чтобы выехать в начало Октябрьского проспекта к памятнику воинам-интернационалистам (КП-58), но безуспешно. Один раз упилили по Судогодскому шоссе в поселок Коммунар, но потом все-таки пробрались куда надо по другим улицам. Дворника (КП-59) искали недолго - примерно знали, где он. А вот из Владимира в Суздаль выехали не той дорогой: выскочили на дорогу на Юрьев-Польский. Возвращаться не хотелось - надоело кружить. Решили продолжить движение, и в Старом дворе повернули по указателю направо. Дорога шла через небольшие деревни Малининский, Тарбаево, Туртино. Лед. Ветер свистит. Метель переметает. На горизонте земля соединяется с небом. Мы одни. А дорога вьется вверх-вниз и вдали уходит в небо. Вот так - дорога в небо... Замечтались-загляделись, и на вершине подъема на льду снесло нас на обочину в сугроб. Прочно так сели, по самое брюхо. Никто не проедет, одни мы, расчитывать не на что. Достали лопату - раскапывать! И вдруг - чудо: встречный джип! Останавливается. Спрашивает нас про трос, и через 20 минут после совместных усилий мы снова на дороге и в строю! Ура, мы спасены из снежного плена. Спасибо-спасибо.

http://lh3.ggpht.com/_5gQ9RxQ_3Sw/TS8sBhnFpWI/AAAAAAAAAGU/CdG8Sp7_KX4/s800/IMG_8742_480x360.JPG

Благополучно проезжаем Суздаль, мчимся в Гаврилов Посад, по пути замечая какая красота проносится мимо. Быстро находим там все точки и возвращаемся на ночевку в Суздаль (забронирована гостиница "Золотой ручей", напротив Кремля, все хорошо, но дороговато). Вечером погуляли по городу.

6 января. Четвертый день путешествия Суздаль - Юрьев-Польский - Городище - Подолец - Юрьев-Польский

http://lh3.ggpht.com/_5gQ9RxQ_3Sw/TS8xSzGg79I/AAAAAAAAAHw/_jpbZMKyAdI/s800/IMG_8782_360x480.JPG

Утро было посвящено памятникам в Суздале. Звонница в Спасо-Ефимьевском монастыре (КП-48) трудностей не вызвала. Удалось даже послушать звоны. Церковь Александра Невского нам указали жители (очень понравилась), а вот церковь Николая Чудотворца (КП-51) в Музее деревянного зодчества не нашли. Пришлось поехать в Кремль и на Кремлевской улице потолкаться с лошадьми. Это нас позабавило, мы быстренько сняли церковь и направились дальше.

Путь наш лежал в Юрьев-Польский. Поехали дорогой через Крапивье - Гавриловское - Цибеево - Обращиха. Эта дорога оказалась более оживленной, чем через Старый двор, и тоже очень красивой. В Юрьев-Польском сняли нужные точки быстро и поехали по деревням. Там тоже нашли все без проблем. Очень понравился Подолец, полюбовались и поехали назад. В пути поснимали закаты и дорогу. Канун Рождества. В гостинице нас ждала бутылка шампанского - подарок от администрации в честь праздника.

7 января. Пятый день путешествия Юрьев-Польский - Кольчугино - Киржач - Александров - Сергиев Посад - Александров

http://lh3.ggpht.com/_5gQ9RxQ_3Sw/TS8sCESLURI/AAAAAAAAAGc/8WdAh_ujNM0/s800/IMG_8858_480x360.JPG

В этот день мы объехали наибольшее количество точек. В Кольчугино искали долго главную площадь с бюстом Кольчугина (КП-17), проверили три из четырех въездов в город в поисках сталевара, а вот Ильича нашли быстро - знали, где он спрятался. В Завалино произвела впечатление переправа через мостик из труб, а в Карабаново - проезд через арки под ж.д.

http://lh3.ggpht.com/_5gQ9RxQ_3Sw/TS8xTE-vE8I/AAAAAAAAAH0/NBeXid6Wv7Y/s800/IMG_8898_360x480.JPG

Очень понравился Махрищский монастырь, Киржач. Вечером прибыли в Александров. Музей уже был закрыт. Чтобы сэкономить время на следующий день, решили съездить в Сергиев Посад. Около Лавры быстро собрали все точки, скит нашли тоже легко, а вот скульптуру Николая Чудотворца пришлось поискать: спросить не у кого, сами найти не можем, темно, собаки воют, страшно. Огорченные, даже уезжать собрались, но вдруг по пустынной улице идет человек, мы - к нему. Рассказал нам все, оказалось - священник, нас расспросил - кто такие, зачем пожаловали. Мы ему про свой долгий путь поведали. Одобрил, благословил. К 12 часам ночи мы вернулись в гостиницу в Александров.

8 января. Шестой день путешествия Александров - Лукьянцево - Сергиев Посад-Москва

http://lh4.ggpht.com/_5gQ9RxQ_3Sw/TS8xTXF76tI/AAAAAAAAAH4/eQeydTBPQIg/s800/IMG_8925_360x480.JPG

С утра - в Лукьянцево. Там на ледяной дороге встретили деда на велосипеде "Украина" и пообщались с местными молодыми людьми, которые смотрели на нас с завистью: Вы из "Магистрали"? Да. Здорово. Мы тоже хотим так же путешествовать. Следующий раз обязательно поедем.

Музей в Александрове очень понравился, а дороги - нет, самые разбитые. Нам сказали, что 31 декабря мэра города посадили за взятки. "Тебя посодют, а ты не воруй!" К 13-30 подъехали к Мытищам, потолкались в пробке. Вот мы и дома. Общий пробег составил 1334 км.

Послесловие.

http://lh6.ggpht.com/_5gQ9RxQ_3Sw/TS8mTPNufaI/AAAAAAAAAFo/RSCKQg6g8CM/s800/IMG_8672_270x360.JPG

Понравилось. Очень. Большое спасибо организаторам, работникам музеев, местным жителям, которые знают и любят свои города. Глоток свободы и свежего воздуха. Заряд надолго. Обязательно вернемся.

А также отдельная благодарность создателям открытой и бесплатной карты OpenStreetMap и навигационной программы Navit.

С уважением, экипаж № 40.