Ja bym podszedł do tematu jeszcze inaczej. Wykorzystałbym system operacyjny który ma przyjazne kontenery i nie pakowałbym całego systemu operacyjnego w RAMie tylko główny OS zainstalował normalnie na dysku z normalnym botowaniem z dysku (a nie przez sieć) i tylko jeden konkretny kontener wrzucił w całości do RAMu.
Na przykładzie FreeBSD może to wyglądać następująco, zakładam że host-matka jest już zainstalowany normalnie na dysku, skonfigurowany i teraz tworzymy nowy kontener (jail) który będzie w całości w RAMie.
Tworzymy system plików w ramie, powiedzmy 6 gigabajtów, system plików niech dostępny będzie pod katalogiem /prosiak:
# mount -o size 6G -t tmpfs tmpfs /prosiak
Sprawdzamy czy tmpfs się utworzył:
# mount | grep prosiak
tmpfs on /prosiak (tmpfs, local)
Instalujemy tam pliki dla nowego kontenera:
# cd /usr/src
# make installworld DESTDIR=/prosiak
# make distribution DESTDIR=/prosiak
Tutaj po cichutku założyłem że mam wykonany makeworld w katalogu /usr/src, jeśli nie to zamiast make (installworld i distribution) można ściągnąć gotowe skompilowane pliki z http://ftp.freebsd.org/pub/FreeBSD/snapshots/amd64/. Wykonujemy to oczywiście raz na początku tworzenia kontenera, poźniej ten kontener sobie zapisujemy na dysku wykonując pełną kopię tarem (nie cp gdyż bsdowy cp nie skopiuje prawidłowo twardych linków).
Do łączenia z kontenerem będzie nam potrzebny interfejs, dodajemy 192.168.1.44 lub jakikolwiek inny:
# ifconfig em0 alias 192.168.1.44 netmask 255.255.255.255
Aby interfejs był widoczny także po restarcie to dodamy sobie odpowiedni wpis do /etc/rc.conf
# grep 192.168.1.44 /etc/rc.conf
ifconfig_em0_alias14="inet 192.168.1.44 netmask 255.255.255.255"
Aby z kontenera mieć możliwość wyjścia na świat (internet) dodajemy nata i regułki przepuszczające ruch, u mnie wykorzystuje pf (packet filter):
# grep 192.168.1.44 /etc/pf.conf
nat pass on $ext_if from 192.168.1.44 to any -> 192.168.0.12
pass in quick from 192.168.1.44 to any keep state
block in quick from any to 192.168.1.44
Potrzebna jeszcze będzie definicja kontenera w pliku /etc/jail.conf lub powiedzmy w /etc/myjails.conf (aby system matka nie startował takiego kontenera automatycznie po resecie). Niech to będzie taki najprostszy kontener bez dostępu do dźwięku, video i innych podejrzanych urządzeń:
# grep -A13 '^prosiak' /etc/myjails.conf
prosiak {
exec.start = "/bin/sh /etc/rc";
exec.stop = "/bin/sh /etc/rc.shutdown";
exec.clean;
mount.devfs;
mount.fdescfs;
mount.procfs;
#host.hostname = "";
path = "/prosiak";
ip4.addr = "192.168.1.44";
allow.mount = "true";
allow.raw_sockets="true";
allow.sysvipc="true";
}
W samym kontenerze włączymy demona ssh:
# cat /prosiak/etc/rc.conf
sshd_enable="YES"
Pozwolimy chwilowo rootowi logować się do tego kontenera przez ssh:
# grep PermitRootLogin /prosiak/etc/ssh/sshd_config
PermitRootLogin yes
Ustawimy hasło dla roota w kontenerze:
/usr/src# cd /prosiak
/prosiak# chroot .
root@s101:/ # passwd
Changing local password for root
New Password:
Retype New Password:
(ctrl+D) aby wyjść z chroota
Zauważ że wcześniej użyłem chroot a więc hasło nie zmieniłem dla hosta-matki tylko dla kontenera. Teraz uruchamiam kontener:
# jail -f /etc/myjails.conf -c prosiak
Sprawdzam czy się uruchomił prawidłowo:
# jls | grep prosiak
6 192.168.1.44 /prosiak
Loguje się do kontenera i ciesze systemem uruchomionym w RAMie:
$ ssh -p 22 root@192.168.1.44
Teraz w kontenerze ustawiam resolver aby rozwiązywać nazwy domen na adresy IP:
root@:~ # cat /etc/resolv.conf
nameserver 192.168.1.12
Sprawdzam czy sieć działa:
root@:~ # ping dobreprogramy.pl
PING dobreprogramy.pl (194.0.171.163): 56 data bytes
64 bytes from 194.0.171.163: icmp_seq=0 ttl=113 time=80.173 ms
64 bytes from 194.0.171.163: icmp_seq=1 ttl=113 time=37.124 ms
^C
I wykonuje prosty test zapisu na nasz ‘dysk twardy’ który jest ramem:
root@:~ # dd if=/dev/zero of=test bs=4k count=1000000
1000000+0 records in
1000000+0 records out
4096000000 bytes transferred in 4.470327 secs (916264013 bytes/sec)
Czyli otrzymujemy 873MiB na sekundę.
Z ciekawości zrobiłem test zapisu na hoście na dysk SSD:
/root# dd if=/dev/zero of=test bs=4k count=1000000
1000000+0 records in
1000000+0 records out
4096000000 bytes transferred in 15.251581 secs (268562328 bytes/sec)
czyli 256MiB na sekundę
oraz na dysk talerzowy HDD:
/home/tomek$ dd if=/dev/zero of=test bs=4k count=1000000
1000000+0 records in
1000000+0 records out
4096000000 bytes transferred in 54.554454 secs (75080946 bytes/sec)
czyli 71.6MiB na sekundę.
Podsumowując na moim komputerze sam zapis do ramu jest szybszy ponad trzy krotnie
niż zapis na ssd. Ale komputer który mam w tej chwili pod ręką to Dual-Core E5700
z jakimś starszym dyskiem GOODRAM SSD i ramem DDR3. Ciekawe jakie wyniki byłyby
na jakimś potworze z nowym Ryzenem.
Po zakończeniu pracy z kontenerem będziesz chciał aby jego zawartość nie zniknęła czyli najpierw wyłączysz kontener:
/# jail -f /etc/myjails.conf -r prosiak
Stopping cron.
Waiting for PIDS: 42123.
Stopping sshd.
Waiting for PIDS: 42113.
.
Terminated
prosiak: removed
i zapiszesz jego stan powiedzmy do /swinka.tar.gz
# tar -czf /prosiak.tar.gz /prosiak
Jeśli będziesz chciał ponownie uruchomić kontener to montujesz tmpfs, zamiast make (installworld i distribution) które pokazałem na początku rozpakowujesz zawartość /prosiak.tar.gz, startujesz kontener przy pomocy ‘jail -c’ i logujesz sie ssh.