Модулна поддръжка на XFS за Red Hat Enterprise Linux и дериватите му
Версия 1.0 (06 май 2006г.)
Copyright ©2006 Веселин Колев, Софийски Университет "Св. Климент Охридски"
Лиценз: CC Attribution-ShareAlike
- Въведение.
- Инсталиране на изходния код на модифицираното от Red Hat ядро.
- Създаване на дървото с модифицирания изходен код на ядрото.
- Изграждане на модула xfs.ko.
- Компилиране и инсталиране на инструментариума за поддръжка на XFS.
1. Въведение.
XFS е файлова система, оригинално разработена от компанията Silicon Graphics за основна файлова система в IRIX (UNIX дистрибуция на Silicon Graphics). Отличава се с висока стабилност, поддържа големи като размер дялове, големи като обем файлове и директории с голямо количество обекти (поддиректории и файлове) в тях. Лицензът, под който XFS е лицензирана е GPL.
В Linux, XFS се състои от два компонента: модул за ядрото и набор инструменти за създаване, управление и диагностика на вече изградените XFS локални файлови.
В рамките дистрибуцията Red Hat Enterprise Linux (това важи и за дериватите, като например CentOS), пакетът kernel не съдържа в себе си модула fs/xfs/xfs.ko, или казано с други думи, няма поддръжка на XFS по подразбиране в рамките на дистрибуцията. Единственият начин за прибавяне на тази поддръжка е да се компилира модула xfs.ko.
При прибавянето на тази поддръжка трябва да се използва само изходния модифициран от Red Hat код на текущата версия на ядрото. Това трябва да е постоянна практика при компилиране на модули в рамките на дистрибуцията, за да може да не се нарушават следствията от актуализацията с набора от кръпки, който Red Hat прилагат към изходния код на ядрото.
Компилацията на модула xfs.ko трябва да се извършва за всяка конкретна версия на ядрото. Примерите по-долу са базирани на използването на версия 2.6.9-34 на пакета kernel.
Не се препоръчва компилационният процес да се извършва върху системи в продукция. За нуждите на компилацията е добре да бъде използван специален хост - "изграждащ хост" ("build host"). Присъствието на компилатор и компилирането на изходен код върху системи в продукция е рисков фактор и трябва да бъде избягван винаги, когато това е възможно.
Авторът не носи отговорност за причинени щети, вследствие на използване на описаните тук действия и техники.
2. Инсталиране на изходния код на модифицираното от Red Hat ядро.
Преди да се извърши инсталацията на изходния код на модифицираното от Red Hat ядро, трябва да се провери дали са инсталирани локално в системата пакетите redhat-rpm-config и rpm-build. Това може да стане чрез команден ред от вида:
# rpm -q redhat-rpm-config rpm-build
Резултатът от изпълнението на този команден ред трябва да има вида:
# rpm -q redhat-rpm-config rpm-build
redhat-rpm-config-8.0.32.1-1
rpm-build-4.3.3-13_nonptl
ако пакетите са налични и инсталирани в системата. Ако те не са налични в системата, трябва да бъдат инсталирани. Това може да стане по два начина:
# up2date redhat-rpm-config rpm-build
- чрез инструмента yum (при дериватите като CentOS)
# yum install redhat-rpm-config rpm-build
Изтеглянето на изходния код на актуализираното от Red Hat ядро може да стане с инструмента up2date чрез следния команден ред, подобен на следния:
# up2date --get-source kernel
След приключването на изпълнението на горния команден ред, RPM пакетът с изходния код на модифицираното от Red Hat ядро, се намира в директория /var/spool/up2date. Инсталирането му може да стане по следния начин:
# rpm -ivh /var/spool/up2date/kernel*.src.rpm
Бинарният пакет kernel в съответната версия, спрямо която ще бъде изграждан модула xfs.ko трябва да бъде инсталиран, но не е задължително това ядро да е работното ядро към момента на изграждане на модула.
3. Създаване на дървото с модифицирания изходен код на ядрото.
След като са изпълнени стъпките в предишната точка, може да се премине към изграждането на файловото дърво, съдържащо модифицирания от Red Hat изходен код на ядрото:
# cd /usr/src/redhat/SPECS
# rpmbuild -bp --target=$(arch) kernel-2.6.spec
Вместо директното указване чрез "--target=$(arch)" на текущата за изграждащия хост архитектура, може да се използва конкретизация, например за i686, чрез указване на "--target=$i686", за x86_64, чрез указване на "--target=$x86_64" и т.н.
Следствие от изпълнението на горните команди, е създаването на файлово дърво с модифицирания от Red Hat изходен код на ядрото в директория /usr/src/redhat/BUILD/kernel-2.6.9/linux-2.6.9/.
След завършване на изгеждането на файловото дърво, всички конфигурационни файлове за дадената архитектура се намират в директория /usr/src/redhat/BUILD/kernel-2.6.9/linux-2.6.9/configs/. Например, за архитектура i686, тя съдържа:
kernel-2.6.9-i686.config
kernel-2.6.9-i686-hugemem.config
kernel-2.6.9-i686-smp.config
За да може версията (vermagic) на модула xfs.ko да съвпада с версията на ядрото, за което той се изгражда, във файла Makefile, който се намира в директория /usr/src/redhat/BUILD/kernel-2.6.9/linux-2.6.9/, трябва да се направи следната промяна. Намира се реда, който съдържа:
EXTRAVERSION = -prep
и се заменя с екстра версията на ядрото, за което модула
xfs.ko ще бъде изграден. Например, за версия на ядрото 2.6.9-34.EL, екстра версията е 34.EL и следователно в
Makefile ще бъде зададено:
EXTRAVERSION = -34.EL
Версията на ядрото може да бъде видяна чрез изпълнението на един от следните командни редове
# rpm -q kernel
# rpm -q kernel-smp
# rpm -q kernel-hugemem
в зависимост от типа на ядро.
4. Изграждане на модула xfs.ko.
Първата стъпка е изграждането на конфигурационен файл за компилацията на модула. Тази конфигурация зависи от типа на ядрото, което ще бъде изграждано:
# cd /usr/src/redhat/BUILD/kernel-2.6.9/linux-2.6.9/
# cp configs/kernel-2.6.9-i686.config .config
# cd /usr/src/redhat/BUILD/kernel-2.6.9/linux-2.6.9/
# cp configs/kernel-2.6.9-i686-smp.config .config
# cd /usr/src/redhat/BUILD/kernel-2.6.9/linux-2.6.9/
# cp configs/kernel-2.6.9-i686-hugemem.config .config
Следва указването на поддръжката на XFS в конфигурацията за изгражданите модули. За целта се изпълнява:
# cd /usr/src/redhat/BUILD/kernel-2.6.9/linux-2.6.9/
# make menuconfig
и следва влизане в менюто за настройки. В него има секция "File Systems". Там трябва да се избере поддръжката на XFS по следния начин:
XFS filesystem support
[ ] Realtime support (EXPERIMENTAL)
[*] Quota support
[*] Security Label support
[*] POSIX ACL support
След запазването на новата конфигурация следва процеса на компилация:
# cd /usr/src/redhat/BUILD/kernel-2.6.9/linux-2.6.9/
# make modules_prepare
# make SUBDIRS=fs/xfs modules
След успешното приключване на компилацията следва процеса на инсталация:
# cd /usr/src/redhat/BUILD/kernel-2.6.9/linux-2.6.9/
# make SUBDIRS=fs/xfs modules_install
По този начин в директория /lib/modules/"kernel-version"/kernel/fs/xfs е наличен модула xfs.ko. Последната стъпка, която трябва да се извърши е изграждането на зависимостите между модулите на ядрото:
# depmod
или конкретно за различните типове ядра (пример с kernel-2.6.9-34.EL):
# depmod 2.6.9-34.EL
# depmod 2.6.9-34.ELsmp
# depmod 2.6.9-34.ELhugemem
За да се провери дали модулът се зарежда и отзарежда успешно, може да се изпълнят следните командни редове:
# modprobe xfs
# rmmod xfs
5. Компилиране и инсталиране на инструментариума за поддръжка на XFS.
Инструментариумът за поддръжка на XFS служи за изграждане, редактиране и др. дейности свързани с дискови дялове, форматирани за работа с XFS. Той може да бъде изтеглен като RPM пакети с изходен код от адрес:
ftp://oss.sgi.com/projects/xfs/cmd_rpms/SRPMS/
Обикновено в този директория винаги се намира текущата (последна версия) на инструментите за поддръжа на XFS. За примера, пакетите във версиите им налични към датата на написване на този документ са следните:
acl-2.2.34-1.src.rpm
attr-2.4.28-0.src.rpm
dmapi-2.2.3-1.src.rpm
xfsdump-2.2.33-1.src.rpm
xfsprogs-2.7.11-1.src.rpm
В рамките на Red Hat Enterprise Linux и дериватите му има налични пакети acl и attr, следователно необходимите за изтегляне пакети с изходен код са само:
dmapi-2.2.3-1.src.rpm
xfsdump-2.2.33-1.src.rpm
xfsprogs-2.7.11-1.src.rpm
Всички тези файлове се копират на локалния диск в определена за целта директория (например /home/install) и след това се инсталират с помощта на инструмента rpm:
# rpm -ihv /home/install/dmapi-2.2.1-1.src.rpm
# rpm -ihv /home/install/xfsdump-2.2.30-1.src.rpm
# rpm -ihv /home/install/xfsprogs-2.7.3-1.src.rpm
Първо се компилира изходния код на xfsprogs:
# cd /usr/src/redhat/SPECS
# rpmbuild -ba xfsprogs.spec
След успешното приключване на компилацията и пакетирането, иницирани от rpmbuild по-горе, се получават следните RPM пакети:
/usr/src/redhat/RPMS/i386/xfsprogs-2.7.11-1.i386.rpm
/usr/src/redhat/RPMS/i386/xfsprogs-devel-2.7.11-1.i386.rpm
/usr/src/redhat/RPMS/i386/xfsprogs-debuginfo-2.7.11-1.i386.rpm
За да продължи по-нататък изграждането на останалите пакети, се налага да се инсталират RPM пакетите xfsprogs и xfsprogs-devel:
# rpm -ihv /usr/src/redhat/RPMS/i386/xfsprogs-2.7.11-1.i386.rpm /usr/src/redhat/RPMS/i386/xfsprogs-devel-2.7.11-1.i386.rpm
Следва изграждането на пакета с изходен код dmapi:
# cd /usr/src/redhat/SPECS
# rpmbuild -ba dmapi.spec
Като резултат от компилирането и пакетирането ще се получат следните RPM пакети:
/usr/src/redhat/RPMS/i386/dmapi-2.2.3-1.i386.rpm
/usr/src/redhat/RPMS/i386/dmapi-devel-2.2.3-1.i386.rpm
/usr/src/redhat/RPMS/i386/dmapi-debuginfo-2.2.3-1.i386.rpm
от които задължително трябва да се инсталират пакетите dmapi и dmapi-devel:
# rpm -ihv /usr/src/redhat/RPMS/i386/dmapi-devel-2.2.3-1.i386.rpm /usr/src/redhat/RPMS/i386/dmapi-2.2.3-1.i386.rpm
С цел компилиране на пакета с изходен код xfsdump, трябва да се извърши инсталацията на пакета libattr-devel:
# up2date libattr-devel
# yum install libattr-devel
След успешното инсталиране на libattr-devel, може да се пристъпки към компилирането на xfsdump:
# cd /usr/src/redhat/SPECS
# rpmbuild -ba xfsdump.spec
При успешно привършване на компилацията и пакетирането, ще са налични следните RPM пакети:
/usr/src/redhat/RPMS/i386/xfsdump-2.2.33-1.i386.rpm
/usr/src/redhat/RPMS/i386/xfsdump-debuginfo-2.2.33-1.i386.rpm
За улеснение, получените пакети от показаните тук етапи на компилация, могат да бъдат поставени в yum форматно хранилище, което да се изгради с инструмента createrepo:
# mkdir -p /home/rhel/xfs-repo
# cd /home/rhel/xfs-repo
# cp /usr/src/redhat/RPMS/i386/{dmapi*,xfs*} .
# createrepo .
RPM пакетът createrepo може да бъде намерен в колекцията от пакети на Dag Wieers (http://apt.sw.be/).