LINUX.ORG.RU
решено ФорумAdmin

Не работает правильно zram через правило udev на Oracle Linux 8.5

 , , , ,


0

1

Я настроил это дело наподобие https://wiki.archlinux.org/title/Improving_performance#Swap_on_zram_using_a_udev_rule , и на первый взгляд всё как и должно быть:

[root@hp15 ~]# uname -a
Linux hp15 5.4.17-2136.304.4.1.el8uek.x86_64 #2 SMP Tue Feb 8 11:54:24 PST 2022 x86_64 x86_64 x86_64 GNU/Linux
[root@hp15 ~]# cat /etc/oracle-release 
Oracle Linux Server release 8.5
[root@hp15 ~]# cat /etc/modules-load.d/zram.conf
zram
[root@hp15 ~]# cat /etc/modprobe.d/zram.conf
options zram num_devices=4
[root@hp15 ~]# cat /etc/udev/rules.d/99-zram.rules
KERNEL=="zram0", ATTR{disksize}="3072M" RUN="/usr/sbin/mkswap /dev/zram0", TAG+="systemd"
KERNEL=="zram1", ATTR{disksize}="3072M" RUN="/usr/sbin/mkswap /dev/zram1", TAG+="systemd"
KERNEL=="zram2", ATTR{disksize}="3072M" RUN="/usr/sbin/mkswap /dev/zram2", TAG+="systemd"
KERNEL=="zram3", ATTR{disksize}="3072M" RUN="/usr/sbin/mkswap /dev/zram3", TAG+="systemd"
[root@hp15 ~]# cat /etc/fstab

#
# /etc/fstab
# Created by anaconda on Fri Feb 11 18:30:53 2022
#
# Accessible filesystems, by reference, are maintained under '/dev/disk/'.
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info.
#
# After editing this file, run 'systemctl daemon-reload' to update systemd
# units generated from this file.
#
UUID=a2fde00b-13cd-4228-ac40-3ad995455d84 /                       ext4    defaults,discard        1 1
/dev/zram0 none swap defaults 0 0
/dev/zram1 none swap defaults 0 0
/dev/zram2 none swap defaults 0 0
/dev/zram3 none swap defaults 0 0
[root@hp15 ~]# lsmod | grep zram
zram                   32768  0
[root@hp15 ~]# ls -l /dev/ | grep zram
brw-rw----. 1 root     disk      252,   0 Feb 17 21:19 zram0
brw-rw----. 1 root     disk      252,   1 Feb 17 21:19 zram1
brw-rw----. 1 root     disk      252,   2 Feb 17 21:19 zram2
brw-rw----. 1 root     disk      252,   3 Feb 17 21:19 zram3

Но как выяснилось, это нифига не работает:

[root@hp15 ~]# free -m
              total        used        free      shared  buff/cache   available
Mem:          15705        1418       12487         371        1800       13613
Swap:             0           0           0
[root@hp15 ~]# systemctl list-units --type swap --all
  UNIT           LOAD   ACTIVE SUB    DESCRIPTION                                                                                                                                                                 
● dev-zram0.swap loaded failed failed /dev/zram0                                                                                                                                                                  
● dev-zram1.swap loaded failed failed /dev/zram1                                                                                                                                                                  
● dev-zram2.swap loaded failed failed /dev/zram2                                                                                                                                                                  
● dev-zram3.swap loaded failed failed /dev/zram3                                                                                                                                                                  

LOAD   = Reflects whether the unit definition was properly loaded.
ACTIVE = The high-level unit activation state, i.e. generalization of SUB.
SUB    = The low-level unit activation state, values depend on unit type.

4 loaded units listed.
To show all installed unit files use 'systemctl list-unit-files'.
[root@hp15 ~]# systemctl status dev-zram0.swap
● dev-zram0.swap - /dev/zram0
   Loaded: loaded (/etc/fstab; generated)
   Active: failed (Result: exit-code) since Thu 2022-02-17 21:19:50 MSK; 5min ago
     What: /dev/zram0
     Docs: man:fstab(5)
           man:systemd-fstab-generator(8)

Feb 17 21:19:50 hp15 systemd[1]: Activating swap /dev/zram0...
Feb 17 21:19:50 hp15 swapon[706]: swapon: /dev/zram0: read swap header failed
Feb 17 21:19:50 hp15 systemd[1]: dev-zram0.swap: Swap process exited, code=exited status=255
Feb 17 21:19:50 hp15 systemd[1]: dev-zram0.swap: Failed with result 'exit-code'.
Feb 17 21:19:50 hp15 systemd[1]: Failed to activate swap /dev/zram0.
[root@hp15 ~]# systemctl status dev-zram1.swap
● dev-zram1.swap - /dev/zram1
   Loaded: loaded (/etc/fstab; generated)
   Active: failed (Result: exit-code) since Thu 2022-02-17 21:19:50 MSK; 5min ago
     What: /dev/zram1
     Docs: man:fstab(5)
           man:systemd-fstab-generator(8)

Feb 17 21:19:50 hp15 systemd[1]: Activating swap /dev/zram1...
Feb 17 21:19:50 hp15 swapon[700]: swapon: /dev/zram1: read swap header failed
Feb 17 21:19:50 hp15 systemd[1]: dev-zram1.swap: Swap process exited, code=exited status=255
Feb 17 21:19:50 hp15 systemd[1]: dev-zram1.swap: Failed with result 'exit-code'.
Feb 17 21:19:50 hp15 systemd[1]: Failed to activate swap /dev/zram1.
[root@hp15 ~]# systemctl status dev-zram2.swap
● dev-zram2.swap - /dev/zram2
   Loaded: loaded (/etc/fstab; generated)
   Active: failed (Result: exit-code) since Thu 2022-02-17 21:19:50 MSK; 5min ago
     What: /dev/zram2
     Docs: man:fstab(5)
           man:systemd-fstab-generator(8)

Feb 17 21:19:50 hp15 systemd[1]: Activating swap /dev/zram2...
Feb 17 21:19:50 hp15 swapon[702]: swapon: /dev/zram2: read swap header failed
Feb 17 21:19:50 hp15 systemd[1]: dev-zram2.swap: Swap process exited, code=exited status=255
Feb 17 21:19:50 hp15 systemd[1]: dev-zram2.swap: Failed with result 'exit-code'.
Feb 17 21:19:50 hp15 systemd[1]: Failed to activate swap /dev/zram2.
[root@hp15 ~]# systemctl status dev-zram3.swap
● dev-zram3.swap - /dev/zram3
   Loaded: loaded (/etc/fstab; generated)
   Active: failed (Result: exit-code) since Thu 2022-02-17 21:19:50 MSK; 5min ago
     What: /dev/zram3
     Docs: man:fstab(5)
           man:systemd-fstab-generator(8)

Feb 17 21:19:50 hp15 systemd[1]: Activating swap /dev/zram3...
Feb 17 21:19:50 hp15 swapon[699]: swapon: /dev/zram3: read swap header failed
Feb 17 21:19:50 hp15 systemd[1]: dev-zram3.swap: Swap process exited, code=exited status=255
Feb 17 21:19:50 hp15 systemd[1]: dev-zram3.swap: Failed with result 'exit-code'.
Feb 17 21:19:50 hp15 systemd[1]: Failed to activate swap /dev/zram3.

Что любопытно, при ручной активации позже всё срабатывает как надо:

[root@hp15 ~]# swapon /dev/zram0
[root@hp15 ~]# swapon /dev/zram1
[root@hp15 ~]# swapon /dev/zram2
[root@hp15 ~]# swapon /dev/zram3
[root@hp15 ~]# free -m
              total        used        free      shared  buff/cache   available
Mem:          15705        1428       12510         337        1767       13637
Swap:         12287           0       12287
[root@hp15 ~]# systemctl list-units --type swap --all
UNIT           LOAD   ACTIVE SUB    DESCRIPTION                                                                                                                                                                   
dev-zram0.swap loaded active active /dev/zram0                                                                                                                                                                    
dev-zram1.swap loaded active active /dev/zram1                                                                                                                                                                    
dev-zram2.swap loaded active active /dev/zram2                                                                                                                                                                    
dev-zram3.swap loaded active active /dev/zram3                                                                                                                                                                    

LOAD   = Reflects whether the unit definition was properly loaded.
ACTIVE = The high-level unit activation state, i.e. generalization of SUB.
SUB    = The low-level unit activation state, values depend on unit type.

4 loaded units listed.
To show all installed unit files use 'systemctl list-unit-files'.
[root@hp15 ~]# systemctl status dev-zram0.swap
● dev-zram0.swap - /dev/zram0
   Loaded: loaded (/etc/fstab; generated)
   Active: active (Result: exit-code) since Thu 2022-02-17 21:26:43 MSK; 23s ago
     What: /dev/zram0
     Docs: man:fstab(5)
           man:systemd-fstab-generator(8)
[root@hp15 ~]# systemctl status dev-zram1.swap
● dev-zram1.swap - /dev/zram1
   Loaded: loaded (/etc/fstab; generated)
   Active: active (Result: exit-code) since Thu 2022-02-17 21:26:45 MSK; 24s ago
     What: /dev/zram1
     Docs: man:fstab(5)
           man:systemd-fstab-generator(8)
[root@hp15 ~]# systemctl status dev-zram2.swap
● dev-zram2.swap - /dev/zram2
   Loaded: loaded (/etc/fstab; generated)
   Active: active (Result: exit-code) since Thu 2022-02-17 21:26:47 MSK; 25s ago
     What: /dev/zram2
     Docs: man:fstab(5)
           man:systemd-fstab-generator(8)
[root@hp15 ~]# systemctl status dev-zram3.swap
● dev-zram3.swap - /dev/zram3
   Loaded: loaded (/etc/fstab; generated)
   Active: active (Result: exit-code) since Thu 2022-02-17 21:26:48 MSK; 26s ago
     What: /dev/zram3
     Docs: man:fstab(5)
           man:systemd-fstab-generator(8)
[root@hp15 ~]# 

У меня подозрение, что systemd по какой-то причине бежит впереди паровоза и пытается активировать zram до того, как он реально создается udev. Как это побороть?

★★★★★

Последнее исправление: Vsevolod-linuxoid (всего исправлений: 2)

А пакета с названием zram-generator в дистрибутиве нет? Через него всё это сильно проще сделать. Но если хочется настроить вручную, то как-то это так выглядит:

# cat /etc/udev/rules.d/90-zram.rules
KERNEL=="zram0", SUBSYSTEM=="block", DRIVER=="", ACTION=="add", ATTR{initstate}=="0", ATTR{disksize}="1G", RUN="/usr/sbin/mkswap /dev/zram0", TAG+="systemd"

# cat /etc/dracut.conf.d/90-zram.conf
install_items+=" /etc/udev/rules.d/90-zram.rules /usr/sbin/mkswap "

# cat /etc/modules-load.d/zram.conf
zram

# cat /etc/fstab
/dev/zram0	   none	swap    defaults,nofail	0	0

anonymous
()
Ответ на: комментарий от anonymous

Большое спасибо, после изменений, что ты подсказал, и регенирации initramfs всё заработало. Ты как нашел, как надо, в Fedora подсмотрел?

[root@hp15 ~]# cat /etc/modules-load.d/zram.conf
zram
[root@hp15 ~]# cat /etc/modprobe.d/zram.conf
options zram num_devices=4
[root@hp15 ~]# cat /etc/udev/rules.d/99-zram.rules
KERNEL=="zram0", SUBSYSTEM=="block", DRIVER=="", ACTION=="add", ATTR{initstate}=="0", ATTR{disksize}="3G", RUN="/usr/sbin/mkswap /dev/zram0", TAG+="systemd"
KERNEL=="zram1", SUBSYSTEM=="block", DRIVER=="", ACTION=="add", ATTR{initstate}=="0", ATTR{disksize}="3G", RUN="/usr/sbin/mkswap /dev/zram1", TAG+="systemd"
KERNEL=="zram2", SUBSYSTEM=="block", DRIVER=="", ACTION=="add", ATTR{initstate}=="0", ATTR{disksize}="3G", RUN="/usr/sbin/mkswap /dev/zram2", TAG+="systemd"
KERNEL=="zram3", SUBSYSTEM=="block", DRIVER=="", ACTION=="add", ATTR{initstate}=="0", ATTR{disksize}="3G", RUN="/usr/sbin/mkswap /dev/zram3", TAG+="systemd"
[root@hp15 ~]# cat /etc/fstab

#
# /etc/fstab
# Created by anaconda on Fri Feb 11 18:30:53 2022
#
# Accessible filesystems, by reference, are maintained under '/dev/disk/'.
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info.
#
# After editing this file, run 'systemctl daemon-reload' to update systemd
# units generated from this file.
#
UUID=a2fde00b-13cd-4228-ac40-3ad995455d84 /                       ext4    defaults,discard        1 1
/dev/zram0 none swap defaults,nofail 0 0
/dev/zram1 none swap defaults,nofail 0 0
/dev/zram2 none swap defaults,nofail 0 0
/dev/zram3 none swap defaults,nofail 0 0
[root@hp15 ~]# cat /etc/dracut.conf.d/99-zram.conf 
install_items+=" /etc/udev/rules.d/99-zram.rules /usr/sbin/mkswap "
[root@hp15 ~]# free -m
              total        used        free      shared  buff/cache   available
Mem:          15705        1445       12549         299        1710       13657
Swap:         12287           0       12287
Vsevolod-linuxoid ★★★★★
() автор топика
Ответ на: комментарий от Vsevolod-linuxoid

Уже не помню. Правило udev здесь на форуме проскакивало, вроде бы. Остальное где-то в инете и методом тыка. Не уверен, что всё сделано бескостыльно.

anonymous
()
Ответ на: комментарий от Vsevolod-linuxoid

а обязательно распихивать инициализацию по разным системам ??
мне вот такой вариант видится
юнит запуска zram, в нем модуль zram загрузить в ExecStartPre
mkswap выполнить в ExecStart

а в *.mount подключения свопов засунуть зависимость After от юнита подключения zram
??

pfg ★★★★★
()
Последнее исправление: pfg (всего исправлений: 2)
Ответ на: комментарий от pfg

Ну можно и так. Хотя можно и ещё проще — элементарный юнит, что просто запускает bash скрипт с командами, что создают и активируют zram.

Но тогда возникает вопрос, а нафига вообще этот systemd и его обвеска нужна… я тут типа всё правильно пытаюсь делать, как заведено в соответствии с современными тенденциями в Linux, а не просто добиться того, чтобы это работало.

Vsevolod-linuxoid ★★★★★
() автор топика
Последнее исправление: Vsevolod-linuxoid (всего исправлений: 2)
Ответ на: комментарий от Vsevolod-linuxoid

Если кому интересно, вот так это в Fedora устроено:

[root@fedora ~]# find / -iname '*zram*' 2>/dev/null -exec file {} \;
/dev/zram0: block special (252/0)
/run/systemd/generator/swap.target.wants/dev-zram0.swap: symbolic link to ../dev-zram0.swap
/run/systemd/generator/dev-zram0.swap: ASCII text
/run/systemd/generator/systemd-zram-setup@zram0.service.d: directory
/run/systemd/units/invocation:dev-zram0.swap: broken symbolic link to c2e543268b33496d8a639116a9837290
/run/systemd/units/invocation:systemd-zram-setup@zram0.service: broken symbolic link to ee8a6b8f43d744b48224263a94223079
/sys/kernel/btf/zram: data
/sys/kernel/debug/block/zram0: directory
/sys/class/block/zram0: symbolic link to ../../devices/virtual/block/zram0
/sys/class/zram-control: directory
/sys/devices/virtual/block/zram0: directory
/sys/fs/cgroup/system.slice/dev-zram0.swap: directory
/sys/fs/cgroup/system.slice/system-systemd\x2dzram\x2dsetup.slice: directory
/sys/block/zram0: symbolic link to ../devices/virtual/block/zram0
/sys/module/zram: directory
/usr/sbin/zramctl: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=e0f7a7a4253e88e2aa6365229093f02485d21ae6, for GNU/Linux 3.2.0, stripped
/usr/lib/systemd/system/systemd-zram-setup@.service: ASCII text
/usr/lib/systemd/system-generators/zram-generator: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=6817070d43ed2e762bd99ea3edc47ff9d308901d, for GNU/Linux 3.2.0, stripped
/usr/lib/systemd/zram-generator.conf: Unicode text, UTF-8 text
/usr/lib/modules/5.16.9-200.fc35.x86_64/kernel/drivers/block/zram: directory
/usr/lib/modules/5.16.9-200.fc35.x86_64/kernel/drivers/block/zram/zram.ko.xz: XZ compressed data, checksum CRC64
/usr/share/licenses/zram-generator: directory
/usr/share/doc/zram-generator: directory
/usr/share/doc/zram-generator/zram-generator.conf.example: Unicode text, UTF-8 text
/usr/share/man/man5/zram-generator.conf.5.gz: gzip compressed data, max compression, from Unix, original size modulo 2^32 8823
/usr/share/man/man8/zram-generator.8.gz: gzip compressed data, max compression, from Unix, original size modulo 2^32 4249
/usr/share/man/man8/zramctl.8.gz: gzip compressed data, max compression, from Unix, original size modulo 2^32 4445
/usr/share/bash-completion/completions/zramctl: ASCII text
[root@fedora ~]# 
[root@fedora ~]# 
[root@fedora ~]# 
[root@fedora ~]# 
[root@fedora ~]# for i in $(find / -iname '*zram*' 2>/dev/null -type f -exec file {} \; | grep text | cut -f 1 -d :); do echo "### FILE: $i"; cat $i; echo "### EOF: $i"; echo ' '; done
### FILE: /run/systemd/generator/dev-zram0.swap
# Automatically generated by /usr/lib/systemd/system-generators/zram-generator

[Unit]
Description=Compressed Swap on /dev/zram0
Documentation=man:zram-generator(8) man:zram-generator.conf(5)
Requires=systemd-zram-setup@zram0.service
After=systemd-zram-setup@zram0.service

[Swap]
What=/dev/zram0
Priority=100
Options=discard
### EOF: /run/systemd/generator/dev-zram0.swap
 
### FILE: /usr/lib/systemd/system/systemd-zram-setup@.service
# SPDX-License-Identifier: MIT
# This file is part of the zram-generator project
# https://github.com/systemd/zram-generator

[Unit]
Description=Create swap on /dev/%i
Documentation=man:zram-generator(8) man:zram-generator.conf(5)
After=dev-%i.device
DefaultDependencies=false

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/lib/systemd/system-generators/zram-generator --setup-device '%i'
ExecStop=/usr/lib/systemd/system-generators/zram-generator --reset-device '%i'
### EOF: /usr/lib/systemd/system/systemd-zram-setup@.service
 
### FILE: /usr/lib/systemd/zram-generator.conf
# This config file enables a /dev/zram0 device with the default settings:
# — size — same as available RAM or 8GB, whichever is less
# — compression — most likely lzo-rle
#
# To disable, uninstall zram-generator-defaults or create empty
# /etc/systemd/zram-generator.conf file.
[zram0]
zram-fraction = 1.0
max-zram-size = 8192
### EOF: /usr/lib/systemd/zram-generator.conf
 
### FILE: /usr/share/doc/zram-generator/zram-generator.conf.example
# This file is part of the zram-generator project
# https://github.com/systemd/zram-generator

[zram0]
# This section describes the settings for /dev/zram0.
#
# The maximum amount of memory (in MiB). If the machine has more RAM
# than this, zram device will not be created.
#
# "host-memory-limit = none" may be used to disable this limit. This
# is also the default.
host-memory-limit = 9048

# The size of the zram device, as a function of MemTotal, both in MB.
# For example, if the machine has 1 GiB, and zram-size=ram/4,
# then the zram device will have 256 MiB.
# Fractions in the range 0.1–0.5 are recommended.
#
# The default is "min(ram / 2, 4096)".
zram-size = min(ram / 10, 2048)

# The compression algorithm to use for the zram device,
# or leave unspecified to keep the kernel default.
compression-algorithm = lzo-rle

# By default, file systems and swap areas are trimmed on-the-go
# by setting "discard".
# Setting this to the empty string clears the option.
options =

# Write incompressible pages to this device,
# as there's no gain from keeping them in RAM
writeback-device = /dev/zvol/tarta-zoot/swap-writeback

# The following options are deprecated, and override zram-size.
# These values would be equivalent to the zram-size setting above.
#zram-fraction = 0.10
#max-zram-size = 2048


[zram1]
# This section describes the settings for /dev/zram1.
#
# host-memory-limit is not specified, so this device will always be created.

# Size the device to a tenth of RAM.
zram-size = ram / 10

# The file system to put on the device. If not specified, ext2 will be used.
fs-type = ext2

# Where to mount the file system. If a mount point is not specified,
# the device will be initialized, but will not be used for anything.
mount-point = /run/compressed-mount-point
### EOF: /usr/share/doc/zram-generator/zram-generator.conf.example
 
### FILE: /usr/share/bash-completion/completions/zramctl
_zramctl_module()
{
	local cur prev OPTS
	COMPREPLY=()
	cur="${COMP_WORDS[COMP_CWORD]}"
	prev="${COMP_WORDS[COMP_CWORD-1]}"
	case $prev in
		'-a'|'--algorithm')
			COMPREPLY=( $(compgen -W "lzo lz4 lz4hc deflate 842" -- $cur) )
			return 0
			;;
		'-o'|'--output')
			local prefix realcur OUTPUT_ALL OUTPUT
			realcur="${cur##*,}"
			prefix="${cur%$realcur}"
			OUTPUT_ALL="NAME DISKSIZE DATA COMPR ALGORITHM
				STREAMS ZERO-PAGES TOTAL MEM-LIMIT MEM-USED
				MIGRATED MOUNTPOINT"
			for WORD in $OUTPUT_ALL; do
				if ! [[ $prefix == *"$WORD"* ]]; then
					OUTPUT="$WORD ${OUTPUT:-""}"
				fi
			done
			compopt -o nospace
			COMPREPLY=( $(compgen -P "$prefix" -W "$OUTPUT" -S ',' -- $realcur) )
			return 0
			;;
		'-s'|'--size')
			COMPREPLY=( $(compgen -W "size" -- $cur) )
			return 0
			;;
		'-t'|'--streams')
			COMPREPLY=( $(compgen -W "number" -- $cur) )
			return 0
			;;
	esac
	case $cur in
		-*)
			OPTS="	--algorithm
				--bytes
				--find
				--noheadings
				--output
				--output-all
				--raw
				--reset
				--size
				--streams
				--help
				--version"
			COMPREPLY=( $(compgen -W "${OPTS[*]}" -- $cur) )
			return 0
			;;
	esac
	local IFS=$'\n'
	compopt -o filenames
	COMPREPLY=( $(compgen -f -- ${cur:-"/dev/zram"}) )
	return 0
}
complete -F _zramctl_module zramctl
### EOF: /usr/share/bash-completion/completions/zramctl
 

Короче, всё на бинарниках в составе модулей systemd, минимум ручных конфигов.

Vsevolod-linuxoid ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.