تاریخچه VPS: از سیستمهای Mainframe تا فضای ابری
آیا میدانید VPS شما ریشه در سیستمهای اشتراک زمانی دهه 1960 دارد؟ در این مقاله مسیر تکامل از CTSS و Unix تا Xen و KVM را بررسی میکنیم و میبینیم چه چیزی ثابت مانده است.
خاستگاه VPS شما
تاریخچه محاسبات از سیستمهای mainframe تا فضای ابری، داستان ارزانتر شدن یک ایده است. این ایده، اشتراک زمانی (time-sharing) است: اجازه دهید افراد بسیاری همزمان از یک ماشین گرانقیمت استفاده کنند و به هر کدام نمایی اختصاصی از آن ارائه دهید. این مفهوم در حدود سال 1960 ابداع شد، زیرا هزینه یک کامپیوتر از هزینه افرادی که از آن استفاده میکردند، بیشتر بود. تمام بخشهای VPS که امروزه اجاره میکنید، برای حل همین مشکل ساخته شدهاند: جداسازی بین کاربران، زمانبندی که زمان CPU را تخصیص میدهد، hypervisor و صورتحسابی که ساعات استفاده را محاسبه میکند. این مشکل هرگز از بین نرفت. سختافزار ارزان شد، بنابراین بخشی از منابع که زمانی نیازمند یک بودجه پژوهشی کلان بود، اکنون تنها چند دلار در ماه هزینه دارد.
1959 تا 1961: چرا اشتراک زمانی (time-sharing) اختراع شد
در دهه 1950، رایانهها به صورت دستهای (batch) کار میکردند. شما برنامه خود را روی کارتهای پانچ سوراخ میکردید، دسته کارتها را به اپراتور تحویل میدادید و بعداً برای دریافت خروجی چاپشده بازمیگشتید. یک کاراکتر اشتباه تایپشده، یک روز وقت شما را هدر میداد. ماشین همیشه مشغول بود و این دقیقاً هدف اصلی بود، زیرا دستگاهی مانند IBM 7090 میلیونها دلار قیمت داشت و زمان افرادی که منتظر آن بودند در هیچ فاکتوری محاسبه نمیشد.
در ژانویه 1959، جان مککارتی (John McCarthy) در یادداشتی در MIT دیدگاه متفاوتی را مطرح کرد. ماشین باید منتظر انسان بماند. کریستوفر استریچی (Christopher Strachey) در همان سال در کنفرانس یونسکو نوعی از اشتراک زمانی را توصیف کرد، هرچند منظور او این بود که یک برنامهنویس در حین اجرای سایر کارها به دیباگ کردن بپردازد، نه اینکه چندین نفر همزمان تایپ کنند. مککارتی در سال 1961 در جشن صدسالگی MIT پا را فراتر گذاشت: رایانش میتواند به عنوان یک سرویس عمومی فروخته شود و مانند برق، کنتور داشته باشد.
ایراد آن زمان این بود که اشتراک زمانی باعث هدر رفتن توان ماشین میشود. جابهجایی بین کاربران چرخههای پردازشی (cycles) مصرف میکند و چرخهها گرانترین بخش بودند. این ایراد درست بود، اما دیگر اهمیتی نداشت؛ زیرا قیمت یک چرخه پردازشی به مدت 60 سال کاهش یافت، در حالی که قیمت یک ساعت توجه انسانی کاهش نیافت.
آنچه CTSS مجبور به ابداع آن شد
گروه فرناندو کورباتو در مرکز محاسبات MIT، سیستم اشتراک زمانی سازگار (CTSS) را برای پایان دادن به این بحث ساختند. این سیستم برای نخستین بار در نوامبر 1961 روی یک IBM 709 نمایش داده شد و به 4 کاربر سرویس میداد؛ به این صورت که کار هر کاربر را به درایو نوار مغناطیسی اختصاصی خودش منتقل میکرد. «سازگار» به این معنا بود که دستگاه همچنان میتوانست سیستم دستهای (batch) قدیمی را در زیرلایه اجرا کند، زیرا هیچکس کامپیوتری نمیخرد که فقط کار جدید انجام دهد.
4 کاربر تعداد کمی است. فهرست مشکلاتی که برای رسیدن به این مرحله باید حل میشد، کوچک نیست و همان فهرستی است که هسته سیستمعامل شما همین حالا در حال پردازش آن است. CTSS به یک زمانبند (scheduler) نیاز داشت تا یک پردازش طولانی نتواند تمام ترمینالهای دیگر را متوقف کند. این سیستم به حافظه محافظتشده نیاز داشت تا یک برنامه در حال کرش کردن، فقط یک کاربر را از کار بیندازد، نه کل سیستم را. همچنین به فضایی برای ذخیرهسازی نیاز داشت که پس از خروج از سیستم (logout) باقی بماند؛ به همین دلیل CTSS یکی از نخستین سیستمهای فایلی را داشت که یک کاربر امروزی آن را تشخیص میدهد. و به رمز عبور نیاز داشت تا یک کاربر نتواند فایلهای کاربر دیگر را بخواند.
نام آن بخشها را تغییر دهید تا به یک سیستم Linux برسید. زمانبند، EEVDF است که در Linux 6.6 جایگزین CFS شد. حافظه محافظتشده، همان MMU (واحد مدیریت حافظه) است که به هر پردازش، فضای آدرس مجازی اختصاصی خودش را میدهد. ذخیرهسازی که پس از logout باقی میماند، همان دایرکتوری home شماست. فایل رمزهای عبور همچنان /etc/passwd نامیده میشود.
سیستم Multics و مفهوم رایانش به عنوان سرویس
سیستم بعدی MIT قرار بود همان سرویس رایانشی باشد که McCarthy توصیف کرده بود. پروژه MAC در سال 1963 آغاز شد، در اوت 1964 قرارداد خرید یک دستگاه GE-645 از شرکت General Electric امضا شد و اولین مقالات مربوط به Multics در سال 1965 منتشر گردید. نام این سیستم گویای هدف آن بود: Multiplexed Information and Computing Service (سرویس رایانش و اطلاعات چندگانه). منظور از سرویس، چیزی شبیه به خدماتی بود که به صورت ساعتی خریداری میشود.
توسعه Multics بسیار طولانیتر از زمانبندی پیشبینیشده بود. نمونههای اولیه ماشینهای GE-645 در ژانویه 1967 به MIT و Bell Labs رسیدند. Bell Labs در آوریل 1969 از این پروژه خارج شد. Multics در 1 اکتبر 1969 برای مشتریان مرکز پردازش اطلاعات MIT راهاندازی شد و پس از آن به مدت 31 سال در محیطهای عملیاتی مورد استفاده قرار گرفت. آخرین سیستم فعال Multics، متعلق به وزارت دفاع ملی کانادا در هالیفاکسِ نوا اسکوشیا، در 30 اکتبر 2000 خاموش شد.
Multics اغلب به دلیل تأخیر در عرضه و سرعت پایین، یک شکست تلقی میشود. اما واژگان فنی ما خلاف این را میگویند. این سیستم، ساختار سلسلهمراتبی فایلها (دایرکتوری درون دایرکتوری)، لیست کنترل دسترسی (ACL) برای هر فایل، حافظه مجازی بخشبندیشده که به برنامه اجازه میداد با فایلها مانند حافظه اصلی رفتار کند، و حلقههای حفاظتی (protection rings) که کدها را بر اساس میزان اعتماد رتبهبندی میکرد، به دنیای کامپیوتر معرفی کرد. این حلقهها هنوز در سختافزاری که پیش رو دارید وجود دارند. Ring 0 برای هسته (kernel) و Ring 3 برای کدهای کاربر، واژگان ابداعی Multics هستند؛ بعدها با ظهور مجازیسازی سختافزاری، حالتی زیر Ring 0 برای هایپروایزر اضافه شد که به صورت غیررسمی Ring -1 نامیده میشود.
یونیکس: اشتراک زمانی روی ماشینی که توان خریدش را داشتید
خروج از پروژه Multics، کن تامپسون را در آزمایشگاههای بل بدون سیستمی که مایل به استفاده از آن بود، رها کرد. در سال 1969، او کار روی سیستم بسیار کوچکتری را بر روی یک دستگاه PDP-7 متروکه آغاز کرد. تاریخ اولین «راهنمای برنامهنویس یونیکس» نوامبر 1971 است؛ زمانی که کار به یک دستگاه PDP-11 منتقل شده بود. در سال 1973، تامپسون و دنیس ریچی هسته سیستمعامل را با زبان C بازنویسی کردند تا سیستم بتواند بدون نیاز به بازنویسی دستی، به سختافزارهای جدید منتقل شود.
به همین دلیل است که شما امروزه با نوادهای از یونیکس کار میکنید و نه نوادهای از Multics. سیستم Multics به سختافزاری نیاز داشت که اختصاصاً برای آن ساخته شده باشد. یونیکس روی هر سختافزار ارزان و در دسترسی اجرا میشد و همین ویژگی، عامل تعیینکننده موفقیت آن بود.
مقاله «سیستم اشتراک زمانی UNIX» نوشته ریچی و تامپسون در ژوئیه 1974 در نشریه Communications of the ACM منتشر شد. این مقاله VPS شما را توصیف میکند: پردازشها، یک سیستم فایل سلسلهمراتبی، فایلها به عنوان جریانهای ساده بایت، fork، کاربران و گروهها با بیتهای دسترسی، و یک shell که یک برنامه معمولی است و نه بخشی از هسته. پنجاه و دو سال بعد، آن رابط کاربری گسترش یافته، اما هرگز جایگزین نشده است.
آیا واقعاً در سال 1972 مینفریمها ماشینهای مجازی را اجرا میکردند؟
بله، و این بخشی از داستان است که بیشتر افراد از آن غافلاند. در حالی که MIT سیستم Multics را میساخت، مرکز علمی کمبریج IBM از زاویهای دیگر به همان هدف حمله کرد. بهجای یک سیستمعامل که به کاربران بسیاری سرویس دهد، Robert Creasy و Les Comeau یک برنامه کنترلی ساختند که به هر کاربر یک کامپیوتر شبیهسازیشده کامل ارائه میداد. CP-40 در ژانویه 1967 وارد مرحله تولید شد. هر کاربر یک System/360 مجازی دریافت میکرد و یک سیستمعامل کوچک تککاربره به نام CMS را درون آن اجرا میکرد.
سیستم CP-40 در سال 1968 به CP-67 روی System/360-67 تبدیل شد و IBM در تاریخ 2 اوت 1972 سیستم VM/370 را معرفی کرد. این یک هایپروایزر تجاری بود که پنجاه و چهار سال پیش به مشتریان فروخته میشد. یک برنامه کنترلی، سختافزار واقعی را مالتیپلکس میکرد و سیستمعاملهای مهمان بهصورت اصلاحنشده درون ماشینهای مجازی اجرا میشدند، در حالی که تصور میکردند مالک کل دستگاه هستند.
نظریه این کار دو سال بعد، در همان شماره ژوئیه 1974 نشریه Communications of the ACM که مقاله Unix را منتشر کرد، ارائه شد. مقاله "الزامات رسمی برای معماریهای نسل سوم قابل مجازیسازی" نوشته Gerald Popek و Robert Goldberg مشخص کرد که یک پردازنده برای قابل مجازیسازی بودن باید چه کاری انجام دهد. قاعده اصلی کوتاه است: هر دستوری که بتواند وضعیت دستگاه را بخواند یا تغییر دهد، باید زمانی که مهمان آن را در حالت غیر از kernel mode اجرا میکند، یک trap ایجاد کند تا هایپروایزر کنترل را به دست بگیرد و با نسخه خصوصی همان مهمان از آن وضعیت، پاسخ دهد. به این فرآیند trap and emulate گفته میشود. سختافزار IBM از این قاعده پیروی میکرد.
چرا مینیکامپیوتر مدل موجود را شکست
شرکت DEC در تاریخ 22 March 1965 مدل PDP-8 را با قیمتی در حدود 18,000 دلار (به ارزش سال 1965) معرفی کرد. این نخستین مینیکامپیوتری بود که با قیمتی کمتر از 20,000 دلار عرضه میشد و در نهایت بیش از 50,000 دستگاه از آن به فروش رسید. پس از آن، ریزپردازنده (microprocessor) قیمتها را باز هم کاهش داد. زمانی که یک بخش از سازمان توانست ماشین مخصوص خود را بخرد و بعدها که این امکان برای افراد فراهم شد، اشتراکگذاری یک کامپیوتر مرکزی دیگر به عنوان مشکلی حلشده تلقی میشد که نیازی به راهحل جدید نداشت. در طول دهههای 1980 و 1990، محاسبات از مرکز داده به روی میزها و درون رکهای سرورهای کوچک x86 منتقل شد.
هدررفت منابع به شکلی دیگر بازگشت. اجرای یک برنامه روی هر سرور، تحلیل وضعیت را ساده میکند، اما باعث میشود بخش بزرگی از سختافزار در حالت بیکار باقی بماند، در حالی که هزینه برق و فضای رک بهطور کامل پرداخت میشود. این همان مشکل CTSS در مقیاسی جدید است، با این تفاوت که اکنون منبع گرانقیمت، اتاق و برق است، نه پردازنده. پاسخ همان پاسخ قدیمی بود: ماشین را به اشتراک بگذارید.
چرا مجازیسازی x86 تا این حد دشوار بود؟
دلیل آن این است که معماری x86 قانون Popek و Goldberg را نقض میکرد. در نهمین سمپوزیوم امنیتی USENIX در اوت 2000، جان اسکات رابین و سینتیا ارواین مجموعه دستورالعملهای Pentium را بررسی کردند و هفده دستورالعمل یافتند که وضعیت ممتاز (privileged state) را میخواندند یا تغییر میدادند، بدون آنکه هنگام اجرای کد در حالت کاربر (user-mode) خطایی ایجاد کنند. popf نمونه استاندارد این مورد است. اگر این دستور را در حالت کاربر اجرا کنید، پردازنده بدون ایجاد وقفه (trap)، بیتهایی را که برنامه اجازه تغییر آنها را ندارد نادیده میگیرد؛ در نتیجه، هایپروایزری که بر پایه مکانیزم trap and emulate ساخته شده، هرگز متوجه نمیشود که سیستمعامل مهمان قصد انجام چنین کاری را داشته است.
پیش از اصلاح سختافزار، دو راهکار ارائه شد. شرکت VMware که در سال 1998 بر اساس تحقیقات پروژه Disco در دانشگاه استنفورد تأسیس شد، کد هسته مهمان را بازرسی و دستورالعملهای مشکلساز را پیش از اجرا بازنویسی میکرد؛ تکنیکی که به آن ترجمه باینری (binary translation) میگویند. پروژه Xen از آزمایشگاه کامپیوتر دانشگاه کمبریج، رویکرد متفاوتی داشت و خودِ مهمان را تغییر میداد. مقاله "Xen and the Art of Virtualization" که در اکتبر 2003 در کنفرانس SOSP ارائه شد، پارا-مجازیسازی (paravirtualisation) را توصیف کرد: در این روش، هسته مهمانِ اصلاحشده، بهجای اجرای دستورالعملهایی که هایپروایزر قادر به رهگیری آنها نیست، عمداً هایپروایزر را فراخوانی میکند.
سپس سختافزار به همان شیوهای که IBM در دهه 1960 اصلاح کرده بود، بهبود یافت. اینتل در 14 نوامبر 2005 تکنولوژی VT-x را روی دو مدل از پردازندههای Pentium 4 عرضه کرد و AMD نیز در مه 2006 تکنولوژی AMD-V را ارائه داد. هر دو شرکت یک حالت پردازشی جدید در سطحی پایینتر از هسته مهمان اضافه کردند؛ بنابراین مهمان میتواند هسته خود را با سرعت کامل اجرا کند، در حالی که هایپروایزر کنترل رویدادهای مورد نظر خود را حفظ میکند. این تغییر باعث شد هایپروایزر به اندازهای کوچک شود که بتواند درون یک سیستمعامل معمولی جای بگیرد. پروژه KVM که توسط آوی کیویتی در شرکت Qumranet ایجاد شد، دقیقاً همین کار را انجام داد: هسته لینوکس را به یک هایپروایزر تبدیل کرد. KVM در نسخه 2.6.20 هسته لینوکس که در فوریه 2007 منتشر شد ادغام گردید و امروزه بخش بزرگی از میزبانهای VPS از همین تکنولوژی استفاده میکنند.
چگونه VPS نامگذاری شد
دو مسیر در اوایل دهه 2000 به هم رسیدند. یکی ماشین مجازی کامل روی x86 بود که یک سیستمعامل مهمان با هسته اختصاصی خود را بوت میکرد. دیگری مجازیسازی در سطح سیستمعامل بود: یک هسته مشترک Linux که به محیطهای مجزا تقسیم میشد و هر کدام کاربر root و جدول پردازشهای خاص خود را داشتند. Linux-VServer و Virtuozzo محصول شرکت SWsoft هر دو در سال 2001 ظاهر شدند و SWsoft بخشی از Virtuozzo را در سال 2005 تحت عنوان OpenVZ بهصورت متنباز منتشر کرد. عبارت "virtual private server" از همین خانواده نشأت میگیرد و با قیاس از virtual private network ساخته شده است.
آمازون اجاره سرور را به یک فراخوانی API تبدیل کرد. سرویس S3 در 14 مارس 2006 راهاندازی شد و EC2 در 25 اوت 2006 بهعنوان یک نسخه بتای عمومی محدود با یک نوع instance واحد و مبتنی بر Xen آغاز به کار کرد. خرید توان پردازشی دیگر یک قرارداد با یک شرکت خدمات کامپیوتری نبود، بلکه به درخواستی تبدیل شد که در عرض یک دقیقه پاسخ میگرفت.
هر دو مسیر همچنان باقی هستند و این تفاوت هنوز تعیین میکند که با سرور اجارهای خود چه کارهایی میتوانید انجام دهید. یک KVM VPS هسته اختصاصی خود را بوت میکند، بنابراین میتوانید ماژولهای هسته را بارگذاری کنید و حتی یک hypervisor درون VPS خود اجرا کنید. یک پلن مبتنی بر container از هسته میزبان استفاده میکند و چنین امکانی ندارد. شصت سال تاریخچه پشت آن یک خط در صفحه قیمتگذاری نهفته است؛ به همین دلیل است که درک تفاوت VPS، VM و VPC پیش از انتخاب یکی از آنها، ارزشمند است.
چه چیزی از مینفریم تا VPS شما تغییر کرد و چه چیزی تغییر نکرد
چهار مورد تغییر کرده است. دستگاه در ساختمان شما نیست. ترمینال به جای یک قطعه مبلمان، یک برنامه است. واحدی که اجاره میکنید یک کامپیوتر کامل با هسته (kernel) اختصاصی خود است، نه یک حساب کاربری روی سیستمعامل شخص دیگر. و قیمت آنقدر کاهش یافته است که خرید آن به جای یک فرایند تدارکاتی، با پرداخت کارت بانکی انجام میشود.
مکانیسم کار اصلاً تغییر نکرده است.
- نشست ssh شما یک ترمینال اشتراک زمانی (time-sharing) است. شما یک لاگین و یک shell دریافت میکنید و یک زمانبند (scheduler) تصمیم میگیرد که پردازش شما چه زمانی اجرا شود.
- جداسازی (isolation) همچنان توسط سختافزار اعمال میشود. MMU و سطوح دسترسی پردازنده کار را انجام میدهند، دقیقاً همانطور که CP-40 در سال 1967 به آن نیاز داشت.
- شما همچنان برای سهمی از یک ماشین بر اساس زمان سپریشده هزینه پرداخت میکنید، همانطور که دفاتر خدمات برای ساعات اتصال صورتحساب صادر میکردند.
- شما همچنان حضور سایر مستأجران را حس میکنید. وقتی یک میزبان بیش از حد اشتراکگذاری شده باشد (oversubscribed)، مهمان شما منتظر CPU فیزیکی میماند و لینوکس آن انتظار را به عنوان زمان CPU steal از یک همسایه پرمصرف گزارش میدهد.
آن نکته آخر، خلاصه صادقانهای از کل تاریخچه است. اشتراک یک ماشین یک معامله است. این موضوع در سال 1961 پذیرفته شد زیرا هزینه کامپیوتر از هزینه افراد بیشتر بود، و در سال 2026 نیز پذیرفته شده است زیرا سروری که با ده درصد ظرفیت خود کار میکند، یعنی هدر دادن پول. اگر ترجیح میدهید در سمت اپراتور این معامله بایستید، اجرای Proxmox روی سختافزاری که مالک آن هستید، هایپروایزر و مشکلات اپراتور را همزمان به شما میدهد.
این نسبت را در ذهن داشته باشید. CTSS به چهار کاربر روی ماشینی خدمات میداد که میلیونها دلارِ سال 1961 قیمت داشت و یک اتاق را پر میکرد. VPS شما، با هزینه چند دلار در ماه در سال 2026، کامپیوتر بسیار بهتری از آن چیزی است که تیم Corbató جیرهبندی میکرد، و شما آن را بهطور کامل در اختیار دارید. دلیلی که اصلاً میتوانید آن را اجاره کنید، ایدهای شصت و پنج ساله است که سرانجام با سختافزار ارزانقیمت ملاقات کرد. اگر در حال بررسی این هستید که چه چیزی روی آن قرار دهید، با آنچه یک VPS واقعاً به شما میدهد شروع کنید و سپس به آنچه مردم روی آن اجرا میکنند بپردازید.
FAQ
اولین سیستم کامپیوتری اشتراک زمانی (time-sharing) چه بود؟
سیستم CTSS یا Compatible Time-Sharing System که توسط گروه Fernando Corbató در مرکز محاسبات MIT ساخته شد. این سیستم برای اولین بار در نوامبر 1961 روی یک IBM 709 نمایش داده شد و به 4 کاربر سرویس میداد که هر کدام به یک درایو نوار جداگانه منتقل میشدند. اولین سرویس اشتراک زمانی برای یک جامعه کامل، Dartmouth Time-Sharing System بود: در 1 مه 1964، John Kemeny و یک دانشجوی برنامهنویس، برنامههای BASIC را بهطور همزمان روی دو ترمینال اجرا کردند و هر دو پاسخهای صحیح دریافت کردند.
آیا ماشینهای مجازی واقعاً در دهه 1960 اختراع شدند؟
بله. مرکز علمی کمبریج IBM، سیستم CP-40 را در ژانویه 1967 به مرحله تولید رساند و به هر کاربر یک System/360 مجازی کامل با سیستمعامل CMS در داخل آن ارائه داد. سیستم CP-67 در سال 1968 روی System/360-67 عرضه شد و IBM در 2 اوت 1972 سیستم VM/370 را معرفی کرد. اینها هایپروایزرهای واقعی بودند که سیستمعاملهای مهمان اصلاحنشده را اجرا میکردند و بهصورت تجاری فروخته میشدند؛ دههها پیش از آنکه سختافزار x86 بتواند چنین کاری انجام دهد.
چرا مجازیسازی x86 دشوار بود اما مینفریمها این مشکل را نداشتند؟
قانون سال 1974 از Popek و Goldberg بیان میکند که هر دستوری که بتواند وضعیت ماشین را بخواند یا تغییر دهد، باید هنگام اجرا توسط مهمان در خارج از حالت kernel، یک trap ایجاد کند. معماری x86 این قانون را نقض کرد. Robin و Irvine هفده دستور Pentium را شناسایی کردند که در حالت user به جای ایجاد trap، بهصورت خاموش شکست میخورند؛ بنابراین یک هایپروایزر کلاسیک trap-and-emulate هرگز آنها را نمیبیند و popf نمونه معمول آن است. VMware با استفاده از binary translation و Xen با paravirtualisation این مشکل را دور زدند، تا اینکه Intel VT-x در نوامبر 2005 و AMD-V در مه 2006 یک حالت سختافزاری برای هایپروایزر اضافه کردند.
آیا اجاره یک VPS همان داشتن یک حساب اشتراک زمانی است؟
مدل صورتحساب و مسئله ایزولاسیون یکسان است، اما واحد کار متفاوت است. کاربر اشتراک زمانی، یک حساب کاربری روی سیستمعاملی داشت که با دیگران مشترک بود، بنابراین مدیر سیستم شخصی در مرکز کامپیوتر بود. یک KVM VPS به شما یک ماشین مجازی با kernel اختصاصی و حساب root خودتان میدهد، بنابراین مدیر سیستم خود شما هستید. یک VPS مبتنی بر container بین این دو قرار میگیرد، زیرا در حالی که kernel میزبان را به اشتراک میگذارد، همچنان به شما دسترسی root در محیط اختصاصیتان میدهد.