گذرگاه آزاد
بازنویسی آزادانهی یک دنیای انحصار طلب
کرنل لینوکس و کامپایل کرنل
اخیرا ارائهای برای گروه کاربران لینوکس مشهد داشتم که با توجه به زحمتی که برای این آن کشیده شد، تصمیم گرفتم مطالب ارایه شده را در اینجا نیز منتشر کنم تا قابل استفاده برای سایرین باشد. همچنین اسلایدهای ارایهی مذکور در اسلایدشیر موجود بوده و مطالب زیر در قالب فایل PDF بر روی سرور مشهدلاگ وجود داشته و از طریق این لینک قابل دانلود میباشد.
هسته چیست؟
هسته بخش اصلی اکثر سیستمعاملهای مدرن است. برخی از سیستمهای عامل ابتدایی فاقد هسته بودند که در اینگونه سیستمها کاربر مستقیماً با سختافزار ارتباط برقرار مینمود. ارتباط مستقیم با سختافزار گرچه باعث افزایش سرعت شده و همچنین دست کاربر را برای برقراری هرگونه ارتباطی با سختافزارش باز میگذاشت، اما مشکلات بسیاری را به وجود میآورد. یک اشتباه از سوی کاربر و یا یکی از نرمافزارها، میتوانست سختافزار را دچار مشکل کند و همچنین مدیریت نرمافزارها برای استفاده از منابع سختافزاری بسیار پیچیده بود.
برای رفع اینگونه مشکلات، هستهی سیستمعامل به وجود آمد و به عنوان یک رابط بین کاربر و سختافزار طراحی و به یکی از اصلیترین و اساسیترین بخشهای سیستمهای عامل امروزی تبدیل شد.
وظایف هسته
برای رفع اینگونه مشکلات، هستهی سیستمعامل به وجود آمد و به عنوان یک رابط بین کاربر و سختافزار طراحی و به یکی از اصلیترین و اساسیترین بخشهای سیستمهای عامل امروزی تبدیل شد.
وظایف هسته
۱- مدیریت قطعات:
به جز RAM و CPU قطعات بسیاری به یک کامپیوتر متصل میشوند. از جمله کارتهای گرافیک، صدا، مودم، کارت شبکه و …) که هر یک به نحوی کار میکنند و هسته با استفاده از درایورهای مختلف از نحوهی کار آنها مطلع شده و قادر به برقرار ارتباط مناسب بین قطعات میشود. هر ارتباطی که با سختافزار صورت میگیرد باید از قواعد خاصی پیروی کند و هسته اطمینان پیدا میکند که این قواعد به درستی رعایت میشوند.
۲- مدیریت مموری (حافظه رم)
هر پروسهای که اجرا میشود، نیاز به مقدار معینی از حافظهی رم دارد. هسته اطمینان پیدا میکند که مقدار حافظهی مورد نیاز هر پروسه، به آن اختصاص داده شود. هسته همچنین باید از تداخل اطلاعات ذخیره شده در حافظه جلوگیری نماید تا اطلاعات مربوط به یک پروسه، توسط پروسهای دیگر دستکاری نشده و مشکلی برای پروسهها به وجود نیاید.
۳- مدیریت CPU
هسته برای اطمینان از اینکه هر پروسه مدت زمان لازم را برای استفاده از CPU در اختیار داشته باشد، پروسهها را اولویتبندی مینماید و زمان لازم را به هر پروسه اختصاص میدهد. این مدیریت تنها محدود به زمان نشده و عواملی مثل مجوزهای امنیتی هر پروسه، مالکیت (ownership) پروسه، ارتباطات بین پروسههای مختلف و … را شامل میشود.
۴- ارتباط بین کاربر و سختافزار
در نهایت کرنل وظیفه دارد بستری را برای دسترسی اطلاعات مختلف سختافزاری، منابع سیستم و … در اختیار برنامهنویسان و کاربران محیا نماید. برنامهنویسان میتوانند با استفاده از درخواستهای سیستمی (system calls) به این اطلاعات دسترسی پیدا کرده و در صورت نیاز تغییری در وضعیت سیستم خود به وجود آورند.
هسته لینوکس:
یکی از مهمترین بخشهای سیستمعامل لینوکس هستهی آن است و هستهی لینوکس، لینوکس است. بله... نام سیسنمعامل لینوکس از نام هستهی آن گرفته شده است.
پروژهی هستهی لینوکس در سال ۱۹۹۱ و توسط «لینوس توروالدز» ایجاد شد و هنوز هم توسط او مدیریت میشود. کرنل لینوکس پس از انتشار اولین نسخهی آن در سال ۱۹۹۴، به شدت گسترش پیدا کرد و گرچه عدهی انگشتشماری تصمیم میگیرند که چه کدهایی به هسته راه پیدا کند، اما اکنون بیش از صدها برنامهنویس برای هر نسخهی هسته کد مینویسند.
به هستهای که توسط تیم لینوس توروالدز منتشر میشود هستهی وانیلی (vanilla kernel) میگویند. پس از انتشار هر نسخه از کرنل وانیلی، توزیعهای لینوکس و پروژههای مختلف توسعهی کرنل، تغییرات مورد نظر خود را در هستهی وانیلی ایجاد کرده و برای کاربرانشان منتشر میکنند. این هستهها معمولاً شامل امکاناتی میشوند که کرنل وانیلی هنوز نمیخواهد آنها را پشتیبانی کند و یا به دلایلی پشتیبانی آنها را متوقف کرده است.
پروژهی هستهی لینوکس در سال ۱۹۹۱ و توسط «لینوس توروالدز» ایجاد شد و هنوز هم توسط او مدیریت میشود. کرنل لینوکس پس از انتشار اولین نسخهی آن در سال ۱۹۹۴، به شدت گسترش پیدا کرد و گرچه عدهی انگشتشماری تصمیم میگیرند که چه کدهایی به هسته راه پیدا کند، اما اکنون بیش از صدها برنامهنویس برای هر نسخهی هسته کد مینویسند.
به هستهای که توسط تیم لینوس توروالدز منتشر میشود هستهی وانیلی (vanilla kernel) میگویند. پس از انتشار هر نسخه از کرنل وانیلی، توزیعهای لینوکس و پروژههای مختلف توسعهی کرنل، تغییرات مورد نظر خود را در هستهی وانیلی ایجاد کرده و برای کاربرانشان منتشر میکنند. این هستهها معمولاً شامل امکاناتی میشوند که کرنل وانیلی هنوز نمیخواهد آنها را پشتیبانی کند و یا به دلایلی پشتیبانی آنها را متوقف کرده است.
چگونه هستهی لینوکس را کامپایل کنیم؟
۱- جمعآوری اطلاعات سختافزاری:
پیش از اینکه بتوانید کرنل خود را کامپایل کنید میبایست سختافزارهای سیستم خود را بشناسید. به طور معمول کسی دقیقاً نمیداند که از چه سختافزارهایی استفاده میکند. خوشبختانه لینوکس ابزارهای خوبی برای شناخت سختافزارهای سیستم دارد که در زیر به معرفی برخی از مهمترین آنها میپردازیم:
آ. اطلاعات حافظه رم:
برای دانستن اطلاعات حافظهی رم خود میتوانید از دستور زیر استفاده کنید:$ cat /proc/meminfo MemTotal: 2030260 kB MemFree: 230200 kB MemAvailable: 604200 kB Buffers: 93492 kB Cached: 506440 kB SwapCached: 8 kB Active: 1146284 kB Inactive: 533528 kB Active(anon): 975512 kB Inactive(anon): 220696 kB Active(file): 170772 kB Inactive(file): 312832 kB Unevictable: 14236 kB Mlocked: 14236 kB HighTotal: 1149700 kB HighFree: 101624 kB LowTotal: 880560 kB LowFree: 128576 kB SwapTotal: 2157564 kB SwapFree: 2157500 kB …
همینطور که مشاهده میکنید، مقدار رم سیستم شما و سایر اطلاعات در رابطه با حافظهی خود را میتوانید در خروجی ببینید. برای به دست آوردن اطلاعت رم همچنین میتوان از دستور free استفاده نمود.
ب. اطلاعات CPU
مشابه رم، برای به دست آوردن اطلاعات مربوط به CPU میتوان از دستور زیر استفاده کرد:
$ cat /proc/cpuinfo processor : 0 vendor_id : GenuineIntel cpu family : 6 model : 23 model name : Intel(R) Core(TM)2 Duo CPU T6500 @ 2.10GHz stepping : 10 microcode : 0xa07 cpu MHz : 1200.000 cache size : 2048 KB physical id : 0 siblings : 2 core id : 0 cpu cores : 2 apicid : 0 initial apicid : 0 fdiv_bug : no f00f_bug : no coma_bug : no fpu : yes fpu_exception : yes cpuid level : 13 wp : yes flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe nx lm constant_tsc arch_perfmon pebs bts aperfmperf pni dtes64 monitor ds_cpl est tm2 ssse3 cx16 xtpr pdcm sse4_1 xsave lahf_lm dtherm bogomips : 4190.70 clflush size : 64 cache_alignment : 64 address sizes : 36 bits physical, 48 bits virtual power management:
همانطور که میبینید، اطلاعات کاملی در رابطه با سیپییو توسط این دستور به دست میآید.
پ. قطعات PCI
برای اطلاع از قطعات PCI متصل شده به دستگاهتان میتوانید از دستور زیر استفاده کنید:
$ lspci -k 00:00.0 Host bridge: Intel Corporation Mobile 4 Series Chipset Memory Controller Hub (rev 07) Subsystem: Dell Device 02aa Kernel driver in use: agpgart-intel Kernel modules: intel_agp 00:02.0 VGA compatible controller: Intel Corporation Mobile 4 Series Chipset Integrated Graphics Controller (rev 07) Subsystem: Dell Device 02aa Kernel driver in use: i915 Kernel modules: i915 00:02.1 Display controller: Intel Corporation Mobile 4 Series Chipset Integrated Graphics Controller (rev 07) Subsystem: Dell Device 02aa 00:1a.0 USB controller: Intel Corporation 82801I (ICH9 Family) USB UHCI Controller #4 (rev 03) Subsystem: Dell Device 02aa Kernel driver in use: uhci_hcd Kernel modules: uhci_hcd 00:1a.1 USB controller: Intel Corporation 82801I (ICH9 Family) USB UHCI Controller #5 (rev 03) Subsystem: Dell Device 02aa Kernel driver in use: uhci_hcd Kernel modules: uhci_hcd 00:1a.2 USB controller: Intel Corporation 82801I (ICH9 Family) USB UHCI Controller #6 (rev 03) Subsystem: Dell Device 02aa Kernel driver in use: uhci_hcd Kernel modules: uhci_hcd 00:1a.7 USB controller: Intel Corporation 82801I (ICH9 Family) USB2 EHCI Controller #2 (rev 03) Subsystem: Dell Device 02aa Kernel driver in use: ehci-pci Kernel modules: ehci_pci 00:1b.0 Audio device: Intel Corporation 82801I (ICH9 Family) HD Audio Controller (rev 03) Subsystem: Dell Device 02aa Kernel driver in use: snd_hda_intel Kernel modules: snd_hda_intel 00:1c.0 PCI bridge: Intel Corporation 82801I (ICH9 Family) PCI Express Port 1 (rev 03) Kernel driver in use: pcieport Kernel modules: shpchp 00:1c.1 PCI bridge: Intel Corporation 82801I (ICH9 Family) PCI Express Port 2 (rev 03) Kernel driver in use: pcieport Kernel modules: shpchp 00:1c.2 PCI bridge: Intel Corporation 82801I (ICH9 Family) PCI Express Port 3 (rev 03) Kernel driver in use: pcieport Kernel modules: shpchp 00:1c.4 PCI bridge: Intel Corporation 82801I (ICH9 Family) PCI Express Port 5 (rev 03) Kernel driver in use: pcieport Kernel modules: shpchp 00:1d.0 USB controller: Intel Corporation 82801I (ICH9 Family) USB UHCI Controller #1 (rev 03) Subsystem: Dell Device 02aa Kernel driver in use: uhci_hcd Kernel modules: uhci_hcd 00:1d.1 USB controller: Intel Corporation 82801I (ICH9 Family) USB UHCI Controller #2 (rev 03) Subsystem: Dell Device 02aa Kernel driver in use: uhci_hcd Kernel modules: uhci_hcd 00:1d.2 USB controller: Intel Corporation 82801I (ICH9 Family) USB UHCI Controller #3 (rev 03) Subsystem: Dell Device 02aa Kernel driver in use: uhci_hcd Kernel modules: uhci_hcd 00:1d.7 USB controller: Intel Corporation 82801I (ICH9 Family) USB2 EHCI Controller #1 (rev 03) Subsystem: Dell Device 02aa Kernel driver in use: ehci-pci Kernel modules: ehci_pci 00:1e.0 PCI bridge: Intel Corporation 82801 Mobile PCI Bridge (rev 93) 00:1f.0 ISA bridge: Intel Corporation ICH9M LPC Interface Controller (rev 03) Subsystem: Dell Device 02aa Kernel driver in use: lpc_ich Kernel modules: lpc_ich 00:1f.2 IDE interface: Intel Corporation 82801IBM/IEM (ICH9M/ICH9M-E) 2 port SATA Controller [IDE mode] (rev 03) Subsystem: Dell Device 02aa Kernel driver in use: ata_piix Kernel modules: ata_piix, pata_acpi, ata_generic 00:1f.3 SMBus: Intel Corporation 82801I (ICH9 Family) SMBus Controller (rev 03) Subsystem: Dell Device 02aa Kernel driver in use: i801_smbus Kernel modules: i2c_i801 00:1f.5 IDE interface: Intel Corporation 82801IBM/IEM (ICH9M/ICH9M-E) 2 port SATA Controller [IDE mode] (rev 03) Subsystem: Dell Device 02aa Kernel driver in use: ata_piix Kernel modules: ata_piix, pata_acpi, ata_generic 09:00.0 Ethernet controller: Marvell Technology Group Ltd. 88E8040 PCI-E Fast Ethernet Controller (rev 13) Subsystem: Dell Device 02aa Kernel driver in use: sky2 Kernel modules: sky2 0c:00.0 Network controller: Broadcom Corporation BCM4312 802.11b/g LP-PHY (rev 01) Subsystem: Dell Wireless 1397 WLAN Mini-Card Kernel driver in use: b43-pci-bridge Kernel modules: ssb
این دستور اطلاعات جامعی در رابطه با سختافزار شما میدهد. مهمترین این اطلاعات نام درایور و ماژولی که در هستهی فعلی برای کار با هر سختافزار استفاده شده است، میباشد. این اطلاعات یافتن درایور مورد نیاز هر سختافزار را به هنگام تنظیم هسته برای شما سادهتر میکند.
ت. قطعات USB
دستور زیر اطلاعات مورد نیاز در مورد قطعات usb متصل به دستگاه را به شما میدهد:
$ lsusb Bus 005 Device 003: ID 125f:a94a A-DATA Technology Co., Ltd. Bus 005 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub Bus 008 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub Bus 007 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub Bus 006 Device 002: ID 1bcf:0005 Sunplus Innovation Technology Inc. Bus 006 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub Bus 004 Device 004: ID 05ca:180a Ricoh Co., Ltd Bus 004 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub Bus 001 Device 004: ID 413c:8162 Dell Computer Corp. Integrated Touchpad [Synaptics] Bus 001 Device 003: ID 413c:8161 Dell Computer Corp. Integrated Keyboard Bus 001 Device 002: ID 0a5c:4500 Broadcom Corp. BCM2046B1 USB 2.0 Hub (part of BCM2046 Bluetooth) Bus 001 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
۲- ماژولهای هسته:
۱- ماژول چیست؟
هسته فایلی است که توسط راهانداز (boot loader) در مموری قرار میگیرد، اما لینوکس توانایی بارگزاری ماژولهای هسته را نیز در حافظه، دارد.
ماژول هسته، بخشی از هسته است که میتواند به صورت پویا در حافظه قرار بگیرد و یا از حافظه خارج شود. یعنی شما میتوانید هستهای داشته باشید که از یک سختافزار خاص پشتیبانی کند اما تا زمانی که واقعاً به آن سختافزار نیازی نباشد آن را در حافظه قرار ندهد. این کار باعث کوچکتر شدن حجم هسته میشود.
ماژولها معمولاً برای قطعات قابل شدن (مثل دستگاههای USB) استفاده میشوند، ولی توزیعهای مختلف لینوکس که قصد پشتیبانی سختافزارهای متفاوت کاربرانشان را دارند معمولاً درایور بسیاری از سختافزارها را به صورت ماژول تنظیم میکنند و به هنگام بالاآمدن سیستم، ماژولهای مورد نیاز را در حافظه بارگزاری میکنند. لینوکس به صورت خودکار سختافزارهای سیستم را شناسایی نموده و ماژول درایور مورد نیاز هر کدام را بارگزاری میکند.
۲- Initial Ram Disk
مهم است بدانیم که ماژولها خود در جایی ذخیره شده و از آنجا بارگزاری میشوند. بنابراین شما نمیتوانید ماژول درایور یک دیسک سخت را در همان دیسک سخت قرار دهید و انتظار داشته باشید که لینوکس آن را بارگزاری نماید. و یا قراردادن ماژول درایور سیستمفایلی ext3 در یک پارتیشن ext3 کار نادرستی است. برای اینکه بتوان از چنین ماژولهایی میبایست از initial ram disk یا initrd استفاده کرد. Initrd فایلیست که چنین ماژولهایی را در خود جا میدهد و توسط راهانداز در حافظه قرار میگیرد تا هسته بتواند در صورت نیاز از این فایل استفاده کند.
لازم به ذکر است به جز مواردی که نیاز به پشتیبانی از طیف زیادی از سختافزارها وجود داشته باشد، هستهای که خوب کامپایل شود، نیازی به initrd ندارد. گرچه هستهی لینوکس به صورت پیشفرض قادر به ایجاد فایل initrd میباشد.
3- کار با ماژولها
مهمترین دستورات برای کار با ماژولها lsmod، rmmod و modprobe هستند. برای لیست کردن ماژولهایی که در حال حاضر برای سیستم شما بارگزاری شدهاند از دستور lsmod استفاده میشود:
$ lsmod Module Size Used by fuse 71217 3 joydev 7691 0 arc4 1596 2 b43 347917 0 bcma 31394 1 b43 mac80211 446215 1 b43 cfg80211 388522 2 b43,mac80211 rng_core 2888 1 b43 mousedev 9164 0 ums_realtek 6579 0 hid_generic 781 0 pcspkr 1519 0 iTCO_wdt 4599 0 gpio_ich 3633 0 iTCO_vendor_support 1577 1 iTCO_wdt dell_wmi 1249 0 dell_laptop 11305 0 sparse_keymap 2742 1 dell_wmi led_class 2699 2 b43,dell_laptop rfkill 12995 3 cfg80211,dell_laptop
خروجی این دستور نام ماژول، فضایی که ماژول مصرف میکنند و تعداد/نام ماژولهایی که به آن وابستهاند را نمایش میدهد.
برای این که یک ماژول را از حافظه خارج کنید، ابتدا مطمئن شوید که ماژول دیگری به آن وابسته نیست و سپس به صورت زیر عمل کنید:
# rmmod iTCO_wdt
و برای بارگزاری یک ماژول:
# modprobe iTCO_wdt
یکی از فواید استفاده از ماژولها در هسته این است که میتوان در صورت نیاز برخی پارامترهای یک ماژول را به هنگام بارگزاری آن تغییر داده و نحوهی کار ماژول را با استفاده از پارامترهایی که هر ماژول پشتیبانی میکند، تحت تأثیر قرار داد. با دستور زیر میتوان اطلاعاتی دربارهی هر ماژول به دست آورد:
$ modinfo uvcvideo filename: /lib/modules/3.14.3-1-ARCH/kernel/drivers/media/usb/uvc/uvcvideo.ko.gz version: 1.1.1 license: GPL description: USB Video Class driver author: Laurent Pinchartsrcversion: B6EAA5A26874F36D613FD21 ... depends: videodev,videobuf2-core,usbcore,media,videobuf2-vmalloc intree: Y vermagic: 3.14.3-1-ARCH SMP preempt mod_unload modversions 686 parm: clock:Video buffers timestamp clock parm: nodrop:Don't drop incomplete frames (uint) parm: quirks:Forced device quirks (uint) parm: trace:Trace level bitmask (uint) parm: timeout:Streaming control requests timeout (uint)
# modprobe uvcvideo nodrop=1
# cat /etc/modprobe.d/uvcvideo options uvcvideo nodrop=1
3- تنظیم هسته
همیشه گفته میشود که کامپایل کردن هسته زمان بسیاری را میبرد. اما بیشتر زمانی که برای کامپایل هسته سپری میشود، به هنگام تنظیم کردن آن است. خوشبختانه تنظیمات قابل ذخیرهسازی و استفادهی مجدد بوده و نیازی نیست که هر بار مجدداً زمان زیادی را برای تنظیم هسته سپری کنیم.
برای تنظیم هسته بد نیست نگاهی به وبسایت آقای «Pappy McFae» به آدرس http://www.kernel-seeds.org بیاندازید. ایشان یکی از کاربران توزیع جنتو هستند که منابع خوبی برای توضیح تنظیمات مختلف کرنل ایجاد کردهاند.
این ابزار کاری بیش از ویرایش یک فایل متنی به نام config. را که در محل سورس کرنل ایجاد میشود، بر عهده ندارد. با این حال ویرایش دستی این فایل به هیچ وجه توصیه نمیشود و شما میتوانید اگر قبلاً یک فایل config. را ایجاد کردهاید پیش از تنظیم مجدد از آن بکآپ بگیرید تا مطمئن شوید مشکلی به وجود نخواهد آمد.
از هستهی لینوکس ورژن ۲.۶.۳۲ به بعد، آپشنهای localmodconfig و localyesconfig به هسته اضافه شده است. همانطور که پیشتر گفته شد هسته به صورت پیشفرض سختافزار را شناسایی و ماژولهای مورد نیاز را لود میکند. با استفاده از آپشن localmodconfig میتوان سختافزارهای شناسایی شده را به عنوان ماژول در هسته تنظیم کرد تا فایل config. ما چیزی برای شروع تنظیمات داشته باشد.
آ. ابزار تنظیم هسته
هسته به صورت پیشفرض دارای ابزاری برای تنظیم آن است. اگر به محل سورس هستهی خود بر روی هارد دیسکتان بروید و دستور make menuconfig را وارد کنید. ابزار تنظیم هسته اجرا خواهد شد و شما با گزینههای بسیار زیادی برای تنظیم بخشها و قابلیتهای مختلف هسته روبرو خواهید شد.این ابزار کاری بیش از ویرایش یک فایل متنی به نام config. را که در محل سورس کرنل ایجاد میشود، بر عهده ندارد. با این حال ویرایش دستی این فایل به هیچ وجه توصیه نمیشود و شما میتوانید اگر قبلاً یک فایل config. را ایجاد کردهاید پیش از تنظیم مجدد از آن بکآپ بگیرید تا مطمئن شوید مشکلی به وجود نخواهد آمد.
ب. چند نکته پیش از تنظیم کردن
۱.از هستهی لینوکس ورژن ۲.۶.۳۲ به بعد، آپشنهای localmodconfig و localyesconfig به هسته اضافه شده است. همانطور که پیشتر گفته شد هسته به صورت پیشفرض سختافزار را شناسایی و ماژولهای مورد نیاز را لود میکند. با استفاده از آپشن localmodconfig میتوان سختافزارهای شناسایی شده را به عنوان ماژول در هسته تنظیم کرد تا فایل config. ما چیزی برای شروع تنظیمات داشته باشد.
# make localmodconfig
با استفاده از localyesconfig نیز میتوان سختافزارهای شناسایی شده را در خود هسته کامپایل نمود.
۲.
به هنگام کار با ابزار تنظیم هسته، میتوان از کلید ? برای مشاهدهی راهنمای هر گزینه استفاده کرد. و همچنین برای جستجوی یک عبارت خاص میتوان از کلید / استفاده نمود.
۴- کامپایل هسته
پس از اینکه کار تنظیم هسته شما تمام شد با استفاده از گزینه exit و تأیید اینکه قصد ذخیرهسازی تنظیمات را دارید به محیط ترمینال خود برگشته و برای کامپایل هسته دستور زیر را وارد کنید.
$ make
کامپایل هسته با توجه به قدرت سیپییو شما و نحوهی تنظیم شما ممکن است از ۱۵ دقیقه تا بیش از دو ساعت به طول انجامد. پس از اتمام این مرحله کرنل کامپایل شده در با توجه به معماری سیستم شما (۶۴ بیتی یا ۳۲ بیتی) در هارد دیسک شما ذخیره میشود. به عنوان مثال در یک سیستم ۳۲ بیتی در آدرس arch/i386/boot/bzImage میتوان هسته کامپایل شده را یافت.
به صورت پیشفرض دستور make مراحل کامپایل را یک به یک انجام میدهد. با این حال بیشتر سیستمها دارای سیپییوهای چند هستهای میباشند که قابلیت کامپایل موازی را به کاربر میدهد. برای اینکه از این قابلیت استفاده کنید میتوانید با استفاده از دستور پارامتر j- و تعداد هستههای سیپییو خود اجرای موازی این دستور را ممکن ساخته و سرعت کامپایل هسته را افزایش دهید. به عنوان مثال برای یک سیپییو ۴ هستهای میتوان دستور زیر را اجرا کرد:
$ make -j4
پس از کامپایل هسته، نوبت به نصب ماژولها میشود. دستور زیر را اجرا کنید تا ماژولها در محل مناسب نصب شوند. (lib/modules/[kernelversion]/)
# make modules_install
در نهایت هستهی کامپایل شده را به آدرس boot/ کپی کنید.
# cp arch/boot/i386/bzImage /boot/kernel-3
۵- تنظیم گراب
برای تنظیم گراب کافی است یک بار دستور آپدیت تنظیمات گراب را وارد نمایید تا گراب به صورت خودکار کرنل جدید را شناسایی و آن را در منوی راهانداز شما قرار دهد:
# grub-mkconfig -o /boot/grub/grub.cfg
۶- کامپایل مجدد هسته
تصور کنید که هسته شما با موفقیت کامپایل شده و با رضایت از آن استفاده میکنید اما پس از مدتی نیازمند به روز رسانی هسته خود میشوید. در این حالت نیازی به اجرای مجدد همهی موارد بالا نیست و میتوان با چند دستور ساده تنظیمات هسته فعلی خود را استفاده کنید. ابتدا به سورس هستهی خود رفته و دستور زیر را اجرا کنید:# zcat /proc/config.gz .config
فایل config.gz به صورت پیشفرض در هسته کامپایل شده و شامل تنظیمات هسته شما میباشد. با اجرای این دستور میتوانید تنظیمات قبلی ا به شاخهی هستهی جدید خود کپی کنید و سپس با استفاده از دستور زیر از آن بهرهبرده کنید.
$ make oldconfig
اجرای این دستور باعث میشود که فقط در مورد تنظیماتی که تغییر کردهاند شما سؤال کند.
پس دستور بالا مراحل make و make modules_install را انجام داده و گراب خود را به روز رسانی کنید.
پس دستور بالا مراحل make و make modules_install را انجام داده و گراب خود را به روز رسانی کنید.
زمانبندی پروسهها در لینوکس - بخش دوم: cron
در بخش اول، فرمانهای sleep و at رو توضیح دادم، و در این بخش، به معرفی cron، یکی از قدرتمندترین ابزارهای زمانبندی خواهم پرداخت.
Cron چیست؟
Cron یک Daemon است که وظایفی رو که از طریق دستور crontab دریافت میکنه، در زمانهای مشخصشده اجرا میکنه. در واقع کار cron اینه که هر دقیقه بیدار شه و بررسی کنه که آیا در crontab کاربرهای مختلف کاری (cron-job) هست که انجام بده؟
(توجه کنید که crontab هم نام لیستی از cron-jobهاست و هم نام فرمانی که از طریق آن لیست کارها مشخص و ویرایش میشود.)
به عنوان مثال ممکنه یک پدر قصد داشته باشه دسترسی به اینترنت رو هر شب ساعت ۹ قطع کنه. و یا اینکه یک مدیر بخواد دسترسی به نرمافزارهای مسنجر رو در طی ساعات کاری برای کارمنداش غیر ممکن کنه. و یا اینکه ممکنه کسی بخواد در زمانی که جلوی سیستمش حضور نداره، یک سری از لاگهای سیستم روزی یک بار براش میل بشه.
فایل /etc/crontab
Cron تمام این کارها رو از طریق بررسی فایلهای تنظیمات خاصش به نام crontabها انجام میده. به این معنی که ما باید crontabها رو تنظیم کنیم تا cron محتویات اونها رو بررسی و دستورات درون آنها رو در زمان مشخص شده انجام بده. اولین و مرسومترین فایل تنظیمات /etc/crontab هست. هر سطر دستور در این فایل از یک الگوی کلی به شکل زیر پیروی میکنه:
در سطر اول در ماههای می، جولای و نوامبر هر ده دقیقه command1 اجرا میشه. در سطر دوم هم command2 در روزهای دوشنبه تا جمعه و در ساعات ۹ صبج تا ۶ بعد از ظهر هر ساعت اجرا میشه.
run-parts:
با اینکه زمانبندی دستورات توسط فایل /etc/crontab یک کار کاملا عملیاست، اکثر توزیعهای لینوکس در حال حاضر از اسکریپتی به نام run-parts برای اجرای دستورات استفاده میکنن. به عنوان مثال یک نمونه از فایل /etc/crontab در توزیع fedora رو ببینید:
درواقع کاری که اسکریپت run-parts میکنه اینه که اسکریپتهای قابل اجرا رو در یک فولدر اجرا میکنه. مثلا اگر شما قصد داشته باشید که اسکریپتتون هفتهای یک بار اجرا بشه، فقط کافیه اون رو توی فولدر /etc/cron.weekly کپی کنید.
استفاده از این روش خیلی راحته اما، دیگه امکان زمانبندی دقیق وجود نداره و طبیعتا با اینروش نمیشه هر شب ساعت ۹ اینترنت رو قطع کرد و صبح وصلش کرد.
Cron برای همه:
نیازی به این نیست که برای همهی دستورها از /etc/crontab و کاربر ریشه استفاده کرد. هر کاربر دیگهای هم میتونه یک فایل crontab مخصوص به خودش داشته باشه و دستوراتی رو که اجازهی اجراشون رو داره، به وسیلهی این فایل زمانبندی کنه. این فایل معمولا در فولدر /var/spool/cron/crontab و به نام کاربر ذخیره میشه و فرمتش هم مثل /etc/crontab هست با این تفاوت که ستون کاربر وجود نداره.
البته کاربرها اجازهی ویرایش مستقیم فایل crontab خودشون رو ندارن و برای اینکار باید از دستور crontab -e استفاده کنن.
کاربر ریشه میتونه تعیین کنه که کدام کاربرها حق استفاده از دستور crontab رو داشته باشن. این کار با استفاده از دو فایل /etc/cron.allow و /etc/cron.deny انجام میشه و همینطور که از نام فایلها پیداست، اگر اسم یک کاربر در فایل /etc/cron.allow باشه اون کاربر اجازهی دسترسی به crontab رو داره و اگر اسم کاربر در /etc/cron.deny باشه اون کاربر اجازهی دسترسی به crontab رو نداره. البته مسلما بعد از انجام تغییرات در این فایلها، باید یک بار logout و دوباره login کنید تا تغییرات اعمال بشه.
چند نکته:
دستوراتی که به cron میدین بهتره که شامل محل دقیق دستور باشه چرا که cron فقط توی شاخههای /usr/bin و /bin به دنبال دستورها میگرده.
همینطور معمولا خروجی استاندارد و ارورهای یک دستور رو به یک فایل redirect میکنن تا بعدا بشه خروجی رو دید:
الان زمان اون رسیده که خودتون cron رو امتحان کنید و ببینید چه کارایی ازش بر میاد.
-- برای خوندن قسمت اول این نوشته اینجا رو کلیک کنید.
Cron چیست؟
Cron یک Daemon است که وظایفی رو که از طریق دستور crontab دریافت میکنه، در زمانهای مشخصشده اجرا میکنه. در واقع کار cron اینه که هر دقیقه بیدار شه و بررسی کنه که آیا در crontab کاربرهای مختلف کاری (cron-job) هست که انجام بده؟
(توجه کنید که crontab هم نام لیستی از cron-jobهاست و هم نام فرمانی که از طریق آن لیست کارها مشخص و ویرایش میشود.)
به عنوان مثال ممکنه یک پدر قصد داشته باشه دسترسی به اینترنت رو هر شب ساعت ۹ قطع کنه. و یا اینکه یک مدیر بخواد دسترسی به نرمافزارهای مسنجر رو در طی ساعات کاری برای کارمنداش غیر ممکن کنه. و یا اینکه ممکنه کسی بخواد در زمانی که جلوی سیستمش حضور نداره، یک سری از لاگهای سیستم روزی یک بار براش میل بشه.
فایل /etc/crontab
Cron تمام این کارها رو از طریق بررسی فایلهای تنظیمات خاصش به نام crontabها انجام میده. به این معنی که ما باید crontabها رو تنظیم کنیم تا cron محتویات اونها رو بررسی و دستورات درون آنها رو در زمان مشخص شده انجام بده. اولین و مرسومترین فایل تنظیمات /etc/crontab هست. هر سطر دستور در این فایل از یک الگوی کلی به شکل زیر پیروی میکنه:
دقیقه عددی بین ۰ و ۵۹، ساعت بین ۰ تا ۲۳ و روز در ماه بین ۱ تا ۳۱ میباشد. در مورد ماه و روز هفته هم میشه از سه حرف اول روز یا ماه استفاده کرد مثل: feb, jan, mon, wed و هم میشه از اعداد استفاده کرد. (یکشنبه: ۰، دوشنبه: ۱ تا آخر)
در هر یک از ستونهای مربوط به زمان یکی از حالتهای زیر ممکنه نوشته بشه:
*، به معنی هر زمانی (مثلا گذاشتن * در ستون دقیقه یعنی تمام دقایق)
یک عدد
چند عدد که با کاما جدا شده اند. (5,7,13)
یک بازه (5-10)
یک بازه به همراه پله ( 20/2-10 = 10, 12, 14, 16, 18, 20 و 5/* یعنی 5, 10, 15, ...)
به عنوان مثال دو سطر زیر رو در نظر بگیرید:
در هر یک از ستونهای مربوط به زمان یکی از حالتهای زیر ممکنه نوشته بشه:
*، به معنی هر زمانی (مثلا گذاشتن * در ستون دقیقه یعنی تمام دقایق)
یک عدد
چند عدد که با کاما جدا شده اند. (5,7,13)
یک بازه (5-10)
یک بازه به همراه پله ( 20/2-10 = 10, 12, 14, 16, 18, 20 و 5/* یعنی 5, 10, 15, ...)
به عنوان مثال دو سطر زیر رو در نظر بگیرید:
*/10 * * 5,7,11 * root command1 0 9-18 * * 1-5 root command2
run-parts:
با اینکه زمانبندی دستورات توسط فایل /etc/crontab یک کار کاملا عملیاست، اکثر توزیعهای لینوکس در حال حاضر از اسکریپتی به نام run-parts برای اجرای دستورات استفاده میکنن. به عنوان مثال یک نمونه از فایل /etc/crontab در توزیع fedora رو ببینید:
01 * * * * root run-parts /etc/cron.hourly 02 4 * * * root run-parts /etc/cron.daily 22 4 * * 0 root run-parts /etc/cron.weekly 42 4 1 * * root run-parts /etc/cron.monthly
استفاده از این روش خیلی راحته اما، دیگه امکان زمانبندی دقیق وجود نداره و طبیعتا با اینروش نمیشه هر شب ساعت ۹ اینترنت رو قطع کرد و صبح وصلش کرد.
Cron برای همه:
نیازی به این نیست که برای همهی دستورها از /etc/crontab و کاربر ریشه استفاده کرد. هر کاربر دیگهای هم میتونه یک فایل crontab مخصوص به خودش داشته باشه و دستوراتی رو که اجازهی اجراشون رو داره، به وسیلهی این فایل زمانبندی کنه. این فایل معمولا در فولدر /var/spool/cron/crontab و به نام کاربر ذخیره میشه و فرمتش هم مثل /etc/crontab هست با این تفاوت که ستون کاربر وجود نداره.
البته کاربرها اجازهی ویرایش مستقیم فایل crontab خودشون رو ندارن و برای اینکار باید از دستور crontab -e استفاده کنن.
کاربر ریشه میتونه تعیین کنه که کدام کاربرها حق استفاده از دستور crontab رو داشته باشن. این کار با استفاده از دو فایل /etc/cron.allow و /etc/cron.deny انجام میشه و همینطور که از نام فایلها پیداست، اگر اسم یک کاربر در فایل /etc/cron.allow باشه اون کاربر اجازهی دسترسی به crontab رو داره و اگر اسم کاربر در /etc/cron.deny باشه اون کاربر اجازهی دسترسی به crontab رو نداره. البته مسلما بعد از انجام تغییرات در این فایلها، باید یک بار logout و دوباره login کنید تا تغییرات اعمال بشه.
چند نکته:
دستوراتی که به cron میدین بهتره که شامل محل دقیق دستور باشه چرا که cron فقط توی شاخههای /usr/bin و /bin به دنبال دستورها میگرده.
همینطور معمولا خروجی استاندارد و ارورهای یک دستور رو به یک فایل redirect میکنن تا بعدا بشه خروجی رو دید:
15 6 * * * /usr/bin/someprog > /tmp/someprog.out 2>&1
-- برای خوندن قسمت اول این نوشته اینجا رو کلیک کنید.
زمانبندی پروسهها در لینوکس - بخش اول: فرمانهای sleep و at
شاید خیلی خوب میشد اگر ما هر زمان که نیاز داشتیم، میتونستیم به سیستم خودمون دسترسی پیدا کنیم و فرمانهای لازم رو بهش بدیم؛ اما متاسفانه هیچکس چنین تواناییای رو نداره. مدتهای زیادی آدم به دور از سیستم خودش است و بد نیست به جای بیکار گذاشتن سیستم در این مدت، لیست کارهایی رو که در زمانهای مختلف باید انجام بده رو بهش بدیم و اون خودش کارها رو انجام بده. اینجوری هم ما به کار و زندگیمون میرسیم و هم سیستممون!!!
من قصد دارم در طی دو پست سه روش مرسوم برای زمانبندی پروسههای مختلف رو توضیح بدم. در پست اول به فرمانهای sleep و at میپردازم و در پست دوم شما رو با قدرت cron آشنا میکنم.
۱- فرمان sleep:
این فرمان کار زیادی انجام نمیده و و اگر نگاهی به راهنمای اون بندازین میبینین که راهنمای بسیار کوتاهیه. در واقع کاری که sleep انجام میده اینه که هر چقدر که ما ازش بخوایم صبر میکنه.
تصور کنید مشغول فیلم دیدن هستید و باید بعد از نیم ساعت سری به غذای روی گاز هم بزنید. فرمان زیر رو وارد میکنید و بعد از نیم ساعت سیستم به شما یادآوری میکنه که به گاز سر بزنید
من قصد دارم در طی دو پست سه روش مرسوم برای زمانبندی پروسههای مختلف رو توضیح بدم. در پست اول به فرمانهای sleep و at میپردازم و در پست دوم شما رو با قدرت cron آشنا میکنم.
۱- فرمان sleep:
این فرمان کار زیادی انجام نمیده و و اگر نگاهی به راهنمای اون بندازین میبینین که راهنمای بسیار کوتاهیه. در واقع کاری که sleep انجام میده اینه که هر چقدر که ما ازش بخوایم صبر میکنه.
تصور کنید مشغول فیلم دیدن هستید و باید بعد از نیم ساعت سری به غذای روی گاز هم بزنید. فرمان زیر رو وارد میکنید و بعد از نیم ساعت سیستم به شما یادآوری میکنه که به گاز سر بزنید
$ (sleep 1800; notify-send "You should check the oven...\!") &
۲- فرمان at:
برای اینکه به سیستم بگیم در یک زمان خاص چند فرمان خاص رو اجرا کن، از فرمان at استفاده میکنیم. روش استفاده از این دستور بسیار ساده است.
به چند روش مختلف میشه زمان مورد نظرتون رو به این فرمان بدید. به عنوان مثال اگر قصد دارید ساعت ۳ بعد از ظهر به یکی از دوستانتون زنگ بزنید:
برای اینکه به سیستم بگیم در یک زمان خاص چند فرمان خاص رو اجرا کن، از فرمان at استفاده میکنیم. روش استفاده از این دستور بسیار ساده است.
به چند روش مختلف میشه زمان مورد نظرتون رو به این فرمان بدید. به عنوان مثال اگر قصد دارید ساعت ۳ بعد از ظهر به یکی از دوستانتون زنگ بزنید:
$ at 15:00 at> notify-send "Remember to call your friend...\!" at> <eot>
زمانی که لیست فرمانهایی که قصد انجامشان را دارید تمام شد، با فشردن کلیدهای ctrl + D و یا نوشتن عبارت <eot> میتونید به نوشتن خاتمه دهید.
اگر قرار باشه فردا ساعت ۳ بعد از ظهر به دوستتون زنگ بزنید از فرمان زیر استفاده میکنید:
اگر قرار باشه فردا ساعت ۳ بعد از ظهر به دوستتون زنگ بزنید از فرمان زیر استفاده میکنید:
$ at 15:00 tomorrow
و به همین شکل اگر قرار باشه کاری رو در نیمهشب ۱۷ جولای انجام بدین:
$ at midnight July 17
و همینطور اگر میخواهید سال دیگه تولد دوستتون بهتون یادآوری بشه:
$ at 09:00 July 04 2011
فکر میکنم به خوبی متوجه شده باشید که چجوری میشه از فرمان at استفاده کرد. برای دیدن لیست کارهای زمانبندی شده میتونید از فرمان زیر استفاده کنید:
$ atq
البته به جای فرمان بالا از at -l هم میتوان استفاده کرد!
همچنین اگر قصد دارید یکی از فعالیتها(به عنوان مثال فعالیت شماره ۳) رو پاک کنید، باید از فرمان زیر استفاده کنید:
همچنین اگر قصد دارید یکی از فعالیتها(به عنوان مثال فعالیت شماره ۳) رو پاک کنید، باید از فرمان زیر استفاده کنید:
$ atrm 3
که به جای دستور بالا میتوان از at -r3 استفاده کرد.
منتظر پست بعد و روشهای حرفهایتر زمانبندی پروسهها باشید.
-- برای مطالعهی قسمت دوم این نوشته اینجا رو کلیک کنید.
منتظر پست بعد و روشهای حرفهایتر زمانبندی پروسهها باشید.
-- برای مطالعهی قسمت دوم این نوشته اینجا رو کلیک کنید.
استفاده از سرویسهای مختلف گوگل از طریق ترمینال
اگر از گوگل و سرویسهای مختلف اون استفاده میکنید و در عین حال جزو طرفدارای لینوکس و ترمینالش هم هستید، احتمالا خیلی خوشحال خواهید شد اگه بدونید نرمافزاری برای انجام اعمال مختلف در سرویسهای گوگل از طریق ترمینال نوشته شده است.
نرمافزار googleCL نرمافزاریه که به زبان پایتون و با استفاده از Gdata APIs که خود گوگل اونها رو ارائه داده نوشته شده و در هر سه پلتفرم لینوکس، ویندوز و MacOS قابل استفاده است. این نرمافزار در حال حاضر تنها برای بعضی سرویسهای گوگل که API اونها در دسترس قرار داره، قابل استفاده است. این سرویسها شامل بلاگر، Calendar، Contacts، Docs، Picasa و یوتیوب میشه. شاید اگر گوگل API سرویسهای دیگهاش رو هم ارائه بده این نرمافزار کاربرد بیشتری داشته باشه.
نحوهی نصب و استفاده از این نرمافزار بسیار ساده است. در بعضی توزیعهای لینوکس این نرمافزار در ریپوزیتوری توزیع وجود داره و نیازی به کمپایل اون نیست. با این حال برای کمپایل کردن اون میتونید به روش زیر عمل کنید:
۱- دانلود کتابخانه gdata-python-client
۲- دانلود نرمافزار googleCL
۳- خارجکردن فایلها از حالت فشرده و نصب اونها با استفاده از فرمانهای زیر:
نرمافزار googleCL نرمافزاریه که به زبان پایتون و با استفاده از Gdata APIs که خود گوگل اونها رو ارائه داده نوشته شده و در هر سه پلتفرم لینوکس، ویندوز و MacOS قابل استفاده است. این نرمافزار در حال حاضر تنها برای بعضی سرویسهای گوگل که API اونها در دسترس قرار داره، قابل استفاده است. این سرویسها شامل بلاگر، Calendar، Contacts، Docs، Picasa و یوتیوب میشه. شاید اگر گوگل API سرویسهای دیگهاش رو هم ارائه بده این نرمافزار کاربرد بیشتری داشته باشه.
نحوهی نصب و استفاده از این نرمافزار بسیار ساده است. در بعضی توزیعهای لینوکس این نرمافزار در ریپوزیتوری توزیع وجود داره و نیازی به کمپایل اون نیست. با این حال برای کمپایل کردن اون میتونید به روش زیر عمل کنید:
۱- دانلود کتابخانه gdata-python-client
۲- دانلود نرمافزار googleCL
۳- خارجکردن فایلها از حالت فشرده و نصب اونها با استفاده از فرمانهای زیر:
cd gdata python setup.py install cd ../googleCL python setup.py install
و اما جهت استفاده از این نرمافزار بد نیست نگاهی به دستورالعمل استفاده از این نرم افزار و همچین این مثالها بیاندازید. البته میتونید با استفاده از فرمان زیر صفحهی راهنمای این نرمافزار رو هم بخونید.
man google
به عنوان مثال برای دانلود لیست کانتکتهای موجود در Google Contacts خودتون میتونید از فرمان زیر استفاده کنید:
google contacts list name, email
اگر برای اولین بار از یکی از سرویسهای این نرمافزار استفاده کنید پس از وارد کردن اکانت گوگلتون ازتون میخواد از طریق یک مرورگر اجازهی دسترسی به اطلاعاتتون رو بهش بدید و سپس کلید Enter رو بزنید.
همچنین بدیهیه که با ادغام فرمانهای مختلف لینوکس و قابلیتهای مختلف ترمینال میتونید به نتایج جالبتری برسید. مثلا فرمان زیرکه لیست نام و ایمیل تمام افرادی رو که نام اونها ثبت شده رو در قالب فایل contacts.scv به ما میده:
همچنین بدیهیه که با ادغام فرمانهای مختلف لینوکس و قابلیتهای مختلف ترمینال میتونید به نتایج جالبتری برسید. مثلا فرمان زیرکه لیست نام و ایمیل تمام افرادی رو که نام اونها ثبت شده رو در قالب فایل contacts.scv به ما میده:
google contacts list name,email --title ".*." > contacts.csv
امیدوارم از این نرمافزار لذت ببرید.
نصب مجدد تمام نرمافزارها، پس از تعویض سیستمعامل
بعضی مواقع پیش میاد که سیستم عامل آدم مشکل خاصی پیدا کنه و نصب دوبارهی سیستم عامل راحتتر از رفع مشکلات اون باشه. در این مواقع نصب دوبارهی تمام نرمافزارها بیشتر شبیه به یک کابوس میمونه. باید مدتها پای سیستم نشست و نرمافزارها رو دونه دونه نصب کرد.
اما باید یک راهکار سادهتر از این هم وجود داشته باشه. اگر راهی باشه که لیست نرمافزارهای نصب شده روی سیستم رو توی یک فایل سادهی متنی ذخیره کنیم تا بعدا با استفاده از این فایل و یک دستور توی ترمینال، نرمافزارها خودشون اتوماتیک نصب بشن، مشکل ما حل میشه.
خبر خوش اینه که با استفاده از روشی که این سایت معرفی کرده، این کار به راحتی امکانپذیره، برای مرحلهی اول کار باید از روش زیر استفاده کرد:
سیستمهای بر مبنای دبیان (اوبونتو، پارسیکس و ...):
اما باید یک راهکار سادهتر از این هم وجود داشته باشه. اگر راهی باشه که لیست نرمافزارهای نصب شده روی سیستم رو توی یک فایل سادهی متنی ذخیره کنیم تا بعدا با استفاده از این فایل و یک دستور توی ترمینال، نرمافزارها خودشون اتوماتیک نصب بشن، مشکل ما حل میشه.
خبر خوش اینه که با استفاده از روشی که این سایت معرفی کرده، این کار به راحتی امکانپذیره، برای مرحلهی اول کار باید از روش زیر استفاده کرد:
سیستمهای بر مبنای دبیان (اوبونتو، پارسیکس و ...):
$ dpkg –get-selections > /backup/installed-software.log
سیستمهای بر مبنای ردهت (فدورا، Cent OS ،Suse Linux و ...)
$ rpm -qa > /backup/installed-software.log
این دستورات به راحتی قابل فهم هستند و به همین خاطر فکر نمیکنم نیاز به توضیح داشته باشن. با اجرای این دستورات ما یک فایل شامل لیست کامل تمام نرمافزارهای نصب شده خواهیم داشت که پس از نصب مجدد سیستمعامل میتونیم با استفاده از روش زیر تمام نرمافزارهای داخل فایل رو نصب کنیم:
سیستمهای بر مبنای دبیان:
سیستمهای بر مبنای دبیان:
# dpkg --set-selections < /backup/installed-software.log
و بعد:
# dselect
و سپس با فشردن کلید "i" میتوتید نرمافزارها رو نصب کنید.
سیستمهای بر مبنای ردهت:
سیستمهای بر مبنای ردهت:
# yum -y install $(cat /backup/installed-software.log)
اگر از yum استفاده نمیکنید، از روش زیر هم میتوان استفاده کرد:
# up2date -i $(cat /backup/installed-software.log)
البته بعضی از نرمافزارها پس از نصب نیاز به تنظیمات دارند و من توصیه میکنم از قبل از فایلهای مربوط به تنظیمات نرمافزارهای خاص بکآپ بگیرید تا نیازی به تنظیم مجدد اونها نداشته باشید.
MD5 چیست و با آن چه میتوان کرد؟
در ابتدا، Hash چیست؟
hash خروجی تابعی یکطرفه است، برای تولید نوعی اثر انگشت از یک سری داده. منظور از یکطرفه بودن تابع Hash این است که نمیتوان با داشتن خروجی تابع به اصل داده دست یافت (همانطور که با داشتن اثر انگشت یک انسان، نمیتوان آن انسان را از نو تولید کرد!). احتمال اینکه دو دادهی متفاوت دو خروجی یکسان از این تابع بگیرند بسیار پایین است، به همین دلیل از الگوریتمهای متفات این تابع معمولا برای تشخیص درستی دادهها استفاده میشود. به عنوان مثال اگر از الگوریتم معروف MD5 برای محاسبهی خروجی تابع Hash استفاده کنیم، و کلمهی 'Cat' را به آن بدهیم، خروجی ما همیشه مقدار زیر است:
چنانچه کلمهی 'Cat' را به 'Cats' تغییر دهیم، خروجی تابع به شکل زیر تغییر پیدا میکند:
مقدار دادهای که به تابع میدهیم، ربطی به سایز خروجی آن ندارد. همچنین تغییر در داده، هر چقدر هم که کوچک باشد، خروجی کاملا متفاوتی ارائه خواهد کرد.
MD5 چیست؟
MD5 یا Message-Digest algorithm 5 پر استفادهترین، تابع رمزنگاری Hash است. از این تابع در بسیاری از نرمافزارهای حفاظت اطلاعت استفاده میشود و همچنین کاربرد زیادی در تشخیص درستی دادهها دارد. خروجی این تابع مقداری 128 بیتیاست که معمولا به صورت یک عدد هگزادسیمال ۳۲ رقمی ارائه میشود. به خروجی تابع MD5 Hash یک داده، MD5 Checksum آن داده گفته میشود.
چگونه MD5 Checksum یک عبارت را محاسبه کنیم؟
سادهترین راه برای این کار مراجعه به این آدرس، نوشتن عبارت مورد نظر و فشردن دکمهی Calculate MD5 است، اما نرمافزارهای زیادی هم برای محاسبهی این مقدار نوشته شده است. همچنین اگر شما برنامهنویس هستید، توابع متفاوتی برای استفاده در زبانهای مختلف برنامهنویسی وجود دارد. با این حال شبهکد محاسبهی این مقدار را میتوان در ویکیپدیا یافت.
MD5 Hash و فایلها:
محاسبه و مقایسهی خروجی تابع MD5 Hash فایلها روشی است برای تعیین دست نخورده بودن، و یا سالم بودن یک فایل. همچنین از MD5 Checksum میتوان برای یافتن فایلهای مشابه استفاده کرد. به عنوان مثال تصور کنید که قصد دارید مقداری از اطلاعات خود را برای یکی از دوستان خود کپی کنید. برای اینکار میتوانید ابتدا MD5 Checksum فایلهای خود و فایلهای دوستتان را محاسبه کرده، و سپس فایلهایی را که مقدار MD5 Checksum آنها متفاوت است، کپی کنید. با این کار از کپی کردن فایلهایی که از قبل در هارد دیسک دوستتان وجود داشته است جلوگیری میکنید. همچنین بار دیگر بعد از کپی کردن فایلها میتوانید با مقایسهی مقدار MD5 Checksum فایلهای کپی شده با فایلهای موجود در هارد دیسک خود، از این که فایلها به درستی کپی شدهاند، مطمئن شوید.
به هنگام دانلود یک فایل، در بسیاری از سایتهای اینترنتی مقدار MD5 Checksum فایل هم ذکر میشود تا پس دانلود، بتوان از سلامت فایل مطمئن شد. به عنوان مثال اغلب سایتهای ارائه دهندهی توزیعهای لینوکس، مقدار MD5 Checksum فایلهای ایزوی توزیعشان را نیز ذکر میکنند تا پیش از رایت آنها بر روی سیدی، بتوان از سلامت فایل دانلود شده مطمئن شد.
چگونه MD5 Checksum یک فایل را (در لینوکس) محاسبه کنیم؟
برای محاسبهی MD5 Checksum یک فایل از ابزار md5sum استفاده میشود. این برنامه به صورت پیشفرض در اکثر توزیعهای لینوکس موجود است. تصور کنید قصد محاسبهی این مقدار برای فایلی به نام file.txt را دارید. برای این کار یک ترمینال باز کنید و دستور زیر را وارد کنید:
همه چیز در مورد md5sum:
ابزار md5sum چند قابلیت دیگر هم دارد. برای محاسبهی md5sum چند فایل به صورت همزمان، میتوانید نام فایلها را یکی پس از دیگری به عنوان آرگومانهای دستور md5sum بنویسید:
خروجی این دستور چیزی شبیه به این است:
ستون اول مقدار MD5 Checksum و ستون دوم نام فایلهاست.
بدیهی است میتوان MD5 Checksum فایلها را با استفاده از دستور زیر در یک فایل جداگانه ذخیره کرد:
با این کار فایلی به نام mymd5sums با محتوایی برابر خروجی دستور در فولدر جاری ایجاد میشود. از این فایل میتوان بعدا برای چک کردن تطابق مقدار MD5 Checksumهای موجود در این فایل، با مقدار به دست آمده از فایلها استفاده کرد. برای این کار از دستور زیر استفاده میشود:
خروجی دستور بالا چیزی شبیه به این است:
چنانچه مقدار به دست آمده از یکی از فایلها با عدد موجود در فایل mymd5sums تطابق نداشته باشد، خروجی به شکل زیر میباشد:
میتوان به صورت دستی نیز فایلی مشابه فایل mymd5sums ایجاد نمود و از آن فایل برای مقایسهی مقدار MD5 Checksumهای فایلهای متفاوت ایجاد کرد. فقط دقت کنید که هر سطون باید با دو بار فشردن کلید Space از هم جدا شوند.
همچنین میتوان به جای استفاده از یک فایل، از خروجی استاندارد یک دستور دیگر برای مقایسه استفاده کرد. به عنوان مثال:
دستور بالا، مقدار md5checksum فایل text.txt را با مقدار پایپ شده از دستور echo مقایسه میکند. دقت کنید که به جای نام فایل، این بار از -(خط تیره) استفاده شده است.
و در انتها...
امیدوارم چیزی رو از قلم نیانداخته باشم و از شما هم این انتظار را دارم که اگر احساس کردهاید جایی اشتباهی صورت گرفته یا بخشی از نوشته نامفهوم بوده به من اطلاع بدهید.
بعضی قسمتهای نوشتهی بالا برگرفته از منابع زیر است:
hash خروجی تابعی یکطرفه است، برای تولید نوعی اثر انگشت از یک سری داده. منظور از یکطرفه بودن تابع Hash این است که نمیتوان با داشتن خروجی تابع به اصل داده دست یافت (همانطور که با داشتن اثر انگشت یک انسان، نمیتوان آن انسان را از نو تولید کرد!). احتمال اینکه دو دادهی متفاوت دو خروجی یکسان از این تابع بگیرند بسیار پایین است، به همین دلیل از الگوریتمهای متفات این تابع معمولا برای تشخیص درستی دادهها استفاده میشود. به عنوان مثال اگر از الگوریتم معروف MD5 برای محاسبهی خروجی تابع Hash استفاده کنیم، و کلمهی 'Cat' را به آن بدهیم، خروجی ما همیشه مقدار زیر است:
d077f244def8a70e5ea758bd8352fcd8
0832c1202da8d382318e329a7c133ea0
MD5 چیست؟
MD5 یا Message-Digest algorithm 5 پر استفادهترین، تابع رمزنگاری Hash است. از این تابع در بسیاری از نرمافزارهای حفاظت اطلاعت استفاده میشود و همچنین کاربرد زیادی در تشخیص درستی دادهها دارد. خروجی این تابع مقداری 128 بیتیاست که معمولا به صورت یک عدد هگزادسیمال ۳۲ رقمی ارائه میشود. به خروجی تابع MD5 Hash یک داده، MD5 Checksum آن داده گفته میشود.
چگونه MD5 Checksum یک عبارت را محاسبه کنیم؟
سادهترین راه برای این کار مراجعه به این آدرس، نوشتن عبارت مورد نظر و فشردن دکمهی Calculate MD5 است، اما نرمافزارهای زیادی هم برای محاسبهی این مقدار نوشته شده است. همچنین اگر شما برنامهنویس هستید، توابع متفاوتی برای استفاده در زبانهای مختلف برنامهنویسی وجود دارد. با این حال شبهکد محاسبهی این مقدار را میتوان در ویکیپدیا یافت.
MD5 Hash و فایلها:
محاسبه و مقایسهی خروجی تابع MD5 Hash فایلها روشی است برای تعیین دست نخورده بودن، و یا سالم بودن یک فایل. همچنین از MD5 Checksum میتوان برای یافتن فایلهای مشابه استفاده کرد. به عنوان مثال تصور کنید که قصد دارید مقداری از اطلاعات خود را برای یکی از دوستان خود کپی کنید. برای اینکار میتوانید ابتدا MD5 Checksum فایلهای خود و فایلهای دوستتان را محاسبه کرده، و سپس فایلهایی را که مقدار MD5 Checksum آنها متفاوت است، کپی کنید. با این کار از کپی کردن فایلهایی که از قبل در هارد دیسک دوستتان وجود داشته است جلوگیری میکنید. همچنین بار دیگر بعد از کپی کردن فایلها میتوانید با مقایسهی مقدار MD5 Checksum فایلهای کپی شده با فایلهای موجود در هارد دیسک خود، از این که فایلها به درستی کپی شدهاند، مطمئن شوید.
به هنگام دانلود یک فایل، در بسیاری از سایتهای اینترنتی مقدار MD5 Checksum فایل هم ذکر میشود تا پس دانلود، بتوان از سلامت فایل مطمئن شد. به عنوان مثال اغلب سایتهای ارائه دهندهی توزیعهای لینوکس، مقدار MD5 Checksum فایلهای ایزوی توزیعشان را نیز ذکر میکنند تا پیش از رایت آنها بر روی سیدی، بتوان از سلامت فایل دانلود شده مطمئن شد.
چگونه MD5 Checksum یک فایل را (در لینوکس) محاسبه کنیم؟
برای محاسبهی MD5 Checksum یک فایل از ابزار md5sum استفاده میشود. این برنامه به صورت پیشفرض در اکثر توزیعهای لینوکس موجود است. تصور کنید قصد محاسبهی این مقدار برای فایلی به نام file.txt را دارید. برای این کار یک ترمینال باز کنید و دستور زیر را وارد کنید:
md5sum file.txt
همه چیز در مورد md5sum:
ابزار md5sum چند قابلیت دیگر هم دارد. برای محاسبهی md5sum چند فایل به صورت همزمان، میتوانید نام فایلها را یکی پس از دیگری به عنوان آرگومانهای دستور md5sum بنویسید:
md5sum text1.txt text2.txt
9ff460edc32f6a59fd0e612162c8d7e7 text1.txt bbee0ebbbb53235666b515c5d0c2c3ab text2.txt
بدیهی است میتوان MD5 Checksum فایلها را با استفاده از دستور زیر در یک فایل جداگانه ذخیره کرد:
md5sum text1.txt text2.txt > mymd5sums
md5sum -c mymd5sums
text1.txt: OK text1.txt: OK
one.txt: FAILED two.txt: OK md5sum: WARNING: 1 of 2 computed checksums did NOT match
همچنین میتوان به جای استفاده از یک فایل، از خروجی استاندارد یک دستور دیگر برای مقایسه استفاده کرد. به عنوان مثال:
echo '9ff460edc32f6a59fd0e612162c8d7e7 text1.txt' | md5sum -c -
و در انتها...
امیدوارم چیزی رو از قلم نیانداخته باشم و از شما هم این انتظار را دارم که اگر احساس کردهاید جایی اشتباهی صورت گرفته یا بخشی از نوشته نامفهوم بوده به من اطلاع بدهید.
بعضی قسمتهای نوشتهی بالا برگرفته از منابع زیر است:
اشتراک در:
پستها (Atom)