Pull to refresh

Ubuntu Core как облегченная альтернатива Ubuntu

Ubuntu Core — это минимальная заготовка корневой файловой системы с поддержкой репозиториев Ubuntu и установкой пакетов с помощью apt-get. Доступна для платформ i386, amd64 и armel.

Почему бы не использовать такую заготовку при создании desktop-системы, чтобы минимизировать количество неиспользуемых пакетов? Ниже описание процесса установки до запуска среды рабочего стола на виртуальной машине в качестве proof-of-concept.

Весь процесс установки проводится из среды Live-CD Ubuntu 12.04. На виртуальной машине подключен единственный жесткий диск и установка будет проведена на один раздел, без создания swap'а. Архив Ubuntu Core взят здесь.

Приготовления


Создадим простейшую разметку на диске (создайте дополнительные разделы и swap по желанию):
$ sudo -s
# parted /dev/sda
(parted) mklabel gpt
(parted) mkpart primary ext4 0 -1
Warning: The resulting partition is not properly aligned for best performance.
Ignore/Cancel? Ignore
(parted) name 1 root
(parted) set 1 boot on

Отформатируем единственный созданный раздел в ext4:
# mkfs -t ext4 /dev/sda1
Примонтируем раздел и распакуем заготовку:
# mkdir /mnt/target && mount /dev/sda1 /mnt/target
# cd /mnt/target && tar -xf ~/Downloads/ubuntu-core-12.04-core-amd64.tar.gz

Теперь можно примонтировать dev/proc/sysfs к целевой файловой системе и сменить корневую директорию:
# mount --bind /dev /mnt/target/dev
# mount -t proc proc /mnt/target/proc
# mount -t sysfs sysfs /mnt/target/proc
# chroot /mnt/target


Настройка новой системы


По желанию, отключим автоматическую установку рекомендованных пакетов:
# cat > /etc/apt/apt.config.d/00local
APT::Install-Recommends "0";
APT::Install-Suggests "0";
^D

И приготовимся к установке других пакетов:
# apt-get update && apt-get upgrade

Локаль

Для начала, разберемся с языками и локалями…
# apt-get install language-pack-en language-pack-ru
# update-locale LC_ALL=en_US.UTF8


Общеупотребительные пакеты

Обязательно добавим общеупотребительные пакеты (sudo, less, vim-tiny, iputils-ping, net-tools и другие):
# apt-get install ubuntu-minimal

Сеть

Чтобы неожиданно не остаться в off-line'е после грядущей перезагрузки, настроим сеть (Ethernet с DHCP-сервером в данном случае, делайте настройки под вашу конфигурацию!):
cat >> /etc/network/interfaces
auto eth0
iface eth0 inet dhcp
^D


Пользователи

Создадим хотя бы одного пользователя, иначе система так и останется вещью в себе, и зададим ему пароль:
# useradd -m -s /bin/bash -G adm,cdrom,sudo,dip,plugdev core-admin
# passwd core-admin
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully


Репозитории пакетов

Подключите репозитории universe, если ядро будет собираться с помощью make-kpkg, иначе по желанию:
sed -i.original 's/^# \(deb.*precise.*universe\)$/\1/' /etc/apt/sources.list
(или отредактируйте файл /etc/apt/sources.list вручную с помощью vim.tiny)
Если планируется установка пакетов из других репозиториев, можно добавить их на этом этапе.

Ядро


Из репозитория

Самый простой, быстрый и универсальный вариант — установить ядро из репозитория:
# apt-get install linux-generic

Из исходных кодов

По желанию или при необходимости, можно собрать ядро из исходных кодов (см. руководство; здесь используется The Old-Fashioned Debian Way).
Установим пакет с исходным кодом ядра и инструменты для сборки:
# apt-get install linux-source build-essential kernel-package libncurses5-dev
(libncurses5-dev понадобится для выполнения make nconfig, более удобного, чем старый menuconfig)

Распакуем архив с исходным кодом ядра куда-нибудь для сборки:
# sudo -iu core-admin
(права суперпользователя не понадобятся до самой установки нового ядра в систему)
$ mkdir ~/src
$ cd ~/src && tar -xf /usr/src/linux-source-<version>.tar.bz2
$ cd linux-source-<version>

Настроим, взяв за основу конфигурацию по умолчанию (make defconfig) заточенную под целевую систему (make localmodconfig):
$ make defconfig && make localmodconf && make nconfig
Запустим сборку в несколько потоков (-j N) с измерением времени выполнения (time cmd):
$ time fakeroot make-kpkg -j 4 --initrd kernel-image kernel-headers
Установим новое ядро:
$ cd ..
(собранные пакеты находятся на уровень выше исходных кодов)
$ sudo dpkg -i linux-image-<version>.deb linux-headers-<version>.deb

Загрузчик


Теперь, чтобы система стала самостоятельной, ей нехватает только загрузчика. Установим стандартный для Ubuntu grub2:
$ sudo apt-get install grub2

Среда рабочего стола


Самые сложные этапы уже выполнены и система готова к самостоятельной загрузке (будем надеяться, я ничего не пропустил… скрещу пальцы на удачу). Осталось только поставить обещанную среду рабочего стола, что и сделаем (выберите вместо unity-* то, что вам больше нравится):
# apt-get install xorg lightdm unity-greeter gnome-session unity-2d

Заключение


После выполнения всех этапов (я не ставил ядро из репозитория — больше 150 МБ и сбросил кэш системы управления пакетами, apt-get clean; но зато для пересборки ядра был установлен тяжелый пакет build-essential) система занимает на диске не больше 1,8 ГБ.
После тренировок «на кошках» (на виртуальной машине) разворачивание настольной системы из Ubuntu Core не представляет каких-либо сложностей. Возможно, еще немного подумав, я проведу более жизненный эксперимент перейдя таким образом на Ubuntu 12.04 вместо обновления установленной 11.10.

Примечания

  • В полученной системе могут отсутствуют man/info pages, если об этом не позаботиться специально, не удивляйтесь.
  • Среда рабочего стола может выглядеть местами убого, если не доставить привычные темы, примочки и фенечки.
  • Некоторые ссылки на packages.ubuntu.com не работали на момент публикации (500 Internal Server Error). Полагаю, это временное явление.
  • В качестве виртуальной машины я использовал VirtualBox. Ее образы жестких дисков легко монтируются к хост-системе с помощью qemu-nbd (см. How to mount a VirtualBox VDI image) и большую часть работы (в том числе ресурсоемкую сборку ядра) можно сделать прямо из хост-системы.
Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.