int main(void) {
const char *msg = "Direct syscall!\n";
// เรียก syscall หมายเลข __NR_write (=1) โดยตรง
syscall(SYS_write, 1, msg, strlen(msg));
return 0;
}
```
การเรียก System Call โดยตรงโดยไม่ผ่าน glibc ทำได้ด้วย `syscall()` wrapper
---
## 2.2.4 GNU Coreutils / Userland
**Userland** = ชุดเครื่องมือและไลบรารีใน User Space ที่ประกอบเป็น "ประสบการณ์" ของ Linux distribution
**GNU Coreutils** คือชุดคำสั่งพื้นฐานที่ขาดไม่ได้:
- **File**: `ls`, `cp`, `mv`, `rm`, `ln`, `chmod`, `chown`
- **Text**: `cat`, `cut`, `head`, `tail`, `sort`, `uniq`, `wc`
- **Shell**: `echo`, `env`, `pwd`, `test`, `printf`, `date`
---
## ทางเลือกอื่นของ Userland
บางดิสทริบิวชันเลือกใช้ userland ที่ไม่ใช่ GNU:
**Alpine Linux** ใช้:
- **BusyBox**: รวมคำสั่งหลายสิบตัวในไบนารีเดียว ขนาดเล็กมาก
- **musl libc**: แทน glibc
เหมาะกับ container และ embedded system เพราะขนาดเล็กและกินทรัพยากรน้อย
---
## 2.2.5 Shell และ Application Layer
**Shell** เป็นทั้ง Command Interpreter และภาษาโปรแกรม ทำหน้าที่เป็นสะพานระหว่างผู้ใช้กับ Kernel
---
## ชั้นของการทำงานบน Linux
1. **Kernel**: จัดการทรัพยากร ฮาร์ดแวร์
2. **System Library (glibc)**: wrapper ของ syscall
3. **System Daemon**: systemd, sshd, cron, NetworkManager
4. **Shell**: bash, zsh, fish
5. **Coreutils + CLI Tools**: ls, cp, grep, sed
6. **TUI/GUI**: nvim, htop, GNOME, KDE
7. **Applications**: Firefox, VS Code, Blender
---
## 2.2.6 Device File และ Pseudo FS
Linux ใช้ **Virtual File System (VFS)** เพื่อให้ทุกอย่างดูเป็นไฟล์
Pseudo file system ที่สำคัญ:
- **`/dev`**: ไฟล์ device จัดการโดย `udev` หรือ `systemd-udevd`
- **`/proc`**: ไฟล์จำลองสถานะ kernel และ process
- **`/sys`**: sysfs สะท้อนโครงสร้าง device และ kernel object
---
## ตัวอย่างการใช้ /dev
```bash
# ดูดิสก์บล็อก
ls -l /dev/sd* # /dev/sda, /dev/sdb
ls -l /dev/nvme* # /dev/nvme0n1
# ไฟล์พิเศษ
ls -l /dev/null /dev/zero /dev/urandom /dev/tty
# ส่งข้อความไปหา terminal อื่น
# สมมติปลายทางเป็น /dev/pts/1
echo "สวัสดีอาจารย์ Moo!" | sudo tee /dev/pts/1
```
---
## ตัวอย่างการใช้ /proc
```bash
# CPU info
cat /proc/cpuinfo | grep "model name" | head -1
# หน่วยความจำ
cat /proc/meminfo | head -5
# uptime (วินาทีที่เปิดเครื่อง / idle time)
cat /proc/uptime
# kernel version
cat /proc/version
# process แต่ละตัวมี directory ชื่อเป็น PID
ls /proc/$$/ # ข้อมูลของ shell ตัวปัจจุบัน
```
---
## ตัวอย่างการใช้ /sys
```bash
# ตรวจระดับแบตเตอรี่ (สำหรับ Laptop)
cat /sys/class/power_supply/BAT0/capacity
cat /sys/class/power_supply/BAT0/status
# MAC address ของ Network interface
cat /sys/class/net/eth0/address 2>/dev/null || \
cat /sys/class/net/wlan0/address
# CPU frequency ปัจจุบัน
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq
```
---
# 2.3 Linux Distribution
---
## Linux Distribution คืออะไร
**Linux Distribution (Distro)** คือการนำ **Linux Kernel** มารวมเข้ากับ:
- userland (GNU coreutils หรืออื่น ๆ)
- libraries
- package manager
- init system
- desktop environment
- configuration
เพื่อสร้างเป็นระบบปฏิบัติการที่ใช้งานได้จริง
แต่ละ distro มี "ตัวตน" (identity) ที่ต่างกันทั้งปรัชญา กลุ่มเป้าหมาย และ release cycle
---
## 2.3.1 Debian-based
**Debian** ก่อตั้งโดย **Ian Murdock** ในปี **ค.ศ. 1993**
ชื่อมาจากการผสมชื่อของ Ian และภรรยา "**Deb**ra"
- ขึ้นชื่อเรื่องความเสถียร (stable branch มี release cycle 2 ปี)
- ใช้ **`dpkg`** + **`apt`** เป็น package manager
- คลัง Debian main มีกว่า **60,000 แพ็กเกจ**
---
## ตระกูล Debian
- **Ubuntu** (2004) โดย **Canonical** สร้างบน Debian testing
- release ทุก 6 เดือน + **LTS** ทุก 2 ปี สนับสนุน 5 ปี
- **Linux Mint** สร้างบน Ubuntu LTS เพิ่ม Cinnamon/MATE/Xfce
- **Pop!_OS** โดย System76 เน้น developer และ gaming
- **MX Linux** สร้างบน Debian stable เน้นความเบา
---
## 2.3.2 Red Hat-based
**Red Hat Enterprise Linux (RHEL)** เป็นดิสทริบิวชันเชิงพาณิชย์ของ **Red Hat** (ปัจจุบันเป็นของ IBM)
- ใช้ package manager **`rpm`** + **`dnf`** (เดิมคือ `yum`)
- กลุ่มผู้ใช้หลัก: องค์กรขนาดใหญ่และ data center
---
## ตระกูล Red Hat
- **Fedora**: upstream ทดลองของ RHEL ปล่อยทุก 6 เดือน ทันสมัยที่สุด
- **CentOS Stream**: rolling release กึ่งกลางระหว่าง Fedora กับ RHEL
- **Rocky Linux** (2021) และ **AlmaLinux** (2021): เกิดหลังจาก CentOS 8 เปลี่ยนเป็น Stream
Rocky/Alma เป็น **1:1 binary-compatible** กับ RHEL เพื่อแทนที่ CentOS Linux รุ่นเดิม
---
## 2.3.3 Arch-based
**Arch Linux** ยึดหลัก **KISS (Keep It Simple, Stupid)**
- ติดตั้งแบบ minimal แล้วให้ผู้ใช้ประกอบเอง
- ใช้ package manager **`pacman`**
- มี **AUR (Arch User Repository)** สคริปต์สร้างแพ็กเกจหลักแสนรายการ
- **Rolling Release**: อัปเดตต่อเนื่อง ไม่มีเลขเวอร์ชัน
- **ArchWiki**: เอกสารอ้างอิงที่ดีที่สุดตัวหนึ่งในวงการ
---
## Distro ในตระกูล Arch
- **Manjaro**: รวม installer ง่าย ชะลอแพ็กเกจจาก Arch 1-2 สัปดาห์เพื่อทดสอบ
- **EndeavourOS**: ใกล้เคียง Arch แท้แต่มี installer และ welcome app
- **CachyOS**: optimize compiler flags สำหรับ x86_64-v3/v4, ใช้ scheduler พิเศษ (BORE, sched-ext) เน้น performance
CachyOS เป็น Arch-based ที่ compile ด้วย `-march=x86-64-v3` เพื่อรีดประสิทธิภาพจาก CPU ใหม่ ๆ
---
## 2.3.4 SUSE-based
**SUSE Linux Enterprise Server (SLES)** คู่แข่ง RHEL ในยุโรป
มีชื่อเสียงเรื่องเครื่องมือ **YaST** (Yet another Setup Tool) ที่ครอบคลุม
- **openSUSE Leap**: เทียบเท่า SLES ในรูปแบบชุมชน point release
- **openSUSE Tumbleweed**: rolling release ที่ทดสอบด้วย **openQA** อย่างหนัก
- **MicroOS / Aeon / Kalpa**: immutable distro สมัยใหม่ของ SUSE
---
## 2.3.5 Independent Distros
**Gentoo**: ใช้ **Portage** ที่ compile จาก source code ผู้ใช้กำหนด **USE flags** ได้
**Void Linux**: ใช้ **XBPS** และ **runit** เป็น init (ไม่ใช่ systemd) มี musl edition
**Alpine Linux**: เบามาก (ISO ~150MB) ใช้ **musl + BusyBox + OpenRC** เหมาะกับ container
**NixOS**: ใช้ **Nix Package Manager** จัดการ dependency แบบ functional ได้ **Reproducible Build**
**Slackware**: distro ที่เก่าแก่ที่สุดที่ยังอยู่ (ตั้งแต่ ค.ศ. 1993)
---
## 2.3.6 Specialized Distros
- **Kali Linux** / **Parrot OS**: รวมเครื่องมือ penetration testing (nmap, metasploit, burpsuite)
- **Proxmox VE**: Debian-based + KVM + LXC + Web UI สำหรับ virtualization
- **OpenWrt**: สำหรับ router/embedded network device (ARM, MIPS)
- **Raspberry Pi OS**: Debian-based ปรับ kernel สำหรับ ARM
- **SteamOS**: Arch-based สำหรับ Steam Deck
---
## 2.3.7 Rolling vs Fixed vs LTS
| ลักษณะ | Rolling | Point | LTS |
| --- | --- | --- | --- |
| **ตัวอย่าง** | Arch, Tumbleweed | Fedora, Ubuntu | RHEL, Ubuntu LTS |
| **รอบปล่อย** | ต่อเนื่อง | 6-12 เดือน | 2-5 ปี |
| **ความใหม่** | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐ |
| **ความเสถียร** | ⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ |
| **เสี่ยง update พัง** | ปานกลาง | ต่ำ | ต่ำมาก |
| **เหมาะกับ** | Desktop, Dev | Desktop, Dev | Server, Prod |
---
## 2.3.8 เกณฑ์การเลือก Distribution
- **Server/Production**: Debian, Ubuntu LTS, RHEL, Rocky, AlmaLinux
- **Desktop ทั่วไป**: Ubuntu, Fedora, Linux Mint, Pop!_OS
- **Developer Desktop**: Arch, Fedora, openSUSE Tumbleweed, CachyOS
- **Embedded/IoT**: Alpine, Yocto, Buildroot, OpenWrt
- **Container Base**: Alpine, Debian-slim, Ubuntu, distroless
- **Security/Pentest**: Kali, Parrot
- **Virtualization Host**: Proxmox, TrueNAS SCALE, Debian + KVM
---
# 2.4 Filesystem Hierarchy Standard
---
## FHS คืออะไร
**Filesystem Hierarchy Standard (FHS)** คือข้อกำหนดที่บอกว่า **ไฟล์ประเภทใดควรอยู่ที่ไหน** ในระบบ Unix-like
- ดูแลโดย **Linux Foundation**
- ปัจจุบันเป็นเวอร์ชัน **3.0**
FHS ทำให้ผู้ใช้และนักพัฒนาสามารถคาดเดาได้ว่าควรไปค้นหาไฟล์ที่ใด ไม่ว่าจะใช้ distro ใดก็ตาม
---
## แผนภาพ FHS
%%{init: {'theme':'base','themeVariables':{'primaryColor':'#3c3836','primaryTextColor':'#ebdbb2','primaryBorderColor':'#fabd2f','lineColor':'#d79921','secondaryColor':'#504945','tertiaryColor':'#282828','background':'#282828','clusterBkg':'#32302f','clusterBorder':'#928374'}}}%%
flowchart TB
ROOT["/ (Root)"]
subgraph L1["ไบนารีและไลบรารี"]
BIN["/bin"]
SBIN["/sbin"]
USR["/usr"]
OPT["/opt"]
end
subgraph L2["ตั้งค่าและข้อมูลแปรผัน"]
ETC["/etc"]
VAR["/var"]
TMP["/tmp"]
end
subgraph L3["ผู้ใช้"]
HOME["/home"]
ROOTD["/root"]
end
subgraph L4["Virtual FS"]
PROC["/proc"]
SYS["/sys"]
DEV["/dev"]
end
ROOT --> L1
ROOT --> L2
ROOT --> L3
ROOT --> L4
---
## 2.4.1 /, /bin, /sbin, /usr, /opt
- **`/`** — Root filesystem ต้นรากของทุกสิ่ง (ต่างจาก `/root` ที่เป็น home ของ root)
- **`/bin`** — binary จำเป็นสำหรับโหมด single-user เช่น `ls`, `cp`, `mv`, `bash`
- **`/sbin`** — binary สำหรับ admin เช่น `fdisk`, `mkfs`, `reboot`, `iptables`
- **`/opt`** — third-party self-contained เช่น `/opt/google/chrome`, `/opt/zoom`
---
## /usr และโครงสร้างย่อย
- **`/usr`** — "User System Resources" เก็บโปรแกรมและไลบรารีส่วนใหญ่
- `/usr/bin`: binary ทั่วไป เช่น `python3`, `gcc`, `vim`
- `/usr/sbin`: binary ระบบที่ไม่จำเป็นสำหรับ boot
- `/usr/lib`, `/usr/lib64`: library
- `/usr/share`: ข้อมูลไม่ขึ้นกับสถาปัตยกรรม (man, icon, locale)
- `/usr/include`: C header files
- **`/usr/local`** — สำหรับโปรแกรมที่ admin ติดตั้งเองจาก source
---
## /usr Merge
Distro สมัยใหม่หลายตัวทำ **`/usr` merge**:
- `/bin` → symlink ไปยัง `/usr/bin`
- `/sbin` → `/usr/sbin`
- `/lib` → `/usr/lib`
เพื่อให้จัดการง่ายขึ้น
Distro ที่ทำ `/usr` merge: Fedora, Arch, Ubuntu รุ่นใหม่ ๆ
---
## 2.4.2 /etc — Configuration
| ไฟล์ | หน้าที่ |
| --- | --- |
| `/etc/passwd` | ข้อมูลผู้ใช้ |
| `/etc/shadow` | password hash |
| `/etc/group` | ข้อมูล group |
| `/etc/sudoers` | การกำหนดสิทธิ์ sudo |
| `/etc/hostname` | ชื่อเครื่อง |
| `/etc/hosts` | static DNS mapping |
| `/etc/resolv.conf` | DNS server |
| `/etc/fstab` | การ mount อัตโนมัติ |
| `/etc/crontab` | task scheduler |
---
## /var และ /tmp
- **`/var`** — "Variable" ข้อมูลที่เปลี่ยนแปลงตลอด
- `/var/log`: log ของระบบและบริการ
- `/var/cache`: cache ของ package manager, DNS, font
- `/var/lib`: สถานะของบริการ (database, package db, docker)
- `/var/spool`: mail queue, print queue, cron
- `/var/www`: เว็บไซต์ (default Nginx/Apache)
- `/var/tmp`: temporary file ที่คงอยู่ข้าม reboot
- **`/tmp`** — temporary ถูกล้างเมื่อ reboot (มัก mount เป็น `tmpfs` ใน RAM)
---
## 2.4.3 /home, /root
- **`/home`** — home directory ของผู้ใช้ทั่วไป
- เช่น `/home/moo`, `/home/alice`
- **`/root`** — home ของ **root user**
- ไม่ได้อยู่ใน `/home`
- เพื่อให้สามารถ login ได้แม้ `/home` ไม่ถูก mount
---
## 2.4.4 /proc, /sys, /dev, /run
- **`/proc`** — procfs ข้อมูล process และ kernel
- **`/sys`** — sysfs ข้อมูล device และ kernel subsystem
- **`/dev`** — device nodes
- **`/run`** — runtime data (PID files, sockets) mount เป็น tmpfs ล้างตอน reboot
---
## 2.4.5 /boot, /mnt, /media, /srv
- **`/boot`** — ไฟล์ที่จำเป็นในขั้นตอน boot
- `vmlinuz-*` (kernel), `initramfs-*.img`
- GRUB config (`/boot/grub/grub.cfg`)
- UEFI: `/boot/efi` (EFI System Partition)
- **`/mnt`** — จุด mount **ชั่วคราว** โดย admin
- **`/media`** — จุด mount **อัตโนมัติ** ของสื่อถอดได้ (USB, CD)
- เช่น `/media/username/LABEL`
- **`/srv`** — "Service data" ข้อมูลที่ให้บริการผ่านเครือข่าย
---
## ตัวอย่างสำรวจ FHS
```bash
# ดูขนาดของแต่ละ top-level directory
sudo du -sh /* 2>/dev/null | sort -h | tail -15
# ดูไฟล์ใน /etc ที่ถูกแก้ไขล่าสุด 7 วัน
find /etc -type f -mtime -7 2>/dev/null | head -20
# ดู log ล่าสุด
sudo tail -n 20 /var/log/syslog 2>/dev/null || \
sudo journalctl -n 20
# ดู device node ที่เป็น disk
ls -l /dev/ | grep -E '^b' # b = block device
```
---
# 2.5 Init System และการจัดการบริการ
---
## Init System คืออะไร
**Init System** คือโปรเซสแรกที่ Kernel รันขึ้นมา (มี **PID 1**)
ทำหน้าที่:
- เป็น "พ่อของทุกโปรเซส" บน Linux
- รับผิดชอบการเริ่ม/หยุดบริการ (service / daemon)
- จัดการเมื่อเครื่องเปิด/ปิด
Init System เป็นหัวใจสำคัญที่ทำให้ระบบเริ่มต้นทำงานได้อย่างเป็นระเบียบ
---
## ลำดับการ Boot
%%{init: {'theme':'base','themeVariables':{'primaryColor':'#3c3836','primaryTextColor':'#ebdbb2','primaryBorderColor':'#fabd2f','lineColor':'#d79921','secondaryColor':'#504945','tertiaryColor':'#282828','background':'#282828'}}}%%
flowchart TB
POWER["เปิดเครื่อง
(Power On)"] --> FW["BIOS / UEFI
(Firmware)"]
FW --> BL["Bootloader
(GRUB, systemd-boot)"]
BL --> KERN["Linux Kernel
+ initramfs"]
KERN --> INIT["PID 1
(Init System)"]
INIT --> SVC["Services
(sshd, NetworkManager)"]
SVC --> LOGIN["Login
(getty / display manager)"]
---
## 2.5.1 SysVinit
**SysVinit** เป็นระบบ init แบบดั้งเดิม ใช้แนวคิด **Runlevel**
| Runlevel | ความหมาย |
| --- | --- |
| 0 | Halt (ปิดเครื่อง) |
| 1 / S | Single user mode (rescue) |
| 2 | Multi-user ไม่มี network |
| 3 | Multi-user + network (CLI) |
| 4 | ไม่ใช้ (customizable) |
| 5 | Multi-user + network + GUI |
| 6 | Reboot |
---
## ปัญหาของ SysVinit
SysVinit ใช้ shell script ใน `/etc/init.d/` และ symlink ใน `/etc/rc[0-6].d/`
**ปัญหา**:
- Serial boot (ช้า ไม่ขนานกัน)
- ไม่รู้จัก dependency ระหว่างบริการ
- ยากต่อการติดตาม log
- ไม่รองรับ socket activation หรือ cgroup
---
## 2.5.2 systemd
**systemd** เปิดตัว **ค.ศ. 2010** โดย **Lennart Poettering** ที่ Red Hat
แก้ปัญหาของ SysVinit ทั้งหมด ปัจจุบันเป็น init system ของ distro ส่วนใหญ่ (Debian, Ubuntu, Fedora, Arch, openSUSE)
**แนวคิดหลัก: Unit** — ทุกสิ่งเป็น Unit ที่มีประเภทต่าง ๆ
---
## ประเภทของ systemd Unit
- **`.service`**: บริการ/daemon เช่น `sshd.service`
- **`.target`**: กลุ่มของ unit (คล้าย runlevel) เช่น `multi-user.target`
- **`.timer`**: scheduler แทน cron
- **`.socket`**: socket activation เปิดบริการเมื่อมี connection
- **`.mount`**, **`.automount`**: จัดการการ mount
- **`.path`**: ทริกเกอร์เมื่อไฟล์เปลี่ยน
- **`.device`**: device unit (สร้างอัตโนมัติจาก udev)
---
## systemctl: คำสั่งพื้นฐาน
```bash
# ดูสถานะระบบทั้งหมด
systemctl status
# ดู service ที่กำลังรันอยู่
systemctl list-units --type=service --state=running
# เริ่ม/หยุด/รีสตาร์ท service
sudo systemctl start sshd
sudo systemctl stop sshd
sudo systemctl restart sshd
sudo systemctl reload nginx # reload โดยไม่ restart
```
---
## systemctl: enable/disable
```bash
# เปิด/ปิดการ auto-start ตอน boot
sudo systemctl enable sshd
sudo systemctl disable sshd
# enable และ start พร้อมกัน
sudo systemctl enable --now sshd
# ดู target ปัจจุบัน (คล้าย runlevel)
systemctl get-default
# เปลี่ยน default target
sudo systemctl set-default multi-user.target
```
---
## journalctl: การดู log
```bash
# ดู log ของ service
sudo journalctl -u sshd -n 50 --no-pager
# ดู log แบบ tail -f
sudo journalctl -u sshd -f
# ดู log ตั้งแต่ boot นี้
sudo journalctl -b
# ตรวจสอบเวลา boot (ช่วยหา service ที่ช้า)
systemd-analyze
systemd-analyze blame | head -10
systemd-analyze critical-chain
```
---
## 2.5.3 Init Systems อื่น ๆ
distro บางตัวเลือกใช้ init ที่เบากว่า systemd:
| Init | Distro หลัก | จุดเด่น |
| --- | --- | --- |
| **OpenRC** | Gentoo, Alpine | Shell-based, เขียนง่าย |
| **runit** | Void, Artix | Minimal, supervise อัตโนมัติ |
| **s6** | advanced | Process supervisor |
| **dinit** | artix, exp | dependency-aware, lightweight |
| **SysVinit** | Devuan, Slackware | classic, simple |
---
## 2.5.4 systemd Service File (ตอนที่ 1)
ตัวอย่างสร้างบริการ "hello-moo" ที่รันสคริปต์ตอน boot
**ขั้นที่ 1**: สร้างสคริปต์ที่จะรัน
```bash
sudo tee /usr/local/bin/hello-moo.sh > /dev/null <<'EOF'
#!/bin/bash
while true; do
echo "[$(date '+%F %T')] Hello อาจารย์ Moo!" \
>> /var/log/hello-moo.log
sleep 30
done
EOF
sudo chmod +x /usr/local/bin/hello-moo.sh
```
---
## systemd Service File (ตอนที่ 2)
**ขั้นที่ 2**: สร้างไฟล์ unit
```ini
[Unit]
Description=Hello Moo Demo Service
After=network.target
[Service]
Type=simple
ExecStart=/usr/local/bin/hello-moo.sh
Restart=on-failure
RestartSec=5
User=nobody
Group=nogroup
ProtectSystem=strict
ProtectHome=true
NoNewPrivileges=true
ReadWritePaths=/var/log
[Install]
WantedBy=multi-user.target
```
---
## systemd Service File (ตอนที่ 3)
**ขั้นที่ 3**: โหลดและเปิดใช้งาน
```bash
# โหลด unit file ใหม่
sudo systemctl daemon-reload
# เปิดใช้งานและเริ่มทันที
sudo systemctl enable --now hello-moo.service
# ตรวจสถานะ
systemctl status hello-moo.service
# ดู log
sudo tail -f /var/log/hello-moo.log
```
---
## โครงสร้างของ Unit File
- **`[Unit]`**: metadata และ dependency (`After`, `Requires`, `Wants`)
- **`[Service]`**: วิธีรัน
- `Type=simple` (default), `forking`, `oneshot`, `notify`
- `ExecStart`: คำสั่งหลัก
- `Restart`: นโยบาย (`no`, `on-failure`, `always`)
- `User`, `Group`: สิทธิ์ที่ใช้รัน
- Hardening: `ProtectSystem`, `ProtectHome`, `NoNewPrivileges`
- **`[Install]`**: บอกว่า enable แล้วจะไป link ที่ target ใด
---
# 2.6 Package Management
---
## Package Manager คืออะไร
**Package Manager** คือหัวใจของ Linux distribution
แก้ปัญหาดั้งเดิมของการติดตั้งซอฟต์แวร์จาก source code:
- ต้อง compile เอง
- dependency พันกัน
ด้วยการจัดการเป็นชุด **Package** พร้อมทั้ง metadata, dependency graph, และ repository
---
## 2.6.1 Low-level vs High-level
การจัดการแพ็กเกจส่วนใหญ่แบ่งเป็น **2 ชั้น**:
- **Low-level**: ติดตั้งไฟล์แพ็กเกจเดี่ยว (`.deb`, `.rpm`) ไม่รู้จัก dependency
- **High-level**: จัดการ dependency อัตโนมัติ, ค้น repository, อัปเดต, ถอนการติดตั้ง
---
## แผนภาพ Package Manager
%%{init: {'theme':'base','themeVariables':{'primaryColor':'#3c3836','primaryTextColor':'#ebdbb2','primaryBorderColor':'#fabd2f','lineColor':'#d79921','secondaryColor':'#504945','tertiaryColor':'#282828','background':'#282828','clusterBkg':'#32302f'}}}%%
flowchart TB
subgraph HIGH["High-level"]
APT["apt (Debian/Ubuntu)"]
DNF["dnf (Fedora/RHEL)"]
ZYP["zypper (openSUSE)"]
PAC["pacman (Arch)"]
end
subgraph LOW["Low-level"]
DPKG["dpkg"]
RPM["rpm"]
end
APT --> DPKG
DNF --> RPM
ZYP --> RPM
PAC --> FILE["package file"]
DPKG --> FILE
RPM --> FILE
---
## 2.6.2 APT และ dpkg (Debian/Ubuntu)
**`dpkg`** เป็น low-level: ติดตั้ง/ถอน/สอบถามไฟล์ `.deb`
**`apt`** / **`apt-get`** เป็น high-level ที่ครอบ `dpkg`
```bash
# อัปเดตฐานข้อมูล repository
sudo apt update
# อัปเกรดแพ็กเกจทั้งหมด
sudo apt upgrade
sudo apt full-upgrade # อาจถอนแพ็กเกจเก่าที่ขัดแย้ง
# ติดตั้ง
sudo apt install nginx git curl
```
---
## APT: ถอนและค้นหา
```bash
# ถอน (คงไฟล์ config)
sudo apt remove nginx
# ถอนสมบูรณ์
sudo apt purge nginx
# ค้นหาแพ็กเกจ
apt search "neural network"
apt show python3-numpy
# ดูแพ็กเกจที่ติดตั้งไว้
dpkg -l | grep python
# ติดตั้งจากไฟล์ .deb ที่ download เอง
sudo dpkg -i ./pkg.deb
sudo apt -f install # แก้ dependency ที่ขาด
```
---
## 2.6.3 DNF และ RPM (Fedora/RHEL)
**`rpm`** เป็น low-level, **`dnf`** (Dandified YUM) เป็น high-level
```bash
# อัปเดตและอัปเกรด
sudo dnf check-update
sudo dnf upgrade
# ติดตั้ง / ถอน / ค้นหา
sudo dnf install nginx git curl
sudo dnf remove nginx
dnf search "machine learning"
dnf info python3-numpy
```
---
## RPM และ Group
```bash
# ดูแพ็กเกจที่ติดตั้ง
rpm -qa | grep python
# ไฟล์ในแพ็กเกจและย้อนกลับ
rpm -ql nginx
rpm -qf /usr/sbin/nginx
# Group (ติดตั้งกลุ่มแพ็กเกจ)
sudo dnf group install "Development Tools"
# ย้อนกลับ transaction
sudo dnf history
sudo dnf history undo 42
```
---
## 2.6.4 Pacman และ AUR (Arch)
**`pacman`** ใช้ format `.pkg.tar.zst` (tarball + zstd)
```bash
# Sync + อัปเกรดระบบ (rolling release ต้องทำพร้อมกันเสมอ!)
sudo pacman -Syu
# ติดตั้ง
sudo pacman -S nginx git curl
# ถอน (พร้อม dependency ที่ไม่มีใครใช้)
sudo pacman -Rns nginx
# ค้นหา
pacman -Ss neovim
pacman -Si python
```
---
## Pacman: Query
```bash
# แสดงที่ติดตั้ง
pacman -Q | wc -l # นับจำนวนแพ็กเกจ
pacman -Qe # explicit (สั่งติดตั้งเอง)
pacman -Qdt # orphan (ไม่มีใครใช้)
pacman -Qi nginx # ข้อมูลแพ็กเกจ
pacman -Ql nginx # ไฟล์ในแพ็กเกจ
pacman -Qo /usr/bin/ls # ไฟล์นี้มาจากแพ็กเกจไหน
# ล้าง cache
sudo pacman -Sc
```
---
## AUR (Arch User Repository)
**AUR** คือคลัง PKGBUILD ที่ชุมชนส่งมา ต้องใช้ **AUR helper** เช่น `yay`, `paru`
```bash
# ติดตั้ง yay ครั้งแรก
sudo pacman -S --needed base-devel git
git clone https://aur.archlinux.org/yay-bin.git
cd yay-bin && makepkg -si
# ติดตั้งจาก AUR
yay -S visual-studio-code-bin
# อัปเดตทั้ง official + AUR
yay -Syu
```
---
## 2.6.5 Package Manager อื่น ๆ
**Zypper** (openSUSE):
```bash
sudo zypper refresh
sudo zypper update
sudo zypper install nginx
zypper search nginx
```
**APK** (Alpine) — เบาและเร็วมาก:
```bash
sudo apk update
sudo apk upgrade
sudo apk add nginx curl git
apk info -L nginx
```
---
## Portage และ XBPS
**Portage / emerge** (Gentoo) — compile จาก source:
```bash
sudo emerge --sync
sudo emerge -avuDN @world
sudo emerge -av www-servers/nginx
```
**XBPS** (Void):
```bash
sudo xbps-install -Su # อัปเดตระบบ
sudo xbps-install -S nginx # ติดตั้ง
sudo xbps-remove -R nginx # ถอนพร้อม dep
xbps-query -Rs nginx # ค้นหาใน repo
```
---
## 2.6.6 Universal Packages
| Format | ผู้สร้าง | Sandbox | ขนาด | หมายเหตุ |
| --- | --- | --- | --- | --- |
| **Flatpak** | Red Hat | ✅ Bubblewrap | กลาง | Flathub repo |
| **Snap** | Canonical | ✅ AppArmor | ใหญ่ | Snap Store |
| **AppImage** | S. Peter | ❌ portable | ใหญ่ | ไฟล์เดียวรันได้ |
| **Nix** | NixOS | option | กลาง | reproducible |
---
## ตัวอย่าง Universal Packages
```bash
# Flatpak
flatpak remote-add --if-not-exists flathub \
https://flathub.org/repo/flathub.flatpakrepo
flatpak install flathub org.mozilla.firefox
flatpak run org.mozilla.firefox
# Snap
sudo snap install code --classic
sudo snap refresh
# AppImage (แค่ chmod +x แล้วรัน)
chmod +x MyApp-x86_64.AppImage
./MyApp-x86_64.AppImage
```
---
## 2.6.7 Repository, PPA, COPR
- **Repository (repo)**: ที่เก็บแพ็กเกจ + metadata กระจายผ่าน HTTPS
- **Debian/Ubuntu** components: `main`, `contrib`, `non-free`, `universe`, `multiverse`
- **PPA (Personal Package Archive)**: repo ส่วนบุคคลของ Ubuntu
```bash
# เพิ่ม PPA
sudo add-apt-repository ppa:deadsnakes/ppa
sudo apt update
sudo apt install python3.12
```
---
## COPR และอื่น ๆ
**COPR (Cool Other Package Repo)** — คล้าย PPA แต่ของ Fedora:
```bash
sudo dnf copr enable user/project
sudo dnf install package-from-copr
```
- **RPM Fusion**: repo ชุมชนของ Fedora ที่มี codec, driver ปิด
- **ArchLinuxCN**: mirror ของจีนที่มีแพ็กเกจเพิ่ม
Repository เพิ่มเติมเหล่านี้ขยาย ecosystem ของ distro ให้รองรับซอฟต์แวร์ที่ไม่อยู่ใน main repo
---
# 2.7 การจัดการผู้ใช้และสิทธิ์
---
## ภาพรวมการจัดการสิทธิ์
Linux เป็น **multi-user system** ตั้งแต่กำเนิด
การแยกสิทธิ์ระหว่างผู้ใช้และระหว่างโปรเซสฝังอยู่ในแกนกลาง
ทุกไฟล์มี:
- **owner** และ **group**
- สิทธิ์ 3 ระดับ: owner / group / others
- การกระทำ 3 อย่าง: read / write / execute
---
## 2.7.1 /etc/passwd
**`/etc/passwd`** เก็บข้อมูลผู้ใช้ (**อ่านได้โดยทุกคน**)
รูปแบบ 7 field คั่นด้วย `:`:
```
moo:x:1000:1000:Moo Lecturer,,,:/home/moo:/bin/bash
^ ^ ^ ^ ^ ^ ^
| | | | | | shell
| | | | | home directory
| | | | GECOS (full name)
| | | GID (primary group)
| | UID
| password placeholder (x = ใช้ shadow)
username
```
---
## /etc/shadow
**`/etc/shadow`** (อ่านได้เฉพาะ root) เก็บ password hash
```
moo:$6$rounds=656000$salt$hashedpw:19876:0:99999:7:::
^ ^ ^
user hashed password วันที่เปลี่ยน
(SHA-512 ขึ้นต้น $6$) password ล่าสุด
```
ในอดีต password hash เก็บใน `/etc/passwd` แต่ปัจจุบันย้ายมา shadow เพื่อความปลอดภัย
---
## /etc/group และ /etc/sudoers
**`/etc/group`**:
```
sudo:x:27:moo,alice
docker:x:999:moo
```
**`/etc/sudoers`** แก้ด้วย `visudo` เท่านั้น:
```
# ให้ user moo สั่ง sudo ได้ทุกอย่าง
moo ALL=(ALL:ALL) ALL
# ให้ group wheel/sudo สั่งได้
%wheel ALL=(ALL) ALL
# อนุญาตคำสั่งเฉพาะโดยไม่ต้องใส่ password
alice ALL=(root) NOPASSWD: /usr/bin/systemctl restart nginx
```
---
## 2.7.2 useradd และคำสั่งจัดการ User
```bash
# สร้าง user ใหม่พร้อม home และ shell
sudo useradd -m -s /bin/bash -c "Aj. Moo" moo
# ตั้งรหัสผ่าน
sudo passwd moo
# สร้าง group
sudo groupadd developers
# เพิ่ม user ลง group (สำคัญ: -aG = append!)
sudo usermod -aG developers,docker moo
# เปลี่ยน shell
sudo usermod -s /bin/zsh moo
```
---
## Lock, Delete, ตรวจสอบ User
```bash
# ล็อค/ปลดล็อคบัญชี
sudo usermod -L moo # lock
sudo usermod -U moo # unlock
# ลบ user (พร้อม home directory)
sudo userdel -r oldemp
# ดูสมาชิก group
getent group developers
groups moo
id moo
```
---
## 2.7.3 sudo, su, visudo
- **`su`** (switch user) — "กลายเป็น" user อื่น ใส่ password ของปลายทาง
- **`sudo`** — "รันเป็น" user อื่น (default = root) ใส่ password ของตัวเอง
- **`visudo`** — editor ที่ตรวจ syntax ก่อน save
```bash
# รันคำสั่งเป็น root
sudo systemctl restart nginx
# เปิด shell เป็น root
sudo -i
sudo -s
su -
# รันเป็น user อื่น
sudo -u postgres psql
```
---
## visudo และ drop-in file
```bash
# แก้ sudoers อย่างปลอดภัย
sudo visudo
# แก้ drop-in file (แนะนำ)
sudo visudo -f /etc/sudoers.d/moo
```
การใช้ drop-in file ดีกว่าแก้ `/etc/sudoers` โดยตรง:
- จัดการง่ายตามรายผู้ใช้
- ลบออกได้ง่าย
- ไม่ทำให้ไฟล์หลักเสียหาย
---
## 2.7.4 File Permission
สิทธิ์ไฟล์แสดงด้วย 10 ตัวอักษร:
```
-rwxr-xr-- 1 moo devs 4096 Apr 20 14:22 script.sh
^^^^^^^^^^
│└──┴──┴── others: r-- (อ่านได้)
│ └──┴── group: r-x (อ่าน + execute)
│ └── owner: rwx (rwx ครบ)
└── type (-=file, d=dir, l=symlink,
b=block, c=char, s=socket, p=pipe)
```
---
## Octal Permission
**แปลงเป็นเลข octal**: r=4, w=2, x=1
ดังนั้น `rwxr-xr--` = **754**
---
## ความหมาย rwx: File vs Directory
| สิทธิ์ | ใน File | ใน Directory |
| --- | --- | --- |
| **r** | อ่านเนื้อหา | `ls` ดูชื่อไฟล์ได้ |
| **w** | แก้ไขเนื้อหา | สร้าง/ลบ/rename ไฟล์ได้ |
| **x** | รันเป็นโปรแกรม | `cd` เข้าไปได้ / เข้าถึงไฟล์ใน dir ได้ |
ความหมายของ rwx ต่างกันระหว่างไฟล์กับ directory ซึ่งเป็นจุดที่ผู้เริ่มต้นมักสับสน
---
## 2.7.5 chmod (Symbolic)
```bash
# u=user(owner), g=group, o=others, a=all
# +,-,= เพิ่ม, ลบ, กำหนด
# r,w,x,X,s(SUID/SGID),t(sticky)
chmod u+x script.sh # owner รันได้
chmod g-w file.txt # ลบสิทธิ์เขียนของ group
chmod o= secret.key # others ไม่มีสิทธิ์
chmod a+r public.txt # ทุกคนอ่านได้
chmod u=rwx,g=rx,o=r dir/ # กำหนดตรง ๆ
chmod -R g+w project/ # recursive
```
---
## chmod (Octal)
```bash
chmod 755 script.sh # rwxr-xr-x (script, binary)
chmod 644 file.txt # rw-r--r-- (ไฟล์ทั่วไป)
chmod 600 ~/.ssh/id_ed25519 # rw------- (private!)
chmod 700 ~/.ssh # rwx------
chmod 750 /home/moo # rwxr-x---
chmod 4755 /usr/bin/passwd # SUID + 755
```
ใช้ Octal mode เมื่อต้องการกำหนดสิทธิ์ชัดเจนทุกระดับพร้อมกัน
---
## chown และ chgrp
```bash
# เปลี่ยนเจ้าของ
sudo chown moo file.txt
# เปลี่ยนเจ้าของและ group พร้อมกัน
sudo chown moo:developers file.txt
# เปลี่ยนเฉพาะ group
sudo chgrp developers file.txt
# Recursive
sudo chown -R moo:moo /home/moo/project
```
---
## 2.7.6 Special Permission
- **SUID (Set User ID)** — รัน file ด้วยสิทธิ์ของ **owner** ไม่ใช่ผู้ใช้ปัจจุบัน
- ใช้กับ `/usr/bin/passwd` (user ต้องเขียน `/etc/shadow`)
- **SGID (Set Group ID)**
- บน file: รันด้วยสิทธิ์ของ group
- บน directory: ไฟล์ใหม่จะได้ group เดียวกับ dir
- **Sticky Bit** — บน directory: เฉพาะ owner ของไฟล์ลบไฟล์ได้
- ใช้กับ `/tmp`
---
## ตัวอย่าง SUID/SGID/Sticky
```bash
# SUID (4xxx)
sudo chmod 4755 myprog # แสดงเป็น rwsr-xr-x
# SGID (2xxx) — ใช้บ่อยกับ directory งานกลุ่ม
sudo mkdir /srv/shared
sudo chown root:developers /srv/shared
sudo chmod 2775 /srv/shared # rwxrwsr-x
# ไฟล์ที่สร้างจะเป็นของ group developers อัตโนมัติ
# Sticky Bit (1xxx)
sudo chmod 1777 /tmp # rwxrwxrwt
ls -ld /tmp # ตรวจสอบ
```
---
## 2.7.7 ACL (Access Control List)
**POSIX ACL** แก้ข้อจำกัดของ owner/group/others ที่กำหนดสิทธิ์ผู้ใช้หลายคนไม่ได้
```bash
# ติดตั้ง (บาง distro ไม่มีมาให้)
sudo apt install acl # Debian/Ubuntu
sudo pacman -S acl # Arch (มักมีแล้ว)
# ตรวจสอบ ACL
getfacl project/
# ให้ user alice อ่าน+เขียน file
setfacl -m u:alice:rw file.txt
# ให้ group qa อ่านอย่างเดียว
setfacl -m g:qa:r file.txt
```
---
## ACL: Default และการลบ
```bash
# default ACL บน directory (ไฟล์ใหม่จะสืบทอด)
setfacl -d -m u:alice:rwx shared_dir/
# ลบ ACL
setfacl -x u:alice file.txt
setfacl -b file.txt # ลบทั้งหมด
# ดูผลลัพธ์ (จะเห็น '+' ท้ายสิทธิ์ปกติ)
ls -l file.txt
# -rw-rw-r--+ 1 moo devs 0 Apr 20 14:30 file.txt
```
เครื่องหมาย `+` ที่ท้ายสิทธิ์แสดงว่าไฟล์มี ACL เพิ่มเติม
---
## 2.7.8 Capability
**Linux Capability** แบ่งสิทธิ์ root ออกเป็นส่วน ๆ (กว่า 40 caps):
- `CAP_NET_BIND_SERVICE` — bind port < 1024 ได้
- `CAP_NET_RAW` — สร้าง raw socket (ping)
- `CAP_SYS_ADMIN` — สิทธิ์ admin หลายอย่าง
- `CAP_CHOWN` — เปลี่ยน owner ไฟล์ได้
```bash
# ดู capability ของไฟล์
getcap /usr/bin/ping
# /usr/bin/ping cap_net_raw=ep
# ตั้ง capability (แทน SUID)
sudo setcap cap_net_bind_service=+ep /usr/local/bin/mynode
```
---
## umask
**`umask`** คือ "mask" ที่หักสิทธิ์ default เมื่อสร้างไฟล์/directory:
- **umask 022**: ไฟล์ใหม่ 644, dir ใหม่ 755
- **umask 027**: ไฟล์ใหม่ 640, dir ใหม่ 750 (เข้มงวดกว่า)
---
## การใช้งาน umask
```bash
# ดูค่าปัจจุบัน
umask # เช่น 0022
# ตั้งใหม่ (มีผลเฉพาะ shell session นี้)
umask 027
# ทดสอบ
touch test.txt && ls -l test.txt
# ต้องได้ rw-r-----
# ตั้งถาวร: เพิ่มลง ~/.bashrc หรือ /etc/profile
echo "umask 027" >> ~/.bashrc
```
---
# 2.8 การติดตั้งและตั้งค่าพื้นฐาน
---
## ภาพรวมการติดตั้ง Linux
ขั้นตอนหลัก ๆ:
1. เตรียม media
2. boot
3. แบ่ง partition
4. ติดตั้ง base
5. ติดตั้ง bootloader
6. ตั้งค่า network/locale/user
7. reboot
---
## ลำดับขั้นตอนการติดตั้ง
%%{init: {'theme':'base','themeVariables':{'primaryColor':'#3c3836','primaryTextColor':'#ebdbb2','primaryBorderColor':'#fabd2f','lineColor':'#d79921','secondaryColor':'#504945','tertiaryColor':'#282828','background':'#282828'}}}%%
flowchart TB
A["1. ดาวน์โหลด ISO"] --> B["2. เขียน USB
(dd/Ventoy)"]
B --> C["3. Boot USB"]
C --> D["4. แบ่ง Partition"]
D --> E["5. Format FS"]
E --> F["6. Mount & Install"]
F --> G["7. ติดตั้ง Bootloader"]
G --> H["8. ตั้งค่า user/network"]
H --> I["9. Reboot
เข้าใช้งาน"]
---
## 2.8.1 การเตรียม Installation Media
**`dd`** (Linux/macOS) — เขียน ISO ลง USB แบบ raw:
```bash
# ตรวจชื่อ USB (ระวัง! อย่าให้ชี้ไปผิด disk)
lsblk
# สมมติ USB คือ /dev/sdb (ไม่ใช่ /dev/sdb1)
# unmount ก่อน
sudo umount /dev/sdb*
# เขียน ISO
sudo dd if=./distro.iso of=/dev/sdb \
bs=4M status=progress oflag=sync conv=fdatasync
sync
```
---
## Ventoy และ Rufus
**Ventoy** — เขียน 1 ครั้ง ใช้ได้หลาย ISO:
```bash
# ติดตั้ง Ventoy ลง USB (ล้างข้อมูลทั้งหมด!)
sudo ./Ventoy2Disk.sh -i /dev/sdb
# หลังจากนั้น mount USB แล้ว copy ISO ลงไปได้เลย
cp ubuntu-24.04.iso /run/media/moo/Ventoy/
cp archlinux.iso /run/media/moo/Ventoy/
```
**Rufus / Etcher** — GUI บน Windows/macOS
---
## 2.8.2 Partition Scheme: MBR vs GPT
**MBR (Master Boot Record)** — มาตรฐานเก่า:
- รองรับ disk ไม่เกิน **2 TB**
- Primary partition ไม่เกิน **4**
- ใช้กับ **BIOS** (Legacy)
**GPT (GUID Partition Table)** — มาตรฐานใหม่:
- รองรับ disk ได้ถึง **9.4 ZB**
- Partition ได้ **128** เป็น default
- ใช้กับ **UEFI**
- มี **CRC32 checksum** และ backup table
---
## Layout แนะนำ (UEFI + GPT)
| Partition | Mount | Size | FS |
| --- | --- | --- | --- |
| 1 | `/boot/efi` | 512MB-1GB | FAT32 |
| 2 | `/boot` (opt) | 1 GB | ext4 |
| 3 | `[SWAP]` | 8-16 GB | swap |
| 4 | `/` | 50-100 GB+ | ext4/btrfs |
| 5 | `/home` (opt) | ที่เหลือ | ext4/btrfs |
ESP = EFI System Partition
---
## สูตรคำนวณ Swap
เช่น RAM 32 GB → swap ~6 GB (ไม่ hibernate) หรือ 32 GB (hibernate)
---
## คำสั่งแบ่ง Partition
```bash
# ดู partition ปัจจุบัน
lsblk -f
sudo fdisk -l
# ใช้ cfdisk (TUI ใช้งานง่าย)
sudo cfdisk /dev/sda
# หรือใช้ parted (non-interactive ได้)
sudo parted /dev/sda mklabel gpt
sudo parted /dev/sda mkpart ESP fat32 1MiB 513MiB
sudo parted /dev/sda set 1 esp on
sudo parted /dev/sda mkpart primary ext4 513MiB 100%
# Format
sudo mkfs.fat -F32 /dev/sda1
sudo mkfs.ext4 /dev/sda2
sudo mkfs.btrfs -L root /dev/sda2
```
---
## 2.8.3 Bootloader: GRUB
**GRUB 2** — ทรงพลังที่สุด รองรับทั้ง BIOS และ UEFI
```bash
# ติดตั้ง GRUB (UEFI)
sudo grub-install --target=x86_64-efi \
--efi-directory=/boot/efi --bootloader-id=GRUB
# ติดตั้ง GRUB (Legacy BIOS)
sudo grub-install --target=i386-pc /dev/sda
# สร้าง grub.cfg
sudo grub-mkconfig -o /boot/grub/grub.cfg
```
ตัวเลือกหลักแก้ที่ `/etc/default/grub` แล้ว `grub-mkconfig` ใหม่
---
## systemd-boot และ rEFInd
**systemd-boot** — เรียบง่าย เฉพาะ UEFI:
```bash
# ติดตั้ง
sudo bootctl install
```
สร้าง entry: `/boot/loader/entries/arch.conf`:
```
title Arch Linux
linux /vmlinuz-linux
initrd /initramfs-linux.img
options root=UUID=xxx rw
```
**rEFInd** — GUI สวย เหมาะกับ dual-boot หลาย OS
---
## 2.8.4 Dual-boot กับ Windows/macOS
**ขั้นตอนทั่วไป Windows + Linux**:
1. **Install Windows ก่อนเสมอ** (Windows ชอบเขียน MBR/EFI ทับ)
2. บูต Windows **ปิด Fast Startup** และ **BitLocker**
3. ใช้ Disk Management ย่อ partition ของ Windows
4. บูต Linux installer เลือก "Install alongside Windows"
5. GRUB จะ detect Windows ใน EFI และเพิ่ม entry อัตโนมัติ
6. ในไบออสตั้ง **Linux ก่อน Windows** ในลำดับ boot
---
## ปัญหา Dual-boot ที่เจอบ่อย
- **Windows update ทำลาย GRUB**
- แก้: บูต Linux live USB แล้ว `grub-install` ใหม่
- **นาฬิกาผิด**
- Linux ใช้ UTC, Windows ใช้ local time
- แก้: ตั้ง Linux ใช้ local time:
```bash
sudo timedatectl set-local-rtc 1 --adjust-system-clock
```
---
## 2.8.5 Network (NetworkManager)
**NetworkManager** — ใช้บน Desktop เกือบทุก distro
```bash
# TUI client
nmtui
# CLI
nmcli device status
nmcli device wifi list
nmcli device wifi connect "ShopeeFood_5G" password "mypass"
# แก้ไข connection
nmcli connection show
nmcli connection modify "Wired connection 1" \
ipv4.addresses 192.168.1.50/24
nmcli connection up "Wired connection 1"
```
---
## systemd-networkd
**systemd-networkd** — minimal นิยมบน server
สร้าง `/etc/systemd/network/20-wired.network`:
```ini
[Match]
Name=enp3s0
[Network]
Address=192.168.1.50/24
Gateway=192.168.1.1
DNS=1.1.1.1
DNS=8.8.8.8
```
```bash
sudo systemctl enable --now systemd-networkd
sudo systemctl enable --now systemd-resolved
```
---
## คำสั่งตรวจสอบ Network
```bash
ip addr
ip route
ss -tulnp # port ที่ listen
ping -c 3 1.1.1.1 # ทดสอบ IP routing
ping -c 3 google.com # ทดสอบ DNS
resolvectl status # สถานะ DNS (systemd)
```
คำสั่งเหล่านี้ใช้ตรวจสอบและแก้ไขปัญหา network ในขั้นพื้นฐาน
---
## 2.8.6 Locale
**Locale** — ภาษา, ตัวเลข, สกุลเงิน, วันเวลา
```bash
# ดู locale ปัจจุบัน
locale
# ดู locale ที่ติดตั้ง
locale -a
# Debian/Ubuntu
sudo dpkg-reconfigure locales
# เปิดใช้ locale ใน /etc/locale.gen
sudo sed -i 's/^#\(th_TH.UTF-8\)/\1/;s/^#\(en_US.UTF-8\)/\1/' /etc/locale.gen
sudo locale-gen
# ตั้ง default (ทั้งระบบ)
sudo localectl set-locale LANG=en_US.UTF-8 LC_TIME=th_TH.UTF-8
```
---
## 2.8.6 Timezone และ Keyboard
**Timezone**:
```bash
timedatectl
sudo timedatectl set-timezone Asia/Bangkok
sudo timedatectl set-ntp true
timedatectl list-timezones | grep -i bangkok
```
**Keyboard Layout**:
```bash
# TTY/Console
sudo localectl set-keymap us
# GUI (X11/Wayland)
sudo localectl set-x11-keymap "us,th" pc105 "" \
"grp:alt_shift_toggle"
# สลับ layout ด้วย Alt+Shift
```
---
## สรุปบทที่ 2
บทนี้ได้ปูพื้นฐานของระบบปฏิบัติการ Linux:
- **ประวัติและปรัชญา Unix** ที่กลายเป็นรากฐานของทุกอย่าง
- **สถาปัตยกรรม monolithic kernel + LKM** ที่ผสมข้อดีของ monolithic และ modular
- **ระบบนิเวศ distribution** ที่หลากหลายตามปรัชญาและกลุ่มเป้าหมาย
- **มาตรฐาน FHS** ทำให้ทุก distro มีโครงสร้างคุ้นตา
---
## สรุปบทที่ 2 (ต่อ)
- **Init system** ที่จัดการบริการ (โดยเฉพาะ systemd ที่ครอบคลุม)
- **Package manager** หลากหลายตระกูล
- **การจัดการผู้ใช้และสิทธิ์** ที่เป็นหัวใจความปลอดภัย
- **การติดตั้งและตั้งค่าพื้นฐาน** ที่นำไปทดลองใช้งานจริงได้
ผู้เรียนสามารถนำความรู้นี้ไปทดลองใช้งานจริงบนเครื่องของตนเองได้
---
# คําถาม - ข้อสงสัย