[personal profile] ichthuss

Потрапило мені на очі на просторах інтернетів magnet-посилання на торент, і я вирішив перевірити, наскільки з ним дружить мій торент-клієнт. Стоїть він у мене на доманшьому сервері, зібраному з залишків старого десктопа, крутиться під gentoo linux. З’ясувалось, що мій rtorrent сам по собі взагалі не підтримує маґнет-лінків, але є патч, який дає можливість перезібрати його з такою підтримкою. Оскільки під gentoo всі програми і без того повністю збираються з вихідних кодів, я вирішив погратися з цим патчем і включити його в систему portage у себе на сервері, а заразом навчитися писати до неї ebuild’и. Отже:

Беремо мануал по цьому патчу:

http://www.howtoforge.com/how-to-compile-rtorrent-from-svn-in-ubuntu-9.10-karmic-koala-debian-5-lenny-with-magnet-link-support

За вказаними в статті посиланнями патчі (їх потрібно 3 штуки) знайти не вдається, але вони швидко знаходяться за адресами http://ovh.ttdpatch.net/~jdrexler/rt/old/dht-pex-static_map.diff &c.

Грузимо патчі:

# wget http://ovh.ttdpatch.net/~jdrexler/rt/old/dht-pex-static_map.diff
# wget http://ovh.ttdpatch.net/~jdrexler/rt/old/magnet-uri.diff
# wget http://ovh.ttdpatch.net/~jdrexler/rt/old/object-sstr.diff

Заглянувши в них, помічаємо, що вони стосуються не лише самого rtorrent, а і libtorrent — бібліотеки, що розробляється разом з rtorrent. Отже, завантажуємо та розпаковуємо ці обидва пакети. Спочатку спробуємо зібрати ці пакети з патчами вручну, без власного ebuild’а.

В gentoo операції установки пакетів виконуються утилітою emerge, але нам потрібна не повне встановлення пакета, а покрокове. Для цього є утиліта ebuild. Для кожної операції цій утиліті треба вказувати повне ім’я .ebuild-файла, тож зробимо собі скорочення:

# EBLT="ebuild /usr/portage/net-libs/libtorrent/libtorrent-0.12.6.ebuild"
# EBRT="ebuild /usr/portage/net-p2p/rtorrent/rtorrent-0.8.6-r1.ebuild"

Завантажуємо та розпаковуємо:

# $EBLT fetch
# $EBLT unpack
# $EBRT fetch
# $EBRT unpack

Для застосування патчу нам потрібно, щоб ці два пакети розташовувались в сусідніх підкаталогах з назвами libtorrent та rtorrent, тому створюємо симлінки:

# cd ~
# mkdir rtorrent_patch
# cd rtorrent_patch
# ln -s /var/tmp/portage/net-libs/libtorrent-0.12.6/work/libtorrent-0.12.6/ libtorrent
# ln -s /var/tmp/portage/net-p2p/rtorrent-0.8.6-r1/work/rtorrent-0.8.6/ rtorrent

Пробуємо накласти патч:

# patch -p0 dht-pex-static_map.diff
patching file rtorrent/src/core/view.cc
patching file libtorrent/src/dht/dht_bucket.cc
.....
Hunk #1 FAILED at 41.
Hunk #2 FAILED at 79.
2 out of 2 hunks FAILED -- saving rejects to file libtorrent/src/torrent/Makefile.am.rej
.....
patching file libtorrent/src/download/download_constructor.cc

Дивимось, що не так з патчем.

# less libtorrent/src/torrent/Makefile.am.rej

***************
*** 41,46 ****
        rate.h \
        resume.cc \
        resume.h \
        thread_base.cc \
        thread_base.h \
        throttle.cc \
--- 41,49 ----
        rate.h \
        resume.cc \
        resume.h \
+       simple_string.h \
+       static_map.cc \
+       static_map.h \
        thread_base.cc \
        thread_base.h \
        throttle.cc \
***************
*** 76,81 ****
        poll_select.h \
        rate.h \
        resume.h \
        thread_base.h \
        throttle.h \
        torrent.h \
--- 79,86 ----
        poll_select.h \
        rate.h \
        resume.h \
+       simple_string.h \
+       static_map.h \
        thread_base.h \
        throttle.h \
        torrent.h \

Дивимось у відповідний файл:

....
        resume.cc \
        resume.h \
        throttle.cc \
        throttle.h \
....

Бачимо, що набір файлів, прописаних в мейкфайлі, різниться з тим, до якого створювали патч. Вписуємо поміж resume.h та throttle.cc потрібні три строчки вручну, аналогічно чинимо з другим конфліктом.

Два інших патчі лягли, як влиті:

# patch -p0 < magnet-uri.diff
# patch -p0 < object-sstr.diff

Файл, на якому виник конфлікт — конфігураційний файл утиліти automake, з нього вона утворює файл Makefile.in, а вже з нього утиліта автоконфігурування будує справжній Makefile. Я стикнувся з проблемою, яка полягала в тому, що я мав версію automake відмінну від тієї, якою будували мейкфайли автори, і після повної перебудови всіх мейкфайлів програма просто не схотіла збиратися. Тому я забекапив два файли Makefile.in (ті, що відповідають двом змінюваним патчами файлам Makefile.am — libtorrent/src/torrent/Makefile.in та libtorrent/src/protocol/Makefile.in), перебудував їх і подивився, що в них змінилося. Зрозуміло, що в них просто додалися додані нами до Makefile.am файли; я взяв diff старого та нового мейкфайла і вибрав лише ті відмінності, що стосувались цих файлів (пригадуючи при цьому анекдот про сисадміна, який перед встановленням нової версії ОС переглядав її коди і вибирав звідти лише те, що йому подобалось), і викинув ті, що були пов’язані зі зміною версії. Вийшло ось що:

# cat Makefile.in.diff 
--- libtorrent/src/torrent/Makefile.in	2009-11-30 17:12:19.000000000 +0200
+++ libtorrent/src/torrent/Makefile.in	2011-03-03 00:15:51.000000000 +0200
@@ -60,7 +52,8 @@
 	connection_manager.lo dht_manager.lo download.lo error.lo \
 	exceptions.lo http.lo object.lo object_stream.lo path.lo \
 	poll_epoll.lo poll_kqueue.lo poll_select.lo rate.lo resume.lo \
-	throttle.lo torrent.lo tracker.lo tracker_list.lo
+	static_map.lo throttle.lo torrent.lo tracker.lo \
+	tracker_list.lo
 libsub_torrent_la_OBJECTS = $(am_libsub_torrent_la_OBJECTS)
 DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
 depcomp = $(SHELL) $(top_srcdir)/depcomp
@@ -318,6 +310,9 @@
 	rate.h \
 	resume.cc \
 	resume.h \
+        simple_string.h \
+        static_map.cc \
+        static_map.h \
 	throttle.cc \
 	throttle.h \
 	torrent.cc \
@@ -350,6 +345,8 @@
 	poll_select.h \
 	rate.h \
 	resume.h \
+        simple_string.h \
+        static_map.h \
 	throttle.h \
 	torrent.h \
 	tracker.h \

Цей патч я наклав на старі мейкфайли (довелося перерозпакувати пакети знову), після чого зробив бекапи обох каталогів libtorrent та rtorrent — вони нам ще знадобляться для побудови ebuild’а.

# tar cvjhf rtorr.tar.bz2 libtorrent rtorrent

Далі пакет зібрався нормально:

# $EBLT configure
# $EBLT compile
# $EBLT install
# $EBLT qmerge

З останніх двох команд перша встановлює свіжезібраний пакет в тимчасове місцерозташування, для  запобігання конфліктам з іншими пакетами, а друга переносить всі файли в реальну систему, відслідковуючи можливі конфлікти. Libtorrent обов’язково встановити до того, як компілювати rtorrent, оскільки останній використовує файли заголовків, які потрапляють до /usr/include/ лише після повного встановлення libtorrent. Отже, збираємо та встановлюємо клієнт:

# $EBRT configure
# $EBRT compile
# $EBRT install
# $EBRT qmerge

Перезапустивши rtorrent, увімкнувши dht, обмін пірами, натискаємо backspace і вводимо (або вставляємо) magnet-посилання. В моєму випадку посилання додалось, але, оскільки в ньому не було вказано жодного трекера, то першого піра клієнт знайшов майже через добу. Попри це, торент успішно завантажився.

В наступній серії нашої передачі ви довідаєтесь, як з цього діла зібрати ebuild-файл і включити цей патч до дерева portage.

Date: 2011-03-12 04:59 pm (UTC)
From: (Anonymous)
Генту на сервері — це жорстко.

Profile

ichthuss

January 2026

S M T W T F S
    123
45678910
11121314151617
18192021222324
25262728293031

Page Summary

Style Credit

Expand Cut Tags

No cut tags
Page generated Jan. 29th, 2026 10:20 pm
Powered by Dreamwidth Studios