LINUX.ORG.RU

Удалить модули, использующие данный

 , ,


1

2

Я бы хотел отключить модули, которые указаны в lsmod в колонке Used by для определенного модуля. Причем, естественно, сделать это в правильном порядке.

Сейчас имена модулей просто записаны в массив и отключаются в цикле с помощью modprobe -r ${MODULE}. Но модулей может быть больше в каком-то случае, и тогда неуказанные модули не будут отключены.

Интересует наиболее красивый способ отключить модули, использующие данный.

Строишь дерево зависимостей модулей, удаляешь в правильном порядке. /thread

tiandrey ★★★★★ ()
Ответ на: комментарий от early_britney_fun

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

tiandrey ★★★★★ ()
Ответ на: комментарий от tiandrey

Пускай так:

# lsmod
Module  Size  Used by
a       666   2 b,c
b       222   1 d
c       333   0
d       555   1 e
e       987   0
Строишь дерево, получается:
a
|\
b c
|
d
|
e
DFS примерно такой:
func dfs(a):
  for c in children[a]:
    dfs(c)
  rmmod(a)
Ну и удалит такой DFS в таком порядке: e,d,b,c,a.

tiandrey ★★★★★ ()
Последнее исправление: tiandrey (всего исправлений: 1)
Ответ на: комментарий от tiandrey

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

drm_kms_helper         98304  1 nouveau
ttm                    69632  1 nouveau
drm                   225280  6 ttm,drm_kms_helper,nouveau
Так что и поиск в глубину посложней, и топологическая сортировка необходима.

ABW ★★★★ ()
Ответ на: комментарий от ABW

А, кстати, да, что-то я затупил с деревом. Но зачем всё-таки топсорт? Просто в DFS добавляем проверку, что этот модуль ещё не удалили, и всё.

tiandrey ★★★★★ ()
Последнее исправление: tiandrey (всего исправлений: 1)
Ответ на: комментарий от tiandrey

По сути, ты предлагаешь модифицировать поиск в глубину, чтобы он выдавал не рёбра соответствующего подграфа, а вершины одного из возможных остовных деревьев этого подграфа в порядке концевого обхода (т.е. в обратной польской нотации).
Мне даже кажется, что нетрудно индукцией по шагам доказать, что при отсутствии циклов это то, что нужно. Но:
1) Уже после прочтения первого абзаца TS может меня отправить в игнор или пожаловаться в спецтему (на мат).
2) Ты предлагаешь специализированный алгоритм, корректность которого ещё надо доказывать, тогда как в моём варианте скомбинированы два стандартных, и достаточно убедиться в корректности только реализации лишь одного из них (автору tsort поверим на слово, тем более что он писал его для довольно похожей задачи, см. 'info tsort').
3) Я вот не могу сходу припомнить, чтобы где-то было прямым текстом сказано, что модули не могут иметь циклических зависимостей (или что-либо, откуда это очевидно следует).
4) Скрипт если и станет короче, то ненамного, а скорость в данном случе никого не волнует, её за глаза хватит.
Так что лениво.

ABW ★★★★ ()
Ответ на: комментарий от ABW

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

Чтобы загрузить модуль, нужно, чтобы все символы, которые он использует, были уже загружены. Модули загружаются по одному. Следовательно, не получится загрузить модули, имеющие циклические зависимости.

Более того, никакого «специализированного алгоритма» я не предлагаю, потому что классический DFS как раз-таки предполагает посещение ещё не посещённых вершин, а не рёбер; я выкинул эту проверку только потому, что думал, что там дерево, а в дереве мы всегда будем приходить в ещё не посещённые вершины.

func dfs(a):
  removed[a] = true
  for c in children[a]:
    if not removed[c]:
      dfs(c)
  rmmod(a)

tiandrey ★★★★★ ()
Последнее исправление: tiandrey (всего исправлений: 2)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.