Jak zapewne większość z Was wie, Raspberry Pi jako głównego nośnika pamięci używa karty SD (lub miniSD/microSD), co ma swoje zalety, ale i wady – limitowana ilość zapisu (teoretycznie i odczytu) komórek pamięci.
Wprawdzie są to zazwyczaj na tyle duże wartości, że nie ma co się nimi przejmować podczas „normalnego użytkowania”, ale tam gdzie dane są często modyfikowane (np. odczyty z różnych czujników – ale o tym będzie zapewne później) można pomyśleć o jakiś alternatywnych rozwiązaniach…
Spis treści w artykule
Alternatywna/dodatkowa pamięć w Raspberry Pi
Zasadniczo można zastosować któreś z 3 rozwiązań:
- Nośniki USB (PenDrive, dysk HDD USB)
- Zasoby sieciowe
- Dysk RAM (RAMdysk / RAMdisk)
Pierwsze 2 sposoby już były omówione, a dodatkowo nie są bez wad, choć to zależy od infrastruktury którą dysponujemy:
- Jeśli to będzie PanDrive – to też jest pamięć flash
- Jeśli to będzie dysk twardy (HDD) na USB – zależnie od intensywności zapisu – albo musi ciągle pracować, albo będzie „co chwilę” wybudzany
- W przypadku zasobów sieciowych – potrzebujemy dodatkowego urządzenia (komputer, router, NAS) które będzie te zasoby udostępniało. Do tego zależnie od użytego typu pamięci mogą tego rozwiązania dotyczyć również wady wymienione powyżej
RAMdysk (RAMdisk) w Raspberry Pi
Dlatego dziś chciałbym omówić rozwiązanie numer 3, które z racji tego, że korzysta z pamięci RAM Raspbbery Pi wydaje się idealne do przechowywania niewielkich ilości często zmienianych danych. Niewielkich – bo Pi pamięci RAM posiada stosunkowo niewiele, zależnie od wersji będzie to 256 lub 512 MB.
Oczywiście opisane to rozwiązania zadziałają prawie z każdym komputerem z systemem Linux, a tam (np. komputer stacjonarny) takiej pamięci może być znacznie więcej do naszej dyspozycji, a więc i dysk RAM może być większy.
Systemowe wsparcie dla dysków RAM
Wykorzystamy fakt, że w systemie mamy domyślnie dodaną obsługę dysków RAM, co możemy sprawdzić korzystając z polecenia:
ls /dev/ -l | grep ram
Jak widać wyżej gotowych do pracy jest łącznie 16 „urządzeń” – zaczynając od ram0, a kończąc na ram15.
Wprawdzie wpis będzie poświęcony dyskom RAM w Raspberry Pi i systemie Raspbian (przystosowana specjalnie dla tego mikrokomputera dystrybucja Debiana) jest spora szansa, że również w przypadku innych wersji Linuxa będziecie mogli skorzystać z podobnego rozwiązania, wykorzystując natywne wsparcie dla dysków działających w pamięci RAM (jądro Linuxa 2.6 lub nowsze jest wymagane), choć będzie to wyglądało trochę inaczej. Dysk taki znajduje się pod adresem:
/dev/shm
Zazwyczaj jego rozmiar to połowa pamięci RAM zainstalowanej w komputerze, lub dostępnej dla serwera VPS:
patryk:~$ df /dev/shm -h
Filesystem Size Used Avail Use% Mounted on
tmpfs 1002M 0 1002M 0% /dev/shm
Powyżej wynik dla jednego z moich serwerów VPS, który korzysta z 2 GB pamięci RAM, i tym samym dysk RAM (Shared Memory/SHM) to 1 GB (połowa dostępnej pamięci RAM).
Jeśli zajdzie potrzeba, możecie dokonać modyfikacji standardowych ustawień/parametrów edytując plik:
sudo nano /etc/default/tmpfs
I choć ścieżka/konstrukcja tego dysku jest trochę inna, to w większości przypadków będzie działał on tak samo jak opisywany tu szczegółowo dysk RAM w Raspberry Pi. Zresztą w przypadku Raspberry Pi i Raspbiana (obecnie) również możemy korzystać z pamięci SHM.
RAMdysk (RAMdisk) tymczasowy
Tymczasowy dlatego, że po każdym uruchomieniu czy to komputera, czy Raspberry Pi będzie tworzony od nowa, a więc nadaje się głównie do przechowywania danych tymczasowych, do których chcemy mieć szybki dostęp, ale nie zależy nam na tym, by były „archiwizowane”. Np. bieżące odczyty z czujnika temperatury, bieżący podgląd z kamery internetowej, itp.
Konfiguracja
Zaczynamy od stworzenia katalogu do którego będziemy montować nasz dysk (RAM):
sudo mkdir /mnt/ramdisk
Następnie musimy sformatować dysk RAM przed zamontowaniem go:
sudo mkfs -q /dev/ram1 2048
- /dev/ram1 – „urządzenie” z którego korzystamy jako dysku RAM, czytaj wyżej
- 2048 – Rozmiar dysku w kilobajtach (KB), 2048 to 2 megabajty (MB)
Zarówno wielkość jaki „urządzenie” możecie dobrać indywidualnie, wedle potrzeb.
Montujemy dysk, tak jak to się robi przy montowaniu innych zasobów/urządzeń:
sudo mount /dev/ram1 /mnt/ramdisk
Możemy teraz sprawdzić czy nasz dysk jest widoczny w systemie za pomocą polecenia:
df -h
Jak widać, wszystko działa prawidłowo, więc pora (oczywiście jeśli chcecie) skonfigurować system tak, by RAMdysk (RAMdisk) był tworzony automatycznie podczas startu systemu…
Automatyczne tworzenie i montowanie dysku RAM
W tym celu musimy dodać komendy które wpisywaliśmy powyżej do pliku „rc.local”:
sudo nano /etc/rc.local
I przed „exit 0” dodajemy:
sudo mkfs -q /dev/ram1 2048
sudo mount /dev/ram1 /mnt/ramdisk
Obowiązuje tu taka sama zasada jak wyżej dotycząca wyboru urządzenia i rozmiaru dysku.
Wychodzimy zapisując zmiany: CTRL+Q i Y
Po ponownym uruchomieniu komputera/Pi możecie sprawdzić, że dysk RAM został poprawnie skonfigurowany i podłączony, ponownie korzystając z polecenia:
df -h
Jak już wspominałem, wadą dysku RAM jest jego nietrwałość, czyli ulotność wszystkich danych po ponownym uruchomieniu Raspberry Pi (albo innego komputera). Ale można temu zaradzić korzystając z pewnej sztuczki…
RAMdysk (RAMdisk) z zachowywaniem danych
Osiągniemy to korzystając ze skryptu który oprócz tego, że automatycznie utworzy dysk RAM podczas uruchamiania systemu, to dodatkowo podczas zamykania systemu skopiuje zawartość dysku RAM do tymczasowego katalogu, po czym podczas ponownego startu systemy wykona operację odwrotną – przywróci dane na dysk RAM.
Tym sposobem mamy wszystkie zalety dysku RAM, ale pozbyliśmy się jego największej wady.
Gotowy skrypt
Byście nie musieli sami się z tym „bawić” przygotowałem skrypt z którego możecie skorzystać.
Skrypt zawsze w najnowszej (aktualnej) wersji znajdziecie pod adresem:
https://webinsider.pl/add/download/?link=raspberrypi_ramdisk
#!/bin/sh
### BEGIN INIT INFO
# Provides: ramdisk
# Required-Start: $local_fs $remote_fs $syslog
# Required-Stop: $local_fs $remote_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: RAMdisk RPL script with restore after reboot/halt
# Description: Use './ramdisk help' or after install '/etc/init.d/ramdisk help' or 'ramdisk help' for help. This revision use rsync to backup/restore RAMdisk
### END INIT INFO
# Author: Webinsider.pl.pl
# RAMdisk info URL: https://webinsider.pl/raspberry-pi-ramdisk
# Revision: 201710181644
### START config here:
# Size in KB
RAMDISK_SIZE="2048"
RAMDISK_MNT_DIR=/mnt
RAMDISK_TEMP_DIR=/mnt
RAMDISK_NAME=ramdisk
RAMDISK_TEMP_NAME=ramdisk_temp
RAMDISK_TEMP_FULL=$RAMDISK_TEMP_DIR/$RAMDISK_TEMP_NAME/
RAMDISK_MNT_FULL=$RAMDISK_MNT_DIR/$RAMDISK_NAME/
RAMDISK_DEV=/dev/ram1
# Auto BackUp RAMdisk (RAMDISK_MNT_FULL > RAMDISK_TEMP_FULL), every RAMDISK_AUTO_BACKUP_TIME minute(s) if RAMDISK_AUTO_BACKUP=1
RAMDISK_AUTO_BACKUP=1
#RAMDISK_AUTO_BACKUP_SET 1=minute(s) 0-59, 2=hour(s) 0-23
RAMDISK_AUTO_BACKUP_SET=2
RAMDISK_AUTO_BACKUP_TIME=1
RAMDISK_AUTO_BACKUP_USER=root
# Use "cp" or "rsync", 1 - use rsync
RAMDISK_BACKUP_RSYNC=1
### END config here.
DOWNLOAD_URL=https://webinsider.pl/add/download/?link=raspberrypi_ramdisk
COMMANDS="{start|stop|restart|status|backup|restore|config|install|uninstall|clear|update|help}"
NAME=ramdisk
SCRIPTNAME=/etc/init.d/$NAME
f_start()
{
sudo mkfs -q $RAMDISK_DEV $RAMDISK_SIZE
sudo mount $RAMDISK_DEV $RAMDISK_MNT_FULL
if [ "$RAMDISK_BACKUP_RSYNC" = "1" ]
then
sudo rsync -avzil --delete --progress $RAMDISK_TEMP_FULL $RAMDISK_MNT_FULL > /dev/null
else
sleep 2
sudo rm -rf $RAMDISK_MNT_FULL*
sleep 1
sudo cp -rf $RAMDISK_TEMP_FULL* $RAMDISK_MNT_FULL
fi
echo "RAMdisk START OK"
}
f_stop()
{
if [ "$RAMDISK_BACKUP_RSYNC" = "1" ]
then
sudo rsync -avzil --delete --progress $RAMDISK_MNT_FULL $RAMDISK_TEMP_FULL
else
sudo rm -rf $RAMDISK_TEMP_FULL*
sleep 2
sudo cp -rf $RAMDISK_MNT_FULL* $RAMDISK_TEMP_FULL
fi
sudo umount $RAMDISK_MNT_FULL
echo "RAMdisk STOP OK"
}
# f_restart() only restart) ...
f_backup()
{
if [ "$RAMDISK_BACKUP_RSYNC" = "1" ]
then
sudo rsync -avzil --delete --progress $RAMDISK_MNT_FULL $RAMDISK_TEMP_FULL
else
sudo rm -rf $RAMDISK_TEMP_FULL*
sudo cp -rf $RAMDISK_MNT_FULL* $RAMDISK_TEMP_FULL
fi
echo "RAMdisk BackUp OK"
}
f_restore()
{
if [ "$RAMDISK_BACKUP_RSYNC" = "1" ]
then
sudo rsync -avzil --delete --progress $RAMDISK_TEMP_FULL $RAMDISK_MNT_FULL
else
sudo rm -rf $RAMDISK_MNT_FULL*
sudo cp -rf $RAMDISK_TEMP_FULL* $RAMDISK_MNT_FULL
fi
echo "RAMdisk restore OK"
}
f_install()
{
sudo mkdir $RAMDISK_MNT_FULL
sudo mkdir $RAMDISK_TEMP_FULL
sudo cp -r $NAME /etc/init.d
sudo update-rc.d $NAME defaults
sudo /etc/init.d/$NAME start
if [ "$RAMDISK_AUTO_BACKUP" = "1" ]
then
if [ "$RAMDISK_AUTO_BACKUP_SET" = "1" ]
then
echo "# RAMdisk AutoBackup START" | sudo tee -a /etc/crontab > /dev/null
echo "*/"$RAMDISK_AUTO_BACKUP_TIME" * * * * "$RAMDISK_AUTO_BACKUP_USER" /etc/init.d/"$NAME" backup" | sudo tee -a /etc/crontab > /dev/null
echo "# RAMdisk AutoBackup END" | sudo tee -a /etc/crontab > /dev/null
echo "Auto BackUp set, run every "$RAMDISK_AUTO_BACKUP_TIME" minute(s)"
fi
if [ "$RAMDISK_AUTO_BACKUP_SET" = "2" ]
then
echo "# RAMdisk AutoBackup START" | sudo tee -a /etc/crontab > /dev/null
echo "0 */"$RAMDISK_AUTO_BACKUP_TIME" * * * "$RAMDISK_AUTO_BACKUP_USER" /etc/init.d/"$NAME" backup" | sudo tee -a /etc/crontab > /dev/null
echo "# RAMdisk AutoBackup END" | sudo tee -a /etc/crontab > /dev/null
echo "Auto BackUp set, run every "$RAMDISK_AUTO_BACKUP_TIME" hour(s)"
fi
fi
sudo ln -s /etc/init.d/$NAME /bin/$NAME
rm ramdisk
echo ""
echo "Script installed OK, see 'df -h'"
}
f_uninstall()
{
echo "Script deletes the following directories with the entire contents:"
echo ""
echo $RAMDISK_MNT_FULL" & "$RAMDISK_TEMP_FULL
echo ""
echo "If you do not want to delete them break (CTRL+C) and run:"
echo "/etc/init.d/"$NAME" help"
echo "for more information"
echo ""
read -p 'Press [Y] to continue: ' uninstall_yes
if [ "$uninstall_yes" = "Y" ] || [ "$uninstall_yes" = "y" ]
then
echo ""
sudo /etc/init.d/$NAME stop
sudo update-rc.d $NAME remove
sudo rm -rf $RAMDISK_MNT_FULL/*
sudo rmdir $RAMDISK_MNT_FULL
sudo rm -rf $RAMDISK_TEMP_FULL/*
sudo rmdir $RAMDISK_TEMP_FULL
sudo rm /etc/init.d/$NAME
sudo rm /bin/$NAME
echo ""
echo "You must manually remove CRON Auto BackUp"
echo "Run: 'sudo nano /etc/crontab'"
echo ""
echo "Please restart to finish"
else
echo "Exit without uninstall"
echo "Command '/etc/init.d/"$NAME" help' show help"
exit
fi
}
f_update()
{
sudo update-rc.d ramdisk remove
sudo wget $DOWNLOAD_URL -O /etc/init.d/$NAME
sudo chmod +x /etc/init.d/$NAME
sudo update-rc.d $NAME defaults
echo ""
echo "Check RAMdisk size, now is: "$RAMDISK_SIZE"KB"
echo "If want change type: 'sudo nano /etc/init.d/"$NAME"'"
echo "Change value 'RAMDISK_SIZE'"
echo "Next restart RAMdisk: '/etc/init.d/"$NAME" restart'"
echo ""
echo "Script update. If see error update again: '/etc/init.d/"$NAME" update'"
}
f_clear()
{
sudo umount $RAMDISK_MNT_FULL
sudo mkfs -q $RAMDISK_DEV $RAMDISK_SIZE
sudo mount $RAMDISK_DEV $RAMDISK_MNT_FULL
echo "RAMdisk clear OK"
}
f_status()
{
echo "RAMdisk @ Crontab:"
cat /etc/crontab | grep $NAME
echo ""
echo "RAMdisk:"
df -h | grep $NAME
echo ""
echo "RAMdisk patch: "$RAMDISK_MNT_FULL
echo "RAMdisk dev: "$RAMDISK_DEV
echo "RAMdisk BackUp patch: "$RAMDISK_TEMP_FULL
}
f_config()
{
sudo nano /etc/init.d/$NAME
echo "Changes will take effect after reboot. You can also restart only ramdisk:"
echo $NAME" restart"
}
f_help()
{
echo "RAMdisk script with restore after reboot/halt"
echo ""
echo "Script make RAMdisk, use "$RAMDISK_DEV
echo "Also use "$RAMDISK_TEMP_FULL" for backup file when Pi halt/reboot."
echo "Default RAMdisk size is "$RAMDISK_SIZE", and patch is "$RAMDISK_MNT_FULL
if [ "$RAMDISK_AUTO_BACKUP" = "1" ]
then
if [ "$RAMDISK_AUTO_BACKUP_SET" = "1" ]
then
echo "Auto BackUp set, run every "$RAMDISK_AUTO_BACKUP_TIME" minute(s)"
fi
if [ "$RAMDISK_AUTO_BACKUP_SET" = "2" ]
then
echo "Auto BackUp set, run every "$RAMDISK_AUTO_BACKUP_TIME" hour(s)"
fi
fi
echo ""
echo "Use: "$SCRIPTNAME $COMMANDS
echo ""
echo "[RAMdisk RPL]"
echo "1. Download: wget "$DOWNLOAD_URL" -O ramdisk"
echo "2. Config: nano ramdisk"
echo "3. Next: sudo chmod +x ramdisk"
echo "4. Install: ./ramdisk install"
echo "[RAMdisk RPL]"
echo ""
echo "Press any [ENTER] to continue..."
read any_key
echo ""
echo "Commands after install:"
echo "Use: "$NAME" COMMAND"
echo "Start RAMdisk: "$NAME" start"
echo "Stop RAMdisk: "$NAME" stop"
echo "Restart RAMdisk: "$NAME" restart"
echo "RAMdisk status: "$NAME" status"
echo "Backup RAMdisk to "$RAMDISK_TEMP_FULL": "$NAME" backup"
echo "Restore RAMdisk from "$RAMDISK_TEMP_FULL": "$NAME" restore"
echo "Clear RAMdisk: "$NAME" clear"
echo "Install RAMdisk: "$NAME" install"
echo "Uninstall RAMdisk: "$NAME" uninstall"
echo "Update RAMdisk script: "$NAME" update"
echo "Edit options after install: sudo nano /etc/init.d/"$NAME
echo "or: "$NAME" config"
echo "Show help: "$NAME" help"
echo ""
echo "More info info go to: https://webinsider.pl/raspberry-pi-ramdisk"
echo "Command '"$NAME" help' show this help"
}
case "$1" in
start)
f_start
;;
stop)
f_stop
;;
restart)
f_stop
f_start
;;
status)
f_status
;;
backup)
f_backup
;;
restore)
f_restore
;;
install)
f_install
;;
uninstall)
f_uninstall
;;
config)
f_config
;;
clear)
f_clear
;;
update)
f_update
;;
help)
f_help
;;
*)
echo "Use: "$SCRIPTNAME $COMMANDS
exit
;;
esac
exit 0
sudo insserv nazwa_usługi
A czasem – przy niektórych zależnościach start/stop – jest to wręcz wymagane (a przynajmniej mocno zalecane).
Pobranie skryptu
Skrypt możemy pobrać bezpośrednio do Pi korzystając z polecenia:
wget https://webinsider.pl/add/download/?link=raspberrypi_ramdisk -O ramdisk
Konfiguracja
Domyślnie skrypt tworzy dysk RAM o wielkości 2 MB (2048 KB), jako swoją ścieżkę dostępu ustawia /mnt/ramdisk, a jako katalog tymczasowy (do kopii) /temp/ramdisk
Oczywiście przed instalacją można jeszcze skonfigurować skrypt wedle własnych potrzeb (po instalacji też w każdej chwili można dokonać korekty/zmiany ustawień), korzystamy z komendy:
nano ramdisk
Ustawienia (zmiany) robimy między:
### START config here:
a
### END config here.
W większości przypadków wystarczy ew. zmiana rozmiaru dysku:
RAMDISK_SIZE="2048"
Rozmiar wpisujemy w kilobajtach (KB), czyli np.:
- 1 MB = 1024 KB
- 2 MB = 2048 KB
Standardowo system obsługuje Ramdisk o maksymalnej pojemności 8 MB. Jeśli potrzebujecie większej pojemności, to musicie dodatkowo do pliku „cmdline.txt”:
sudo nano /boot/cmdline.txt
dodać linijkę:
ramdisk_size=32768
Podana tu wartość to 32 MB. Możecie wpisać również większą…
Jeśli chcecie zmienić katalog montowania dysku RAM, i/lub katalog „tymczasowy” możecie to zrobić modyfikując te linie:
RAMDISK_MNT_DIR=/mnt
RAMDISK_TEMP_DIR=/mnt
RAMDISK_NAME=ramdisk
RAMDISK_TEMP_NAME=ramdisk_temp
Skrypt domyślnie tworzy wpis do Cron (crontab) który powoduje uruchomienie uruchomienie kopii zapasowej dysku RAM do katalogu tymczasowego co godzinę:
Można to zmienić za pomocą tych ustawień:
RAMDISK_AUTO_BACKUP=1
RAMDISK_AUTO_BACKUP_TIME=1
RAMDISK_AUTO_BACKUP_USER=root
Kolejno:
- RAMDISK_AUTO_BACKUP=1 – 1 oznacza, że Auto BackUp jest aktywny i zadanie zostanie dodane do Cron’a
- RAMDISK_AUTO_BACKUP_TIME=1 – czas między kopiami w godzinach
- RAMDISK_AUTO_BACKUP_USER=root – użytkownik dla zadania Cron
BackUp i restore
Skrypt domyślnie korzysta z polecenie „rsync” do kopiowania plików – jest to metoda bardziej niezawodna, i przy okazji szybsza.
Jeśli chcesz używać standardowego kopiowania za pomocą polecenia „cp” zmień:
RAMDISK_BACKUP_RSYNC=1
na
RAMDISK_BACKUP_RSYNC=0
Instalacja „rsync” w systemie:
sudo apt-get install rsync
Instalacja
Zaczynamy od ustawienia odpowiednich właściwości pliku:
sudo chmod +x ramdisk
Następnie, by zainstalować skrypt (usługę) możecie skorzystać z przygotowanej w skrypcie funkcji, w tym celu wystarczy wpisać komendę:
./ramdisk install
Skrypt sam doda się „gdzie trzeba”, oraz ustawi wszystko tak „by działało”, zgodnie z ustawieniami :-)
Obsługa
Zasadniczo skrypt jest bezobsługowy, czyli podczas startu systemu będzie tworzył dysk RAM (wedle zdefiniowanych parametrów), a podczas wyłączania komputera (w tym restartu) będzie zapisywał kopie danych na karcie pamięci, by podczas kolejnego uruchomienia systemu przywrócić te dane z powrotem do dysku RAM.
Jeśli zajdzie potrzeba zmiany konfiguracji już po instalacji skryptu, można to zrobić w prosty sposób za pomocą polecenia:
sudo nano /etc/init.d/ramdisk
I na koniec restart usługi, by zastosować nowe ustawienia:
ramdisk restart
lub
/etc/init.d/ramdisk restart
Gdzie „ramdisk” to domyślna nazwa skryptu. Jeśli ją zmieniliście, to w tych poleceniach również należy to zrobić.
Polecenia/komendy
W skrypt zostało wbudowanych też kilka komend/poleceń, z których możecie skorzystać:
- ramdisk start – ręczny start dysku
- ramdisk stop – ręczne tymczasowe (do restartu) utworzenie dysku
- ramdisk restart – restart dysku (z kopią)
- ramdisk status – informacje o aktywnym dysku RAM
- ramdisk backup – kopia zawartości dysku na kartę SD
- ramdisk restore – przywrócenie (nadpisanie) kopii z karty SD na RAMdysk
- ramdisk config – edycja konfiguracji/skryptu
- ramdisk clear – wyczyszczenie dysku
- ramdisk install – automatyczna instalacja skryptu/usługi
- ramdisk uninstall – automatyczne odinstalowanie skryptu/usługi
- ramdisk update – aktualizacja skryptu
- ramdisk help – pomoc
lub:
- /etc/init.d/ramdisk start – ręczny start dysku
- /etc/init.d/ramdisk stop – ręczne tymczasowe (do restartu) utworzenie dysku
- /etc/init.d/ramdisk restart – restart dysku (z kopią)
- /etc/init.d/ramdisk status – informacje o aktywnym dysku RAM
- /etc/init.d/ramdisk backup – kopia zawartości dysku na kartę SD
- /etc/init.d/ramdisk restore – przywrócenie (nadpisanie) kopii z karty SD na RAMdysk
- /etc/init.d/ramdisk config – edycja konfiguracji/skryptu
- /etc/init.d/ramdisk clear – wyczyszczenie dysku
- /etc/init.d/ramdisk install – automatyczna instalacja skryptu/usługi
- /etc/init.d/ramdisk uninstall – automatyczne odinstalowanie skryptu/usługi
- /etc/init.d/ramdisk update – aktualizacja skryptu
- /etc/init.d/ramdisk help – pomoc
Przykład działania polecenia aktualizacji skryptu:
Gdzie „ramdisk” to domyślna nazwa skryptu. Jeśli ją zmieniliście, to w tych poleceniach również należy to zrobić.
Odinstalowanie
Jeśli z jakichś przyczyn nie będziecie chcieli już korzystać z RAMdysku możecie odinstalować skrypt/usługę za pomocą polecenia:
/etc/init.d/ramdisk uninstall
lub
ramdisk uninstall
Jeśli podczas instalacji była aktywna opcja „Auto BackUp” (opisana wyżej), to należy jeszcze ręcznie usunąć wpis z tablicy Crona:
sudo nano /etc/crontab
I kasujemy od:
# RAMdisk AutoBackup END
do:
# RAMdisk AutoBackup END
- Wakacje składkowe ZUS a zawieszenie działalności gospodarczej, czyli uważaj, bo być może nie będziesz mógł skorzystać (w 2024) - 1970-01-01
- Przykładowy kalkulator wyceny usługi druku 3D, czyli nie tylko materiał się liczy - 1970-01-01
- Home Assistant 2024.10, czyli nowa karta „nagłówek” i niedziałający TTS w ramach usługi Google Cloud - 1970-01-01
W zasadzie nie każdy korzysta z RPi jako root, a po utworzeniu ramdysku tylko on ma do niego dostęp (zapis). Nie wiem jak po użyciu Twojego skryptu, bo nie potrzebuję aż takiej funkcjonalności, ale mógłbyś dopisać „sudo chmod 666 /mnt/ramdisk” po zwykłym utworzeniu ramdysku, żeby się innym początkującym (jak mi) nie myliło :P
O, nawet dalej nie mam praw, widać chmod 666 nie zadziałał, poradzę sobie chownem, ale jeśli wiesz jak udostępnić pełnię praw zwykłemu użytownikowi to będę wdzięczny :)
Hah, sam sobie namieszałem z prawami, nagle mam pełny dostęp po zamontowaniu nowego ramdysku o.O
Jeśli są to dyski z systemem plików FAT/FAT32/NTFS, to można skorzystać np. z „umask=0”
W przypadku ext2/3/4 pewnie (dodatkowo) pomoże „chmod/chmod -R”
Ja prawie nigdy nie korzystam z Pi jako „root”, raczej wspieram się m.in. „sudo” i „tee” (no, może czasem „sudo su”/”sudo -i”)
Co do „uprawnień” to celowo nie dawałem, bo RAMdisk raczej dla bardziej zaawansowanych/świadomych użytkowników – a oni albo sami ustawią takie uprawnienia jak potrzebują, albo skorzystają „gdzie trzeba” np. z „sudo” i/lub „tee”
Ja np. RAMdisk wykorzystuje jako element (katalog) serwera WWW, gdzie zapisywane są m.in. odczyty z czujników, odciążając w ten sposób kartę pamięci…
Właśnie mam podobny problem. Chciałem skorzystać ze skryptu i utworzyć ramdysk w katalogu użytkownika pi (na rpi) tak aby móc w nim zainstalować Domoticza – system inteligentnego domu. Dałoby mi to że nie mieszałbym ciągle na karcie a jedynie co godzinę (lub nawet co parę – pomyślę) synchronizowałbym cały katalog z kartą. Tyle tylko że Domoticz nie jest uruchamiany jako root i nie ma dostępu do tak stworzonego katalogu. Jak to zmienić? Tzn jak nadać uprawnienia katalogowi /home/pi/Domoticz aby mógł tam mieszać użytkownik „pi”. Pozdrawiam
Jeśli Domoticz działa z uprawnieniami innego użytkownika niż root, to faktycznie może mieć problem z dostępem do danych innych użytkowników. Zainteresuje się poleceniami/opcjami takimi jak „umask” (przy montowaniu zasobów) czy „chmod” i „chown” (uprawnienia). Te tematy powinny Ci pomóc:
Być może przydadzą się (pomogą) też linki symboliczne…
Z prawami dostępu katalogu sobie poradziłem – zmieniłem jego właściciela z root’a na pi – teraz nie ma problemu, problem jest tylko taki (tak myślę, że na tym to polega) że skrypt startowy w init.d od ramdysku startuje jednocześnie z skryptem startowym od domoticza i zaczynają się jaja.. katalog wygląda na identyczny, a jednak domoticz nie startuje. Wystarczy wykonać jego restart i jest już super. Wnioskuję zatem że należałoby je jekoś spriorytetyzować.. Mogę liczyć na jakąś wskazówkę? Raspian Stretch.
Witam !
Czy jest możliwość ustawienia RAMdisku o większej pojemności np. 16 MB?
Pozdrawiam!
Tak, choć trzeba pamiętać o tym, że to jest kosztem wolnej pamięci RAM – zwłaszcza przy wersji z 256MB RAM
Witam,
a czy jest możliwość, by ramdysk okresowo (np. co 1h) archiwizował się (nie tylko podczas zamykania systemu)?
Pozdrawiam
Jest oczywiście taka możliwość – np. w skrypcie który umieściłem w poradniku jest taka opcja (archiwizacja co 1 godzinę – można zmienić, do tego kopia i przywracanie podczas restartu). Można wykorzystać cały skrypt, czy tylko „koncepcje”.
Ja dodatkowo wspomagam się synchronizacją z Copy.com…
Próbowałem uruchomić dysk o pojemności przekraczającej 4096kB no i się nie udaje. Problem jest w czasie formatowania ram1. Wyrzuca błąd: mkfs.ext2: System plików większy od widocznego rozmiaru urządzenia. Czy wie ktoś, co z tym zrobić?
Z góry dziękuję.
Ja mam właśnie 4096 i nie było problemów. Może brak wolnej pamięci RAM w Pi?
skorzystałem z metody „tmpfs” i utworzyłem wirtualny dysk o pojemności 100 MB, wydaje się więc, że ramu wystarcza. Zresztą sprawdzałem i mam dużo wolnego. Niestety wszelkie „bajery” będę musiał dopisać własnoręcznie. Twojemu skryptowi pewnie i tak nie dorównam.
Gdzieś czytałem, że ograniczenie do 4096 kB wynika ze sposobu zainicjowania urządzeń „ram0 – ram15” i by to zmienić to trzeba w jądrze pogrzebać. Nie wiem, czy to prawda.
Pozdrawiam
Tak, w standardzie 4096 to chyba górny limit… I faktycznie chyba bez grzebania w jajku się nie obejdzie – przyznam od razu, że nawet do tego nie podchodziłem, 4096 (na razie?) wystarcza mi na logi z urządzeń (wspierane przez Copy.com).
Witaj,
Czytam sobie twojego bloga i jestem pod dużym wrażeniem zasobu twojej wiedzy.
Mam jednak pytanie dotyczące skryptu do ram dysku.
Po wydaniu polecenia ./ramdisk install
Rasaspbmc:/home/adrian# sudo chmod +x ramdisk
root@raspbmc:/home/adrian# sudo ./ramdisk install
./ramdisk: 2: ./ramdisk: Syntax error: newline unexpected
root@raspbmc:/home/adrian#
Mógłbyś podpowiedzieć co zrobić
Witam
A pobierasz skrypt bezpośrednio z serwera, czy kopiowałeś treść? Bo możliwe, że podczas kopiowania treści (zawartości) coś się „dodało” (jakiś symbol/znak).
Pobieram bezpośrednio.
Pytanie jest następujące jeżeli podmontowałem ramdysk to rpi z niego korzysta czy coś jeszcze jest konieczne aby nie gwałcił karty?
RAMdysk w Pi to nie lek na całe zło – ma ograniczoną pojemność, i choćby z tego względu nie da się tam przerzucić więcej niż jakieś logi itp. Choć z tego co kojarzę, to Raspbian jest zmodyfikowany tak, by oszczędniej obchodził się z kartą SD. Inna sprawa, że aktualne ceny kart SD są na tyle małe, że nawet jak taka karta „zostanie zajechana” w rok czy 2 – nie będzie to jakieś drastyczne obciążenie budżetu, a do tego zawsze można próbować reklamować… ;-)
U mnie od początku chodzi jedna karta i jest OK.
Fajny artykuł, a ponieważ miałem problem z stworzeniem większego dysku, i trochę mi zeszło zanim znalazłem rozwiązanie to się nim podzielę żeby wszystko było w jednym miejscu. Trzeba do pliku /boot/cmdline.txt dopisać ramdisk_size=32768 co w tym przypadku pozwala utworzyć RAMDISK o rozmiarze 32M, oczywiście możemy stworzyć też większy. https://github.com/raspberrypi/linux/blob/rpi-4.0.y/Documentation/kernel-parameters.txt
Dzięki za informacje, na pewno się przyda – zaraz też zaktualizuje o nią wpis…
Sam nie miałem jeszcze okazji korzystać z większego RAMdysku niż 8MB na Raspberry Pi – 512 MB RAM i tak czasem bywa mało, więc staram się go nie zabierać dodatkowo, i o ile cały czas korzystam z tego rozwiązania, to tylko dla tymczasowych zapisów z czujników, a tu starczy i 2-4MB.
Jest też (prawie ;-)) pewien, że gdy powstawał ten wpis, czyli jakieś 2 i 5 roku temu, to tego parametru dla kernela jeszcze nie było…
Jeżeli dobrze widzę jest malutki błąd w 129 linijce.. Czy aby zadanie nie uruchamiało się co x godzin nie powinno być „00 */x * * *” ? Inaczej polecenie uruchamia się o każdej minucie..
Tak, masz rację – uciekło zero w minutach. Już koryguje. Dzięki za info i brawo za czujność… :-)
A skoro już napisałem wyjaśnienie, to może komuś się przyda:
Podczas definiowania czasu uruchomienia zadania w CRONie masz do dyspozycji 5 gwiazdek, odpowiadających kolejno:
minuta godzina dzień_miesiąca miesiąc dzień_tygodnia
W skrypcie możesz zdefiniować co ile minut lub godzin będzie uruchamiała się kopia zapasowa – przesyłanie danych z RAMdysku np. na kartę pamięci:
RAMDISK_AUTO_BACKUP_TIME=1
W powyższym przypadku mamy jeden, a więc kopia/synchronizacja będzie wykonywana co jedną jednostkę czasu. Jednostką czasu mogą być minuty lub godziny – co również możemy zdefiniować w ustawieniach:
#RAMDISK_AUTO_BACKUP_SET 1=minute(s) 0-59, 2=hour(s) 0-23
RAMDISK_AUTO_BACKUP_SET=2
Gdy ustawisz 2 (tak jest chyba domyślnie), to jednostką czasu będzie godzina. Gdy ustawisz 1 – minuta. Tak więc kopia będzie się wykonywać co RAMDISK_AUTO_BACKUP_TIME minut (RAMDISK_AUTO_BACKUP_SET=1) lub godzin (RAMDISK_AUTO_BACKUP_SET=2).
Daj znać, czy teraz jest już wszystko OK/jasne. I mam nadzieję, że niczego nie pomyliłem, bo skrypt pisałem już dość dawno temu…
Cześć.
Jestem nowy z tematem ram na raspberry pi. Uruchomiłem Twój skrypt. Po komendzie df -h widać dysk. Dręczy mnie jedna rzecz. Lubie pisać kod w języku JAVA. Nie jestem zbytnio zorientowany w tym temacie a więc. Jak działa ten RAM? Jak uruchomić program który będzie wykorzystywał RAM? Uruchomiając program który zapisuje dane do pliku np temperaturę procesora od razu będzie korzystał z RAMu?
Niezależnie od tego z jakiego programu korzystasz, w jakim języku tworzysz skrypt/program, z RAMdysku korzystasz jak ze zwykłego dysku, zwykłej przestrzenie na dane/pliki. Z tą tylko różnicą, że zapis, modyfikacja i odczyt plików odbywa się weszcznie w pamięci RAM, zamiast np. na karcie pamięci, co ma znaczenie np. w przypadku często modyfikowanych plików, i pozwala ograniczyć liczbę cykli zapisu/odczytu na pamięci flash, podnosząc jej żywotność. Nie w każdym przypadku ma to sens, ale są takie projekty, gdzie takich zapisów/odczytów jest bardzo dużo, i wtedy warto pomyśleć właśnie od dysku w pamięci RAM.
Dziękuje za odpowiedz :)
żeby to miało sens to muszę zapisywać temperaturę cpu do folderu /mnt/ , /mnt/ramdisk czy /mnt/ramdisk_temp ??
dzięki
Zapisujesz zależnie od tego, jaką ścieżkę ustawisz dla dysku RAM. W artykule jako ścieżki dla tego dysku używam /mnt/ramdisk (/mnt/ramdisk_temp to folder tymczasowy), a więc temperaturę CPU zapisujesz np. do pliku /mnt/ramdisk/raspberrypi_cpu.csv
Witam
Czemu nie mogę pobrać skryptu – dostaję komunikat
sudo wget https://webinsider.pl/add/download/?link=raspberrypi_ramdisk -O ramdisk
https://webinsider.pl/add/download/?link=raspberrypi_ramdisk: Brak schematu.
Będę wdzięczny z pomoc, system rasbian użytkownik PI
Musisz dodać „https” na początku. Czyli:
Jutro zerknę, jak to wygląda w artykule, bo może uciekło podczas którejś z modyfikacji...