книги хакеры / журнал хакер / 153_Optimized
.pdf
|
|
|
|
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 |