Как упоминалось в комментариях, вы должны строить, используя что-то вроде make -j4
. Используйте число, равное количеству ядер ЦП или немного превышающее его.
Следующие инструкции применимы для сборки ядра из восходящего потока. Лично я считаю это самым простым. Я не знаю, как получить дерево с примененными патчами ubuntu, готовое к такой сборке.
(1) Теоретически, как вы собираете ядра в более разумные промежутки времени для тестирования, как предполагается,
cp /boot/config-`uname -r` .config
вам не нужно включать что-то новое, поэтому - единственная проблема в том, что {{1} } прерывается, если они переименовали материал:
make oldnoconfig
теперь отключают все модули, которые в данный момент не загружены. (Убедитесь, что у вас есть все ваши USB-устройства, которые вам нужны ...):
make localmodconfig
Это сработало у меня недавно, поэтому может быть полезно. Не так хорошо, как в прошлый раз, когда я это пробовал.
Я думаю, что я понял это примерно с одного часа до десяти минут. Даже после make localmodconfig
он по-прежнему создает безумное количество ненужного мне материала. OTOH на самом деле обнаруживает и отключает эти вещи (например, в make xconfig
) тоже занимает некоторое время (и даже дольше, если вы по ошибке отключите то, что вам нужно ).
Думаю, стоит знать, что он существует, но это не гарантирует, что вы будете счастливы.
(2) Я не думаю, что сборка каждой модификации вашего «модуля» займет два часа. (На самом деле он должен быть встроенным, если вы реализуете новый системный вызов). make
просто перекомпилирует ваши измененные файлы и интегрирует их в двоичный файл ядра.Так что, если правильно настроить Kconfig - слишком сложно, тогда, возможно, начальная двухчасовая сборка не так уж и плоха.
У вас может возникнуть эта проблема, если вы собираете дистрибутив с исходным кодом ядра. (Вы можете переключиться на ручную сборку или обмануть исходный пакет дистрибутива, используя ccache
). Или ваши изменения могут быть связаны с изменением файла заголовка, который, к сожалению, включен во многие многие исходные файлы.
Тем не менее, может быть полезно создать собственные Kconfigs, например Kconfigs гораздо меньшего размера, если вы хотите перенести на другие версии ядра, выполните git bisect
, проверьте разные параметры сборки и т. д.
Вы можете использовать эту команду, чтобы узнать, появляется ли строка в некоторых файлах.gz в одной папке:
zgrep the_string *.gz -l
Чтобы сделать это для списка папок, которые находятся в одной папке:
find. -name "*.gz" | xargs zgrep the_string -l
Например, вывод выглядит следующим образом:
./tmp/2/F.tar.gz
./tmp/2/F1.tar.gz
./tmp/1/F.tar.gz
./tmp/1/F1.tar.gz
Теперь вы получаете список файлов, содержащих эту строку.
Учитывая некоторый каталог верхнего уровня -, topdir
, в котором расположены все ваши сжатые файлы, и при условии, что вы используете реализацию GNUzgrep
:
zgrep -R -l -F --include='*.gz' -e 'string' topdir
Это приведет к поиску string
как подстроки в любом изgzip
-сжатых файлов в topdir
и вернет пути ко всем совпадающим файлам.
Используя zgrep
в системе без GNU zgrep
, вы, скорее всего, не сможете использовать --include
. Это может не быть проблемой, если ваш topdir
содержит только сжатые файлы, но если вы хотите искать только файл с суффиксом имени файла .gz
, вы можете сделать
find topdir -type f -name '*.gz' -exec zgrep -l -F -e 'string' {} +
При этом будут найдены все обычные файлы с именами, заканчивающимися на .gz
, в папке topdir
и будет выполняться данная команда zgrep
для как можно большего количества файлов.
Если у вас даже нет zgrep
, вы можете сделать
find topdir -type f -name '*.gz' -exec sh -c '
for pathname do
if gzip -dc "$pathname" | grep -q -F -e 'string'; then
printf "%s\n" "$pathname"
fi
done' sh {} +
При этом каждый файл извлекается и проходит через обычный grep
. Если найдена строка, содержащая заданную строку, печатается путь к файлу.
Обратите внимание, что «внутренний» сценарий оболочки представляет собой цикл, который можно легко изменить для работы со всеми*.gz
-файлами в одном каталоге:
for pathname in./*.gz; do
if gzip -dc "$pathname" | grep -q -F -e 'string'; then
printf "%s\n" "$pathname"
fi
done
Если вы хотите сопоставить string
как полное слово, а не как подстроку, добавьте -w
к вызовам grep
выше. Если string
нужно интерпретировать как регулярное выражение,удалить -F
.
Если вы ищете повторяющиеся строки, которые не известны заранее, вот сценарий, который будет искать повторяющиеся слова в наборе файлов (слово здесь означает все, что имеет пробелы вокруг него):
#!/bin/bash
dup_words() {
zcat $1 | tr ' ' '\n' | sed '/^$/d' | sort | uniq -c | awk '{if ($1 > 1) m=1; } END { exit(!m) } '
}
for i in *.gz
do
dup_words $i && echo $i
done
Он будет разбивать строки при каждом появлении пробела, затем удалять пустые строки, находить и подсчитывать вхождения и, наконец, проверять наличие более одного вхождения.
Цикл просто выводит имя файла, и вы можете настроить действие после &&
по своему усмотрению.
Вы можете использовать эту команду-
zgrep "foo" $(find. -name "*.gz")