<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
    <channel>
        <title>نوشته های مهدی حمیدی</title>
        <link>https://virgool.io/feed/@eXtrem0us</link>
        <description>یه دِوآپس دیگه… با تیپ شخصیتی ESTJ</description>
        <language>fa</language>
        <pubDate>2026-06-16 17:31:22</pubDate>
        <image>
            <url>https://files.virgool.io/upload/users/2793/avatar/avatar.png?height=120&amp;width=120</url>
            <title>مهدی حمیدی</title>
            <link>https://virgool.io/@eXtrem0us</link>
        </image>

                    <item>
                <title>راه‌اندازی دسکتاپ اوبونتو روی اندروید، بدون دسترسی روت</title>
                <link>https://virgool.io/@eXtrem0us/%D8%B1%D8%A7%D9%87%D8%A7%D9%86%D8%AF%D8%A7%D8%B2%DB%8C-%D8%AF%D8%B3%DA%A9%D8%AA%D8%A7%D9%BE-%D8%A7%D9%88%D8%A8%D9%88%D9%86%D8%AA%D9%88-%D8%B1%D9%88%DB%8C-%D8%A7%D9%86%D8%AF%D8%B1%D9%88%DB%8C%D8%AF-%D8%A8%D8%AF%D9%88%D9%86-%D8%AF%D8%B3%D8%AA%D8%B1%D8%B3%DB%8C-%D8%B1%D9%88%D8%AA-xwnzp0fxq6f1</link>
                <description>چند روز پیش موفق شدم که یک دسکتاپ کاملاً &quot;دبیان&quot;ی رو روی گوشی اندرویدیم بالا بیارم، بدون دسترسی روت… و برای این اچیومنت، یک توییت زدم. از اونجا که قرار شد برای این تجربه پستی بذارم، ترجیح دادم که برای تکرار این تجربه و از دست ندادن جزئیات، این بار این کار رو با اوبونتو انجام بدم.دسکتاپ XFCE روی محیط Debian Buster روی Android 9 - OxygenOS روی گوشی Oneplus 5Tخلاصه کل این پست در شش خط:روی گوشیتون termux نصب می‌کنید، پکیج anlinux رو که یک راهنما بیشتر نیست، نصب می‌کنید، اون بهتون میگه برای نصب دیستروی دلخواهتون چه دستوری رو تو termux بزنید. وارد محیط دیستروی لینوکسیتون می‌شید، دسکتاپتون رو نصب می‌کنید. علاوه بر اون یه vncserver مثل tigervnc یا tightvncserver نصب می‌کنید. تو فایل vnc/xstartup./~ میگید که موقع اجرای vnc server چه دسکتاپی اجرا بشه. مثلاً xfce4-session اجرا بشه. vnc server رو اجرا می‌کنید، وارد محیط اندرویدتون میشید و یک vnc client مثل RealVNC نصب می‌کنید و وصلش می‌کنید به localhost و تمام! :)(و اگر فکر می‌کنید کلک رشتی زدم، باید بگم که تو دسکتاپ‌های مبتنی بر X Server اتفاق مشابه این میفته!)چی شد و از کجا شروع شد؟خب، خیلی وقت‌ها پیش میاد که نیاز داریم یه دیستروی لینوکس واقعی همراهمون باشه، عین چیزی که تو لپتاپمون هست. اگر یک DevOps یا SysAdmin باشید، این جزو نیازهای ضروری شماست. اگه نیازتون صرفاً یه ssh زدن هست که ابزار براش تو اندروید زیاده و… خب، اوکی، اندروید خودش روی کرنل لینوکس هست و خود termux به تنهایی اکثر پکیج‌هایی که تو لینوکس بهش نیاز پیدا می‌کنیم رو داره! اصلاً apt داره، python داره، mc داره،… اَمّا: گاهی پیش میاد که خود termux هم کافی نیست:خیلی پکیج‌ها هستند که معادلشون تو مخزن بسته‌های termux نیست، مثل phantomjs و کامپایل کردنشون با npm تو محیط termux به مشکل می‌خوره…بعضی کارها نیازمند این هست که حتماً گوشی root باشند. مثلاً یه پنل سازمانی داریم که پشت vpn هست و سمت dns server، آدرس مربوطه بهش ست نشده یا یه آدرس عمومی روش ست شده… و سمت وب‌سرور، فقط اجازه دسترسی از طریق آدرس خاصی رو میده. این نیازمند تغییرات تو فایل system/etc/hosts/. تو گوشی روت شده هست که با هر بار آپدیت گوشی می‌پره!(ما احتمالاً تو مورد بالایی نیازمند یک مرورگر هم هستیم که etc/hosts/ ما رو هم بخونه تا بتونیم اون پنل سازمانی رو باز کنیم! برای همین اپ کروم یا فایرفاکس گوشی برای ما پاسخگو نیست. باید یه محیطی باشه که این متغیرها رو بخونه و بده به مرورگر)ما آدم گیکی هستیم و می‌خوایم امتحان کنیم ببینیم چطور میشه این کار رو کرد! :)چیکار کنیم؟ چطوری کار می‌کنه؟ چطوری میشه که بشه؟خب، برای این کار نیاز به چند تا ابزار داریم:F-Droid (optional), Termux , AnLinux, TightVNCServer, RealVNC, Hackers Keyboard (optional)این رو هم اشاره کنم که اگر رو گوشیتون دسکتاپ لینوکسی بیارید بالا، احتمالاً برای استفاده موثر ازش نیازمند ماوس و کیبرد هم هستید. می‌تونید از mini mouse-keyboard های قابل حمل استفاده کنید که با بلوتوث به گوشی وصل میشن. یا اگه می‌خواید به جای لپتاپ تو شرکت استفاده کنید و تصویر بزرگ می‌خواید، یه هاب تبدیل از micro-usb یا usb type c به hdmi داشته باشید که برای ماوس/کیبرد/فلش ورودی usb هم داره.در هر صورت، اگر نیازمند یه کیبرد کامل با تمامی قابلیت‌های یک کیبرد فیزیکی هستید، Hacker&#x27;s Keyboard رو پیشنهاد می‌کنم.خب، توضیحات اضافی بسته، شروع می‌کنیم.۱- نصب Termux و AnLinuxاین برنامه‌ها رو از طریق لینک‌های بالا نصب کنید. اگر می‌خواید همیشه آخرین ورژن این برنامه‌ها رو داشته باشید، از استور برنامه‌های آزاد و متن‌باز F-Droid استفاده کنید.۲- انتخاب و نصب توزیع دلخواهبرنامه AnLinux رو باز کنید و دیستروی دلخواهتون رو انتخاب کنید:انتخاب توزیع دلخواهتو این بخش، AnLinux به شما یه دستور میده که باید اون رو تو محیط Termuxتون paste و اجرا کنید. کاری که این دستور میکنه این هست که یک rootfs از توزیع دلخواه شما رو روی گوشی‌تون دانلود می‌کنه و از طریق دستور proot واردش میشه. rootfs درواقع یک ایمیج بسیار مینیمال از اون توزیع مورد علاقه شما هست. مشابه اون چیزی که تو کانتینرهای docker شاهدش هستید. proot یک ابزار هست مثل chroot، با این تفاوت که بر خلاف chroot که فقط به کاربر root اجازه ساختن jail می‌ده، به کاربر عادی هم اجازه استفاده می‌ده. خوشبختانه این ابزار تو مخازن بسته‌های termux موجود هست!۳- ورود به محیط توزیع دلخواه و تستبعد از اتمام این کار، همون طور که خود اسکریپت اجرایی‌تون هم اشاره می‌کنه، باید اسکریپت start-ubuntu.sh رو اجرا کنید. خیلی ساده تایپ کنید:./start-ubuntu.shپایان یافتن دریافت Ubuntu - RootFS و پیش از ورود به آنتبریک! شما الآن وارد محیط اوبونتو شدید! باور نمی‌کنید؟ این دستور رو اجرا کنید و خروجی رو چک کنید:cat /etc/issueخب، قدم بعدی چی می‌تونه باشه؟ احتمالاً نصب برنامه‌های دلخواهی که قبلاً رو اوبونتو نصب می‌کردید! (فقط برای تست) بزنید:apt-get update
apt-get install git bash-completion vim mc wget curlخواهید دید که همه بسته‌ها از مخازن اصلی اوبونتو (احتمالاً با معماری aarch64) دانلود می‌شن.۴- نصب دسکتاپ و VNC Serverخب، وقتشه که یه دسکتاپ مناسب برای گوشیتون نصب کنید، من دسکتاپ XFCE رو برای این کار انتخاب کردم. هرچند شما می‌تونید دسکتاپ‌های Mate و LXDE و... رو هم امتحان کنید. راستش من سراغ Gnome و KDE نرفتم. چون احتمال می‌دادم کار نکنن. این دستور رو تایپ کنید و منتظر دانلود و اتمام مراحل نصب باشید:apt-get update
apt-get install xfce4 tightvncserverدریافت بسته‌های مربوط به XFCE و TightVNCServer۵- راه‌اندازی VNCخب، الآن که دارم این بخش رو تایپ می‌کنم، روند نصب بخش ۴ روی ۳۰٪ هست و داره پیش میره. تا کامل بشه، می‌خوام براتون یکم از منطق کار بگم.(ویرایش): رسیدم به وسط‌های نصب، اینجا ازتون تنظیمات کیبرد می‌خواد. من زدم روی English - US. اینجا باید عدد وارد کنید. مثلاً 31 و بعد 1 رو:تنظیمات کیبرد۵-۱- مختصری از XServer و VNC(این یه تیکه زیادی فنیه، نخونید هم مهم نیست)در حالت عادی توی PC، وقتی دسکتاپ لینوکس رو اجرا می‌کنید، مرورگر یا هر برنامه GUI دار دیگه‌ای رو که باز می‌کنید، خروجیشون رو میدن به XServer. در حالت عادی XServer به درایور کارت گرافیک و در ادامه به مانیتور وصل هست و این باعث می‌شه که ما بتونیم اون اپلیکیشن و دسکتاپ رو رو مانیتورمون ببینم. اما ما تو این سناریو که مانیتور نداریم! (حداقل میشه اینطور گفت که از بین دو تا jail که یکیش واسه proot هست و اون یکی واسه termux هست و محیط isolationی که اندروید به وجود آورده و selinux توش، حتی اگر روت هم باشیم، عمراً بتونیم مستقیماً خروجی رو بریزیم رو فریم بافر کارت گرافیک گوشی). پس اینجا، XServer به جای اینکه خروجی رو بریزه سمت کارت گرافیک، میریزه یه جای دیگه. اسم اون جای دیگه این هست: VNC Server. ما برای دیدن این محتوا نیاز داریم به یه ابزار به اسم VNC Client.و بله! این VNC کلاینت می‌تونه لزوماً رو گوشی شما نباشه! می‌تونه روی یک کامپیوتر دیگه باشه که وصل میشه به گوشیتون!و باز هم بله! XServer هم می‌تونه یه جای دیگه باشه! منطق همه این بخش‌ها به شکل شبکه هست، ولی کاربر عادی معمولاً با این مفاهیم درگیر نمی‌شه:معماری X۵-۲- راه‌اندازی VNC Serverبرای اوبونتو VNC Serverهای مختلفی توسعه داده شده، مثل TigerVNC و TightVNCServer. من از مورد دوم استفاده کردم. با این حال دستورات راه‌اندازی و پارامترهای اون‌ها عین هم هستند! :)قبل از راه‌اندازی VNC Server، بهتره که اپ VNC Viewer رو روی گوشیتون نصب کنید که وقتی سرور رو راه‌اندازی کردید، برای وصل شدن بهش معطل نصب اپ گوشیتون نشید.…و اما VNC Server، نیازمند این هست که یک نام کاربری براش تعریف بشه. شما می‌تونید هر نامی رو تو این بخش بگذارید. این کار رو فقط یک بار انجام بدید:echo &amp;quotexport USER=noobuntuser&amp;quot &gt;&gt; ~/.bashrc
source ~/.bashrcو بالاخره، اجرای VNC Server:vncserver :0اگر بار اولتون باشه که دستور vncserver رو اجرا می‌کنید، از شما پسورد می‌پرسه:اجرای VNC Serverحالا برنامه VNC Viewer رو باز کنید و یک New Connection ایجاد کنید. داخل بخش Address بنویسید: 127.0.0.1 یا localhostتنظیمات VNC Viewerدر ادامه بهتون اخطار میده که ارتباطتون رمزنگاری نشده و ناامن هست (که خب، برای ارتباط localhost نه تنها مشکلی نیست، بلکه مزیته). می‌تونید گزینه Warn me every time رو هم بردارید که هربار اخطار نده.و در ادامه، از شما پسوردی رو که ست کرده بودین رو می‌پرسه. نیاز به گفتن نیست که گزینه remember password هم یک گزینه روی میزه :)با زدن Continue، دسکتاپ XFCE نمایان میشه! می‌تونید با دو انگشت، میزان زوم رو تغییر بدید و با swipe کردن، pointer ماوس رو جابجا کنید. بقیه gestureها هم مثل تاچ‌پد لپ‌تاپ هستند :)دسکتاپ XFCE روی Ubuntu Bionic روی Android 9 روی گوشی OnePlus 5T ۶- بهینه‌سازی و گزینه‌های پیشرفته:تبریک! تا اینجا شما تونستید یک دسکتاپ کاملاً اوبونتویی رو رو گوشیتون بالا بیارید. شما می‌تونید روش اکثر برنامه‌هایی که در حالت عادی اجرا می‌کردید یا عمده تنظیماتی که تو دسکتاپتون اعمال می‌کردید رو اینجا هم اعمال کنید!اما چند تا مورد وجود داره:- اول اینکه: VNC Server همیشه در حال اجراست و منابع سیستم و احتمالاً باتری رو می‌خوره. آیا میشه ازش خارج شد؟- دوم اینکه: حاشیه‌های صفحه سیاه هست. آیا میشه resolution صفحه‌ای که load می‌شه رو عوض کرد تا دسکتاپ ما کل صفحه گوشی رو پر کنه؟- سوم اینکه: آیا میشه چند تا دسکتاپ نصب کرد و هر موقع خواستیم از یکی از این دسکتاپ‌ها استفاده کنیم؟پاسخ به هرسه سوال بالا قطعاً بله هست!۶-۱- خروج از VNC Serverشما باید وارد ترمینال اوبونتو بشید و دستور زیر رو وارد کنید:vncserver -kill :0۶-۲- تغییر Resolution:اول از همه باید درباره رزولوشن گوشیتون اطلاع داشته باشید. گوشی من 1080x2160 هست. درواقع به نسبت 1:2. پس منطقی هست که دسکتاپ من هم تو طول و عرضش نسبت 1:2 رو رعایت کنه تا موقع زوم شدن، کل صفحه رو بگیره. (مثلاً 1600x800 چطوره؟). من حتی می‌تونم عمق رنگ رو هم تعریف کنم (که مثلاً 24 بیت باشه)این‌بار VNC Server رو اجرا می‌کنیم، ولی با یکی دو تا option اضافه‌تر:vncserver -geometry 1600x800 -depth 24 :0و در نهایت، برای بستن VNC Server مثل مورد قبل، نیاز به هیچ option اضافه‌ای نیست.۶-۳- اضافه کردن دسکتاپ و کانفیگ برای دسکتاپ‌های بیشتر:بعد از تنظیمات VNC Server، داخل پوشه vnc./~ یک اسکریپت کانفیگ به اسم xstartuup وجود داره. اگر واردش بشید، می‌تونید تنظیم کنید که بعد از اجرای دستور vncserver، چه برنامه‌هایی اجرا بشند. دقیقاً تو آخرین خط این فایل، نوشته شده:/etc/X11/Xsessionشما می‌تونید دسکتاپ‌های دیگه‌ای رو نصب کنید و این خط رو پاک کنید و برای دسکتاپ XFCE، بذارید: xfce4-session و برای Mate Desktop بذارید: mate-session. هر محیط دسکتاپی‌ای دستور اجرای session خودشو داره که اینجا به دو مورد اشاره شد. راه دیگه‌ش اینه که اون خط رو دست نزنید و یه فایل xsession. رو تو home directoryتون ایجاد کنید که نمایانگر دسکتاپ دلخواه شماست و اسکریپت etc/X11/Xsession/ هم از اون استفاده می‌کنه. راستش دیگه بیشتر از این با قضیه درگیر نشدم. خودتون دیگه برید سرچ کنید :)۷- سخن آخر:اجرای لینوکس تو محیط jail شده، محدودیت‌های خاص خودش رو داره. چیزی به اسم فایل‌سیستم proc/ براش کامل تعریف نشده و این تاثیر می‌ذاره روی دستوراتی که با لیست پروسه‌های در حال اجرا سروکار دارند. (مثل ps یا htop). بعلاوه اینکه نباید خیلی توقع داشته باشید که بتونید یه بازی با گرافیک خفن رو بتونید توش اجرا کنید. به علاوه اینکه خیلی از برنامه‌ها شاید هنوز برای معماری aarch64 توسعه داده نشده باشند، یا تو مراحل اولیه توسعه باشند. آخرش اینکه: خیلی روش حساب باز نکنید و بهش به عنوان یه ابزار کار راه بنداز نگاه کنید. به هر حال من فایرفاکس رو توش اجرا کردم… و امیدوارم بتونم اپلیکیشن‌های جاوا رو هم اجرا کنم :)همه این‌ها به کنار، من فهمیدم که محیط دبیان برای همچین حرکتی کم‌باگ‌تر هست. بهتره سراغ اوبونتو نرید :)به عنوان حسن ختام، آخرین اسکرین‌شات رو از پایان کار می‌ذارم:دسکتاپ XFCE با رزولوشن 1600x800 تمام صفحه روی گوشیامیدوارم لذت برده باشید.</description>
                <category>مهدی حمیدی</category>
                <author>مهدی حمیدی</author>
                <pubDate>Thu, 05 Sep 2019 23:46:26 +0430</pubDate>
            </item>
                    <item>
                <title>جن را بگیر! گرفتن جن در سرور پروداکشن توسط iotop</title>
                <link>https://virgool.io/@eXtrem0us/iotop-wofau162dqdz</link>
                <description>اصلاً چی شد؟دیشب روی یکی از سرورهای پروداکشنمون یه مرتبه IO رفت بالا و زبیکس ایمیل اخطار داد. رفتم و لاگ‌های nginx و syslog رو خوندم و چیزی دستگیرم نشد. اما متریک‌های زبیکس چیز دیگه‌ای رو نشون می‌داد. مشخص بود که به مدت ۵ دقیقه بخش قابل توجهی از دیسک اشغال شد و دومرتبه آزاد شد… معمولاً این رفتار رو روی ذخیره لاگ‌ها و rotate شدنشون می‌دیدم… شروع کردم به خوندن سایر لاگ‌ها و چک کردن crontab و logrotateها… اما اونجا هم چیزی نبود…به نظر می‌رسید چیزی غیر از لاگ‌های سیستم باعث به وجود اومدن این پدیده شده… شاید دامپ حافظه، شاید هر چیز دیگه‌ای که تا این لحظه نتونستم پیداش کنم. (شاید هم جن بوده!) اما چیزی که مشخصه اینه که اگه حتی جن بوده باشه، این پدیده که رو سرور اتفاق افتاد، کار یه پروسه بوده! (به سبک خیابانی! ?)از اونجایی که هیچ ردی از این اتفاق توی سیستم نداشتم به نظرم رسید که باید یه راهی باشه که بشه IO رو تو پروسه‌ها مانیتور کرد و اون رو جایی ذخیره کرد که اگر دوباره این اتفاق افتاد، نپرم رو سرور سریع ssh بزنم و htop بزنم یا iotop بزنم و… که بفهمم کدوم پروسه‌ها بیشترین منبع رو می‌گیرن و…ها!؟ گفتم iotop؟؟ راستی! iotop این قابلیت رو نداره که از وضعیت پروسه‌ها گزارش بگیریم و یه جایی ذخیره کنیم؟…و این شروع ماجرا بود!معرفی iotop و قابلیت‌هایی که زمان کاربرد خودش رو نشون دادخب، iotop دستوریه که پروسه‌هایی رو که بیشترین IO رو داره به صورت تعاملی نشون میده.نمایی از ابزار iotop در حالت عادی، بدون سوئیچاما چطور می‌شه از این ابزار برای گرفتن لاگ استفاده کرد؟ رفتم man page خوندم و دیدم که از این راه میشه:# iotop -oPtqqqbk &gt; /var/log/iomonitor/status.logمن نیاز داشتم که مشخص بشه هر پروسه تو چه زمانی درخواست IO می‌ده (t) همینطور نیاز داشتم که پروسه‌های اصلی و نه ترد‌های فرزند اون مانیتور بشن (o) و اینکه فقط پروسه‌هایی که IO دارند لیست بشن، نه همه پروسه‌ها (P) و نیاز نداشتم به ازای هر خط گزارش، بهم یادآوری بشه که کدوم ستون مربوط به read و یا write هست (qqq) و باید میزان IO با واحد یکسانی نمایش داده می‌شد (k) و اینکه من نیاز به محیط تعاملی نداشتم که با یک کلید از اون محیط خارج بشم یا خطوطی رو فیلتر کنم، من می‌خوام لاگ تولید کنم و جایی ذخیره کنم (b).نمایی از ابزار iotop در حالت استفاده از سوئیچ‌های اشاره شده که معادل لاگ‌های ذخیره شده هستحالا اومدیم و چند ماه گذشت و این اتفاق دوباره نیفتاد، باید همینطوری دیسک مصرف کنیم؟خیر! اینجا از ابزار logrotate استفاده می‌کنیم که لاگ‌ها رو خودش gzip می‌کنه و قدیمی‌ها رو پاک می‌کنه. برای این کار کافیه یه فایل با این محتوا تو مسیر etc/logrotate.d/ ایجاد کنیم./var/log/iomonitor/status.log {  
        daily  
        missingok  
        rotate 5  
        compress  
        delaycompress  
}آیا این کافیه؟خب، کافی که هست، هر زمان که اراده کنم میرم لاگ‌ها رو مرور می‌کنم… و خب، لاگ‌های قدیمی‌تر از ۵ روز هم اتوماتیک پاک میشن… اما وقتی لاگی تولید میشه چرا یه regex ننویسیم و داخل لاگ سرور ذخیره‌ش نکنیم؟ ? ^(?&lt;TIME&gt;[^\ ]*)\ *(?&lt;PID&gt;[\d]*)\ *(?&lt;PRIO&gt;[^\ ]*)\ (?&lt;USER&gt;[^\ ]*)[^\d]*(?&lt;DISKREAD&gt;[\d]*\.[\d]*)[^\d]*(?&lt;DISKWRITE&gt;[\d]*\.[\d]*)[^\d]*(?&lt;SWAPIN&gt;[\d]*\.[\d]*)[^\d]*(?&lt;IO&gt;[\d]*\.[\d]*)[\ \%]*(?&lt;COMMAND&gt;.*)$اینم از regex. همین دیگه… این هم از داستان سیس‌ادمینی ما تو فرانش. به سایت ما سر بزنید ?</description>
                <category>مهدی حمیدی</category>
                <author>مهدی حمیدی</author>
                <pubDate>Wed, 17 Jan 2018 16:07:01 +0330</pubDate>
            </item>
            </channel>
</rss>