امیدوارم که عالی باشید. در ادامهی مسیری که داریم میریم رسیدیم به تشریح هر تیکه از این پازل بزرگ دواپس که امروز میخوام در مورد لینوکس صحبت کنم. موضوعی که خودم خیلی دوستش دارم. به نظرم لینوکس و یادگیریش میتونه یکی از بهترین تفریحهایی باشه که تجربش میکنید. شاید خندتون بگیره ولی جدی میگم این که لینوکس کلی عمق داره و میتونید هر بار یه چیز جدید ازش یاد بگیرید و یه جوری ازش استفاده کنید که قبلا فکر میکردید اصلا وجود نداره. همچین امکانی خیلی هیجان داره و برای آدم انگیزه ایجاد میکنه که جلو بره و ادامه بده.
توصیه میکنم که حتما این پستها رو هم مطالعه کنید.
قبلا زیاد در مورد این صحبت میشد که ویندوز یا لینوکس که الان دیگه انتخاب سخت نیست و تقریبا همه اتفاق نظر دارن که لینوکس برای دواپس بهترین انتخاب است. البته BSD هم خیلی مناسبه و فوقالعاده استیبل هست. من تجربهی پایداری و اسکیلی که تو FreeBSD تجربه کردم رو تو هیچ جای دیگه ندیدم. اما خب جامعهی کوچکتری داره و تقریبا تنها هستی ولی اگر بخوام یه سیستمعامل جامع و عمومی برای دواپس معرفی کنم حتما لینوکس رو معرفی میکنم. پر کاربردترین سیستمعامل است از دیوایسهای کوچیک یا هوشمند مثل تلویزیون یا یخچال هوشمند تا پر استفادهترین دیوایسها مثل گوشی هوشمند و کامپیوترهای بزرگ و عظیم همه و همه از لینوکس دارن استفاده میکنند.
از دلایل خودم بخوام بگم:
حالا چه توزیعی رو باید انتخاب کنیم.
انتخاب توزیع از مهمترین تصمیمها بعد از انتخاب سیستمعامل است. تو پروژههای بزرگ مثل Kubernetes یا Openstack یا Ceph این انتخاب خیلی میتونه مسیر پروژه را تغییر بده. پس خیلی مهمه که اول پروژه انتخاب کنید که چه توزیعی از لینوکس رو برای سرورهای خودتون استفاده میکنید.
من پیشنهادم Debian است. قبلا تا وقتی که Centos بود شاید رقابت خیلی جدی بین Debian و Centos بود اما الان که دیگه اون رقیب دوستداشتنی نیست و به نظرم بهترین انتخاب Debian است. حالا چرا Debian چون طی این سالهای اخیر خیلی پایدار بوده و اصلا تغییر خاصی نداشته که باعث اختلال بشه. من خودم قبلا تو پروژههام از Ubuntu LTS استفاده میکردم اما با تغییراتی که داشت دیگه کلا مزایای Ubuntu رو رها کردم و دیگه فقط از Debian استفاده میکنم. Debian یکم از Ubuntu دیرتر آپدیت میگیره اما به شدت پایدارتر هست و پیشنهاد میکنم که حتما ازش استفاده کنید. البته یکم ممکنه سلیقه تو این انتخاب دخیل باشه. ولی چیزی که مهمه اینکه قبل از شروع پروژه حتما انتخاب توزیع لینوکس رو باید انجام بدید و دلایل کاملی برای اون انتخاب داشته باشید. یه نکتهی ریزی اینجا بگم که لینوکس در اصل اون kernel هست که تو همه توزیعها یکسان هست. این چیزی که ما بهش داریم الان لینوکس میگیم در اصل کرنل لینوکس به همراه ابزارها و پکیجهایی هست که کنار اون قرار گرفته و یه توزیع رو شکل داده. ولی چون اونقدر متداول هست دیگه ما هم بهش میگیم لینوکس و نکتهی دیگه اینکه شما هم میتونید توزیع لینوکس خودتون رو داشته باشید.
حالا دیگه سیستمعامل و توزیع اون رو انتخاب کردیم. بریم ببینم چه مواردی رو باید تو لینوکس بدونیم.
نکتهی مهم: با حضور و بروز کلاد پروایدرها شاید الان دیگه کمتر به دانش عمیق لینوکس لازم باشه. فکرش رو بکنید خود پروایدر مثلا آمازون داره بهتون کوبرنتیز مدیریت شده میده. خودش سیستمعامل رو کامل سفارشی کرده تا بهترین عملکرد رو تو کلاستر داشته باشه. اما من متقعدم که با توجه به این شرایط هم شما باید دانش خوب و کافی در مورد لینوکس داشته باشید. با توجه به این موضوع بریم که ادامه بدیم.
بازم جا داره تا بهش اشاره کنم که لینوکس منحصر به این مواردی که میگم نیست و خیلی گسترده هست و خوبه که حتما براش وقت بذارید و حتما توصیه میکنم که کتاب How linux works رو بخونید. یه چیز دیگه که توصیه میکنم آموزشهای آقا مرتضی باشسیز هست که خیلی خوب و روان لینوکس و کلی چیز دیگه درس داده و کاملا رایگان در اختیارتون هست. حتما ویدئوهای آقا مرتضی رو ببینید و ازش یاد بگیرد. خودم هم تو آروان آکادمی یه قسمت لینوکس گفتم که سعی کردم تا این موارد رو پوشش بدم.
یکی از جاهایی که لینوکس رو خیلی قدرتمند کرده Package Manager هست. شما تمام موارد پیرامون یک پکیج از جستجو، دانلود، نصب، آپدیت و پاک کردن آن رو میتونید با استفاده از پکیج منیجرها انجام بدید. هر توزیع از لینوکس رو که انتخاب میکنید باید کار کردن با پکیج منیجر اون رو به خوبی بدونید و بتونید کارهایی که لازم دارید رو با آن انجام بدید. Debian از apt استفاده میکنه که یکی از قدرتمند ترین پکیج منیجرها هست و به راحتی میتونید تمام کارهایی که لازم دارید رو با آن انجام بدید. این موضوع از معدود مواردی هست که با توجه به توزیع لینوکس متفاوت است و موارد دیگه اکثرا distro less هست و تو تمام توزیعهای لینوکس کاملا برقرار میباشد.
apt
(Debian/Ubuntu) or yum
(CentOS/RHEL): Package management commands for installing, updating, and removing software packages.dpkg
(Debian/Ubuntu) or rpm
(CentOS/RHEL): Package management commands for querying package information and managing individual packages.بررسی و مدیریت پروسهها تو لینوکس خیلی اهمیت داره. ما باید بتونیم پروسههای داخل لینوکس رو بررسی و مدیریت کنیم. اینکه الان کدوم پروسه داره بیشترین منابع رو مصرف میکنه یا اینکه کدوم پروسه تو چه وضعیتی هست خیلی مهمه و لازمه که بدونیم و بتونیم باهاشون کار کنیم. تو لینوکس یه سرویس به عنوان اولین سرویس راهاندازی میشه که اونم systemd هست و اون میاد تمام سرویسهای دیگه رو مدیریت و ساماندهی میکنه. کار با systemd رو هم لازمه که بدونیم تا بتونیم وضعیت سرویسها رو بررسی کنیم و به خوبی آنها رو مدیریت کنیم.
ps
: View running processes.top
: Monitor system resources and processes in real-time.htop
: interactive process viewer.atop
: advanced interactive monitor to view the load on a Linux system.lsof
: list open files.kill
: Terminate processes.bg
: To send a process to the backgroundfg
: run a stopped process in the foregroundjobs
: Display status of jobssystemctl
: Manage system services.jornalctl
: Query the systemd journalfree
: Display system memory usage.uptime
: Show system uptime and load averages.مانیتورینگ و لاگینگ خیلی مهمه. من همیشه گفتم مثل چشم و گوش ما تو سرورها هستن. معمولا تو پروژهها ما سامانهی مستقل برای مانیتورینگ و لاگینگ داریم. اما لازمه که داخل سیستمعامل هم بتونیم لاگ بخونیم و منابع اون رو مانیتور کنیم. ما ابزارهای زیادی داریم که بتونیم باهاش لاگ پروسهها و سرویسهایی که داریم رو بررسی و اونها رو مانیتور کنیم. پس دونستن این ابزارها خیلی مهمه. حتی با وجود سامانهی مانیتورینگ و لاگینگ گهگاه پیش میاد که ما نیاز داریم به خود سرور لاگین کنیم و اونجا پروسهها رو بررسی و مدیریت کنیم. پس دونستن این موارد نه تنها مهمه بلکه الزامی هست.
cat
: Concatenate and display file contents.grep
: Search for patterns in files.head
: Display the beginning of a file.tail
: Display the end of a file.less
: View file contents interactively.sed
: Stream editor for text manipulation.awk
: Text processing and data extraction tool.nmon
: A system monitor tool for Linux and AIX systems.iostat
: A tool that reports CPU statistics and input/output statistics for devices, partitions and network filesystems.sar
: A system monitor command used to report on various system loads, including CPU activity, memory/paging, device load, network.vmstat
: A tool that reports virtual memory statistics.sort
: A command-line utility for sorting lines of text files.cut
: A command-line utility for cutting sections from each line of files.uniq
: A command-line utility for reporting or omitting repeated lines.echo
: A command-line utility for displaying a line of text.wc
: A command-line utility for printing newline, word, and byte counts for files.کلا تو لینوکس اونقدر شما قابلیت سفارشی سازی دارید و این سیستمعامل توانمند هست که میتونید حتی به عنوان یه روتر یا سوئیچ ازش استفاده کنید. تو نتورک دستمون کامل بازه و لازمه که یه مقداری از نتورک رو بدونیم و با ابزارهایی که در اختیار داریم تمام ارتباطات بین سرور خودمون با جاهایی دیگه رو کامل بررسی کنیم. خیلی از موارد پیش میاد که ما نیاز داریم تا Tshoot کنیم و مشکلاتی که وجود داره رو بررسی کنیم. معمولا از طریق نتورک ما به سرویسهای داخل لینوکس ارتباط داریم و دونستن ساختار نتورک و توانایی بررسی نتورک خیلی اهمیت داره که حتما باید دانش خوبی تو این زمینه داشته باشیم. داشتن یه دانش ابتدایی از نتورک برای کار دواپس میتونیم بگیم که الزامی است. شما باید پروتکلها و نحوهی کار آنها رو بدید. دونستن این موضوع موقع استفاده از اون پروتکل خیلی میتونه بهتون کمک کنه. پیشنهاد میکنم حتما کتاب +network رو مطالعه کنید. برخی از پروتکلها مهم عبارتند از:
TCP/IP
: These are a set of standard rules that allows different types of computers to communicate with each otherUDP
: UDP (User Datagram Protocol) is a connectionless, unreliable transport layer protocolhttp
or https
: a protocol used for transferring web pages and other resources on the World Wide WebDNS
: a protocol that translates human-readable domain names into IP addressesSMTP
: a protocol for sending and receiving emailPOP
and IMAP
: POP and IMAP are protocols used by email clients to retrieve messages from a serverSSH
: a protocol that provides secure, encrypted communication between devices over an insecure networkSNMP
: a protocol used for managing and monitoring network devices, such as routers, switches, and serversBGP
: a protocol used to exchange routing information between autonomous systems on the InternetDHCP
: a protocol that automates the process of assigning IP addresses to devices on a networkARP
: A protocol used to map IP addresses to MAC addresses on a local networkFTP
or sftp
: a protocol designed for transferring files between computersICMP
: a network protocol that is used to send error messages and operational information about network conditionsNTP
: A protocol used to synchronize the clocks on devices on a networkیکی از مهمترین مواردی که تو نتورک مد نظر هست نحوهی ارتباط با سرورها میباشد که بهترین و شاید تنها راه درست ارتباط با سرور استفاده از پروتوکل ssh است و اونم تنها با کلید که تمام این موارد در دستور ssh و سرویس ssh قرار داره. یکی از نکات مهم امن سازی سرورها هم همینه که این درگاه رو باید امن کنیم.
ping
: Send ICMP echo requests to a host.curl
or wget
: Download files from the web.ssh
: Securely connect to remote systems.scp
: Securely copy files between systems.ssh-keygen
: OpenSSH authentication key utilitynetstat
or ss
: Network statistics and connections.ifconfig
or ip
: Network interface configuration.telnet
: user interface to the TELNET protocolmtr
or traceroute
: network diagnostic tooldig
or nslookup
: DNS lookup utilityrsync
: a fast, versatile, remote (and local) file-copying toolnmap
: Network exploration tool and security / port scannertcpdump
: dump traffic on a networkroute
: show / manipulate the IP routing tableفایروال یا دیوارهی آتش یکی از مهمترین موارد تو مدیریت سرورها است. سرور بدون فایروال یعنی خطر از دست دادن سرور و اطلاعات آن. شما تمام سرورهایی که کانفیگ میکنید باید دارای فایروال باشند. لینوکس با استفاده از netfilter کرنل فرآیند packet filtering رو برای ما به صورت کامل انجام میدهد. اونقدر قوی و کامل است که میتونیم لینوکس خودمون رو طوری کانفیگ کنیم که به عنوان فایروال نقش ایفا کند. اینترفیس ارتباط با netfilter ابزار iptables هست. خیلی ابزار قدرتمندی هست و باهاش خیلی خوب میشه فایروال لینوکس رو کانفیگ کرد. ابزارهای دیگه مثل ufw یا firewalld کار با iptables رو برای ما سادهتر کردن و همهی اونها هم ruleهای iptables میزنند. من توصیه میکنم حتما حتما کار با iptables رو یاد بگیرد و فایروال تمام سرورهای خودتون رو کانفیگ کنید. به صورت کلی من همیشه دوست دارم مستقیم با خود اون ابزار کار کنم تا یه اینترفیس دیگه جلوی اون بنابراین بهتون توصیه میکنم که حتما با خود iptables کار کنید.
ufw
and firewalld
- Firewall management tools.iptables
and nftables
- Firewall management tools.داخل لینوکس همه چی دارای ساختار مشخصی هست که خوب دونستن اون خیلی لازمه. اینکه ساختار فایلها به چه صورت است و هر دایرکتوری برای چه کاری میباشد خیلی مهمه. دسترسیها و مدیریت آنها هم موضوع مهم دیگهای هست که باید بدونید و باهاش بتونید کار کنید.
یکی از موارد دیگه دیسک و مدیریت آن است. کار با دیسک خیلی مهمه اینکه چطوری دیسکها رو مدیریت کنیم و چه فایلسیستمی رو برای اون انتخاب کنیم خیلی اهمیت داره. مثلا اینکه دیسک خودمون رو چطور پارتیشنبندی کنیم. کدوم دایرکتوریها رو تو پارتیشن جدا قرار بدیم. کدوم یکی از اونها رو LVM کنیم. اینها همه موضوعاتی هست که لازمه بهش دید داشته باشیم و بدونیم. براتون یه مثال از تجربهی خودم بزنم. گاهی پیش میاد که تو پروژه لازم میشه یه دیسک جدید به سرور اضافه کنیم. نکتهی مهم اینه که اگر تو فایل etc/fstab/ پارتیشنها رو با UUID مشخص و معرفی نکرده باشیم ممکنه که سیستمعامل ما کلا بوت نشه و دیسک جدید بالاتر از دیسک قبلی قرار بگیره و سیستمعامل بخواد از روی اون بوت بشه. پس دونستن این موارد برای کار با لینوکس خیلی اهمیت داره.
ls
: List files and directories.cd
: Change the current directory.pwd
: Print the current working directory.mkdir
: Create a new directory.rm
: Remove files and directories.cp
: Copy files and directories.mv
: Move or rename files and directories.find
: Search for files and directories.chmod
: Change file permissions.chown
: Change file ownership.lsattr
: list file attributes on a Linux second extended file systemchattr
: change file attributes on a Linux file systemfdisk
: manipulate disk partition tablelsblk
: list block devicesmkfs
: build a Linux filesystemlvm
: LVM2 toolsdf
: Display disk space usage.du
: Estimate file and directory disk usage.ncdu
: NCurses Disk Usagemount
: mount a filesystemparted
: a partition manipulation programcfdisk
: display or manipulate a disk partition tableblkid
: locate/print block device attributesتو لینوکس همه چیز فایل است. وقتی همه چی فایله پس کار با فایلها خیلی اهمیت پیدا میکنه. به صورت کلی من توصیه میکنم که حتما شما کار با یه CLI Editor و یک GUI Editor رو بدونید و بهش مسلط باشید. این که شما چه چیزهایی رو انتخاب میکنید سلیقهای است اما لازمه که حتما کار با آنها رو بدونید. حتما تو CLI Editor این توصیه رو دارم که حتما ادیتوری رو انتخاب کنید که معمولا روی سرورها نصب است تا همواره بتونید باهاش فایلها رو بررسی و کانفیگ کنید. من خودم پیشنهادم استفاده از vim برای CLI و از Vscode برای GUI هست که هر دو ادیتورهای قدرتمندی هستن. Vscode یکی از معدود محصولات Microsoft هست که من خیلی دوستش دارم و ازش استفاده میکنم. :) پس لازمه که حتما کار با ادیتورها رو بدونید و بتونید نیازهای خودتون رو باهاش برطرف کنید.
vi
: a programmer's text editorvim
: Vi IMproved, a programmer's text editornano
: Nano's another editor, inspired by Picoبش اسکریپتینگ یکی از راههایی هست که ما میتونیم تسکها و مواردی که تو لینوکس میخواهیم انجام بدیم رو خودکار کنیم. این خودکار سازی بهمون کمک میکنه که کارهای تکراری که لازمه انجام بشه رو به راحتی انجام بدیم. تو استفاده از بش اسکریپت ما تمام امکانات خط فرمان رو داریم و دستمون کامل بازه. یه نکتهی کوچیک بگم اینکه امروزه با قدرتمند شدن Configuration managementها و ظهور Infrastructure as code شاید استفاده و کاربرد bash script کمتر شده باشه اما هنوز برای خیلی از موارد داخل سیستمعامل مثل بکاپ گرفتن و .... کاربردی هست و ازش استفاده میشه.
شاید میتونست جای وب سرور اینجا نباشه و خودش یه مبحث جداگانهای باشه اما به نظرم با توجه به گستردگی موضوعات اینم اینجا بررسیش کنیم. دونستن وب سرور و کار باهاش خیلی مهمه و لازمه. ما معمولا با استفاده از وبسرور سرویس نهایی خودمون رو به کاربر میدیم. یکی از بهترین و قویترین وبسرورها جناب Nginx هست که خیلی کار میتونید باهاش انجام بدید. شما از nginx میتونید برای Reverse proxy، Cache، Load balancer، ایجاد آپلود سرور، ارائهی فایل و فایل سرور و ... استفاده کنید که تو تمام این زمینهها هم از قدرت خوبی برخوردار است.
یه ابزار دیگه هم اینجا بهتون توصیه میکنم که یاد بگیرد Traefik است که کمک میکنه تا Automatic Configuration داشته باشید. البته اگر از داکر یا پروایدرهای دیگهای که پشتیبانی میکنه استفاده کنید. کلا دونستن و کار کردن با یک وب سرور برای کار دواپس به نظرم کاملا الزامی است.
همواره لینوکس به صورت عمومی منتشر میشه و تقریبا برای استفادهی خاصی سفارشی نشده است. مگر اینکه توزیع خاصی باشه که برای استفادهی خاصی آماده شده باشه. پس به صورت کلی لینوکس برای استفادهی عمومی آماده شده. پس نیازه که سرور لینوکس رو امن و کاربردی کنیم. امن کردن لینوکس یا Hardening یک سری موارد است که کمک میکنه که سرور امنتر شود. برخی از اقدامات که در هاردنینگ انجام میدیم شامل امنکردن SSH سرویس، جدا کردن برخی از پارتیشنها، دسترسی فایلها و دایرکتوریها، کانفیگ درست پکیج منیجر، کانفیگ فایروال، کانفیگ audit logging، غیر فعال کردن قابلیتهایی که استفاده نمیشه و برخی موارد دیگه که از حوصلهی این مستند خارجه. یه ابزار بهتون معرفی میکنم به اسم Lynis که کمکتون میکنه تا سرور لینوکسی خودتون رو Audit کنید و ببنید که الان تو چه وضعیتی از hardening قرار دارید.
موضوع بعدی Tuning سرور لینوکس هست که کارایی اون رو افزایش میده. مثلا اینکه تعداد فایل دیسکریپتورهای لینوکس رو بیشتر کنیم. حالا سوال پیش میاد اینکه چرا لینوکس به صورت پیشفرض این طوری کانفیگ نشده. دلیلش همینه که قبلا گفتم لینوکس برای استفادهی عمومی منتشر میشه ولی امکان این رو داره که به صورت کامل برای نیاز شما سفارشی بشه. برخی از آپشنها با توجه به نیازمندی که داریم کاملا میتونه از هم متفاوت باشه. مثلا تو یه پروژه من میزان time-wait رو افزایش دادم ولی تو یه پروژهی دیگه میزان اون رو کاهش دادم. پس خیلی از آپشنها به رفتار و نیاز ما بستگی داره.
همانطور که دیدید مواردی که باید تو لینوکس یاد بگیریم کم نیست. تازه اینا مواردی هست که به نظرم الزامی هست. کلی موضوع دیگه هست که خیلی میتونه مفید باشه ولی دیگه از حوصلهی این مستند خارج است. من نظرم اینه که هر چقدر برای لینوکس و یادگیری اون وقت بذارید بازم کمه. همیشه میتونید از لینوکس عمق بیشتری رو تجربه کنید و ازش یاد بگیرید. کلا شما هر چقدر شما لینوکس رو بهتر و بیشتر درک کرده باشید ابزارها و سرویسهای دیگه رو هم میتونید بهتر و راحتتر درک کنید. این موضوع به صورت کاملا ملموس تو استکهای بزرگ خودش رو نشون میده. مثلا وقتی دارید کوبرنتیز کانفیگ میکنید درک درستی از لینوکس خیلی میتونه تو رفع مشکلاتی که براتون پیش میاد کمک کنه.