Budowa systemów opartych o jądro Linux

3

Witajcie, jakiś czas temu przesiadłem się z Windowsa na Linuksa ( #by Microsoft Virus 10) w związku z tym chciałem zadać kilka pytań:

1)Jak działają aktualizacje w linuxie
W Windowsie wiemy jak działają aktualizacje - usługa Windows Update pobiera je, instaluje a potem wycofuje zmiany :)
Ciekawi mnie jak to wygląda pod Linuxem że tak to ujmę pod względem technicznym.
Na Linuksach jak wiadomo aktualizacje przeprowadzane są podczas działania systemu lub konkretnej aplikacji. I tu pytanie: Jak osiągnięto coś takiego - jak to możliwe że elementy systemu można wymienić gdy są używane albo jak można przeprowadzić aktualizację aplikacji gdy ona działa w ten sposób że się nic nie 'wywala' ? Jak to osiągnięto i dlaczego Windowsy tak nie mogą?

2)API systemu
Windws ma WinAPI a co ma system Linuksowy?
Na Linuksach są biblioteki takie jak SFML,Allegro,SDL,Ogre,Irricht, etc ale z jakiego API/bibliotek one korzystają?
Jak chcemy (męcząc się z WinApi) tworzyć plik to wołamy CreateFile() która analizuje argumenty i woła NtCreateFile() a potem automagicznie pojawia się plik. Jak to wygląda na Linuksie czy jest jakaś wielojęzykowa, wspierana, udokumentowana, oficjalna biblioteka do Linuksa ? Takie LinuxAPI?

3)Jak to jest z plikami na Windowsie i GNU/Linuxie - chodzi mi o programowanie - na Windowsie linkuje *.a a program *.exe podczas działania ładuje *.dll Jak to jest z GNU/Linuxem i plikami *.so - czym są te pliki - pełnia te same funkcje co pliki dll czy (jeszcze) jakieś inne?

4)Takie pytanko co jest powodem że istnieje tak dużo wersji SFML dla Windowsa a dla Linuxa tylko 2 (32/64 bit)?
http://www.sfml-dev.org/download/sfml/2.3.2/
Gdy pobieramy SFML dla WIndowsa czytamy na stronie:

The compiler versions have to match 100%! Here are links to the specific MinGW compiler versions used to build the provided packages.

Czemu nie ma powyższego wymogu na Linuksie?

2

ZTCW to:

  1. Na Linuksie można usunąć otwarty plik, a uchwyty do plików dalej pozostaną poprawne. Dzieje się tak dlatego, że w Linuksie jest coś takiego jak i-węzeł ( https://en.wikipedia.org/wiki/Inode ) i po otwarciu pliku dostajemy uchwyt do i-węzła. Mapowanie z nazw plików do i-węzłów jest niezależne.

Nową wersję pliku program otrzyma po ponownym otwarciu (z użyciem nazwy pliku).

Aktualizacja programów, które są uruchomione jednak nie jest zalecana. U mnie Ubuntu prosi o restart po aktualizacji kluczowych elementów. Firefox wykrywa aktualizacje i też prosi o restart (samego siebie, a nie całego systemu).

  1. Na GNU jest np libc - standardowa biblioteka na obecności której można polegać. Linux ma stabilne API (z perspektywy programów działających w trybie użytkownika). GNU/Linux jest mocno zgodne z POSIX, które opisuje dużo funkcjonalności.

  2. Z grubsza *.a to odpowiednik *.exe (Endrju sugeruje *.lib), a *.so to odpowiednik *.dll. Na Linuksie jednak konwencja jest taka, że rozszerzenie .a się wywala z finalnej wersji programu i zostaje sama nazwa np sed, bash, etc Do oznaczania programu jako wykonywalnego służy atrybut 'executable' i jest on niezależny od rozszerzenia.

  3. Nie jestem pewien, ale być może chodzi o konkretne wersje bibliotek standardowych, które mają niekompatybilne API i/ lub ABI.

1

Linux ma wiele menadżerów pakietów czyli aktualizacji od apt-get, aptitude, pacman, emerge po yast. Są rozmaite graficzne konsolowe nakładki na nie. Linux ma pakiety deb, txz, tgz, rpm zależnie od dystrybucji, teraz Canonnical ma wprowadzać kontenery snapy, coś jak plik exe z zależnościami lub jak paczka PBI w PC-BSD.
Budować system o party o jądro Linux nie ma sensu, bo już byłby to inny system. Ale zbudować dystrybucje opartą o jądro Linux to już śmiało można i są do tego specjalne narzędzie i poradniki, jak LFS lub bardziej przyjazne SUSE Studio. Sporo tego było, ale wydaje mi się że już lepiej postawić sobie Gentoo od stage 1 i poznawać Linux od podszewki.

0

Dzięki wielkie za odpowiedzi.

6)Z tego co wiem Linux nie ma 'wbudowanych' podsystemów do zarządzania oknami. Jest tam taki jakiś serwer X i tu pytanie jak utworzyć okno. Ma ten serwer X jakieś API? W WinAPI to jest coś w stylu CreateWindowEx (tak rzucam nazwę) czy jest podobna funkcja na linuksowych systemach. Nie wspomnę o tym że pewnie ktoś 'obraził' się na ten serwer X i zrobił własny - jak w takim wypadku utworzyć okno na tym innym serwerze wyświetlania.

7)Gdybyśmy zrezygnowali z rysowania by SFML/Allegro/dowolna_biblioteka to na Windowsie z pomoca przychodzi nam GDI - czy Linuks ma odpowiednik tego GDI - chodzi o to czy jest taka biblioteka rysowania/tworzenia_okien/etc że można na niej polegać. Czy za takową można uznać QT lub Gtk?

1

ZTCW to:

  1. Linux to tylko jądro, więc żadnego systemu zarządzania oknami nie będzie miał
  2. GNU nie zawiera menedżera okien
  3. X11 może latać nie tylko na Linuksie, ale też na innych systemach (np BSD)
1
  1. Windows niespecjalnie pozwala na usuwanie plików używanych przez aplikacje (dotyczy do exeków i dllek), aczkolwiek część aktualizacji nie ma z tym problemu (wykorzystując hot patching). Pewnie wynika to z kompatybilności wstecznej i innych decyzji podjętych dekady temu.
  2. System V i POSIX.
  3. W Linuksie też masz biblioteki statyczne i dynamiczne, zasada bardzo podobna do Windowsa.
  4. Zapewne chodzi o manglowanie nazw funkcji — kompilator ma tutaj względnie dużą dowolność, więc jeżeli skompilujesz bibliotekę jedną wersją kompilatora, a aplikację inną, to w momencie linkowania linker nie znajdzie odpowiadających sobie funkcji i wszystko się wysypie.
    6, 7. Tutaj tak naprawdę musisz szukać w API podsystemu, którego chcesz używać. Qt i inne biblioteki próbują przykryć różnice w API systemów swoimi funkcjami aby zapewnić przenośność, ale skoro chcesz zejść poziom niżej, to i musisz głębiej w dokumentacji szukać.
0

Jak już założyłem temat to jeszcze popytam ;)

Na szybko przejrzałem kod środowiska Cinnamon oraz KDE i 'odkryłem' (na podstawie includów)że używają one bibliotek Gtk/QT
KDE https://github.com/KDE
Cinnamon https://github.com/linuxmint/Cinnamon

8)Czy dobrze mi się wydaje że te menadżery logowania/ środowiska graficzne to są zwykłe aplikacje tylko (jak by to określić) z oknem na pełen ekran
które auto startują kiedy trzeba a do kontrolek i wyświetlania używają np QT/Gtk? W sumie to by wyjaśniało dlaczego gdy sie zaloguje pojawia sie chwilowo tapeta linux mint (domyślne tło) a potem dopiero moja tapeta,pasek etc - w sensie loguje się, menadżer logowania się wyłącza i dopiero uruchamia się to środowisko/nakładka graficzna.
Jeżeli tak jest to według tej logiki mógłbym napisać własną aplikację, podmienić odpowiednie pliki wykonywalne i następnym razem odpali się moja 'nakładka'. Dobrze myślę?

PS: Tak, pisze własne super środowisko, premiera za 2 tygodnie, będzie działać m.in na WyderOS :)

0

Nie trzeba przeglądać kodu by się zorientować co z czego korzysta.

https://en.wikipedia.org/wiki/Cinnamon_(software)

Cinnamon is a desktop environment that is based on the GTK+ 3 toolkit.

https://en.wikipedia.org/wiki/KDE#History_of_releases

Matthias Ettrich chose to use Trolltech’s Qt framework for the KDE project.

A podziału na środowisko graficzne/ menedżer okien/ etc nie rozumiem do końca, więc nie będę się wypowiadał :)

1
Afish napisał(a):
  1. Windows niespecjalnie pozwala na usuwanie plików używanych przez aplikacje (dotyczy do exeków i dllek), aczkolwiek część aktualizacji nie ma z tym problemu (wykorzystując hot patching). Pewnie wynika to z kompatybilności wstecznej i innych decyzji podjętych dekady temu.

Blokada pod Windows plików wykonywalnych podczas ich działania jest wciąż aktualną decyzją projektową, a nie kompatybilnością wsteczną.
Dzięki temu w sytuacji niedoboru pamięci Windows nie musi trzymać w swapie kodu aplikacji - czyli na dysku tego co już jest na dysku. Na czas działania aplikacji plik ma założoną blokadę, więc mamy pewność że nie uciekł ani się nie zmienił (chyba że ktoś fizycznie odłączył nośnik…). System może więc w razie potrzeby wyrzucić kod z pamięci bez zapisywania go do swapa, a potem go ponownie załadować prosto z exeka.

1

ZTCW:
Na Linuksie otwarty i-węzeł nie zawsze znika, gdy proces usunie jego wpis w katalogu. I-węzeł jest usuwany, gdy nie ma dla niego wpisów w katalogach oraz nie jest otwarty przez żaden proces. A więc Linux też nie musi trzymać w swapie kodu aplikacji, bo ma go dostępnego przez i-węzeł.

https://en.wikipedia.org/wiki/Inode

An inode may have no links. An unlinked file is removed from disk, and its resources are freed for reallocation but deletion must wait until all processes that have opened it finish accessing it. This includes executable files which are implicitly held open by the processes executing them.

0

Aż z ciekawości zrobiłem prosty test:

/* test.c */
#include <stdlib.h>
int main(int argc, char* const argv[]) 
{
  while(1);
  exit(EXIT_SUCCESS); 
}
$ make test ; stat test; ./test
  File: './test'
  Size: 6608      	Blocks: 16         IO Block: 4096   regular file
Device: 801h/2049d	**Inode: 1314633     **Links: 1
Access: (0755/-rwxr-xr-x)  Uid: ( 1000/ alagner)   Gid: (  100/   users)

^Z
rm ./test
fg

A w drugim terminalu:

$ lsof -p `pgrep test`
test    10416 alagner  rtd    DIR    8,1     4096       2 /
**test    10416 alagner  txt    REG    8,1     6608 1314633 /home/alagner/tmp/test (deleted)**
test    10416 alagner  mem    REG    8,1  1960968 5508247 /usr/lib/libc-2.23.so
test    10416 alagner  mem    REG    8,1   172976 5508245 /usr/lib/ld-2.23.so
test    10416 alagner    0u   CHR  136,1      0t0       4 /dev/pts/1
test    10416 alagner    1u   CHR  136,1      0t0       4 /dev/pts/1
test    10416 alagner    2u   CHR  136,1      0t0       4 /dev/pts/1

Także @Wibowit chyba ma rację :)

BTW, trochę offtopicznie:
https://www.linux.com/news/bring-back-deleted-files-lsof

0

Przypomniała mi się pewna sytuacja - związana z tematem oczywiście.

Kiedyś zainstalowałem sobie na raz WIndows XP,WIndows 7 oraz Linux Mint - w tej kolejności z oczywistych względów
Podczas instalacji kazałem instalatorowi Linuxa by zainstalował na dysku twardym program rozruchowy - zapewne chodziło o GRUBA ;)
Wszystko działało aż coś popsułem u siebie w Linuxie i postanowiłem skasować jego partycje - zrobiłem to z poziomu WIndowsa i jakie było moje zdziwienie gdy komputer nie uruchamiał się potem właściwie - że niby brakuje GRUBowi plików.

Morał jest taki że GRUB mimo że kazałem instalować na /dev/sda, schował część swoich plików na partycji linuksowej.
Czy da się zrobić tak jak na Windowsie żeby ten GRUB trzymał swoje pliki na przykład na osobnej partycji ?

1

@kacper546 to normalna sytuacja. MBR to nie wszystko i grub instalowany jest na partycji. tak da się tak zrobić. wydzielasz sobie /boot

0

Czy da się zrobić tak jak na Windowsie żeby ten GRUB trzymał swoje pliki na przykład na osobnej partycji

No da, ale wtedy byś narzekał że GRUB się zepsuł po usunięciu tej osobnej partycji...

Ja tam wolę jednak, kiedy to windowsowy bootloader jest tym głównym, odpalanym z MBR, a pod pozycją LINUX jest GRUB i jego opcje.

0

@kacper456 polecam z tych wszystkich programów rozruchowych Burg.
http://alternativeto.net/software/grub/

0

@kacper546 to normalna sytuacja. MBR to nie wszystko i grub instalowany jest na partycji. tak da się tak zrobić. wydzielasz sobie /boot

@karolinaa
Załóżmy że mam na dysku 2 partycje, chce sobie zainstalować 2x GNU/Linux Mint 17.3 Mate
Skoro GRUBy jest instalowany na partycji to czy instalując drugi raz system nie zdublują mi się pliki konfiguracyjne GRUBa na tych dwóch partycjach ?

EDIT 1

Zakładając że będą one w katalogu /boot

1

Nie, ponieważ ostatni wgrywany system instaluje własny GRUB. No chyba że nie utworzysz umyślnie partycji /boot.

0

Odpowiedź jak wyżej, chyba że utworzysz dla wszystkich systemów tę samą partycję boot, wtedy się nadpiszą. Raz jeszcze: czemu nie z sektora startowego? Wtedy ustawiasz jedną partycję jako aktywną i problem z głowy...

0

Mi właśnie chodzi o to co w przypadku gdy nie tworze partycji na /boot
Krzywy obrazek pomocniczy
Bez nazwy2.png

Mamy dysk i 2 partycje GNU/LINUX #1 I GNU/LINUX #2 i każdy z nich instaluje tak że /boot jest i na partycji #1 i na #2 - w takim wypadku pliki się zdublują chyba że utworze specjalną partycję na /boot to wtedy nie będzie dubli.
Dobrze mówię?

===========
@alagner

Odpowiedź jak wyżej, chyba że utworzysz dla wszystkich systemów tę samą partycję boot, wtedy się nadpiszą.Raz jeszcze: czemu nie z sektora startowego? Wtedy ustawiasz jedną partycję jako aktywną i problem z głowy...

Ustawiam aktywną - w sensie 'zaznaczam' ze jest tam OS ? - Jakie da mi to korzyści w kontekście zdublowanych plików GRUBA ?
Chyba że sugerujesz użycie innego bootloader'a
Mów dalej......
PS: Są do tego jakieś aplikację?

Chciałbym jeszcze zapytać o kilka rzeczy:

  1. Jak w GNU/Linux robione są tłumaczenia - paczki językowe
    W Windows 7 robiło się to przez Windows Update albo hakowało aplikacją Vistualizator?(coś takiego) - śek w tym że gdy zmienialismy język systemu przez zewnętrzną aplikację to trzeba było ściągnąć paczkę z sieci - plik miał zdaje się rozszerzenie *mui.
    Mniejsza o to, gdzie w moim GNU/Linuxie są paczki językowe, tłumaczenia są ?rozpakowywane? czy (chyba raczej) trzymane w formie archiwum.
    Jak aplikacja np moja może odwołać się do tych tłumaczeń? Jest jakieś API ?

PS:
Znalazłem 'paczki' w /usr/share/locale
Mam ustawiony język polski, w katalogu /usr/share/locale/pl/LC_MESSAGES mam pełno plików *mo
Jak można je otworzyć? Wyszukiwarka sieciowa wskazała strony typu "advancedfileoptimizer.com" - nie klikam.
Próbowałem to otworzyć edytorem tekstu - gedit. Nie działa.

cdn.

0

Ale jak nie tworzysz osobnej partycji /boot, to nowa dystrybucja Ci ją tworzy na systemowej partycji plików /root/boot. No nie wiem czego jeszcze tu nie rozumiesz?

1

Przy okazji, jak się przewiduje wiele "zabaw" z Linuksami, a szczególnie po pożegnaniu z Windows, to może warto używać Logical Volume Management.
https://wiki.ubuntu.com/Lvm

0

@kacper546 szukasz pod hasłem locale. http://unix.stackexchange.com/questions/117608/changing-locale
Co do partycji i bootloadera: tu masz przykład dla LILO http://www.tldp.org/HOWTO/LILO-2.html, z grubem można zrobić analogicznie, wtedy ustawiasz tylko partycję jako aktywną (czy też nadajesz jej flagę bootable, zależnie konwencji może się to różnie nazywać) a MBR zostawiasz standardowy.

Generalnie googluj, ew. postaw wirtulkę i walcz, tu nie ma łatwej drogi ;)

0

@alagner i anonimowy użytkowniku

Możliwe że zostałem źle zrozumiany.
W przypowieści o GRUBie chodziło mi o domyślnie bootloader trzyma swoje pliki w katalogu /boot instalowanego OS'a
W sytuacji gdy zainstaluje kolejny system katalogu /boot tego drugiego systemu też pojawią się pliki GRUBA + wszelkiego typu memtest'y
W ten sposób pliki się dublują, robi się bałagan [według mnie].
W mojej opinii w katalogu /boot systemu powinny być pliki potrzebne do rozruchu ale SYSTEMU i tylko SYSTEMU takie jak obrazy jąder.
Co się tyczy plików niezbędnych bootloaderowi, powinny być te GRUBowskie pliki i memtest'y na osobnej partycji - coś na kształt rozwiązania M$ - partycja zarezerwowana przez program rozruchowy. Wtedy przy dogrywaniu kolejnego OS'a instalator szuka zarezerwowanej partycji - widzi że jest więc jakby dopisuje do listy nowo instalowany system i voila, porobione.

Oczywiście rozumiem dlaczego tego nie uczyniono, wiadomo MBR miał swoje ograniczenia 4 partycje podstawowe albo 3 part... no wiadomo tak?
Jednak odkąd jest GPT ilość partycji gra drugorzędną role jak sądze.

Ciesze się również że zadałem Wam to pytanie bo teraz wiem że można sobie poradzić sobie z tą "niedogodnością" ale jak wspomniałem w komentarzu aż tak mi to nie przeszkadza, zastanawia mnie po prostu że nikt nie pomyślał o takiej organizacji pików GRUBA - wydaje mi się ona "bardziej uporządkowana".
A poza tym myślę że przedstawiony powyżej sposób organizacji plików powinien być domyślnie stosowany na komputerach domowych przez instalator.

@alagner

Wspomniałeś że należałoby samodzielnie szukać informacji - zgadzam się - jeżeli chodzi o przyszłe pytania to nim je zadam będę robił dokładniejsze rozeznanie ;)

Mimo wszystko system operacyjny powinien mieć dokumentację - znalazłem już dawno manuale debiana typu jak instalować, FAQ, podstawowe komendy
lecz na ten moment nie znalazłem jeszcze jakiegoś manuala typu - "Jak wyglada proces uruchamiania w systemach GNU/Linux" w którym było by wyjaśnione że gdy jądro się wczyta i po robi coś tam [ no właśnie co?] , uruchamia program inicjujący obecny w /sbin/init który przygotowuje system do pracy [ robi też nie wiadomo co] - (pewnie pobiera konfiguracje IP, montuje dyski etc) a gdy to uczyni włącza aplikacje obecne w jakimś tam folderze i startuje usługi takie jak.
Szukam manuala który dość szczegółowo opisuje system i jego budowe - spotkał się ktoś z czymś takim kiedyś ?

PS: Myślę że było lepiej tego typu pytania zadac na forum linuksowym.
Postaram się zadawać w przyszłości pytania bardziej programistyczne w tym wątku ;)

#EDIT 1
Szybko wracając do tematu o plikach z tłumaczeniami - też właśnie mnie bardziej interesuje jak te pliki są zbudowane, jakie maja rozszerzenie, jak je otworzyć i jaka aplikacją edytować, jak aplikacja może skorzystać z tłumaczenia w nich zawartego a nie jak je zainstalować komendą.

PS 2
Coś takiego http://cpp0x.pl/kursy/Kurs-GTK+-C++/Tworzenie-aplikacji-obslugujacej-wiele-jezykow/504
choć i to nie odpowiada na wszystkie moje pytania no i dotyczy tylko GTK.

0
kacper546 napisał(a):

Szukam manuala który dość szczegółowo opisuje system i jego budowe - spotkał się ktoś z czymś takim kiedyś ?

Może ta książka:
https://www.nostarch.com/howlinuxworks2

0

@kacper546 nie pisz głupot że nie ma takiego katalogu /root/boot. Jak instalujesz choćby Linux Mint bez osobnej /boot to powstaje w /root/boot. Co mam Ci wkleić zrzut ekranu z Minta abyś uwierzył.

0

Nawet nie pomyslalem zeby ksiazki poszukac.Dzieki wielkie.
Mimo to uwazam ze takie rzeczy powinny byc w internecie, za darmo :)

@kacper546 nie pisz głupot że nie ma takiego katalogu /root/boot. Jak instalujesz choćby Linux Mint bez osobnej /boot to powstaje w /root/boot. Co mam Ci wkleić zrzut ekranu z Minta abyś uwierzył.

Dawaj.
Screenshot at 2016-05-31 0815.png

PS: To jest Linux MInt 17.3 Mate

1
Czarny Szczur napisał(a):

@kacper546 nie pisz głupot że nie ma takiego katalogu /root/boot. Jak instalujesz choćby Linux Mint bez osobnej /boot to powstaje w /root/boot. Co mam Ci wkleić zrzut ekranu z Minta abyś uwierzył.

Pogodzę was:
mkdir /root/boot

0

P.S. jeszcze nie widziałem, żeby katalog boot powstał w katalogu domowym roota. Nawet Mint nie jest tak głupi i na pewno jest/boot. Nawiasem mówiąc, gdy jest na oddzielnej partycji to też jest w /boot

0

Dobra, dzięki za wszelkie odpowiedzi. Mam jeszcze kilka pytań ale najpierw poszukam informacji w sieci a jak coś - założę nowy temat.

0

A czy można już Linux Mint 17.3 zaktualizować do wersji 18 beta? Jak by nie patrzeć to cztery wersje do tyłu względem 16.04. Ten Mint 17 opiera się o wersję 14.04 a były już 14.10, 15.04, 15.10, coś czuję że będą mieli problemy aby to sprawnie zaktualizować. Sami sobie narobili problemów nie dając żadnej wersji co pół roku. Trochę żałuję że wróciłem do Minta, co jakiś czas restartuje mi się środowisko graficzne z dwoma panelami. Miałem Manjaro i było stabilniejsze mimo nowszych pakietów, nie chce mi się instalować, ale jak w 18 będzie taka kaszana to lipa. Dziś wgrywałem kernel 4.6.1 i też nie wstał, musiałem wrócić do starego jądra. Opóźnienie mają straszne względem Ubuntu 16.04.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.