Структура файла журнала Linux изменяется для использования с KST

Есть еще один, и удивительно малоизвестный источник ненужных записей на диске в мире линукса. И это незаслуженно быстрая запись в кэш.

Вы можете сделать это гораздо реже, если запишите в /etc/sysctl.conf:

vm.dirty_background_ratio = 20
vm.dirty_expire_centisecs = 360000
vm.dirty_writeback_centisecs = 360000

На ваших файловых системах используйте ext4 (ext3 делает гораздо больше синхронизации жесткого диска), и подмонтируйте его следующими флагами (например, строка fstab):

/dev/sda1 / ext4 defaults,noatime,commit=4780,barrier=0,data=writeback,nobarrier,max_batch_time=0 0 1

При подкачке используйте большой раздел подкачки (2 раза от вашего физического тарана - даже в текущее время). ) Если у вас несколько разделов с данными (например, система и дом, или windows и linux), то сделайте раздел подкачки между ними, до середины диска.

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

Зашифрованные файловые системы не требуют большого объема дискового пространства. Они перегружают процессор, а не диск. Использованный диск точно так же, как если бы он не был зашифрован, но операции чтения и записи также требуют некоторых (не очень) дополнительных вычислений на процессоре. Таким образом, LUKS не является проблемой

.
1
24.10.2014, 01:20
1 ответ

Я переосмыслил свой подход и решил, что использование старого пространства H было проще и надежнее. Когда вы упоминаете о разделителях файлов на табуляциях, а не на пробелах, простое решение - использовать класс символов, а не буквальный пробел. Что касается классов, то они могут иметь тенденцию становиться немного громоздкими, поэтому я обычно предпочитаю заключать их в замену, когда я их использую. Я также упакую ее в одну простую команду, заключив ее в функцию оболочки.

Здесь снова все по-другому:

#!/bin/sh
robot() (s=[:blank:];LC_ALL=C \
    sed "s/^[$s].*[$s]//;s/\.\.*/./g
    /[$s][^i$]*[^1-9d]*[d$s]*/!{H;\$!d
    };   s//,/;x;s///;s/\n//g
         s/,\.\([-1-9]*\)0*//
         s//,\1/g;s//,+.\1/g" "$@" 
)
robot "$@"            

Если верхняя и нижняя строки удалены из приведенного выше, их можно скопировать / вставить в работающую POSIX-совместимую оболочку, которая включает POSIX-совместимую sed в $ PATH . В противном случае вышеуказанное можно дословно записать в исполняемый файл в $ PATH . В любом случае, я могу назвать это так же, как INPUT | robot или robot или robot infile1 infile [2-9] - . Например:

robot <<\DATA
20:06:57.049686 IP (tos 0x0, ttl 64, id 26871, offset 0, flags [DF], proto UDP (17), length 68)
    e108-193.eduroam.tugraz.ac.at.34225 > e158-093.eduroam.tugraz.ac.at.personal-agent: [udp sum ok] UDP, length 40
    0x0000:  4500 0044 68f7 4000 4011 25c7 8083 d0bf  E..Dh.@.@.%.....
    0x0010:  8083 da24 85b1 15b3 0030 1e8b 3132 3033  ...$.....0..1203
    0x0020:  3132 2e37 3836 3036 2c20 332c 2020 2030  12.78606,.3,...0
    0x0030:  2e31 3533 2c20 2d30 2e31 3533 2c20 2039  .153,.-0.153,..9
    0x0040:  2e39 3630                                .960
DATA

В то время как старая версия печатала ...

20:06:57.049686,26871,.0.120312.78606,.3,.0.153,-0.153,.9.960

Эта печатает ...

20:06:57.049686,26871,120312.78606,+.153,-.153,9.960

Теперь она удаляет ведущие .dots или нули из различных полей и удаляет ложное поле .3 , полученное ранее, которое не было включено в ваш вывод. Он также добавляет знаки + к выходным данным для полей, которые могут начинаться с -тире .

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

Символьный класс [: blank:] соответствует любому горизонтальному пробельному символу, как определено локалью, и поэтому это может быть пробел или табуляция, и это не будет иметь никакого значения. И, думая о локали, я решил явно указать здесь локаль C , поскольку это всегда наиболее разумная вещь при обработке текста - в локали C каждый входной байт гарантирован чтобы соответствовать одному символу (что может много значить для sed , когда он делает что-то вроде . * ) . Однако любое состояние, определенное в функции, является локальным только для функции и не влияет на среду выполнения, кроме вывода на stdout .

FLOW:

В первой строке скрипта sed удалит последовательность символов с первого по последний встречающийся [[: blank:]] if строка начинается с единицы. Затем он также заменяет любую серию .dot s одним .dot .

Следующая строка немного волосатая. Это единственный адрес, созданный для обработки нескольких поэтапных s /// ubstitutions, использующих пустой адрес для ссылки на последний непустой адрес в сценарии.

/[$s][^i$]*[^d1-9]*[d$s]*/

Единственным определенным совпадением в адресе является по крайней мере один пробел - все другие последовательности в пределах соответствия ноль * или более вхождений - и поэтому он не может соответствовать строка, в которой вообще нет пробелов.Это означает, что он соответствует только заголовкам блоков, потому что мы только что удалили все пробелы из любой строки, начинающейся с единицы.

Итак, первое, что я делаю, это сравниваю его с не-строки заголовка и поместите их в старое пространство H , если они есть ! не соответствует ему и $! D удаляет всех, которые соответствуют ! , а не последний $ из вывода. Таким образом, последняя строка $ здесь выпадает, чтобы быть объединенной со всеми заголовками блоков для оставшейся части скрипта, потому что с этого момента только эти строки, к которым sed буду применять любые правила.

Сравните этот адрес со строкой заголовка:

20:06:57.049686 IP (tos 0x0, ttl 64, id 26871, offset 0, flags [DF], proto UDP (17), length 68)
  • [$ s] - соответствует первому пробелу - непосредственно перед IP .
  • [^ i $] * - соответствует 64, [[: blank:]] .
  • [^ d1-9] * - соответствует i`.
  • [d $ s] * - соответствует d и [[: blank:]]

Итак, когда Я делаю s //, / все это заменяю запятой. Это не влияет на последнюю строку, которую мы просто пропустили, потому что она не может соответствовать ведущему [[: blank:]] . И даже если бы это было так, любые изменения не имели бы значения, потому что для последней строки единственная распечатанная копия - это та, которая ждет нас в H старом пространстве, с которым мы работаем только после e x изменение. Это следующая команда, которая применяется повсеместно, и теперь мы работаем с пространством шаблонов, которое выглядит примерно так ...

20:06:57.049686,26871, offset 0, flags [DF], proto UDP (17), length 6\
8)\n40\nE.Dh.@.@.%.\n.$.0.1203\n12.78606,.3,.0\n.153,.-0.153,.9\n.960$

...который представляет собой изменения, уже примененные к заголовку предыдущего блока и всем строкам, которые были полем H с тех пор - как вы можете видеть, разделенные \ n ewline там экранируются.

Давайте снова сравним это с нашим длинным адресом:

  • [$ s] - соответствует первому [[: blank:]] происходит непосредственно перед смещением .
  • [^ i $] * - соответствует полностью до первого встречающегося символа $ , но не включая его.
  • [^ d1-9] * - соответствует .0. .
  • [d $ s] * - вообще ничего не соответствует.

Как и раньше, s /// стирает все это. После удаления всех \ n ewlines, например s / \ n // g , теперь пространство шаблонов выглядит так:

20:06:57.049686,26871,120312.78606,.3,.0.153,.-0.153,.9.960

... это почти то место, где его оставила старая версия . Но мне нравились рекурсивные совпадения, поэтому я немного добавил. Вы не должны, хотя я, вероятно, мог бы сделать это лучше, поскольку я нахожу в нем дыры, этот последний бит, вероятно, лучше сделать во втором фильтре со свежим скриптом, нацеленным на csv. Тем не менее, он определенно работает с примером ввода и, вероятно, будет работать с другими, но я подумал, что в любом случае могу отказаться от него, если это не так или если он работает, но не соответствует вашим ожиданиям. Последние две строки можно легко удалить, чтобы получить результат, соответствующий тому, который вы приняли, когда проверили этот ответ - как показано выше.

s/,\.\([-1-9]*\)0*//

При этом удаляется первая встречающаяся последовательность , запятая , за которой следует .dot , затем ноль или более -тире или числа, которые не равны нулю и любые конечные нули. Это удаляет поле ,. 3 из вывода.

Применяется второй раз с лобовым флагом g и сохранением \ 1 от удаления, как s //, \ 1 / , и он преобразует:

20:06:57.049686,26871,120312.78606,.0.153,.-0.153,.9.960

... в ...

20:06:57.049686,26871,120312.78606,.153,-.153,9.960

Еще раз применил g локально с добавленным +. как s //,+./ g , и он дополнительно изменяет пространство шаблонов, чтобы читать:

20:06:57.049686,26871,120312.78606,+.153,-.153,9.960

... который затем автоматически печатается в stdout перед sed начинает цикл следующей строки.

Если кто-то из читателей действительно зашел так далеко и ему интересно, что я имею в виду под старой версией, вы найдете это и подробное объяснение того, как это работает, в истории редактирования.

Подавая этот скрипт всем своим примером ввод получает:

20:06:57.049686,26871,120312.78606,+.153,-.153,9.960
20:06:57.113591,26872,120312.83611,-.153,-.460,9.960
20:06:57.188105,26873,120312.88615,-.153,-.306,9.807
20:06:57.200719,26874,120312.93615,+.153,-.153,9.807
2
27.01.2020, 23:37

Теги

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