Поиск по этому блогу

Загрузка...

среда, 7 марта 2012 г.

Как конвертировать Debian Wheezy (или более новую) систему в btrfs


Новый GRUB может обрабатывать /boot раздел в формате btrfs, так что теперь не нужно иметь отдельный раздел отформатированный в ext2/3/4.

Далее предполагаем, что вся ваша файловая система представлена одной партицией. Если же у вас под каждый раздел /usr/, /var и т.д. создана отдельная партиция то модифицируйте их по отдельности, согласно приведённой ниже инструкции.

Итак, приступим…

1. Сделайте бэкап раздела. Никто не несёт ответственности за возможную утерю данных кроме вас самих!
2. Скачайте и запишите на CD или флешке Debian Wheezy (или более новый).
3. Загрузитесь с созданного загрузочного образа.
4. fsck -f /dev/sdaX (где /dev/sdaX это root-партиция)
5. Проверьте доступен ли ваш любимый текстовый редактор (vim, ed, mine и т.д.) и btrfs-tools, если нет то установите их.
6. btrfs-convert /dev/sdX
7. mount /dev/sdX /mnt
8. Подмонтируйте в /mnt разделы /proc, /dev, /sys:
mount -o bind /dev /mnt/dev
mount -o bind /sys /mnt/sys
mount -o bind /proc /mnt/proc
9. chroot /mnt
10. Отредактируйте /etc/fstab, найдите строку для root-раздела (/) и смените UUID на прямое описание /dev/sdX, смените тип файловой системы с ext3/ext4 на btrfs, уберите «лишние» опции оставив просто defaults, замените последнюю цифру 1 на 0.
11. ls -la /boot
Вы должны увидеть файл вроде: initrd.img-3.1.0-1-686-pae.
Строка после 'initrd.img-' это версия ядра которую необходимо использовать далее.
12. mkinitramfs 3.1.0-1-686-pae -o /boot/initrd.img-3.1.0-1-686-pae
13. grub-install /dev/sdX
14. update-grub
15. exit (выходим из chroot окружения)
16. Размонтируем в /mnt разделы /proc, /dev, /sys и сам /mnt:
umount /mnt/proc
umount /mnt/dev
umount /mnt/sys
umount /mnt
17. Перегружаемся и молимся.
18. Через некоторое время система должна загрузиться, вводим 'mount' и убеждаемся, что она работает на btrfs.
19. Выполните:
update-initramfs -u -t -kall

Если всё прошло успешно то можно смело удалять бэкап /ext2_saved который был создан в процессе преобразования файловой системы. Делаем это так:
btrfs subvolume delete /ext2_saved


ps: Вольный перевод статьи.

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

Samsung AllShare и Linux

Купили телевизор Samsung и обнаружили на нём AllShare, но совершенно не хочется ставить ради использования этой функции Windows? Тогда читаем ниже.

Что такое AllShare, при более близком рассмотрении, и с чем её едят? Ну у корейцев видимо всё не как у людей и оттого они обозвали то, что все называют DLNA по своему - AllShare, ну чтобы враги не догадались, а может оттого, что поддерживают DLNA коряво и не получили соответствующей сертификации, а использовать ой как хочется.

А что такое DLNA? DLNA (Digital Living Network Alliance) — стандарт, позволяющий совместимым устройствам передавать и принимать по домашней сети различный медиа-контент (изображения, музыку, видео), а также отображать его в режиме реального времени. Это технология для соединения домашних компьютеров, мобильных телефонов, ноутбуков и бытовой электроники в единую цифровую сеть. Устройства, которые поддерживают спецификацию DLNA, по желанию пользователя могут настраиваться и объединяться в домашнюю сеть в автоматическом режиме.
Средой передачи медиаконтента обычно является домашняя локальная сеть (IP-сеть). Подключение DLNA-совместимых устройств к домашней сети может быть как проводным (Ethernet), так и беспроводным (Wi-Fi).

Выбор DLNA сервера может показаться не тривиальной задачей, тем более, что выбор достаточно велик. У себя дома, под домашним Debian'ом решил поднять minidlna.

Итак, с чего же начать? Ну как всегда, с установки зависимостей, скачки исходников и их компиляции.

$ sudo aptitude install libavcodec-dev libavformat-dev libavutil-dev libflac-dev libvorbis-dev libogg-dev libid3tag0-dev libexif-dev libjpeg-dev
$ wget "http://downloads.sourceforge.net/project/minidlna/minidlna/1.0.24/minidlna_1.0.24_src.tar.gz?r=http%3A%2F%2Fsourceforge.net%2Fprojects%2Fminidlna%2Ffiles%2Fminidlna%2F1.0.24%2F&ts=1330931715&use_mirror=ignum" -O minidlna_1.0.24_src.tar.gz
$ tar xzf minidlna_1.0.24_src.tar.gz
$ cd minidlna-1.0.24/
$ make && sudo make install && sudo cp minidlna.conf /etc/

Теперь, когда сервер DLNA скомпилирован и установлен, приступим к его настройке. В этом, собственно, тоже не должно возникнуть никаких сложностей.

$ sudo vim /etc/minidlna.conf

В network_interface прописываем через запятую интерфейсы на которых будет жить сервер DLNA.
Настройка media_dir может не ограничиваться лишь одним ресурсом, этих строк может быть много. media_dir может включать либо просто имя каталога, либо начинаться с A, V или P, что означает, соответственно, назначение ресурса - аудио, видео, картинки.
friendly_name описывает имя которое будет светиться в списке источников для DLNA ресурсов.
notify_interval этот параметр описывает интервал через который происходит уведомление о вновь появившихся ресурсах на DLNA сервере. Значение по-умолчанию в 900 секунд наверное всё-таки слишком велико.
db_dir это директория где DLNA сервер будет хранить свой кеш о представляемых объектах.
log_dir - директория где будет вестись журнал DLNA сервера.

Теперь настало время произвести первый запуск нашего DLNA сервера и посмотреть, что при этом происходит:

minidlna -d -f /etc/minidlna.conf

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

На этом можно было бы и закончить, но ведь наверняка будет очень лениво каждый раз запускать сервер в ручную, а оттого создаём  стартап-скрипт и помещаем его в /etc/init.d:
#! /bin/sh
### BEGIN INIT INFO
# Provides: minidlna
# Required-Start: $local_fs $remote_fs $syslog $network
# Should-Start:
# Required-Stop: $local_fs $remote_fs $syslog $network
# Should-Stop:
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Minidlna
# Description: DLNA Media Server
### END INIT INFO

## EDIT FROM HERE

# Installation details
MINIDLNA="/usr/sbin/minidlna"
ARGS="/etc/minidlna.conf"

# Where to keep a log file
MINIDLNA_LOG="/var/log/minidlna.log"

# Where the PID lives
PID_FILE="/var/run/minidlna.pid"

## STOP EDITING HERE

# The path that is to be used for the script
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

set -e

# Only start if we can find the minidlna.conf.
test -x $MINIDLNA || exit 0

# Parse command line parameters.
case $1 in
  start)
 echo -n "Starting MiniDLNA: "
 $MINIDLNA -f $ARGS -P $PID_FILE  >> $MINIDLNA_LOG 2>&1
 echo "ok"
 ;;
  stop) 
  echo -n "Stopping MiniDLNA: "
    for pidf in `/bin/ls $PID_FILE 2>/dev/null`; do
            if [ -s $pidf ]; then
                kill `cat $pidf` >/dev/null 2>&1
            fi
   rm -rf $PIF_FILE
    done 
 echo "ok"
 ;;
  restart|reload|force-reload)
 echo "Restarting MiniDLNA: "
 
        $0 stop
 sleep 2
 $0 start
 
 ;;
  *)
 # Print help
 echo "Usage: /etc/init.d/minidlna {start|stop|restart|reload|force-reload}"
 exit 1
 ;;
esac

exit 0

Содержимое скрипта было позаимствовано (зачем изобретать велосипед?), единственно, что были добавлены заголовки для нормального выполнения update-rc.d:

$ sudo update-rc.d minidlna defaults

Уровни выполнения актуальны для Debian, Ubuntu и, наверное, производных дистрибутивов. В принципе поменяв уровни выполнения этот скрипт можно использовать и в других дистрибутивах поддерживающих LSB заголовки.

Собственно на этом с настройкой сервера покончено. Ну, а на телевизоре сначала разрешаем AllShare, затем находим все DLNA сервера в широковещательном домене, добавляем их, видим их в Source и наслаждаемся их присутствием, и просмотром медиаконтента.

ps: Справедливости ради отмечу, что в репозитории Debian'а есть пакет mediatomb и тем кому лень возиться со сборкой minidlna могут установить и настроить его:

$ sudo aptitude install mediatomb

вторник, 28 февраля 2012 г.

Perl: какие модули установлены?

Как узнать какие дополнительные модули для Perl установлены?
Для начала, если не установлен, ставим perl-modules:
sudo aptitude install perl-modules
Затем рисуем небольшой скрипт:
#!/usr/bin/perl -w
use strict;
use ExtUtils::Installed;

my $instmod = ExtUtils::Installed->new();
foreach my $module ($instmod->modules()) {
    my $version = $instmod->version($module) || "-"; print "$module --> $version \r\n";
}
запускаем его и получаем результат примерно такого вида:
CGI::FastTemplate --> 1.09 
Convert::ASN1 --> 0.22 
Convert::ASN1::asn1c --> 0.07 
Cope --> - 
Data::Dumper --> 2.128 
Env::Path --> 0.18 
ExtUtils::CBuilder --> 0.2703 
ExtUtils::ParseXS --> 2.2206 
File::Slurp --> 9999.19 
File::Which --> 1.09 
IO::Tty --> 1.10 
IPC::Run --> 0.90 
IPC::Run3 --> 0.044 
Lingua::RU::PhTranslit --> 0.4 
Net::CSTA --> 0.04 
Net::CSTAv3::Client --> 0.05 
Net::SMTP::Server --> 1.1 
Net::SNMP --> v6.0.0 
Perl --> 5.10.0 
Probe::Perl --> 0.01 
Test::Harness --> 3.22 
Test::Script --> 1.07 
Test::Simple --> 0.98 
Thread::Synchronized --> 0.03 
YAML --> 0.71 

среда, 8 февраля 2012 г.

Perl: как сменить позицию курсора в окне терминала?

Используем Term::Cap (описание) и POSIX (описаниеPOSIX::Termios).
#!/usr/bin/perl -w

use strict;
use Term::Cap;

my $ospeed = 9600;

eval {
    # Получиь скорость вывода на терминал
    require POSIX;
    my $termios = new POSIX::Termios;
    $termios->getattr;
    $ospeed = $termios->getospeed;
};

# Инициализация терминала
my $terminal = Term::Cap->Tgetent({ TERM => undef, OSPEED => $ospeed });
$terminal->Trequire(qw/cm cl rc sc/);

# Запомнить позицию курсора
print $terminal->Tputs('sc', 1);

# Очистить экран
print $terminal->Tputs('cl', 1);

foreach my $x (1..10) {
    foreach my $y (1..10) {
        # Переместить курсор в нужную позицию
        my $goto = $terminal->Tgoto('cm', $x * 5, $y);
        print $goto, $x * $y;
    }
}

# Вернуть позицию курсора
print $terminal->Tputs('rc', 1);

воскресенье, 5 февраля 2012 г.

Запуск windows-приложений под linux'ом.

Wine это хорошо, но c PlayOnLinux ещё лучше. Больше о проекте можно почитать тут, но вкратце:
PlayOnLinux - это программа, которая позволяет легко устанавливать и использовать большое количество игр и приложений, разработанных для Microsoft®'s Windows®.
На данный момент очень мало игр совместимо с GNU/Linux, что, конечно, сильно мешает переходу на эту систему. PlayOnLinux предоставляет доступное и эффективное решение этой проблемы, бесплатное и уважающее свободное ПО.
Не теряем времени зря и приступаем к установке.
$ sudo wget http://deb.playonlinux.com/playonlinux_squeeze.list -O /etc/apt/sources.list.d/playonlinux.list
$ wget http://deb.playonlinux.com/public.gpg -O -  | sudo apt-key add -
$ sudo aptitude update
$ sudo aptitude install playonlinux
все необходимые зависимости, как водится, подтянутся автоматически.
Запускаем:
$ /usr/bin/playonlinux
После этого программа попросит подтвердить установку шрифтов от MS и ещё каких-то компонентов - не мешаем ей работать. Это будет проделано один раз.

четверг, 2 февраля 2012 г.

geoip своими руками

Формируем текстовый файл:
$ wget http://geolite.maxmind.com/download/geoip/database/GeoIPCountryCSV.zip
$ unzip GeoIPCountryCSV.zip
$ cut -d, -f3-5 < GeoIPCountryWhois.csv|sed 's/"//g' > geoip.txt
Итоговый файл представляет из себя набор данных, разделённых запятыми, оформленных в три колонки:
  1. начальный ip-адрес диапазона, в десятичной нотации;
  2. конечный ip-адрес диапазона, в десятичной нотации;
  3. мнемонический код страны.
Перевод ip-адреса в десятичную нотацию и обратно:
my $in = "212.90.160.40";
my @a = split (/\./,$in);

my $decip = (($a[0]<<24)+($a[1]<<16)+($a[2]<<8)+$a[3]);
my $dotip = join ".",unpack("CCCC",pack("N",$decip));

print $decip," = ",$dotip,"\n";
Организовать простой поиск ip в организованной выше базе адресов можно, например, так:
#!/usr/bin/perl -w
use strict;

my $geoipdb = "./geoip.txt";
my $in = <>; chomp($in);

if ($in =~ m!\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b!) {
  my @a = split(/\./,$in);
  my $decip = (($a[0]<<24)+($a[1]<<16)+($a[2]<<8)+$a[3]);
  open FGEOIP, "<$geoipdb" || die "Can't open $geoipdb: $!\n";
  while (<FGEOIP>) {
    chomp;
    my ($bip,$eip,$c) = split(",");
    if ($decip>=$bip && $decip<=$eip) {
      print $in," is ",$c, "\n";
      last;
    }
  }
  close FGEOIP;
} else {
  print STDERR "Not IP on STDIN\n";
}
и использовать подобным образом:
$ echo 212.90.160.40 | fgeoip
212.90.160.40 is UA

среда, 1 февраля 2012 г.

GNOME3 - индикация раскладки клавиатуры флагами

Подготавливаем иконки флажков:
# mkdir -p /usr/share/pixmaps/flags
# cd /tmp
# wget http://www.famfamfam.com/lab/icons/flags/famfamfam_flag_icons.zip
# unzip famfamfam_flag_icons.zip
# cd png/
# cp us.png /usr/share/pixmaps/flags/us-symbolic.png
# cp ru.png /usr/share/pixmaps/flags/ru-symbolic.png
# cp ua.png /usr/share/pixmaps/flags/ua-symbolic.png
# chmod -x /usr/share/pixmaps/flags/*-symbolic.png

Из под пользователя устанавливаем ключ индикации раскладки флагом, а не надписью:
$ dconf write /org/gnome/libgnomekbd/indicator/show-flags true