Rootfs и путаница с ядром

Простой сценарий оболочки для добавления строк из файла newdataв datafile. Должно быть просто изменить newdataна здесь -doc. На самом деле это не очень эффективно, так как вызывает grepдля каждой (новой )строки ввода:

target=datafile
while IFS= read -r line ; do
    if ! grep -Fqxe "$line" "$target" ; then
        printf "%s\n" "$line" >> "$target"
    fi
done < newdata 

Для каждой строки мы используем grep, чтобы узнать, существует ли она уже в целевом файле, -Fдля фиксированного, -совпадения строки, (без регулярных выражений, ), -xдля полного совпадения строки, и -qдля подавления вывода совпадающих строк. grepвозвращает ложный код ошибки, если не находит совпадающую строку, поэтому добавляет к целевому файлу, если отрицательный результат верен.


Более эффективно, в awk. Это зависит от того, что awkможет обрабатывать произвольные строки как ключи к массиву.

$ awk 'FNR == NR { lines[$0] = 1; next } ! ($0 in lines) {print}' datafile newdata 

Первая часть FNR == NR { lines[$0] = 1; next }загружает все строки первого входного файла в качестве ключей в (ассоциативный )массив lines. Вторая часть ! ($0 in lines) {print}работает со следующими входными строками и печатает строку, если ее нет в массиве, то есть «новые» строки.

Результирующий вывод содержит только новые строки, поэтому его необходимо добавить к исходному файлу, например. сsponge:

$ awk 'FNR == NR { lines[$0] = 1; next } ! ($0 in lines) {print}' datafile newdata | sponge -a datafile

Или мы могли бы awkдобавить строки к последней строке, для этого просто нужно передать имя файла вawk:

$ target=datafile 
$ awk -vtarget="$target" 'FNR == NR { lines[$0] = 1; next } 
                        ! ($0 in lines) {print >> target}' "$target" newdata

Чтобы использовать здесь -документ с awk, нам нужно добавить-(stdin )в качестве явного исходного файла, в дополнение к настройке перенаправления,такawk... "$target" - <<EOF

2
08.01.2019, 00:11
2 ответа

The kernel is RAM-resident executable code. The rootfs is the essential filesystem for the system (initially a ramfs or tmpfs), but more often is used to refer to a collection of files in a filesystem of some type (e.g. ramfs, ext2/3/4, jffs2, ubifs) that consist of essential initialization and userspace programs. Both are needed to boot a Linux system.

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

0
27.01.2020, 22:29

Старые загрузчики могли монтировать только примитивные файловые системы, поэтому ядро ​​оставалось при загрузке, а ОС — в корневом каталоге. Одним из способов предотвращения некоторых типов сбоев из-за переполненной файловой системы является создание для каждой вещи собственной файловой системы. Еще одним удобством использования нескольких разделов является то, что их можно легко создавать резервные копии и восстанавливать по отдельности. Некоторые файловые системы, такие как ZFS, BTRFS, LVM? не поддерживаются загрузчиками, которые сами не используют ядро ​​Linux.

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

Таким образом, дистрибутив ОС должен решить, на какой обмен -пойти.

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

0
27.01.2020, 22:29

Теги

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