Как знать то, что кэшируется dm-кэшем?

[Это было записано за несколько лет до широко распространенного принятия журналируемых в systemd системах и не затрагивает его. В настоящее время (в конце 2018) и журналируемый и (r) системный журнал, описанный ниже, используется на дистрибутивах, таких как Debian. На других Вам, вероятно, придется установить rsyslog, если Вы хотите использовать его рядом, но интеграция с журналируемым проста.]

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

Предположение даже корректно, что они записаны для удобства чтения, или они обычно оцениваются и используются другими инструментами?

Я предполагаю, что это зависит от приложения, но в целом, по крайней мере, относительно того, что входит в системный журнал (см. ниже), они должны быть человекочитаемыми. "Значимый для меня" другая проблема, lol. Однако они могут быть также быть структурированными способом, который делает парсинг их со стандартными инструментами (grep, awk, и т.д.) в определенных целях легче.

Anywho, во-первых, существует различие между приложениями, которые делают их собственный вход и приложения, которые используют системный регистратор. Apache по умолчанию - первый, хотя он может быть настроен, чтобы сделать позже (который я думаю, что большинство людей рассмотрело бы нежелательного). Приложения, которые делают их собственный вход, могли сделать так любым способом с помощью любого местоположения для файла (файлов), таким образом, нет очень для высказывания об этом. Системный регистратор обычно упоминается как syslog.

системный журнал

"Системный журнал" является действительно стандартом, который реализован с процессом демона в общем названный syslogd (d, для демона!). Преобладающий демон системного журнала, использующийся в настоящее время на Linux, включая человечность, rsyslogd. Rsyslogd может сделать много, но, как настроено из поля на большинстве дистрибутивов он эмулирует традиционный системный журнал, в котором виды наполняют в файлы простого текста /var/log. Вы могли бы найти документацию для него в /usr/share/doc/rsyslog-doc-[version] (остерегайтесь, существует также a /usr/share/doc/rsyslog-[version], но это - просто уведомления от исходного пакета такой как NEWS и ChangeLog). Если это там, это - HTML, но Exchange Стека не разрешает встраивать локальные ссылки файла:

file://usr/share/doc/rsyslog-doc/index.html

Таким образом, Вы могли попробовать копию, вставляющую это. Если это не там, это может быть часть отдельного пакета, который не установлен. Запросите свою упаковочную систему (например, apt-cache search rsyslog | grep doc).

Конфигурация находится в /etc/rsyslog.conf, который имеет страницу руководства, man rsyslog.conf, хотя, в то время как страница руководства делает прекрасную ссылку, это может быть менее проницаемо как введение. К счастью, основные принципы запаса rsyslog.conf соответствуют тем из традиционного syslog.conf, для которого существует много введений и учебных руководств вокруг. Этот, например; что Вы хотите отнять у этого, взаимодействуя в Вашем локальном rsyslog.conf, понимание средств, и приоритеты ("приоритет" иногда упоминается как loglevel), так как это часть вышеупомянутого стандарта системного журнала. Причина этот стандарт важен, состоит в том, потому что rsyslog на самом деле получает свой материал через ядро, и что реализует ядро, стандарт.

Относительно $ директивы в rsyslog.conf, это rsyslog конкретный и если Вы установите тот дополнительный пакет документа, то Вы найдете руководство по ним в rsyslog_conf_global.html.

Весело проведите время..., если Вам любопытно на предмет того, как приложения используют системный регистратор, посмотрите на man logger и man 3 syslog.

Вращение журнала

Нормативное средство вращения журналов через названный инструмент logrotate (и существует a man logrotate). Нормативный метод использования logrotate через демона крона, хотя это не должно быть сделано тот путь (например, если Вы склонны выключать свой рабочий стол каждый день, Вы могли бы также просто сделать это однажды при начальной загрузке, прежде чем системный журнал запустится, но, очевидно, после того, как файловая система смонтирована rw).

Существует хорошее введение в logrotate здесь. Обратите внимание, что logrotate не только для материала системного журнала, он может использоваться с любым файлом вообще. Основной конфигурационный файл /etc/logrotate.conf, но так как конфигурация имеет "включать" директиву, обычно большая часть материала входит в отдельные файлы в /etc/logrotate.d каталог (здесь d для каталога, не демона; logrotate не является демоном).

Важная вещь рассмотреть при использовании logrotate состоит в том, как приложение будет реагировать, когда его файл журнала будет "повернут" - другими словами, перемещенный - в то время как приложение работает. WRT (r) syslogd, это просто прекратит писать в тот журнал (я думаю, что существует выравнивание безопасности для этого). Обычный способ иметь дело с этим состоит в том, чтобы сказать системному журналу перезапускать (и вновь открыть все его файлы), который является, почему Вы будете видеть a postrotate директива в logrotate conf файлы, отправляющие SIGHUP демону системного журнала.

10
04.04.2019, 21:38
1 ответ

Согласно документации ядра , dm-cacheимеет метаданные, которые представляют собой одно семейство с тонкими -метаданными обеспечения:

The target reuses the metadata library used in the thin-provisioning library.

Таким образом, вы можете использовать пакет thin-provisioning-tools, который предоставляет cache_dump.

Однако использование этого инструмента не очень простое. README предлагает сначала сделать снимок устройства , но даже в этом случае я не смог заставить его работать вообще.

# cache_dump /dev/mapper/foo-bar_cmeta
syscall 'open' failed: Device or resource busy
Note: you cannot run this tool with these options on live metadata.

Так что вместо этого я сделал что-то странное:

# cp /dev/mapper/foo-bar_cmeta /dev/shm
# losetup --find --show /dev/shm/foo-bar_cmeta
/dev/loop1
# cache_dump /dev/loop1

Результат:

<superblock uuid="" block_size="128" nr_cache_blocks="16384" policy="smq" hint_width="4">
  <mappings>
    <mapping cache_block="0" origin_block="163832" dirty="false"/>
    <mapping cache_block="1" origin_block="163833" dirty="false"/>
    <mapping cache_block="2" origin_block="163834" dirty="false"/>
   ...
    <mapping cache_block="5295" origin_block="16568" dirty="false"/>
    <mapping cache_block="5296" origin_block="16569" dirty="false"/>
    <mapping cache_block="5297" origin_block="16570" dirty="false"/>

Итак, что мы имеем здесь. Предполагается, что размер блока «128» (секторов ), а первый блок («0» )в кэш-устройстве идентичен блоку «163832» исходного устройства. Давайте проверим, есть ли в этом вообще смысл.

Для<mapping cache_block="0" origin_block="163832" dirty="false"/>:

# hexdump -C --skip $((512*128*0)) -n 32 /dev/mapper/foo-bar_cdata 
00000000  61 51 a3 09 88 ad 72 f8  6a 90 7f 93 fd 64 c0 c3  |aQ....r.j....d..|
00000010  e4 01 c5 cf e1 ba 37 53  d0 d8 06 cf 3a da d8 2d  |......7S....:..-|
00000020
# hexdump -C --skip $((512*128*163832)) -n 32 /dev/mapper/foo-bar_corig 
27ff80000  61 51 a3 09 88 ad 72 f8  6a 90 7f 93 fd 64 c0 c3  |aQ....r.j....d..|
27ff80010  e4 01 c5 cf e1 ba 37 53  d0 d8 06 cf 3a da d8 2d  |......7S....:..-|
27ff80020

Для<mapping cache_block="5297" origin_block="16570" dirty="false"/>:

# hexdump -C --skip $((512*128*5297)) -n 32 /dev/mapper/foo-bar_cdata 
14b10000  68 72 65 61 64 5d 3a 20  56 2f 6e 73 48 74 74 70  |hread]: V/nsHttp|
14b10010  20 30 30 30 30 33 44 31  30 3a 20 30 33 20 44 37  | 00003D10: 03 D7|
14b10020
# hexdump -C --skip $((512*128*16570)) -n 32 /dev/mapper/foo-bar_corig 
40ba0000  68 72 65 61 64 5d 3a 20  56 2f 6e 73 48 74 74 70  |hread]: V/nsHttp|
40ba0010  20 30 30 30 30 33 44 31  30 3a 20 30 33 20 44 37  | 00003D10: 03 D7|
40ba0020

По-моему, неплохо. В остальном все то же старое "выяснить, где какой файл". Это можно сделать с помощью инструментов filefrag, hdparm --fibmapили файловой системы -, таких как debugfs icheck.Такой же старый, к сожалению, не значит простой...

Это очень глупый, очень ручной подход:

# echo $((512*128*16570/4096))
265120
# filefrag -v -e *
[...]
File size of firefox-network.log-main.2270 is 605582660 (147848 blocks of 4096 bytes)
 ext:     logical_offset:        physical_offset: length:   expected: flags:
   0:        0..  147847:     163856..    311703: 147848:             last,eof

265120находится внутри 163856..311703, так что это файл! Или это?

# hexdump -C --skip $((512*128*16570-163856*4096)) -n 32 firefox-network.log-main.2270 
18b90000  68 72 65 61 64 5d 3a 20  56 2f 6e 73 48 74 74 70  |hread]: V/nsHttp|
18b90010  20 30 30 30 30 33 44 31  30 3a 20 30 33 20 44 37  | 00003D10: 03 D7|
18b90020

ДНК совпадает, время работает, все совпадает.

Of course I care about a practical solution: How can I list what is currently in dm-cache?

К сожалению, это не очень практично, пока вы не пропишете каждый шаг этого пути. Я не смог найти готовый ---скрипт для его использования. Так что все, что я могу предложить вам на данный момент, это необходимые ингредиенты. Извините:-)

1
27.01.2020, 20:03

Теги

Похожие вопросы