Содержание
Настройка среды
Чтобы создать минималистичную и настраиваемую среду, я решил собрать ядро из исходного кода (kernel.org) и скомпилировать свои собственные
Следующие переменные должны быть установлены, чтобы следовать этому руководству:
Установка QEMU
Просто следуйте командной строке, соответствующей вашему дистрибутиву, здесь.
Компиляция ядра
Чтобы загрузить исходный код ядра, перейдите на kernel.org и найдите нужную версию. В этом посте я буду использовать 4.20 (ссылка).
После извлечения архива для минимальной конфигурации используйте make правило
Затем включите следующие параметры:
В зависимости от эксплойта или того, что мы хотим протестировать на этом ядре, вы можете отключить следующие контрмеры:
После того, как конфигурация установлена и настроена так, как вы хотите, скомпилируйте ядро:
Теперь протестируйте новое скомпилированное ядро с помощью QEMU, используя следующую строку (
Эта
ARM
Ядро может быть скомпилировано для любой архитектуры, включая ARM, с использованием цепочки инструментов, это включает в себя экспорт следующих переменных перед компиляцией ядра (возможно, вам придется настроить цепочку инструментов):
Компиляция buildroot
Пришло время скомпилировать initramfs с помощью некоторых утилит bin/sbin, включая
Установите следующие параметры:
Создайте каталог
Добавляем пользователей
В текущей конфигурации будет создан только пользователь root без пароля. Чтобы создать обычного пользователя и обновить пароль root, нам нужно создать файлы
Пароли, соответствующие предыдущим хешам:
Если вы хотите сгенерировать собственный хеш для нового пользователя или изменить предыдущих, используйте следующую команду:
Соответственно обновите
Наконец, создайте домашнюю страницу пользователя и установите разрешения для таблицы устройств.
Добавляем модули ядра
Чтобы добавить модули, скомпилированные на этапе ядра, в файловую систему, мы можем использовать каталог
Доделываем
Как только все будет готово, скомпилируйте bootroot (первая компиляция займет несколько минут):
Тестируем среду
Как уже упоминалось, если вы скомпилируете buildroot с файловой системой
Чтобы решить эту проблему, у вас есть 2 варианта:
Если вы хотите использовать временную систему, замените строку
После запуска ядра мы можем подключиться к нему с помощью root или user и соответствующего пароля через ssh.
Компилируем бинарные файлы
Поскольку мы указали
После того, как вы скомпилировали двоичный файл, вы можете загрузить его через
Отлаживаем бинарные файлы
Мы можем использовать
Отлаживаем ядро
Для отладки ядра мы можем добавить
Затем на хосте мы можем загрузить двоичный файл
Если мы запустим gdb из каталога исходного кода linux, мы сможем перечислить исходный код и разбить его на
Компилируем модули
Используйте следующий Makefile для компиляции модуля с именем
Затем мы можем загрузить скомпилированный
Отлаживаем модули ядра
Как только ядро загружено (подтвердите это с помощью
Затем мы можем сопоставить модуль с сеансом gdb, который мы подключили к заглушке QEMU, следующим образом:
Мы также можем указать сегменты, вручную взятые из
Снапшоты
Чтобы быстро восстановить состояние vm (полезно при тестировании эксплойта ядра), нам нужно преобразовать наш образ
Чтобы управлять виртуальной машиной, нам нужно добавить флаг монитора QEMU и изменить файл диска на
После добавления этих параметров мы можем подключиться к монитору QEMU через порт
Ориентируемся в коде ядра
Более простой способ - создать файл
Дополние:
Теперь я использую
SystemTap
Вы можете кросс-скомпилировать stap с вашего хоста и загрузить его в виртуальную машину, выполнив следующие действия:
Вам нужно будет установить на гостевой машине
Затем мы можем выполнить
И, наконец, создайте образ
Вы всегда можете изменить его размер позже:
Запустите наше скомпилированное ядро с загрузкой Ubuntu:
Теперь у вас есть полностью работающее настраиваемое ядро Linux с менеджером пакетов и некоторыми другими инструментами.
Если во время загрузки отображаются ошибки, это связано с несоответствием конфигурации ядра. Вы можете получить конфигурацию из
Вы также можете скомпилировать ядро ubuntu, используя этот метод вики и загрузив нужную версию ядра из основного репозитория здесь.
ARM
Для ARM процесс аналогичен:
Нам нужно проделать те же шаги, что описаны в обычном ubuntu. На этот раз для chroot в загрузочную среду нам понадобится
Теперь мы можем выполнить
Обратите внимание, как на этот раз
И, наконец, создайте образ
Вы всегда можете изменить его размер позже:
Запустите наше скомпилированное ядро с помощью начальной загрузки Ubuntu ARM (я рекомендую использовать более одного процессора с
От ТС
Эта статья статья, является переводом. Оригинал доступен тут
Тема эксплуатации ядра линукса для меня новая, поэтому в переводе могут быть ошибки. Кроме того, я давно ничего не переводил для форума
Перевод:
Azrv3l cпециально для xss.pro
- Настройка среды
- Установка QEMU
- Компиляция ядра
- ARM
- Компиляция buildroot
- Добавляем пользователей
- Добавляем модули ядра
- Доделываем
- Тестируем среду
- Компилируем бинарные файлы
- Отлаживаем бинарные файлы
- Отлаживаем ядро
- Компилируем модули
- Отлаживаем модули ядра
- Снапшоты
- Ориентируемся в коде ядра
- SystemTap
- Компилируем бинарные файлы
- Ubuntu initramfs
- ARM
Настройка среды
Чтобы создать минималистичную и настраиваемую среду, я решил собрать ядро из исходного кода (kernel.org) и скомпилировать свои собственные
initramfs, используя buildroot (buildroot.org) с поддержкой busybox (busybox.net). Для эмуляции всей системы я решил использовать QEMU (QEMU.org).Следующие переменные должны быть установлены, чтобы следовать этому руководству:
Код:
export BUILD_PATH="/your/path/build/environment"
mkdir -p $BUILD_PATH
Установка QEMU
Просто следуйте командной строке, соответствующей вашему дистрибутиву, здесь.
Компиляция ядра
Чтобы загрузить исходный код ядра, перейдите на kernel.org и найдите нужную версию. В этом посте я буду использовать 4.20 (ссылка).
После извлечения архива для минимальной конфигурации используйте make правило
allnoconfig. В этом случае я собираюсь использовать опцию defconfig, чтобы получить полностью работающее ядро, а затем добавить некоторые пользовательские настройки.
Код:
cd $BUILD_PATH
wget -O- https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.20.tar.gz | tar -xzv
mv linux-4.20 linux
cd linux
ARCH=x86_64 make defconfig
#
# конфигурация записанная в .config
#
make menuconfig
Затем включите следующие параметры:
Чтобы легко ориентироваться, нажмите первую букву параметра. Для поиска нажмите/и введите свой шаблон поиска. Когда появятся результаты, нажмите номер, показанный слева от параметра, чтобы перейти к нему.
Код:
# Debugging
Kernel hacking ---> Compile-time checks and compiler options ---> Compile the kernel with debug info ---> yes
Kernel hacking ---> Compile-time checks and compiler options ---> Provide GDB scripts for kernel debugging ---> yes
General setup ---> Configure standard kernel features ---> yes
General setup ---> Configure standard kernel features ---> Load all symbols for debugging/ksymoops ---> yes
General setup ---> Configure standard kernel features ---> Include all symbols in kallsyms ---> yes
# Only if 64 bits is selected
Binary Emulations ---> IA32 a.out support ---> yes
Binary Emulations ---> IA32 ABI for 64-bit mode ---> yes
# Make sure the following options are enabled:
General setup ---> Initial RAM filesystem and RAM disk (initramfs/initrd) support ---> yes
General setup ---> Configure standard kernel features ---> Multiple users, groups and capabilities support ---> yes
General setup ---> Configure standard kernel features ---> Sysfs syscall support ---> yes
Device Drivers ---> Generic Driver Options ---> Maintain a devtmpfs filesystem to mount at /dev ---> yes
Device Drivers ---> Generic Driver Options ---> Automount devtmpfs at /dev, after the kernel mounted the rootfs ---> yes
Device Drivers ---> Character devices ---> Enable TTY ---> yes
Device Drivers ---> Character devices ---> Serial drivers ---> 8250/16550 and compatible serial support ---> yes
Device Drivers ---> Character devices ---> Serial drivers ---> Console on 8250/16550 and compatible serial port ---> yes
File systems ---> Pseudo filesystems ---> /proc file system support ---> yes
File systems ---> Pseudo filesystems ---> sysfs file system support ---> yes
Я рекомендовал компилировать ядро с опцией KASan и без нее для отладки.Kernel hacking ---> Memory Debugging ---> KASan: runtime memory debugger ---> yes
В зависимости от эксплойта или того, что мы хотим протестировать на этом ядре, вы можете отключить следующие контрмеры:
Код:
# Allocations at NULL to allow nullptr de-reference
Memory Management options ---> Low address space to protect from user allocation ---> 0
# SMAP disabled
Processor type and features ---> Supervisor Mode Access Prevention ---> no
# KASL, can be disabled by setting nokaslr in the bootloader cmdline
Processor type and features ---> Build a relocatable kernel ---> no
# Canary disabled
General architecture-dependent options ---> Stack Protector buffer overflow detection ---> no
После того, как конфигурация установлена и настроена так, как вы хотите, скомпилируйте ядро:
Код:
nproc
8
time ARCH=x86_64 make -j 8
(...)
real 2m52.923s
user 2m32.595s
sys 0m20.537s
Теперь протестируйте новое скомпилированное ядро с помощью QEMU, используя следующую строку (
<Ctrl>a + x для выхода):
Код:
qemu-system-x86_64 -kernel arch/x86_64/boot/bzImage -nographic -append "console=ttyS0" -enable-kvm
(...)
[ 1.991148] Kernel Offset: 0x5a00000 from 0xc1000000 (relocation range: 0xc0000000-0xc87dffff)
[ 1.991649] ---[ end Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0) ]---
Эта
kernel panic является нормальным явлением, поскольку нам не хватает процесса init в initramfs или корневой файловой системе.ARM
Ядро может быть скомпилировано для любой архитектуры, включая ARM, с использованием цепочки инструментов, это включает в себя экспорт следующих переменных перед компиляцией ядра (возможно, вам придется настроить цепочку инструментов):
Код:
$ ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-
Компиляция buildroot
Пришло время скомпилировать initramfs с помощью некоторых утилит bin/sbin, включая
gdbserver и python:
Код:
cd $BUILD_PATH
wget -O- https://buildroot.org/downloads/buildroot-2019.02.2.tar.gz | tar -xzv
mv buildroot-2019.02.2 buildroot
cd buildroot
make menuconfig
Установите следующие параметры:
Код:
# General
Target options ---> Target Architecture ---> x86_64
Build options ---> Enable compiler cache ---> yes
Build options ---> Compiler cache location ---> $(BUILD_PATH)/.buildroot-ccache
# It should be greater or equal than your kernel version
Toolchain ---> Kernel Headers ---> Linux 4.20.x kernel headers
Toolchain ---> C library ---> glibc
Toolchain ---> Enable C++ support ---> yes
System configuration ---> Run a getty (login prompt) after boot ---> TTY port ---> ttyS0
System configuration ---> Network interface to configure through DHCP ---> eth0
System configuration ---> Root filesystem overlay directories ---> $(BUILD_PATH)/buildroot/overlay
Target packages ---> Debugging, profiling and benchmark ---> gdb
Target packages ---> Interpreter languages and scripting ---> python
Target packages ---> Networking applications ---> dropbear ---> yes
Filesystem images ---> cpio the root filesystem (for use as an initial RAM filesystem) ---> yes
Filesystem images ---> ext2/3/4 root filesystem ---> ext2/3/4 variant ---> ext4
# Optional
System configuration ---> System hostname ---> nullbyte
System configuration ---> System banner ---> Welcome to nullbyte.cat
Я рекомендовал скомпилировать buildroot с параметромext2/3/4, а также с параметромcpio. Таким образом, у нас будет файловая система только для чтения, а также постоянная файловая система, в которой мы можем хранить файлы, которые будут сохраняться при перезагрузке.
Создайте каталог
overlay. Все хранящиеся там файлы будут скопированы в корень файловой системы. Добавьте к нему минимальный скрипт инициализации:
Код:
mkdir $BUILD_PATH/buildroot/overlay
cat $BUILD_PATH/buildroot/overlay/init
chmod +x $BUILD_PATH/buildroot/overlay/init
Bash:
#!/bin/sh
# devtmpfs does not get automounted for initramfs
/bin/mount -t devtmpfs devtmpfs /dev
exec 0</dev/console
exec 1>/dev/console
exec 2>/dev/console
exec /sbin/init "$@"
Добавляем пользователей
В текущей конфигурации будет создан только пользователь root без пароля. Чтобы создать обычного пользователя и обновить пароль root, нам нужно создать файлы
/etc/passwd и /etc/shadow:
C:
mkdir $BUILD_PATH/buildroot/overlay/etc/
cat $BUILD_PATH/buildroot/overlay/etc/shadow
root:$5$AQRgXbdJ$eCko6aRPrhOBegsJGLy36fmmrheNtfkUMBjlKPWEXW9:10000:0:99999:7:::
daemon:*:10933:0:99999:7:::
bin:*:10933:0:99999:7:::
sys:*:10933:0:99999:7:::
sync:*:10933:0:99999:7:::
mail:*:10933:0:99999:7:::
www-data:*:10933:0:99999:7:::
operator:*:10933:0:99999:7:::
nobody:*:10933:0:99999:7:::
user:$5$QAucgwIL$onnijv2MwdMD.Jze4LgPx7z3kksIjU18y3jffH2urv3:10000:0:99999:7:::
Пароли, соответствующие предыдущим хешам:
root:root и user:user (user:password).Если вы хотите сгенерировать собственный хеш для нового пользователя или изменить предыдущих, используйте следующую команду:
Python:
python -c "import random,string,crypt;
randomsalt = ''.join(random.sample(string.ascii_letters,8));
print crypt.crypt('PASSWORD', '\$5\$%s\$' % randomsalt)"
Соответственно обновите
/etc/passwd:
Код:
cat $BUILD_PATH/buildroot/overlay/etc/passwd
root:x:0:0:root:/root:/bin/sh
daemon:x:1:1:daemon:/usr/sbin:/bin/false
bin:x:2:2:bin:/bin:/bin/false
sys:x:3:3:sys:/dev:/bin/false
sync:x:4:100:sync:/bin:/bin/sync
mail:x:8:8:mail:/var/spool/mail:/bin/false
www-data:x:33:33:www-data:/var/www:/bin/false
operator:x:37:37:Operator:/var:/bin/false
nobody:x:65534:65534:nobody:/home:/bin/false
user:x:1000:1000:Linux User,,,:/home/user:/bin/sh
Наконец, создайте домашнюю страницу пользователя и установите разрешения для таблицы устройств.
Код:
mkdir -p $BUILD_PATH/buildroot/overlay/home/user
echo -e '/home/user\td\t755\t1000\t100\t-\t-\t-\t-\t-' >> $BUILD_PATH/buildroot/system/device_table.txt
Добавляем модули ядра
Чтобы добавить модули, скомпилированные на этапе ядра, в файловую систему, мы можем использовать каталог
overlay в качестве места назначения:
Код:
cd $BUILD_PATH/linux
make modules_install INSTALL_MOD_PATH=$BUILD_PATH/buildroot/overlay
(...)
DEPMOD 4.20.0
Доделываем
Как только все будет готово, скомпилируйте bootroot (первая компиляция займет несколько минут):
Код:
cd $BUILD_PATH/buildroot
make source
nproc
8
make -j 8
Тестируем среду
Как уже упоминалось, если вы скомпилируете buildroot с файловой системой
ext2/3/4, у вас будет постоянное хранилище, в которое вы можете передавать файлы через ssh и хранить их. Однако, если вы используете вариант cpio, ключ dropbear будет генерироваться случайным образом при каждой загрузке. Это означает, что сертификат будет недействительным на хосте при каждой перезагрузке.Чтобы решить эту проблему, у вас есть 2 варианта:
- Используйте файловую систему ext2.
- Игнорируйте
~/.ssh/known_host, добавляя команду-o UserKnownHostsFile = /dev/null -o StrictHostKeyChecking=noк клиенту ssh.
hostfwd=tcp::2222-:22 к опции -net user. (Мы можем добавить столько, сколько нам нужно). Я перенаправлю 3 порта, 9999 для пользовательского пространства gdbserver, с 22 по 2222 для ssh и 8000 в качестве дополнительных. Таким образом, полная команда с использованием ext2 выглядит так:
Код:
cd $BUILD_PATH
qemu-system-x86_64 -kernel linux/arch/x86_64/boot/bzImage \
-drive file=buildroot/output/images/rootfs.ext2,format=raw \
-net nic -net user,hostfwd=tcp::2222-:22,hostfwd=tcp::9999-:9999,hostfwd=tcp::8000-:8000 \
-nographic -append "root=/dev/sda console=ttyS0" -enable-kvm
Если вы хотите использовать временную систему, замените строку
-drive на -initrd buildroot/output/images/rootfs.cpio и удалите root=/dev/sda из -append.После запуска ядра мы можем подключиться к нему с помощью root или user и соответствующего пароля через ssh.
Код:
ssh -p 2222 root@localhost
ssh -p 2222 user@localhost
# Чтобы включить ssh без пароля, скопируйте ключи (используйте только в постоянной системе)
ssh-copy-id -p 2222 root@localhost
ssh-copy-id -p 2222 user@localhost
Компилируем бинарные файлы
Поскольку мы указали
glibc в конфигурации buildroot в качестве набора инструментов, мы можем использовать наш собственный системный компилятор. Если вы ориентируетесь на другую архитектуру, используйте компилятор gcc из $BUILD_PATH/buildroo/output/host/usr/bin.После того, как вы скомпилировали двоичный файл, вы можете загрузить его через
scp. (Не забудьте использовать файловую систему ext2 для обеспечения устойчивости).Отлаживаем бинарные файлы
Мы можем использовать
gdbserver для отладки двоичных файлов пользователя в QEMU, прослушивая один из перенаправленных портов QEMU.
Код:
scp -P 2222 binary user@localhost
ssh -p 2222 user@localhost 'gdbserver localhost:9999 ./binary'
Код:
gdb binary
target remote localhost:9999
Отлаживаем ядро
Для отладки ядра мы можем добавить
-s (сокращение для -gdb tcp::1234) и -S (не запускать процессор при запуске).
Код:
cd $BUILD_PATH
qemu-system-x86_64 -kernel linux/arch/x86_64/boot/bzImage \
-drive file=buildroot/output/images/rootfs.ext2,format=raw \
-net nic -net user,hostfwd=tcp::2222-:22,hostfwd=tcp::9999-:9999,hostfwd=tcp::8000-:8000 \
-nographic -append "root=/dev/sda console=ttyS0" -s -S -enable-kvm
Затем на хосте мы можем загрузить двоичный файл
vmlinux и присоединиться к gdb заглушке QEMU.
Код:
cd $BUILD_PATH/linux
gdb vmlinux
target remote localhost:1234
Если мы запустим gdb из каталога исходного кода linux, мы сможем перечислить исходный код и разбить его на
b mm/slub.c:3770. Если это не так, мы можем указать каталог исходного кода ядра внутри gdb с помощью команды dir <source-path> .Компилируем модули
Используйте следующий Makefile для компиляции модуля с именем
module.c
Код:
obj-m += module.o
all:
make -C $BUILD_PATH/linux M=$(PWD) modules
clean:
make -C $BUILD_PATH/linux M=$(PWD) clean```
Затем мы можем загрузить скомпилированный
module.ko через scp как root и установить его с помощью insmod или modprobe. Другой вариант - добавить модуль в overlay каталог buildroot и загрузить его с помощью сценария инициализации.Отлаживаем модули ядра
Как только ядро загружено (подтвердите это с помощью
lsmod как гость), мы можем получить его адрес с помощью cat /proc/modules | grep <имя-модуля> или в cat /sys/module/<module>/sections/.text.Затем мы можем сопоставить модуль с сеансом gdb, который мы подключили к заглушке QEMU, следующим образом:
Код:
add-symbols-file <module.ko> <address>
Мы также можем указать сегменты, вручную взятые из
/sys/module/<module>/section/.<segment>
Код:
add-symbols-file <module.ko> -s .text <.text-addr> -s .data <.data-addr>
Снапшоты
Чтобы быстро восстановить состояние vm (полезно при тестировании эксплойта ядра), нам нужно преобразовать наш образ
ext2 в qcow2:
Код:
cd $BUILD_PATH/buildroot/output/images/
qemu-img convert -O qcow2 rootfs.ext2 rootfs.qcow2 -enable-kvm
Чтобы управлять виртуальной машиной, нам нужно добавить флаг монитора QEMU и изменить файл диска на
image.qcow2:
Код:
cd $BUILD_PATH
qemu-system-x86_64 -kernel linux/arch/x86_64/boot/bzImage \
-drive file=buildroot/output/images/rootfs.qcow2 \
-net nic -net user,hostfwd=tcp::2222-:22,hostfwd=tcp::9999-:9999,hostfwd=tcp::8000-:8000 \
-nographic -append "root=/dev/sda console=ttyS0" -monitor telnet:127.0.0.1:55555,server,nowait -enable-kvm
После добавления этих параметров мы можем подключиться к монитору QEMU через порт
nc localhost 55555 и отправить консольные команды, такие как следующие:- info snapshot: Список всех снимков
- savevm: Создает новый снимок
- loadvm <tag>: Загружает снимок <tag>
- delvm <tag>: Удаляет снимок <tag>
loadvm <tag>, позволяющую нам вернуться в состояние перед запуском эксплойта.Если вы используете -S вместе с -monitor, не забудьте ввести команду c (continue) для монитора, иначе виртуальная машина не запустится.
Ориентируемся в коде ядра
Более простой способ - создать файл
ctags с тегами make внутри пути $BUILD_PATH/linux и перемещаться по нему с помощью vim и команды :tag <tag> (vim wiki).Дополние:
Теперь я использую
cscope вместе с vim, так как это позволяет улучшить перекрестные ссылки, вы можете создать базу данных, используя make cscope и перемещаться как ctags, добавив set cscopetag в ваш .vimrc. (Взгляните на этот плагин, который делает это и автоматически загружает базу данных cscope.out).SystemTap
Вы можете кросс-скомпилировать stap с вашего хоста и загрузить его в виртуальную машину, выполнив следующие действия:
Код:
sudo stap -a x86_64 -p 4 -v -m stap.ko --sysroot $BUILD_PATH/linux -r $BUILD_PATH/linux stap.stp
Вам нужно будет установить на гостевой машине
staprun. Я рекомендую следовать следующему разделу и устанавливать его с помощью apt install systemtap.Ubuntu initramfs
Чтобы создать загрузочный образ Ubuntuqcow2 для использования с нашим собственным ядром, мы можем создать загрузочную программу с помощью следующей команды:
Код:
sudo debootstrap \
--include linux-image-generic \
xenial \
debootstrap \
http://archive.ubuntu.com/ubuntu
Чтобы установить модулиmake modules_install INSTALL_MOD_PATH=debootstrap/
Затем мы можем выполнить
chroot к нему и создать нашего пользователя и изменить пароль root, нам также нужно перемонтировать корневую файловую систему как rw и включить службу DHCP при загрузке:
Код:
sudo chroot debootstrap
echo -e 'root\nroot' passwd
/usr/sbin/adduser user
exit
# Remount the root filesystem as rw.
cat << EOF | sudo tee "debootstrap/etc/fstab"
/dev/sda / ext4 errors=remount-ro,acl 0 1
EOF
# Automaticaly start networking.
cat << EOF | sudo tee debootstrap/etc/systemd/system/dhclient.service
[Unit]
Description=DHCP Client
Documentation=man:dhclient(8)
Wants=network.target
Before=network.target
[Service]
Type=forking
PIDFile=/var/run/dhclient.pid
ExecStart=/sbin/dhclient -4 -q
[Install]
WantedBy=multi-user.target
EOF
sudo ln -sf debootstrap/etc/systemd/system/dhclient.service \
debootstrap/etc/systemd/system/multi-user.target.wants/dhclient.service
И, наконец, создайте образ
qcow2:Если вам нужно больше места на диске, измените + 1G (этот образ не следует использовать для компиляции, только для тестирования).
Код:
sudo virt-make-fs \
--format qcow2 \
--size +1G \
--type ext2 \
debootstrap \
xenial-debootstrap.ext2.qcow2
Вы всегда можете изменить его размер позже:
Код:
qemu-img resize xenial-debootstrap.ext2.qcow2 +5G
# Inside the QEMU vm as root:
resize2fs /dev/sda
Запустите наше скомпилированное ядро с загрузкой Ubuntu:
Код:
qemu-system-x86_64 -kernel linux/arch/x86_64/boot/bzImage \
-drive file=xenial-debootstrap.ext2.qcow2 \
-net nic -net user,hostfwd=tcp::2222-:22,hostfwd=tcp::9999-:9999,hostfwd=tcp::8000-:8000 \
-nographic -append "root=/dev/sda console=ttyS0" -monitor telnet:127.0.0.1:55555,server,nowait -enable-kvm
Теперь у вас есть полностью работающее настраиваемое ядро Linux с менеджером пакетов и некоторыми другими инструментами.
Если во время загрузки отображаются ошибки, это связано с несоответствием конфигурации ядра. Вы можете получить конфигурацию из
debootstrap/config-* и make oldconfig.Вы также можете скомпилировать ядро ubuntu, используя этот метод вики и загрузив нужную версию ядра из основного репозитория здесь.
ARM
Для ARM процесс аналогичен:
Код:
sudo debootstrap \
--arch armhf xenial \
debootstrap \
http://ports.ubuntu.com/ubuntu-ports
Нам нужно проделать те же шаги, что описаны в обычном ubuntu. На этот раз для chroot в загрузочную среду нам понадобится
qemu-user и соответствующая библиотека libc для архитектуры, на которую мы нацелены. Нам нужно будет настроить binfmt и создать символическую ссылку на библиотеки, чтобы мы могли прозрачно выполнять arm:
Код:
sudo ln -s /usr/arm-linux-gnueabihf /etc/qemu-binfmt/armhf
Теперь мы можем выполнить
chroot к нему и создать нашего пользователя и изменить пароль root, нам также необходимо перемонтировать корневую файловую систему как rw и включить службу DHCP при загрузке, как это было сделано в версии x86_64.Обратите внимание, как на этот раз
vda указывается как корневой раздел, а не sda, поскольку мы собираемся использовать виртуальную машину.
Код:
sudo chroot debootstrap
echo -e 'root\nroot' passwd
/usr/sbin/adduser user
exit
# Remount the root filesystem as rw.
cat << EOF | sudo tee "debootstrap/etc/fstab"
/dev/vda / ext4 errors=remount-ro,acl 0 1
EOF
# Automaticaly start networking.
cat << EOF | sudo tee debootstrap/etc/systemd/system/dhclient.service
[Unit]
Description=DHCP Client
Documentation=man:dhclient(8)
Wants=network.target
Before=network.target
[Service]
Type=forking
PIDFile=/var/run/dhclient.pid
ExecStart=/sbin/dhclient -4 -q
[Install]
WantedBy=multi-user.target
EOF
sudo ln -sf debootstrap/etc/systemd/system/dhclient.service \
debootstrap/etc/systemd/system/multi-user.target.wants/dhclient.service
И, наконец, создайте образ
qcow2:Если вам нужно больше места на диске, измените + 1G (этот образ не следует использовать для компиляции, только для тестирования).
Код:
sudo virt-make-fs \
--format qcow2 \
--size +1G \
--type ext2 \
debootstrap \
xenial-debootstrap-arm.ext2.qcow2
Вы всегда можете изменить его размер позже:
Код:
qemu-img resize xenial-debootstrap.ext2.qcow2 +5G
# Inside the QEMU vm as root:
resize2fs /dev/sda
Запустите наше скомпилированное ядро с помощью начальной загрузки Ubuntu ARM (я рекомендую использовать более одного процессора с
-smp <n>, поскольку эмуляция процессора медленная):
Код:
qemu-system-arm \
-M virt -kernel linux/arch/arm/boot/zImage -M virt -smp 4 \
-append 'root=/dev/vda console=ttyAMA0' \
-drive if=none,file=xenial-debootstrap-arm.ext2.qcow2,format=qcow2,id=hd \
-device virtio-blk-device,drive=hd \
-device virtio-net-device,netdev=net0 \
-netdev user,id=net0,hostfwd=tcp::2222-:22,hostfwd=tcp::9999-:9999 \
-monitor telnet:127.0.0.1:55555,server,nowait \
-nographic
От ТС
Эта статья статья, является переводом. Оригинал доступен тут
Тема эксплуатации ядра линукса для меня новая, поэтому в переводе могут быть ошибки. Кроме того, я давно ничего не переводил для форума
Перевод:
Azrv3l cпециально для xss.pro