APT HOWTO
Глава 3 - Керування пакунками
3.1 Оновлення списку наявних пакунків
Система керування пакунками використовує свою власну базу даних для відслідковування вже встановлених, не встановлених та доступних для встановлювання пакунків. Програма apt-get використовує цю базу даних як джерело інформації про пакунки, вказані користувачем в запиті на встановлення, та з'ясування, які додаткові пакунки є необхідними, щоб вибраний пакунок працював належним чином.
Для оновлення цієї бази ви можете скористатись командою apt-get update. Ця команда переглядає списки пакунків в архівах, вказаних в /etc/apt/sources.list; див. розділ 2.1, щоб дізнатись більше про цей файл.
Було б непогано запускати цю команду регулярно, щоб ви та ваша система були проінформованими щодо можливих оновлень пакунків і, особливо, оновлень їх безпеки.
3.2 Встановлення пакунків
Нарешті, те, чого всі так довго чекали! Коли ваш sources.list готовий і список доступних пакунків оновлено, вам залишається лише запустити apt-get, щоб встановити бажаний пакунок. Наприклад, ви можете виконати:
# apt-get install xchat
APT спробує знайти в базі даних найсвіжішу версію цього пакунку та завантажити його з відповідного архіву, визначеного в sources.list. У випадку, коли цей пакунок залежить від іншого — як наведено нижче — APT перевірить залежності та встановить всі потрібні пакунки. Наприклад:
# apt-get install nautilus
Reading Package Lists... Done
Building Dependency Tree... Done
The following extra packages will be installed:
bonobo libmedusa0 libnautilus0
The following NEW packages will be installed:
bonobo libmedusa0 libnautilus0 nautilus
0 packages upgraded, 4 newly installed, 0 to remove and 1 not upgraded.
Need to get 8329kB of archives. After unpacking 17.2MB will be used.
Do you want to continue? [Y/n]
Пакунок nautilus залежить від вказаних бібліотек спільного користування, тому APT також завантажить їх з архіву. Якщо ви вкажете їх назви в командному рядку при запуску apt-get, APT не буде запитувати, чи хочете ви продовжувати, а автоматично прийме рішення, що ви бажаєте встановити всі ті пакунки.
Це означає, що APT потребує підтвердження лише в тому випадку, коли потрібно встановити пакунки, які не були згадані в командному рядку.
Наступні параметри apt-get можуть стати в нагоді:
-h Текст довідки.
-d Тільки завантажити — НЕ встановлювати і НЕ розпаковувати пакунки
-f Продовжувати, навіть якщо перевірка цілісності завершилась невдачею
-s Не виконувати реальних дій, імітувати їх виконання
-y Вважати Yes відповіддю на всі запитання, не виводити їх
-u Також показувати список оновлених пакунків
В одному рядку можна вказувати декілька пакунків для встановлення. Завантажені з мережі файли поміщаються в теку /var/cache/apt/archives для подальшого встановлення.
Також, в тому ж командному рядку ви можете вказати пакунки, які потрібно видалити. Просто помістіть знак '-' одразу ж після назви обраного для видалення пакунка, наприклад:
# apt-get install nautilus gnome-panel-
Reading Package Lists... Done
Building Dependency Tree... Done
The following extra packages will be installed:
bonobo libmedusa0 libnautilus0
The following packages will be REMOVED:
gnome-applets gnome-panel gnome-panel-data gnome-session
The following NEW packages will be installed:
bonobo libmedusa0 libnautilus0 nautilus
0 packages upgraded, 4 newly installed, 4 to remove and 1 not upgraded.
Need to get 8329kB of archives. After unpacking 2594kB will be used.
Do you want to continue? [Y/n]
Перегляньте Видалення пакунків, розділ 3.3, щоб детальніше ознайомитись з видаленням пакунків.
Якщо ви якимсь чином пошкодили встановлений пакунок чи просто хочете перевстановити файли з пакунка більш нової доступної версії, можете скористатись параметром --reinstall, ось так:
# apt-get --reinstall install gdm
Reading Package Lists... Done
Building Dependency Tree... Done
0 packages upgraded, 0 newly installed, 1 reinstalled, 0 to remove and 1 not upgraded.
Need to get 0B/182kB of archives. After unpacking 0B will be used.
Do you want to continue? [Y/n]
3.3 Видалення пакунків
Якщо ви більше не бажаєте використовувати пакунок, ви можете видалити його з вашої системи за допомогою APT. Для цього просто наберіть apt-get remove пакунок. Наприклад:
# apt-get remove gnome-panel
Reading Package Lists... Done
Building Dependency Tree... Done
The following packages will be REMOVED:
gnome-applets gnome-panel gnome-panel-data gnome-session
0 packages upgraded, 0 newly installed, 4 to remove and 1 not upgraded.
Need to get 0B of archives. After unpacking 14.6MB will be freed.
Do you want to continue? [Y/n]
Як можна побачити в прикладі вище, APT також турбується про видалення тих пакунків, які залежать від пакунка, вибраного для видалення. Видалити пакунок, не видаляючи при цьому тих пакунків, які залежать від нього, за допомогою APT неможливо.
Запуск apt-get так, як показано вище, видалить пакунки, однак їх конфігураційні файли, якщо такі існують, залишаться в системі неушкодженими. Для повного видалення пакунку виконайте:
# apt-get --purge remove gnome-panel
Reading Package Lists... Done
Building Dependency Tree... Done
The following packages will be REMOVED:
gnome-applets* gnome-panel* gnome-panel-data* gnome-session*
0 packages upgraded, 0 newly installed, 4 to remove and 1 not upgraded.
Need to get 0B of archives. After unpacking 14.6MB will be freed.
Do you want to continue? [Y/n]
Зверніть увагу на символ '*' після назв пакунків. Це вказує на те, що конфігураційні файли кожного з цих пакунків також будуть видалені.
Як і у випадку методу install, ви можете скористатись спеціальним символом при remove, щоб інвертувати його дію для конкретного пакунка. У випадку видалення, якщо ви додаєте знак '+' одразу після назви пакунка, то такий пакунок буде встановлений, а не видалений.
# apt-get --purge remove gnome-panel nautilus+
Reading Package Lists... Done
Building Dependency Tree... Done
The following extra packages will be installed:
bonobo libmedusa0 libnautilus0 nautilus
The following packages will be REMOVED:
gnome-applets* gnome-panel* gnome-panel-data* gnome-session*
The following NEW packages will be installed:
bonobo libmedusa0 libnautilus0 nautilus
0 packages upgraded, 4 newly installed, 4 to remove and 1 not upgraded.
Need to get 8329kB of archives. After unpacking 2594kB will be used.
Do you want to continue? [Y/n]
Зауважте, що apt-get виводить список додаткових пакунків, котрі будуть встановлені (таких, чиє встановлення є необхідною умовою для правильного функціонування пакунків, вказаних у початковому запиті на встановлення), пакунків, котрі будуть видалені, та загалом пакунків, котрі будуть встановлені (включаючи і додаткові пакунки також).
3.4 Оновлення пакунків
Оновлення пакунків — визначне досягнення системи APT. Це можна робити за допомогою однієї-єдиної команди: apt-get upgrade. Ви можете використовувати її і для оновлення пакунків з однієї і тієї ж збірки, і у випадку переходу до збірки нової, хоча, для останнього рекомендується використовувати apt-get dist-upgrade (див. Оновлення до нового випуску, розділ 3.5, щоб дізнатись про це більше).
Доцільно запускати цю команду з опцією -u. За її використання APT виводить повний список пакунків, котрі будуть оновлені. Без неї ви будете оновлюватись всліпу. APT завантажить останні версії кожного з пакунків та встановить їх в правильному порядку. Перед оновленням пакунків завжди важливо виконувати apt-get update. Перегляньте Оновлення списку наявних пакунків, розділ 3.1. Наприклад:
# apt-get -u upgrade
Reading Package Lists... Done
Building Dependency Tree... Done
The following packages have been kept back
cpp gcc lilo
The following packages will be upgraded
adduser ae apt autoconf debhelper dpkg-dev esound esound-common ftp indent
ipchains isapnptools libaudiofile-dev libaudiofile0 libesd0 libesd0-dev
libgtk1.2 libgtk1.2-dev liblockfile1 libnewt0 liborbit-dev liborbit0
libstdc++2.10-glibc2.2 libtiff3g libtiff3g-dev modconf orbit procps psmisc
29 packages upgraded, 0 newly installed, 0 to remove and 3 not upgraded.
Need to get 5055B/5055kB of archives. After unpacking 1161kB will be used.
Do you want to continue? [Y/n]
Процес є дуже простим. Відзначте, що в одному з перших рядків apt-get вказує на те, що деякі пакунки були kept back. Це означає, що є нові версії цих пакунків, але вони не можуть бути встановлені з деяких причин. Можливими причинами можуть бути неправильні залежності (вказану версію пакунка, від якого залежить даний, неможливо завантажити) або нові залежності (остання версія даного пакунка залежить від нового пакунка).
Для першого випадку не існує прозорого вирішення проблеми. В другому випадку доцільно запустити apt-get install, вказавши відповідний пакунок, що призведе до завантаження його залежностей. Більш прозорим рішенням буде використання dist-upgrade. Перегляньте Оновлення до нового випуску, розділ 3.5.
3.5 Оновлення до нового випуску
Ця можливість APT дозволяє вам оновлювати одразу всю систему Debian, або через Інтернет, або з нового компакт-диску (придбаного чи завантаженого як ISO-образ).
Це також використовується, коли зміни торкаються взаємозв'язків між встановленими пакунками. При використанні apt-get upgrade такі пакунки залишились би незайманими (kept back).
Наприклад, припустимо, що ви використовуєте редакцію 0 стабільної версії Debian та купуєте компакт з редакцією 3. Ви можете скористатись APT для оновлення вашої системи з нового КД. Для цього скористайтесь apt-cdrom (див. Додавання CD-ROM'у до файлу sources.list, розділ 2.4), щоб додати ваш КД до файлу /etc/apt/sources.list і запустіть apt-get dist-upgrade.
Важливо відзначити, що APT завжди шукає найсвіжіші версії пакунків. Тому, якщо до вашого списку в /etc/apt/sources.list було включено архів з пакунками більш нових версій, ніж на компакт-диску, APT буде завантажувати пакунки звідти.
В прикладі в одному з попередніх розділів (див. Оновлення пакунків, розділ 3.4) ми бачили, що деякі пакунки були kept back. Зараз ми вирішимо цю проблему за допомогою методу dist-upgrade:
# apt-get -u dist-upgrade
Reading Package Lists... Done
Building Dependency Tree... Done
Calculating Upgrade... Done
The following NEW packages will be installed:
cpp-2.95 cron exim gcc-2.95 libident libopenldap-runtime libopenldap1
libpcre2 logrotate mailx
The following packages have been kept back
lilo
The following packages will be upgraded
adduser ae apt autoconf cpp debhelper dpkg-dev esound esound-common ftp gcc
indent ipchains isapnptools libaudiofile-dev libaudiofile0 libesd0
libesd0-dev libgtk1.2 libgtk1.2-dev liblockfile1 libnewt0 liborbit-dev
liborbit0 libstdc++2.10-glibc2.2 libtiff3g libtiff3g-dev modconf orbit
procps psmisc
31 packages upgraded, 10 newly installed, 0 to remove and 1 not upgraded.
Need to get 0B/7098kB of archives. After unpacking 3118kB will be used.
Do you want to continue? [Y/n]
Зверніть увагу, що пакунки буде оновлено і, крім цього, також буде встановлено нові пакунки (нові залежності). Зауважте також, що lilo все ще залишається kept back. Він, ймовірно, має серйознішу проблему, ніж нова залежність. Ми можемо її з'ясувати, виконавши:
# apt-get -u install lilo
Reading Package Lists... Done
Building Dependency Tree... Done
The following extra packages will be installed:
cron debconf exim libident libopenldap-runtime libopenldap1 libpcre2
logrotate mailx
The following packages will be REMOVED:
debconf-tiny
The following NEW packages will be installed:
cron debconf exim libident libopenldap-runtime libopenldap1 libpcre2
logrotate mailx
The following packages will be upgraded
lilo
1 packages upgraded, 9 newly installed, 1 to remove and 31 not upgraded.
Need to get 225kB/1179kB of archives. After unpacking 2659kB will be used.
Do you want to continue? [Y/n]
Як з'ясувалось, lilo конфліктує з пакунком debconf-tiny, а отже не може бути встановленим (чи оновленим) без видалення debconf-tiny.
Щоб дізнатись, яким чином приймається рішення про збереження або видалення пакунка, спробуйте:
# apt-get -o Debug::pkgProblemResolver=yes dist-upgrade
Reading Package Lists... Done
Building Dependency Tree... Done
Calculating Upgrade... Starting
Starting 2
Investigating python1.5
Package python1.5 has broken dep on python1.5-base
Considering python1.5-base 0 as a solution to python1.5 0
Holding Back python1.5 rather than change python1.5-base
Investigating python1.5-dev
Package python1.5-dev has broken dep on python1.5
Considering python1.5 0 as a solution to python1.5-dev 0
Holding Back python1.5-dev rather than change python1.5
Try to Re-Instate python1.5-dev
Done
Done
The following packages have been kept back
gs python1.5-dev
0 packages upgraded, 0 newly installed, 0 to remove and 2 not upgraded.
Таким чином, легко помітити, що пакунок python1.5-dev не може бути встановленим через незадоволену залежність: python1.5.
3.6 Видалення непотрібних файлів пакунків: apt-get clean та autoclean
Коли ви встановлюєте пакунок, APT завантажує потрібні файли з джерел, вказаних в /etc/apt/sources.list, записує їх в локальне сховище (/var/cache/apt/archives/) і потім встановлює, як описано вище (див. Встановлення пакунків, розділ 3.2).
З часом локальне сховище може вирости і зайняти багато дискового простору. На щастя, APT забезпечує інструменти для керування локальним сховищем: методи apt-get — clean та autoclean.
apt-get clean видаляє все, за виключенням lock-файлів з /var/cache/apt/archives/ і /var/cache/apt/archives/partial/. Тому, у випадку перевстановлення пакунка, APT повинен буде завантажувати його знову.
apt-get autoclean — тільки ті файли пакунків, як більше не можна завантажити.
Наступний приклад демонструє роботу apt-get:
# ls /var/cache/apt/archives/logrotate* /var/cache/apt/archives/gpm*
logrotate_3.5.9-7_i386.deb
logrotate_3.5.9-8_i386.deb
gpm_1.19.6-11_i386.deb
В теці /var/cache/apt/archives є два файли пакунка logrotate та один файл пакунка gpm.
# apt-show-versions -p logrotate
logrotate/stable uptodate 3.5.9-8
# apt-show-versions -p gpm
gpm/stable upgradeable from 1.19.6-11 to 1.19.6-12
apt-show-versions показує, що logrotate_3.5.9-8_i386.deb забезпечує поточну версію logrotate, отже logrotate_3.5.9-7_i386.deb більше не потрібен. Також gpm_1.19.6-11_i386.deb є непотрібним, оскільки є можливість завантажити більш нову версію цього пакунка.
# apt-get autoclean
Reading Package Lists... Done
Building Dependency Tree... Done
Del gpm 1.19.6-11 [145kB]
Del logrotate 3.5.9-7 [26.5kB]
Отже, apt-get autoclean видаляє тільки застарілі файли. Щоб отримати більше інформації про apt-show-versions перегляньте Яким чином оновлювати пакунки зі специфічних версій Debian, розділ 3.9.
3.7 Використання APT з dselect
dselect — це програма, котра допомагає користувачам обирати пакунки Debian для встановлення. Вона виглядає дещо громіздкою і трохи нудною, але з часом ви можете звикнути до її термінального, основаного на ncurses, інтерфейсу.
Однією з особливостей dselect є її вміння враховувати те, що пакунки Debian можуть „рекомендувати“ і „пропонувати“ інші пакунки під час встановлення. Для використання програми запустіть dselect в якості користувача root. Оберіть apt в якості методу доступу. Насправді, це не обов'язково, але якщо ви не використовуєте компакт-диски і хочете завантажувати пакунки з Інтернету, це найкращий спосіб використання dselect.
Щоб краще зрозуміти, як працює dselect, прочитайте відповідну документацію. Її можна знайти на сторінці Debian http://www.debian.org/doc/ddp.
Після того, як ви за допомогою dselect вибрали пакунки, використовуйте
# apt-get -u dselect-upgrade
як показано в прикладі нижче:
# apt-get -u dselect-upgrade
Reading Package Lists... Done
Building Dependency Tree... Done
The following packages will be REMOVED:
lbxproxy
The following NEW packages will be installed:
bonobo console-tools-libs cpp-3.0 enscript expat fingerd gcc-3.0
gcc-3.0-base icepref klogd libdigest-md5-perl libfnlib0 libft-perl
libgc5-dev libgcc300 libhtml-clean-perl libltdl0-dev libsasl-modules
libstdc++3.0 metamail nethack proftpd-doc psfontmgr python-newt talk tidy
util-linux-locales vacation xbill xplanet-images
The following packages will be upgraded
debian-policy
1 packages upgraded, 30 newly installed, 1 to remove and 0 not upgraded.
Need to get 7140kB of archives. After unpacking 16.3MB will be used.
Do you want to continue? [Y/n]
Порівняйте це з виводом apt-get dist-upgrade на цій же системі:
# apt-get -u dist-upgrade
Reading Package Lists... Done
Building Dependency Tree... Done
Calculating Upgrade... Done
The following packages will be upgraded
debian-policy
1 packages upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
Need to get 421kB of archives. After unpacking 25.6kB will be freed.
Do you want to continue? [Y/n]
Зауважте, що багато пакунків з наведеного вище прикладу були встановлені тому, що інші пакунки „пропонують“ або „рекомендують“ їх. Інші були встановлені або видалені (наприклад, lbxproxy) в результаті вибору, який ми зробили за допомогою інтерфейсу dselect. Dselect може бути потужним інструментом, якщо використовується разом з APT.
3.8 Як підтримувати змішану систему
Іноді люди бажають використовувати одну з версій Debian в якості головного дистрибутиву системи та один чи декілька пакунків з іншої гілки.
Щоб вказати, яка версія Debian є головною, необхідно відредагувати файл /etc/apt/apt.conf (зазвичай його немає, в такому випадку створіть його), помістивши в нього такий рядок:
APT::Default-Release "версія";
Де версія — це версія Debian, котру ви хочете використовувати в якості головної збірки. Можна вказувати такі значення як stable, testing та unstable. Далі, щоб встановити пакунки з інших версій, ви повинні використовувати APT в такий спосіб
# apt-get -t збірка install пакунок
Проте, що це працювало, вам потрібно мати як мінімум один рядок в /etc/apt/sources.list з джерелом APT для відповідної збірки і на цьому джерелі повинні бути необхідні пакунки.
Ви також можете здійснити запит щодо конкретної версії пакунка, скориставшись наступним синтаксисом:
# apt-get install пакунок=версія
Наприклад, при виконанні вказаної нижче команди встановиться пакунок nautilus з версією 2.2.4-1.
# apt-get install nautilus=2.2.4-1
ВАЖЛИВО: збірка unstable — це збірка, до якої найновіші версії пакунків Debian потрапляють в першу чергу. Через цю збірку проходять всі ті зміни, котрих зазнають пакунки. І невеликі пакунки, і дуже важливі, від роботи яких залежать інші пакунки або система в цілому. З цієї причина, ця версія збірки не повинна використовуватись недосвідченими користувачами або тими, хто ставить стабільність системи на перше місце.
Збірка testing не обов'язково краща за unstable, оскільки не отримує оновлень безпеки за короткий час. Для серверів та інших виробничих систем завжди необхідно використовувати stable. 3.9 Яким чином оновлювати пакунки зі специфічних версій Debian
apt-show-versions забезпечує користувачів змішаних збірок безпечним способом для оновлення їх системи без отримання з менш стабільної збірки більшого, ніж вони мали на увазі. Наприклад, можна оновити лише ваші пакунки з unstable, виконавши, попередньо встановивши пакунок apt-show-versions,
# apt-get install `apt-show-versions -u -b | grep unstable | cut -d ' ' -f 1`
3.10 Як зберегти встановленими конкретні версії пакунків (складний метод)
Можливо, сталось так, що ви змінили дещо в пакунку, але не маєте часу або не хочете вносити ці зміни до нової версії програми. Чи, наприклад, вам просто потрібно оновити вашу збірку Debian до 3.0, але є бажання продовжувати використовувати деякі версії пакунків зі збірки Debian 2.2. Ви можете „приколоти“ (pin) версію, котру ви використовуєте так, щоб вона більш не оновлювалась.
Використовувати цю можливість просто. Необхідно лише відредагувати файл /etc/apt/preferences.
Формат простий:
Package: <package>
Pin: <pin-означення>
Pin-Priority: <pin-пріоритет>
Кожен запис повинен відділятись від інших порожнім рядком. Наприклад, щоб зберегти версію 0.4.99 пакунка sylpheed, в котрий я додав можливість reply-to-list, я вказую:
Package: sylpheed
Pin: version 0.4.99*
Зверніть увагу, що я використав символ * (зірочка). Це „маска“, вона означає, що я хочу, щоб цей pin стосувався всіх версій, що починаються з 0.4.99. Це зроблено з тієї причини, що до версії в пакунках Debian додається номер „редакції Debian“ і я не хочу відміняти встановлення цих редакцій. Отже, наприклад, версії 0.4.99-1 та 0.4.99-10 будуть встановлені, як тільки стануть доступними. Зауважте, що якщо ви модифікували пакунок, такий метод вам не підійде.
Pin-пріоритет допомагає визначити чи оновлювати пакунок, що задовольняє вимогам в рядках Packages: та Pin:, вищий пріоритет збільшує шанси того, що відповідний пакунок буде встановлено. Ви можете прочитати apt_preferences(7), щоб ознайомитись зі всебічним обговоренням пріоритетів, але декілька прикладів допоможуть зрозуміти основну ідею. Далі описуються ефекти від встановлення різних значень поля Pin-Priority: для пакунку sylpheed з наведеного вище прикладу.
1001 : Apt ніколи не замінить sylpheed, версії 0.4.99. Якщо буде потрібно, apt встановить версію 0.4.99, замінивши нею пакунок з більш високою версією. Тільки пакунки з пріоритетом, вищим ніж 1000 зможуть „понизити“ існуючий пакунок.
1000 : Ефект такий самий, як і у випадку пріоритету 1001, за винятком того, що apt не буде знижувати версію вже встановленого пакунка до 0.4.99.
990 : Версію 0.4.99 зможе замінити лише пакунок вищої версії зі збірки, котра визначена як переважаюча, шляхом використання змінної APT::Default-Release (див. Як підтримувати змішану систему, розділ 3.8 вище).
500 : Будь-яка доступна версія, вища за 0.4.99, пакунка sylpheed з будь-якого випуску буде мати перевагу над версією 0.4.99, але остання буде мати перевагу над нижчими версіями.
100 : Вищі доступні версії sylpheed з будь-якої збірки будуть мати перевагу над версією 0.4.99, також будь які встановлені вищі версії slypheed; тобто 0.4.99 встановиться лише в тому випадку, якщо не встановлено жодної іншої версії. Це — пріоритет встановлених пакунків.
-1 : Від'ємні значення також є прийнятними і забороняють встановлення 0.4.99.
„Приколювання“ пакунка може здійснюватись за такими критеріями як його версія (version), випуск (release) чи походження (origin) пакунка.
Фіксування за версією (version), як ми бачили, підтримує літерні номери версій і, крім цього, „маски“ з можливістю вибору декількох версій одночасно.
Опція release залежить від файлу Release зі сховища APT або з компакт-диску. Ця опція може не використовуватись у тому випадку, коли всі ваші сховища пакунків такого файлу не забезпечують. Вміст ваших файлів Release можна переглянути, відвідавши теку /var/lib/apt/lists/. Параметрами до release є: a (archive, архів), c (components, компоненти), v (version, версія), o (origin, походження) та l (label, мітка).
Наприклад:
Package: *
Pin: release v=2.2*,a=stable,c=main,o=Debian,l=Debian
Pin-Priority: 1001
В цьому прикладі ми обираємо версію Debian 2.2* (що може бути 2.2r2, 2.2r3 — це „точковий випуск“, що, зазвичай, містить виправлення безпеки та інші дуже важливі оновлення), сховище stable, розділ main (на противагу contrib чи non-free) та походження і мітку Debian. Походження (o=) визначає, хто створив цей файл Release, мітка (l=) — назва дистрибутиву: Debian для власне Debian, Progeny для Progeny, і т.д. Приклад файлу Release:
$ cat /var/lib/apt/lists/ftp.debian.org.br_debian_dists_potato_main_binary-i386_Release
Archive: stable
Version: 2.2r3
Component: main
Origin: Debian
Label: Debian
Architecture: i386