코드수정) zramswap 자동시작이 안되시는 분들을 위한 패치

viewtopic.php?f=9&t=21577&p=101630#p101630
initramfs-compcach.tgz (1.43 KB)

감사합니다
엄청난 도움인데
댓글이읍네용~~

범접하지못할 실력자님;;

감사합니다. 그런데 지난번 패치를 sudo로 복사했는데…
zramswap이 작동하는지 어떻게 알 수 있나요? 패치하고 시스템모니터에서 보아도zram항목으로 실행되는 것이
안보이네요. 그래서 이번에 올리신 패치로 다시 패치해 보았으나 여전히 찾을 수 없네요…
작동하는지 않하는지 어떻게 알 수 있나요? 답변부탁합니다.

swapon -s 해보세요…

/dev/zram* 장치가 보이면 동작중인 것입니다.

아 그렇군요. 감사합니다. 콘솔에서 보니 잘 작동하고 있네요.
감사합니다.

커널버젼 3.4,3.5를 사용해서 그런가…
initramfs에서 modinfo가
/usr/lib/modules/$(uname -r) 디렉토리가 아닌
$(uname -r)디렉토리에서 모듈을 찾는군요.
그래서 zram모듈파라미터를 찾기위해 바이너리파일로부터 파라미터를 읽어오게 변경하였습니다.
전에 올린… zram의 서비스 시작스크립트는 본부팅시에 사용되는것이라 이것과는 다릅니다.

파일은 /usr/share/initramfs-tools/hooks/compcache

[code:irst56vr]
#!/bin/sh
set -e

if [ "$1" = prereqs ]; then
exit 0
fi

. /usr/share/initramfs-tools/hook-functions

number=
suffix=
eval $(printf "%s" "$COMPCACHE_SIZE" |
sed -nre ‘s/^ ([1-9][0-9]) *([%KMGT]) *$/number="\1"; suffix="\2";/p’)

if [ -z "$number" ] || [ -z "$suffix" ]; then
exit 0
fi

if have_module zram; then
name=zram
manual_add_modules zram
elif have_module ramzswap; then
name=ramzswap
manual_add_modules ramzswap
elif have_module compcache; then
name=compcache
manual_add_modules compcache
else
exit 0
fi

copy_exec /sbin/swapon
copy_exec /sbin/swapoff
copy_exec /sbin/mkswap
copy_exec /usr/lib/initramfs-tools/bin/rzscontrol /sbin

mem_total="$(sed -nre ‘s/^MemTotal:\s*([0-9]+) kB$/\1/p’ /proc/meminfo)"

case "$suffix" in
%) kbytes="$(($mem_total * $number / 100))" ;;
K) kbytes=$(($number)) ;;
M) kbytes=$(($number * 1024)) ;;
G) kbytes=$(($numbber * 1024 * 1024)) ;;
T) kbytes=$(($number * 1024 * 1024 * 1024)) ;;
esac

cat >"$DESTDIR"/sbin/compcache-enable <<‘EOF’
#!/bin/sh
if [ "$#" != 3 ]; then
echo "Usage: $0 <type> <size> <device>" 1>&2
exit 1
fi
type="$1"
size="$2"
device="$3"

number=
suffix=
eval $(printf "%s" "$size" |
sed -nre ‘s/^ ([1-9][0-9]) *([%KMGT]) *$/number="\1"; suffix="\2";/p’)

mem_total="$(sed -nre ‘s/^MemTotal:\s*([0-9]+) kB$/\1/p’ /proc/meminfo)"
cpus="$(grep "^processor" /proc/cpuinfo|wc -l)"

case "$suffix" in
%) kbytes="$(($mem_total * $number / 100))" ;;
K) kbytes=$(($number)) ;;
M) kbytes=$(($number * 1024)) ;;
G) kbytes=$(($number * 1024 * 1024)) ;;
T) kbytes=$(($number * 1024 * 1024 * 1024)) ;;
esac
bytes="$(($kbytes * 1024))"
bytes_per_cpu=$(($bytes/$cpus))

if [ "$type" = zram ]; then
echo "$bytes_per_cpu" >/sys/block/$device/disksize &&
/sbin/mkswap "/dev/$device" >/dev/null

elif [ "$type" = ramzswap ]; then
/sbin/rzscontrol "/dev/$device" --disksize_kb="$kbytes" --init
fi
/sbin/swapon -p 100 "/dev/$device" 2>/dev/null

exit 0
EOF
chmod 0755 "$DESTDIR"/sbin/compcache-enable

mkdir -p "$DESTDIR"/etc/udev/rules.d
if [ "$name" = zram ]; then
cat >"$DESTDIR"/etc/udev/rules.d/80-compcache.rules <<EOF
KERNEL=="zram*", ACTION=="add", \
RUN+="/sbin/compcache-enable zram $COMPCACHE_SIZE %k"
EOF
elif [ "$name" = ramzswap ]; then
cat >"$DESTDIR"/etc/udev/rules.d/80-compcache.rules <<EOF
KERNEL=="ramzswap0", ACTION=="add", \
RUN+="/sbin/compcache-enable ramzswap $COMPCACHE_SIZE ramzswap0"
EOF
else
cat >"$DESTDIR"/etc/udev/rules.d/80-compcache.rules <<EOF
KERNEL=="ramzswap0", ACTION=="add", \
RUN+="/sbin/compcache-enable compcache $COMPCACHE_SIZE ramzswap0"
EOF
fi

cat >"$DESTDIR"/scripts/init-top/compcache <<EOF
#!/bin/sh

PREREQ=""
prereqs()
{
echo "$PREREQ"
}

case $1 in
prereqs)
prereqs
exit 0
;;
esac

find total amount of available ram

TOTAL_RAM=$( grep MemTotal /proc/meminfo |tr -d ‘: [A-Z][a-z]’)

Do not use compcache on the liveCD if we have more than 512M

if [ "${BOOT}" = "casper" ]; then
if [ "${TOTAL_RAM}" -gt 524288 ]; then
exit 0
fi
fi

for x in $(cat /proc/cmdline); do
case ${x} in
nocompcache)
exit 0
;;
esac
done

EOF

if [ "$name" = zram ]; then
cat >>"$DESTDIR"/scripts/init-top/compcache <<EOF
cpus="$(grep "^processor" /proc/cpuinfo|wc -l)"
zram_path="/lib/modules/$(uname -r)/$(modprobe -l zram)"

zram_parm=$(grep parm= $zram_path|sed -r ‘s/parm=([^:]+):.*/\1/g’)
zram_opt=
[ -n $zram_parm ] && zram_opt="$zram_parm=$cpus"
modprobe -q --ignore-install zram $zram_opt
EOF
elif [ "$name" = ramzswap ]; then
cat >>"$DESTDIR"/scripts/init-top/compcache <<EOF
modprobe -q --ignore-install ramzswap
EOF
else
cat >>"$DESTDIR"/scripts/init-top/compcache <<EOF
modprobe -q --ignore-install compcache compcache_size_kbytes="$kbytes"
EOF
fi

chmod 0755 "$DESTDIR"/scripts/init-top/compcache
[/code:irst56vr]

그리고, initramfs에서 로컬디스크를 마운트한 후에… 본 부팅이전에…
zram모듈을 제거합니다. 이것은 모듈이 사용중이면… zram-enabler나 zram-config등의
서비스가 시작되지 않는 문제가 있어서, 이부분은 시스템의 서비스에 맡기고,
단지 본부팅이전까지만 zram을 돌립니다.

파일은 /usr/share/initramfs-tools/scripts/local-bottom/zramoff

[code:irst56vr]
#!/bin/sh

Initramfs-tools script

Copyright 2006 Tim Dijstra <tim@famdijkstra.org>

Released under GPLv2

PREREQ=""

prereqs()
{
echo "$PREREQ"
}

case $1 in

get pre-requisites

prereqs)
prereqs
exit 0
;;
esac

swapon -s|grep zram >/dev/null 2>&1 && swapoff /dev/zram* && rmmod zram
[/code:irst56vr]

수정 후에는…
sudo update-initramfs -u 로 부팅이미지를 업데이트해줘야 합니다.