Ярлыки

gentoo (19) kde (7) btrfs (5) nvidia (4) portage (3) zfs (3) clementine (2) compiz (2) fs (2) kernel (2) windows (2) zram (2) сеть (2) bash (1) chattr (1) conky (1) cow (1) cpufreq (1) cryptsetup (1) dns (1) dnsmasq (1) dolphin (1) emerald (1) ext4 (1) f2fs (1) ffmpeg (1) firefox (1) kdm (1) kexec (1) kvm (1) lsattr (1) lvm (1) networkmanager (1) noop (1) openrc (1) pulseaudio (1) qemu (1) qtcurve (1) ram (1) reiserfs (1) s2ram (1) samba (1) sed (1) ssd (1) systemd (1) tmpfs (1) vlc (1) webdav (1) zcache (1) игры (1) шифрование (1)

Отключение/включение CoW для отдельных файлов и каталогов на Btrfs

Btrfs способна управлять механизмом CoW (Copy-on-Write, копирование при записи, на этом механизме основаны такие функции, как снапшоты и дедупликация) пофайлово, на уровне атрибутов файла.

Чтобы просмотреть состояние CoW, нужно воспользоваться командой lsattr:

# lsattr /usr/lib64/libacl.so
---------------- /usr/lib64/libacl.so
 # lsattr -d /usr/lib64
---------------- /usr/lib64
Здесь  включен CoW. А здесь CoW выключен:

 # lsattr /repo
---------------C /repo/gentoo
---------------C /repo/locus
---------------C /repo/frozen
---------------C /repo/stuff
---------------C /repo/zugaina
---------------C /repo/mozilla
---------------C /repo/qt
---------------C /repo/kde
 Чтобы выключить CoW, используется такая команда:

# chattr +C /home/fragment/.local/share/baloo/index
# chattr -R +C /depo/kernel
Включение, соответственно, происходит с обратным флагом -C.
Отключать CoW имеет смысл на файлах и каталогах, в которые идёт частая запись мелких порций данных (базы данных, образы виртуальных машин, каталоги с деревом исходников, и т.д.)

Использование kexec с Nvidia и Btrfs

kexec позволяет не перезагружать компьютер полностью, а сразу перейти к загрузке ядра и так далее по списку. Есть целых три пути использования kexec:
  1. Утилита kexec напрямую.
  2. Вызов утилиты kexec через юнит systemd.
  3. Встроенная в systemd реализация kexec.
Для первых двух способов требуется установка пакета:
$ emerge -av kexec-tools
С проприетарным видеодрайвером nvidia-drivers есть проблема: если выполнить kexec прямо из графической оболочки, то загруженная система виснет и не реагирует на мышь и клавиатуру. Поэтому перед использованием kexec необходимо перейти в текстовую консоль, остановить графический сеанс и выгрузить видеодрайвер:
$ systemctl stop sddm
$ rmmod nvidia
После этого можно приступать к перезагрузке в новую систему. Утилита kexec в качестве аргументов принимает путь к ядру, путь к initrd и опции командной строки ядра (cmdline). Если используются тома Btrfs, то нужно учесть, что новая система должна загрузиться из своего тома. В конечном итоге команда может выглядеть так:
$ kexec -l /boot/vmlinuz-4.3.0-gentoo --command-line="root=/dev/sda2 rootflags=subvol=root/November2015,compress=lzo quiet"
И загрузка нового корня:
$ kexec -e

Игры на видеокарте с пассивным охлаждением

При игре на видеокарте Nvidia GeForce GT630 с пассивным охлаждением температура видеочипа быстро подбиралась к критическим 90 градусам. Можно было попробовать прицепить к радиатору какую-нибудь вертушку, но куда проще было решить проблему программными средствами.

На всех более-менее современных видеокартах Nvidia есть несколько режимов работы. Их, как минимум, два: режим энергосбережения и режим максимальной производительности. Различаются они максимальными частотами видеочипа и видеопамяти (nvclock и memclock).

# nvidia-settings --query GPUPerfModes

  Attribute 'GPUPerfModes' (locus:0.0): perf=0, nvclock=135, nvclockmin=135, nvclockmax=405,
  nvclockeditable=0, memclock=405, memclockmin=405, memclockmax=405, memclockeditable=0,
  memTransferRate=810, memTransferRatemin=810, memTransferRatemax=810, memTransferRateeditable=0
  ; perf=1, nvclock=135, nvclockmin=135, nvclockmax=901, nvclockeditable=1, memclock=800,
  memclockmin=800, memclockmax=800, memclockeditable=1, memTransferRate=1600,
  memTransferRatemin=1600, memTransferRatemax=1600, memTransferRateeditable=1
  Attribute 'GPUPerfModes' (locus:0[gpu:0]): perf=0, nvclock=135, nvclockmin=135, nvclockmax=405,
  nvclockeditable=0, memclock=405, memclockmin=405, memclockmax=405, memclockeditable=0,
  memTransferRate=810, memTransferRatemin=810, memTransferRatemax=810, memTransferRateeditable=0
  ; perf=1, nvclock=135, nvclockmin=135, nvclockmax=901, nvclockeditable=1, memclock=800,
  memclockmin=800, memclockmax=800, memclockeditable=1, memTransferRate=1600,
  memTransferRatemin=1600, memTransferRatemax=1600, memTransferRateeditable=1
Здесь видно, что данная видеокарта может работать на максимальных частотах в 405 МГц nvclock и 810 Мгц memclock в режиме энергосбережения, и на 901 МГц nvclock и 1600 МГц memclock в режиме максимальной производительности. Естественно, в 3D-играх видеокарта переходит в режим максимальной производительности, поднимая частоты, что и приводит к усиленному нагреву.

Утилиты Nvidia не позволяют установить произвольные частоты для видеочипа и видеопамяти. Поэтому приходится действовать хитрее: нужно заставить видеокарту всегда работать в режиме энергосбережения. Однако через утилиты Nvidia нельзя даже принудительно установить энергосберегающий режим. Но сделать это можно через файлы конфигурации Xorg - достаточно добавить в секцию "Device" 2 строчки:
Option         "Coolbits" "13"
Option         "RegistryDwords" "PowerMizerEnable=0x1; PerfLevelSrc=0x2222; PowerMizerLevel=0x3; PowerMizerDefault=0x3; PowerMizerDefaultAC=0x3"

 После этого видеокарта начнёт работать в режиме энергосбережения. Вот только постоянные скачки частот от минимальных к максимальным ощутимо просаживают производительность даже в работе с оконным менеджером KWin. Поэтому лучше зафиксировать частоты на максимально возможных для энергосберегающего режима (здесь это 405 МГц nvclock и 810 МГц memclock).  Это можно сделать уже в утилите Nvidia:


Чтобы не делать это после каждого логина вручную, достаточно поместить в автозагрузку KDE такой скрипт:
#!/bin/bash

nvidia-settings --assign [gpu:0]/GPUPowerMizerMode=1

exit 0

Паттерны Bash

Взять первый символ переменной:
${var:0:1}
Взять переменную без первого символа:
${var:1}
Удалить все пробелы и табуляции с обеих сторон:
sed 's/^[ \t]*//;s/[ \t]*$//'
Взять находящееся между двойными кавычками:
sed -e 's/.*"\(.*\)".*/\1/'
 Поместить default_text в считываемую переменную:
read -i default_text -e readed_var
Взять вторую строку:
sed -n '2p'
Добавить переменную (аналог echo >>):
sed '$a'$string''
Взять из переменной подстроку до символа @:
${var%@*}
Взять из переменной подстроку после символа @:
${var#*@} 
Добавить символы в начало строки:
sed 's/^/symbols/' 

Несколько замечаний по ZRam

Рабочие опции создания и монтирования ФС:
  • Ext4 mkfs: -m0 -O ^huge_file,sparse_super,extent,^uninit_bg,dir_nlink,extra_isize,^has_journal
  • Ext4 mount: -o noatime,nobarrier,nouser_xattr,noacl,discard
  • BtrFS mkfs: -M -O mixed-bg
  • BtrFS mount: -o nodatacow,noatime,noacl,nobarrier,notreelog,nodatasum,ssd,discard
  • ReiserFS mkfs: -s 0
  • ReiserFS mount: -o nolog,noatime,notail,noacl,noattrs
Попробовать F2FS так и не получилось - mount не мог обнаружить корректную ФС на первых суперблоках.

Без опции discard начинались странности с занятым местом - zramctl рапортовал о десятках мегабайтов занятого места, а Dolphin, KSysGuard и Conky показывали, что счёт шёл на гигабайты. Midnight Commander вообще при любом раскладе показывает, что разделы ZRam полностью заняты:



Сравнительная скорость разных ФС на ZRam: разницы практически нет. В качестве теста запускался emerge amarok (2.8.0-r3).

  • Ext4: merge time: 2 minutes and 34 seconds
  • ReiserFS: merge time: 2 minutes and 36 seconds
  • BtrFS: merge time: 2 minutes and 36 seconds
В качестве постоянной ФС была оставлена Ext4.

ZRAM вместо tmpfs

При наличии мощных многоядерных процессоров и охочих до памяти программ возникает логичная идея ужать занимаемую память. В ядре Linux для этого существуют два механизма: ZSwap и ZRam. Первый сжимает страницы памяти, уходящие в своп, а второй предназначен для создания в оперативной памяти полноценных разделов с обычными файловыми системами. Особенность ZRam в том, что данные, записываемые на такие разделы, сжимаются на лету быстрыми алгоритмами lzo или lz4.

Активация ZRam в ядре:



После этого можно установить скрипты и юниты для systemd:
# emerge -av zram-init
К услугам пользователя - 3 юнита systemd: для свопа, для /tmp и для /var/tmp. По дефолту в юнитах количество потоков сжатия/распаковки равно 2, поэтому при наличии процессора с большим количеством ядер стоит соответственно увеличить этот показатель. За количество потоков отвечает ключ -s:
ExecStart=/usr/sbin/zram-init -d1 -s8 -alz4 -text4 -ostrictatime -m1777 2048 /tmp
Как видно, по умолчанию используется алгоритм сжатия lz4 - очень быстрый и удачный алгоритм.

После этого останется только активировать загрузку нужных юнитов (здесь своп не был активирован):
# systemctl enable zram_tmp.service
# systemctl enable zram_var_tmp.service
И после перезагрузки можно убедиться, что ZRam задействован вместо традиционной tmpfs:


Здесь видно, что в /var/tmp данные сжатые более, чем в 2 раза: столбец DATA отображает размер несжатых данных, столбец TOTAL показывает фактическое занимаемое данными место. С данными в /tmp ситуация хуже - там, в числе прочего, располагается кэш Chromium с его массой несжимаемых данных вроде картинок.

Можно попробовать собрать какой-нибудь пакет в ZRam. Например, Amarok.


Что ж, сборочные файлы сжимаются в 2 раза. Отражается ли это на скорости сборки пакета?

# genlop -t amarok
 * media-sound/amarok

     Sat Sep 12 18:29:56 2015 >>> media-sound/amarok-2.8.0-r3
       merge time: 2 minutes and 38 seconds.

     Tue Oct  6 23:09:05 2015 >>> media-sound/amarok-2.8.0-r3
       merge time: 2 minutes and 35 seconds.
Удивительно, но дополнительная нагрузка на процессор - сжатие всё-таки небесплатно обходится - никак не отразилась на времени сборки пакета.

Btrfs: дедупликация

Начиная с ядра 3.12 файловая система Btrfs научилась дедупликации. Грубо говоря, это выявление идентичных файлов и замена всех копий ссылкой на оригинал. Пока что дедупликация в Btrfs доступна только offline-типа, т.е. её нужно запускать вручную (на примонтированных разделах).

Утилита дедупликации находится в пакете bedup, причём дерево содержит только live-версию.

emerge -av bedup
И можно приступать к дедупликации. Изначально картина занятого места выглядела так:
locus fragment # zone df /
Space on /:
Data, single: total=43.01GiB, used=22.02GiB
System, single: total=4.00MiB, used=12.00KiB
Metadata, single: total=6.01GiB, used=1.41GiB
Дедупликация:
locus fragment # bedup dedup
Not scanning /zone, generation is still 30093
Not scanning /wine, generation is still 674
Not scanning /zone/frag, generation is still 65542
Not scanning /zone/frag/orig, generation is still 65542
Not scanning /repo, generation is still 73635
Not scanning /usr/src, generation is still 73818
Not scanning /zone/fragment, generation is still 73649
Not scanning /zone/fragment/orig, generation is still 49571
Not scanning /zone/fragment/update-1, generation is still 56067
Scanning volume /home/fragment generations from 75392 to 75634, with size cutoff 8388608
00.00 Scanned  retained 0/usr/lib64/python3.2/site-packages/cffi/vengine_cpy.py:166: UserWarning: reimporting '_cffi__xb792897axfdd60368' might overwrite older definitions
  % (self.verifier.get_module_name()))
00.05 Scanned 13843 retained 0
Not scanning /zone/fragment/20:11:37-10.11.2013, generation is still 65631
Not scanning /zone/fragment/first, generation is still 29238
Not scanning /zone/fragment/kde-4.11.3, generation is still 73823
Scanning volume /zone/root generations from 73649 to 75416, with size cutoff 8388608
00.00 Scanned 14 retained 0
Not scanning /zone/root/kde-4.11.3, generation is still 73824
Not scanning /zone/root/20:11:37-10.11.2013, generation is still 65632
Not scanning /zone/root/orig, generation is still 49572
Scanning volume / generations from 75393 to 75628, with size cutoff 8388608
00.01 Scanned 3654 retained 0
Not scanning /zone/root/update-1, generation is still 61063
Not scanning /zone/root/first, generation is still 30214
Deduplicating filesystem {8807f8ef-bb17-4c9a-b55b-89533a11d979}
File '.kde4/share/apps/nepomuk/repository/main/data/virtuosobackend/soprano-virtuoso.db' is in use, skipping
Deduplicated:
- '/zone/root/orig/usr/share/icons/oxygen/icon-theme.cache'
- '/zone/root/first/usr/share/icons/oxygen/icon-theme.cache'
Deduplicated:
- '/zone/root/orig/usr/share/icons/oxygen/icon-theme.cache'
- '/zone/root/update-1/usr/share/icons/oxygen/icon-theme.cache'
Deduplicated:
- '/zone/root/orig/usr/share/icons/oxygen/icon-theme.cache'
- '/zone/root/kde-4.11.3/usr/share/icons/oxygen/icon-theme.cache'
Deduplicated:
- '/zone/root/orig/usr/share/icons/oxygen/icon-theme.cache'
- '/zone/root/20:11:37-10.11.2013/usr/share/icons/oxygen/icon-theme.cache'
Deduplicated:
- '/zone/root/orig/usr/share/icons/oxygen/icon-theme.cache'
- '/usr/share/icons/oxygen/icon-theme.cache'
Deduplicated:
- '/zone/root/first/opt/vmware/lib/vmware/isoimages/windows.iso'
- '/zone/root/kde-4.11.3/opt/vmware/lib/vmware/isoimages/windows.iso'
И так далее. Конец:
Deduplicated:
- '/zone/root/kde-4.11.3/opt/vmware/lib/vmware/icu/icudt44l.dat'
- '/zone/root/20:11:37-10.11.2013/opt/vmware/lib/vmware/icu/icudt44l.dat'
Deduplicated:
- "/zone/frag/orig/My Games/clean Sid Meier's Civilization 5 clean/cache/Civ5BaseLocalizationDatabase.db"
- "/zone/frag/orig/My Games/clean Sid Meier's Civilization 5 clean/cache/Civ5LocalizationDatabase.db"
Deduplicated:
- '/opt/vmware/lib/vmware/lib/libvmwarebase.so.0/libvmwarebase.so.0'
- '/zone/root/20:11:37-10.11.2013/opt/vmware/lib/vmware/lib/libvmwarebase.so.0/libvmwarebase.so.0'
02:04.9 Size group 157/157 (8388608) sampled 804 hashed 471 freed 6481671739
00.01 Committing tracking state
Сам процесс не то, чтобы быстрый, но и утомительно медленным его назвать тоже нельзя.
И сколько же места сэкономлено?
locus fragment # zone df /
Space on /:
Data, single: total=43.01GiB, used=20.32GiB
System, single: total=4.00MiB, used=12.00KiB
Metadata, single: total=6.01GiB, used=1.41GiB
Почти что два гигабайта. Мелочь, а приятно. Всё же в корне системы и профилях пользователей немного простора для дедупликации, а вот на хранилище виртуальных машин эффект должен быть более поразительным.

Повышение плавности отрисовки

При использовании compiz есть возможность улучшить качество отрисовки графики. Нужно в настройках снять галку "Detect Refresh Rate", а показатель "Refresh Rate" выставить в два раза больший частоты обновления монитора:



Чисто субъективно плавность отрисовки ощутимо улучшается.

Создание зашифрованного раздела на переносном HDD

Логично было бы архивировать важные данные на переносной HDD, но ещё логичнее было бы защитить их от постороннего доступа. Это можно сделать путём создания шифрованного раздела. Итак, есть переносной HDD с двумя разделами: первый (/dev/sde1) отформатирован в NTFS для переноса всякой чепухи, а второй (/dev/sde2) будет выполнять функцию шифрованного хранилища бэкапов.

Сначала желательно забить будущий шифрованный раздел нулями:
dd if=/dev/zero of=/dev/sde2
Для пущей надёжности рекомендуют забивать псевдослучайной чепухой из /dev/urandom, но это чрезвычайно долгий процесс.

Инициализация:
cryptsetup luksFormat /dev/sde2
Подключение:
cryptsetup luksOpen /dev/sde2 cryptback
Создание ФС:
mkfs.ext4 /dev/mapper/cryptback
Отключение раздела:
cryptsetup luksClose /dev/mapper/cryptback
 Теперь при щелчке по зашифрованному разделу в плазмоиде подключаемых устройств будет появляться окно запроса пароля:



Выполнение скрипта при выходе из suspend2ram

При выходе из s2ram права доступа на файлы текущей частоты ядер процессора сбрасываются на дефолтные (то есть, пользователь не может их даже читать), в результате Conky показывает на месте частот пустоту. Чтобы починить это, следует в каталоге /usr/lib/pm-utils/sleep.d создать файл скрипта, назвав его, к примеру, 110cpu_freq_chmod, с таким содержанием:

#!/bin/sh

case "$1" in   
    resume    )    /etc/local.d/cpu_freq_chmod.start
                ;;
    *    )        exit $NA
                ;;
esac
И не забыть, естественно, выставить бит исполняемости:
chmod +x /usr/lib/pm-utils/sleep.d/110cpu_freq_chmod

Недочёты KDE, часть 2

Работа Dolphin с Webdav

При копировании файла на сетевое хранилище через webdav прогрессбар сразу доходит до конца, а потом висит, пока файл не закачается по-настоящему: