30.3. Сүлжээний Файлын Систем (NFS)
Өмнөх | Бүлэг 30. Сүлжээний орчны Серверүүд | Дараах

## 30.3. Сүлжээний Файлын Систем (NFS)

Дахин зохион байгуулж, сайжруулсан Том Рөүдс.
Бичсэн Билл Свингл.
Орчуулсан Лодойсамбын Баянзул.

FreeBSD дээр дэмжигддэг олон файлын системүүдийн нэг бол Network File System буюу Сүлжээний Файлын Систем юм, мөн NFS гэж нэрлэнэ. NFS нь сүлжээний орчинд файл болон санг бусадтай хуваалцах боломжийг олгодог. NFS-г хэрэглэн, хэрэглэгчид болон програмууд алслагдсан систем рүү дотоод файл руу хандаж байгаатай адилаар хандах боломжтой.

NFS-н тэмдэглүүштэй давуу талуудаас дурдвал:

- Өргөн хэрэглэгддэг өгөгдлийг нэгтгэн нэг машин дээр байрлуулж, түүнд алсаас хандах боломжтой болсноор дотоод машинууд илүү бага диск хэрэглэх болно.

- Хэрэглэгчийн хувьд сүлжээнд байгаа машин бүр дээр тус тусдаа гэрийн сантай байх шаардлагагүй болно. Гэрийн санг нэг удаа NFS сервер дээр үүсгээд түүнийгээ сүлжээгээр дамжин хэрэглэх боломжтой.

- Уян диск, CDROM болон Zip® төхөөрөмжүүдийг сүлжээний бусад машинууд хэрэглэх боломжтой болно. Ингэснээр сүлжээнд хэрэглэгдэх зөөвөрлөх боломжтой хадгалах төхөөрөмжүүдийн тоог багасгана.

### 30.3.1. NFS хэрхэн ажилладаг вэ

NFS нь үндсэн хоёр хэсгээс бүрдэнэ: сервер болон нэг ба түүнээс дээш тооны харилцагч. Сервер машин дээр хадгалагдаж байгаа өгөгдөл рүү харилцагч алсаас хандана. Дээрх үйлдлийг зөв гүйцэтгэхийн тулд нилээд хэдэн процессийн тохиргоог хийж, ажиллуулсан байх ёстой.

Сервер дээр дараах дэмонууд ажиллаж байх ёстой:

Дэмон | Тайлбар
--- | ---
nfsd | NFS харилцагчдаас ирэх хүсэлтийг хүлээн авах NFS дэмон.
mountd | nfsd(8)-с дамжиж ирсэн хүсэлтийг гүйцэтгэгч NFS холбох дэмон.
rpcbind | Энэ дэмоны тусламжтай NFS харилцагчид NFS сервер аль портон дээр ажиллаж байгааг олж мэднэ.

Харилцагч nfsiod гэсэн дэмонг мөн ажиллуулж болно. nfsiod дэмон NFS серверээс ирэх хүсэлтийг гүйцэтгэнэ. Ингэх нь системийг хэвийн, алдаагүй ажиллуулахад зайлшгүй шаардлагагүй боловч зарим үзүүлэлтүүдийг сайжруулдаг тул нэмэлт байдлаар хэрэглэж болно. Дэлгэрэнгүй мэдээллийг nfsiod(8) хуудаснаас үзнэ үү.

### 30.3.2. NFS-н тохиргоог хийх

NFS-н тохиргоог хийх нь харьцангуй амархан. Ажиллах ёстой процессуудыг системтэй хамт автоматаар асдаг болгохын тулд `/etc/rc.conf` файлыг бага зэрэг өөрчлөхөд хангалттай.

NFS сервер дээрх `/etc/rc.conf` файл дотор дараах тохируулгууд идэвхжсэн байгаа эсэхийг шалгана уу:

rpcbind_enable="YES" nfs_server_enable="YES" mountd_flags="-r"

mountd нь NFS серверийг идэвхжүүлсэн тохиолдолд өөрөө автоматаар ажиллана.

Харилцагч талд, `/etc/rc.conf` файл дотор дараах тохируулга идэвхтэй байгаа эсэхийг шалгана уу:

nfs_client_enable="YES"

`/etc/exports` файл дотор NFS ямар файл системүүдийг экспорт хийхийг (заримдаа «хуваалцах» гэж мөн нэрлэнэ) зааж өгнө. `/etc/exports` файлын мөр бүр нь нэг файл системд харгалзана. Энэ файл системд хандах эрхтэй машинуудыг заахаас гадна, ямар тохируулгаар хандахыг мөн зааж өгч болно. Энэ файл дотор бичигдэж болох нилээд олон ийм тохируулгууд байгаа хэдий ч, бид тэдгээрээс зөвхөн заримыг нь энд авч үзэх болно. Та бусад тохируулгуудын талаар exports(5) заавар хуудаснаас уншиж мэднэ үү.

Доор `/etc/exports` файлаас хэдэн жишээ мөрийг үзүүлэв:

Дараах жишээн дээрээс файл системийг хэрхэн экспортлох санааг олж авах болно. Тохируулгууд нь таны сүлжээний тохиргоо, нөхцөл байдлаас шалтгаалан өөр байхыг анхаарна уу. Жишээ нь, `/cdrom` гэсэн санг 3 машин руу экспортлохын тулд дараах байдалтай бичнэ. Жишээн дээрх 3 машин сервертэй адил домэйн нэртэй, эсвэл таны `/etc/hosts` файл дотор тодорхойлогдсон гэж үзсэн болно. `-ro` туг нь экспортлогдож буй файл системийг зөвхөн унших боломжтой болохыг заана. Энэ тугийг тавьснаар алсаас хандаж буй машин энэ файл систем дээр ямар нэг өөрчлөлт хийх боломжгүй болно.

/cdrom -ro host1 host2 host3

Дараах жишээн дээр `/home` санг IP хаягаар нь зааж өгсөн 3 машин руу экспортолж байна. Ингэж IP хаягаар нь зааж өгөх нь дотоод сүлжээндээ DNS сервер ажиллуулаагүй үед их хэрэгтэй байдаг. Эсвэл `/etc/hosts` файл дотор дотоод хостуудын нэрийг тохируулж болно; hosts(5) хэсгийг дахин үзнэ үү. `-alldirs` гэсэн туг нь дэд сангуудыг холболтын цэг байхыг зөвшөөрч өгдөг. Өөрөөр хэлбэл, дэд сангуудыг холболгүй орхиж, харилцагч зөвхөн өөрийн хэрэгцээтэй байгаа сангаа холбохыг зөвшөөрнө гэсэн үг юм.

/home -alldirs 10.0.0.2 10.0.0.3 10.0.0.4

Дараах жишээн дээр `/a` санг хоёр өөр домэйноос 2 харилцагч хандаж болохоор экспортолж байна. `-maproot=root` гэсэн туг нь алслагдсан систем дээрх `root` хэрэглэгч экспортлогдсон файл систем дээр `root` эрхээр бичихийг зөвшөөрнө. Хэрэв `-maproot=root` тугийг тусгайлан зааж өгөөгүй бол, хэдий алслагдсан систем дээрх хэрэглэгч `root` эрхтэй ч экспортлогдсон файл систем дээр бичих эрхгүй болно.

/a -maproot=root host.example.com box.example.org

Харилцагч экспортлогдсон файл систем рүү хандахын тулд эрх нь байх ёстой. Тухайн харилцагч `/etc/exports` файл дотор бүртгэлтэй эсэхийг шалгаарай.

`/etc/exports` файл дотор мөр болгон нь нэг файл системийг нэг хост руу экспортлох мэдээллийг төлөөлнө. Алслагдсан хост аль нэг файл системийн хувьд зөвхөн ганц удаа л тодорхойлогдсон байх ёстой ба үүнд харгалзах ганцхан анхдагч бичлэг байж болно. Жишээ нь, `/usr` нь нэг файл систем гэж бодъё. `/etc/exports` файл доторх дараах бичлэгүүд нь буруу юм:

# Invalid when /usr is one file system /usr/src client /usr/ports client

Учир нь `/usr` гэсэн файл системийг `client` гэсэн хост руу экспортолсон хоёр бичлэг байна. Энэ тохиолдолд дараах форматаар бичвэл зөв болно:

/usr/src /usr/ports client

Нэг хост руу экспортлогдож байгаа файл системийн хувьд шинжүүдийг бүгдийг нэг мөрөнд жагсаан бичих ёстой. Харилцагчийг зааж өгөөгүй мөрүүдийг энгийн хост гэж үзнэ. Энэ нь файл системийг экспортлох боломжийг хязгаарлана, гэвч энэ нь ихэнх хүмүүст хүнд асуудал биш байдаг.

Дараагийн жишээн дээр `/usr` ба `/exports` гэсэн дотоод файл системийг экспортолсон байна:

# Export src and ports to client01 and client02, but only # client01 has root privileges on it /usr/src /usr/ports -maproot=root client01 /usr/src /usr/ports client02 # The client machines have root and can mount anywhere # on /exports. Anyone in the world can mount /exports/obj read-only /exports -alldirs -maproot=root client01 client02 /exports/obj -ro

`/etc/exports` файл дотор гарсан өөрчлөлтүүдийг хүчинтэй болгохын тулд, өөрчлөлт орсон тухай бүрд mountd дэмонг албадан `/etc/exports`-г дахин уншуулах хэрэгтэй болдог. Үүний тулд эсвэл HUP дохиог ажиллаж байгаа дэмонд өгөх хэрэгтэй:

`#` `kill -HUP `cat /var/run/mountd.pid``

эсвэл `mountd` rc(8) скриптийг зохих параметрийн хамт ажиллуулах хэрэгтэй:

`#` `service mountd onereload`

rc скриптийг хэрэглэх зааврыг Хэсэг 12.7, «FreeBSD дээр rc(8) ашиглах нь» хэсгээс үзнэ үү.

Бас нэг боломж нь, FreeBSD-г эхнээс нь ачаалж, бүх процессийг дахин эхлүүлэх юм. Гэвч үүний тулд заавал системийг дахин ачаалах шаардлага байхгүй. `root` эрхээр дараах тушаалуудыг өгснөөр зөвхөн хэрэгтэй процессуудаа дахин эхлүүлэх боломжтой.

NFS сервер дээр:

`#` `rpcbind` `#` `nfsd -u -t -n 4` `#` `mountd -r`

NFS харилцагч дээр:

`#` `nfsiod -n 4`

Одоо алсын файл системийг холбоход бэлэн боллоо. Доорх жишээнүүд дээр серверийн нэрийг `server`, харилцагчийн нэрийг `client` гэж авсан болно. Хэрэв та алсын файл системийг зөвхөн түр хугацаагаар холбох гэж байгаа эсвэл тохиргоогоо шалгах гэж байгаа бол, харилцагч талд `root` эрхээр дараах тушаалыг өгөхөд хангалттай:

`#` `mount server:/home /mnt`

Энэ тушаалыг өгснөөр та сервер талд байгаа `/home` гэсэн санг харилцагч талд байгаа `/mnt` сантай холбох болно. Хэрэв бүх зүйл зөв тохируулагдсан бол, та харилцагч талын `/mnt` сан дотор орж сервер дээр байгаа файлуудыг харж чадах ёстой.

Хэрэв систем шинээр ачаалах бүрд ямар нэг алсын файл системийг холбох хүсэлтэй байгаа бол, түүнийгээ `/etc/fstab` файл дотор нэмж бичих хэрэгтэй. Жишээ нь:

server:/home /mnt nfs rw 0 0

Боломжит бүх сонголтуудын талаар fstab(5) заавар хуудаснаас үзнэ үү.

### 30.3.3. Цоожлолт

Зарим програмууд (ж.н. mutt) зөв ажиллахын тулд файл цоожлолтыг шаарддаг. NFS-н хувьд, rpc.lockd-г файл цоожлолтонд хэрэглэж болно. Түүнийг идэвхжүүлэхийн тулд, сервер болон харилцагч талд хоёуланд нь `/etc/rc.conf` файл дотор дараах мөрүүдийг нэмж өгөх хэрэгтэй (NFS сервер болон харилцагч талуудыг аль хэдийн тохируулчихсан гэж үзэв):

rpc_lockd_enable="YES" rpc_statd_enable="YES"

Програмыг дараах байдалтай эхлүүлнэ:

`#` `service lockd start` `#` `service statd start`

Хэрэв NFS харилцагч болон NFS сервер талуудын хооронд жинхэнэ файл цоожлолт хийгдэх шаардлагагүй бол, NFS харилцагч талд mount_nfs(8)-д `-L` тохируулгыг өгөн дотоод цоожлолт хийлгэж болно. Дэлгэрэнгүй мэдээллийг mount_nfs(8) заавар хуудаснаас үзнэ үү.

### 30.3.4. Практик хэрэглээ

NFS нь олон практик хэрэглээтэй. Хамгийн элбэг тохиолддог хэрэглээг доор жагсаав:

- Олон машиныг нэг CDROM эсвэл төхөөрөмжийг дундаа хэрэглэдэг байхаар зохион байгуулах. Энэ нь нэг програмыг олон машин дээр суулгах хамгийн хямд, хялбар арга юм.

- Том сүлжээний хувьд, бүх хэрэглэгчдийн гэрийн санг хадгалдаг төвлөрсөн NFS серверийг тохируулах. Эдгээр гэрийн сангуудыг дараа нь сүлжээний орчинд экспортолсноор хэрэглэгчид аль машин дээр ажиллаж буйгаас үл хамааран өөрийн нэг л сан дотор ажиллах боломжтой болно.

- Олон машин дундаа нэг `/usr/ports/distfiles` сантай байх. Ийм замаар, нэг портыг олон машин дээр суулгах хэрэгтэй үед машин бүр дээр эх файлыг татаж авалгүйгээр хурдан суулгах боломжтой болно.

### 30.3.5. amd-р автоматаар холбох нь

Хувь нэмрээ оруулсан Вылий Стилвэл.
Дахин эмхтгэсэн Шерн Лий.
Орчуулсан Лодойсамбын Баянзул.

amd(8) (автоматаар холбогч дэмон) нь алсын файл системийн файл эсвэл санд хэрэглэгч хандах тухай бүрт уг файл системийг автоматаар холбодог. Хэсэг хугацааны туршид идэвхгүй байгаа файл системийг amd мөн автоматаар салгана. amd-г хэрэглэснээр `/etc/fstab` дотор бичигддэг байнгын холболтоос гадна, холболт хийх боломжийг олгодог.

amd нь өөрийгөө, `/host` ба `/net` сангууд дээр NFS сервер байдлаар холбож ажиллах бөгөөд эдгээр сангууд доторх файлд хандах үед, amd харгалзах алсын холболтыг хайж олоод автоматаар холбох болно. `/net` нь экспортлогдсон файл системийг IP хаягаар нь холбоход, харин `/host` нь хост нэрээр нь холбоход хэрэглэгдэнэ.

`/host/foobar/usr` сан доторх файлд хандана гэдэг нь amd-г `foobar` гэсэн хост дээр экспортлогдсон `/usr` санг холбохын зааж өгнө.

Жишээ 30.2. Экспортыг amd-р холбох

Алсын хост дээр байгаа боломжит холболтуудын жагсаалтыг `showmount` тушаалын тусламжтай харж болно. Жишээлбэл, `foobar` нэртэй хостын экспортыг харахын тулд:

`%` `showmount -e foobar` Exports list on foobar: /usr 10.10.10.0 /a 10.10.10.0 `%` `cd /host/foobar/usr`

Жишээн дээр үзүүлснээр `showmount` нь `/usr`-г экспортлогдсон болохыг харуулж байна. `/host/foobar/usr` сан дотор ороход, amd нь `foobar` гэсэн хост нэрийг тайлахыг оролдох ба заасан санг холбоно.

amd-г эхлэл скриптүүдээр эхлүүлж болох ба үүний тулд `/etc/rc.conf` файл дотор дараах мөрийг нэмэх хэрэгтэй:

amd_enable="YES"

Мөн, amd програмд `amd_flags` тохируулгын тусламжтай тугуудыг өгч болно. `amd_flags`-н анхдагч утга нь:

amd_flags="-a /.amd_mnt -l syslog /host /etc/amd.map /net /etc/amd.map"

`/etc/amd.map` файл дотор экспортуудыг холбох анхдагч тохируулгуудыг зааж өгсөн байна. `/etc/amd.conf` файл дотор amd-н илүү дээд түвшний чанаруудыг тодорхойлж өгнө.

Дэлгэрэнгүй мэдээллийг amd(8) ба amd.conf(5) заавар хуудаснаас үзнэ үү.

### 30.3.6. Бусад системтэй нэгтгэхэд тохиолдох асуудлууд

Хувь нэмрээ оруулсан Жон Линд.
Орчуулсан Лодойсамбын Баянзул.

ISA PC системд зориулсан зарим Ethernet адаптерууд учир дутагдалтай байдгаас сүлжээний орчинд ажиллахад, тэр дундаа NFS-тэй ажиллахад нилээд асуудалтай байдаг. Энэ асуудал зөвхөн FreeBSD-д тохиолддоггүй боловч FreeBSD систем үүнд нилээд өртөмтгий байдаг.

Энэ асуудал нь (FreeBSD) PC системийг өндөр үзүүлэлттэй машинуудтай (жишээлбэл, Silicon Graphics, Inc., ба Sun Microsystems, Inc компаниудын хийсэн) сүлжээнд холбох үед бараг үргэлж тохиолддог. NFS холболт хийхэд асуудалгүй, зарим үйлдлүүдийг хийхэд амжилттай байх боловч, гаднаас ирж явж байгаа хүсэлтүүдийг боловсруулж чадаж байгаа хэдий ч сервер гэнэт харилцагчид хариу өгөхгүй болдог. Энэ асуудал мөн харилцагчийн хувьд, харилцагч FreeBSD систем эсвэл ажлын машин байхаас үл шалтгаалан тохиолдоно. Ихэнх системийн хувьд, нэгэнт ийм асуудалд орсон бол харилцагч талыг ном ёсных нь дагуу унтраах боломжгүй болдог. Ганц авдаг арга хэмжээ бол системийг хүчээр унтрааж асаах юм. Учир нь, NFS-н энэ асуудал одоо хир нь шийдэгдээгүй байна.

Хэдийгээр «зөв» шийдэл бол FreeBSD системд тохирох илүү өндөр үзүүлэлттэй, илүү багтаамжтай Ethernet адаптерийг олж авах боловч, боломжит ажиллагааг хангахын тулд нэг арга байна. Хэрэв FreeBSD систем нь сервер бол, харилцагч талаас холболт хийхдээ `-w=1024` тохируулгыг оруулж өгөх явдал юм. Хэрэв FreeBSD систем нь харилцагч бол, NFS файл системтэй холбогдохдоо `-r=1024` тохируулгыг хэрэглэх юм. Эдгээр тохируулгуудыг автомат холболтын хувьд `fstab` бичлэгийн дөрөв дэх талбарыг ашиглан, гар аргаар холболт хийх бол mount(8) тушаалын `-o` параметрыг ашиглан зааж өгч болно.

NFS сервер болон харилцагчид өөр өөр сүлжээнд байхад гардаг өөр нэг асуудлыг энэ асуудалтай хольж хутгах тохиолдол байдгийг энд дурдах нь зүйтэй болов уу. Хэрэв тийм бол, чиглүүлэгчид шаардлагатай UDP мэдээллийг дамжуулж чадаж байгаа эсэхийг нягталж үзээрэй. Үгүй бол, өөр юу ч хийлээ гээд та үр дүнд хүрч чадахгүй.

Дараах жишээн дээр, `fastws` нь өндөр үзүүлэлттэй ажлын машины хост (интерфэйс) нэр, `freebox` нь бага үзүүлэлттэй Ethernet адаптертай FreeBSD системийн нэр юм. Мөн, `/sharedfs` нь экспортлогдох гэж байгаа NFS файл систем (exports(5)-г үз), ба `/project` нь харилцагч талын экспортлогдсон файл системийг холбох цэг байх болно. Аль ч тохиолдолд, `hard` эсвэл `soft` ба `bg` зэрэг нэмэлт тохируулгууд таны хувьд хэрэгтэй байж болох юм.

FreeBSD системийг (`freebox`) `freebox` дээр `/etc/fstab` дотор харилцагч байдлаар зааж өгөх жишээ:

fastws:/sharedfs /project nfs rw,-r=1024 0 0

`freebox` дээр гараар холбохдоо:

`#` `mount -t nfs -o -r=1024 fastws:/sharedfs /project`

FreeBSD системийг (`freebox`) `fastws` дээр `/etc/fstab` дотор сервер байдлаар зааж өгөх жишээ:

freebox:/sharedfs /project nfs rw,-w=1024 0 0

`fastws` дээр гараар холбохдоо:

`#` `mount -t nfs -o -w=1024 freebox:/sharedfs /project`

Бараг бүх 16-битийн Ethernet адаптерийн хувьд унших ба бичих хэмжээн дээр дээрх байдлаар хязгаарлалт хийлгүйгээр ажиллах боломжтой байдаг.

Сонирхсон улсуудад толилуулахад, дээрх алдаа гарахад чухам юу тохиолддог, яагаад засагдах боломжгүй болох талаар дор тайлбарлав. NFS нь голчлон 8 K (хэдийгээр илүү бага хэмжээтэй хэсэг дээр ажиллаж чадах боловч) хэмжээтэй «блок»ууд дээр ажилладаг. Хамгийн урт Ethernet пакет 1500 байт орчим байх ба, NFS «блок» нь хэд хэдэн Ethernet пакетуудад хуваагдах хэрэгтэй болдог. Дээд түвшний програмын хувьд энэ нь нэг нэгж хэвээр байх ба хүлээж аваад, нийлүүлээд, бататгал хийхэд ч мөн нэг нэгж хэвээр байдаг. Өндөр үзүүлэлттэй ажлын машинууд NFS нэгжийг бүрдүүлж байгаа тэдгээр пакетуудыг стандартад заасны дагуу аль болох ойрхон ойрхон, нэг нэгээр нь цувуулж гаргана. Жижиг, бага багтаамжтай картууд дээр, дээд түвшний програмд дамжуулахаас өмнө сүүлийн пакет нь өмнөх пакетаа дарснаар тухайн нэгжийг буцааж нийлүүлж, бататгах боломжгүй болно. Үүнээс болж, ажлын машины болзоот хугацаа дуусаж бүхэл бүтэн 8 K нэгжийг дахин дамжуулах болно. Энэ үйл ажиллагаа дахин дахин хязгааргүй давтагдах болно.

Нэгжийн хэмжээг Ethernet пакетийн хэмжээнээс бага байлгаснаар, бид Ethernet пакет тус бүрийг бататгаж мухардалд орохоос сэргийлж чадна.

Өндөр үзүүлэлттэй ажлын машинууд PC систем рүү өгөгдлийг цацсаар байх үед давхцал үүссээр байх боловч, илүү сайн карт ашигласнаар NFS «нэгж»ийн хувьд заавал тийм давхцал үүсэх албагүй болно. Давхцал үүссэн тохиолдолд, түүнд өртсөн нэгжийг дахин дамжуулах ба түүнийг хүлээн авч, нийлүүлж, бататгах боломж өндөртэй.

Өмнөх | Дээш | Дараах
30.2. inetd «Супер-Сервер» | Эхлэл | 30.4. Сүлжээний Мэдээллийн Систем (NIS/YP)

Энэ болон бусад баримтуудыг ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/ хаягаас татаж авч болно.

FreeBSD-ийн талаар <questions@FreeBSD.org> хаягтай холбоо барихаасаа өмнө баримтыг уншина уу.
Энэ бичиг баримттай холбоотой асуулт байвал <doc@FreeBSD.org> хаягаар цахим захидал явуулна уу.
Энэ бичиг баримтын орчуулгатай холбоотой асуулт байвал <admin@mnbsd.org> хаягаар цахим захидал явуулна уу.