Как перечислить все файлы, используемые во время начальной загрузки Linux

  1. Установка alacarte программа.
  2. Запустите эту программу (ее имя Main Menu).
  3. В соответствующей категории Menu от панели правой стороны добавляют Ваш пункт меню затмения (путем представления значка, имени и команды)
  4. Теперь оболочка гнома показывает, что Ваше руководство установило затмение в своем поиске, и можно искать его или добавить его к фавориту легко.

Это работает на установленную программу всего руководства в оболочке гнома.

7
14.04.2014, 17:29
4 ответа

Благодаря поддержке RHEL было обнаружено ясное решение. Это основано на systemtap использовании модуля ядра. Заключенный в кавычки отсюда до избегают гнили ссылки. И еще раз спасибо за весь Ваш совет :)

Я даже не мог предположить, что systemtap может запуститься даже перед init сценарием и отследить процесс начальной загрузки. Я очень ценю Red Hat Поддержка и лично Pushpendra Chavan для справки с этим идеальным инструментом (к сожалению, я не знаю разработчиков, которым принадлежит этот метод точно - иначе я кредитовал бы их во-первых).

Таким образом, мы должны создать два простых сценария:

bootinit.sh:

#!/bin/sh


# Use tmpfs to collect data
/bin/echo "Mounting tmpfs to /tmp/stap/data"
/bin/mount -n -t tmpfs -o size=40M none /tmp/stap/data

# Start systemtap daemon & probe
/bin/echo "Loading bootprobe2.ko in the background. Pid is :"
/usr/bin/staprun \
    /root/bootprobe2.ko \
    -o /root/bootprobe2.log -D

# Give daemon time to start collecting...
/bin/echo "Sleeping a bit.."
sleep 5

# Hand off to real init
/bin/echo "Starting."
exec /sbin/init 3

и bootprobe2.1.stp записанный во встроенном systemtap языке сценариев:

global ident

function get_usertime:long() {
  return task_utime() + @cast(task_current(), "task_struct", "kernel<linux/sched.h>")->signal->utime;
}

function get_systime:long() {
 return task_stime() + @cast(task_current(), "task_struct", "kernel<linux/sched.h>")->signal->stime;
}

function timestamp() {
  return sprintf("%d %s", gettimeofday_s(), ident[pid()])
}

function proc() {
  return sprintf("%d \(%s\)", pid(), execname())
}  

function push(pid, ppid) {
   ident[ppid] = indent(1)
   ident[pid] = sprintf("%s", ident[ppid])
}

function pop(pid) {
  delete ident[pid]
} 

probe syscall.fork.return {
  ret = $return
  printf("%s %s forks %d  \n", timestamp(), proc(), ret)
  push(ret, pid())
}

probe syscall.execve {
  printf("%s %s execs %s \n", timestamp(), proc(), filename)
}

probe syscall.open {
  if ($flags & 1) {
    printf("%s %s writes %s \n", timestamp(), proc(), filename)
  } else {
    printf("%s %s reads %s \n", timestamp(), proc(), filename)
  }
} 

probe syscall.exit {
  printf("%s %s exit with user %d sys %d \n", timestamp(), proc(), get_usertime(), get_systime())
  pop(pid())
}
<linux sched.h=""><linux sched.h="">
</linux></linux>

Для получения списка файлов, к которым получают доступ во время процесса начальной загрузки в systemtap формате журнала, мы должны реализовать следующее:

Загрузите и установите ПРАВИЛЬНО именованные версии systemtap и kernel debuginfo пакеты (мне дали эту ссылку, но необходимо использовать это, если Вы находитесь на CentOS);

Создать /tmp/stap и /tmp/stap/data

mkdir -p /tmp/stap/data

Место bootprobe2.1.stp и bootinit.sh в /root и сделайте их исполняемым файлом: chmod +x/root/boot*

Править bootinit.sh и измените 'должностное лицо/sbin/init 3 ' на 'должностное лицо/sbin/init 5 ', если 5 Ваше значение по умолчанию runlevel.

Создайте .ko модуль из bootprobe2.stp

 cd /root
 stap bootprobe2.1.stp -m bootprobe2 -p4

Перезагрузка.

Останов grub (нажмите Esc или Shift), и нажмите на ядре по умолчанию. В конце ядра строка вводит следующее и нажимает Enter:

init=/root/bootinit.sh,

Нормальная начальная загрузка возобновится. После входа в систему, kill stapio процесс, копия bootprobe2.log из tmpfs /tmp/stap/data каталог и размонтирование это.

killall stapio
cp /tmp/stap/data/bootprobe2.log /tmp/stap/
umount /tmp/stap/data  

Теперь проверьте файл /tmp/stap/bootprobe2.log файл для списка всех файлов, которые читаются во время начальной загрузки.

1
27.01.2020, 20:17

Настройте контрольную подсистему для записи вызовов к open.

auditctl -a exit,always -S open,openat,creat,execve

Сделайте это от initramfs, так, чтобы правило существовало когда основная система (/sbin/init в реальной корневой файловой системе), запускается.

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

Если загрузочный носитель защищен внешне так, чтобы корень не мог изменить его (например, потому что это только для чтения или под эксклюзивным управлением безопасного загрузчика), и если загрузка модулей ядра заблокирована, то измерение файлов может быть надежным, если это сделало правильно. Однако, если все, что Вы делаете с мерами, сравнивает их со ссылочными значениями, это более трудно и менее эффективно, чем использование защищенной от целостности корневой файловой системы (т.е. на практике на dmcrypt с Доверяемой Личинкой для загрузчика).

7
27.01.2020, 20:17
  • 1
    Можно хотеть зарегистрироваться openat и execve также (по крайней мере). Теперь это также зависит, что предназначено используемым и файлом, поскольку может случиться так, что также необходимо зарегистрироваться creat, truncate, access, stat, mkdir, connect... –  Stéphane Chazelas 07.11.2013, 00:58
  • 2
    Вы могли дать некоторые дополнительные объяснения методам, которые Вы упомянули? Куда эта строка кода должна быть помещена? Я должен разархивировать,/boot/initramfs-xxxxx.img реконфигурировали его и возвращаются, это к / загружается как archieve? –  Vitaly Isaev 25.11.2013, 13:07
  • 3
    @VitalyIsaev, я не знаю initramfs структуру Redhat. Если бы это - что-нибудь как Debian, Вы добавили бы сценарий где-нибудь под /usr/share/initramfs-tools (путь может отличаться на RH), затем восстановите initramfs (на Debian, который это update-initramfs) и перезагрузка. –  Gilles 'SO- stop being evil' 25.11.2013, 14:12

Хорошее стартовое место было бы /etc/rci.d где i число, представляющее runlevel, в который Вы загружаетесь. Например, если Ваш сервер является бездисплейным, i обычно будет 3. Взгляд под /etc/rc3.d покажет, какие сервисы запускаются, когда Вы загружаетесь в runlevel 3.

1
27.01.2020, 20:17
  • 1
    ! Но каковы дальнейшие шаги? Как я могу отследить действие сервисов, указанных в/etc/rc.d (=, получают список файлов, к которым они получают доступ)? –  Vitaly Isaev 06.11.2013, 13:31
  • 2
    RHEL6 является выскочкой, базирующейся также... –  jirib 07.11.2013, 00:14
  • 3
    @JiriXichtkniha исправьте меня, если я неправ, но не делаю upstart- базирующиеся init системы используют /etc/rci.d схема каталога также? –  Joseph R. 07.11.2013, 00:18
  • 4
    Да у них есть совместимость с прежними системами, как у них есть "рычаг" для вызова сценариев :) –  jirib 07.11.2013, 00:42

Удостовериться atime включен для Вашего корня и файловых систем начальной загрузки в Вашем ядре (или это noatime не установлен), затем после начальной загрузки Вас может использовать stat проверять время доступа на каждый файл и видеть, к которым получили доступ во время начальной загрузки.

1
27.01.2020, 20:17
  • 1
    Вы могли объяснить, как я могу сделать это? Мой fstab не имеет никакой noatime опции, но время доступа все еще не записано в метаданные –  Vitaly Isaev 25.11.2013, 12:44

Теги

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