Кіріспе

Linux аралық бағдарламалық қамтамасыз ету

D-Bus (Desktop Bus деп қысқартылған) – бір машинада бір уақытта іске қосылған бірнеше процестер арасында байланыс орнатуға мүмкіндік беретін хабарға бағытталған аралық бағдарламалық қамтамасыз ету механизмі. D-Bus, GNOME әзірлеушісі Havoc Pennington бастамасымен құрылған freedesktop.org жобасының бір бөлігі ретінде әзірленді, мақсаты GNOME және KDE сияқты Linux десктоп орталары ұсынатын қызметтерді стандарттау болды. freedesktop.org жобасы сонымен қатар спецификацияның анықталған нұсқасы ретінде libdbus деп аталатын тегін және ашық кодты бағдарламалық кітапхананы да әзірледі. Бұл кітапхананы D-Bus-пен шатастыруға болмайды, себебі D-Bus спецификациясының басқа да іске асырылымдары бар, мысалы GDBus (GNOME), QtDBus (Qt/KDE), dbus-java және sd-bus (systemd құрамында).

Автобус үлгісі

Автобуспен әрбір байланыс D Bus контекстінде автобус атауы деп аталады. Автобус атауы әріптердің, сандардың, дефистердің және астын сызулардың нүктелермен бөлінген екі немесе одан көп тізбегінен тұрады. Жарамды автобус атауының мысалы:
Процесс автобуспен байланыс орнатқанда, автобус сол байланысқа бірегей байланыс атауы деп аталатын арнайы автобус атауын тағайындайды. Осы типтегі автобус атаулары өзгермейді—байланыс бар болғанша олар өзгермейді және, ең бастысы, автобустың қызмет ету мерзімі ішінде оларды қайта пайдалануға болмайды. Яғни, егер сол процесс автобусқа қосылысты жабып, жаңасын ашса да, басқа ешқандай қосылысқа мұндай бірегей байланыс атауы тағайындалмайды. Бірегей байланыс атауларын тану оңай, себебі олар әдетте тыйым салынған қос нүктеден басталады. Бірегей байланыс атауының мысалы: (қос нүктеден кейінгі таңбалардың ерекше мағынасы жоқ). Процесс өзінің байланысы үшін қосымша автобус атауларын сұрауы мүмкін, егер сұралған атау басқа қосылыспен пайдаланылмайтын болса. D Bus терминологиясында, автобус атауы қосылысқа тағайындалғанда, қосылыс автобус атауына ие деп айтылады. Осыған орай, бір автобус атауы бір уақытта екі қосылысқа тиесілі бола алмайды, бірақ бірегей байланыс атауларынан айырмашылығы, егер бос болса, осы атауларды қайта пайдалануға болады: процесс басқа процесс босатып алған автобус атауын (қасақана немесе қателікпен) қайтарып алуы мүмкін. Осы қосымша автобус атауларының мақсаты, көбінесе «жақсы белгілі атаулар» деп аталады, – алдын ала келісілген автобус атауын пайдаланып қызметке сілтеме жасау мүмкіндігін ұсыну. Мысалы, жүйелік автобустағы ағымдағы уақыт пен күнді хабарлайтын қызмет, ол қай процесс болса да, автобус атауына ие болатын процесс ішінде орналасқан. Автобус атауларын қарапайым тәсіл ретінде бір инстанциялық қолданбаларды жүзеге асыру үшін пайдалануға болады (екінші инстанциялар автобус атауы қолданылып жүргенін анықтайды). Сондай-ақ, қызмет процесінің өмірлік циклын қадағалау үшін де пайдалануға болады, себебі процесс аяқталғанда автобус автобус атауын босатып, хабарлама жібереді.

Нысанның үлгісі

Бірнеше компоненттік бағытталған байланыс жүйелерін алмастыру ретінде бастапқы тұжырымдамасының нәтижесінде, D-Bus өзінің алдыңғыларымен клиенттер мен қызметтер арасындағы байланыстың семантикасын білдіретін объектілік модельді бөліседі. D-Bus нысандық моделінде қолданылатын терминдер кейбір нысанға бағытталған бағдарламалау тілдерінде қолданылатын терминдерді еліктейді. Бұл D-Bus-тың ҰОБ тілдерімен шектеледі дегенді білдірмейді, шын мәнінде, ең көп қолданылатын іске асыру C тілінде, процедуралық бағдарламалау тілінде жазылған. D-Bus-та процесс өзінің қызметтерін нысандарды ашу арқылы ұсынады. Бұл нысандар шақырылатын әдістерге және нысан шығаратын сигналдарға ие. Әдістер мен сигналдар бірлесіп нысанның мүшелері деп аталады. Автобусқа қосылған кез келген клиент нысанмен оның әдістерін пайдалану арқылы, сұрау салулар жасау арқылы немесе нысанға әрекеттерді орындауға бұйрық беру арқылы өзара әрекеттесе алады. Мысалы, уақыт қызметін көрсететін нысанды клиент ағымдағы күн мен уақытты қайтаратын әдісті пайдалану арқылы сұрауы мүмкін. Клиент сондай-ақ белгілі бір оқиғаларға байланысты, әдетте, негізгі қызметпен байланысты, нысанның күйі өзгергенде шығаратын сигналдарды тыңдай алады. Мысал ретінде, USB немесе желілік драйверлер сияқты аппараттық құрылғыларды басқаратын қызмет «жаңа аппараттық құрылғы қосылды» оқиғасын белгілейді. Клиенттер басқа белгілі бір нысаннан белгілі бір сигналдарды қабылдауға қызығушылық танытатынын көрсетуі керек, өйткені D-Bus басы тек қана оларға тіркелген қызығушылық бар процестерге сигналдарды жібереді. D-Bus шинасына қосылған процесс одан қанша D-Bus нысанын экспорттауды сұрауы мүмкін. Әрбір нысан нысанның жолымен, сандар, әріптер және сызықтар тізбектерімен анықталады, олар слэш таңбасымен бөлінген және префикстелген, Unix файлдық жүйесінің жолдарына ұқсастығы үшін осылай аталады. Нысан жолы сұрату процесінде таңдалады және ол осы автобус байланысы аясында бірегей болуы тиіс. Дұрыс нысан жолының мысалы: Алайда, нысан жолдары ішінде иерархия құруға мәжбүр емес, бірақ одан бас тартпайды. Қызметтің нысандарына арналған атаудың ерекше конвенциясы мұндай қызметтің әзірлеушілеріне байланысты, бірақ көптеген әзірлеушілер оларды жобаның резервтелген домендік атын префикс ретінде (мысалы) қолдана отырып, атау кеңістігін таңдайды. Әрбір нысан экспортталған нақты автобус байланысымен ажырамас байланыста болады және D-Bus тұрғысынан алғанда, тек осындай байланыс аясында ғана өмір сүреді. Сондықтан, белгілі бір қызметті пайдалану үшін клиент тек қажетті қызметті ұсынатын нысан жолын ғана емес, сонымен қатар қызмет процесі автобусқа қосылған автобус атауын көрсетуі тиіс. Бұл өз кезегінде шинаға қосылған бірнеше процестердің бірдей нысан жолдары бар әртүрлі нысандарды біркелкі экспорттауына мүмкіндік береді. Интерфейс нысанмен қолдануға болатын мүшелерді - әдістер мен сигналдарды анықтайды. Бұл Java тілінің интерфейс белгісіне ұқсас нүктеден бөлінген атаумен анықталған әдістердің (оның өту және қайтару параметрлерін қоса алғанда) және сигналдардың (оның параметрлерін қоса алғанда) декларацияларының жиынтығы. Интерфейс атауларының ұқсастығына қарамастан, интерфейс атаулары мен шина атауларын шатастыруға болмайды. D-Bus нысаны бірнеше интерфейсті іске асыра алады, бірақ кем дегенде біреуін іске асырып, ол анықтаған әрбір әдіс пен сигналға қолдау көрсетуі керек. Нысанның барлық интерфейстерінің комбинациясы нысанның түрі деп аталады. Нысанды пайдаланған кезде клиенттік процеске мүше атауынан басқа мүше интерфейсінің атауын беру жақсы тәжірибе, бірақ бұл нысанмен іске асырылған әртүрлі интерфейстерден қол жетімді мүше атауларының қайталануы салдарынан екіжақтылық туындаған кезде ғана міндетті, әйтпесе таңдалған мүше анықталмаған немесе қате. Ал эмиссияланатын сигнал әрқашан өзінің қандай интерфейске жататынын көрсетуі тиіс. D-Bus спецификациясы сонымен қатар бірнеше стандартты интерфейстерді анықтайды, оларды нысан өзінің интерфейстерінен басқа да іске асыруы мүмкін. Техникалық тұрғыдан ерікті болса да, D-Bus қызметтерін әзірлеушілердің көпшілігі оларды экспортталған нысандарда қолдауға шешім қабылдайды, өйткені олар D-Bus клиенттеріне маңызды қосымша мүмкіндіктер ұсынады, мысалы, интроспекция. Бұл стандартты интерфейстер: D-Bus қосылысының белсенді екенін тексерудің жолын ұсынады. : клиенттік процеске орындау кезінде нысан іске асыратын интерфейстердің, әдістер мен сигналдардың сипаттамасын (XML форматында) алуға мүмкіндік беретін интроспекция механизмін ұсынады. : D-Bus нысанына негізгі нысан қасиеттерін немесе атрибуттарын көрсетуге немесе олар болмаған жағдайда оларды имитациялауға мүмкіндік береді. : D-Bus қызметі нысандарын иерархиялық түрде ұйымдастырғанда, бұл интерфейс нысанға оның жолының астындағы барлық қосалқы нысандар, сондай-ақ олардың интерфейстері мен қасиеттері туралы ақпаратты алуға мүмкіндік береді, бұл тек бір әдіс шақыру арқылы жасалады. D-Bus спецификациясы басқарушылық автобус операцияларын ( «автобус қызметтері» деп аталатын) анықтайды, оларды нысаны арқылы орындауға болады, ол автобус атауында орналасқан. Әрбір автобус бұл арнайы автобус атауын өзі үшін резервтейді және осы автобус атауы мен нысан жолына жасалған кез келген сұрауды басқарады. Автобуспен ұсынылатын басқарушылық операциялар нысан интерфейсімен анықталады. Бұл операциялар мысалы, автобустың күйі туралы ақпарат беру үшін немесе қосымша белгілі автобус атауларын басқару және босату үшін қолданылады.

Ішкі істер

Қазіргі D Bus жүйелерінің көпшілігі анықтамалық нұсқаулықтың архитектурасын қолданады. Бұл архитектура екі негізгі компоненттен тұрады:

екі процесс арасында хабар алмасу үшін D Bus сымдық протоколын іске асыратын, нүктеден нүктеге байланыс кітапханасы. Басқа жүйелерде бұл кітапхана жоғары деңгейдегі басқа кітапханамен, тілдік байланыспен немесе бірдей мақсатқа қызмет ететін басқа дербес жүйемен ауыстырылуы мүмкін. Бұл кітапхана екі процесс арасындағы бір-бірден байланысты ғана қолдайды. D Bus нүктеден нүктеге байланыс кітапханасын пайдалана отырып, автобустық рөлді атқаратын және қалған процестер қосылатын арнайы демондық процесс. Бұл процесс хабарлар шинасы деп те аталады, себебі ол шинаға қосылған кез келген процестен басқа процеске хабарларды бағыттауға жауапты. Анықтамалық нұсқаулықта бұл рөлді , өзі D Bus-тің үстіне салынған , атқарады. Басқа бір нұсқаулық – бұл хабарлар шинасы , ол D Bus-тің үстіне салынған. Кітапхана (немесе оған баламасы) D Bus қосылысының екі шетіндегі екі процесс арасында қажетті D Bus хабарларын тасымалдау үшін төменгі деңгейдегі IPC механизмін ішкі түрде пайдаланады. D Bus спецификациясы қолданылуға тиіс нақты IPC тасымалдау механизмдерін міндеттейді деп айтуға болмайды, себебі байланыс кітапханасы қандай тасымалдау әдістерін қолдайтынын шешеді. Мысалы, Linux сияқты Unix жүйелерінде әдетте Unix домендік сокеттерін негізгі тасымалдау әдісі ретінде пайдаланады, бірақ TCP сокеттерін де қолдайды. Екі процестің байланыс кітапханалары таңдалған тасымалдау әдісі және олардың байланысы үшін қолданылатын арна туралы келісуі керек. Бұл ақпарат D Bus адресі деп аталады. Unix домендік сокеттері файлдық жүйе объектілері болып табылады, сондықтан оларды файл атауымен анықтауға болады, сондықтан жарамды мекенжай unix:path=/tmp/. жасырын сокет болады. Екі процесс те D Bus қосылысын орнату үшін тиісті байланыс кітапханаларына бірдей адресті беруі керек. Адрес сонымен қатар байланыс кітапханасына кілт-мәнді жұптар түрінде қосымша деректерді беруге мүмкіндік береді. Осылайша, мысалы, ол оны қолдайтын белгілі бір қосылыс түріне аутентификациялық ақпаратты ұсынуы мүмкін. D Bus шинасын іске асыру үшін хабарлар шинасы демоны пайдаланылғанда, шинаға қосылуды көздейтін барлық процестер шина адресін білуі керек, яғни процесс орталық хабарлар шинасы процесіне D Bus қосылысын орната алатын адресті білуі керек. Бұл жағдайда хабарлар шинасы демоны шина адресін таңдайды және қалған процестер осы мәнді тиісті немесе баламалы кітапханаларға беруі керек. әрбір шина нұсқасы үшін әртүрлі шина адресін анықтайды. Бұл мекенжайлар демонның конфигурациялық файлдарында анықталған. Екі процесс тікелей бір-бірімен хабар алмасу үшін D Bus қосылысын пайдалана алады, бірақ бұл D Bus-ты пайдаланудың қалыпты тәсілі емес. Көбінесе әрбір процесс өзінің нүктеден нүктеге D Bus қосылысын орнатуы тиіс байланыс орталық нүктесі ретінде хабарлар шинасын (яғни ) пайдалану қажет. Процесс – клиент немесе қызмет – D Bus хабарын жібергенде, хабарлар шинасы процесі оны бірінші кезекте қабылдайды және тиісті алушыға жеткізеді. Хабарлар шинасы демонын әрбір хабарды D Bus қосылысы арқылы алушы процеске қайталау арқылы оның мақсатына жеткізуді басқаратын хаб немесе маршрутизатор ретінде қарастыруға болады. Алушы процесс хабарламаның бас бөлігіндегі мақсатты шина атауымен немесе сигнал тарату хабарламалары жағдайында хабарлар шинасы демонымен сақталатын сигналдарға жазылу ақпаратымен анықталады. Хабарлар шинасы демоны белгілі бір жағдайларға жауап ретінде өзінің хабарларын шығара алады, мысалы, жоқ шина атауына хабар жіберген процесске қате туралы хабарлама. D Bus өзі ұсынған мүмкіндіктер жиынтығын қосымша функционалдықпен жақсартады. Мысалы, қызметті белсендіру қажет болған кезде қызметтерді автоматты түрде іске қосуға мүмкіндік береді, осындай қызметтің кез келген шина атауына алғашқы сұрау хабарлар шинасы демонына келгенде. Осылайша, қызмет процестерін жүйелік немесе пайдаланушы инициализациясы кезінде іске қосудың қажеті жоқ, сондай-ақ олар пайдаланылмаған кезде жадты немесе басқа ресурстарды тұтынудың қажеті жоқ. Бұл мүмкіндік бастапқыда setuid көмекшілерін пайдалану арқылы іске асырылды, бірақ қазіргі уақытта оны systemd-тің қызметті белсендіру шеңберінен де қамтамасыз етуге болады. Қызметті белсендіру – қызметтердің өмірлік циклін басқаруды жеңілдететін маңызды мүмкіндік (мысалы, десктоп компоненті қашан іске қосылуы немесе тоқтатылуы керек).

Тарих және қабылдау

D Bus 2002 жылы Havoc Pennington, Alex Larsson (Red Hat) және Anders Carlsson бастады. 1.0 нұсқасы – API тұрақты деп есептелді – 2006 жылдың қараша айында жарияланды. KDE 2 және 3 нұсқаларында қолданылған DCOP жүйесінің үлкен ықпалымен, D Bus KDE 4 нұсқасында DCOP-ты толығымен алмастырды. D Bus-тің іске асырылуы көптеген POSIX операциялық жүйелерін қолдайды, сондай-ақ Windows үшін де портталған. Оны Qt 4 және одан кейін GNOME қолданады. GNOME-да ол бұрынғы Bonobo механизмінің көп бөлігін біртіндеп алмастырды. Xfce да оны пайдаланады. Алғашқы пайдаланушылардың бірі (қазір қолданыстан шығарылған) Аппараттық абстракция қабаты болды. HAL D Bus-ті компьютерге қосылған немесе алынып тасталған аппараттық құралдар туралы ақпаратты экспорттау үшін пайдаланды. D Bus-тің қолданылуы үстелдік орталардың бастапқы саласынан асып, жүйелік қызметтердің көлемін кеңейтуде. Мысалы, NetworkManager желілік демоны, BlueZ Bluetooth стегі және PulseAudio дыбыс сервері өз қызметтерінің бір бөлігін немесе толығымен беру үшін D Bus-ті пайдаланады. systemd және systemd арасындағы байланыс үшін D Bus сымдық протоколын қолданады, сондай-ақ дәстүрлі жүйелік демондарды, мысалы logind-ті, D Bus қызметтеріне айналдыруға көмектеседі. D Bus-тің тағы бір белсенді пайдаланушысы – Polkit, оның саясатты басқару демоны жүйелік шинаға қосылған қызмет ретінде іске асырылған.

libdbus (жазбаша)

D Bus-тың бірнеше іске асырылуы болғанымен, ең көп қолданылатыны – freedesktop.org жобасымен әзірленген эталондық іске асырылым libdbus. Дегенмен, libdbus – төменгі деңгейдегі іске асырылым, ол қолданба жасаушылар үшін тікелей пайдалану үшін емес, D Bus-тың басқа да қайта іске асырылымдары үшін (мысалы, десктоп орталарының стандартты кітапханаларында немесе бағдарламалау тілі байланыстарында кездесетіндер) анықтамалық ретінде қарастырылған. freedesktop.org жобасының өзі қолданба авторларына "жоғары деңгейдегі байланыстардың немесе іске асырылымдардың бірін пайдалануды" ұсынады. libdbus-тың ең көп қолданылатын D Bus іске асырылымы болуы "D Bus" және "libdbus" терминдерінің жиі алмастырылып қолданылуына, соның салдарынан шатасуға әкеп соқты.

GDBus

GDBus – GTK+ және GNOME үшін арналған, GLib құрамына кіретін GIO ағындары негізінде құрылған D-Bus-тің іске асырылуы. GDBus libdbus-тың қаптамасы емес, D-Bus спецификациясы мен протоколының толыққанды және тәуелсіз қайта іске асырылуы болып табылады. GTK+ 3-ке негізделген MATE Desktop және Xfce (4.14 нұсқасы) да GDBus-ты пайдаланады.

sd-көлік

2013 жылы systemd жобасы кодты жеңілдету мақсатында libdbus-ты қайта жазды, бірақ бұл D Bus жүйесінің жалпы өнімділігін күрт арттыруға әкелді. Алдын ала сынақтар нәтижесінде BMW компаниясы systemd-нің D Bus кітапханасы өнімділікті 360%-ға дейін арттыратынын анықтады. Systemd нұсқасы 221-ге жеткен кезде sd шинасының API тұрақты деп жарияланды.

kdbus

kdbus - ядро арқылы басқарылатын, өзара байланыс механизмі ретінде D-Bus-ті қайта іске асыруды мақсат еткен жоба. Оның өнімділігін арттырудан басқа, kdbus Linux ядросының атау кеңістіктері және аудит сияқты басқа мүмкіндіктерінен де артықшылықтарға ие болар еді, мысалы, ядроның араласуы арқылы қауіпсіздік, жарыс жағдайларын болдырмау, сондай-ақ D-Bus-ті жүйелік жүктеу және өшіру кезінде пайдалану мүмкіндігі (systemd-ге қажет болған жағдайларда). Linux ядросына kdbus-ты қосу мәселелі болды және процестер аралық байланыс құралы ретінде BUS1 пайдасына тоқтатылды.

Тілдік байланыстар

D Bus үшін Java, C#, Ruby, Rust және Perl сияқты бірнеше бағдарламалау тілдеріне арналған байланыстар әзірленді.