|
|
@@ -9,18 +9,17 @@ fi |
|
|
|
LOG_NAME='log2ram.log' |
|
|
|
NO_RSYNC=${USE_RSYNC#true} |
|
|
|
|
|
|
|
isSafe () { |
|
|
|
## @fn is_safe() |
|
|
|
## @brief Check if hdd log exists |
|
|
|
is_safe() { |
|
|
|
[ -d "$HDD_LOG" ] || echo "ERROR: $HDD_LOG/ doesn't exist! Can't sync." |
|
|
|
[ -d "$HDD_LOG" ] || exit 1 |
|
|
|
} |
|
|
|
|
|
|
|
remountOriginal() { |
|
|
|
OPTION="$1" |
|
|
|
mount -o remount,"$OPTION" "$HDD_LOG" |
|
|
|
} |
|
|
|
|
|
|
|
syncToDisk () { |
|
|
|
isSafe |
|
|
|
## @fn sync_to_disk() |
|
|
|
## @brief Sync memory back to hard disk |
|
|
|
sync_to_disk() { |
|
|
|
is_safe |
|
|
|
|
|
|
|
if [ -z "${NO_RSYNC}" -a -x "$(command -v rsync)" ]; then |
|
|
|
rsync -aXv --inplace --no-whole-file --delete-after "$RAM_LOG"/ "$HDD_LOG"/ 2>&1 | tee -a "$LOG2RAM_LOG" |
|
|
@@ -29,8 +28,10 @@ syncToDisk () { |
|
|
|
fi |
|
|
|
} |
|
|
|
|
|
|
|
syncFromDisk () { |
|
|
|
isSafe |
|
|
|
## @fn sync_from_disk() |
|
|
|
## @brief Sync hard disk to memory |
|
|
|
sync_from_disk() { |
|
|
|
is_safe |
|
|
|
|
|
|
|
TP_SIZE=$SIZE |
|
|
|
if [ "$ZL2R" = true ]; then |
|
|
@@ -42,7 +43,7 @@ syncFromDisk () { |
|
|
|
umount -l "$RAM_LOG"/ |
|
|
|
umount -l "$HDD_LOG"/ |
|
|
|
if [ "$MAIL" = true ]; then |
|
|
|
echo "LOG2RAM : No place on RAM for \"$HDD_LOG/\" anymore, fallback on the disk" | mail -s 'Log2Ram Error' root; |
|
|
|
echo "LOG2RAM : No place on RAM for \"$HDD_LOG/\" anymore, fallback on the disk" | mail -s 'Log2Ram Error' root |
|
|
|
fi |
|
|
|
exit 1 |
|
|
|
fi |
|
|
@@ -55,103 +56,105 @@ syncFromDisk () { |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
wait_for () { |
|
|
|
while ! findmnt "$1" > /dev/null; do |
|
|
|
sleep 0.1 |
|
|
|
done |
|
|
|
|
|
|
|
while [ ! -f "$1/log2ram.test" ]; do |
|
|
|
touch "$1/log2ram.test" |
|
|
|
## @fn wait_for() |
|
|
|
## @brief Wait for directory and create test file to make sure the directory exists |
|
|
|
## @param param1 path to the directory |
|
|
|
wait_for() { |
|
|
|
WAIT_PATH="$1" |
|
|
|
while ! findmnt "$WAIT_PATH" >/dev/null; do |
|
|
|
sleep 0.1 |
|
|
|
done |
|
|
|
rm "$1/log2ram.test" |
|
|
|
} |
|
|
|
|
|
|
|
createZramLogDrive () { |
|
|
|
# Check Zram Class created |
|
|
|
if [ ! -d "/sys/class/zram-control" ]; then |
|
|
|
modprobe zram |
|
|
|
RAM_DEV='0' |
|
|
|
else |
|
|
|
RAM_DEV=$(cat /sys/class/zram-control/hot_add) |
|
|
|
fi |
|
|
|
echo "$COMP_ALG" > "/sys/block/zram${RAM_DEV}/comp_algorithm" |
|
|
|
echo "$LOG_DISK_SIZE" > "/sys/block/zram${RAM_DEV}/disksize" |
|
|
|
echo "$SIZE" > "/sys/block/zram${RAM_DEV}/mem_limit" |
|
|
|
mke2fs -t ext4 "/dev/zram${RAM_DEV}" |
|
|
|
while [ ! -f "$WAIT_PATH/log2ram.test" ]; do |
|
|
|
touch "$WAIT_PATH/log2ram.test" |
|
|
|
sleep 0.1 |
|
|
|
done |
|
|
|
rm "$WAIT_PATH/log2ram.test" |
|
|
|
} |
|
|
|
|
|
|
|
make_log_dir () { |
|
|
|
[ -d "$HDD_LOG" ] || mkdir "$HDD_LOG" |
|
|
|
## @fn create_zram_log_drive() |
|
|
|
## @brief Create zram log device |
|
|
|
create_zram_log_drive() { |
|
|
|
# Check Zram Class created |
|
|
|
if [ ! -d "/sys/class/zram-control" ]; then |
|
|
|
modprobe zram |
|
|
|
RAM_DEV='0' |
|
|
|
else |
|
|
|
RAM_DEV=$(cat /sys/class/zram-control/hot_add) |
|
|
|
fi |
|
|
|
echo "$COMP_ALG" >"/sys/block/zram${RAM_DEV}/comp_algorithm" |
|
|
|
echo "$LOG_DISK_SIZE" >"/sys/block/zram${RAM_DEV}/disksize" |
|
|
|
echo "$SIZE" >"/sys/block/zram${RAM_DEV}/mem_limit" |
|
|
|
mke2fs -t ext4 "/dev/zram${RAM_DEV}" |
|
|
|
} |
|
|
|
|
|
|
|
case "$1" in |
|
|
|
start) |
|
|
|
IFS=';' |
|
|
|
for i in $PATH_DISK; do |
|
|
|
# Skip the path if the folder doesn't exist |
|
|
|
[ ! -d "$i" ] && continue |
|
|
|
|
|
|
|
PATH_FIRST_PART="${i%/*}" |
|
|
|
PATH_LAST_PART="${i##/*/}" |
|
|
|
RAM_LOG="$i" |
|
|
|
HDD_LOG="${PATH_FIRST_PART}/hdd.${PATH_LAST_PART}" |
|
|
|
LOG2RAM_LOG="${RAM_LOG}/${LOG_NAME}" |
|
|
|
|
|
|
|
make_log_dir |
|
|
|
|
|
|
|
mount --bind "$RAM_LOG"/ "$HDD_LOG"/ |
|
|
|
mount --make-private "$HDD_LOG"/ |
|
|
|
wait_for "$HDD_LOG" |
|
|
|
|
|
|
|
if [ "$ZL2R" = true ]; then |
|
|
|
createZramLogDrive |
|
|
|
mount -t ext4 -o nosuid,noexec,noatime,nodev,user=log2ram "/dev/zram${RAM_DEV}" "$RAM_LOG"/ |
|
|
|
else |
|
|
|
mount -t tmpfs -o "nosuid,noexec,noatime,nodev,mode=0755,size=${SIZE}" log2ram "$RAM_LOG"/ |
|
|
|
fi |
|
|
|
wait_for "$RAM_LOG" |
|
|
|
syncFromDisk |
|
|
|
done |
|
|
|
exit 0 |
|
|
|
;; |
|
|
|
|
|
|
|
stop) |
|
|
|
IFS=';' |
|
|
|
for i in $PATH_DISK; do |
|
|
|
PATH_FIRST_PART="${i%/*}" |
|
|
|
PATH_LAST_PART="${i##/*/}" |
|
|
|
RAM_LOG="$i" |
|
|
|
HDD_LOG="${PATH_FIRST_PART}/hdd.${PATH_LAST_PART}" |
|
|
|
LOG2RAM_LOG="${RAM_LOG}/${LOG_NAME}" |
|
|
|
|
|
|
|
syncToDisk |
|
|
|
#ZRAM_LOG=$(awk '$2 == "/var/log" {print $1}' /proc/mounts) |
|
|
|
#ZRAM_LOG=$(echo ${ZRAM_LOG} | grep -o -E '[0-9]+') |
|
|
|
umount -l "$RAM_LOG"/ |
|
|
|
umount -l "$HDD_LOG"/ |
|
|
|
# Unsure as even with Root permision denied |
|
|
|
#echo ${ZRAM_LOG} > /sys/class/zram-control/hot_remove |
|
|
|
done |
|
|
|
exit 0 |
|
|
|
;; |
|
|
|
|
|
|
|
write) |
|
|
|
IFS=';' |
|
|
|
for i in $PATH_DISK; do |
|
|
|
PATH_FIRST_PART="${i%/*}" |
|
|
|
PATH_LAST_PART="${i##/*/}" |
|
|
|
RAM_LOG="$i" |
|
|
|
HDD_LOG="${PATH_FIRST_PART}/hdd.${PATH_LAST_PART}" |
|
|
|
LOG2RAM_LOG="${RAM_LOG}/${LOG_NAME}" |
|
|
|
|
|
|
|
syncToDisk |
|
|
|
done |
|
|
|
exit 0 |
|
|
|
;; |
|
|
|
|
|
|
|
*) |
|
|
|
echo 'Usage: log2ram {start|stop|write}' >&2 |
|
|
|
exit 1 |
|
|
|
;; |
|
|
|
start) |
|
|
|
IFS=';' |
|
|
|
for i in $PATH_DISK; do |
|
|
|
# Skip the path if the folder doesn't exist |
|
|
|
[ ! -d "$i" ] && continue |
|
|
|
|
|
|
|
PATH_FIRST_PART="${i%/*}" |
|
|
|
PATH_LAST_PART="${i##/*/}" |
|
|
|
RAM_LOG="$i" |
|
|
|
HDD_LOG="${PATH_FIRST_PART}/hdd.${PATH_LAST_PART}" |
|
|
|
LOG2RAM_LOG="${RAM_LOG}/${LOG_NAME}" |
|
|
|
|
|
|
|
[ -d "$HDD_LOG" ] || mkdir "$HDD_LOG" |
|
|
|
|
|
|
|
mount --bind "$RAM_LOG"/ "$HDD_LOG"/ |
|
|
|
mount --make-private "$HDD_LOG"/ |
|
|
|
wait_for "$HDD_LOG" |
|
|
|
|
|
|
|
if [ "$ZL2R" = true ]; then |
|
|
|
create_zram_log_drive |
|
|
|
mount -t ext4 -o nosuid,noexec,noatime,nodev,user=log2ram "/dev/zram${RAM_DEV}" "$RAM_LOG"/ |
|
|
|
else |
|
|
|
mount -t tmpfs -o "nosuid,noexec,noatime,nodev,mode=0755,size=${SIZE}" log2ram "$RAM_LOG"/ |
|
|
|
fi |
|
|
|
wait_for "$RAM_LOG" |
|
|
|
sync_from_disk |
|
|
|
done |
|
|
|
exit 0 |
|
|
|
;; |
|
|
|
|
|
|
|
stop) |
|
|
|
IFS=';' |
|
|
|
for i in $PATH_DISK; do |
|
|
|
PATH_FIRST_PART="${i%/*}" |
|
|
|
PATH_LAST_PART="${i##/*/}" |
|
|
|
RAM_LOG="$i" |
|
|
|
HDD_LOG="${PATH_FIRST_PART}/hdd.${PATH_LAST_PART}" |
|
|
|
LOG2RAM_LOG="${RAM_LOG}/${LOG_NAME}" |
|
|
|
|
|
|
|
sync_to_disk |
|
|
|
#ZRAM_LOG=$(awk '$2 == "/var/log" {print $1}' /proc/mounts) |
|
|
|
#ZRAM_LOG=$(echo ${ZRAM_LOG} | grep -o -E '[0-9]+') |
|
|
|
umount -l "$RAM_LOG"/ |
|
|
|
umount -l "$HDD_LOG"/ |
|
|
|
# Unsure as even with Root permision denied |
|
|
|
#echo ${ZRAM_LOG} > /sys/class/zram-control/hot_remove |
|
|
|
done |
|
|
|
exit 0 |
|
|
|
;; |
|
|
|
|
|
|
|
write) |
|
|
|
IFS=';' |
|
|
|
for i in $PATH_DISK; do |
|
|
|
PATH_FIRST_PART="${i%/*}" |
|
|
|
PATH_LAST_PART="${i##/*/}" |
|
|
|
RAM_LOG="$i" |
|
|
|
HDD_LOG="${PATH_FIRST_PART}/hdd.${PATH_LAST_PART}" |
|
|
|
LOG2RAM_LOG="${RAM_LOG}/${LOG_NAME}" |
|
|
|
|
|
|
|
sync_to_disk |
|
|
|
done |
|
|
|
exit 0 |
|
|
|
;; |
|
|
|
|
|
|
|
*) |
|
|
|
echo 'Usage: log2ram {start|stop|write}' >&2 |
|
|
|
exit 1 |
|
|
|
;; |
|
|
|
esac |