Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
12
Добавлен:
20.04.2024
Размер:
8.91 Mб
Скачать

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

X

 

 

 

 

 

 

 

 

-

 

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

r

 

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

 

to

КОДИНГm

/TIPS&TRICKS

w Click

 

 

 

w

 

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

 

g

 

 

 

 

 

 

df

-xcha

n

e

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

 

F

 

 

 

 

 

 

t

 

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

r

 

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

 

to

 

 

 

 

 

deeonis (deeonis@gmail.com)w Click

 

 

 

 

 

m

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

 

.

 

 

 

 

 

.c

 

 

 

 

p

 

 

 

 

g

 

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

 

-x cha

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Паттерн

проектирования

«Наблюдатель»

ПОДНИМАЕМООПНАНОВЫЙУРОВЕНЬ

Продолжаемзнакомствоспаттернамиобъектноориентированногопрограммирования.Сегодня мыузнаемопаттерне«Наблюдатель»,который облегчилжизньмногимОО-программистам. Любаясистема,работающаяврежимереального времени,втойилиинойстепениможетиспользоватьэтотпаттерн,ипоэтомуегознаниеипониманиепростонеобходимолюбомууважающему себякодеру.

<<interface>>

 

 

Диаграмма

Observable

 

 

классовпаттерна

 

 

 

+AddObserver(o: Observer)

 

 

«Наблюдатель»

+RemoveObserver(o: Observer)

 

 

 

+NotifyObserver()

 

 

 

 

 

 

 

 

 

 

 

ConcreteObservable

o..*

 

-observers: Observer[]

 

 

<<interface>>

 

 

Observer

 

 

 

+AddObserver(o: Observer)

 

 

 

 

 

 

+RemoveObserver(o: Observer)

 

 

 

+NotifyObserver()

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ConcreteObserer

Вызывает метод HadleEvent()

 

 

 

 

 

 

у каждого наблюдателя

 

 

+HadleEvent()

 

 

 

 

редставимситуацию,чтонасвзялинаработувкрупнуюфирму,

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

ваеттемпературупроцесса,оборотыHDD,температурувидеокартыи прочуюинформацию.Нашазадачанаписатьклиентскуючастьсофта, ту,котораяработаетвring-3ивыводитэтуинформациюпользователю врежимереальноговремени.Причемпрограммадолжнанепросто выводитьинфувкучу,апоказыватьеенаразных«экранах».Тоесть одинмодульклиентскойчастизанимаетсяотображениемсостояния центральногопроцессора,другоймодуль—графическогопроцессора ит.д.Даикакоказалось,нашеновоеруководстворешилозамахнуться намировоегосподствоихочет,чтобысофтбылрасширяемым,тоесть чтобысторонниеразработчикимоглисоздаватьсвоимодули.

Внаследствоотнашегопредшественниканамдосталсякласс SystemInfo,которыйвтеориипредназначаетсядлясбораинфыосистемномжелезеиоповещенииклиентскойчастиобизмененияхвсостоянии этогожелеза.Еслиспервойчастьюушедшийизфирмыкодерсправился хорошо,товторуюонтольконачалреализовывать,ипоэтомуосновная частьработыпокоммуникацииклассаSystemInfoсклиентскимимодулямилегланавашиплечи.Дляначаладавайвзглянем,чтоунасесть.

Первоначальный вариант класса SystemInfo

class SystemInfo()

{

...

float getCPUTemp();

float getGPUTemp();

int getHDDSpeed();

void notifyClients();

}

ХАКЕР 10/153/2011

109

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

X

 

 

 

 

 

 

 

 

-

 

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

r

 

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

 

to

КОДИНГm

/TIPS&TRICKS

w Click

 

 

 

w

 

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

 

g

 

 

 

 

 

 

df

-xcha

n

e

 

 

МетодыgetCPUTemp,getGPUTempиgetHDDSpeedпредназначены дляполученияинформацииотдрайвера.Тамвсёпросто,ипоэтомуони работаюткакчасы.ТакжеимеетсяметодnotifyClients,который,судяпо комментамвашегопредшественника,долженоповещатьклиентские модулиобизмененияхвсостояниисистемы.Этотметодвызывается где-товнедрахклассаSystemInfo.Какэтоделается,намсовсемне важно,главноето,чтоnotifyClientsсрабатываетприкаждомапдейте инфыожелезеиклиентскиемодулиточноничегонепропустят.

НАЧИНАЕМКОДИТЬ

Дляначаланамнужносделатьтриосновныхмодуля,которые отображаюттемпературупроцессора,температурувидеокартыи скоростьвращенияHDD.Мыужезнаем,чтодляоповещенияклиентовиспользуетсяфункцияnotifyClients,иследовательно,надо как-топередаватьинфуизэтогометоданашиммодулям.Ихунас, кстати,покавсеготри:cpuTemp,gpuTempиhddSpeed.Каждыйиз этихмодулейдолженуметьполучатьданныеотSystemInfo,поэтому первыйвариантреализацииnotifyClients,которыйприходитвголову, выглядитпримернотак:

Реализация notifyClients()

void SystemInfo()

{

float t_cpu = getCPUTemp();

float t_gpu = getGPUTemp();

int s_hdd = getHDDSpeed();

cpuTemp.update(t_cpu, t_gpu, s_hdd);

gpuTemp.update(t_cpu, t_gpu, s_hdd);

hddSpeed.update(t_cpu, t_gpu, s_hdd);

}

Что тут, собственно, не так? Во-первых, основным принципом проектирования с помощью паттернов является программирование на уровне интерфейсов. В нашем же случае класс SystemInfo должен знать подробную информацию о каждом клиентском модуле. Это, возможно, было бы приемлемо, если бы число модулей было фиксированным, но мы планируем постоянно увеличивать их количество, а следовательно, такой подход создаст кучу неудобств, а впоследствии и ошибок. Во-вторых, параметры, передаваемые функциям update(), очень смахивают на интерфейс взаимодействия между SystemInfo и клиентскими модулями, но таковыми не являются. Ну и в-третьих, все эти вызовы методов update() — это переменная часть кода, которую нужно инкапсулировать. Исправлением этих недостатков мы сейчас и займемся.

ОСНОВЫПАТТЕРНА«НАБЛЮДАТЕЛЬ»

Еслитывыписываешьнашжурнал,тотебеужезнакомпринципработы паттерна«Наблюдатель».Егоустройствооченьпохоженаподпискуна прессу,тольковкачествеиздательствавмирепаттерноввыступает субъект,рассылающийоповещенияобизменениисостояниячеголибо,ачитателямиявляютсянаблюдатели,которыерегистрируютсяу субъектадляполучениясообщенийотнего.

Впроцессеработынаблюдателимогуткакотписыватьсяотоповещений,такивновьнанихподписываться.Субъектбудетисправно рассылатьвсемклиентамсообщенияобизмененияхвсистеме.Таким образом,главнуюрольвпаттернебудутигратьдваинтерфейса:интерфейссубъекта,рассылающегооповещения,т.е.Subject,иинтерфейс наблюдателя,принимающегоэтиоповещения,т.е.Observer.Subject будетописыватьметодыподпискииотпискинасобытия,атакжеметод,оповещающийнаблюдателейобизменениях.Observerописывает одинединственныйметод—принимающийинформациюотобъекта.

ПРИМЕНЯЕМПАТТЕРН

Итак,мыужезнаемдостаточно,чтобыизменитькоднашейпрограммы ипривестиегокправильномувиду.Дляначалаопишеминтерфейсы SubjectиObserver.

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

Интерфейсы Subject и Observer

class Subject()

{

public:

void registerObserver(Observer &obs) = 0;

void removeObserver(Observer &obs) = 0;

protected:

void notifyObservers() = 0;

}

class Observer()

{

public:

void update(float t_cpu, float t_gpu, int s_hdd) = 0;

}

МетодыregisterObserver()иremoveObserver()служатдлядобавления/удалениянаблюдателейизспискаподписчиков.Функция notifyObservers()будетоповещатьнаблюдателей,аметодupdate() интерфейсаObserverбудетобрабатыватьэтиоповещения.Теперь подправимнашиклассы:SystemInfo,CpuTemp,GpuTempиHddSpeed.

Реализация классов

class SystemInfo() :

public Subject

{

public:

void registerObserver(Observer &obs)

{

//код, добавляющий ссылку на наблюдателя

//в список или массив

}

void removeObserver(Observer &obs)

{

//код, удаляющий ссылку на наблюдателя

//в список или массив

}

//...

protected:

void notifyObservers()

{

//код, вызывающий метод update()

//для каждого объекта Observer из списка

}

}

class CpuTemp() : public Observer

{

public:

// ...

void update(float t_cpu, float t_gpu, int s_hdd)

{

// код, обрабатывающий информацию от SystemInfo

}

}

//Реализация классов GpuTemp и HddSpeed

//подобна реализации CpuTemp

РеализацияметодовregisterObserver()иremoveObserver()довольнатривиальна,потомувпримере,приведенномвыше,мылишь обошлиськомментариями.Самоепростое,чтоможноделать,—это добавлятьиудалятьссылкинаобъектывмассивиликакой-нибудь

110

ХАКЕР 10/153/2011

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-xcha

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

PHP-реализацияпаттерна

STL-список.notifyObservers()такжебудетработатьсэтимсписком, перебираяпоочередиегоэлементыивызываяupdate().

Вконструкторыклассов,реализующихинтерфейсObserver,мы передаемссылкунаобъектSystemInfo,чтобыиметьвозможностьдобавлятьсяиудалятьсяизочерединотификации.

Такаяархитектурапозволяетсвестизависимостьмеждусубъектоминаблюдателямикминимуму.Всё,чтознаетSystemInfoосвоих клиентскихмодулях,этото,чтоониреализуютинтерфейсObserver. Есликоличествоэтихмодулейувеличится,намнепридетсялезтьв кодSystemInfo.Болеетого,мыможемвноситьлюбыеизмененияв субъектинаблюдателей,дотехпорпокаихинтерфейсыостаютсянеизменны.Нопривсехплюсахуданнойреализациипаттерна«Наблюдатель»естьинедостатки.

ИСПРАВЛЯЕМНЕДОСТАТКИ

Основнойпроблемойвнашемпримереявляетсято,чтоклиентские модулиполучаютслишкоммногоненужнойинформацииотSystemInfo. Например,классуGpuTempнужнознатьтолькотемпературуначипе видеокарты,аскоростьHDDипрочееемуненужно.

Оченьтесносвязансэтимобстоятельствомидругойминус—набор данных,передаваемыхвкачествепараметроввфункциюupdate(), являетсяфиксированным.Т.е.еслиSystemInfoначнетпредоставлять ещеодинтипданных,напримерскоростьчтения/записиSSD-диска, тонампридетсяизменятьинтерфейсObserver,аследовательно,

иреализациюметодаupdate()вовсехклассах,наследующихэтот интерфейс.ТакженампридетсяподправитькодnotifyObservers().Это совсемнето,чегомыхотимдобиться,используяпаттерныпрограммирования.

Длярешенияэтихдвухпроблемследуетсоздатьотдельныйкласс илиструктуру(комукакбольшенравится)дляхраненияпередаваемыхданных.Методupdate()будетприниматьуказательнаэтуструктурувкачествепараметра.Этопозволитнамвбудущембезболезненно изменятьколичествоитиппередаваемойклиентскиммодулям информации.Болеетого,мысможемпередаватьнулевойуказатель наструктуруданных,чтобудетозначать,чтоиспользуетсямодельс запросомданных,т.е.клиентскиемодуливэтомслучаебудутсами запрашиватьинтересующуюихинформациюуSystemInfo.

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

 

F

 

 

 

 

 

 

t

 

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

r

 

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

 

to

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Паттернпроектирования«Наблюдатель»w Click

 

 

 

 

m

 

w

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

 

.

 

 

 

 

 

.c

 

 

 

 

p

 

 

 

 

g

 

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

 

-x cha

 

 

 

 

Выносим передаваемые данные в отдельную структуру struct SIData

{

float t_cpu;

float t_gpu;

int s_hdd;

}

class SystemInfo() : public Subject

{

public:

...

// дополнительные методы для запроса конкретных данных

float getCpuTemp();

float getGpuTemp();

int getHddSpeed();

...

}

class Observer()

{

public:

void update(SIData *data = NULL) = 0;

}

class CpuTemp() : public Observer

{

public:

// ...

void update(SIData *data)

{

if (data == NULL)

{

float t_cpu = sysInfo.getCpuTemp();

}

// код, обрабатывающий информацию от SystemInfo

}

}

//Реализация классов GpuTemp и HddSpeed

//подобна реализации CpuTemp

Осталасьещеоднанебольшаяпроблемка—классы,реализую- щиеObserver,обязанывсвоемконструктореприниматьвкачестве параметрассылкунаобъект,реализующийинтерфейсSubject.Ноэта обязанностьнигденепрописананауровнеинтерфейса,чтоозначает, чтовкаком-нибудьизбудущихклиентскихмодулеймыобязательноза- будемнакодитьконструктор,принимающийэтуссылку.ВC++мыможем немногосхитрить,воспользовавшисьвозможностьюмножественного наследованиявполнойстепениипеределавинтерфейсвполноценныйабстрактныйкласс.ТоестьсоздадимконструктордляObserver’а, которыйбудетприниматьссылкунаSubject.Вэтомслучаевсемдочерним классампридетсяволей-неволейприниматьвсвоемконструкторетуже ссылкунаSubject.

Вдругихязыкапрограммирования,запрещающихмножественное наследованиеиконструкторыуинтерфейсов,придетсявObserver’е описыватьотдельныйметоддляполученияссылкинаобъект,реализующийSubject,ивызыватьэтотметодсамостоятельноужепосле созданияклиентскогомодуля.

ЗАКЛЮЧЕНИЕ

МыузналиещеободномпаттернеОО-программирования,который, кстатиговоря,используетсядовольночастовсовременномсофтостроении.Вследующихвыпускахмыпродолжимкодитьспомощьюпаттер- нов,апокасоветуюзанятьсвоймозгчем-нибудьумнымиполезным. z

ХАКЕР 10/153/2011

111

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

 

 

d

 

F

 

 

 

 

 

 

 

t

 

D

 

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

UNIXOIDm

w Click

 

 

 

w

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

o

 

.

 

 

 

 

 

 

.c

 

 

p

 

 

 

 

 

g

 

 

 

 

 

df

-xcha

n

e

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

 

F

 

 

 

 

 

 

t

 

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

r

 

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

 

to

 

 

 

 

 

ЕвгенийЗобнин(execbit.ru)w Click

 

 

 

 

 

m

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

 

.

 

 

 

 

 

.c

 

 

 

 

p

 

 

 

 

g

 

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

 

-x cha

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

РАЗ ДВА

заплатка, заплатка

ЗАЧЕМНУЖНЫБИНАРНЫЕПАТЧИ, ИКАКИМИПОЛЬЗОВАТЬСЯ

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

LINKS

goo.gl/MaO8l— исходныйкодпоследнейпубличной версииKsplice.

INFO

Debdeltaимеет опцию'--delta-algo', спомощьюкоторой можноуказатьпредпочитаемуюутилитудлясоздания патчей.Доступные варианты:xdelta, xdelta-bzip,xdelta3 иbsdiff.

РаботупонаписаниюMakefile дляbinpatchng можнополностью автоматизировать, есливоспользоватьсяскриптом, опубликованным вдискуссионном листеOpenBSD(goo. gl/FY7PX).

этойстатьемырассмотримчетыремеханизмасоздания

Вбинарныхпатчейипоговоримоназначениикаждогоизних.

ВпервойчастистатьиярасскажуоKsplice—технологии, способнойдовестиuptimeсерверадо100%,далеемыпоговоримоб инструментахxdeltaиbsdiff,спомощьюкоторыхможноприлично сэкономитьнатрафикеприобновлениисистемы,втретьейчасти уделимвниманиемеханизмуdeltup,экономиятрафикаприиспользованиикоторогоможетдостигнуть95%.Четвертаячастьпосвящена фреймворкуbinpatchng,предназначенномудлясозданияпакетовс патчамидлябазовойинсталляцииOpenBSDвдомашнихусловиях.

KSPLICE

Наверное,оKspliceиегонедавнейпокупкекомпаниейOracleслышаливсе.Этотакойхитрыймеханизм(илидаже,лучшесказать,хак), которыйпозволяетнакатыватьобновлениянаядроLinuxналету,не требуяперезагрузкимашиныилидажекакой-тоработыпосборке модулейядра.

МеханизмKspliceиспользуетдовольноинтересныйметодпатчингаядра,восновекотороголежиттехникаизменениякомпонентов ядрапрямововремяегоработы.Делаетсяэтовдвашага.Напервом этапеотрабатываетутилитагенерациибинарногопатча,которая получаетнавходместорасположениеисходныхтекстовLinux-ядраи файл,содержащийстандартныйпатчнаисходныйкодвdiff-формате. Наложивэтотпатчнаисходники,утилитакомпилируетядро,сравниваетполучившийсяобразсядромпредыдущейверсииигенерирует

112

ХАКЕР 10/153/2011

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-xcha

 

 

 

 

модульядра,содержащийизмененныечасти,аесликонкретнее—код измененныхфункций.Этотпатч-модульпередаетсянамашину,ядро которойдолжнобытьобновлено.Навторомэтапевделовступает модульядраksplice.ko,которыйвместеспатч-модулемзагружается вядроцелевоймашины.Послезагрузкиksplice.koанализируетпатчмодульнапредметналичияновыхверсийфункцийядраиизменяет адресанастоящихфункцийядра,такчтобыониуказывалинафунк- ции,содержащиесявпатч-модуле.Такимобразомудаетсяизменить ядро,неперекомпилируяего.

Минустакогоподходавтом,чтофактическионподходиттолько дляисправлениянебольшихошибокилатаниядыр,болеекрупные обновления,затрагивающиемножествофункций,добавляющие новыйфункционалиизменяющиевнутренниеструктурыядра,таким образомнесделаешь.ТемнеменееавторKspliceотмечаетдостаточновысокуюэффективностьсистемы,онасмоглавполностьюавтома- тическомрежимесгенерировать84%патчейдляbugfix-обновлений ядра,выпущенныхзатригода.Дляостальныхобновленийпришлось немногопоработатьруками.

Ксожалению,в2009г.,послеоткрытиякомпанииKspliceInc., авторрешилзакрытькодсистемы,непозволивчастнымлицамисто- роннимкомпаниямсамимсоздаватьKsplice-патчи.Поэтомувэтой статьемынебудемобсуждатьэтутемуирассмотримвопростолько склиентскойточкизрения.Авыглядитонатак:сегодняKsplice принадлежитOracle,котораяпродолжаетпредоставлятьсервис абсолютнобесплатногоонлайн-обновленияядрадлядистрибутивов UbuntuиFedora,атакжедлясобственноговариантаRHELподназваниемUnbreakableLinux.Пользователивсехостальныхкорпоративныхдистрибутивовпролетают.

Теперьотом,какэтимпользоваться.ДляUbuntuиFedoraнасайте ksplice.comестьпакет,егоследуетскачатьиустановитьстандартнымисредствами:

$ sudo apt-get install curl

$ sudo dpkg -i ksplice-uptrack.deb

Далеесоглашаемсяслицензией.Появитсяокнососпискомвсех доступныхдлянашегоядраобновлений.НажимаемкнопкуInstall,и системаскачаетнужныепатчиизСетиизагрузитихвядро.Чтобыв случаеперезагрузкипатч-модулибылизагружены,вместеспакетом устанавливаетсястартовыйскрипт.Системавсегдаследитзаобновлениямисообщаетонихспомощьюзначкавтрее.

XDELTA, BSDIFF

Итак,сKspliceиегоизвращеннымподходомкнакладываниюпатчей разобрались,теперьнасталовремяпоговоритьобутилитах,которые позволяютприменитьбинарныепатчинаотдельновзятыеприложения.ВUNIXсуществуеткакминимумтритакихинструмента: этостарейшаяразработкаxdelta,выросшаяизкускакодаrsync, отвечающегозаинкрементальныйбэкап,егоболеесовременнаяи развитаяверсияподназваниемxdelta3иbsdiff,разработанныедля использованиявBSD-системах.

Посвоейсутивсетриинструментапредставляютсобойаналог всемнамизвестнойпрограммыdiff,которыйоперируетнестроками, апоследовательностьюбайт.Этодаетвозможностьиспользовать утилитынетолькодлявычисленияразницымеждуфайламис исходнымкодом,ноидлялюбыхдругихданных,будьтобинарник приложения,tar.gz-архивилидажевидеофайл.Еслитебеинтересно, какэтоработает,торекомендуюознакомитьсясостатьей«Дельтакодирование»,опубликованнойвWikipedia(ru.wikipedia.org/wiki/ Дельта-кодирование),яжелучшерасскажуотом,зачемвсёэто нужноикаксэтимработать.

Длячегонуженбинарныйdiff?Всёоченьпросто:имеявозможностьнакладыватьбинарныепатчинаужеработающиеприложения илицелыеархивысисходниками,можносерьезносэкономитьна трафике.Внашембезлимитноммиреэкономиятрафикаможетине сделатьбольшойвыгодывденежномплане,новотвремясократит существенно,особенноприкрупныхобновленияхвсейсистемы.Не-

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

Раззаплатка,двазаплаткаw Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ПереченькритическихобновленийдляOpenBSD4.8

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

Длятогочтобымеханизминкрементальныхапдейтовзаработал, должнобытьвыполненотриусловия.Во-первых,пакетныйменед- жердистрибутивадолженподдерживатьработусутилитойинкрементальногоапдейта.ТакаяподдержкаестьвpacmanизArchLinux ичерезустановкудополнительногопакетаdebdelta,вDebian.

Во-вторых,долженсуществоватьспециальныйdelta-репозиторий, которыйбудетотвечатьзахранениепатчейкпакетамисвоевременногенерироватьновыепатчидляобновлений.Такиесерверыобычно держатэнтузиасты,поэтомуобычноихдовольнотруднонайти,аесли найдешь,никтонедастгарантии,чтозавтрасервернеисчезнет(это главнаябедабинарныхпатчей).Ив-третьих,вкэшепакетногоме- неджеравсегдадолжнылежатьзакэшированныевовремяпредыдущейустановкипакеты,накоторыекакразибудутнакладываться патчи.Этоважныймомент,таккакмногиеизнас(иявтомчисле) любятвремяотвремениэтоткэшподчищать(однакодляdebdelta,о котороммыпоговоримниже,иониненужны).

Теперьотом,какпроисходитнастройкапакетногоменеджера:

ВArchLinuxвсёрешаетсядовольнопросто.Устанавливаемтретью версиюxdelta:

$ sudo pacman -S xdelta3

Открываем/etc/pacman.conf,снимаемзнаккомментариясо строкиUseDelta.Открываемсписокрепозиториев/etc/pacman.d/ mirrorlistивсамоеегоначалодобавляемследующуюстроку:

Server = http://delta.archlinux.fr/$repo/os/$arch

Сохраняемфайлипробуемвыполнитьполноеобновлениедистрибутива:

$ sudo pacman -Syu

Разницадолжнабыть,чтоназывается,налицо.Проблематольков том,чтоarchlinux.frсодержитдельтыдалеконедлявсехпакетов,но, увы,альтернативыздесьпростонет.

ВDebianэтоделаетсянесколькоиначе.Существуетспециальная утилита(аточнее,наборутилит)подназваниемdebdelta,которая умеетразбиратьdeb-пакетыпокосточкам,вычислятьразницумежду файламидвухверсийпакетовспомощьюxdeltaигенерировать новыйпакетнаоснованииэтихданных.Принакатываниипатчейэто чудоиспользуетужеустановленныевсистемупакеты,апотомуне

ХАКЕР 10/153/2011

113

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

F

 

 

 

 

 

 

t

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

UNIXOIDm

w Click

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

.

 

 

 

 

 

.c

 

 

p

 

 

 

 

g

 

 

 

 

 

df

-xcha

n

e

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ПравимbinpatchMakefile

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

$ sudo apt-get update

$ sudo debdelta-upgrade $ sudo apt-get upgrade

Затоненужноникакойнастройкиивознисрепозиториями (официальныйрепозиторийуспешноработаетужемногиегоды).Сам debdeltaустанавливаетсятак:

$ sudo apt-get install debdelta

Стоитсказатьотом,чтоBSD-аналогxdeltaподназваниемbsdiff (www.daemonology.net/bsdiff)такжеимеетбольшоеприменение.Он былнаписандляутилитыобновлениясистемыfreebsd-updateистал частьюбазовойустановкиFreeBSDв2005г.Каждыйраз,когдаты делаешь«freebsd-updateinstall»,вделовступаетbsdiff(аточнее,его частьbspatch),которыйпрозрачнообновляетсистемуспомощьюби- нарныхпатчей.БлагодаряBSD-лицензии,разрешающейвключать кодвзакрытыеприложения,bsdiffполучилбольшоераспространениеизапределамиBSD.

DELTUP

Интереснуюальтернативубинарнымпатчампредложилвсвоевремя одинизпоклонниковдистрибутива,Gentoo.Онсоздалутилитуdeltup (deltup.sourceforge.net),котораябраладваархивасисходникамиразных версийприложения,распаковывалаих,генерировалапатчспомощью стандартногоdiff,упаковывалаегоиснабжалаинформацией,нужной дляполучениянеотличимогооторигиналаархивасоднойверсией приложенияизархивасдругой.Говоряпростымязыком,deltup-файлом можнопропатчитьтарболлстаройверсиипрограммы,чтобыполучить тарболлсееновойверсией,избежавнеобходимостивзагрузкевсего тарболла.Результатыработыутилитыоказалисьпростопоразитель- ными:среднийразмерdeltup-патчасоставляетвсего15%отразмера оригинальногоархива,азачастуюи5%(сэтимицифрамиможноознако- митьсянастраницестатистикиголовногоdeltup-сервера:goo.gl/IetJU).

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

СегодняподдержкаdeltupвGentooестьизкоробки,такженеобходимыйинструментарийбылпортированвоFreeBSD.Существует несколькоболееилименеестабильноработающихсерверов,от- вечающихзагенерациюиотдачуdeltup-патчей.Настройка,опятьже, совсемнесложна:

ВGentooпорядокдействийследующий.Устанавливаеминструментыdeltupиgetdelta:

$ sudo emerge deltup getdelta

Добавляемв/etc/make.confследующуюстроку:

$ sudo vi /etc/make.conf

FETCHCOMMAND="/usr/bin/getdelta.sh \"\${URI}\" -O

\"\${DISTDIR}/\${FILE}\""

Такмысообщимemergeотом,чтохотимиспользоватькоманду getdeltaдляполученияархивовсисходниками.Далееоткрываем конфигурационныйфайл/etc/deltup/getdelta.rcипишемтудаследующее:

$ sudo vi /etc/deltup/getdelta.rc

#Адрес локального репозитория (если есть) LOCAL_MIRROR=1.2.3.4

#Максимальная позиция в очереди на ожидание дельты

MAXIMUM_ACCEPTABLE_QUEUEPOS=10

#Удалять старые версии файлов

REMOVE_OLD=yes

ОпциюLOCAL_MIRRORможнонедобавлять,онанужнатольковтом случае,есливлокалкеестьGentoo-репозиторий,которыйможноис- пользоватьвместозапросапатчаотdeltup-сервера.ОпцияMAXIMUM_ ACCEPTABLE_QUEUEPOSзадаетмаксимальнуюпозициювочередина созданиедельты.Большинствоdeltup-серверовгенерируютдельты вовремяпервогообращенияклиентазаархивом,поэтомуочередьза особотяжеловеснымиприложениямиипоследнимиобновлениями

ГлавноеокноклиентаKsplice

114

ХАКЕР 10/153/2011

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-xcha

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

Раззаплатка,двазаплаткаw Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

Статистикапоразмерупатчей,публикуемаянасайтеinux01.gwdg.de

можетвыстроитьсябольшая.Неткаких-тоопределенныхрекомен- дацийпоповодуразмераочереди,таккакнагрузканасерверможет бытьразнойивремя,котороетыможешьпрождать,—тоже.Самостоя- тельноуказыватькакой-либоdeltup-сервернетребуется,сегоднявсе серверыподключеныкlinux01.gwdg.de,которыйвписанвgetdeltaпо умолчанию.

Этовсё,приследующемобновлениипакетатыдолжензаметить разницувовременискачивания.

ПортdeltupестьидляFreeBSD.Оннетребуетсвоегособственного репозиторияиможетиспользоватьdeltup-сервераGentoo(все-таки исходникиприложениядляразныхплатформодниитеже).Чтобы научитьсистемупортовFreeBSDиспользоватьdeltupдляобновлениясофта,необходимосделатьследующее:

1.Установитьdeltupиwgetизпортов:

$ cd /usr/ports/sysutils/deltup $ sudo make install clean

$ cd /usr/ports/ftp/wget $ sudo make install clean

ШПАРГАЛКАПОБИНАРНЫМПАТЧАМ

$ bsdiff старый_файл новый_файл файл_патча $ bspatch старый_файл новый_файл файл_патча

$ xdelta3 -e -s старый_файл новый_файл файл_патча $ xdelta3 -d -s старый_файл файл_патча новый_файл

$ deltup -mjb 9 старый_файл новый_файл файл_патча $ deltup -p файл_патча

$ debdelta старый_файл новый_файл файл_патча $ debpatch -A файл_патча / новый_файл

2.Добавитьвфайл/etc/make.confследующуюстроку:

$ sudo vi /etc/make.conf FETCH_CMD=/usr/local/bin/getdelta.sh

Теперьнезависимооттого,используешьлитысистемупортовна- прямуюилиразличныефронт-эндытипаportupgrade,обновлениябу- дутпроисходитьспомощьюdeltup-сервера.Однаконеобходимобыть готовымктому,чтоиногдаdeltupошибаетсяисобираетнесовсем точнуюкопиюархива,котораявполненормальнораспаковывается, ноимеетнеправильнуюконтрольнуюсумму(этоследствиемикроразличийвразныхверсияхgzipиbzip2).Вэтомслучаесборкупакета можноосуществить,добавивпредписаниеNO_CHECKSUM:

$ cd /usr/ports/games/cowsay

$ make NO_CHECKSUM install clean

OPENBSDBINPATCH

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

Все,ктоимеетхотьмалейшеепредставлениеопроцессевыпуска релизовизаплатокдляOpenBSD,знают,насколькоонсамобытени прост.Привыпускерелизовразработчикискорееориентируютсяна план,чемнанакоплениедостаточногоколичестваважныхизменений.ПослевыпускановойверсииОСсразуначинаетсяработанад следующей,авсеошибкиибаги,найденныевэтовремя,фиксятсяс помощьюзаплаток,которыекаждыйпользователь/админдолжен скачать,наложитьнаисходныйкодипересобратьего.Делатьэто нетолькожутконеудобно,нопоройпростонепредставляетсявозможным.МногиежелезкиподуправлениемOpenBSDнеобладают достаточноймощностьюидисковымпространством,длятогочтобы содержатьвсебевсёдеревоисходныхтекстовOpenBSD,компилятор, линковщикипромежуточныерезультатыкомпиляции.Нодажеесли всёэтонажелезкеесть,носамажелезкаприэтомнеединственная вподчинении,однотипныедействияпридетсявыполнятьнесколько

ХАКЕР 10/153/2011

115

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

C

 

E

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

X

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

 

 

 

 

 

 

 

 

 

 

 

F

 

 

 

 

 

 

 

t

 

 

 

 

 

 

 

 

 

 

 

 

 

D

 

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

r

 

 

 

 

 

 

 

 

 

 

 

 

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

to

UNIXOIDm

 

 

 

 

 

 

 

 

 

 

 

 

w Click

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

o

 

 

 

 

 

 

 

 

 

 

 

 

 

.

 

 

 

 

 

 

.c

 

 

 

 

 

 

 

 

 

 

 

 

 

 

p

 

 

 

 

g

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

df

 

 

 

n

e

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

-xcha

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Патчисходногокода

 

 

 

 

 

 

 

 

 

Исходныйкодядра

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Сборка

 

 

 

 

 

 

 

 

 

 

 

Сборка

 

 

 

 

 

 

 

пропатченного

 

 

 

 

 

 

 

 

 

 

 

оригинальных

 

 

 

 

 

 

 

исходника

 

 

 

 

 

 

 

 

 

 

 

исходников

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Двоичныйпатч

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Пост-объектные

 

 

 

 

 

Предварительные

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

файлы

 

 

 

 

 

 

 

 

 

объектныефайлы

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Извлечение

 

 

 

 

 

 

 

 

 

Извлечение

 

 

 

 

 

 

 

 

 

 

 

 

функций,кото-

 

 

 

 

 

 

оптимизационных

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

рыеотличаются

 

 

 

Список

 

 

блоков,которые

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

отличаются

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

функций,

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

которые

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

отличаются

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Обработка

 

 

 

 

 

 

 

 

 

Обработкаопти-

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

мизационных

 

 

 

 

 

 

 

 

 

 

функций,которые

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

блоков,которые

 

 

 

 

 

 

 

 

 

 

 

отличаются

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

отличаются

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Стандарт-

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Дополнитель-

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ныймодуль

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

наяобработка

 

 

 

ядра

 

 

 

 

Используются

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

позднее

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Обработанный

 

 

 

 

 

 

 

 

 

 

Главный

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

пост-объектный

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

модуль

 

 

 

 

 

 

 

 

 

 

 

файл

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Линковщик

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ПринципработыKsplice

 

 

 

 

 

 

 

 

 

 

 

 

раз,чтотоженеслишкоминтересно.Чтобырешитьэтипроблемы, былпридуманфреймворкbinpatch(openbsdbinpatch.sf.net),позволяющийскачиватьпатчи,накладыватьихнаисходныйкод,собирать пропатченноеприложениеилиядроипомещатьеговархиввполуавтоматическомрежиме.Позднеепоявиласьмодификацияфреймвор- каподназваниемbinpatchng(binpatchng.puffy-at-work.org),которая позволялаупаковыватьпропатченныеприложениянетольков архив,ноивпакетOpenBSD-формата,датак,чтоприудаленииэтого пакетасистемаоткатываласьвпервоначальноесостояние.

BinpatchngполностьюоснованнаMakefile’ахиконцептуально оченьблизокксистемепортов.Чтобысоздатьновыйпатч,необходимопрописатьвнужныйMakefileпарупростыхправил,описывающихпатчиспособегосборки,азатемвыполнитькомандуmake.Всё остальноесистемавозьметнасебяивскоресгенерируетготовый кустановкеархивилипакет,которыйдостаточноскопироватьна нужнуюмашинуиустановитьспомощьюстандартныхсредств.На пальцахвсёэтовыглядитследующимобразом:

1.Скачиваемфреймворкираспаковываемеговкаталог/usr (насамомделеможноивдругоеместо):

$ cd /tmp; wget http://goo.gl/hvF7O

$ su

# tar -xzf /tmp/binpatchng-1.1.tar.gz -C /usr

2.Скачиваемархивыsys.tar.gzиsrc.tar.gzсофициальногоFTP ипомещаемихвкаталогdistfiles,внутриbinpatchng:

#cd /usr/binpatchng-1.1/

#mkdir distfiles

#cd distfiles

#wget ftp://ftp.openbsd.org/pub/OpenBSD/4.9/sys.tar.gz

#wget ftp://ftp.openbsd.org/pub/OpenBSD/4.9/src.tar.gz

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

3.Скачиваеминсталляционныеархивыдлянужнойархитектуры

(напримерftp://ftp.openbsd.org/pub/OpenBSD/4.9/i386/)ипомещаем ихвdistfiles/имя_архитектуры.

4.ПишемMakefile.Дляэтогопереходимнастраницуwww.openbsd.org/ errata.html,выбираемнужныйрелиз(для4.9покапатчейнет,поэтомуя возьмузапример4.8),выбираеминтересующийнаспатч(например001_ bgpd.patch),открываемего.Впервойстрокебудетуказанспособсборки патча.Нашазадача—переложитьегонаязыкMakefile.Этопросто:

создаемфайл/usr/binpatchng-1.1/Makefileипишемвнегоследующее:

#vi /usr/binpatchng-1.1/Makefile

#Для какой архитектуры собираем? (Можно не указывать,

#если совпадает с архитектурой текущей машины.) ARCH=i386

#Здесь перечисляем патчи (просто откидываем расширение patch) PATCH_COMMON=001_bgpd

#Здесь идут инструкции для сборки патча 001_bgpd.patch

001_bgpd:

cd ${WRKSRC}/usr.sbin/bgpd

(${_obj}; ${_depend}; ${_build})

# Далее можно поместить инструкции по сборке остальных патчей…

Самоесложноевэтомфайле—этоинструкциисборки,онимогут показатьсямудреными,однаконаписатьихоченьлегко.Достаточно простоперевестиописанныевофициальномпатчеинструкциина макроопределения.Например,внашемслучаеонивыгляделитак:

cd usr.sbin/bgpd

make obj

make depend

make

make install

СравниихсдирективамивMakefile,ивсёпоймешь.Задополнительнымиподробностямиобращайсякпримеру,описанномувфайле Makefile.sample.Теперьможнособратьпакетснужнымпатчем:

#cd /usr/binpatchng-1.1/

#make PATCH="001" build

#make PATCH="001" plist

#make PATCH="001" package

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

# pkg_add binpatch-4.9-i386-001.tgz z

УстанавливаемклиентKsplice

116

ХАКЕР 10/153/2011

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-xcha

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

 

-

 

 

 

 

 

 

d

 

F

 

 

 

 

 

 

 

t

 

D

 

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

UNIXOIDm

w Click

 

 

 

w

 

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

o

 

.

 

 

 

 

 

 

.c

 

 

p

 

 

 

 

 

g

 

 

 

 

 

df

-xcha

n

e

 

Тотальное

подчинение

MEGAFAQПОХАКУ

ИМОДИФИКАЦИИANDROIDOS

ЕвгенийЗобнин

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

(execbit.ru)w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

утинг,рекавери,мод,сайаноген…За

Ркаких-тодвагодавокругAndroid’асфор- мировалосьсплоченноеиневероятно

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

ВэтомFAQяпопыталсяответитьнасамые важныеиинтересныевопросы,которыемогут возникнутьпередчеловеком,которыйсобирается всерьезвзятьсязаизучениеAndroid’а.Прочитав этустатью,тыузнаешь,почемуполучениеправroot такважнодляпользователейAndroid’а,какполучитьэтиправа,зачемнуженкастомныйрековери ичтоондает,какиесуществуютальтернативные модификацииAndroid’аикакаяизнихлучше,узнаешь,каксделатьсвоюсобственнуюпрошивку.

QANDROIDБЕЗОПАСЕН?

Androidгораздобезопаснеемногихдругих A мобильныхоперационныхсистем. Существуеттриосновныхмеханизма,которые защищаютAndroidотвредоносныхприложений:

1.Виртуальнаямашина.Android-приложения могутполучитьдоступкоборудованиюустройстватолькоспомощьюпрослоек,реализованныхвиртуальноймашиной.Этозначит,что всеобращенияприложенийкоперационной системе,устройствамиработаспамятьючетко контролируютсявиртуальноймашинойилюбыезлонамеренныедействиямогутбытьпресечены.Например,срывстекавприложениях, написанныхнаJava,невозможенвпринципе.

2.Правадоступа.Androidиспользует стандартныйLinux-механизмуправления правамидоступадляизолированияданных приложенийдруготдруга.Длякаждой устанавливаемойпрограммысистема создаетновогопользователяигруппу

СтатистикараспространенияверсийAndroid’апоустройствам(посостояниюна5июля)

(app_1,app_2,app_3ит.д.)иустанавливает umaskэтогопользователявзначение0026 (u=rwx,g=rx,o=x).Еслизловредноеприложениепопытаетсяпрочитатьданныедругих приложений,онополучитошибкудоступа.

3.Механизмсообщений.Android-приложения неимеютдоступадругкдругу,заисключениемвозможностипосылкисообщений,формат которыхстрогоопределен,асамапересылка контролируетсянасистемномуровне.Благодаряэтомузловредноеприложениенеможет каким-либообразомповлиятьнаостальные исполняемыеприложения.

Такжестоитотметить,чтолюбаяAndroidпрограммадолжнаиметьманифест,которыйописываетвсесистемныедействия,которыеможет совершатьприложение.ВовремяустановкипакетаAndroidсообщаетпользователюсписокэтих действий,внимательноизучивкоторый,можно выяснить,способнолиприложениенанестивред системеилиунестиконфиденциальныеданные (всезловредныепрограммыдляAndroid’аоснованынатом,чтопользовательпростопропускаетэтот списокмимоглаз).

ЗАЧЕМРУТИТЬ

QСВОЙСМАРТ?

Чтобыполучитьконтрольнадустройством. A Rooting—этопроцессполученияправroot надевайсесовсемивытекающимиотсюда преимуществами.Чтобызащититьпродуктот

криворукихшкольников,производители смартфоновблокируютучетнуюзапись пользователяroot,однакоспомощьюразличных эксплоитов,действующихпротивядраLinux,или дыр,оставленныхпроизводителемтелефона, владелецможетповыситьсвоипривилегиив системе,залитьнаустройствобинарникsuи использоватьегодляполученияправадмина (звучитдико,ночтобыполучитьroot-правана T-MobileG1,достаточнобылоподключитьсяк телефонуспомощьюtelnet).Приэтомследует различатьпостоянныйroot(когданаустройство заливаетсяsu)ивременный,полученныйс помощьюэксплоитов.Некоторыепроизводители (Motorola,привет!)оснащаютсвоисмарты защитойNAND-памяти,используемойдля храненияоперационнойсистемы,такчто смонтироватьееврежимезаписииполучить постоянныйrootнеудастся(кслову,этузащиту ужедавнонаучилисьобходить).

Рутованныйтелефонстановитсягораздо болееудобнымдляпродвинутыхпользователей. Появляетсявозможностьмодифицироватьоперационнуюсистему,удалятьидобавлятьсистемные приложения,установливатьbusybox,управлять брандмауэром,устанавливатьсофт,требующий поддержкиправroot(например,программудля снятияскриншотов),атакжезаливатьнаустройстволюбыепрошивки.Длякаждогоустройства процессполученияправrootиндивидуален,

Примернотаквыглядит«пирог»Android’аизнутри

118

ХАКЕР 10/153/2011

Соседние файлы в папке журнал хакер