یوشا

دست نوشته ها و تجربیات شخصی

یوشا

دست نوشته ها و تجربیات شخصی

شهید دکتر مصطفی چمران: می گویند تقوا از تخصص لازمتر است، آنرا می پذیرم، اما می گویم آنکس که تخصص ندارد و کاری را می پذیرد بی تقواست!

طبقه بندی موضوعی

۲۲ مطلب با موضوع «نرم افزار :: سیستم عامل :: GNU/Linux» ثبت شده است

۰۸
۱۴۰۴/۰۴

 

در ادامه مقاله قبلیم(12 سال پیش!) که ماژول Kernel لینوکس رو تعریف کردم، در این مقاله به نوشتن ماژول برای Kernel لینوکس می پردازم.

در این مقاله، به صورت ساده یاد می‌ گیریم که چگونه یک ماژول Hello World برای کرنل Linux بنویسیم، کامپایل و اجرا کنیم... و همه اینها بر پایه توزیع های معروف مثل Debian, RedHat و Slackware انجام میدیم.

 

ماژول های هسته لینوکس

هسته لینوکس / Linux kernel قلب سیستم‌ عامل لینوکس است و مسئول مدیریت منابع سخت‌ افزاری، ارتباط با سخت‌ افزار و اجرای برنامه‌ هاست. هسته لینوکس به صورت ماژولار طراحی شده، یعنی بسیاری از قابلیت‌ های آن به صورت فایلهای جدا و Load شدنی (Loadable Kernel Modules - LKM) پیاده‌ سازی می‌ شوند.

ماژول های هسته Linux دارای چند نوع هستند:  ماژول‌ های درایور دستگاهها (Device drivers)، ماژول‌ های فایل سیستم (Filesystem)، ماژول‌ های شبکه (Network)، ماژول‌ های امنیتی (Security) و ماژول‌ های مدیریت حافظه و پردازش (Memory & process management). این ماژول ها باعث اضافه شدن feature در هسته، افزایش کارایی، سفارشی‌ سازی آسان و نگهداری ساده‌ تر خود هسته می‌ شوند.

 

پیش‌ نیازها برای توزیع‌ های مختلف

جهت توسعه و تولید ماژول هسته لینوکس، به تعدادی ابزار و سورس نیاز هست که در زیر آنها را نصب می کنیم:

1. خانواده دبیان (Debian/Ubuntu)

sudo apt update
sudo apt install build-essential linux-headers-$(uname -r)

2. خانواده ردهت (Fedora/RHEL/CentOS)

sudo dnf install kernel-devel gcc make

3. اسلکور (Slackware) 

sudo slackpkg install gcc make kernel-headers kernel-source

 

نوشتن ماژول Hello World (برای همه توزیع‌ ها)

#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>

MODULE_LICENSE("GPL");
MODULE_AUTHOR("Your Name");
MODULE_DESCRIPTION("Hello World module for Slackware and other distros");
MODULE_VERSION("1.1");

static int __init hello_init(void) {
    printk(KERN_INFO "Hello from Slackware Kernel!\n");
    return 0;
}

static void __exit hello_exit(void) {
    printk(KERN_INFO "Goodbye from Slackware Kernel!\n");
}

module_init(hello_init);
module_exit(hello_exit);

 توضیحات کدهای بالا:

  • #include <linux/module.h>: یک فایل هدر (header) است که به توسعه‌ دهندگان ماژول‌ امکان می‌ دهد تا ماژول‌ های خود را با هسته لینوکس ادغام کنند. این فایل شامل defines، structures، ماکروها و توابعی است که برای نوشتن ماژول‌ های هسته ضروری هستند.

  • MODULE_LICENSE("GPL"): مشخص می‌ کند که ماژول تحت پروانه GPL است (اجباری).

  • printk: تابع چاپ در Log کرنل (مشابه printf اما برای کرنل).

    • KERN_INFO سطح Log را تعیین می‌ کند (در /var/log/kern.log یا dmesg دیده می‌ شود).

  • __init و __exit:

    • __init تعیین می کند که تابع فقط یک بار هنگام لود اجرا شود و سپس حافظه آزاد شود.

    • __exit برای توابعی است که فقط هنگام حذف ماژول اجرا می‌ شوند.

  • module_init و module_exit: توابع initialize و finalize ماژول را register می‌ کنند.

 

کامپایل و نصب ماژول

جهت کامپایل و نصب ماژول می توان بصورت دستی هم عمل کرد و دستورات را وارد کرد، اما بهتره یک فایل builder بنام Makefile بسازید و محتویات زیر رو داخل وارد کنید.

و سپس دستور make رو در کنسول سیستم در همون مسیر بزنید تا ماژول تولید بشه.

1. برای دبیان/ردهت

obj-m := hello_world.o
KDIR := /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)

all:
    make -C $(KDIR) M=$(PWD) modules

clean:
    make -C $(KDIR) M=$(PWD) clean

2. برای اسلکور

obj-m := hello_world.o
KDIR ?= /usr/src/linux-$(shell uname -r)
PWD := $(shell pwd)

all:
    make -C $(KDIR) M=$(PWD) modules

clean:
    make -C $(KDIR) M=$(PWD) clean

 توضیحات کدهای بالا:

obj-m := hello_world.o فایل ماژول نهایی: hello_world.ko.

KDIR مسیر هدر های کرنل.

PWD مسیر فعلی.

make ساخت ماژول (hello_world.ko).

make clean پاکسازی فایل‌ های موقت.

نکته برای اسلکور:
در بعضی نسخه های Slackware ممکن است نیاز باشد مسیر کرنل را به صورت دستی مشخص کنید:

export KDIR=/usr/src/linux-$(uname -r)

 

اجرا و توقف ماژول

برای اجرا یا متوقف کردن ماژول از دستورات زیر استفاده می کنیم. این دستورات در همه توزیع های لینوکس موجود هستند:

1. برای لود ماژول

sudo insmod hello_world.ko

2. جهت بررسی خروجی

dmesg | tail -n 2

خروجی نمونه

[123456789] Hello from Slackware Kernel!

3. جهت حذف ماژول

sudo /sbin/rmmod hello_world

نکات ویژه Slackware

  1. مسیر کرنل:
    در Slackware کرنل در /usr/src/linux-$(uname -r) قرار دارد.

  2. تفاوت در ابزارها:
    در Slackware از insmod/rmmod به جای modprobe استفاده می شود..

  3. مدیریت ماژول‌ ها:
    برای لیست ماژول‌ های لود شده در Slackware:

    cat /proc/modules
    

 

تفاوت syscall با function call

در حین توسعه هسته یا ماژول های هسته ممکنه با واژه های syscall زیاد سروکار داشته باشید، اما syscall دقیقا چی هست:

  • معقوله system call (یا همون syscall) با محیط kernel در ارتباطه ولی function call با محیط user در ارتباطه.
  • system call با سیستم عامل تعامل برقرار می کنه ولی function call با برنامه و کتابخانه.
  • بخاطر گستردگی و تودرتو بودن system call، معمولاً منابع بیشتری صرف call کردن اونها میشه، ولی function call هزینه های کمتری رو دربر میگیره.
  • دستورات system call توسط function call صدا زده میشه ولی function call توسط برنامه صدا زده میشه.
  • یک دستور system call تکه ای کد در kernel-space هستش ولی function call تکه ای کد در user-space هستش.

تنها شباهت اینها در مهیا کردن خدمات به caller هستش.

 

مشکلات رایج

مشکل: Kernel Panic پس از لود ماژول
دلایل: دسترسی به حافظه نامعتبر (NULL pointer dereference) یا استفاده از توابع فضای user در کرنل (مثل printf به جای printk یا kmalloc بجای malloc)

 

مشکل: ماژول روی نسخه‌ های مختلف هسته کار نمی‌ کند
دلایل: تغییرات API کرنل بین نسخه‌ ها. پس کد را با آخرین نسخه‌ های کرنل تست کنید یا از LINUX_VERSION_CODE برای بررسی نسخه کرنل استفاده کنید

 

مشکل: Memory Leak در ماژول
دلایل:  آزاد نکردن حافظه در تابع exit یا فراموش کردن آزادسازی منابع. می توانید از ابزارهایی مانند kmemleak برای تشخیص leak حافظه استفاده کنید.

 

معرفی ماژولهای اوپن‌ سورس جهت یادگیری
1. پروژه eBPF

مانیتورینگ شبکه و trace سیستم

لینک: github.com/iovisor/bcc

2. پروژه FUSE
پیاده‌ سازی سیستم فایل در User-space

لینک: github.com/libfuse/libfuse

3. پروژه Open-IOMMU
درایور IOMMU برای مدیریت دسترسی به حافظه

لینک: github.com/OpenIOMMU

4. پروژه LTTng
سیستم trace عملکرد کرنل جهت دیباگ و آنالیز سیستم

لینک: github.com/lttng

5. پروژه KVM
توضیحات: ماژول مجازی‌ سازی جهت ساخت ماشین‌ های مجازی

لینک: git.kernel.org/pub/scm/virt/kvm/kvm.git

  • یوشا آل ایوب
۱۶
۱۴۰۲/۱۲

پارامترهای پیشنهادی جهت Hardening هسته لینوکس توسط cmdline موقع boot-time و توسط sysctl موقع run-time.
 

  • توسط cmdline موقع boot-time:
vga=normal mds=full rodata=on mitigations=auto,nosmt page_alloc.shuffle=1 init_on_alloc=1 init_on_free=1 hardened_usercopy=1 iommu.strict=1 iommu.passthrough=0 randomize_kstack_offset=1 pti=on iommu=force tsx=off vsyscall=xonly vdso32=0 debugfs=on

نکته: این پارامترهارو باید به برنامه bootloader تون بدید:

  • اگر بوت لودر Grub هستش، داخل فایل /boot/grub/grub.cfg و در جلوی متغیر GRUB_CMDLINE_LINUX_DEFAULT باید قرار بگیرن.
  • اگر بوت لودر eLiLo هستش، داخل فایل /boot/EFI<OS>/elilo.conf و در جلوی متغیر append باید قرار بگیرن.

توضیحات و مستندات Kernel command-line parameters

 

  • توسط برنامه sysctl موقع run-time:
sysctl -w net.core.bpf_jit_harden="2"
sysctl -w kernel.dmesg_restrict="1"
sysctl -w kernel.perf_event_paranoid="3"
sysctl -w kernel.kexec_load_disabled="1"
sysctl -w user.max_user_namespaces="0"
sysctl -w dev.tty.ldisc_autoload="0"
sysctl -w kernel.unprivileged_bpf_disabled="1"
sysctl -w kernel.kptr_restrict="2"
sysctl -w dev.tty.legacy_tiocsti="0"
sysctl -w vm.unprivileged_userfaultfd="0"
sysctl -w fs.protected_symlinks="1"
sysctl -w fs.protected_hardlinks="1"
sysctl -w fs.protected_fifos="2"
sysctl -w fs.protected_regular="2"
sysctl -w fs.suid_dumpable="0"
sysctl -w kernel.yama.ptrace_scope="3"
sysctl -w kernel.randomize_va_space="2"

نکته: برای اعمال این تنظیمات به کاربر root یا دسترسی sudo نیاز دارید.

توضیحات مقادیر موجود در /proc/sys

 

Hardening / سخت‌ سازی

Hardening به مجموعه‌ ای از روش‌ ها و تکنیک‌ های امنیتی گفته  میشه که با هدف کاهش سطح حمله (attack surface) و افزایش مقاومت سیستم در برابر تهدیدات امنیتی انجام میشن. در مورد هسته لینوکس، Hardening شامل تنظیم پارامترها، غیرفعال کردن ویژگی‌ های غیرضروری و اعمال محدودیت‌ های امنیتی میشود تا آسیب‌ پذیری‌ های احتمالی به حداقل برسد.

cmdline / پارامترهای راه‌ اندازی

cmdline یا kernel command-line parameters مقادیری هستند که در زمان bootstrap سیستم به هسته لینوکس ارسال میشن. این پارامترها معمولاً در فایل‌ هایی مثل/boot/grub/grub.cfg یا /boot/EFI/<OS>/elilo.conf یا از طریق bootloader تنظیم میشن و رفتار هسته رو هنگام راه‌ اندازی کنترل می کنن.

sysctl / پارامترهای کنترل

sysctl (system control) مکانیزمی در لینوکس برای تنظیم پارامترهای هسته در زمان اجرا (runtime) میباشد. این پارامترها از طریق فایل‌ های مجازی در مسیر /proc/sys/ قابل دسترسی و تغییر هستن و معمولاً برای بهینه‌ سازی عملکرد و افزایش امنیت سیستم استفاده میشوند.

  • یوشا آل ایوب
۰۱
۱۴۰۱/۰۶

- کانفیگ hardening شده هسته Linux برای محیط production x64:

(قبل از کامپایل هسته Linux بهمین شکل پارامترهارو داخل فایل .config موجود در سورس لینوکس تون اعمال کنید)

  • یوشا آل ایوب
۱۶
۱۴۰۰/۱۱

 

بلخره بعد از مدت ها گنولینوکس Slackware نسخه 15 stable ترخیص شد!

 

  • تغییرات مهم

- Kernel 5.15.19 LTS

- Python 3.9 ,BASh 5.1, LLVM 13, GCC 11.2, PHP 7.4

- XFCE 4.16, KDE 5.23, X Server 1.20

- GRUB 2.0.6, OpenSSL 1.1.1m, BinUtils 2.37, GNU C lib 2.33

- تغییر درایورها

- پشتیبانی بهتر از اینترفیس NVMe و بسترهای نوع UEFI

- جایگزین شدن Elogind بجای ConsoleKit2

- اضافه شدن FFmpeg و Lame

- جایگزین شدن postfix بجای sendmail

- جایگزین شدن Dovecot بجای pop3d و imapd

- جایگزین شدن iproute2 بجای net-tools

- اضافه شدن Qt 5.15 و GTK4

- اضافه شدن تعدادی User/Group جدید

- حذف و اضافه شدن تعداد زیادی package

و بسیاری بهینه سازی و بروز رسانی های دیگه...

 

  •  وبسایت

http://www.slackware.com

 

  • دانلود

32bit

https://mirrors.slackware.com/slackware/slackware-iso/slackware-15.0-iso

https://ftp.osuosl.org/pub/slackware-iso/slackware-15.0-iso

64bit

https://mirrors.slackware.com/slackware/slackware-iso/slackware64-15.0-iso

https://ftp.osuosl.org/pub/slackware-iso/slackware64-15.0-iso

64bit live

https://slackware.nl/slackware/slackware-live/slackware64-15.0-live

 

  • مستندات

https://docs.slackware.com

  • یوشا آل ایوب
۰۵
۱۴۰۰/۱۰

تعریف جرمیابی دیجیتال: به مجموعه فرایند جمع آوری، ارزیابی و ارائه مدارک جمع آوری شده از تجهیزات دیجیتال گفته میشود.

این مدارک دیجیتالی از کامپیوترها، تلفن های همراه، دستگاه های اینترنت اشیا و سرورها به دست می آیند. جرمیابی دیجیتال به حل پرونده های پیچیده ای که بر مدارک دستگاه های دیجیتالی تکیه دارند کمک می کند.

این حوزه کاری زیر مجموعه امنیت سایبری می باشد و به فرد متخصصی که در این حوزه کار میکند متخصص جرمیابی دیجیتال و واکنش به حوادث گفته میشود.

(به انگلیسی Digital Forensics and Incident Response (DFIR))

 

نام توزیع

کشور سازنده

نوع پروانه

معماری

تاریخ بروزرسانی

وبسایت

Kali

(BackTrack)

سوئیس

رایگان/تجاری

Opensource/Binary

i686, x64

2021

kali.org

BlackArch

آمریکا

رایگان

Opensource/Binary

x64

2021

blackarch.org

Grml

استرالیا

رایگان

Opensource

i686, x64

2021

grml.org

Parrot OS

ایتالیا

رایگان

Opensource/Binary

x64

2021

parrotlinux.org

Pentoo

سوئیس

رایگان

Opensource

i686, x64

2020

pentoo.ch

CAINE

ایتالیا

رایگان

Opensource

x64

2021

caine-live.net

نام توزیع

کشور سازنده

نوع پروانه

معماری

تاریخ بروزرسانی

وبسایت

ForLEx

ایتالیا

رایگان

Opensource

x86

2019-10

forlex.it

PALADIN

آمریکا

 

تجاری

Opensource/Binary

x86, x64

?

sumuri.com

DEFT Linux

ایتالیا

رایگان

i686

2018-09

deftlinux.net

BackBox Linux

ایتالیا

رایگان

Opensource/Binary

x86, x64

2020

backbox.org

ALT Linux

روسیه

رایگان

Opensource/Binary

i586, x64

2021

en.altlinux.org

 

basealt.ru

radare2

?

رایگان

Opensource

x86

2021

rada.re/n/

ArchStrike

آمریکا

رایگان

Opensource

i686, x64

2021

archstrike.org

Santoku

?

رایگان

Opensource

x64

2014

santoku-linux.com

نام توزیع

کشور سازنده

نوع پروانه

معماری

تاریخ بروزرسانی

وبسایت

Bugtraq

اسپانیا

رایگان

x86, x64

2013

bugtraq-team.net

URIX OS

بلغارستان

رایگان

x64

2016-01

urix.us

SIFT

؟

؟

x64

2019

digital-forensics.sans.org

Cyborg Linux

هند

رایگان

Opensource

x86

2015

cyborg.ztrela.com

Security Onion

آمریکا

رایگان

Opensource/Binary

x86

2021

securityonion.net

ADIA

?

رایگان

Opensource

x64

2017

forensics.cert.org

NST

آمریکا

رایگان

 Opensource

x64

2021

networksecuritytoolkit.org

Tsurugi Linux

Japan

رایگان

Opensource

x64

2021

https://tsurugi-linux.org


 

دانلود فایل PDF

  • یوشا آل ایوب
۲۵
۱۳۹۹/۰۵

مسئله Thread و Process دو موضوع نزدیک به هم ولی متفاوت هستن...

 

1- Process مستقل هستش، ولی Thread ها بخشی از یک Process هستن. (یعنی یک Process میتونه چندین Thread بوجود بیاره)
2- هر Process حافظه اختصاصی خودش رو داره، ولی Thread ها از حافظه اشغال شده Process استفاده می کنن. (یعنی هر Process حافظه خودش رو با Thread های خودش به اشتراک میذاره)
3- هر Process شامل یک برنامه و PID انحصاری هستش، ولی هر Thread شامل مجموعه ای از دستورالعمل ها و Stack انحصاری هستش.
4- هر Process درواقع یک Task هستش، ولی هر Thread یک Light wight process هستش.
5- Process ها توسط IPC (یا همون Inter-process communication) با یکدیگر ارتباط برقرار می کنن، ولی Thread ها توسط دستورات برنامه نویسی (در زبان PHP و Java توسط wait, notify و در زبان C توسط pthread_cond_wait, pthread_cond_signal) با یکدیگر ارتباط برقرار می کنن.
6- ساخت Process به سختی توسط duplicate کردن Process والد انجام میشه، ولی ساخت Thread براحتی توسط کپی شی Thread انجام میشه.
7- برای اجرای چند Process بطور موازی/parallel به یک سیستم Multi-Process نیاز هست، ولی برای اجرای چند Thread بطور همزمان به دستورات برنامه نویسی نیاز هست.
8- بطور کلی Process توسط CPU کنترل میشه، ولی Thread توسط Process کنترل میشه.
9- هر Process یک Thread main داره، ولی هر Thread فقط خودشه که کارگر/worker صدا زده میشه.
10- Process در فضای separate memory اجرا میشه، ولی Thread در فضای Shared memory اجرا میشه.

11- اگر یک Process کرش کند، معمولاً روی Process‌ های دیگر تأثیر نمی‌ گذارد. اما اگر یک Thread  کرش کند، کل Process و تمام Thread‌ های آن از کار می‌ افتند.

12- ایجاد Process جدید هزینه‌ بر است چون نیاز به اختصاص منابع جدید (حافظه، FD و...) دارد. اما ایجاد Thread بسیار سبک‌ تر است چون منابع Process والد را به اشتراک می‌ گذارد.

13- Process‌ ها در تمام سیستم‌ عامل‌ه ا به صورت استاندارد پیاده‌ سازی شده‌ اند. اما پیاده‌ سازی Thread‌ ها بین سیستم‌ عامل‌ ها متفاوت است (مثلاً Thread‌ های POSIX در لینوکس vs Windows Threads).
و...

  • یوشا آل ایوب
۰۵
۱۳۹۶/۰۸

(برای بزرگنمایی کلیک کنید)

ُSlackware Linux wallpaper تصویر اصلی این wallpaper مطعلق به من نیست

            Slackware Linux wallpaper                                                                 

 
  • یوشا آل ایوب
۲۱
۱۳۹۵/۰۷

Virtual File System یا سیستم فایل مجازی

 

Virtual File System(مخفف VFS) یک ساب سیستم مهم در Kernel لینوکس هست که لایه بین filesystem و برنامه های user-space رو تشکیل میده. درواقع همه filesystem ها، با تکیه بر VFS می تونن شناسایی بشن و تبادل اطلاعات کنن. همین مسئله، برنامه های user-space رو قادر کرده که توسط دستورات موجود در VFS برای خواندن و نوشتن در filesystem های گوناگون اقدام کنن:

 

نکته: در اینجا منظور از لایه، همون Abstraction layer و منظور از دستورات، همون System call/SysCall هستش.

نکته 2: البته به برکت wrap های GNU C Library، کمتر پیش میاد که برنامه user-space نیاز به استفاده از System call داشته باشه.

  • یوشا آل ایوب
۱۳
۱۳۹۵/۰۴
  • یوشا آل ایوب
۰۱
۱۳۹۴/۰۳

 

init: مخفف initialization، اولین برنامه/process ای هست که در حین بوت سیستم اجرا میشه و تا زمانی که سیستم خاموش بشه بکارش ادامه میده. این برنامه ابتدا عملیات system initialization رو انجام میده و سپس عملیات runlevel initialization رو و اینکارو با خوندن محتوای فایل inittab آغاز میکنه.

برنامه init ابتدا اسکریپت rc.S رو اجرا میکنه تا سیستم رو برای ورود به runlevel مورد نظر آماده کنه. فایل rc.S وظیفه داره که حافظه مجازی رو فعال کنه، filesystem رو Mount کنه، دایرکتوری var/ رو تمیزکاری کنه، دیوایس های Plug & Play رو آماده سازی کنه، ماژول های Kernel رو بارگذاری کنه(LKM)، پورت های سریال رو پیکربندی کنه و نهایتاً اسکریپتهای System V رو اجرا کنه. بنابراین init آغازگر بیشتر پرورس ها و فرآیندهای اصلی سیستم هستش.

نکته: برنامه init توسط Kernel فراخونده میشه و با پروسس Id 1 شروع بکار میکنه. اگر Kernel قادر به فراخوندنش نباشه، خطای Kernel pantic (یا همون fatal error) رخ میده که باعث متوقف شدن کل پروسه بوت میشه.

 

runlevel: تعیین کننده پارامترهای برنامه init و دستورالعملهایی برای تنظیم ترمینال، محیط کاربر، شبکه و اجرای سرویس های اولیه هستش که توسط یک شناسه عددی داخل فایل inittab در مسیر /etc/ تنظیم میشه. و البته این شناسه در هر توزیعی متفاوته!

  • یوشا آل ایوب