LINUX.ORG.RU

Избранные сообщения Imker

Как закалялся шакал: а где можно download more ram?

Статьи — Администрирование

Вступление

Данная статья написана с целью концентрации знаний о сжатии данных оперативной памяти.

Я использую gentoo, поэтому имена пакетов будут приводиться в формате этого дистрибутива.

Подразумевается, что читающий имеет желание и возможность (одно из):

  • произвести конфигурацию и/или сборку ядра;
  • в случае отсутствия искомой функциональности в «ванильном» - найти и использовать ядро, в котором уже всё есть.

zram

zram это, если описать попроще, tmpfs со сжатием.

Необходимо включить zram в ядре: CONFIG_ZRAM=m (или =y, но настоятельно рекомендуется загружать как модуль), либо в menuconfig:

Device Drivers  --->
[*] Block devices  --->
<M>   Compressed RAM block device support

Также стоит обратить внимание на другие доступные опции конфигурации, например - метод компрессии ZRAM_BACKEND_XXX.

Важно заметить, что zram может использоваться как простое блочное устройство и как приоритетный своп, аналогично zswap (см. ниже). В случае последнего необходимо собирать модуль с опцией CONFIG_ZRAM_WRITEBACK, которая позволяет отгружать данные из zram-девайса на ФС.

Наличие zram можно проверить по наличию модуля zram (только если zram собран модулем) или существованию /dev/zramX (если модуль загружен или zram вшит в ядро).

Утилита zramctl входит в состав sys-apps/util-linux (которая, скорее всего, уже стоит в системе), с её помощью можно создать юзабельный zram диск. Описание утилиты можно прочитать на man 8 zramctl.

Одновременно может существовать несколько устройств zram, каждое со своей собственной конфигурацией (объём, путь, права, writeback итд). Для zram есть вспомогательные проекты, например sys-apps/zram-generator и sys-block/zram-init, которые упрощают конфигурацию функциональности, но использовать их не является строгой необходимостью.

Ряд полезных инструкций можно найти тут: арчвики, гентувики.

zswap

zswap представляет из себя прослойку между RAM и swap: вместо простой выгрузки неактивных страниц в своп, сначала они подвергаются компрессии и помещаются в отдельное виртуальное хранилище в оперативной памяти; затем данные страницы выгружаются в своп при нехватке RAM или заполнении данного хранилища и при выгрузке производится декомпрессия.

Необходимо включить zswap в ядре: CONFIG_ZSWAP=y, либо в menuconfig:

Memory Management options  --->
[*] Support for paging of anonymous memory (swap)  --->
[*]   Compressed cache for swap pages

Также стоит обратить внимание на другие доступные опции конфигурации, например - выбрать дефолтные метод компрессии CONFIG_ZSWAP_COMPRESSOR_DEFAULT_XXX и аллокатор CONFIG_ZSWAP_ZPOOL_DEFAULT_XXX.

Проверить сессию на наличие zswap можно несколькими способами:

  1. # dmesg | grep zswap

  2. $ grep -r . /sys/module/zswap/parameters/

Настройку параметров можно производить либо в рантайме (через манипуляцию параметров в /sys/module/zswap/parameters/max_pool_percent), либо в параметрах загрузки ядра. Доступные параметры и их расшифровка описаны здесь: https://docs.kernel.org/admin-guide/mm/zswap.html

Если используешь не очень старую версию htop, то там эта память будет учитываться в общих графах compressed и frontswap.

Если используются одновременно zswap и zram (конкректно для swap), то лучше выбрать что-то одно, особенно при использовании ZRAM_WRITEBACK.

KSM

Kernel Samepage Merging - технология дедупликации одинаковых страниц памяти. Не является непосредственно сжатием, но позволяет получить больше свободной RAM, так что пусть тут будет.

На ядро должен быть наложен патч UKSM.

Необходимо включить KSM в ядре: CONFIG_KSM=y, либо в menuconfig:

Memory Management options  --->
[*] Enable KSM for page merging

Проверить сессию на присутствие и работоспособность KSM можно через проверку в /sys, например:

$ grep -r . /sys/kernel/mm/ksm

Если ядро настроено корректно, то каталог /sys/kernel/mm/ksm должен существовать и значение /sys/kernel/mm/ksm/run быть «1».

Слияние памяти происходит только для процессов, помеченных madvise(). Так как ручками мы делать это не будем, далее стоит установить sys-process/uksmd. Данный демон работает в фоне и производит инициализацию слияния автоматически, достаточно закрепить его в системе как сервис.

Послесловие

Надеюсь, что тебе понравилось читать эту статью настолько же, насколько мне нравилось её писать.

Предложения/исправления/дополнения приветствуются.

Форумчанин @kirill_rrr произвёл бенчмарк разных наборов конфигураций zram, swap и zswap в 2023.

 , , ,

Bfgeshka
()

DNS-Over-QUIC для блокировки рекламы и не только

Статьи — Администрирование
DNS-Over-QUIC для блокировки рекламы и не только

Протокол QUIC, в отличие от UDP поддерживает шифрование и работает быстрее чем TCP, который часто используется для шифрованных DNS-запросов. Данная инструкция актуальная, так как Google все-таки начал удаление поддержки блокировщиков рекламы из своего браузера. Кроме того, она пригодится тем, кто хочет скрыть свое пребывание в Интернете от тотальной слежки.

( читать дальше... )

 , , ,

rtxtxtrx
()

Программы для работы со звуком

Форум — Multimedia

Базовая система коммутации звуковых потоков:

  • Jack Audio Connection Kit - необходимый элемент системы для соединения разных звуковых устройств, музыкальных инструментов, микрофонов, программ для обработки звука.
  • QjackCtl - графический интерфейс для JACK на Qt4
  • Patchage - удобный графический инструмент для коммутации звуковых потоков и устройств, в частности MIDI.
  • KXStudio: Cadence - набор приложений для коммутации аудиопотоков и устройств, управления Jack-сервером, замера уровня сигнала...
  • KXStudio: Carla - хост аудиоплагинов, поддерживает LADSPA (включая LRDF), DSSI, LV2, VST2/3 и AU форматы плагинов,также поддерживаются файлы GIG, SF2 и SFZ. Работает с Jack и ALSA.

Программы для звукозаписи и обработки звука:

  • Audacity - достаточно простой, но удобный инструмент для записи и обработки звука.
  • Ardour - профессиональный инструмент для многоканальной, многодорожечной записи звука, поддерживает несколько разных источников.
  • Qtractor - многодорожечный аудио/MIDI секвенсор.

Гитарные процессоры:

  • Rakarrack - набор гитарных эффектов реального времени, комбиков, кабинетов, усилителей, множество предустановленных вариантов и возможность «накрутить» собственные
  • Guitarix - ещё один набор гитарных эффектов реального времени, комбиков, кабинетов, усилителей, множество предустановленных вариантов и возможность «накрутить» собственные.

Синтезаторы:

  • Amsynth - набор синтезаторов с множеством настроек и предустановок. Ввод нот осуществляется с MIDI-клавиатуры, которую удобно подключить при помощи Patchage
  • LMMS - мультимедийная студия с синтезаторами, секвенсорами, кольцами и эффектами.
  • ZynAddSubFX - набор синтезаторов: реального времени, полифонический, мультитембральный, микротональный. Также набор эффектов для обработки звука. Работает с Jack, поддерживает MIDI, в том числе и подключение MIDI-контроллеров.
  • Yoshimi - форк ZynAddSubFX с усовершенствованиями в направлении работы с Jack и MIDI.

Инструменты для создания трекерной музыки:

  • MilkyTracker - инструмент для создания трекерной музыки.
  • Schism Tracker - инструмент для создания трекерной музыки, основанный на модифицированной версии Modplug - OpenMPT

Драм-машины:

  • Hydrogen - удобная графическая драм-машина.
  • DrumGizmo - драм-машина в виде самостоятельно приложения, также и в виде плагина.

Наборы эффектов для обработки звука:

  • Linux Audio Developer's Simple Plugin API (LADSPA) - классический набор эффектов и алгоритмов для обработки звука, также язык для разработи музыкальных программ.
  • LV2 - следующее поколение LADSPA
  • Calf studio gear - набор эффектов и алгоримов для обработки звука.

Нотные редакторы:

  • TuxGuitar - графический нотный MIDI-редактор, есть возможность вбивать ноты на «гитарном грифе» и «пианино».
  • LilyPond - крайне минималистичный, но очень мощный текстовый «нотный компилятор», часть проекта GNU.
  • Frescobaldi - продвинутый графический интерфейс для LilyPond, удобен возможность работы с мышью
  • Denemo - ещё один продвинутый графический интерфейс для LilyPond
  • Rosegarden - графический нотный редактор и MIDI-секвенсор.
  • FluidSynth - MIDI-синтезатор реального времени без графического интерфейса, работающий по спецификациям SoundFont 2.
  • Qsynth - графический интерфейс для FluidSynth.
  • MidiEditor - простой MIDI-редактор.
  • Musescore - нотный MIDI-редактор с графическим интерфейсом.
  • MusE - MIDI-секвенсор.

Статья на LOR Wiki

 , , , ,

toney
()

Забьют, ведь.

Форум — Desktop

Программа очень простая, ии нет. Делал давно, в рамках ознакомления. С оболочкой больше не играю.

###
### file vars.inc
###

EC='\e[36m' # enable color
DC='\e[0m'  # disable color
maxdb=4 # максимально допустимое количество дуплей (в игре на 4-х не может быть меньше 2)
maxeq=5 # максимально допустимое количество одинаковых (в игре на 4-х не может быть меньше 3)
dbfish=true   # закрывший рыбу дуплем не считается.
dbzerox=true  # один дупль пусто считается за 10
bazar=false # игра с базаром
vii=7 # раздается по семь камней
hundred=50 # игра ведется до 101 или до 51
xiii=13 # минимальная несгораемая сумма (забор)
domino=(00 01 02 03 04 05 06 11 12 13 14 15 16 22 23 24 25 26 33 34 35 36 44 45 46 55 56 66)
score=(0 0)
fence=(0 0)
eggs=0
gamer=('user' 'noob' 'fool' 'pro ') # имена игроков
mover='' # чей ход
super='' # ставщик (кто зашел первым)
state='' # состояние игры (NULL - игра, true - игрок закончил, false - рыба)
snake=() # массив камней на столе
played=() # поставленые камни игроков

###
### file msgs.inc
###

msg_mix="Мешаю..."
msg_ihave="У меня"
msg_yhave="У вас"
msg_bemix="Камни будут перемешаны."
msg_qbmix="Перемешать камни? (y/n)"
msg_maxdb=('0 дуплей' '1 дупль' '2 дупля' '3 дупля.' '4 дупля.' '5 дуплей.' '6 дуплей.' '7 дуплей.')
msg_maxeq=('голых.' 'азов.' 'двоек.' 'троек.' 'четверок.' 'пятерок.' 'шестерок.' 'голых.' 'аза.' 'двойки.' 'тройки.' 'четверки.' 'пятерки.' 'шестерки.')
msg_any_key="Нажмите любую клавишу для продолжения..."
msg_try_again="Попробуйте еще раз"
msg_skip="Проехал."
msg_finish="Закончил."
msg_fish="Рыба."
msg_dbfish="Рыба с отходом."
msg_onfence="на заборе."
msg_score="счёт"
msg_fenсe="забор"
msg_eggs="яйца"
msg_total_score="Общий счет:"

###
### file func.inc
###

f_mixer(){
  
  echo "${msg_mix}"
  echo '----------'

  domino=(00 01 02 03 04 05 06 11 12 13 14 15 16 22 23 24 25 26 33 34 35 36 44 45 46 55 56 66)

  for ((k=0; k<80; ++k)); do
    for i in ${!domino[@]}; do
      r=$((RANDOM % 28))
      t=${domino[$i]}
      domino[$i]=${domino[$r]}
      domino[$r]=${t}
    done
  done

  for ((i=0; i<${#gamer[@]}; ++i)); do # проверка на 5 дуплей
    r=0
    for ((k=i*vii; k<i*vii+vii; ++k)); do
      [[ "${domino[$k]:0:1}" == "${domino[$k]:1:1}" ]] && ((r++))
    done
    [[ ${r} -gt ${maxdb} ]] && break
  done

  if [[ "${i}" -lt "${#gamer[@]}" ]]; then
    echo "${gamer[$i]}: ${domino[@]:${i}*7:7}"
    if [[ "${i}" -ne 0 ]]; then
      echo "${msg_ihave} ${msg_maxdb[$r]} ${msg_bemix}"
      read -rsn1 -p "${msg_any_key}"
      echo -e '\n----------'
      f_mixer
      return
    else
      echo -n "${msg_yhave} ${msg_maxdb[$r]} ${msg_qbmix}"
      while true; do
        read -r -p ":"
        case ${REPLY} in
          [Yy])
            echo '----------'
            f_mixer
            return
            ;;
          [Nn])
            echo '----------'
            break
            ;;
          *) echo -n "${msg_try_again}" ;;
        esac
      done
    fi
  fi

  for ((i=0; i<${#gamer[@]}; ++i)); do # проверка на 6 одинаковых
    for (( t=0; t<7; ++t )); do # азы, двойки, тройки итд
      r=0
      for (( k=i*vii; k<i*vii+vii; ++k)); do
        [[ "${domino[k]:0:1}" == "${t}" ]] && ((++r))
        if [[ "${domino[k]:0:1}" != "${domino[k]:1:1}" ]]; then
          [[ "${domino[k]:1:1}" == "${t}" ]] && ((++r))
        fi
      done
      [[ "${r}" -gt "${maxeq}" ]] && break 2
    done
  done

  if [[ "${i}" -lt "${#gamer[@]}" ]]; then
    [[ "${r}" -lt 5 ]] && (( t+=7 )) # локализация
    echo "${gamer[i]}: ${domino[@]:i*7:7}"
    [[ "${i}" -ne 0 ]] && echo -n "${msg_ihave} " || echo -n "${msg_yhave} "
    echo "${r} ${msg_maxeq[t]} ${msg_bemix}"
    read -rsn1 -p "${msg_any_key}"
    echo -e '\n----------'
    f_mixer
    return
  fi
}

f_0ut(){
  echo -e "${gamer[$mover]}: ${snake[@]}"
}

f_round(){

  local i
  i=${domino[@]:$mover*7:7}
  if [[ -z "${i}" ]]; then
    echo "${gamer[$mover]}: ${msg_finish}"
    state="true"
    return
  fi

  if [[ "${snake[-1]:1:1}" == "${snake[0]:0:1}" ]]; then
    for i in ${domino[@]}; do
      [[ "${snake[-1]:1:1}" == "${i:0:1}" ]] && return
      [[ "${snake[-1]:1:1}" == "${i:1:1}" ]] && return
    done

    state="false"

    if ${dbfish}; then
      if [[ "${snake[-1]:0:1}" == "${snake[-1]:1:1}" ]] || [[ "${snake[0]:0:1}" == "${snake[0]:1:1}" ]]; then
        for (( i=1; i < ${#gamer[@]}; ++i )); do
          if [[ "${played[mover-i]:(-1):1}" ==  "${snake[-1]:1:1}" ]]; then
            (( mover -= i ))
            [[ "${mover}" -lt 0 ]] && (( mover += ${#gamer[@]} )) # избавляемся от минуса
            break
          fi
        done
        echo "${msg_dbfish}"
        return
      fi
    fi

    echo "${msg_fish}"
    return
  fi
}

f_choice(){

  for ((i = 7*mover; i < 7*mover+7; i++)); do
    if [[ ${snake[-1]:1:1} == ${domino[$i]:0:1} ]]; then
      snake+=( "${EC}${domino[$i]}${DC}" )
      played[mover]+=" ${snake[0]:0:1}${domino[$i]}"
      f_0ut
      snake[-1]="${domino[$i]}"
      domino[$i]=''
      break
    elif [[ ${snake[0]:0:1} == ${domino[$i]:0:1} ]]; then
      domino[$i]="${domino[$i]:1:1}${domino[$i]:0:1}"
      snake=( "${EC}${domino[$i]}${DC}" "${snake[@]}" )
      played[mover]+=" ${snake[-1]:1:1}${domino[$i]}"
      f_0ut
      snake[0]="${domino[$i]}"
      domino[$i]=''
      break
    elif [[ ${snake[-1]:1:1} == ${domino[$i]:1:1} ]]; then
      domino[$i]="${domino[$i]:1:1}${domino[$i]:0:1}"
      snake+=( "${EC}${domino[$i]}${DC}" )
      played[mover]+=" ${snake[0]:0:1}${domino[$i]}"
      f_0ut
      snake[-1]="${domino[$i]}"
      domino[$i]=''
      break
    elif [[ ${snake[0]:0:1} == ${domino[$i]:1:1} ]]; then
      snake=( "${EC}${domino[$i]}${DC}" "${snake[@]}" )
      played[mover]+=" ${snake[-1]:1:1}${domino[$i]}"
      f_0ut
      snake[0]="${domino[$i]}"
      domino[$i]=''
      break
    fi
  done
  if [[ ${i} -eq ${mover}*7+7 ]]; then
    echo "${gamer[$mover]}: ${msg_skip}"
    played[mover]+=" ${snake[0]:0:1}${snake[-1]:1:1}-"
  fi
}

###
### file domino.bash
###

#!/bin/bash
 
. vars.inc
. msgs.inc
. func.inc

echo -en "\ec" # очистка терминала
clear

gamer[0]=${USER}

while true; do

  played=()
  snake=()
  state=''

  f_mixer

  (( score[0] + score[1] )) || mover=''

  case ${mover} in #################################################### первый ход
    '')
      for i in ${!domino[@]}; do
        if [[ ${domino[$i]} == 11 ]]; then
          mover=$(( i / 7 ))
          break
        fi
      done
      ;;
    0)
      echo -n ${domino[@]:${mover}*7:7}
      while true; do
        read -r -p ":"
          case $REPLY in
            [0-6][0-6])
              for ((i=0; i<7; i++)); do
                if [[ "${REPLY}" == "${domino[$i]}" ]] || [[ "${REPLY:1:1}${REPLY:0:1}" == "${domino[$i]}" ]]; then
                  domino[$i]="${REPLY}"
                  break 2
                fi
              done
              ;&
            *) echo -n "${msg_try_again}" ;;
          esac
      done
      echo '----------'
      ;;
    [1-3]) i=$((RANDOM % 7 + 7 * mover)) ;;
  esac

  snake+=( "${EC}${domino[$i]}${DC}" )
  played[mover]+=" ${domino[$i]}"
  f_0ut
  snake[-1]="${domino[i]}"
  domino[$i]=''
  super="${mover}"

  while true; do #################################################### игра

    (( ++mover ))
    for (( ; mover < ${#gamer[@]}; ++mover )); do
      f_choice
      f_round
      [[ "${state}" ]] && break 2
    done

    mover=0
    echo '----------'
    echo -n ${domino[@]:mover*vii:vii}

    while true; do
      read -r -p ':'
      case $REPLY in
        [0-6][0-6])
          for ((i=0; i<vii; i++)); do
            if [[ "${REPLY}" == "${domino[$i]}" ]] || [[ "${REPLY:1:1}${REPLY:0:1}" == "${domino[$i]}" ]]; then
              if [[ ${snake[-1]:1:1} == ${REPLY:0:1} ]]; then
                domino[$i]="${REPLY}"
                snake+=( "${EC}${domino[$i]}${DC}" )
                played[mover]+=" ${snake[0]:0:1}${domino[$i]}"
                echo '----------'
                f_0ut
                snake[-1]="${domino[$i]}"
                domino[$i]=''
                break 2
              elif [[ ${snake[0]:0:1} == ${REPLY:0:1} ]]; then
                domino[$i]="${REPLY:1:1}${REPLY:0:1}"
                snake=( "${EC}${domino[$i]}${DC}" "${snake[@]}" )
                played[mover]+=" ${snake[-1]:1:1}${domino[$i]}"
                echo '----------'
                f_0ut
                snake[0]="${domino[$i]}"
                domino[$i]=''
                break 2
              elif [[ ${snake[-1]:1:1} == ${REPLY:1:1} ]]; then
                domino[$i]="${REPLY:1:1}${REPLY:0:1}"
                snake+=( "${EC}${domino[$i]}${DC}" )
                played[mover]+=" ${snake[0]:0:1}${domino[$i]}"
                echo '----------'
                f_0ut
                snake[-1]="${domino[$i]}"
                domino[$i]=''
                break 2
              elif [[ ${snake[0]:0:1} == ${REPLY:1:1} ]]; then
                domino[$i]="${REPLY}"
                snake=( "${EC}${domino[$i]}${DC}" "${snake[@]}" )
                played[mover]+=" ${snake[-1]:1:1}${domino[$i]}"
                echo '----------'
                f_0ut
                snake[0]="${domino[$i]}"
                domino[$i]=''
                break 2
              fi
            fi
          done
          ;;&
        '')
          for ((i=0; i<vii; ++i)); do
            [[ "${snake[-1]:1:1}" == "${domino[$i]:0:1}" ]] && break
            [[ "${snake[0]:0:1}" == "${domino[$i]:0:1}" ]] && break
            [[ "${snake[-1]:1:1}" == "${domino[$i]:1:1}" ]] && break
            [[ "${snake[0]:0:1}" == "${domino[$i]:1:1}" ]] && break
          done
          if [[ "${i}" -eq "${vii}" ]]; then
            echo '----------'
            echo "${gamer[$mover]}: ${msg_skip}"
            played[mover]+=" ${snake[0]:0:1}${snake[-1]:1:1}-"
            break
          fi
          ;&
        *) echo -n "${msg_try_again}" ;;
      esac        
    done

    f_round
    [[ "${state}" ]] && break

  done #################################################### считаем

  played=(0 0 0 0) # сначала считаем всех

  for ((i=0; i<4; i++)); do
    for ((k=0; k<7; k++)); do
      played[$i]=$(( ${domino[7*i+k]:0:1} + ${domino[7*i+k]:1:1} + played[i] ))
    done
  done

  if ${dbzerox}; then
    for ((i=0; i<4; i++)); do
     [[ ${played[i]} -eq 0 ]] && played[$i]=10
    done
  fi

  if ${state}; then # если игрок закончил обнуляем очки
    played[mover-0]=0
    played[mover-2]=0
  else
    echo "${gamer[mover]}:" ${domino[@]:7*(mover-0):7} # если рыба, выводим камни
  fi

  echo "${gamer[mover-2]}:" ${domino[@]:7*(mover-2):7} # выводим всех остальных
  echo "${gamer[mover-1]}:" ${domino[@]:7*(mover-1):7}
  echo "${gamer[mover-3]}:" ${domino[@]:7*(mover-3):7}
  
  if (( (played[0] + played[2]) == (played[1] + played[3]) )); then
    (( eggs+=(played[0] + played[2])*2 ))
    continue
  fi

  (( i = (played[0] + played[2]) > (played[1] + played[3]) ? 0 : 1 )) # индекс пары, набравшей большее кол-во очков

  echo -n "${gamer[i]} + ${gamer[i+2]} = " # вывод проигравшей пары
  
  [[ ${score[i]} -ne 0 ]] && echo -n "${score[i]} + " # выводим, если есть, счет

  [[ ${fence[i]} -ne 0 ]] && echo -n "${fence[i]} + " # вывод забора, если есть

  echo -n "${played[i]} + ${played[i+2]} " # набранные очки

  if [[ ${score[i]} -eq 0 ]] && (( (played[i] + played[i+2]) < xiii )); then # если нет записи и набрали меньше xiii

    (( fence[i] += played[i] + played[i+2] )) # считаем результат на забор

    echo "= ${fence[i]} ${msg_onfence}" # окончательный вывод забора

  else # если есть запись или если нет записи и набрали больше 13, то пишем в счет

    [[ "${eggs}" -ne 0 ]] && echo -n "+ ${eggs}(${msg_eggs}) " # выводим, если есть, яйца

    (( score[i] += played[i] + played[i+2] + fence[i]  + eggs )) # считаем результат

    echo "= ${score[i]}" # выводим окончательный результат

    fence[!i]=0 # и забор противника сгорает
    eggs=0
  
  fi

  echo "${msg_total_score} ${score[0]} : ${score[1]}"

  if [[ ${score[$i]} -gt ${hundred} ]]; then
    [[ ${i} -eq 0 ]] && echo "Вы козёл :-)" || echo "Вам просто повезло."
    break
  fi

  echo '----------'

done

exit 0

 ,

sudoapter
()

Docker сожрал диск

Форум — Admin

Собственно, сабж

root@maumyrtille:~# du -shc /var/lib/docker/*
116K	/var/lib/docker/buildkit
5.4G	/var/lib/docker/containers
4.0K	/var/lib/docker/engine-id
27M	/var/lib/docker/image
236K	/var/lib/docker/network
6.9G	/var/lib/docker/overlay2
469M	/var/lib/docker/plugins
4.0K	/var/lib/docker/runtimes
4.0K	/var/lib/docker/swarm
8.0K	/var/lib/docker/tmp
554M	/var/lib/docker/volumes
14G	total
root@maumyrtille:~# docker system df
TYPE            TOTAL     ACTIVE    SIZE      RECLAIMABLE
Images          22        21        2.842GB   236.8MB (8%)
Containers      25        24        1.212MB   0B (0%)
Local Volumes   19        16        564.3MB   0B (0%)
Build Cache     0         0         0B        0B
root@maumyrtille:~# docker system prune
WARNING! This will remove:
  - all stopped containers
  - all networks not used by at least one container
  - all dangling images
  - unused build cache

Are you sure you want to continue? [y/N] y
Total reclaimed space: 0B

Чем занято более 10 ГБ?

 ,

KivApple
()

Переезжаем на Fish

Статьи — Администрирование
Переезжаем на Fish

Fish — это современный командный интерпретатор, недавно переписанный на Rust, который не требует особой настройки, поддерживая из коробки автодополнение и подсветку синтаксиса. Является лучшим Unix SHELL по версии Slant.

( читать дальше... )

 , ,

rtxtxtrx
()

Какие есть альтернативы pip, чтобы каждый venv не весил гигабайты?

Форум — General

Я устал от этого:

$ du -hs _venv*
7.3G	_venv.llm
7.4G	_venv.owui
7.2G	_venv.sd

Можно же сделать симлинками из какого-то общего "хранилища", но я задолбаюсь делать это вручную. Но не может быть такого, чтобы до меня этого уже не придумали!

В идеале чтобы оно было в репозиториях Debian 12. Ну или хотя бы умело самообновляться.


Решето
Решено

 ,

mord0d
()

Настраиваем для браузера несколько выходов на внешние прокси и удобно переключаемся между ними

Статьи — Desktop

Почему не VPN

Как выяснилось, очень неудобно когда включив на компьютере VPN оказывается, что половина сайтов отказываются работать там, куда он ведёт. В голову пришла идея, что если бы в каждой вкладке браузера были свои уникальные параметры соединения, это был бы идеальный вариант.

Суть решения

Дело в том, что мне нравятся Google Chrome и Microsoft Edge, но вот беда, нормально работать с прокси они не умеют. Поэтому, проведя некоторые изыскания, я смог создать рабочий конфиг на основе privoxy и плагина для упомянутых браузеров Proxy SwitchyOmega.

privoxy обеспечивает socks5-соединение, а Proxy SwitchyOmega даёт возможность менять параметры подключения в любой момент, в том числе – автоматически по выбранному шаблону, при этом может работать с несколькими внешними прокси.

( читать дальше... )

 , , , ,

unclestephen
()

Easy Switcher - переключатель раскладки клавиатуры

Форум — Desktop

Лет 10 у меня на компе жил и работал gxneur. Еще на Ubuntu 20.04 он кое-как работал в ручном режиме, но после недавнего перехода на 22.04 (да, затянул), завести мне его уже не удалось. Пару недель я страдал без переключателя, и в итоге решил написать свой, вот, решил поделиться:

Скачать: https://sourceforge.net/projects/easy-switcher/files/

Реализованы следующие функции:

  • переключение раскладки клавиатуры с корректировкой уже введенного текста.

  • 2 режима корректировки:

      - при нажатии Break корректируется последнее введенное слово.
      - при нажатии Shift + Break корректируется последняя введенная фраза.
    
  • режим настройки.

  • режим отладки.

Программа устанавливается как демон и управляется systemctl. В отличие от xneur, работает не через xkb, а читает устройство ввода с ядра, и поэтому не зависит от графического сервера и рабочего окружения. В теории должна работать на любых ОС с ядром linux, и не будет глючить с выходом обновлений ОС и ДЕ. (время покажет, пока это предположение)

Как работает? Программа ловит нажатия клавиш, а при нажатии Break стирает написанное, меняет раскладку, и пишет заново. Смена раскладки происходит эмуляцией нажатия клавиши, которую нужно прописать в конфиге. Если для смены раскладки вы используете комбинацию клавиш, то нужно в настройках ОС добавить дополнительную клавишу смены раскладки (в kde это можно сделать нативно, а в gnome - например с помощью gnome tweak tool). В моей системе для смены раскладки используется клавиша Win.

Проверялось на Ubuntu 22.04, релиз будем считать альфа, возможны баги.

Устанавливаем пакет, затем:

easy-switcher --configure
easy-switcher --install
systemctl enable easy-switcher
systemctl start easy-switcher

ЗЫ: конфиг лежит здесь: /etc/easy-switcher/default.conf. Пояснения имеются. (первоначально лучше заполнить его с помощью команды easy-switcher –configure)

 ,

freemind
()

Что за тип HASH у пароля из shadow $5hWbgtJAD42g?

Форум — General

Привет

У роутера в shadow файле вот такакой пароль
root:$5hWbgtJAD42g:12571:0:99999:7:::

Что это за тип такой? Согласно мануалу $5 это sha256, но там должно быть $5$.... и значительно длинее...

Это что-то кастомное?

 ,

Spider55
()

Долго сканируется домашняя директория

Форум — Desktop

Здравствуйте!

После того, как я насоздавал много мелких файлов в хомяке (миллион), потом я их конечно удалил, но теперь долго сканируется домашняя директория.

Вывод tune2fs:

Filesystem volume name:   <none>
Last mounted on:          /home
Filesystem UUID:          73c415e9-aa30-417f-9433-6de5b4a8445b
Filesystem magic number:  0xEF53
Filesystem revision #:    1 (dynamic)
Filesystem features:      has_journal ext_attr resize_inode dir_index filetype needs_recovery extent flex_bg sparse_super large_file huge_file dir_nlink extra_isize metadata_csum
Filesystem flags:         signed_directory_hash 
Default mount options:    user_xattr acl
Filesystem state:         clean
Errors behavior:          Continue
Filesystem OS type:       Linux
Inode count:              65847296
Block count:              263370752
Reserved block count:     13168537
Overhead clusters:        4413151
Free blocks:              33788135
Free inodes:              61602633
First block:              0
Block size:               4096
Fragment size:            4096
Reserved GDT blocks:      961
Blocks per group:         32768
Fragments per group:      32768
Inodes per group:         8192
Inode blocks per group:   512
Flex block group size:    16
Filesystem created:       Sat Nov  5 14:21:49 2022
Last mount time:          Mon Jan 27 08:42:02 2025
Last write time:          Mon Jan 27 10:42:37 2025
Mount count:              2
Maximum mount count:      -1
Last checked:             Sun Jan 26 08:26:02 2025
Check interval:           0 (<none>)
Lifetime writes:          7930 GB
Reserved blocks uid:      0 (user root)
Reserved blocks gid:      0 (group root)
First inode:              11
Inode size:               256
Required extra isize:     32
Desired extra isize:      32
Journal inode:            8
First orphan inode:       59568643
Default directory hash:   half_md4
Directory Hash Seed:      3e157277-011c-4847-beec-74ba303676ec
Journal backup:           inode blocks
Checksum type:            crc32c
Checksum:                 0x692d4d48

Вывод ls -l в хомяке:

итого 113484
drwxr-x---  365 dmitriys dmitriys 116183040 янв 27 10:58 dmitriys
drwx------.   2 root     root         16384 ноя  5  2022 lost+found
drwx------   37 dmitriys dmitriys      4096 янв 25 19:45 user

Буду очень благодарен, если поможете соптимизировать директорию. Файловая система ext4.

 

dmitriys
()

Проблема свободного места на диске под UBUNTU

Форум — Admin

Добрый вечер. Столкнулся с проблемой нехватки места на основном дисе. Стоит 1 тр жесткий диск, программ установлено Server Ubuntu 22.04? Posgress и 1C Сервер. Всего на 20 гб. В системе показывает, что свободно 50 гб, 800 гб занято непонятно чем. Пробовал очищать от логов и удаленных файлов, не помогло. может 1с логами заваливает? Папок больше 5-6 гб нет. Может кто подскажет что делать. Просьба не умничать а предложить решение. Я в линуксе новичёк. Спасибо.

 

Essen
()

Хочу говорить про Bash

Форум — General

Для себя уже навалял кучку полезных скриптиков и походу изучения bash периодически их перечитываю, и что-то там допиливаю, но понял, что надо что-то посложнее попробовать и этакое поближе к программированию.

Решил попробовать написать программку, которая удаляет дубликаты строк из .bash_history (там более 7000 строк у меня). Мне это показалось достойной задачкой для начинающего башиста, хотя и (может быть) довольно бесполезной. Кстати, есть такая программа shell-history-cleaner (кажется на расте написана, давно себе собрал, работает, но видимо заброшена автором), я пользуюсь, но попробовать свои силы надо было.

В результате мне удалось сделать задуманное, но хочется поговорить и о «неудачных» вариантах, которые может быть были бы более удачными, если бы я больше знал о bash и linux вообще, так что категорически приветствуется критика и подсказки более правильных решений или каких-нибудь хитростей командной строки.

Так как-то сложилось, что я упорно откладывал изучение массивов на потом, и когда наконец более-менее разобрался с индексированным массивом, то сразу приступил к делу, чтобы заодно закрепить прочитанное в книжках, поэтому первый «неудачный» вариант будет об этом.

Программа рабочая, делает дело, но долго. Мой файл перемалывает за минуту с небольшим, при этом нагружая одно виртуальное ядро процессора на 100%. Зная лоровские нарративы об ущербности bash как языка программирования, я подумал, что вот и столкнулся с подобной ущербностью, поэтому просто искал возможность хоть как-то оптимизировать процесс.

Я не знаю никаких алгоритмов, так что рассудил так: надо взять (последнюю) строку, удалить дубликаты, строку положить в файл и так по кругу.

file=$1
mapfile -t list < <(grep -v '^$' $file)
while ((${#list[*]})); do
    line=${list[-1]}
    unset list[-1\]
    for i in ${!list[*]}; do
        [[ $line == "${list[i]}" ]] &&
            unset list[i\]
    done
    final+=("$line")
done
printf '%s\n' "${final[@]}" | tac > $file

Для таких же любителей как я поясню идею кода. На его краткость отлично повлиял тот факт, что в истории командной строки надо сохранять последние уникальные строки, то есть работать надо с конца файла, а у индексированных массивов как раз есть стабильная ссылка на последний индекс: array[-1]. То есть не надо ничего переворачивать.

Как я понимаю, самое тугое место в скрипте — сравнение строк, и что-то более быстрых вариантов походу нет. Далее надо думать о многопоточности, но я пока до этого не дозрел.

Поскольку на данном этапе я застрял и вроде бы ясно, что тема с массивами как-то всё усложняет, то решил написать скриптик в стиле unix-way, и искренне полагал, что это будет правильным решением задачки, ведь утилиты все написаны суровыми дядьками на Си, и там всё без дураков — быстро и надёжно. Пришла идея отбросить всю эту возню с поиском и удалением, а просто взять всё — и отфильтровать.

file=$1
list=$(tac $file | grep -v '^$')
while [[ $list ]]; do
    read -r line <<< $list
    list=$(grep -Fxv "$line" <<< $list)
    echo "$line"
done | tac > $file

Чтобы уважаемый лорчанин не хельпал ключи -F -x, напомню: F — читает regex буквально, а x — помещает выражение между ^$, иначе пришлось бы использовать ключ -P (perlre) и выражение выглядело бы как говно: "^\Q$line\E$", а работало бы ещё медленней, возможно, но это не точно. (кстати, я был весьма разочарован узнать, что с sed такое вообще не провернуть — никак не заставить подстановку читать буквально).

Итак, на короткой дистанции (разумеется, у меня был короткий вариант файла для тестов) этот скрипт почти в два раза обогнал предыдущий, но — что было для меня полнейшим разочарованием! — он совершенно заткнулся даже на средней дистанции (нагружая процессор на четверть, но размазано по потокам), то есть я его тупо прервал на какой-то там 10-ой минуте, так что о проверке на полном файле речи уже не шло. Как это понимать — не знаю, поясните. 1000 строк он смолол где-то за секунду с небольшим, а 3000 — уже застрял.

Ладно, пока не было новых идей, прочитал главу про ассоциативные массивы и сразу почуял, что это походу то, что мне надо, но я не ожидал, что настолько! Свойство хеша не дублировать индексы как будто специально создано для решения этой задачки. Быстро стало понятно, что надо просто переложить строки из обыкновенного массива в индексы хеша, а в значения хеша — номера индексов строк из обыкновенного массива.

file=$1
mapfile -t list < <(grep -v '^$' $file)
declare -A hash
for i in ${!list[*]}; do
    hash[${list[i]}]=$i
done
for i in "${!hash[@]}"; do
    final[${hash[$i]}]="$i"
done
printf '%s\n' "${final[@]}" > $file

Это было круто! Нет смысла даже говорить о времени выполнения этой программы, она работает почти мгновенно, менее двух десятых секунды.

Получается на bash таки можно что-то программировать и оно может работать быстро.


UPD

Наконец подсказали, что во втором скрипте у меня ошибка: read -r очищает строку от пробельных символов по краям, поэтому grep её не находит и получается бесконечный цикл. Спасибо @mky: Хочу говорить про Bash (комментарий)
Теперь этот скрипт переваривает тот же файл за 15-16 секунд!

file=$1
list=$(tac $file | grep -v '^$')
while [[ $list ]]; do
    IFS=$'\n' read -r line <<< $list
    list=$(grep -Fxve "$line" <<< $list)
    echo "$line"
done | tac > $file

UPD2

Спасибо анону, подкинул идею отфильтровать хешем в один проход: Хочу говорить про Bash (комментарий)

file=$1
mapfile -t list < <(tac $file | grep -v '^$')
declare -A hash
for i in "${list[@]}"; do
    [[ ${hash[$i]} ]] && continue
    hash[$i]=added
    final+=("$i")
done
printf '%s\n' "${final[@]}" | tac > $file

UPD3

Продолжаю благодарить анона, что замотивировал таки раскурить sort. Итак, почти самый шустрый вариант:

file=$1
list=$(< $file \
    grep -vn '^$' |
    tac |
    sort -t: -k2 -u |
    sort -t: -k1,1n |
    cut -d: -f2-)
echo "$list" > $file

На моём компе меньше трёх сотых секунды!


UPD4

Дошли руки до AWK и это походу победитель на скорость в стиле unix-way (анон давал такой рецепт в треде).

file=$1
list=$(tac $file |
    grep -v '^$' |
    awk '!added[$0]++')
tac <<< $list > $file

На моём компе — девять тысячных секунды!

 

papin-aziat
()

Как проверить количество использованного трафика в amazon ec2?

Форум — General

Я создал инстанс t2 micro, недавно узнал что там ограничение трафика в 15гб на месяц. Вопрос, как и где посмотреть сколько уже было использовано данных или сколько осталось?

Может существуют на самом Линуксе программы, которые показывают, сколько ушло с сервера трафика?

 , ,

truebin
()

vokoscreenNG 4.4.0

Новости — Мультимедиа
vokoscreenNG 4.4.0
Группа Мультимедиа

1 января состоялся выпуск vokoscreenNG 4.4.0 — кроссплатформенной программы для записи видео c экрана и веб-камеры. Приложение написано на языке C++ с использованием фреймворка Qt 6.6 и распространяется по лицензии GNU GPLv2.

( читать дальше... )

>>> Больше скриншотов

>>> Список всех изменений

 , , , ,

dataman
()

EasyEffects не нужно, или PipeWire для продвинутых: часть 1

Статьи — Desktop

ВСТУПЛЕНИЕ

Звуковая система PipeWire принесла, без преувеличения, революцию в мир десктопно-мультимедийного Linux. Наконец то эта ОС получила продуманную, сделанную по уму понимающими в теме людьми, и сделанную качественно звуковую систему. Многие ее возможности присутствовали и раньше, в других более старых звуковых системах, но в PipeWire они собраны воедино и сформировали целую единую платформу, на которой можно реализовать огромное количество самых разных задач.

Но в пользовательской среде, эта революция практически не заметна, часто можно встретить мнение вида «ну играет ютуб и играет, мне хватает». Поэтому я решил сделать небольшой цикл статей, посвященный более продвинутому использованию PipeWire, раскрывающему его, без преувеличения, поразительные возможности. (Ну и чтобы изучить их самому в процессе, хехехе).

( читать дальше... )

 , ,

James_Holden
()

Профессиональный видеомонтаж в Davinci Resolve под Linux — начало работы

Статьи — Desktop

Davinci Resolve/Davinci Resolve Studio — это профессиональная проприетарная программа для полного цикла видеомонтажа с обвесом. Прямой конкурент Adobe Premier + After Effects + Audition. Именно так, включает в себя функциональность всех трёх пакетов. Сильные стороны: чуть ли не единственное решение для работы с цветом в принципе, активное использование видеоадаптера, приятная ценовая политика — бесплатной версии хватит всем, платная стоит $300 единоразовым платежом. И конечно поддержка Linux, которой у Adobe кажется будет никогда.

( читать дальше... )

 ,

Dispetcher14
()

MacOS внедряет запрет на запуск стороннего софта

Форум — Talks

Привет, ЛОР!

Не знаю, как местные макоюзеры об этом ещё не отписались, но в общем сабж. Начиная c MacOS 15.1, из системы по-умолчанию убрана поддержка запуска неподписанных программ и, что важно, из настроек убрана даже опция, отключавшая такое поведение. Пока что проверку подписи всё можно можно отключить, выполнив spctl --master-disable из под рута, но общая тенденция показывает, что скоро запуск Emacs на макбуке будет фантастикой, а не реальностью. Такие дела :(

Найдено тут: https://www.osnews.com/story/141055/bug-or-intentional-macos-15-1-completely-removes-ability-to-launch-unsigned-applications/

 , , ,

hateyoufeel
()

Дедупликация в Btrfs

Статьи — Администрирование
Дедупликация в Btrfs

Btrfs — это замечательная файловая система, главными фишками которой являются легковесные снапшоты, реализуемые через Copy-On-Write (COW), и сжатие. Она показала высокую надежность и стабильность, и именно поэтому она включена в ядро Linux. Однако, даже наличие COW не позволяет избежать избыточности данных на уровне блоков.

( читать дальше... )

 ,

rtxtxtrx
()

Готовый рецепт по настройке спящего в ОЗУ (s3) режима на ноутбуке MAIBENBEN x558

Форум — Linux-hardware

По умолчанию ноутбук идет с установленной Ubuntu 22.02 на m2 накопителе. Проблема в том что вроде все работает кроме режима сна (S3) .
Но в этой модели внедрили новинку -режим S0iX ,который сейчас еще плохо потдерживаеться в Linux .По умолчанию при работе на встроенной AMD интегральной карте -при нажатии на кнопку сон -засыпает но не просыпаеться,черный экран,на клавиши вообще не реагирует.

Решение -сносим предустановленный дистрибутив,переходим на более свежую версию *untu LTS 24.04. В свежеустановленном дистрибутиве удаляем установленный по умолчанию пакет xserver-xorg-video-nouveau и возможно xserver-xorg-video-nouveau-hwe-18.04 ,а так как остаються конфликтные libdrm-nouveau2 (их из за зависимостей трудно удалить) вносим в /etc/modprobe.d/ blacklist-nouveau.conf :
blacklist nouveau
options nouveau modeset=0
Также блокируем конфликтный драйвер vesafb. В /etc/modprobe.d/blacklist framebuffer.conf редактируем (убираем #) blacklist vesafb
Разрешаем AMD микрокод чистим файл ,(оставляем пустым) /etc/modprobe.d/amd64-microcode-blacklist.conf .Переписываем загрузочный файл initrd.img ,даем команду от root update-initramfs -u .Перезагружается и затем ставим метапакет nvidia-driver-550-open и все ОБЯЗАТЕЛЬНЫЕ зависимости + пакет switcheroo-control .Через приложения nvidia-settings,nvidia-smi и по желанию любой 3д тест убеждаемся что все работает (при необходимости переключаемся на NVIDIA командой switcherooctl ) и если всё нормально перезагружаемся. Заходим в UEFI и переключаемся на nvidia карточку [dGPU only].
Теперь по идее должно засыпать и просыпаться от кнопки по умолчанию Zz.
На работу вентиляторов не обращайте внимание, отключатся где то через 3-5 минут.

 , ,

maximnik0
()