FreeNAS

נפתח בדיסקליימר הרגיל:
כן, לא כתבתי מליון שנה, מה תעשו לי?

ב2009 בניתי מכונת אכסון ביתית מבוססת ZFS שהריצה את OpenSolaris.
התצורה של המערכת היא משהו דמוי RAID10:
שלושה זוגות דיסקים, כל זוג הוא מירור, וכולם ביחד מחוברים בRAID 0 ליחידה לוגית אחת.
מכיוון שקניתי דיסקים פשוטים ומעפנים, ציפיתי לאבד כמה במשך השנים וכך היה.
קונפיגורציה כזו יכולה לאבד עד שלושה דיסקים מתוך השישה, אבל רק לא מאבדים שני דיסקים מאותו זוג.
כל פעם שאבד דיסק, קניתי זוג חלופי וניצלתי את ההזדמנות כדי להגדיל את שטח האכסון.

חוץ מזה, מערכת ההפעלה התיישנה: Sun נרכשה על ידי אורקל (ימ"ש), שהפסיקה לפתח את OpenSolaris. הקהילה ניסתה להמשיך ושחררה את OpenIndiana, אבל מתישהו הם ויתרו.
חוץ מזה, אף פעם לא ממש הרגשתי בבית בסולאריס, כל דבר הוא קשה ומעצבן (חוץ מZFS).

לפני חודש חודשיים שמתי לב במקרה ששרת הקבצים מתלונן על בעיות באחד הדיסקים, ושהPOOL עבר לרמה של DEGRADED.
נו טוב, קורה.
קניתי זוג דיסקים בנוהל, 2TB כל אחד, של HGST – חברה שלא שמעתי את שמה עד היום, אבל שחברה הוסטינג שחררה מידע סטטיסטי שמראה שהם הכי אמינים.
הדיסקים עלו כ$65 כל אחד, שזה מחיר מצחיק למדי בשביל 2TB, אבל אני בטח לא מעודכן.

אחרי שהחלפתי את הדיסק הראשון, ZFS התחיל להתלונן שיש עוד דיסק דפוק, למרבה הפליאה בן הזוג של הדיסק הראשון שהתקלקל.
למזלי קניתי שניים, אבל מה – ZFS לא רצה לתת לי לנתק את הדיסק השני הדפוק כי אין מספיק עותקים של הנתונים (מה שיביא את כל הPOOL למצב לא שמיש).
די מוזר, ואחרי נסיונות חוזרים ונשנים לשכנע אותו בדרכי נועם הבנתי שאני לא הולך להצליח, מה שאומר שלראשונה אחרי שבע שנים עם שרת האכסון הזה, איבדתי נתונים.
לא לגמרי, כי למרות המצב המוזר עדיין יכלתי להעתיק קבצים כרגיל, אבל לא ממש היה לי איפה לשים את רוב הסרטים והסדרות אז מחקתי לא מעט.

בקיצור, אם כבר אני הולך לאבד נתונים, הגיע הזמן להפטר מהענתיקה ולהחליף את הOpenSolaris במשהו יותר מודרני.
בימים שבהם שמעתי פודקסטים (עברתי לספרי שמע זה מכבר), שמעתי בFLOSS WEEKLY על FreeNAS.
FreeNAS היא מערכת מבוססת FreeBSD, שנבנתה ממש מסביב לשימוש שאני עושה בZFS:
התלבטתי אם לנסות לינוקס, שהיום כבר תומך בצורה זו או אחרת בZFS, או לנסות את FreeNAS, שהוא בעצם ZFS למפגרים.
בחרתי בFreeNAS, ואני לא מצטער.

קודם כל, האתחול הרבה יותר פשוט, בקונפיגורציה הישנה איתחלתי מהדיסקים עצמם, מה שאומר שמחיצת השורש ישבה בעצמה על אחד המירורים. זה די מסובך להתקין ככה ולא ממש התחשק לי להתעסק עם זה שוב. הפתרון של FreeNAS הוא פשוט להתקין על USB Thumb drive ולאתחל ממנו.
מערכת ההפעלה יושבת עליו, הקונפיגורציה והנתונים יושבים על הדיסקים האמיתיים. הדבר הזה נותן גמישות, במקרה שהולכת מערכת ההפעלה להתקין אותה מחדש זה פשוט מאוד ולא מאבדים מידע.

מה שעוד מאוד נחמד, זה שאת כל הניהול השוטף ניתן לעשות ממשק וובי חזק.
הוא אפילו מאפשר כניסה בSHELL מתוך הדפדפן.
התקנתי ותוך כלום זמן הגדרתי הכל, כולל שיתוף קבצים עם חלונות, MAC, ולינוקס (ספציפית השיתוף עם חלונות אף פעם לא ממש עבד לי עם הOpenSolaris ופה פשוט עבד בקלות דרך הממשק).
הפעם בחרתי בקונפיגורציה של RAIDZ2. מה שאומר שאני יכול לאבד כל שני דיסקים. על הדרך זה גם הגדיל את שטח האחסון הזמין.

capture

 

הדבר היחיד שהיה קשה קצת היה לגרום לZync לעבוד שם.
עקרונית הוא לא באמת נחוץ כי אפשר להגדיר את מה שהוא עושה דרך ממשק המשתמש. אבל זה יהיה די מסורבל במיוחד אם רוצים לגבות כמה שרתים, לקחת סנפשוטים של הגיבוי מתי שבוודאות הRsync כבר לא רץ, ולהגדיר ערמה של ספריות שלא יגובו עבור כל שרת שמגובה.
החבר'ה בפורומים של FreeNAS לא ממש עזרו, ואלו בIRC היו אפילו עויינים לרעיון שאני מעדיף להשתמש במשהו לשורת פקודה במקום בממשק המשתמש בשביל זה.
בסוף הסתדרתי, האיך בדיוק שווה פוסט שלם אם זה מעניין מישהו.

בשורה התחתונה אני מרוצה, FreeBSD הוא בערך פי מליון יותר ידידותי מSolaris, ואני שמח שנפטרתי מעונשו של זה.

עד הפעם הבאה.

החלפת דיסק תקול בZFS

מכונת הOpenSolaris שלי, מכילה שישה דיסקים:
שני דיסקים של 1TB, שניים של 1.5TB ושניים של 2TB.
מאגר האחסון (pool) העיקרי בנוי בעצם משלושה זוגות של דיסקים (או חלקי דיסקים), כך שאם אחד מהם מתקלקל המערכת יכולה להמשיך לתפקד.
החסרונות של הגישה הזו הם שאני מאבד חצי מהנפח, ושאם שני דיסקים מאותו יחידת ראי נופלים איבדתי הכל.
היתרונות הם ביצועי קריאה כפולים, וגמישות בשינויי תצורה. קל להוסיף דיסקים או לשדרג דיסקים קיימים לגדולים יותר.

ההסתברות לכשלון של דיסק מסויים גדלה ביחס ישיר למספר הדיסקים, במהלך השנתיים בערך שיש לי את המערכת הזו, שלושה דיסקים כשלו (!) ובכל זאת עד היום לא איבדתי מידע.
בכשלון האחרון הבחנתי לפני כמספר שבועות : לא הרגשתי בעיות, אבל ראיתי במקרה שZFS מדווח על שגיאה בדיסק, מה שהביא את המאגר כולו למצב degraded, שהוא בהחלט לא מצב שתרצו להשאר בו יותר זמן ממה שחייבים (כי דיסק נוסף שכושל עלול לדפוק את כל הנתונים).
אז נאלצתי להחליף את הדיסק.
הקטע הכי קשה הוא להבין איזה מהדיסקים הפיזיים צריך לנתק.
בפעם האחרונה דאגתי לסמן את הדיסקים במדבקות עם השם שלהם במערכת ההפעלה (למשל c8d0 עבור דיסק 1 בקונטרולר 8) אבל משום מה המדבקות היו קצת לא מדוייקות.
בכל מקרה, אחרי קצת ניסוי וטעיה, מצאתי איזה מהדיסקים הוא c8d1 (הדיסק שדווח כלא תקין).
הרצתי את הפקודה הבאה כדי להוציא אותו מהמאגר, וניתקתי אותו פיזית.
[code]
zpool detach storage c8d1
[/code]
חיברתי למחשב אחר כדי לבדוק עם SpinRite (אין לי מסך מחובר לשרת הOpenSolaris).
SpinRite לא הצליח לתקן אבל ראיתי שSMART מדווח שיש לו המון שגיאות חיפוש (seek) וקריאה.

שלחתי למעבדה וקיבלתי דיסק אחר תוך כמה שבועות.
התקנתי את הדיסק במחשב, והרצתי את הפקודה הבאה כדי לחבר אותו חזרה:
[code]
zpool attach storage c9d1 c8d1
[/code]
הפקודה די הפוכה לפקודת הניתוק הקודמת, רק שהיא מציינת לאיזה דיסק קיים להוסיף את החדש.
אחרי שהוספתי, זה המצב של המאגר storage :
אפשר לראות שמתבצעת פעולת resilver, שבעצם דואגת לסנכרן הנתונים של הדיסק החדש עם הדיסק הוותיק באותה יחידת ראי.

root@iron:~# zpool status storage
pool: storage
state: ONLINE
status: One or more devices is currently being resilvered. The pool will
continue to function, possibly in a degraded state.
action: Wait for the resilver to complete.
scrub: resilver in progress for 0h14m, 0.60% done, 38h34m to go
config:

NAME STATE READ WRITE CKSUM
storage ONLINE 0 0 0
mirror-0 ONLINE 0 0 0
c8d0p2 ONLINE 0 0 0
c9d0p2 ONLINE 0 0 0
mirror-1 ONLINE 0 0 0
c9d1 ONLINE 0 0 0
c8d1 ONLINE 0 0 0 6.70G resilvered
mirror-2 ONLINE 0 0 0
c11d0 ONLINE 0 0 0
c10d0 ONLINE 0 0 0

errors: No known data errors

PXE, ISCSI ושאר ירקות

לפני כשנה ארגנתי לי מכונת אחסון ביתית שמריצה OpenSolaris (להלן Iron, או איירון).
איירון מכיל היום שישה דיסקים בגדלים שונים (בתצורת MIRROR, ככה שאני מקבל חצי מנפח האחסון נטו).
בהתחלה השתמשתי במכונה בתור כונן גדול לאחסון סרטים ומוסיקה (גדול מאוד, נטו 4TB וכאמור כל ביט כתוב על שני דיסקים), אבל עוד מההתחלה היו לי מחשבות על אחסון של ספריית הבית שלי על המכונה הזו כדי להרוויח מהירות שרידות וגיבויים נוחים ויעילים (הכל בחסות ZFS).
מכיוון שהדיסקים החדשים יותר שלי נמצאים באיירון המחשב הראשי שלי זכה לקבל שני דיסקים ישנים למדי, של 200GB ו500GB.
על הדיסק של ה200GB מותקנת חלונות 7 שמשמשת אותי למשחקים, ועל הדיסק של ה500 מותקן דביאן לינוקס (Squeeze) שמשמש לכל השאר.
לאחרונה התחילו לצוץ רמזים שהמצב של הדיסקים האלו די ירוד – bad sectors (מגזרים רעים!), שגיאות קריאה וסריקה (seek) אקראיות, תקיעות אקראיות וכו'.
הצעד הטבעי במצב כזה הוא לקנות דיסקים חלופיים, אבל זה די בזבוז לקנות דיסקים חדשים כשיש כל כך הרבה מקום איכותי מהיר ופנוי על איירון.
אז התחלתי לחשוב על האפשרות של איתחול דרך הרשת לשתי מערכות ההפעלה על המחשב הראשי.
מחשבים מודרניים תומכים באיתחל רשת דרך PXE (פיקסי).

מילה מקדימה:
כמעט את כל הבדיקות והמשחקים להלן ביצעתי תוך שימוש בVirtualBox.
ווירצ'ואל בוקס תומך היטב באיתחול פיקסי. כדי לעשות את זה צריך לשנות את הגדרות המכונה הוירטואלית לאיתחול מהרשת.
בנוסף, אם אתם משתמשים כמוני בשרת DHCP ברשת האמיתית, חשוב לשנות את הגדרות כרטיס הרשת של המכונה הוירטואלית למצב Bridged (ברירת המחדל היא NAT) אחרת זה לא יעבוד.

כדי לאפשר למחשבים לבצע איתחול דרך פיקסי צריך את הרכיבים הבאים:

  • שרת DHCP – שמעביר אוטומטית למחשב הגדרות רשת ופרמטרים לפיקסי.
  • שרת  TFTP – שמכיל קבצים שמשמשים את תהליך האתחול. TFTP זה קיצור פרוטוקול טריויאלי להעברת קבצים, והוא מאוד פרימיטיבי ואיטי – אבל מספיק בשביל להתניע את התהליך.

שרת הDHCP צריך לתמוך בכל מני אופציות מתקדמות, לכן לא סביר שהDHCP שמגיע עם הנתב האלחוטי הביתי שלכם יתאים לצורך העניין.
בגדול, הDHCP צריך להכיל שני פרמטרים:

  • TFTPsrvN :  שמכיל את השם או כתובת הIP של המחשב שמריץ את שרת הTFTP
  • BootFile : שמכיל את השם של קובץ ההפעלה הראשי שמתחיל את תהליך האתחול, ונמצא בתוך ספרית השורש של שרת הTFTP.

התהליך הוא כזה:
המחשב מבצע איתחול ומחפש ברשת שרת DHCP שיספר לו מה שרת הTFTP ואיזה קובץ למשוך ממנו, ברגע שהוא מקבל הוא מתחבר לשרת הTFTP, מושך את קובץ ההפעלה ומפעיל אותו.
הקובץ הזה מכיל טוען בוט מיוחד. יש כמה אפשרויות ולמעשה אני עדיין מתנסה בעניין.

מכיוון שאני מתכוון להשתמש במכונת הOpenSolaris לשמירת הקבצים, זה טבעי שאני אשתמש בה גם בשביל שרתי הDHCP והTFTP.
שרת הDHCP הנפוץ ביותר הוא ISC DHCP ואולי כדאי לבחור בו כי רוב הדוגמאות שתמצאו ברשת לגבי הגדרת PXE יתאימו לשרת הזה.
אני החלטתי להשתמש בשרת הDHCP שמגיע עם OpenSolaris, יש הוראות התקנה וקינפוג בסיסיות כאן.
מה שחסר זה שם זה איך מגדירים את TFTsrvN ואת BootFile:
ככה אני עשיתי את זה:
[code lang="bash"]
pfexec dhtadm -M -m `hostname` -e BootFile=pxelinux.0
pfexec dhtadm -M -m `hostname` -e TFTPsrvN=10.0.0.4
[/code]
אפשר גם להשתמש בכלי הגרפי dhcpmgr שיפתח ממשק משתמש שיאפשר שינוים בהגדרות שרת הDHCP.

טועני בוט

לדעתי הטוען בוט הפופולרי יותר הוא pxelinux שהוא למעשה גרסא מיוחדת של syslinux.
כדי לעבוד עם פיקסילינוקס, צריך לשים את pxelinux.0 בספריית השורש של שרת הtftp (בדרך כלל /tftpboot).
כשפיקסילינוקס עולה, הוא מחפש קבצי הגדרות שמתאימות למחשב לפי סדר הגיוני למדי : קודם קובץ בשם של כתובת הMAC של המחשב, ואז בשם של כתובת הIP, ואז חלק יותר קטן מכתובת הIP וכו' ולבסוף קובץ השם default שיטען אם לא נמצא קובץ הגדרות יותר ספציפי.

פיקסילינוקס תומך במעין תפריט בוט פשוט, למשל:
[code]

LABEL sbm
KERNEL memdisk
APPEND initrd=sbm.bin

LABEL local
LOCALBOOT 0
[/code]

עם התפריט הבא, פיקסילינוקס יציג לנו propmt שבו נוכל להקליד local כדי להמשיך לבוט מקומי או sbm כדי לטעון את  Smart boot manager (אפשר למצוא את sbm.bin פה.

דבר אחד שחסר לפיקסילינוקס הוא תמיכה בboot מכונן iscsi.
iscsi הוא פרוטוקול תקשורת שמאפשר שימוש בדיסק מרוחק כאילו הוא דיסק סקאזי מקומי.

מסתבר שפרוייקט אחר בשם gpxe (הידוע גם כ Etherboot) תומך בבוט מiscsi, ואפילו בבוט מhttp, ftp ועוד.
מסתבר עוד, שיש מעין הכלאה של pxelinux ושל gpxe שמאפשרת את היכולות של pxelinux וגם את היכולות של gpxe, ההכלאה נקראת gpxelinux (איזו הפתעה) והיא כלולה בהורדה של pxelinux.
כדי להשתמש בgpxelinux, צריך לקבוע בשרת הDHCP שקובץ הבוט הוא gpxelinux.0, שאר העבודה בדיוק כמו עם פיקסילינוקס.

על ISCSI

לISCSI יש טרמינולוגיה די מעצבנת:

  • Logical unit : המקבילה לדיסק או מחיצה
  • LUN : המספר של הלוג'יקל יוניט
  • Target : מעין מזהה שמגדיר גישה לאחד או יותר יחידות לוגיות, נראה ככה למשל : iqn.1986-03.com.sun:02:2775db99-0772-6e28-bb0e-bcbe420894ee
  • Initiator : הלקוח, קוד ששולח בקשות IO בפרוטוקול iscsi.

אפשר להרים שרת iscsi גם עם לינוקס כמובן, אבל אני משתמש באופן סולאריס בתור מערכת האחסון שלי.

לאופן-סולאריס יש ארכיטקטורה חדשה לiscsi שנקראת Comstar, קומסטר תומך גם בעוד פרוטוקולים כמו ערוץ אופטי (FC) אבל זה לא מעניין אותנו.

יש פה פוסט די טוב שמתאר שימוש בסיסי בקומסטר כדי ליצור iscsi target.
מה שחסר זה שצריך בהתחלה להתקין את stmf ולעשות ריבוט אם זה לא עובד (כן, ריבוט – יש על זה באג פתוח).
[code]
pkg install SUNWstmf
[/code]
שימו לב שבדוגמא שם הוא מתאר איך ליצור מיפוי שבו כל היחידות הלוגיות זמינות דרך כל הtargetים. אם אתם רוצים משהו יותר מורכב מזה תקראו את התיעוד, ספציפית את הדף הזה.

ברגע שהגדרתם target בהצלחה, נשאר לבדוק אותו.
זה די פשוט גם בחלונות 7 או וויסטה וגם בלינוקס. חפשו קצת בגוגל.

לגבי התקנות ואיתחול של של מערכות הפעלה ספציפיות על iscsi, יש תיעוד לרוב בוויקי של Etherboot .
עדיין לא הצלחתי להגיע לבוט מלא של חלונות 7 או דביאן דרך הרשת, אבל אני מקווה להצליח בקרוב.

צפו לפוסט עדכון לגבי איך ומה עושים לגבי כל אחת מהמערכות כדי להגיע לאיתחול מISCSI. (אלא אם אני אכשל ואז צפו לשקט חשוד).

אם הפוסט הזה עשה לכם תיאבון לנסות, קחו בחשבון שתצטרכו ללמוד הרבה דברים, ואולי תיתקעו בדרך.
זה לא פשוט, וזה לוקח די הרבה זמן להבין את הכל.

פוסטים קשורים:
מכונת אחסון ביתית על אופן-סולאריס
אופן סולאריס: תצורה, שיתוף קבצים וגיבויים
שידרוג נפח אכסון ZFS על גבי OpenSolaris