Шукати в цьому блозі

субота, 30 січня 2010 р.

Компиляция 2.6.32.6 для Debian GNU/Linux Lenny

Пиздец... На хабре все такие умные и не нуждающиеся ни в какой помощи.
Знаю, что так всегда и бывает. Собираешься поделиться опытом, помочь хоть чем-то людям, а в ответ никакой благодарности, а только лишь распальцовки в духе: «Все кругом козлы, а я лошадь д'Артаньяна».

Что-ж, оставлю эту заметку, как есть, себе на память, коль там она никому не нужна.


Решил поставить на свой EeePC Asus 1005HA Debian GNU/Linux Lenny.
Сразу-же вылез один удручающий момент — нормально не заработал ни Ethernet ни WiFi.
Почитал мануалы, погуглил и пришёл к выводу, что надо бы пересобрать ядро. И всё бы ничего, но в процессе компиляции вылезла неприятная ошибка, примерно такого содержания:

lguest.c: error: sys/eventfd.h: No such file or directory
lguest.c: In function ‘create_thread’:
lguest.c: warning: implicit declaration of function ‘eventfd’
make: *** [lguest] Error 1

Решил поглядеть на своей рабочей Squeeze, через apt-file, где у неё располагается этот файл. Оказалось, что в libc6-dev. Вот только в Lenny, в пакете libc6-dev такого файла не оказалось. Конечно я прекрасно осознаю, что он мог бы появиться после апдейта, но ведь весь фокус именно в том и состоял, что проапдейтиться я не могу — нет ни Ethernet ни WiFi.
Решил погуглить на эту тему. Ну ведь не один я, наверняка, являюсь таким вот «рыцарем печального образа». Мои ожидания оправдались буквально при открытии первой-же ссылки. Да, такая проблема у народа действительно есть и о том как её решить тоже известно.
Открываем на редактирование Documentation/lguest/Makefile находим и меняем
all: lguest
на
all:

Опять запускаем компиляцию и радуемся её успешному окончанию.

четвер, 21 січня 2010 р.

Проволочные рамки

Имеем не совсем шустрый десктоп и Gnome? При перетаскивании окошек чувствуем раздражающие задержки? Тогда нам слегка поможет такой вот фокус:
gconftool-2 --type bool --set /apps/metacity/general/reduced_resources true
и вуа-ля перетаскивается не всё окошко, а лишь его проволочное отображение. Мелочь, а приятно ;)

понеділок, 28 грудня 2009 р.

Chrome и представление даты в u64

Информация для размышления по теме.

Заметка №1:
function DateTimeToChromeTime(Time: TDateTime): int64;
var
LocalFileTime: TFileTime;
SystemTime: TSystemTime;
begin
DateTimeToSystemTime(Time, SystemTime);
SystemTimeToFileTime(SystemTime, LocalFileTime);
Result := LocalFileTime.dwHighDateTime;
Result := Result * $100000000;
Result := Result + LocalFileTime.dwLowDateTime;
Result := Result div 10;
end;


Заметка №2:
static inline u64 get_rtc(void)
{
unsigned int hi, lo, hi2;

do {
asm volatile("mfrtcu %0; mfrtcl %1; mfrtcu %2"
: "=r" (hi), "=r" (lo), "=r" (hi2));
} while (hi2 != hi);
return (u64)hi * 1000000000 + lo;
}

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

Потоковое видео средствами ffserver & ffmpeg

Статья взята с habrahabr.ru, ещё не пробовал делать то, что тут написано...


Для организации трансляции нам потребуется:

  • Linux
  • FFmpeg (включает в себя ffserver)
Теория
FFmpeg — это набор свободных библиотек с открытым исходным кодом, которые позволяют записывать, конвертировать и передавать цифровое аудио и видео в различных форматах. Он включает libavcodec, библиотеку кодирования и декодирования аудио и видео и libavformat, библиотеку мультиплексирования и демультиплексирования в медиаконтейнер. Название происходит от названия экспертной группы MPEG и «FF», означающего «fast forward».

© Wikipedia

ffserver идёт в комплекте с ffmpeg и выполняет роль медиа-сервера — получает видеопоток от ffmpeg, который может быть запущен на другой машине, и раздаёт его счастливым пользователям.
Каждый получаемый поток называется Feed’ом (далее будет просто фид). Таких потоков может быть несколько, так же как и отдаваемых (выходных).
FFmpeg у нас будет захватывать видео с веб-камеры или читать из файла.

Практика


Сначала настроим ffserver, чей конфиг лежит в /etc/ffserver.conf:
  1. Port 8090
  2. BindAddress 0.0.0.0
  3. MaxClients 100
  4. MaxBandwidth 20000
  5. NoDaemon
  6. # Фид, надо запомнить feed.ffm, он нам потребуется при запуске ffmpeg
  7. File /tmp/feed.ffm
  8. FileMaxSize 3M
  9. # Ранее объявленный фид
  10. Feed feed.ffm
  11. Format flv
  12. VideoCodec flv
  13. VideoFrameRate 30
  14. VideoBufferSize 80000
  15. VideoBitRate 200
  16. # Качество видео от 1 до 31, 1 == отлично 31 == фи!
  17. VideoQMin 1
  18. VideoQMax 5
  19. # Разрешение, везде должно быть одинаково!
  20. VideoSize 352x288
  21. PreRoll 1
  22. # Если у вас есть микрофон, или вы транслируете видео со звуком, закомментируйте эту строчку
  23. Noaudio
  24. # Флешка test.swf для просмотра трансляции
  25. Feed feed.ffm
  26. # Будет запускаться в Adobe Flash Player
  27. Format swf
  28. VideoCodec flv
  29. VideoFrameRate 30
  30. VideoBufferSize 50000
  31. VideoBitRate 100
  32. VideoQMin 1
  33. VideoQMax 5
  34. # Разрешение, везде должно быть одинаково!
  35. VideoSize 352x288
  36. PreRoll
  37. # Если у вас есть микрофон, или вы транслируете видео со звуком, закомментируйте эту строчку
  38. Noaudio
Пускаем ffserver:
$ ffserver

Пускаем ffmpeg:
$ ffmpeg -s 352x288 -r 30 -f video4linux2 -i /dev/video0 http://localhost:8090/feed.ffm
-s разрешение, указанное в конфиге ffserver, -r количество кадров/секунду, -f формат, -i путь к камере (или к видео-файлу), http://localhost:PORT/FEED это адрес, где ffserver будет ждать наш поток

PS: если выдаст ошибку, то можно попробовать формат v4l (-f video4linux)

Открываем в браузере http://localhost:8090/test.swf и широко улыбаемся:)

Для отправки видео поменяем параметр -i на путь к файлу, уберём -f (ffmpeg сам определит формат файла):
$ ffmpeg -s 352x288 -r 30 -i ~/big_buck_bunny.ogg http://localhost:8090/feed.ffm

Ну а что бы вставить нашу флешку в html-страницу используем следующий код:
src="http://localhost:8090/test.swf" width="550" height="400"></embed>


Q: А можно ли экран потоково отдавать, Х11 должен же иметь какой-то девайс в /dev?
A: Да, можно.
ffmpeg -f x11grab -r 30 -s 352x288 -i :0.0 localhost:8090/feed.ffm
Если будете менять разрешение, то и в конфиге ffserver не забудьте.

Chromium OS

Решил пройтись по инструкции сборки и установки Chromium OS, тут опишу пошагово то, что сейчас собираюсь делать. А вот заработает ли всё это добро и на каком этапе я решу остановиться - это уже второй вопрос ;)

Как обычно всё, что я буду делать - будет под Debian GNU/Linux.

Для начала скачаем исходники, где и как - внимательно читаем инструкцию. Надо сказать, что в debian'овской сборке git'а не нашёлся gclient, а потому пришлось скачать исходники wget'ом и распаковать:
olden@og:~$ mkdir chromiumos
olden@og:~$ cd chromiumos/
olden@og:~/chromiumos$ wget \
http://build.chromium.org/buildbot/archives/chromiumos-0.4.22.8.tar.gz
olden@og:~/chromiumos$ tar xzf chromiumos-0.4.22.8.tar.gz
olden@og:~/chromiumos$ ln -s chromiumos-0.4.22.8/src/ src
О полученной иерархии структуры каталогов можно почитать в документе "Структура директорий".

Переходим в созданной иерархии к исходникам:
olden@og:~/chromiumos$ cd ~/chromiumos/src/scripts
Не забываем установить пакет debootstrap:
olden@og:~/chromiumos/src/scripts$ aptitude -y install debootstrap
Создаём репозиторий Chromium OS:
olden@og:~/chromiumos/src/scripts$ ./make_local_repo.sh
Этот процесс займёт некоторое время...
Дождались? Отлично. Поехали дальше.
Создаём окружение сборки:
olden@og:~/chromiumos/src/scripts$ ./make_chroot.sh
Опять придётся подождать...
Раз, два, три, четыре, пять. Начинаем собирать. Так как в Debian'е в git'е нет gclient'а, а платформа у нас x86 то ничто не мешает воспользоваться вторым методом из указанной выше инструкции:
olden@og:~/chromiumos/src/scripts$ mkdir -p ~/chromiumos/src/build/x86/local_assets
olden@og:~/chromiumos/src/scripts$ cd ~/chromiumos/src/build/x86/local_assets
olden@og:~/chromiumos/src/build/x86/local_assets$ wget \
http://build.chromium.org/buildbot/archives/chromium-chromiumos-r32516.zip \
-O chrome-chromeos.zip
olden@og:~/chromiumos/src/build/x86/local_assets$ cd ~/chromiumos/src/scripts
Ну вот... Всё ближе и ближе подходим к финалу.
Собираем Chromium OS!
Входим в chroot окружение:
olden@og:~/chromiumos/src/scripts$ ./enter_chroot.sh
Mounting chroot environment.
(chroot)olden@og:~/trunk/src/scripts$
Включаем наш аккаунт в сборку, дабы не морочить себе голову с заведением пользователей:
(chroot)olden@og:~/trunk/src/scripts$ ( cd ../platform/pam_google && ./enable_localaccount.sh olden )
Enabling local account.  Remove chromeos_pam_localaccount.h to disable.
Имхо можно так завести нескольких пользователей, но так как у меня только один пользователь, то проверить это не представляется возможным, но всё в наших руках! :)
(chroot)olden@og:~/trunk/src/scripts$ ./set_shared_user_password.sh
Enter password for shared user account: shareduserpassword
Shared user password set in /home/olden/trunk/src/scripts/shared_user_passwd.txt
Собираем пакеты и ядро:
(chroot)olden@og:~/trunk/src/scripts$ ./build_platform_packages.sh
(chroot)olden@og:~/trunk/src/scripts$ ./build_kernel.sh
Это займёт время не на одну чашку кофе...
Ну и самый ответственный момент,- создаём образы:
(chroot)olden@og:~/trunk/src/scripts$ ./build_image.sh
После чего можно приступать к созданию носителей, откуда собираемся загружать нашу Chromium OS.
Но об этом я расскажу в следуюющей заметке...
If you created or changed a DOS partition, /dev/foo7, say, then use dd(1)
to zero the first 512 bytes:  dd if=/dev/zero of=/dev/foo7 bs=512 count=1
(See fdisk(8).)
Done.  Image created in /home/olden/trunk/src/build/images/999.999.35309.183057-a1
To copy to USB keyfob, outside the chroot, do something like:
./image_to_usb.sh --from=~/chromeos/src/build/images/999.999.35309.183057-a1 --to=/dev/sdb
To convert to VMWare image, outside the chroot, do something like:
./image_to_vmware.sh --from=~/chromeos/src/build/images/999.999.35309.183057-a1

вівторок, 15 грудня 2009 р.

Upgrading Debian From i386 To amd64

Upgrading Debian From 32-bit To 64-bit

*****WARNING*****

This procedure is, in every possible respect, a bad idea. If it eats your firstborn, please don't come crying to me.
You probably don't need a complete backup of your data to do this safely, but you DO, without question, need boot media that has lots of things on it, like dpkg, for when you fry your system. The expected result of this procedure is a machine on which nothing works, where "nothing" includes "ls".
Seriously; the official documentation specifically declares this procedure to be impossible, which should give you some idea of how bad an idea this is.
*****WARNING*****

Target Audience

Sysadmins that have a 32-bit system that they'd really like to be 64-bit without re-doing all their configuration.
This really is for professional-level sysadmins; I don't suggest that anyone who hasn't seen a Debian box through a few manual broken-apt recoveries with dpkg, and libc upgrades, and kernel upgrades, even consider this.
Smart admins do all the config with cfengine, so this isn't an issue, but I didn't know that when I made this machine. :D

Preparation

Kernel

To make this work, you MUST have a 64-bit kernel installed. Seriously; you can't imagine how badly you'll fuck your system if you follow these steps without a 64-bit kernel.
If "uname -a" doesn't end with "x86_64 GNU/Linux", stop RIGHT NOW and fix it.
If you don't know how to upgrade your kernel, stop reading this. It's not for you.

Statically-Linked Shell And Stuff

To assist possible recovery issues, I strongly suggest apt-getting busybox and running it as a shell ("/bin/busybox ash") in a separate window. Make sure ls and cp and so on work even with PATH=''

List Your Packages

Run dpkg --get-selections and save it to a safe place. You'll want to know what you had installed when apt-get starts trying to make shit up.

Manual Package Downloads

Since both apt-get and dpkg think you're on an i386 machine, 64-bit kernel or no, you're going to have to get yourself some packages.

32-bit Compatibility Libraries

Unless the idea of every binary on your system suddenly ceasing to function sounds like your idea of a good time, you're going to need the 32-bit compatibility libraries for amd64, and you're going to need them before you upgrade libc. Start with the ia32-libs package (i.e. http://packages.debian.org/testing/libs/ia32-libs, but replace "testing" with your actual version) and download the amd64 version of it and ALL its dependencies.
You should now have a directory that looks like this:
ia32-libs_1.19_amd64.deb lib32asound2_1.0.14a-1_amd64.deb lib32gcc1_4.2-20070609-1_amd64.deb lib32ncurses5_5.6-3_amd64.deb lib32stdc++6_4.2-20070609-1_amd64.deb lib32z1_1.2.3-15_amd64.deb libc6-i386_2.5-9_amd64.deb lsb-release_3.1-23.1_all.deb 

dpkg, apt-get, and friends

Grab amd64 versions of dpkg, apt-get, and all their dependencies. You may not end up installing them all manually, but having them around can't hurt. Also grap apt-listchanges and apt-utils.
apt_0.6.46.4-0.1_amd64.deb binutils_2.17cvs20070426-8_amd64.deb bzip2_1.0.3-6_amd64.deb coreutils_5.97-5.3_amd64.deb cpio_2.7-3_amd64.deb debianutils_2.21_amd64.deb dpkg_1.14.4_amd64.deb ed_0.2-20_amd64.deb gcc-4.2-base_4.2-20070609-1_amd64.deb libacl1_2.2.42-1_amd64.deb libasound2_1.0.14a-1_amd64.deb libattr1_2.4.32-1.1_amd64.deb libbz2-1.0_1.0.3-6_amd64.deb libc6_2.5-9_amd64.deb libdb4.4_4.4.20-8_amd64.deb libgcc1_4.2-20070609-1_amd64.deb libgdbm3_1.8.3-3_amd64.deb libgpmg1_1.19.6-25_amd64.deb libncurses5_5.6-3_amd64.deb libreadline5_5.2-3_amd64.deb libselinux1_2.0.15-2_amd64.deb libsepol1_2.0.3-1_amd64.deb libstdc++6_4.2-20070609-1_amd64.deb make_3.81-3_amd64.deb ncurses-bin_5.6-3_amd64.deb patch_2.5.9-4_amd64.deb perl-base_5.8.8-7_amd64.deb perl_5.8.8-7_amd64.deb sed_4.1.5-2_amd64.deb 

The Actual Installation

Please note that order is very important. Read everything before starting. If this order doesn't seem eminently sensible to you, you may want to stop here.

32-bit Compatibility Libraries Install

First is the install of the 32-bit compat libc. This is the fun step:
dpkg --force-depends --force-architecture --force-overwrite -i libc6-i386_2.5-9_amd64.deb 
Yes, you really do need all those. When you're done, /lib/ld-linux.so.2 should be a symlink into /emul/ia32-linux, like this:
lrwxrwxrwx 1 root root 34 Jun 26 08:57 /lib/ld-linux.so.2 -> /emul/ia32-linux/lib/ld-linux.so.2* 
If it's not (it wasn't for me) run:
ln -sf /emul/ia32-linux/lib/ld-linux.so.2 /lib/ld-linux.so.2 
Check that it worked; there should be lots of stuff in /emul/ia32-linux, and:
$ ls -l /usr/lib32 /lib32                         lrwxrwxrwx 1 root root 20 Jun 26 08:56 /lib32 -> /emul/ia32-linux/lib/ lrwxrwxrwx 1 root root 24 Jun 26 08:56 /usr/lib32 -> /emul/ia32-linux/usr/lib/ 
Run "dpkg --force-architecture -i" for all of the other 32-bit compat libs until they're all installed. Should be uneventful.

64-bit libc Install

While this should be uneventful, I mention it separately because if you're going to fuck your system, this is where it'll happen. Run:
dpkg --force-architecture -i libc6_2.5-9_amd64.deb 

dpkg, apt-get, And Friends Install

If you can still "ls" and such in a non-static shell, congratulations. Now "dpkg --force-architecture -i" the packages for apt-get, dpkg, apt-listchanges, and apt-utils. Then keep trying to run each of apt-get, dpkg, apt-listchanges and apt-extracttemplates until they actually run without erroring.
For apt-listchanges, I had to install (in this order):
python2.4-minimal python2.4 python-apt zlib1g libdb-4.4 
That last isn't necessary for getting it to just run, but it was necessary to stop "apt-get -f install" from barfing.
At this point, "dpkg --print-architecture" should say amd64, as should most of "dpkg-architecture" if you have that installed, and "apt-get update" (which you should run) should download a bunch of files to /var/lib/apt/lists that have "amd64" in the name. That's good.

Upsetting apt-get

Run "apt-get update" followed by "apt-get -f install". Keep adding packages until "apt-get -f install" doesn't give you any library or ELFCLASS errors.
Having done so, things will probably still be upset, and you may need to do manual dpkg things. Steps I had to take to make "apt-get -f install" run to completion:
dpkg -i /var/cache/apt/archives/libperl5.8_5.8.8-7_amd64.deb 
Note that apt-get will Make Shit Up during this process. For example, it tried to give me exim4-daemon-light, which I never had installed (I use exim4-daemon-heavy). This is what the dpkg selections list is for. Hence:
apt-get -f install exim4 exim4-daemon-heavy apache2-mpm-prefork console-tools libconsole 
Then there was funkiness because someone broke tex's dependencies. :P

Ugrading Everything Else

Here's the fun part: catching all the things that haven't been gotten yet. First, make a list of remaining i386 packages:
for package in $(grep '[^e]install' dpkg_get_selections.out | awk '{ print $1 }') do     dpkg -s $package | grep -q 'Architecture: i386' && echo $package done >update 
Then open up yourself a copy of the update file (so you can fix the many problems that will occur) and run:
apt-get --reinstall install $(cat update | tr '\012' ' ') 
Keep editing and running until it works.
If you thought the last step downloaded a lot of packages, you may be surprised by the results of this step.
After all of that's done, you might want to check your currently installed packages for further badness:
for package in $(dpkg -l |  grep '^i' | awk '{ print $2 }') do     dpkg -s $package | grep -q 'Architecture: i386' && echo $package done >update2 
With this list, though, you almost certainly want to remove most or all of them: if they weren't installed as a dependency of the other stuff, you almost certainly don't care. Trim local stuff out (like kernel packages) and run:
dpkg -r $(cat update2 | tr '\012' ' ') 
That should pretty much do it.

Сам я не пробовал так апгрейдится... пока не пробовал... за ненадобностью. Но взял "на заметку". Оригинал статьи находится тут http://teddyb.org/~rlpowell/hobbies/debian_arch_up/.

понеділок, 14 грудня 2009 р.

MySQL: Восстановление пароля root

Останавливаем сервер MySQL:
# /usr/local/etc/rc.d/mysql-server.sh stop
Stopping mysql.
Waiting for PIDS: 83119, 83119.

Запускаем mysqld с параметром –skip-grant-tables, указав стартовать от имени пользователя mysql (или от другого непривелигерованного пользователя, но не от root’а.
Теперь запускаем mysql и делаем:
\u mysql
Правим таблицу user, очищая поле с паролем для root@localhost. Всё, пароля для root'а больше нет. Не забываем сказать flush privileges и перезапустить сервер mysql. Далее заходим под пользователем root@localhost и устанавливаем ему такой пароль какой нам необходим.