ნოე 24, 2010
ვზრდით ext3/ext4 დანაყოფებს (partition)

Linux ოპერაციულ სისტემებში შესაძლებელია partition-ის შემდგომში “დანაყოფი” (დროა ქართულადაც ვიცოდეთ ამ სიტყვების მნიშვნელობები :z ) მოხერხებული-ადვილი-გრაფიკული მართვა, მაგ. ზომის გაზრდა/შემცირება, parttition tables შექმნა, შემოწმება შეცდომებზე და სხვა მრავალი სასარგებლო ოპერაციის გაკეთება commandline-ის გარეშე, მააგრამ linux ჯერ-ჯერობით რჩება სერვერ ოპერაციულ სისტემად და შესაბამისად ხშირად სერვერებზე გრაფიკული გარსი არ არის გაშვებული (99.99% არც არის საჭირო).
პოსტი მოიცავს ნებისმიერი linux ოპერაციულ სისტემის ქვეშ მყოფი ext3/ext4 დისკების გაზრდა/შემცირებას, რომლებიც არ არის LVM/LVM2 ან RAID შემადგენლობაში და არის სტანდარტული partittion-ები.
გაფრთხილება: აუცილებლად “<<დაა-backup-ეთ>>” პაციენტი. ბექაფის გარეშე აღნიშნული ოპერაციის ჩატარებამ შეიძლება მიგვიყვანის სავალალო შედეგებამდე. ბექაფის არსებობის შემთხვევაში თამამად გადავდივართ შემდეგ საფეხურებზე.
პრობლემა: გვაქ ლინუქს სერვერი რომელზეც გადაგვევსო /var (თქვენს შემთხვევაში ეს შეიძლება იყოს ნებისმიერი /, /opt, /u01, /xxx, ან /home) დანაყოფი რომელიც დამონტაჟებულია (არ დაიბნეთ mounts ვგულისხმობ) /dev/sdd1 დისკზე, რომლის მოცულობა არის 30 გბ. მაგ: /dev/sdd1 /var
საჭირო ინსტრუმენტები: fdisk, tune2fs, e2fsck, resize2fs, fsck (სტანდარტულად ეს ბრძანებები ნაგულისხმევად განისვენებს /sbin დირექტორიაში ყველა linux დისტრიბუტივზე.)
დისკის მოცულობა შეიძლება გავზარდოთ არსებული დანაყოფის შემცირების ან საერთოდ წაშლის ხარჯზე, მაგრამ ვირტუალიზაციის შემთხვევაში ეს გაცილებით მარტივია, უბრალოდ უმატებთ სასურველ ზომას. დავუშვათ მოუმატეთ სასურველი ზომა არსებულ დისკს, (თუ რა გზით ეს ეს ინდივიდუალურია) იმისთვის რომ ოპერაციულმა სისტემამ აღიქვას ახალი ზომა, ამისთვის საჭიროა შემდეგი ცვლილებები:
1. ვაკეთებთ დისკის დემონტაჟს, (unmount partition),
umount /dev/sdd1
ხშირია შემთხვევები როდესაც დისკი დაკავებულია და დემონტაჟი წარუმატებლად სრულდება, გამოდის ამდაგვარი შეტყობინება: “Device or resource busy” ასეთ შემთხვევაში შესაძლებელია -l სვიჩის გამოყენება და დემონტაჟის ძალებით გაკეთება (force).
umount -l /dev/sdd1
ყურადღება! არავითარ შემთხვევაში არ შეეცადოთ იმ დანაყოფის დემონტაჟს რომელზეც წერს მონაცემთა ბაზები (MySQL, Oracle, PostgreSQL, etc). ამ შემთხვევაში თქვენ შეიძლება დაკარგოთ ინფორმაცია, ან დააზიანოთ მონაცემთა ბაზის სტრუქტურა (მონაცემთა ბაზებს შეუძლიათ data-ფაილის ექსკლუზიურ რეჟიმში გახსნა/წაკითხვა, იყენებენ სისტემურ გამოძახებებს (syscall) მაგალითთად fopen() ფუნქციას პარამეტრად გადეცემა O_EXCL და ფაილი გაიხსნება ექსკლუზიაურად. ექსკლუზიური გახნს კი იმას ნიშნავს რომ სანამ ფაილი არ “დაიხურება” fclose(), დანაყოფის დემონტაჟს აზრი არ ააქვს, მოხდება მხოლოდ “ფსევდო დემონტაჟი” სინამდვილეში ფაილური სისტემა კვლავ დაკავებული იქნება I/O ოპერაციებით). ჩვენ არ გვაწყობს არანაირი I/O აქტივობა ჩვენს დიკზე, როდესაც დავიწყებთ მისი მოცულობის გაზრდა/შემცირებას, ამიტომ საკუეთესო გამოსავალი იქნება თუ ჩვენ ჩავიტვირთებით singe-user რეჟიმში (ამ დროს არ არსებობს ქსელი, არ იტვირთება დემონები/სერვისები და სისტემაში შესასვლედად არ არის საჭირო ავტორიზაცია). თუ გვინდა root დანაყოფის ( / ) გაზრდა ამ შემთხვევაში ვიტვირთებით რომელიმე linux-based ჩამტვირთავი დისკიდან (რადგანაც ჩართულ სსისტემას თავის თავის დემონტაჟს ვერ მოვთხოვთ, არა ეს შესაძელბელეია, მაგრამ ამ შემთხვევაში მიუწვდომელი იქნება /sbin დირექტორია და შესაბამისად საჭირო ბრძანებებს ვეღარ გამოვიძახებთ). ასეთები კი ბევრია და თავისუფლად გადავდივართ შემდეგ საფეხურზე.
2. ვამოწმებთ ფაილური სისტემის შეცდომებზე არსებულ დანაყოფს:
fsck -n /dev/sdd1
3. ვშლით ჟურნალს ფაილური სისტემიდან და ვაქცევთ მას მარტივ ext2 ფაილურ სისტემად (ext3/4 ფაილური სისტემების ext2-გან განსხვავებით გააჩნიათ ჟურნალირების საშუალება, მაგრამ ჟურნალირებად ფაილურ სისტემაზე ამგვარ ცვლილებებს ვერ მოვახდენთ, ამიტომ დროებით ვუთიშავთ მას ამ ფუნქციას).
tune2fs -O ^has_journal /dev/sdd1
4. ვხსნით მთელ დისკს fdisk უტილიტით /dev/sdd (და არა ცალკეულ დანაყოფს sdd1.)
fdisk /dev/sdd
გამოვა ინტერაქტიული მენიუ:
Command (m for help):
4.1. დააჭირეთ p ღილაკს, გამოიტანს ინფორმაციას დისკზე და გვაჩვენებს მის დანაყოფებს (ეს კარგი პრაქტიკაა, კიდევ ერთხელ გადახედავთ, რომ დანაყოფები არ აგერიოთ)
Command (m for help): p
4.2. ვშლით დანაყოფს, ჩვენს შემთხვევაში ეს არის /dev/sdd1, ეს ავტომატურად მონიშნულია ამიტომ უბრალოდ დააჭირეთ d-ს და შემდეგ enter-ს) არ ინერვიულოთ ამ დროს არ წაიშლება თქვენი ინფორმაცია, უბრალოდ წაიშლება ძველი partition table.
Command (m for help): d
გამოვა შეტყობინება:
>Selected partition 1
4.3. ვქმინით ახალ partition table’ს – n.
Command (m for help): n
4.4. ვირჩევთ პირველად დანაყოფს (Primary Partition).
Command (m for help): p
4.5. Linux-ში შეგვიძლია 1 დისკზე გვქონდეს 4 პირველადი დანაყოფი, ჩვენ არ გვაქ არცერთი /dev/sdd დისკისთვის ამიტომ ვირჩვთ 1-ს.
Command (m for help): 1
4.6. ამის შემდეგ გამოვა ორი ინტერაქტიული კითხვა სადაც გვკითხავს პირველი და ბოლო ცილინდრის მნიშვნელობებს, ეს ნაგულისხმევი მნიშვნელობებია და ამიტომ მათ მნიშვნელობას არ ვცვლით, უბრალოდ 2-ჯერ დააჭირეთ enter-ს.
Partition number (1-4): <Enter>
Last cylinder, +cylinders or +size{K,M,G} (1-xxxx, default xxxx): <Enter>
4.7. ჩვენ შევქმენით ახალი partition table, რომელმაც უკვე იცის თუ რა ზომის იქნება ახალი დანაყოფი (შეიცვალა ბოლო ცილინდრის მნიშვნელობა),
შევინახოთ ცვლილებები – w.
Command (m for help): w
5. ვამოწმებთ ახალ ext2 ფაილურ სისტემას შეცდომებზე:
e2fsck -f /dev/sdd1
6. ვზრდით/ვამცირებთ ფაილური სისტემის ზომას, resize2fs-ის საშუალებით შეგვიძლია გავზარდოთ ან შევამციროთ ფაილური სისტემის ზომა ონლაინ რეჟიმში, შეგვიძლია პარამეტრად გადავცეთ სასურველი ზომა, მაგრამ თუ ზომა მითითებული არ იქმნება ჩვენს მიერ ამ შემთხვევაში resize2fs ნაგულსხმევად აიღებს მაქსიმალურ მნიშვნელონბას partition table -დან, (ეს ჩვენ უკვე გავაკეთეთ fdisk-ის გამოყენებით), რაც ძალიან მოსახერხეხბელია.
resize2fs /dev/sdd1
7. კვლავ ვამოწმებთ ზომაშეცვლილ დანაყოფს
fsck -n /dev/sdd1
8. შემდეგი ბრძანებით ჩავურთავთ ჟურნალირებას და მივიღებთ ისევ სრულყოფილი ext3/4 დანაყოფს.
tune2fs -j /dev/sdd1
სასურველია გადავტვირთოთ OS 4-ე საფეხურის დასრულებისთანავე და შემდეგ გადავიდეთ დანარჩენ საფეხურებზე, მთლიანი პროცედურის დამთავრების შემდეგ აკრიფეთ შემდეგი ბრძანება ზომის ცვლილების სანახავად:
df -h /dev/sdd1