среда, 9 марта 2016 г.

Пишем первый модуль ядра | write our first kernel module

    Ядро Linux позволяет расширять свою функциональность путем загрузки модулей. Система модулей нужна чтобы не делать ядро более массивным там, где это не нужно. Например, при конфигурации ядра мы включаем только самое необходимое, компилируем. А уже во время использования, при необходимости, специальными командами загружаем и выгружаем модули, которые несут в себе необходимую функциональность.
    Думаю стоит сразу написать модуль, и уже потом рассказывать что к чему. Создайте новую директорию. Создайте файл "mod.c" следующего содержания:

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>         //for macros

static int __init mod_init(void)
{
        printk(KERN_DEBUG "Hello kernel World!\n");
        return 0;
}

static void __exit mod_exit(void)
{
        //do nothing
}

module_init ( mod_init );
module_exit ( mod_exit );

MODULE_LICENSE("GPL");
MODULE_AUTHOR("Alexander Lemeza");
MODULE_DESCRIPTION("Hello world from kernel space.");

    Заголовочный файл "module.h" необходим для любого модуля. Файл "kernel.h" для использования KERN_DEBUG. "init.h" нужен для использования макросов module_init() и module_exit(). Если не указать module_exit(), то модуль нельзя будет выгрузить кроме как rmmod -f, но об это позже.
    "printk" - ядерный аналог printf из юзерспейса. KERN_DEBUG - это уровень(приоритет) логирования, log level. Используется чтобы задать приоритет и вообще необходимость записывать сообщения от модуля в системный лог-файл. Узнать возможные уровни можно в файле include/linux/kern_levels.h. Параметр по умолчанию log level для системы, можно выбирать на стадии конфигурации ядра.
    В макросы module_init и module_exit передаются наши функции, которые будут исполняться при загрузке модуля и при выгрузке.

    MODULE_LICENSE("GPL"); - задает лицензию под которой распространяется модуль, при отсутствии этого параметры, при загрузке модуля мы будет получать предупреждение.
    MODULE_AUTHOR(); - указывает имя автора модуля.
    MODULE_DESCRIPTION() - описание модуля.


    Чтобы скомпилировать модуль, создадим Makefile:

ifneq ($(KERNELRELEASE),)
    obj-m := mod.o
else
    KERNELDIR ?= /lib/modules/$(shell uname -r)/build
    PWD  := $(shell pwd)
default:
        $(MAKE) -C $(KERNELDIR) M=$(PWD) modules
        
        rm *.o
        rm *.mod.c
        rm *.symvers    
        rm *.order
endif

Логика makefile`а такова:
    ifneq сравнивает две переменные, в данном случае проверяет переменную $(KERNELRELEASE) на наличие значения. Если $(KERNELRELEASE) отличается от пустого значения то выполняются фрагмент для выполненного условия, до else в данном случае. 
    Если переменная $(KERNELRELEASE) всё-таки не установлена, то дальше идет выполнение следующего фрагмента. 
    KERNELDIR ?= /lib/modules/$(shell uname -r)/build - проверяет установленна ли переменная KERNELDIR, если установлена, то ничего не делает и идет дальше, присваивает переменной PWD путь к текущей директории. Если переменная KERNELDIR не установлена, то присваивает ей стандартный путь к каталогу сборки.
    Цель default, отвечает здесь за компиляцию объектных файлов и их линковку в kernel object (.ko). Потом командой rm мы удаляем все ненужные файлы, указывая их расширения.
    Очистить рабочий каталог от только что сгенерированных файлов можно и другим способом, добавив цель clean: в makefile:

clean:
           $(MAKE) -C $(KERNELDIR) M=$(PWD) clean

    Такая цель, выполнившись, вроде должна обеспечить удаление все сгенерированных файлов командой make кроме .ko, но у меня почему-то, удаляет все сгенерированные файлы.
    У нас в каталоге должны присутствовать два файла на данный момент:

Makefile
mod.c

    Чтобы создать модуль ядра, нужно выполнить команду:

make

    После чего в директории появится новый файл с расширением .ko:

mod.ko



    Так вот, рассказываю, зачем нужны были такие манипуляции с makefile`ом, а нужны они были для того, чтобы мы могли собирать наш модуль не только для текущего установленного ядра, но и для других версий, нужны будут лишь их заголовочные файлы.
    Вызывая "make" мы производим сборку для текущей версии ядра, согласитесь, неудобно было бы если бы для того, что бы собрать модуль для другой версии ядра, пришлось устанавливать его, или поочередно все версии?
     Для того что бы указать для какой версии ядра собирать модуль, мы просто экспортируем переменную окружения KERNELDIR, указав путь к заголовочным файлам:

export KERNELDIR=~/linux-4.4.5/

    Теперь при вызове "make", будет происходить сборка модуля, для ядра версии 4.4.5, хотя можно использовать любую версию.

    Следует отметить, что модули ядра, для различных версий ядра, могут быть, и скорее всего будут несовместимы. Модуль мы создали, теперь необходимо поговорить об утилитах загрузки, выгрузки, получения информации о модуле и так далее.

Какие модули уже загружены?

    Узнать это пожно с помощью утилиты lsmod:


Как загрузить модуль?

    С помощью утилиты insmod:

sudo insmod mod.ko

    Посмотреть вывод модуля можно либо с помощью команды "dmesg" или с помощью просмотра системного лог-файла:

tailf /var/log/syslog

    Еще загружать можно с помощью modprobe:

sudo modprobe ./mod.ko

    Первое различие между командами в том, что modprobe, при загрузке модуля  проверяет все зависимости для него и при возможности удовлетворяет их. Второе, это то, что modprobe не работает с локальными директориями, то есть ваш модуль изначально должен находиться по адресу "/lib/modules/$(uname -r)".
    При загрузке модулей, им можно передавать параметры.

Как выгрузить модуль?

    Используй rmmod:

sudo rmmod mod
 
    Можно выгрузить и с ключом -f что значит force, модуль будет выгружен дыже если его функциями кто-то пользуется, ЭТО МОЖЕТ БЫТЬ ОПАСНО! В то время как при обычном режиме выгрузки, если модуль занят, то выгрузить его не получится, придется ждать освобождения.

    Заметьте, в этот раз мы не используем расширение файла. 
    Или modprobe с ключом -r.

Как посмотреть информацию о модуле?

    Посмотреть что вообще за файл этот модуль можно так:

file mod.ko

    file выдает следующее "mod.ko: ELF 64-bit LSB  relocatable, x86-64, version 1 (SYSV), BuildID[sha1]=93ae3698535b8e0efcaeef6c86490089903dbb81, not stripped". Как видим  это .elf файл.

    Еще больше информации нам предоставит modinfo, он выведет информацию о лицензии, авторе, имени файла, зависимостях, описание, версию ядра для которой был создан:

modinfo mod.ko



Что происходит когда мы вводим sudo insmod?

    Действительно, как это работает, магия? Нет, для того, чтобы без чтения исходников быстро понять что происходит при загрузке модуля, мы воспользуемся всеми любимой утилитой strace:

sudo strace insmod mod.ko


    Как видно на изображении выше, сразу происходит запуск утилиты insmod с помощью системного вызова execve(), далее происходит доступ к некоторым библиотекам, происходит чтение данных, далее с помощью mmap() происходит отображение(или проецирование) файла на память, а с помощью mprotect() контролируется доступ к этой памяти, если какой-то процесс решит совершить недозволенное, тут же получит SIGSEGV, что приведет к аварийному завершению с дампом памяти по умолчанию.
    Так как ядро в linux это монолит и имеет общее адресное пространство, то можно предпотожить что файл модуля будет отображен именно в это адресное пространство ядра. 



AlphaGo wins first match with Go Champion


пятница, 4 марта 2016 г.

Сборка ядра | Linux kernel 4.4.4

    Сердце linux-дистрибутивов - Linux kernel. Новая функциональность появляется в ядре и потом используется в юзерспейсе.
    В этой статье я не буду рассказывать о самом ядре, а буду рассказывать о том, как его собрать и установить из исходников и при необходимости с помощью пакетного менеджера. Начнем со сборки из исходников. Сборка ядра из исходных кодов может понадобиться вам, если например необходимые драйверы устройств есть только в последней версии, а в репозитории ее еще нет. Может требуется использовать новый функционал, или небходимо собрать ядро содержащее отладочную информацию, или просто хочется just for fun внести свои изменения в ядро и посмотреть как это будет работать.
    Узнать доступные версии релизов можно по адресу https://www.kernel.org/. Там есть номера стабильных релизов, и тестовых, находящихся в разработке.

    Первоначально, я начал было собирать ядро в директории /usr/src/ , так как в некоторых статьях поступают именно так и ничего не объясняют, по поводу того, почему исходники должны быть там, но потом добрался до файла README, который идет вместе с ихдодными кодами, и вот что там написано:

INSTALLING the kernel source:

 - If you install the full sources, put the kernel tarball in a
   directory where you have permissions (eg. your home directory) and
   unpack it:

     xz -cd linux-4.X.tar.xz | tar xvf -

   Replace "X" with the version number of the latest kernel.

   Do NOT use the /usr/src/linux area! This area has a (usually
   incomplete) set of kernel headers that are used by the library header
   files.  They should match the library, and not get messed up by
   whatever the kernel-du-jour happens to be.

    Надеюсь вы все умеете читать читать по-английски, правда? Ну ладно, там говорится о том, что если вы устанавливаете полную версию ядра, то необходимо будет положить архив в директорию для работы с которой вы имеете разрешения(права), например в домашнюю директорию и там уже распаковать. Также сказано не использовать директорию /usr/src/linux , даже с восклицательным знаком) Эта область содержит набор kernel headers, которые используются library header files. Они не должны совпадать с библиотечными, и не должны смешиваться, иначе может случиться kernel-du-jour (биг траблс?=)), в любом случае могут быть проблемы, так что не стоит.



    Перейдем в ~/ и cкачаем последний stable релиз:

cd ~/

sudo wget https://www.kernel.org/pub/linux/kernel/v4.x/linux-4.4.4.tar.xz

    Распакуем и перейдем в созданную директорию:

sudo tar -xJf linux-4.4.4.tar.xz

cd linux-4.4.4/

    Моя статья конечно не супер оригинальная, но когда читаешь инструкцию по установке ядра, хочется знать за что отвечает каждая команда, а не просто сделайте make oldconfig  а дальше запускаем make menuconfig.
    Так вот, make oldconfig нужен, если вы хотите использоват старую конфигурацию ядра, для его новой версии, то есть с какими настройками было собрано старое ядро, с такими будет собрано и новое. После такого действия не обязательно уже самому настраивать конфигурацию. Но мы всё-таки настроим, как минимум нужно включить отладочную информацию. 
    Menuconfig в  качестве зависимости требует ncurses - библиотека, написанная на С и Ада предназначенная для управления вводом-выводом на терминал, позволяет задавать экранные координаты и цвет выводимых символов, писать переносимый код и не беспокоиться о различии терминалов.

sudo apt-get install ncurses-dev

sudo make menuconfig


    Включение отладочной информации:
 Kernel hacking  --->
   [*] Compile the kernel with debug info
   [*] Compile the kernel with frame pointers

    На счет второго пункта kernel.org говорит следующее:

    It is advised, but not required that you turn on the CONFIG_FRAME_POINTER kernel option which is called "Compile the kernel with frame pointers" in the config menu. This option inserts code to into the compiled executable which saves the frame information in registers or on the stack at different points which allows a debugger such as gdb to more accurately construct stack back traces while debugging the kernel.
 
    Чтобы вы понимали, что у вас всегда есть выбор как конфигурировать(выдержка из файла README):

 - Alternative configuration commands are:

     "make config"      Plain text interface.

     "make menuconfig"  Text based color menus, radiolists & dialogs.

     "make nconfig"     Enhanced text based color menus.

     "make xconfig"     X windows (Qt) based configuration tool.

     "make gconfig"     X windows (GTK+) based configuration tool.

     "make oldconfig"   Default all questions based on the contents of
                        your existing ./.config file and asking about
                        new config symbols.

     "make silentoldconfig"
                        Like above, but avoids cluttering the screen
                        with questions already answered.
                        Additionally updates the dependencies.

     "make olddefconfig"
                        Like above, but sets new symbols to their default
                        values without prompting.

     "make defconfig"   Create a ./.config file by using the default
                        symbol values from either arch/$ARCH/defconfig
                        or arch/$ARCH/configs/${PLATFORM}_defconfig,
                        depending on the architecture.

     "make ${PLATFORM}_defconfig"
                        Create a ./.config file by using the default
                        symbol values from
                        arch/$ARCH/configs/${PLATFORM}_defconfig.
                        Use "make help" to get a list of all available
                        platforms of your architecture.

     "make allyesconfig"
                        Create a ./.config file by setting symbol
                        values to 'y' as much as possible.

     "make allmodconfig"
                        Create a ./.config file by setting symbol
                        values to 'm' as much as possible.

     "make allnoconfig" Create a ./.config file by setting symbol
                        values to 'n' as much as possible.

     "make randconfig"  Create a ./.config file by setting symbol
                        values to random values.

     "make localmodconfig" Create a config based on current config and
                           loaded modules (lsmod). Disables any module
                           option that is not needed for the loaded modules.

                           To create a localmodconfig for another machine,
                           store the lsmod of that machine into a file
                           and pass it in as a LSMOD parameter.

                   target$ lsmod > /tmp/mylsmod
                   target$ scp /tmp/mylsmod host:/tmp

                   host$ make LSMOD=/tmp/mylsmod localmodconfig

                           The above also works when cross compiling.

     "make localyesconfig" Similar to localmodconfig, except it will convert
                           all module options to built in (=y) options.

   You can find more information on using the Linux kernel config tools
   in Documentation/kbuild/kconfig.txt.



    Всё сохраняем после настройки и выходим. Компилируем ядро командой:

sudo make

    У кого-то может появиться в процессе ошибка "scripts/sign-file.c:23:30: fatal error: openssl/opensslv.h: No such file or directory". Установим libssl-dev:

sudo apt-get install libssl-dev

    После того как make завершила работу, нужно скомпилировать модули ядра:

make modules

    Потом установиить их:

make modules_install

    И наконец, установить новое ядро:

make install

    Ну и в заключение перезагружаем систему и смотрим версию ядра командой:

uname -r

    
    Как видим, просто собрать и самому установить ядро не составляет труда, а вот его конфигурация, оптимизация и так далее, требует опыта и знаний. Спасибо что прошли вместе со мной этот квест, все вопросы и пожелания попрошу вас оставлять в комментариях!

четверг, 3 марта 2016 г.

Быстрая настройка SSH и цветовых тем для VIM

SSH  

  Привет, если вы уже установили ssh командой "sudo apt-get install ssh", то нужно его немного настроить. Файлы конфигурации находятся в /etc/ssh/ .
    Если вы хотите запускать графические приложения на удаленном сервере, то в файле клиента, который называется ssh_config, необходимо найти и установить следующим образом ключи:


ForwardX11 yes
ForwardX11Trusted yes


    Не забываем запускать текстовый редактор от root`a, чтобы сохранить изменения. Можно и не менять клиентские настройки, при этом запускать графические приложения на удаленном сервере необходимо следующим образом:

ssh -X username@hostip

    Серверный конфиг, файл sshd_config. Разрешим серверу запускать графические приложения и отправлять их клиенту:

X11Forwarding yes
X11DisplayOffset 10
X11UseLocalhost yes

    Можем изменить порт, от заинтересованных людей это вас не спасет, но немного увеличит время сканирования портов. В том же файле sshd_config найдем строчку Port, и изменим, записав "Port номер_порта". Не знаю как вы, а я обычно хочу знать, что стоит за абстрактным понятием порт. Идем смотреть wiki:

    Порт - натуральное число, записываемое в заголовках протоколов транспортного уровня модели OSI ( TCP, UDP, SCTP, DCCP ). Используется для определения процесса-получателя пакета в пределах одного хоста.

    Вот так всё просто. Еще полезно знать, что номер порта - число в диапазоне от 1 до 2^16-1 = 65 535. Стандартный номер порта для протокола SSH - 22.
    Для того что бы увидеть структуру сообщений и лично убедиться, можно воспользоваться утилитой tcpdump. Если она не установлена, то вот так можно установить:

sudo apt-get install tcpdump

    Дальше можно запустить утилиту и начать прослушивать трафик:

sudo tcpdump -ne -i wlan0

    Здесь ключ -ne обозначает, что мы не хотим, чтобы утилита tcpdump перобразовывала ip-адреса в доменное имя и еще чтобы выводила информацию канального уровня.
    Можно слушать только определенный порт:

tcpdump -i  wlan0 dst 10.0.0.5 and port 22

    В отчете программы все хорошо видно, порты, адреса:


    Перезапустим сервис:

sudo /etc/init.d/ssh restart

    Подключаться по ssh можно так:

ssh -p 7834 username@hostip

    Если на сервере доступна утентификация по паролю, то появится приглашение ввести его. После подключения, мы можем делать всё тоже, что и на локальной машине.
    Очень полезна утилита scp, которая входит в состав openssh. С ее помощью можно копировать файлы как на сервер так и с сервера. 
    Команда копирования файла на удаленный хост:

scp SourceFile user@host:/directory/TargetFile

    Команда копирования файла с удаленного хоста:

scp user@host:/directory/SourceFile   TargetFile

    По SSH пока всё, далее научимся устанавливать цветовые темы для VIM.




Установка цветовых тем для VIM

    Огромное количество красивых тем для vim можно найти на сайте http://vimcolors.com/


    
    Нажимаете на понравившуюся тему, и там будет внизу ссылочка на GitHub. Можно скачать как .zip так и с помощью git, для этого он у вас понятное дело должен быть установлен.

git clone https://github.com/KKPMW/moonshine-vim.git

     Далее создадим в домашней директории каталог .vim/colors/ и сопируем туда темы:

cp ~/moonshine-vim/colors/*  ~/.vim/colors/

    После этого, в файл /etc/vim/vimrc добавить следующие строчки:

set t_Co=256
color moonshine_lowcontrast

    Это нужно для того, что бы темы, использующие 256 цветов, отображались нормально. А строка "color moonshine_lowcontrast" указывает vim какую тему использовать по умолчанию.


    На этом всё. И vim и ssh и git заслуживают каждый отдельной статьи, но это уже в следующий раз)



среда, 2 марта 2016 г.

Настраиваем рабочее окружение - устанавливаем Make, Vim, GCC, GDB, SSH.

    Приветствую вас, мои дорогие читатели! Так как программировать мы будем под Linux, то для того, чтобы делать это красиво комфортно и продуктивно, произведем некоторые манипуляции и настроим свое рабочее окружение, так называемый юзерленд. Установим инструменты и подготовим их к работе.
    Что будем устанавливать? Первоначально самое необходимое:
       Make - утилита, автоматизирующая процесс преобразования файлов из одной формы в другую. Чаще всего это компиляция исходного кода в объектные файлы и последующая компоновка в исполняемые файлы или библиотеки. [wiki]
       Vim   - свободный текстовый редактор, созданный на основе vi. Хорошо настраивается, имеет множество надстроек и расширений. Поддерживает подсветку синтаксиса и использование тем для ее настройки. [wiki]
       GCC  - gnu compiler collection, набор компиляторов для различных языков программирования, включая Ada, С, С++, Фортран, Java, Objective-C, Go. Поддерживает множество архитектур и процессоров. [wiki]
       GDB  - gnu debugger, отладчик используемый на многих Unix-подобных системах, поддерживает много языков программирования. [wiki]
       SSH   - secure shell("безопасная оболочка") - сетевой протокол прикладного уровня, позволяющий производить удаленное управление операционной системой и туннелирование TCP-соединений(например для передачи файлов). Шифрует весь трафик, включая передаваемые пароли. [wiki]

    Первое что мы сделаем, это установим нормальные шрифты, чтобы после продолжительных настроек конфигов и программирования, глаза были умеренно красными)
    Наберем в терминале:


sudo apt-get install xfonts-terminus


    Было:


    Зайдем в Prifile Preferences терминала, и выберем установленный шрифт:


    Стало:


    Еще лучше terminus смотрится при работе с исходниками.

Make

    Если вы используете дистрибутив на базе Ubuntu, то скорее всего, утилита make там уже установлена. Проверить это, а так же ее версию можно набрав в терминале:

make --version


    Если по какой-то причине не установлен, набираем в терминале:

sudo apt-get update
sudo apt-get install make

    Но дело в том, что apt-get update не всегда может обеспечить вас новыми версиями программ, новых версий в стандартном репозитории может и не быть. Чтобы узнать доступные версии программы в репозитории, нужно набрать:

apt-cache show имя_вашей_программы

    Для того что бы убедиться в актуальности установленной программы, я рекомендую сходить на ее официальный сайт, ftp-сервер и посмотреть на версии. Заходим на http://ftp.gnu.org/gnu/make/ , и видим что наша версия 3.81 датируется 2006`м годом. Скачаем самую новую версию - файл make-4.1.tar.gz от 5 октября 2014 года.


wget http://ftp.gnu.org/gnu/make/make-4.1.tar.gz

Распакуем:

tar -xvzf make-4.1.tar.gz

    Где ключ: 

  • -f должен располагаться последним, а вслед за ним сразу должен следовать путь к сжатому файлу.
  • -z говорит tar что нужно распаковать файл упакованный gzip.
  • -x указывает на необходимость извлечения файлов.
  • -v показывает в процессе распаковки все извлеченные файлы.
    Утилита gzip не может сжимать только один файл, для объединения файлов в архив и используется утилита tar.
   Перейдем в директорию распакованного архива. Перед компиляцией, рекомендую читать README файл, в нем содержится общая информация, NEWS файл, содержит информацию о последних изменениях нововведениях и исправлениях, в том числе касающихся обратой совместимости со стандартом .POSIX . Если читать манулы, меньше придется бегать на stackoverflow, в поисках ответов на глупые ошибки. Ну и еще нужно заглянуть в файл INSTALL, где содержатся инструкции по установке.
    Если вы как и я, попробуете устанавливать все эти программы на виртуальной машине, в которой архитектура определена как i686, а хост-машина у вас x86-64, то при попытке проведения конфигурации возможны ошибки, такие как "error: C compiler cannot create executables" и другие. Установка следующего пакета должна решить проблему:

sudo apt-get install build-essential

    Дальше можно конфигурировать:

./configure

    Дальше:

make

    Дальше запустить тесты идущие в комплекте:

make check

    Если всё хорошо, увидите что-то вроде:


    И наконец:

sudo make install


    Стоит отметить, что некоторые негативно высказываются по поводу использования "make install", например на хабре. Говорят о том, что хоть "make install" и указывается в инструкциях по установке, использование этой команды может привести к последующим проблемам при обновлении и удалении устанавливаемых программ. "make install" не устанавливает все файлы программы в одну директорию например, как это происходит в windows, а как известно, размазывает файлы по всей файловой системе, и происходит это всё "мимо кассы", пакетный менеджер ничего не знает об установке. А что делает пакетный менеджер? Он следит при установке пакетов так же за всеми зависимостями, сохраняет информацию об расположении всех установленных файлов, что бы при необходимости обновления например, пользователь мог удалить старую версию программы и все ее следы в системе одной командой.
    Так, темерь наш новый make установлен, но если ввесли в терминале "make --version", то отобразиться все еще старая версия. Новая находится в /usr/local/bin/make. Не спешите копировать исполняемый файл в /usr/bin/. Если вы хотите использовать новую версию только в текущей сессии, то следует экспортировать переменную окружения PATH:

export PATH=/usr/local/bin:$PATH

    Переменная окружения PATH, нужна для того, чтобы указать командной оболочке(в нашем случае bash), путь к исполняемым файлам. Больше информации по PATH здесь.
    Если же вы хотите использовать новуб версию программы по умолчанию, вам необходимо найти в домашней директории файл .bashrc - файл(является скрытым, используем ls -la для нахождения), в котором определяются пользовательские настройки для bash, если не нашли, значит его там нет, и можно создать свой. Пишем:

sudo nano .bashrc

   Вместо nano, можно использовать любой другой редактор. И записываем в этот файл:

export PATH=/usr/local/bin:$PATH


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


    

GCC


    Сам gcc зависит еще от трех библиотек, так что там необходимо скачать их самые новые версии и скомпилировать. Эти три библиотеки  - это gmp, mpc и mpfr. 
    Найти gmp - The GNU Multiple Precision Arithmetic Library можно здесь https://gmplib.org/. Скачаем:

wget https://gmplib.org/download/gmp/gmp-6.1.0.tar.lz

    Для того, чтобы распаковать .tar.lz необходимо установить lzip:

sudo apt-get install lzip

    Распакуем:

tar --lzip -xvf gmp-6.1.0.tar.lz

    Перейдем в директорию распакованного gmp:

cd gmp-6.1.0/

    Создадим директорию Build и перейдем туда:

mkdir build && cd build

    Далее:

../configure
make
sudo make install

    Компиляция завершилась успешно:


    Скачиваем следующую библиотеку MPC:

wget ftp://ftp.gnu.org/gnu/mpc/mpc-1.0.3.tar.gz
tar -xvzf mpc-1.0.3.tar.gz

    Точно так же устанавливаем:

cd mpc-1.0.3/
mkdir  build  &&  cd  build/
../configure

    Может появиться ошибка "configure: error: gmp.h cannot be found or is unusable.". В общем не знаю каким образом, но я еще раз сделал "sudo make install" для gmp и ошибки при компиляции mpc и mpfr пропали. После ".configure" делаем:

make

    Потом запускаем тесты:

make check

    Потом:

sudo make install


    Скачаем и распакуем MPFR:

wget http://www.mpfr.org/mpfr-current/mpfr-3.1.3.tar.xz
tar -xf mpfr-3.1.3.tar.xz 

    Точно так же собираем mpfr:

cd mpfr-3.1.3/
mkdir build && cd build/
../configure
make
make check
sudo make install



    Скачаем самую свежую версию gcc с одного из официальных зеркал и распакуем:

wget ftp://gnu.mirror.iweb.com/gcc/gcc-5.3.0/gcc-5.3.0.tar.gz
tar -xvzf gcc-5.3.0.tar.gz
    Затем:

./configure
make
sudo make install
    На самом деле новый gcc можно было установить и следующим образом, из тестового репозитория:

sudo add-apt-repository ppa:ubuntu-toolchain-r/test

sudo apt-get update

sudo apt-get install gcc-5 g++-5
sudo update-alternatives 
sudo update-alternatives --remove-all gcc
sudo update-alternatives --remove-all g++
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-5 20
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-5 20
sudo update-alternatives --config gcc
sudo update-alternatives --config g++
    Но ничего, компиляция из исходников тоже полезна=)




Vim

    Для установки Vim, просто введите:


sudo apt-get install vim

    Настройкой и изучением vim займемся позже.


GDB

    Он уже либо установлен, либо можете установить командой:


sudo apt-get install gdb


SSH

    SSH-клиент и ssh-сервет пока просто установим командой:


sudo apt-get install ssh

    Сделаем настройки и узнаем для чего он нужен тоже в следующей статье.

    Все, пока можем отдохнуть, давайте послушаем замечательную Holly Henry:


вторник, 1 марта 2016 г.

Просветляемся - устанавливаем оконный менеджер Enlightenment

    Привет. Так уж получилось, что на данный момент я являюсь пользователем дистрибутива Linux Mint. Того, который основан на кодовой базе Ubuntu, а не Debian. Конечно, он поставляется в различных упаковках(читай с различным окружением рабочего стола), Cinnamon, MATE, Xfce, KDE. Из дистрибутивов, я непродолжительное время пользовался такими как Ubuntu, Mint, Kali linux, Fedora, OpenSUSE,  запускал пару раз Red Hat Enterprise Linux. Из всего этого зоопарка, я остановился на Linux Mint. Главным аргументом в пользу mint была кодовая база ubuntu, возможность получить из стандартного репозитория практически любой необходимый софт. Ну а еще, mint показал себя как более стабильный дистрибутив чем ubuntu, ubuntu то падала без причины, то зависала, точно так же без причины на нескольких компьютерах на которых я ее тестировал. В общем, сравнение дистрибутивов это один сплошной холивар, достойный отдельной статьи.
    В качестве окружения для mint`a  я выбирал cinnamon, до тех пор пока он не начал беспричинно падать, хотя здесь тоже есть моменты, проблемы могли возникать и из-за видео драйвера, кто знает. И когда используешь Cinnamon на компьютере послабее, он чувствуется как тяжеловесный, и начинает подвисать. При старте свежей системы с cinnamon она занимает около 270 мб. , что для линукса не самые лучшие результаты.


    И начинаешь думать как это улучшить или чем заменить, и после непродолжительных поисков оказалось что есть, и имя этой альтернативе - Enlightenment или просто E17.


    Что википедия говорит по этому поводу? Википедия говорит, что Enlightenment это оконный менеджер для X Window System(иксы, X.org).  Он легковесный, быстрый, хорошо кастомизируемый и расширяемый. Как можно узнать из той же wiki, e17 был полностью переписан. E17 работает не только в Linux но и в Windows? Mac OS X, *BSD, и даже на PS3.

Ну что же, давайте установим Enlightenment в Linux Mint. Для этого необходимо ввести в терминале:

sudo apt-get install e17

    После установки делаем Log out, и выбираем оконный менеджер из списка доступных(установленных). При первой загрузке нас попросят настроить несколько параметров:





Вот так выглядит Enlightenment e17 при первом запуске.


Почти все настройки в Enlightenment можно произвести из меню: кликнуть левой кнопкой мыши на пустом участке рабочего стола -> Settings -> Settings Panel.

Вот так можно убрать ненужные иконки с рабочего стола.


Панель, которая называется shelf, можно изменять на свой вкус, или вообще удалить.



Можно добавлять и удалять приложения, отображающиеся на панели.


Можно изменять вид окон, убрать например borders, и получить среду наподобие тайловых менеджеров типа OpenBox, xmonad, awesome.



И как видим e17 менее прожорливый нежели cinnamon(переводится как "корица").


    Не забудьте поместить на shelf свой любимый файловый менеджер, потому что дефолтный никуда не годится.
    Если у вас несколько мониторов, поищите информацию об утилите xrandr, и о том как создать для нее конфигурационный файл, она поможет настроить вам такие параметры как дублирование рабочего стола, разрешение экрана и много другое.
    В заключение хочется сказать, что linux очень и очень кастомизируемый, не бойтесь делать ошибки, изучайте, устанавливайте и переустанавливайте, настраивайте, ведь только так придет опыт. Изучение Linux это определенно марафон, но оно того стоит, удачи!

Официальный сайт проекта: https://www.enlightenment.org/