Jak zbudować najmniejszy obraz dockera?

Napiszmy prosty programik w C, który po prostu wyświetli na ekran napis “Hello World!”.

#include<sys/syscall.h>

const char msg[] = "Hello World!\n";

void _start(){
  syscall(SYS_write, 1, msg, sizeof(msg) - 1);
  syscall(SYS_exit, 0);
}

Skompilujmy go używając gcc i optymalizacji rozmiaru.

# gcc -static -Os -nostartfiles -fno-asynchronous-unwind-tables hello-world.c -o hello-world

W następnym kroku zbudujmy obraz na podstawie poniższego pliku Dockerfile.

FROM scratch
ADD hello-world /
CMD ["/hello-world"]

Budujemy!

docker build -t hello-world .

I to wszystko. Mamy gotowy obraz z naszą aplikacją Hello World, który zajmuje tylko 1.84kB!

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
hello-world         latest              770ca6b8f31c        5 minutes ago       1.84kB

Na koniec spróbujmy go uruchomić.

$ docker run --rm hello-world 
Hello World!

Informacje o adapterach VIO bezpośrednio z LPARa

Czasami potrzebujesz znaleźć informacje na temat serwerów VIO i adapterów używanych przez Twojego LPARa, ale nie masz dostępu bezpośrednio do VIO. Na szczeście jest szybki sposób wykorzystujący kdb, który pozwoli Ci szybko zdobyć te informacje. Wystarczy, że skorzystasz z poniższych skrytpów.

1) Dla wirtualnych adapterów FC

#!/usr/bin/ksh 
VFCS_LIST=$(lsdev -Cc adapter | awk '/Available .* Virtual Fibre Channel Client Adapter/ { print $1 }')
for f in ${VFCS_LIST}; do 
		echo vfcs $f | kdb | awk ' 
				/^adapter: / { 
						adapter = $2 
						lpar_id = $4 
						lpar_name = $6 
						next 
				} 
				/^host_name: / { 
						vios_host_name = $2 
						vios_host_device_name = $4 
						next 
				} 
				/^num_cmd_elems: / { 
						location_code = $4 
						next 
				} 
				/^portName: / { 
						wwpn = $2 
						next 
				} 
				END { 
						printf( "%-10s %-20s %-20s %s\n", 
								adapter, 
								vios_host_name, 
								vios_host_device_name, 
								wwpn ) 
				} 
				' 
done

2) Dla wirtualnych adapterów SCSI

#!/bin/ksh 
VSCSI_LIST=$(lsdev -Cc adapter | awk '/Available .* Virtual SCSI Client Adapter/ { print $1 }') 
for s in ${VSCSI_LIST}; do 
		echo cvai $s | kdb | awk -v adapter=$s ' 
				/:blank:+host_name: / { 
						vios_host_device_name = $6 
						next 
				} 
				/host part_number: / { 
						vios_host_id = $3 
						vios_host_name = $8 
						next 
				} 
				END { 
						printf( "%-10s %-20s %-20s\n", 
								adapter, 
								vios_host_name, 
								vios_host_device_name ) 
				} 
				' 
done 

Wczytanie hasła do skryptu bez wyświetlania na ekranie

Czy zastanawialiście się kiedyś jak wczytać hasło do zmiennej w skrypcie bez wyświetlania jej na ekranie?
Jest to dosyć proste zadanie i może być zapisane w zaledwie kilku linijkach:

oldSTTY=$(stty --save)
stty -echo
read -p "Password: " PASSWD; echo
stty $oldSTTY

1: Zapisujesz aktualny opcje terminala w zmiennej oldSTTY
2: Wyłączasz wyświetlanie wprowadzonych znaków na ekran
3: Wczytujesz hasło do zmiennej PASSWD
4: Przywracasz ustawienia terminala zapisane w zmiennej oldSTTY

Bardzo proste, prawda?

Aktualizacja firmware’u na serwerach SUN/Oracle Sparc

Z racji tego, że ostatnio musiałem się z tym zmierzyć postaram się opisać w kilku krokach proces aktualizacji firmware’u na serwerach SUN Sparc na przykładzie T4-1.

Faza 1. Przygotowanie

1. Aby nie spotkały nas później żadne niespodzianki proponuję przed rozpoczęciem pracy wykonać prewencyjny restart systemu i service processora, a także wykonać wszystko potrzebne kopie zapasowe.
Z poziomu systemu wykonujemy:

# shutdown -i6 -g0 -y

Z poziomu ILOM wykonujemy:

-> reset /SP

2. Pobieramy firmware ze strony Oracle’a, wysyłamy na serwer i rozpakowujemy.
3. Za pomocą narzędzia sysfwdownload ładuje nasz firmware do SP:

# ./sysfwdownload -g
# ./sysfwdownload Sun_System_Firmware-8_9_9-SPARC_T4-1.pkg

4. Następnie zamykamy system:

 # /usr/sbin/shutdown -i0 -g0 -y

Faza 2. Aktualizacja

1. Łączymy się z ILOM z poziomu ssh i zapisujemy podstawowe informacje konfiguracyjne:

->show /HOST/bootmode
->show /HOST
->show /SYS

2. Wyłączamy nasz serwer:

->stop /SYS

3. Upewniamy się, że opcja keyswitch_state dla /SYS jest ustawiona na Normal:

-> show /SYS
-> set /SYS keyswitch_state=Normal

4. Sprawdzamy czy nasz firmware został poprawnie załadowany i wykonujemy aktualizację:

-> show /SP/firmware/localimage
-> load -source /SP/firmware/localimage

5. Obserwujemy postęp aktualizacji i czekamy aż zrestartuje się ILOM i będzie można się ponownie zalogować.

Faza 3. Sprawdzenie i start systemu

1. Sprawdzamy czy tryb bootowania dla naszego systemu się nie zmienił. Jeśli ktoś korzysta z wirtualizacji LDOM to może mieć to istotne znaczenie.

-> show /HOST/bootmode

W razie potrzeby możemy zmieniamy na interesujący nas tryb:

-> set /HOST/bootmode="nasza-konfiguracja"

2. Startujemy system:

-> start /SYS

3. Otwieramy konsole i obserwujemy start systemu:

-> start /HOST/console

4. Jeśli wszystko poszło dobrze i Solaris wystartował możemy potwierdzić ostatecznie naszą nową wersję firmware’u:

# prtdiag -v