# SWAP dla Linuxa i w95 mini-HOWTO

## Seweryn Sobieszek sniff@alpha.net.pl
v1.2, 20 sierpnia 1999

Jak zrobić swap dla windowsa i Linuxa na jednej partycji? Opis znajdziesz tutaj. Opisywany dalej sposób jest mojego autorstwa. Możliwe, że ktoś już wcześniej wpadł na ten pomysł, ale ja wymyśliłem go sam. Zaznaczam, że nie przeczytałem tego w żadnym FAQ. Brak takowego dokumentu jest główną przyczyną powstania tego pliku. Chcę pomóc wszystkim, który mają podobny problem do mojego tzn. zbyt mały twardy dysk, by sobie pozwolić na luksus dwóch oddzielnych swapów. Dokument ten został napisany w standardzie ISO-8859-2. Wersja oryginalna znajduje się na serwerze JTZ: http://www.jtz.org.pl.

## 1. Wstęp

## 1.1 Krótki opis metody

Mój sposób na wspólnego swapa Linuxa i w95 jest dość prosty. Zmuszamy wina do korzystania ze stałego swapa na naszej partycji wymiany, a potem w Linuksie korzystamy z tej samej partycji co windows. Tylko, że potem ta partycja już nie może być odczytana przez windowsa - ma inny filesystem i nie ma windowsowego swapa (plik `win386.swp`). Musimy więc przywrócić na niej flesystem dosowy i odtworzyć brakujący plik. Potem znów pracujemy w Linuksie, on sobie swapuje na nasza partycję, przy kończeniu pracy znów zamienia partycję na format dosowy. Proste prawda? Ale jakie skuteczne. Jest to najszybsza metoda, ze wszystkich jakie do tej pory testowałem. Zresztą co będę gadał - sami przeczytajcie i sprawdźcie.

## 1.2 Historia dokumentu

Dotychczas zostały upublicznione następujące wersje tego dokumentu:

- v1.01, 22 listopada 1998
- v1.1, 28 marca 1999 (patrz rozdział Zmiany w wersji 1.1)
- v1.2, 20 sierpnia 1999 (patrz rozdział Zmiany w wersji 1.2)

### Zmiany w wersji 1.1

Dokument został ogólnie przebudowany, oprócz opisu dla dystrybucji Redhat został dodany opis postępowania z dystrybucją Slackware.

Poprawiłem literówki (mam nadzieję) oraz uprościłem trochę zagmatwany opis.

### Zmiany w wersji 1.2

Dodany opis postępowania z dystrybucją Debian (teraz są aż trzy! :) (Debian, RedHat, Slackware)).

Wreszcie powstała wersja SGML tego dokumentu, bo dotychczas (aż wstyd się przyznać :( ) pisałem to w HTML-u, ale tak, żeby wyglądało, że było konwertowane z SGML...

## 2. Przygotowanie dysku i softu

## 2.1 Podział dysku na partycje

Musisz mieć co najmniej trzy partycje. Jedną z Linuxem, drugą z w95 i jeszcze trzecia na plik wymiany. Istnieje niepisana zasada, że swap powinien być dwa razy większy od ilości RAM-u w Twoim komputerze. U mnie, przy 540 MB (proszę bez śmiechów ;) ) dysku wygląda to tak:

> `

>     /dev/hda1 #partycja z w95 (256 MB)
>     /dev/hda2 #partycja z Linuxem (227 MB)
>     /dev/hda3 #partycja wymiany (32 MB)

> `

Do podziału na partycje użyj najlepiej linuxowego programu `fdisk`, nie jest może najwygodniejszy w użyciu, ale za to najlepszy. Partycji do swapu nadaj identyfikator odpowidający typowi FAT16 (id 4 lub 6 w zależności od wielkości), a nie Linux Swap (id 82). Identyfikator partycji ustawia opcja `t` menu `fdisk-a`.

## 2.2 Przygotowanie Windows95

Tu nie będziesz się musiał dużo natrudzić, zresztą pod Linuxem też nie. W Panelu Sterowania ustaw jako plik wymiany plik o wielkości minimalnej 0 i maksymalnej równej wielkości partycji przeznaczonej na swapa. Zamknij windowsy i odpal Linuxa.

## 2.3 Przygotowanie Linuxa

Tak, to nie żart. Linuxa też musisz przygotować. Jak bym tego nie opisał to Microsoft wytoczyłby mi sprawę w sądzie. ;) No to zaczynajmy.
Oczywiście musisz mieć zainstalowanego Linuxa. Zbytnich wymagań co do jądra i wersji chyba nie ma, bo wydaje mi się, że ten sposób będzie działał na każdym Linuksie. Osobiście testowałem to na Debianie, Redhacie, Slacku i jądrach od 2.0.35 do 2.2.9 (różne kombinacje, ale jądra 2.2.x już tylko na Debianie).

Z narzędzi potrzebne będą nam:

- `/bin/dd`
- `/sbin/mkdosfs` (aka. `/sbin/mkfs.msdos`)
- `/sbin/mkswap`
- `/bin/mount`
- `/sbin/swapon`
- `/sbin/swapoff` (który jest linkiem do `/sbin/swapon`)
- `/bin/umount`
- oraz twój ulubiony edytor i packet manager (chybaże chcesz wszystko kompilować)

Wszystkie te programy (oprócz `mkdosfs`) to standard i powinny znajdować się w każdej, nawet najbardziej okrojonej, instalacji. `mkdosfs` można skompilować mając źródła, lub (co jest znacznie wygodniejsze) zainstalować z pakietu, zwłaszcza, że chyba każda dystrybucja posiada pakiet zawierający `mkdosfs`.

### Debian

W Debianie `mkdosfs` znajduje się w pakiecie: `dosfstools`. Oprócz `mkdosfs` w pakiecie tym znajduje się jeszcze narzędzie do sprawdzania i naprawiania dosowego filesystemu - `dosfsck`. Pakiet możesz zainstalować np. tak:

> `

>     dpkg -i dosfstools_wersja.deb

> `

Jeśli nie masz instalki Debiana to pakiet możesz ściągnąć z tego adresu.
No i voila!

### RedHat

Dokładna nazwa pakietu zawierającego `mkdosfs` brzmi np: `mkdosfs-ygg-0.3b-5.i386.rpm`. Znajdź go na na płytce instalacyjnej RedHata, katalogu z instalką lub na jakimś serwerze FTP, np. tutaj. Zainstaluj ten pakiet, np. w ten sposób:

> `

>     rpm --install mkdosfs-ygg-0.3b-8.i386.rpm

> `

Po tej operacji możesz już przystąpić do sedna sprawy. :)

### Slackware

W Slackware standardowo jest zainstalowany `mkdosfs`. A gdyby nie było `/sbin/mkdosfs`, to znajduje się on w pakiecie `bin.tgz` w podkatalogu `a3` dystrybucji. Zainstaluj ten pakiet, wraz z nim otrzymasz jeszcze masę pożytecznych narzędzi. Możesz użyć `pkgtool` lub `installpkg`. Pierwszy poprowadzi Cię za rękę, a drugi wystarczy wywołać w ten sposób:

> `

>     installpkg bin.tgz

> `

i pakiet jest już zainstalowany. Teraz możesz przejść do następnej części.

## 3. Sedno sprawy

Wszystkie opisane poniżej zmiany w plikach konfiguracyjnych dotyczą dystrybucji, które są tu wymienione: Debian, RedHat, Slackware. Jeśli posiadasz inną dystrybucję, poszukaj w plikach startowych podobnych komend i popróbuj. Pamiętaj jednak, że możesz zrobić sobie, a właściwie partycjom krzywdę, więc jeśli nie do końca wiesz co robisz nie rób tego. Skorzystaj z pomocy bardziej doświadczonego kolegi, lub napisz do mnie - wspólnie na pewno coś poradzimy.

Acha, jeszcze jedna sprawa. Opisy zamieszczone tutaj dotyczą:

- Debian GNU Linux 2.1 (slink)
- RedHat Linux 5.1 Manhattan
- Slackware 3.6

Prawdopodobnie w innych wersjach tych dystrybucji pliki konfiguracyjne wyglądają tak samo, a co najmniej podobnie, więc nie powinno być problemów.

> Notka: Czytając dalej zapewne zauważysz, że przy wywołaniach `swapon` i `swapoff` polecam zamienić parametr `-a` na nazwę konkretnej partycji. Jest to właściwie niepotrzebne, ale piszę tak by było dokładnie wiadomo, o którą partycję chodzi (u mnie `/dev/hda3`). Czytając `man swapon` zobaczysz, że opcja `-a` pozwala na małą automatyzację w zarządzaniu partycjami wymiany. Jeśli chcesz z niej korzystać nic nie stoi temu na przeszkodzie. Po prostu nie zmieniaj tego parametru. Weź tylko pod uwagę, że komenda `mkswap` nie posiada takiej opcji i tu będziesz musiał wpisać dokładne nazwy partycji, bo `mkswap` nie przeczyta sobie ich z `/etc/fstab`. Zamiast "brakującej" opcji możesz uzyć petli shell'a, ale to już temat na inną bajkę. Jeśli Cię to interesuje - mail me.

Powodzenia...

## 3.1 Debian

Zajmiemy się tylko dwoma skryptami startowymi: `checkroot.sh` i `umountfs`. W pierwszym z tych plików SWAP jest włączany podczas startu Linuxa, a w drugim wyłączany przed zamknięciem systemu.

### Plik `/etc/init.d/checkroot.sh`

Na samym początku tego pliku znajdziesz coś takiego:

> `

>     if [ -x /sbin/swapon ]
>     then
>       [ "$VERBOSE" != no ] && echo "Activating swap..."
>       swapon -a
>     fi

> `

Jak się pewnie domyślasz sekwencja ta powoduje włączenie wszystkich swapów zdefiniowanych w `/etc/fstab`. No i dobrze, bo my chcemy włączyć te swapy. Tylko, że jak na razie nasza partycja wcale nie ma formatu Linux Swap (id 82) tylko DOS16. I co z tym fantem zrobić? Potraktować `mkswapem`. Zobacz efekt moich zmian:

> `

>     if [ -x /sbin/swapon ]
>     then
>       [ "$VERBOSE" != no ] && echo "Activating swap..."
>       mkswap /dev/hda3
>       swapon /dev/hda3
>     fi

> `

### Plik `/etc/init.d/umountfs`

Plik ten jest wykonywany podczas zamykania systemu, wyłącza partycje wymiany, odmontowuje partycje inne niż root i przemontowuje partycję root jako read-only. W pliku tym jest coś takiego:

> `

>     echo -n "Deactivating swap... "
>     swapoff -a
>     echo "done."

> `

Ciąg tych poleceń wyłącza pliki wymiany i wyświetla na konsoli info. Zmienimy tylko parametr `-a` polecenia `swapoff` na `/dev/hda3` lub jaki tam macie, przeformatowujemy partycję na DOS16 i koniec.

A jednak nie.

Dlaczego to jeszcze nie koniec?

Nie koniec, bo nie ma pliku `win386.swp` na naszej świeżo sformatowanej partycji. Windows (ale chyba tylko 95) sam powinien sobie utworzyć brakujący plik, ale nie zawsze się tak dzieje. Więc może mu pomożemy. Sami utworzymy brakujący plik. Potrzebny do tego będzie katalog do podmontowania świeżo uwtorzonej partycji dosowej (najlpepiej pusty, ale niekoniecznie, bo z moich doświadczeń wynika, że można podmontować filesystem także w niepustym katalogu). Fragment tego pliku po wszelkich przeróbkach powinien wyglądać mniej więcej tak:

> `

>     echo -n "Deactivating swap... "
>     swapoff /dev/hda3
>     mkdosfs -n SWAP_SPACE /dev/hda3
>     mount -t msdos -o rw /dev/hda3 /katalog/w/ktorym/montujemy
>     dd if=/dev/zero of=/katalog/w/ktorym/montujemy/win386.swp bs=1k count=0
>     umount /dev/hda3
>     echo "done."

> `

Przetestuj to jeszcze i ciesz się! :)))

## 3.2 RedHat

### Zmiany w pliku `/etc/rc.d/rc.sysinit`

Poszukaj w pliku `/etc/rc.d/rc.sysinit` (gdzieś na początku) linii wygladającej mniej więcej tak:

> `

>     # Start up swapping.
>     echo "Activating swap partitions"
>     swapon -a

> `

Aktywuje ona partycje wymiany na wszystkich partycjach oznaczonych w pliku `/etc/fstab` jako swap. My potrzebujemy uaktywnić tylko jedną partycję, możemy zmienić parametr `-a` na konkretną wartość u mnie to `/dev/hda3`). Ponadto musimy jeszcze wczesniej z naszej partycji wymiany windowsa zrobic swapa linuxowego. Służy do tego polecenie `mkswap`. Po modyfikacji ta część pliku powinna wyglądać mniej więcej tak:

> `

>     # Start up swapping.
>     echo "Activating swap partitions"
>     mkswap /dev/hda3
>     swapon /dev/hda3

> `

W tej części pliku już koniec ze zmianami, teraz przenosimy się bliżej końca `/etc/rc.d/rc.sysinit`. Tam szukamy czegoś podobnego do:

> `

>     # Right, now turn on swap in case we swap to files.
>     echo "Enabling swap space."
>     swapon -a 2>&1 | grep -v "busy"

> `

Tutaj też parametr `-a` zmień na oznaczenie swojej partycji wymiany (np. `/dev/hda3`).
I to już wszystkie zmiany w tym pliku, przejdźmy do następnego.

### Zmiany w pliku `/etc/rc.d/init.d/halt`

Ten plik jest wykonywany w czasie zatrzymania lub restartu systemu, czyli po wydaniu polecenia `shutdown` z odpowiednimi parametrami lub po naciśnięciu trzech 'magicznych' klawiszy (tzn. `Ctrl+Alt+Del`). Zanim zaczniesz cokolwiek zmieniać, chcąc uniknąć błędów musisz najpierw mieć zainstalowany pakiet `mkdosfs`. Pisałem wcześniej jak to zrobić.

No to zaczynamy. W tym pliku (tzn. `/etc/rc.d/init.d/halt`) nie będziesz musiał dużo zmieniać. Znajdź coś podobnego do tego:

> `

>     # Turn off swap, then unmount file systems.
>     echo "Turning off swap"
>     swapoff -a

> `

Tutaj jak wszędzie zmieniamy parametr `-a` na konkretne oznaczenie partycji wymiany i wywołanie polecenia ma postać, np. `swapoff /dev/hda3`.
Teraz musimy jeszcze nadać partycji wymiany format dosowy, po to, aby windows mógł z niej skorzystać. Robimy to poleceniem `mkdosfs`. Ta część pliku już po wszelkich zmianach wygląda u mnie następująco:

> `

>     # Turn off swap, then unmount file systems.
>     echo "Turning off swap"
>     swapoff /dev/hda3
>     mkdosfs -n SWAP_SPACE /dev/hda3

> `

Parametr `-n` z wartością `SWAP_SPACE` nadaje tworzonej partycji dosowej etykietę SWAP_SPACE. I to byłoby już prawie wszystko, pozostało tylko odtworzyć brakujący plik wymiany windowsa `win386.swp` (tu możesz zobaczyć dlaczego).

A teraz pokażę jak. Po komendzie `mkdosfs` dopisz jeszcze to:

> `

>     mount -t msdos -o rw /dev/hda3 /katalog/w/ktorym/montujemy
>     dd if=/dev/zero of=/katalog/w/ktorym/montujemy/win386.swp bs=1k count=0
>     umount /dev/hda3

> `

Już możesz rozkoszować się swoim dziełem... :)))

## 3.3 Slackware

W Slacku też musisz poprawić tylko dwa pliki, w zasadzie zrobić to samo co z RedHatem i Debianem, tylko że w innych plikach... Opisywany tu przykład pochodzi ze Slackware 3.6, ale z pewnością w innych wersjach jest tak samo.

### Zmiany w pliku `/etc/rc.d/rc.S`

Plik `/etc/rc.d/rc.S` jest wykonywany podczas inicjalizacji systemu. Za każdym razem, gdy system wstaje, plik ten jest analizowany i wykonywane są zawarte w nim polecenia. Nam chodzi o to, żeby nasza partycja (`/dev/hda3`) została "przerobiona" na swapa dla Linuxa. Na samym początku pliku znajdziecie coś takiego:

> `

>     # enable swapping
>     /sbin/mkswap -a
>     /sbin/swapon -a

> `

Polecenia te uruchamiają jako swap wszystkie partycje, które są oznaczone w pliku `/etc/fstab` jako przeznaczone do swapowania. Zamień parametr `-a` na konkretną partycję (żeby używać tej jednej), albo we wspomnianym pliku opisz ją jako miejsce na swap. Po operacji plik `/etc/rc.d/rc.6` powinien wyglądać np. tak:

> `

>     # enable swapping
>     /sbin/mkswap /dev/hda3
>     /sbin/swapon /dev/hda3

> `

albo niech pozostanie w oryginalnej postaci, a w `/etc/fstab` powinno pojawić się coś takiego:

> `

>     /dev/hda3 swap swap defaults 0 0

> `

### Zmiany w pliku `/etc/rc.d/rc.6`

Ten pliczek jest z kolei wykonywany przy zamykaniu systemu. To tutaj musimy zawrzeć linijki odpowiadające za przywrócenie windzie straconego swapa. Poszukaj czegoś takiego:

> `

>     # Turn off swap, then unmount local file systems.
>     echo "Turning off swap."
>     swapoff -a

> `

Tutaj zmiany nie będą polegały już tylko na prostej kosmetyce. Opcję `-a` tradycyjnie przemianowujemy na oznaczenie partycji wymiany oraz musimy zrobić coś jeszcze. Mianowicie utowrzyć na tejże partycji filesystem dosowy i odtworzyć swapa pani windzie. Pierwsze załatwiamy używając narzędzia `mkdosfs`, a konkretniej:

> `

>     mkdosfs -n SWAP_SPACE /dev/hda3

> `

Teraz wystarczy już tylko odtworzyć plik `win386.swp` na nowiutkim filesystemie. (Chcesz wiedzieć po co? - kliknij tutaj!) Aby tego dokonać musisz dysponować katalogiem do podmontowania filesystemu przed chwilą utworzonego (no, oczywiście możesz zapisywać bezpośrednio na partycję, ale nie polecam :))). Najprościej chyba tak:

> `

>     mount -t msdos -o rw /dev/hda3 /katalog/w/ktorym/montujemy
>     dd if=/dev/zero of=/katalog/w/ktorym/montujemy/win386.swp bs=1k count=0
>     umount /dev/hda3

> `

To utworzy brakujący plik i już po kłopocie. Będzie to plik pusty o rozmiarze 0, ale taki właśnie powinien być.

Sprawdź co zdziałałeś/aś i odpocznij trochę :)))

## 4. Od autora

Mam nadzieję, że choć trochę pomogłem paru osobom. Wszelkie pytania dotyczące tego dokumentu proszę kierować na adres: sniff@alpha.net.pl. Krytyka wszelkiego rodzaju mile widziana. Prosiłbym o kontakt użytkowników dystrybucji innych niż trzy opisane, aby w przyszłości rozbudować ten dokument.

Może znajdzie się osoba, która próbowała przenieść to mini-JTZ w realia win98. Proszę niech opisze wrażenia i prześle mi, bo moja edukacje w świecie windowsów skończyła sie na 95 i to nie OSR2.

Dziękuję za uwagę.