Life would be so much simple if we don't care so much

Posts tagged ‘linux’

Linux – mkfs tạo file hệ thống trên partition

Để sử dụng được ổ cứng expand thì cần phải tạo partition và tạo file hệ thống trên partition đó.
Ở bài này sẽ nói về các loại file hệ thống có thể dùng trên Linux cũng như cách tạo file hệ thống trên partition.

1. Các loại file hệ thống

File hệ thống là 1 cơ chế dùng để quản lý các thuộc tính data như file name, created date, updated date…trên thiết bị lưu trữ, chẳng hạn như ổ cứng và quản lý bản thân data file đó, tuỳ theo OS mà các file hệ thống được sử dụng sẽ khác nhau.
Trường hợp Linux thì tuỳ theo các bản phân phối khác nhau mà file hệ thống sẽ khác nhau nhưng ext3, ext4 thì thường được sử dụng nhiều.

Các file hệ thống được sử dụng trên Linux
Filename        Maximum file size        Description
ext2                 2TB                                  Là file hệ thống được sử dụng phổ biến ở hệ điều hành Linux và được mở rộng từ file hệ thống ext.
ext3                 16GB~2TB                     Là ext2 được thêm vào chức năng hệ thống journaling. Ở Linux thì đây là phần chính của file hệ thống. Sớm có thể nhận biết khoảng thời gian từ 12/14/1901 đến 1/18/2038
ext4                 16TB                                 Hỗ trợ max volume size là 1EB và max file size là 16TB. Hỗ trợ date range từ 12/14/1901 đến 4/24/2514, trong thời gian system run có thể dùng.
Timestamp được support đến nanosecond, có thể sau này phần chính của file hệ thống sẽ reponse tốt hơn so với ext3.
ReiserFS         16TB                                 Chức năng journaling file hệ thống để handle các file nhỏ. Có thể là sẽ dùng được với SUSE.
Ngoài ra còn 1 số loại file khác nhưng phần chính có lẽ nằm ở top bảng thông tin.

2. Khởi tạo file hệ thống
Dùng lênh mkfs để tạo file hệ thống

Format
mkfs [option] Device name (partition)
1 số option thường dùng
-t Chỉ định type cho file hệ thống. Nếu không chỉ định type thì mặc định sẽ dùng là ext2
-c Trước khi tạo file hệ thống thì sẽ tiến hành check bad block.

Chúng ta sẽ thử 1 số sample tạo file hệ thống

# mkfs -t ext4 /dev/sdb1
↑ File hệ thống là ext4。Format partition /dev/sdb1
mke2fs 1.41.12 (17-May-2010)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
66384 inodes, 265064 blocks
13253 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=272629760
9 block groups
32768 blocks per group, 32768 fragments per group
7376 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376

Writing inode tables: done
Creating journal (8192 blocks): done
Writing superblocks and filesystem accounting information: done

This filesystem will be automatically checked every 21 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.

***Notes

mkfs chỉ là front-end program. Thực tế sẽ run những lệnh sau (mkfs.ext2、mkfs.ext3、mkfs.ext4) nên có thể tạo file hệ thống bằng cách run trực tiếp các command này.

# ls -l /sbin/mkfs*
-rwxr-xr-x. 1 root root 7416 4月 29 16:41 2013 /sbin/mkfs
-rwxr-xr-x. 1 root root 22476 4月 29 16:41 2013 /sbin/mkfs.cramfs
-rwxr-xr-x. 5 root root 61072 6月 25 17:49 2013 /sbin/mkfs.ext2 ← ext2用mkfs
-rwxr-xr-x. 5 root root 61072 6月 25 17:49 2013 /sbin/mkfs.ext3 ← ext3用mkfs
-rwxr-xr-x. 5 root root 61072 6月 25 17:49 2013 /sbin/mkfs.ext4 ← ext4用mkfs
-rwxr-xr-x. 5 root root 61072 6月 25 17:49 2013 /sbin/mkfs.ext4dev
lrwxrwxrwx. 1 root root 7 8月 3 16:02 2013 /sbin/mkfs.msdos -> mkdosfs
lrwxrwxrwx. 1 root root 7 8月 3 16:02 2013 /sbin/mkfs.vfat -> mkdosfs

Cách dùng cũng đơn giản, chỉ cần chỉ định partition sau command là được.

# mkfs.ext4 /dev/sdb1 ← chỉ định tên thiết bị của partition cho command
mke2fs 1.41.12 (17-May-2010)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
66384 inodes, 265064 blocks
13253 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=272629760
9 block groups
32768 blocks per group, 32768 fragments per group
7376 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376

Writing inode tables: done
Creating journal (8192 blocks): done
Writing superblocks and filesystem accounting information: done

This filesystem will be automatically checked every 25 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.

Tham khảo nguồn

Linux – tạo partition dùng fdisk

Ở Linux, lệnh fdisk được sử dụng để quản lý các partition của ổ cứng. Với fdisk thì có thể tạo và xoá các phân vùng ổ đĩa, cũng như check được thông tin các partition.

Ở bài này, sẽ giải thích về cách tạo partition trên extended hard-disk.

1. Tạo phân vùng mới
Tạo partition bằng cách run fdisk và pass vào parameter là tên của device (ổ cứng) muốn tạo partition

eg1

# fdisk /dev/sdb
command fdisk là command dạng menu format
Sau khi run command, từ menu trong khi vừa chọn 1 số xử lý, việc tạo partition sẽ được tiếp tục.
Nếu nhập vào「m」thì sẽ hiển thị help

eg2 (fyi EN)
[root@70c8dcd1d9f7 /]# fdisk /dev/vda
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.

Command (m for help):

(JPN)

# fdisk /dev/sdb
新たに DOS ディスクラベルを作成します。あなたが書き込みを決定するまで、変更は
メモリ内だけに残します。その後はもちろん以前の内容は修復不可能になります。
警告: 領域テーブル 4 の不正なフラグ 0x0000 は w(書き込み)によって
正常になります

コマンド (m でヘルプ): m  ← input vào m
コマンドの動作
a ブート可能フラグをつける
b bsd ディスクラベルを編集する
c dos 互換フラグをつける
d 領域を削除する
l 既知の領域タイプをリスト表示する
m このメニューを表示する
n 新たに領域を作成する
o 新たに空の DOS 領域テーブルを作成する
p 領域テーブルを表示する
q 変更を保存せずに終了する
s 空の Sun ディスクラベルを作成する
t 領域のシステム ID を変更する
u 表示/項目ユニットを変更する
v 領域テーブルを照合する
w テーブルをディスクに書き込み、終了する
x 特別な機能 (エキスパート専用)

(fyi EN)
Command (m for help): m ← input vào m
Command action
a toggle a bootable flag
b edit bsd disklabel
c toggle the dos compatibility flag
d delete a partition
g create a new empty GPT partition table
G create an IRIX (SGI) partition table
l list known partition types
m print this menu
n add a new partition
o create a new empty DOS partition table
p print the partition table
q quit without saving changes
s create a new empty Sun disklabel
t change a partition’s system id
u change display/entry units
v verify the partition table
w write table to disk and exit
x extra functionality (experts only)

***Note
Có message khi thực thị của command nhưng dùng w để write nội dung thay đổi.
Cho tới khi nội dung thay đổi được write thì mọi thay đổi sẽ không được apply.

Khi tạo phân vùng mới thì cũng như help command, input vào n

コマンド (m でヘルプ): n  ← input vào n
コマンドアクション
e 拡張
p 基本領域 (1-4)

(fyi EN)
Command (m for help): n ← input vào n
Partition type:
p primary (1 primary, 0 extended, 3 free)
e extended

Muốn tạo phân vùng extended hay là phân vùng chính thì chọn bằng cách input vào.

***Note
Chỉ có thể chia tới 4 partition trên ổ cứng. (vượt quá 4 là không thể)
Khi chia partition thì sẽ có phân vùng chính hoặc phân vùng mở rộng, nếu chia phân vùng mở rộng thì ứng với 1 ổ cứng chỉ có thể tạo được 1 phân vùng mở rộng. Nếu tạo 4 phần của partition đều là phân vùng chính, thì sẽ không tạo được phân vùng mở rộng.
Với phân vùng mở rộng, do có thể tạo được các partition logic nên trường hợp cần nhiều partition thì sẽ rất cần tới phân vùng mở rộng.

Số lượng partition tối đa

IDE :63 (primary 3 + logic 60)
SATA:15 (primary3 + logic 12)
SCSI:15 (primary3 + logic 12)

Ở đây, chúng ta sẽ tạo thử phân vùng primary 1GB

コマンド (m でヘルプ): n
コマンドアクション
e 拡張
p 基本領域 (1-4)
p ← Lần này chúng ta sẽ tạo phân vùng primary nên sẽ input vào p

領域番号 (1-4): 1 ← Do lần đầu tiên tạo partition trên disk này nên sẽ nhập 1

最初 シリンダ (1-652, default 1): 1 ← Đây là partition đầu tiên trên disk nên sẽ input 1 cho head cylinder
終点 シリンダ または +サイズ または +サイズM または +サイズK (1-652, default 652): +1024M
※ Ở đây, với 1 partition thì cần chỉ định size đảm bảo cho ổ cứng. Lần này là chia 1 GB

Input vào p thì có thể check được trạng thái partition hiện tại

コマンド (m でヘルプ): p  ← input vào p

Disk /dev/sdb: 5368 MB, 5368709120 bytes
255 heads, 63 sectors/track, 652 cylinders Units = シリンダ数 of 16065 * 512 = 8225280 bytes

デバイス Boot Start End Blocks Id System
/dev/sdb1 1 125 1004031 83 Linux ← partition mới được tạo

2. Thay đổi systemID của phân vùng

Ở đây chúng ta sẽ quyết định loại file system nào sẽ apply khi chia partition mới.
Nếu định dùng file system ext3 và ext4 thì không cần phải làm việc này.
Chẳng hạn như khi thay đổi vùng mở rộng (Extended area) hoặc phân vùng dùng cho LVM … thì ở đây chúng ta sẽ thay đổi system ID.
Để check danh sách các phân vùng system ID thì presss l (chữ nhỏ của L)

(JPN)
マンド (m でヘルプ): l ← input l

0 空 24 NEC DOS 81 Minix / 古い bf Solaris
1 FAT12 39 Plan 9 82 Linux スワッ c1 DRDOS/sec (FAT-
2 XENIX root 3c PartitionMagic 83 Linux c4 DRDOS/sec (FAT-
3 XENIX usr 40 Venix 80286 84 OS/2 隠し C: c6 DRDOS/sec (FAT-
4 FAT16 <32M 41 PPC PReP Boot 85 Linux 拡張領 c7 Syrinx
5 拡張領域

Tham khảo nguồn

Linux – check device name của hard-disk

Ở Linux, lệnh fdisk được sử dụng để quản lý các partition của ổ cứng. Với fdisk thì có thể tạo và xoá các phân vùng ổ đĩa, cũng như check được thông tin các partition.

Ở bài này, sẽ giải thích về cách tạo partition trên extended hard-disk. Ngoài ra, cũng sẽ chỉ ra cách check device name của hard-disk và cách kiểm tra thông tin partition.

1. Format của lệnh fdisk

Lệnh fdisk có thể sử dụng để tạo và xoá các partition của hard-disk hoặc là check thông tin partition của ổ cứng.

Format của fdisk
fdisk [option] [device file]

Các option thường dùng
-l (chữ nhỏ của L) liệt kê danh sách partition table của device được chỉ định. Nếu không chỉ định device nào thì các partition (nếu có) trong /proc/partitions sẽ được liệt kê.

Nếu run fdisk và gắn thêm option -l thì sẽ confirm được thông tin các partition. Nếu chỉ định device name mà ko kèm option -l thì màn hình sẽ được switch sang màn hình menu dành cho việc khởi tạo partition.
Device file sẽ nằm ở dưới thư mục /dev. Tên device của extended hard-disk thì có thể confirm bằng cách run fdisk với option -l, hoặc check với lệnh dmesg, nếu là IDE disk thì có device name là dev/hd[a-h], nếu là disk SCSI, SATA disk thì sẽ có device name là /dev/sd[a-p]

2. Check device name của extended hard-disk

Để tạo partition khi run lệnh fdisk cần phải pass vào device name của extended hard-disk

Run fdisk với option -l sẽ hiển thị thông tin partion của hard-disk mà system đang nhận biết được.
Nếu check cấu trúc của hard-disk trước khi được mở rộng thì sẽ dễ phân biệt được phần extend thêm vào sau này.

# fdisk -l

Disk /dev/sda: 8589 MB, 8589934592 bytes   ←device name của disk1 là /dev/sda
255 heads, 63 sectors/track, 1044 cylinders
Units = số vòng quay 16065 * 512 = 8225280 bytes

Device Boot Start End Blocks Id System
/dev/sda1 * 1 13 104391 83 Linux
/dev/sda2 14 1044 8281507+ 8e Linux LVM

Disk /dev/sdb: 5368 MB, 5368709120 bytes   ←device name của disk2 là /dev/sdb
255 heads, 63 sectors/track, 652 cylinders
Units = số vòng quay 16065 * 512 = 8225280 bytes

Disk /dev/sdb doesn’t contain a valid partition table

Từ kết quả của lệnh fdisk sẽ biết được device name của các hard-disk đang được kết nối là /dev/sda và /dev/sdb
Trước khi run lệnh này, đang thêm vào 5GB ổ cứng. Từ size sẽ biết được tên của thiết bị của extended hard-disk.
Nếu thông tin partition không có gì thì cũng sẽ biết được hard-disk đã được add thêm vào.
Thực tế là khi tạo partition thì cần phải có device name.

Sử dụng fdisk -l trường hợp không thể hiển thị được gì.
Nếu dùng fdisk -l mà không hiển thị được gì thì cũng có thể dùng dmesg, cũng là 1 command dùng để check info.

# dmesg | grep hd
ide0: BM-DMA at 0x10c0-0x10c7, BIOS settings: hda:pio, hdb:pio
ide1: BM-DMA at 0x10c8-0x10cf, BIOS settings: hdc:DMA, hdd:pio
hdc: VMware Virtual IDE CDROM Drive, ATAPI CD/DVD-ROM drive
SCSI device sda: 16777216 512-byte hdwr sectors (8590 MB)   ←device name = sda
SCSI device sda: 16777216 512-byte hdwr sectors (8590 MB)   ←device name = sda
SCSI device sdb: 10485760 512-byte hdwr sectors (5369 MB)   ←device name = sdb, size ~ 5GB
SCSI device sdb: 10485760 512-byte hdwr sectors (5369 MB)   ←device name = sdb, size ~ 5GB
hdc: ATAPI 1X DVD-ROM DVD-R-RAM CD-R/RW drive, 32kB Cache, UDMA(33)
hdc: drive_cmd: status=0x51 { DriveReady SeekComplete Error }
hdc: drive_cmd: error=0x04 { AbortedCommand }

Hiện tại, tên thiết bị đang được sử dụng thì nếu dùng lệnh df có thể hiển thị được. Cái mà chưa sử dụng là tên device của hard disk đã add thêm

# df
Filesystem 1K-block use can user use% vị trí mount
/dev/mapper/VolGroup00-LogVol00
5967432 4154316 1505152 74% /
/dev/sda1 101086 12279 83588 13% /boot
↑ Hiện tại tên device của ổ cứng đang được dùng là /dev/sda (hiển thị số đại diện cho partition)
tmpfs 517552 0 517552 0% /dev/shm

3. Thông tin partition của hard disk

Run fdisk -l và pass vào thông tin device name

# fdisk -l /dev/sda

Disk /dev/sda: 8589 MB, 8589934592 bytes ← size ổ cứng của sda
255 heads, 63 sectors/track, 1044 cylinders Units = số vòng quay of 16065 * 512 = 8225280 bytes
↑ Header, number of sectors per track, number of cylinders

Disk Boot Start End Blocks Id System
/dev/sda1 * 1 13 104391 83 Linux ← Partition 1
/dev/sda2 14 1044 8281507+ 8e Linux LVM ← Partition 2
Từ kết quả của command có thể biết được size ổ cứng của /dev/sda
Ngoài ra còn biết được header, number of sectors per track, number of cylinders

Mỗi partition thì sẽ tương ứng 1 tên thiết bị (device name). Trường hợp này, device name của partition 1 là /dev/sda1, device name của partition 2 là /dev/sda2

Tham khảo nguồn

Linux – quản lý ổ đĩa 

Ở bài này sẽ mô tả về sử dụng hard disk trên Linux

Partition là gì?

Có thể chia ổ cứng (hard disk) ra thành nhiều các phân vùng logic (partition) và mỗi partition đó sẽ được sử dụng như 1 hard disk.
Nếu phân chia partition theo mục đích chẳng hạn như tách partition chuyên dụng cho data, partition chuyên dụng cho system…thì sẽ có nhiều lợi điểm khác nhau như việc backup và update system sẽ trở nên dễ dàng hơn, thậm chí khi data bị overflow thì cũng không dẫn đến kết nối hệ thống bị đình chỉ, hoặc có thể cứu được data trong trường hợp hệ thống bị crash…
Điểm bất lợi là việc phải tính toán trước khả năng disk (kích thước) cho cấu trúc hệ thống thì khá là phức tạp và cả việc cập nhật sau đó cũng là vấn đề khó khăn.
Trên Linux để tạo các partition trên ổ cứng thì có thể sử dụng lệnh fdisk

File system là gì?

File system là cơ chế để quản lý các thuộc tính dữ liệu như file name, date update… được lưu trữ trong vùng nhớ của ổ cứng.
File system có nhiều loại khác nhau, chẳng hạn ở Windows thì có định dạng FAT32 và NTFS, trên Linux thì có ext2, ext3, gần đây thì có ext4, trên CD thì có iso9660 và rất nhiều loại định dạng dữ liệu khác nữa.
Tuỳ thuộc vào file hệ thống được sử dụng mà kích thước tối đa của 1 file, số ký tự tên file, hiệu quả truy cập, security, file compression… có rất nhiều chức năng khác nhau nhưng khi sử dụng hard disk thì tối thiểu trên partition cần thiết phải tạo các file hệ thống.
Ở Linux, để tạo các file hệ thống trên partition thì có thể dùng command mkfs

Mount là gì?

Cấu trúc của directory trong Linux được gọi là /root directory tương tự như cấu trúc tree bắt đầu từ trên top(root) của directory. Khi thiết bị lưu trữ kết nối với máy tính thì chúng ta sẽ làm cho thiết bị lưu trữ này thực hiện chức năng như 1 directory nằm trên cấu trúc tree của directory hệ thống.
Mount tức là việc thiết bị lưu trữ kết nối với máy đăng ký truy cập vào 1 điểm trên cấu trúc tree directory này.
Để mount file system thì sử dụng command mount

***Note
Khi mount disk vào bên trong directory đã có content thì content cũng sẽ bị replace cho dù directory đã được mount vào là /directory, lúc này thì sẽ không thể đọc hoặc ghi nội dung bên trong directory trước đó được nữa.

***Note
Về cấu trúc directory của Linux

Cấu trúc directory của Linux được tạo ra theo chuẩn được gọi là FHS(Filesystem Hierarchy Standard), cấu trúc này được mô tả như dưới đây.

Root directory

Ở directory nào đặt vào những file như thế nào để chuẩn hoá, rất nhiều các bản phân phối mà file đã được sắp xếp sẵn theo chuẩn.
Để biết được với mỗi directory thì sẽ đặt những file như thế nào thì có thể xem mô tả dưới đây.

/usr các loại file mà user install độc lập /có 1 cấu trúc tương tự trực tiếp bên dưới
/bin các chương trình của general user
/boot các file liên quan đến khởi động hệ thống
/dev directory, device file
/etc file setting
/lib các library common được sử dụng bởi nhiều chương trình trong hệ thống
/var các data thay đổi thường xuyên (log, db, web …)
/sbin chương trình quản lý system
/tmp file tạm

Tham khảo nguồn

Linux – quyền truy cập default – umask

Khi tạo mới 1 thư mục hoặc 1 file thì có lẽ mọi quyền truy cập sẽ là như nhau. umask là 1 cơ chế để thiết lập quyền truy cập file default cho file và thư mục.

1. Check giá trị umask

Sau khi đã hoàn tất login vào OS thì umask đã được thiết lập sẵn. Bởi vì trong file /etc/bashrc (là file được execute khi login vào OS) đã có 1 descriptor dùng để assign giá trị umask cho user.
Để check giá trị umask hiện tại có thể run command umask mà không cần chỉ định option

$ umask
0002
Giá trị umask hiện tại đang là 0002 (ý nghĩa của giá trị này sẽ giải thích sau)

Nếu chỉ định option「-S」thì có thể confirm được quyền truy cập default của thư mục dưới dạng symbol mode

$ umask -S
u=rwx,g=rwx,o=rx
***Note

Đối với từng account thì giá trị umask sẽ được thiết lập.

2. Setting umask

Để setting umask thì ở lệnh umask sẽ viết giá trị umask và run

vd: Trong trường hợp set giá trị umask thành 0022
$ umask
0002 ← giá trị hiện tại 0002

$ umask 0022 ← set umaskt thành 0022

$ umask
0022 ← giá trị umask bây giờ là 0022

3. Cách tính umask

Dựa theo option mà cách thức tính giá trị umask sẽ được giải thích ở phần này.
Đối với file và folder thì cách tính toán sẽ khác nhau nhưng xác định được bạn muốn quyền truy cập default sẽ như thế nào thì có thể setting được.

Bạn có thể tính umask value bằng cách trừ đi giá trị quyền truy cập default từ 666 (đối với file) và 777 (đối với thư mục) (Giá trị umask có 1 số ngoại lệ nên hãy tham khảo table thêm. Không thể assign được phân quyền cho giá trị inital của file.)

Trường hợp muốn set giá trị access default của file và thư mục là 755 thì làm như sau:

777-755=022

umask 022 hoặc umask 0022 thì phần numeric có thể được set trong 4 ký tự. Có thể set default quyền access của thư mục là 755

4. Bảng cheat umask

Đối với giá trị umask đã chỉ định, thì dưới đây là bảng so sánh giữa quyền truy cập của file và thư mục

umask value default access of directory default access of file
0 rwx rw-
1 rw- rw-
2 r-x r–
3 r– r–
4 -wx -w-
5 -w- -w-
6 –x —
7 — —

5. Chỉ định symbol mode cho umask

Có thể execute giá trị umask theo symbol mode dưới đây. Cũng giống như symbol mode của chmod

umask u=rwx,g=rwx,o=rx
memo

※ Phần execute authority của file được tạo sẽ bị ignored.

Các sample sử dụng
$ umask -S
u=rwx,g=rwx,o=rx  ← Phần Other ko set phân quyền cho quyền write

$ umask u=rwx,g=rwx,o=rwx ← Phần Other không được chỉ định rwx

$ umask -S
u=rwx,g=rwx,o=rwx  ← Phần Other đã trở thành rwx

$ mkdir dir
$ ls -l
drwxrwxrwx 2 user1 user1 4096 7月 30 09:21 dir ← Default quyền truy cập ở phần Other của directory trở thành rwx
$ umask u=rwx,g=rwx,o=rx  ← Phần Other thì w đã bị remove

$ umask -S
u=rwx,g=rwx,o=rx

$ umask
0002

$ mkdir dir2
$ ls -l
drwxrwxr-x 2 user1 user1 4096 7月 30 09:21 dir2 ← Phần Other thì w đã bị remove
symbol mode của umask hay cũng giống như symbol mode của chmod thì có thể thêm hoặc xoá bớt ký tự

$ umask -S
u=rwx,g=rwx,o=rx

$ umask o+w  ← Phần Other thì w (quyền write) được thêm vào

$ umask -S
u=rwx,g=rwx,o=rwx ← Phần Other thì w (quyền write) được thêm vào

Tham khảo 

Linux – Sticky Bit – truy cập đặc biệt

Sticky Bit tức là quyền truy cập đặc biệt ở Linux. Ở bài này sẽ hướng dẫn về Sticky Bit

1. Sticky Bit là gì?

Sticky Bit là việc thưc mục được thiết lập quyền truy cập đặc biệt.
Directory được thiết lập Sticky Bit thì tất cả các user có thể write nhưng chỉ có owner (ngoại trừ root) mới được xoá.
Thư mục /tmp được thiết lập Sticky Bit.

2. Check Sticky Bit setting

Check Sticky Bit có đang được thiết lập hay không?
# ls -ld /tmp/
drwxrwxrwt 7 root root 4096 7月 29 04:02 /tmp/

Đối với account khác thì ở phần quyền execute sẽ là 「t」. Khi thiết lập Sticky Bit cho thư mục thì quyền execute sẽ hiển thị là 「t」

3. Thiết lập Sticky Bit

Dùng command chmod để setting Sticky Bit

Setting với Symbol mode
Để set Sticky Bit với symbol mode thì dùng command chmod và set authority cho Other là t

chmod o+t dir

Setting với Numeric mode
Để set Sticky Bit với numeric mode thì dùng thêm vào giá trị 1000 cho quyền truy cập

chmod 1777 dir
Thử confirm lại permission của thư mục trên

# ls -ld dir
drwxrwxrwt 2 root root 4096 7月 29 08:41 dir
Phần Other sẽ hiển thị quyền truy cập tương ứng với t, Sticky Bit đã được set

Linux – SGID (Set Group ID) – Quyền truy cập đặc biệt

SGID (Set Group ID) – Quyền truy cập đặc biệt
Trong linux bên cạnh SUID (Set User ID) thì còn có 1 quyền truy cập đặc biệt được gọi là SGID (Set Group ID) . Ở bài này sẽ giải thích về SGID (Set Group ID)

1. SGID (Set Group ID) là gì?

SGID (Set Group ID) nghĩa là quyền truy cập đặc biệt vào 1 file và có khả năng thực thi. Khách với SUID thì SGID có thể được thiết lập cho thư mục.

Trường hợp setting SGID (Set Group ID) cho file thực thi thì khi execute file đó file sẽ được thực thi dưới quyền của group owner.
Trường hợp setting SGID (Set Group ID) cho thư mục thì group owner của những file và thư mục con của thư mục đó sẽ trở thành group owner của thư mục mà được thiết lập SGID (Set Group ID)

2. Setting SGID (Set Group ID) như thế nào?

Để thiết lập SGID (Set Group ID) thì sẽ thực hiện command chmod như dưới đây:

chmod g+s file
Trong trường hợp setting quyền truy cập ở numberic mode thì add thêm vào 2000 cho giá trị số. Chẳng hạn muốn set SGID (Set Group ID) cho 1 file thực thi có quyền truy cập là 755 thì giá trị sẽ trở thành 2775

chmod 2755 file

***Note
Khi thiết lập SGID(Set Group ID) cho thư mục thì option cũng tương tự

3. Check SGID(Set Group ID)

Để confirm lại SGID (Set Group ID) thì có thể dùng lệnh「ls -l」

# touch file
# chmod 2755 file
# ls -l file
-rwxr-sr-x 1 root group2 0 7月 26 08:24 file
Phần permission của group là r-s. Phần quyền thực thi file thì thông thường là x nhưng ở đây là s nên mang ý nghĩa là SGID (Set Group ID) đang được thiết lập.

4. 1 số sample sử dụng
Trong thực tế, thiết lập SGID (Set Group ID) và check lại cách hoạt động. Test cả 2 trường hợp khi thiết lập file thực thi lẫn directory.

Khi set file thực thi, sử dụng root

# id
uid=0(root) gid=0(root) 所属グループ=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel)

# cp /bin/touch .  ← copy lệnh touch
# chgrp group1 touch  ← set group là group1
# chmod g+s touch  ← set SGID
# ls -l touch
-rwxr-sr-x 1 root group1 42284 7月 26 08:28 touch ← SGID được thiết lập

# ./touch test.txt

# ls -l test.txt
-rw-r–r– 1 root group1 0 7月 26 08:30 test.txt ← group owner đã trở thành group1
***Note
Bởi vì chúng ta thực thi command ở root account nên tuỳ theo command mà group của file được tạo ra sẽ là root.
Để thiết lập SGID cho command touch, command được thực thi bởi quyền root:group1và group của file được tạo ra sẽ là group1.

Khi thiết lập với directory
Trường hợp set SGID với directory thì các sub file/directory sẽ được set với group owner của directory đã được set SGID.

# mkdir dir ← Tạo thư mục
# chgrp group1 dir ← Set group 1 cho group owner
# chmod g+s dir ← Set SGID

# ls -ld dir
drwxr-sr-x 2 root group1 4096 7月 26 08:33 dir  ← group trở thành group 1 của directory đã được set SGID

# touch dir/test.txt  ← dùng root account, tạo sub file cho thư mục dir
# mkdir dir/test_dir  ← dùng root account, tạo sub directory cho thư mục dir
# ls -l dir
合計 12
-rw-r–r– 1 root group1 0 7月 26 08:33 test.txt  ← group trở thành group1
drwxr-sr-x 2 root group1 4096 7月 26 08:34 test_dir  ← group trở thành group1
***Note
Khi tạo sub directory cho directory được set SGID thì sub directory cũng sẽ được set SGID. Có vẻ là có vấn đề về security nên cần chú ý sử dụng thích hợp.