Где находится vmlinux на моей установке Ubuntu?

16

Я пытаюсь поработать с запуском oprofile , и на этом этапе я столкнулся с проблемой:

opcontrol --vmlinux=/path/to/vmlinux

У Ubuntu нет пакета с именем vmlinux, и когда я делаю a locate vmlinux, я получаю много файлов:

/usr/src/linux-headers-2.6.28-14/arch/h8300/boot/compressed/vmlinux.lds
/usr/src/linux-headers-2.6.28-14/arch/m68k/kernel/vmlinux-std.lds
/usr/src/linux-headers-2.6.28-14/arch/m68k/kernel/vmlinux-sun3.lds
/usr/src/linux-headers-2.6.28-14/arch/mn10300/boot/compressed/vmlinux.lds
/usr/src/linux-headers-2.6.28-14/arch/sh/boot/compressed/vmlinux_64.lds
/usr/src/linux-headers-2.6.28-14/arch/x86/boot/compressed/vmlinux_32.lds
/usr/src/linux-headers-2.6.28-14/arch/x86/boot/compressed/vmlinux_64.lds
/usr/src/linux-headers-2.6.28-14/include/asm-generic/vmlinux.lds.h
/usr/src/linux-headers-2.6.28-15/arch/h8300/boot/compressed/vmlinux.lds
/usr/src/linux-headers-2.6.28-15/arch/m68k/kernel/vmlinux-std.lds
/usr/src/linux-headers-2.6.28-15/arch/m68k/kernel/vmlinux-sun3.lds
/usr/src/linux-headers-2.6.28-15/arch/mn10300/boot/compressed/vmlinux.lds
/usr/src/linux-headers-2.6.28-15/arch/sh/boot/compressed/vmlinux_64.lds
/usr/src/linux-headers-2.6.28-15/arch/x86/boot/compressed/vmlinux_32.lds
/usr/src/linux-headers-2.6.28-15/arch/x86/boot/compressed/vmlinux_64.lds
/usr/src/linux-headers-2.6.28-15/include/asm-generic/vmlinux.lds.h
/usr/src/linux-headers-2.6.28-16/arch/h8300/boot/compressed/vmlinux.lds
/usr/src/linux-headers-2.6.28-16/arch/m68k/kernel/vmlinux-std.lds
/usr/src/linux-headers-2.6.28-16/arch/m68k/kernel/vmlinux-sun3.lds
/usr/src/linux-headers-2.6.28-16/arch/mn10300/boot/compressed/vmlinux.lds
/usr/src/linux-headers-2.6.28-16/arch/sh/boot/compressed/vmlinux_64.lds
/usr/src/linux-headers-2.6.28-16/arch/x86/boot/compressed/vmlinux_32.lds
/usr/src/linux-headers-2.6.28-16/arch/x86/boot/compressed/vmlinux_64.lds
/usr/src/linux-headers-2.6.28-16/include/asm-generic/vmlinux.lds.h

Кого из них я ищу?

Джейсон Бейкер
источник

Ответы:

2

Это должно быть в вашем /bootкаталоге - мю Ubuntu на самом деле имеет сжатые версии по типу vmlinuz-2.6.28-16-generic.

Может ли oprofile работать с ними, я не могу ответить на этот вопрос.

случайный
источник
3
Что с редактированием? superuser.com/posts/62576/revisions
Йоник
5
oprofile не может работать с vmlinuzним, требует несжатого ядра.
SaveTheRbtz
9
vmlinux - это не то же самое, что vmlinuz
gsingh2011
24

Самый простой (и не хакерский) способ получить vmlinuxпод Ubuntu - это добавить репозиторий ddebs :

echo "deb http://ddebs.ubuntu.com $(lsb_release -cs)-updates main restricted universe multiverse
deb http://ddebs.ubuntu.com $(lsb_release -cs)-security main restricted universe multiverse
deb http://ddebs.ubuntu.com $(lsb_release -cs)-proposed main restricted universe multiverse" | \
sudo tee -a /etc/apt/sources.list.d/ddebs.list

sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 428D7C01

и установите символы отладки ядра:

sudo apt-get update
sudo apt-get install linux-image-$(uname -r)-dbgsym

vmlinux тогда можно найти здесь:

/usr/lib/debug/boot/vmlinux-$(uname -r)
SaveTheRbtz
источник
Это должен быть принятый ответ.
Дан
12

Хм, просто хотел поместить это как комментарий к ответу выше по @paxdiablo, но не можете найти кнопку комментария? В любом случае ..

Дело в том, что vmlinuzфайл сжат - и для целей отладки вам нужен несжатый vmlinux(и желательно тот, который vmlinuzсобран с отладочными символами - которых нет у стандартных по умолчанию в Ubuntu, поскольку они лишены символов).

Теперь можно распаковать файл vmlinuzв vmlinuxфайл - однако это не тривиально; сначала нужно найти смещение в байтах, в vmlinuzкотором начинается сжатый файл, а затем использовать ddи zcatдля распаковки только необходимой части. Подробно это объясняется в: « [ubuntu] Как отследить эту ошибку? - Форумы Ubuntu - пост № 4 »; вкратце, ниже приведен пример журнала команд терминала, основанный на этом посте:

$ od -A d -t x1 /boot/vmlinuz-$(uname -r) | grep '1f 8b 08 00' --colour
0013920 f3 a5 fc 5e 8d 83 70 23 3d 00 ff e0 *1f 8b 08 00*

$ wcalc 13920+12
 = 13932

$ dd if=/boot/vmlinuz-$(uname -r) bs=1 skip=13932 | zcat > vmlinux-$(uname -r)
4022132+0 records in
4022132+0 records out
4022132 bytes (4,0 MB) copied, 42,1695 s, 95,4 kB/s

gzip: stdin: decompression OK, trailing garbage ignored


$ file vmlinux-2.6.32-25-generic 
vmlinux-2.6.32-25-generic: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), statically linked, stripped

Ну, надеюсь, это поможет,

Ура!

sdaau
источник
3
Для этого в git ядра есть специальный скрипт extract-vmlinux: git.kernel.org/?p=linux/kernel/git/torvalds/…
SaveTheRbtz
Большое спасибо, @SaveTheRbtz - понятия не имел об этом .. Ура!
Сдау
Это должно быть помечено как ответ по умолчанию. Благодарность!
Продажа
3

Вы можете скачать исходный код и скомпилировать свой собственный, используя следующую команду:

apt-get source linux-image-$(uname -r)
apt-get build-dep --no-install-recommends linux-image-$(uname -r)
cd linux-2.6.32/
fakeroot make -f debian/rules binary-generic skipdbg=false  

или вы можете скачать пакет ddeb здесь и установить егоsudo dpkg -i linux-image-3.2.0-60-virtual-dbgsym_3.2.0-60.91_amd64.ddeb

Гарри
источник
2

Это старый вопрос, и старые ответы у меня больше не работают (Ubuntu 14.04).

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

  2. Если вам все еще нужно vmlinux, добавьте репозиторий ddebs (бесстыдно взятый из вики Ubuntu ):

    codename=$(lsb_release -c | awk  '{print $2}')
    sudo tee /etc/apt/sources.list.d/ddebs.list << EOF
    deb http://ddebs.ubuntu.com/ ${codename} main restricted universe multiverse
    deb http://ddebs.ubuntu.com/ ${codename}-security main restricted universe multiverse
    deb http://ddebs.ubuntu.com/ ${codename}-updates  main restricted universe multiverse
    deb http://ddebs.ubuntu.com/ ${codename}-proposed main restricted universe multiverse
    EOF
    sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys ECDCAD72428D7C01
    
  3. Затем установите символы отладки для вашего ядра . Вы должны делать это каждый раз, когда вы обновляете свое ядро, после перезагрузки, чтобы unameполучить правильную версию ядра. Не стесняйтесь удалять пакеты, связанные со старыми ядрами.

    sudo apt-get update
    sudo apt-get install linux-image-$(uname -r)-dbgsym
    
  4. Как только этот пакет будет установлен, вы найдете vmlinuxфайл здесь :

    /usr/lib/debug/boot/vmlinux-$(uname -r)
    
Antoine
источник
0

Пакеты, содержащие ядро ​​linux (файл vmlinuz), называются linux-image-VERSION-ARCH в Debian / Ubuntu.

Вы можете перечислить их с помощью команды dpkg -l linux-image-*, а для установленного пакета (он iiотмечен в первом столбце) вы можете получить список файлов в нем dpkg -L linux-image-VERSION-ARCH, например, dpkg -L linux-image-2.6.31-17-386для недавней установки Karmic.

Обратите внимание, что lстрочные буквы в первой команде и прописные буквы во второй.

whitequark
источник
0

Попробуйте следующую команду:

apt-get linux-image.*-dbg

обычно vmlinux находится в / usr / lib / debug / после установки

река
источник
-1

это должно быть в вашем корне (/). В Ubuntu 8.10 это ссылка, указывающая на /boot/vmlinuz-2.6.28-16-generic

сделать

ls / -l | grep '^l'

ты должен найти это

PS: не уверен в точном имени пути.

deostroll
источник