โครงสร้าง Linux File System และ Permission

File System ทำหน้าควบคุมการจัดเก็บ ไฟล์ต่างๆ ไปเก็บไว้ใน Partition ของ hardisk โดยจะทำหน้าที่แบ่ง ไฟล์ใหญ่ๆ ออกเป็นส่วนเล็กๆ และนำไปเก็บไว้ในส่วนต่างๆ ของ hardisk

รูปแบบที่เก็บก็จะเก็บในลักษณะของ โครงสร้างของ Folder ในแต่ละ ระบบปฎิบัติการหนึ่งจะมี root file system หรือ "/" อยู่ระดับโครงสร้างบนสุด โดยขอให้ทำความเข้าใจว่าโครงสร้างของ Folder และ File ต่างๆ นั้นจะเป็นในลักษณะของ Logical System ไม่ใช่เป็น แบบ Physical ในความเป็นจริง file ต่างๆ จัดเก็บอยู่ใน disk ที่ต่าง Partition กัน หรือ อยู่กันบน Disk คนละก้อนกัน แต่สำหรับใน Layer ของ File system ก็เปรียบเสมือนอยู่บน File System เดียวกัน

# cd  /
# ls -lF
total 20
lrwxrwxrwx.   1 root    root       7 Aug 23 07:08 bin -> usr/bin/
dr-xr-xr-x.   5 root    root    4096 Nov 11 13:39 boot/
drwxr-xr-x.  18 root    root    3120 Nov 16 07:26 dev/
drwxr-xr-x. 132 root    root    8192 Nov 16 14:26 etc/
drwxr-xr-x.   5 root    root      52 Nov 12 03:05 home/
lrwxrwxrwx.   1 root    root       7 Aug 23 07:08 lib -> usr/lib/
lrwxrwxrwx.   1 root    root       9 Aug 23 07:08 lib64 -> usr/lib64/
drwxr-xr-x.   2 root    root       6 Nov  5  2016 media/
drwxr-xr-x.   2 root    root       6 Nov  5  2016 mnt/
drwxr-xr-x.   4 root    root      48 Nov 12 03:01 opt/
dr-xr-xr-x. 162 root    root       0 Nov 16 14:26 proc/
dr-xr-x---.   6 root    root     276 Nov 12 14:35 root/
drwxr-xr-x.  36 root    root    1180 Nov 16 14:26 run/
lrwxrwxrwx.   1 root    root       8 Aug 23 07:08 sbin -> usr/sbin/
drwxr-xr-x.   2 root    root       6 Nov  5  2016 srv/
dr-xr-xr-x.  13 root    root       0 Nov 16 07:26 sys/
drwxrwxrwt.  36 root    root    4096 Nov 16 14:26 tmp/
drwxr-xr-x.  13 root    root     155 Aug 23 07:08 usr/
drwxr-xr-x.   1 vagrant vagrant  128 Nov 11 10:15 vagrant/
drwxr-xr-x.  20 root    root     282 Nov 11 13:31 var/

การ Mount File System และ Disk

Linux kernel จะทำการ เชื่อม ระหว่าง file system และ Partition เรียกว่า การ mounting

ด้วยคำสั่ง mount linux สามารถ mount file system กับ Disk นอกจากนั้นยังใช้คำสั่ง mount ไปเชื่อมกับ iso image และ remote linux file system

# ls -l /dev/sda*
brw-rw----. 1 root disk 8, 0 Nov 16 07:26 /dev/sda
brw-rw----. 1 root disk 8, 1 Nov 16 07:26 /dev/sda1
brw-rw----. 1 root disk 8, 2 Nov 16 07:26 /dev/sda2

# mount | grep "/dev"

ชนิดของ File System ด้วยคำสั่ง df -Th

# df -Th
Filesystem          Type      Size  Used Avail Use% Mounted on
/dev/mapper/cl-root xfs        37G  3.9G   34G  11% /
devtmpfs            devtmpfs  1.9G     0  1.9G   0% /dev
tmpfs               tmpfs     1.9G     0  1.9G   0% /dev/shm
tmpfs               tmpfs     1.9G  8.8M  1.9G   1% /run
tmpfs               tmpfs     1.9G     0  1.9G   0% /sys/fs/cgroup
/dev/sda1           xfs      1014M  258M  757M  26% /boot
tmpfs               tmpfs     380M   12K  380M   1% /run/user/42
vagrant             vboxsf    466G   53G  414G  12% /vagrant
tmpfs               tmpfs     380M     0  380M   0% /run/user/1000
# lsblk -f
NAME        FSTYPE      LABEL          UUID                                   MOUNTPOINT
sda                                                                           
├─sda1      xfs                        5415cfa7-fe39-4660-80d6-edd9bce71cf5   /boot
└─sda2      LVM2_member                0e82iE-fRXw-jQyw-M0R3-jQ3P-g0af-HLjZlU 
  ├─cl-root xfs                        2872e536-d348-4e10-8ad1-5fa30231f5d7   /
  └─cl-swap swap                       c5f4bdfc-f7f7-4d36-a582-6e7fcf87c483   [SWAP]
sr0         iso9660     VBox_GAs_5.2.0 2017-10-18-05-26-49-71

คำสั่ง blkid เพื่อแสดงคุณสมบัติ disk partition

# blkid /dev/sda1
/dev/sda1: UUID="5415cfa7-fe39-4660-80d6-edd9bce71cf5" TYPE="xfs"

Static file ที่เกี่ยวของกับการ mount ได้แก่ /etc/fstab

# cat /etc/fstab 

#
# /etc/fstab
# Created by anaconda on Wed Aug 23 00:08:41 2017
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/cl-root     /                       xfs     defaults        0 0
UUID=5415cfa7-fe39-4660-80d6-edd9bce71cf5 /boot                   xfs     defaults        0 0
/dev/mapper/cl-swap     swap                    swap    defaults        0 0

นอกจาก จะทำหน้าสำหรับการจัดเก็บ แล้วยังรับผิดชอบในการจัดการเกียวกับ Permissionsทุก File และ Folder ควบคุมการเข้าถึง (Access Controller) โดยจะใช้ ข้อมูลดังนี้

กลุ่ม permission ประกอบด้วย u - owner, g - group, o - others

ชนิด ของ permision ได้แก่ r - read, w - write, x-eXecute

# touch test
# ls -l test 
-rw-r--r--. 1 root root 0 Nov 16 15:14 test

การเปลี่ยน permission ด้วยคำสั่ง chmod

# chmod g+x test
# ls -l test
-rw-r-xr--. 1 root root 0 Nov 16 15:14 test


# chmod  o-rwx test
# ls -l test
-rw-r-x---. 1 root root 0 Nov 16 15:14 test

การเปลี่ยนแปลง owner และ group ด้วยคำสั่ง chown

# chown nobody:wheel test
# ls -l test
-rw-r-x---. 1 nobody wheel 0 Nov 16 15:14 test

permission แบบ พิเศษ โดยการเพิ่ม flag อีก สองชนิด คือ

s - Set UserID และ Set Group ID

t - The sticky flag

# chmod  u+s test
# ls -l test
-rwSr-x---. 1 nobody wheel 0 Nov 16 15:14 test

หมายถึง ใครก็ตามที่มีสิทธิ รัน file นี้ จะรัน ในฐานะของ Owner file เช่นคำสั่ง /bin/passwd

# ls -l /bin/passwd
-rwsr-xr-x. 1 root root 27832 Jun 10  2014 /bin/passwd

การอ้างอิงในระบบตัวเลข ฐาน 8 (Octal representation)

การเปลี่ยนค่าของ permission นอกจากใช้ระบบตัวอักษร ในคำสั่ง chmod ยังสามารถใช้ ระบบเลขฐาน 8

"r" = 4, "w" = 2, "x" = 1, rwx = 4 + 2 + 1 =7, rx = 4+1 = 5

# chmod 755  test
# ls -l test
-rwxr-xr-x. 1 nobody wheel 0 Nov 16 15:14 test

เพิ่ม Disk ให้กับ Linux

เราสามารถเพิ่มเติม Disk ขึ้นมาใช้งานเพื่อใช้สำหรับการเก็บข้อมูล ในการทดสอบ ด้วย file vagrant file ได้เพิ่ม disk อีก สองก้อน

vim Vagrantfile

# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure("2") do |config|
  config.vm.box = "bento/centos-7.3"
  config.vm.network "private_network", ip: "192.168.33.100"
  config.vm.provider "virtualbox" do |vb|
      unless File.exist?('./secondDisk.vdi')
        vb.customize ['createhd', '--filename', './secondDisk.vdi', '--variant', 'Fixed', '--size', 10 * 1024]
      end
      unless File.exist?('./thirdDisk.vdi')
        vb.customize ['createhd', '--filename', './thirdDisk.vdi', '--variant', 'Fixed', '--size', 10 * 1024]
      end
     vb.memory = "4096"
     vb.cpus = "2"
     vb.customize ['storageattach', :id,  '--storagectl', 'SATA Controller', '--port', 1, '--device', 0, '--type', 'hdd', '--medium', './secondDisk.vdi']
     vb.customize ['storageattach', :id,  '--storagectl', 'SATA Controller', '--port', 2, '--device', 0, '--type', 'hdd', '--medium', './thirdDisk.vdi']

  end
end

เราสามารถใช้คำสั่ง lsblk เพื่อดูว่า มีการใช้งาน disk อย่างไรบ้าง

# lsblk
NAME        MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda           8:0    0  40G  0 disk 
├─sda1        8:1    0   1G  0 part /boot
└─sda2        8:2    0  39G  0 part 
  ├─cl-root 253:0    0  37G  0 lvm  /
  └─cl-swap 253:1    0   2G  0 lvm  [SWAP]
sdb           8:16   0  10G  0 disk 
sdc           8:32   0  10G  0 disk

ขั้นตอนการใช้งาน

  1. การใช้งานจะใช้คำสั่ง fdisk สำหรับแบ่ง partitions
  2. Format สร้างfile system ด้วยคำสั่ง เช่น mkfs.ext2 mkfs.ext3 mkfs.ext4 mkfs.minix mkfs.xfs
  3. สร้าง folder และทำการ mount
  4. เพิ่มเติมใน /etc/fstab
# fdisk /dev/sdb
Welcome to fdisk (util-linux 2.23.2).

Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.

Device does not contain a recognized partition table
Building a new DOS disklabel with disk identifier 0x99b53f52.

Command (m for help): n                  #<---   n คำสั่งสร้าง new partition
Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p): p                   #<----    p  สร้าง แบบชนิด primary
Partition number (1-4, default 1):      #<----    Enter ผ่านยอมรับค่า default
First sector (2048-20971519, default 2048):    #<--- Enter ผ่าน
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-20971519, default 20971519):  #<---- Enter ผ่าน
Using default value 20971519
Partition 1 of type Linux and of size 10 GiB is set

Command (m for help): w                        # write เพื่อบันทึกการเปลี่ยนแปลง
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.

Format partition /dev/sdb1 ให้เป็น ชนิด ext4

# mkfs.ext4 /dev/sdb1

mke2fs 1.42.9 (28-Dec-2013)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
655360 inodes, 2621184 blocks
131059 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=2151677952
80 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks: 
    32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632

Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done

สร้าง folder /data และ mount

# mkdir /data
# mount -t ext4  /dev/sdb1 /data
# mount | grep sdb1
...
/dev/sdb1 on /data type ext4 (rw,relatime,seclabel,data=ordered)
# umount /data

vi /etc/fstab

...
/dev/sdb1    /data     ext4  defaults   0 0

หลังจากเพิ่ม บรรทัดใน /etc/fstab และใช้คำสั่ง mount -a ให้ อ่าน ไฟล์ /etc/fstab

# mount -a
# mount  | grep sdb1
/dev/sdb1 on /data type ext4 (rw,relatime,seclabel,data=ordered)

ให้ทดสอบ persistance mounts ด้วยการ reboot

reboot

results matching ""

    No results matching ""