Показаны сообщения с ярлыком linux. Показать все сообщения
Показаны сообщения с ярлыком linux. Показать все сообщения

2/16/2018

cpu_meltdow spectre_v1 spectre_v2

Последние версии ядра Linux ( у меня 4.15.3) теперь позволяют посмотреть какие есть баги в процессоре.
cat /proc/cpuinfo:



Пора обновить микрокод процессора.

2/01/2012

Linux_x86_64 и Skype

21 век на дворе а skype до сих пор не распространяется для 64-х битных
линуксов.
Постоянно приходится извращаться, потому что при каждом обновлении в Gentoo появляются проблемы с камерой и каждый раз при обновлении
приходится добавлять в /usr/bin/skype вот такую строчку:

export LD_PRELOAD=/usr/lib32/libv4l/v4l1compat.so

Чего-то надоело уже.

Может кто знает, чем его можно заменить, но так, чтобы было возможность общаться с контактами из skype'а?
Есть какой нибудь транспорт, как например в xmpp?

p.s. Пост был  из будущего

11/03/2011

Утечки памяти и ошибки доступа.

Ранее я уже писал о том, что можно искать утечки памяти в программе с помощью средств, которые предоставляет glibc. Описанный подход плох тем, что не позволяет искать ошибки доступа к памяти, такие как обращение по нулевому указателю, или обращение к уже освобожденной памяти.

В данном посте речь пойдет о mudflap.
mudflap - это технология проверки указателей, основанная не на бинарной инструментации, как valgrind или dr. Memory, а на инструментации времени компиляции. Если в кратце, во время компиляции программы в исходный код делаются вставки, которые обспечивают различные проверки указателей,к которым осуществляется доступ.

Теперь разберем работу mudflap на конкретном примере.

Для того, чтобы можно было использовать mudflap, нужа поддержка этой технологии в компиляторе и собственно сама библиотека, выполняющая проверки: gcc должен  быть скомпилирован с опцией --enable-libmudflap, и в системе должна присутствовать библиотека libmudflap.so.

В качестве примера рассмотрим программу, котороя пытается записать в уже освобожденную память:
#include <malloc.h>

int main (void)
{
  const int chunk_size = 18;
  const int count  = 10000;
  int j = 0;
  void * ptrs [count];

  /* выделяем 10 000 кусочков памяти по 18 байт.*/
  for (j = 0; j < count; j++) {
    ptrs [j] = malloc (chunk_size);
  }

  /* освобождаем все, кроме первого и последнего */

  for (j = 1; j < count - 2; j++)
    if (ptrs [j])
      free (ptrs [j]);

  /* записываем в освобожденную память*/
  *(char*)ptrs [10] = 10;

  /* просим glibc сделать "дефрагментацию" выделенной памяти */
  malloc_trim (1);

  return 0;
}


Результатом работы программы будет Segmentation Fault.
Это происходит потому что при попытке записи в освобожденную память (на самом деле она не освобождается, а помечается как неиспользуемая) программа портит служебную информацию glibc, а именно связный список, который используется в glibc для управления памятью.

Чтобы отловить ошибку в программе нужно пересобрать программы с mudflap инструментацией:

gcc -fmudflapth -lmudflap -Wall -Wextra -g -ggdb3 buggy.c
Запускаем:

./a.out


В результате работы программа выдает следующее:

*******

mudflap violation 1 (check/write): time=1320343428.778161 ptr=0xe85c10 size=1

pc=0x7fcc8d0dc4f8 location=`buggy.c:22:21 (main)'

      /usr/lib/gcc/x86_64-pc-linux-gnu/4.5.3/libmudflap.so.0(__mf_check+0x38) [0x7fcc8d0dc4f8]

      ./a.out(main+0x301) [0x400da5]

      /lib64/libc.so.6(__libc_start_main+0xec) [0x7fcc8cd63e8c]

number of nearby objects: 0


Ясно видно где в исходном коде возникает проблема.

Для проверки, запустим программу под valgrind-ом, который выдает следующую информацию:
==26575== 

==26575== Invalid write of size 1

==26575==    at 0x4006E0: main (buggy.c:22)

==26575==  Address 0x51bc400 is 0 bytes inside a block of size 18 free'd

==26575==    at 0x4C27F6C: free (in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so)

==26575==    by 0x4006C8: main (buggy.c:19)


valgrind как и mudflap, точно показал место ошибки в программе:
buggy.c: 22

Резюмирая можно обозначить плюсы и минусы mudflap:
"+" :
1. Более низкий overhead по сравнению с valgrind.
2. Лучшая переносимость: доступен для платформ ARM и MIPS.
3. Из-за того, что инструментация происходи во время выполнения, может находить более сложные ошибки и более точно показывать их в коде.

"-":
1. Поддержка кода, написанного только на C/C++.
2. Привязка к компилятору GCC.
3. Необходимость перекомпиляции.

Таким образом, mudflap вполне удобный тул, который позволяет искать утечки в памяти не используя valgrind, что особенно полезно для встраиваемых систем (ARM и MIPS), где на исполнение кода существенно влияют накладные расходы на инструментацию.

Больше информации о mudflap можно посмотреть тут : http://gcc.gnu.org/wiki/Mudflap_Pointer_Debugging

8/07/2009

Embedded Linux Conference

В сети доступны доклады и презентации с конференции Embedded Linux Conference.
Есть что послушать и есть чего почитать.
Смотреть тут: http://free-electrons.com/blog/elc-2009-videos/

4/21/2009

Учим Linux запускать exe файлы.

Как известно в Linux по умолчанию используется ELF (Executable and Linkable Format) формат исполняемых файлов.
Однако, не составляет труда обучить ядро Linux запускать любые другие исполняемые файлы (.exe файлы для Windows, скрипты на shell, python, байткод java и т.д.) без явного указание эмулятора Т.е. в командной строке можно просто написать ./notepad.exe или ./my_script.py.
Для этого нужно обеспечить ядро необходимой информацией о формате исполняемого файла, и о том, каким образом и с помощью чего его можно интерпретировать.

Что для этого нужно?

1. Для этого нужно включить в ядре поддержку остальных исполняемых форматов:

В секции Executable file formats / Emulation-->
Опция Kernel support for MISC binaries



Можно или встроить эту возможность в ядро, или оформить ее в качестве отдельного модуля. Модуль будет называться binfmt_misc.

2. Подмонтировать файловую систему binfmt_misc в каталог /proc:
mount binfmt_misc -t binfmt_misc /proc/sys/fs/binfmt_misc

3. Перейти в каталог /proc/sys/fs/binfmt_misc. У вас тут должно лежать два файла: register и status

4. Описать формат и интерпретатор для этого формата:

Для того что зарегистрировать новый формат исполняемого файла и интерпретатор для него нужно добавить в файл register строку в формате:
:name:type:offset:magic:mask:interpreter:flags
Вот что значат приведенные поля:
  • 'name' - строковый идентификатор. В каталоге /proc/sys/fs/binfmt_misc будет создан новый файл с именем name
  • 'type' - способ распознавания. Может быть 'M' для волшебства и 'E' для расширения.
  • 'offset' - смещение маски в файле,считается в байтах. Этот параметр по умолчанию равен 0, если вы его не указываете (например: ':name:type::magic...')
  • 'magic' - последовательность байт для соответствия которой и определяется binfmt_misc. Строка поля magic может содержать шестнадцатириные символы, такие как \x0a или \xA4.
  • 'mask' маска (опциональна, по умолчанию имеет значение 0xff) . Добавляя строку как в поле magic и такой же длины, вы можете маскировать соответствие некоторых битов файла.
  • 'interpreter' - программа, которая должна быть выполнена вместе с исполняемым фалйлом, как первый аргумент (Необходимо указывать полный путь)
  • 'flags' - опциональное поле, которое контролирует нектороые аспекты вызова интерпретатора
Например для запуска windows приложений с помощью wine в качестве интерпретатора в register нужно добавить такую строку:

':DOSWin:M::MZ::/usr/bin/wine:

Вот так:

echo ':DOSWin:M::MZ::/usr/bin/wine:' > register

Теперь в каталоге /proc/sys/fs/binfmt_misc у нас появился файл DOSWin следующего содержания:

$bash: cat DOSWin
enabled
interpreter /usr/bin/wine
flags:
offset 0
magic 4d5a

После всего этого в командной строке можно написать ./notepad.exe и у вас запустится notepad с помощью wine'a.

5. Для того, чтобы binfmt_misc не пришлось монтировать каждый раз вручную, в /etc/fstab можно добавить вот такую строчку:
none /proc/sys/fs/binfmt_misc binfmt_misc defaults 0 0

6. Для того, чтобы отключить интерпретацию формата, нужно записать 0 в появившийся файл:
echo 0 > DOSWin

для того чтобы включить, нужно записать 1 :

echo 1 > DOSWin

7. Для того чтобы удалить формат, нужно записать -1 в имя файла этого формата:
echo -1 > DOSWin

4/03/2009

Amd Catalyst и KDE 4

Ура товарищи!!!
Наконец-то недавно вышел релиз драйвера ATI AMD Catalyst за версией 9.3
И видимо товарищи из AMD все таки сподобились починить работу своего поделия на многоядерных машинах.
KDE4 у меня уже работает целый день, а Linux до сих пор не упал.
Всем качать и обновляться.

P.S. Несмотря на все вышесказанное, я являюсь поклонником NVIDIA

2/15/2009

KDE4 и Alsa

Совсем недавно вышел релиз десктоп окружения KDE за версией 4.2.

Я вот тоже решил не отставать от продвинутых линуксоидов и установил себе этот самый KDE4. Что тут можно сказать, был сделан большой прогресс в разработке и улучшения интерфейса пользователя. Я перечислять не буду, т.к. их можно посмотреть на официальном сайте. Что еще порадовало, так это то, что увеличилась производительность, по сравнению с третьей веткой. Упростился процесс конфигурации. В общем и целом впечатление весьма приятное.

Теперь вот буду использовать в качестве десктоп окружения по-умолчанию.

Однако, как оказалось чуть позже, возникли некоторые проблемы со звуком:
При запуске какого-нибудь КДЕ-шного приложения, ни одна другая программа не могла воспроизвести звук. При том что до этого все работало замечательно. KDE для вывода звука использует backend Phonon, который в свою очередь использует xine, который в свою очередь использует звуковую подсистему: alsa, oss и т.д.

Для того, чтобы настроить звук, в KDE в system_settings нужно выбрать устройство, через которое будет выводится звук. Однако там присутствовала всего одна звуковая карточка. Оказалось, что для получения списка устройств phonon использует какую-то там функцию из библиотеки alsa, и не отображает устройства без описания. Вылечивается это просто. Добавляем в соответствующую секцию файла /etc/asound.conf строк:
hint {
show on
description "Name to display for the device"
}
К примеру для микширования через dmix :

pcm.dsp0 {
type plug
slave.pcm "dmixer"
 hint {
show on
description "My dmix sound card"
}
}

Теперь в настройках KDE выбираем вместо карты по умолчанию, "My dmix sound card",
и у вас есть многопоточный звук.

2/07/2009

Настройка Microsoft-VX 3000 в Linux

Раздобыл я себе веб камеру Microsoft VX-3000. Камера сделана на чипе sonix с jpeg кодированием.
После недолгого гугления, обнаружил сайтик, где можно найти кучу драйверов для разных веб камер. Проект называется gspcav1. Моя веб камера тоже в списке поддерживаемых.
Чтобы скомпилировать проект нужно, нужно скачать архив gspca, распаковать и запустить скрипт gspca_build.
В ядре должна быть включена поддержка V4l, и естественно у вас должны быть сорцы вашего работающего ядра.
После компиляции загружаем модуль ядра, modprobe gspca, и вуаля, появляется устройство /dev/video0 - которое собственно и будет вебкамерой.
Все эти действия легко и непринужденно проделываются на ядрах, версии меньше 2.6.27.

В версиях выше 2.6.27 набор драйверов интегрировали в ядро, и перевели на интерфейс v4l2. И после этого вебкамера перестала работать.
На моей системе (Gentoo Linux 2.6.28.1 x86_64) не помогало ничего. Ни одно приложение не хотело отображать картинку с камеры. Вместо этого отображались только помехи.
Сегодня мне все это надоело, и решил я значит скомпилировать старый драйвер gspcav1, от сторонних разработчиков. И у меня это получилось, с помощью лома, и какой то матери.
И так.
В ядре отключаем встроенный драйвер gspca, включаем V4l v1 compatible layer, или как-то так. Пересобираем ядро. Дальше я наваял патчик для gspca, чтобы его можно было скомпилировать с новым ядром. Скачать его можно здесь.
Заходим в каталог gspca, делаем patch -Np0 < ../gspca.patch, затем компилируем и инсталлируем. И О чудо, моя веб камера снова работает. =)

11/19/2008

Управленеи квотами

Немного информации:

1. Что такое квотирование?

Квотирование позволяет ограничить два аспекта использования диска: количество файлов, которыми владеет пользователь или группа пользователей; и количество блоков диска, которые может использовать пользователь или группа пользователей. Квотирование определяется, как для каждого пользователя, так и для каждой файловой системы. Если у вас несколько разделов, то квоты нужно определить для каждого раздела, в котором пользователь намеревается создавать файлы.

2. Программное обеспечение

В зависимости от дистрибутива, у вас может быть, а может и не быть установлено программное обеспечение для поддержки квотирования. В этом случае, вы можете загрузить исходные тексты отсюда:
ftp://ftp.funet.fi/pub/Linux/PEOPLE/Linus/subsystems/quota/all.tar.gz

3. Установка

Пересоберите ядро с поддержкой квот. А дальше все написано в мануалах.

А теперь главное:

Как быстро определить закончилась квота у пользователя или нет? правильно, командой quota или repquota! А как увеличить квоту? правильно, командой setquota! а как все это делать быстро? а вот это мы сейчас и рассмотрим


#!/bin/sh
echo "Программа проверки пользовательских квот"
echo "Введите имя пользователя"
read USR # прочитали имя пользователя
MAIL=$USR@local # написали почтовый адрес
TEXT="Обратите внимание на содержимое вашей папки" # текст письма
RESULT=`repquota -u -a |grep $USR` # смотрим какой размер квоты у пользователя
USED=`echo $RESULT | tr -s ' ' ':' | cut -d : -f 3` # смотрим сколько место у пользователя затрачено
QUOTA=`echo $RESULT | tr -s ' ' ':' | cut -d : -f 5` # вообще вся его квота
MINQUOTA=$((QUOTA*90/100)) # минимальный размер квоты = 90% от квоты
NQUOTA=$((QUOTA*110/100)) # новый размер квоты = старая +10%

if [ $USED -ge $MINQUOTA ]; # если затрачено 90% и более, то
then setquota -u $USR -a 0 $NQUOTA 0 0; # устанавливаем размер квоты в 110%
echo "Изменен размер квоты" | mail -v -r "root@local" -s $TEXT -S smtp=192.168.11.15 $MAIL # от правляем письмо с уведомлением
echo "Установлена квота размером: " $NQUOTA;
exit;
else # если использовано менее 90% то все ок!
echo "Использовано: " $USED;
echo "Всего: " $QUOTA;
exit;
fi