اکثر تعاملات با سیستمهای لینوکسی، در پایینترین سطح، از طریق رابط متنی (CLI) نظیر PTY و TTY در لینوکس صورت میگیرد و سیستم با بهرهگیری از مکانیزمهای مختلف، اطلاعات موردنیاز کاربر را در دسترس قرار میدهد. حتی قبل از ظهور محیطهای گرافیکی پیشرفته، ابزارهای خط فرمان (command-line) وجود داشتند که از این امکانات استفاده میکردند.
در این مقاله ابتدا سلسلهمراتب ترمینالها مرور شده و سپس مفهوم TTY (تلهتایپ) تعریف میشود. در ادامه، PTY (شبه ترمینال)، شبیهسازهای ترمینال و سایر کاربردهای PTY به تفصیل بررسی خواهند شد. کدهای ارائهشده در این مقاله روی Debian 11 (Bullseye) با GNU Bash 5.1.4 آزمایش شدهاند و با اکثر محیطهای POSIX سازگار خواهند بود.
ترمینالها: از سختافزار تا نرمافزار
ترمینال، در واقع ابزاری برای ورود داده به سیستم و دریافت خروجی از آن است. این ترمینالها از سطوح مختلفی تشکیل شدهاند:
- ترمینال سختافزاری: مانند دستگاههای تلهتایپ و نمایشگرهای ویدیویی
- ترمینال نرمافزاری: ترمینال های مجازی (TTY) که رابط اصلی تعامل با سیستم عامل لینوکس محسوب میشوند.
- شبه ترمینال (PTY): امکان شبیهسازی TTY را به هر برنامهای میدهد.
- شبیه ساز ترمینال (terminal emulator): بر پایه مفاهیم قبلی ساخته شده است اما معمولاً با اضافه کردن ویژگیهایی از طریق رابط کاربری گرافیکی (GUI) یا شبیهسازی CLI، قابلیتهای بیشتری ارائه میدهد.
در این مقاله تمرکز بیشتر روی جنبههای نرمافزاری است زیرا ترمینالهای سختافزاری ارتباط مستقیمی با لینوکس ندارند. همچنین terminal emulator ها نیز ایده جدیدی در سطوح پایین تر ارائه نمی دهند و تنها امکانات بیشتری بر مبنای مفاهیم PTY و TTY در لینوکس فراهم میکنند.
TTY چیست؟
تصویر(1)
کلمه TTY مخفف teletype است؛ به عبارتی، دستگاههایی هستند که امکان تایپ از راه دور را فراهم میکنند. در لینوکس، TTY به صورت یک فایل دستگاه (device file) مجازی تعریف میشود که توسط مدیریت ورودی (معمولاً صفحهکلید) و خروجی (معمولاً صفحهنمایش) امکان تعامل با سیستمعامل را فراهم میکنند.
سیستمهای لینوکسی ممکن است چندین TTY داشته باشند. تعداد پیشفرض معمولاً 7 عدد بوده اما در توزیعهای جدیدتر ممکن است تعداد بیشتری وجود داشته باشد. به عنوان مثال، با استفاده از دستور زیر میتوان لیست دستگاههای tty موجود در سیستم را مشاهده کرد:
$ find /dev -regex '.*/tty[0-9]+'
/dev/tty63
/dev/tty62
[...]
/dev/tty1
/dev/tty0
در تصویر فوق، 64 دستگاه TTY با استفاده از دستور find قابل مشاهده است. همچنین، device file های دیگری مانند موارد زیر نیز وجود دارند:
/dev/tty
/dev/console
/dev/ttyS#
/dev/ptmx
در سیستمهای مدرن مبتنی بر systemd، سرویسهایی مانند getty@.service وظیفه تولید، ارائه و نظارت بر این دستگاهها را دارند.
PTY چیست؟
تصویر(2)
PTY مخفف pseudo-TTY یا شبه ترمینال است. یک تفاوت PTY و TTY در لینوکس این است که TTY به عنوان ترمینال اصلی سیستم عمل میکند، اما PTY امکان شبیهسازی یک ترمینال واقعی را برای هر برنامهای فراهم می نماید. نام PTY به این دلیل انتخاب شده که مانند یک TTY برای هر دو نقطه پایانی (end point) عمل میکند. این تفاوت جزئی، امکان استفاده از چندین PTY در بستر یک TTY را فراهم نموده است.
در یک PTY، دو طرف وجود دارد:
- Slave: به صورت یک فایل در #/dev/pts/ نشان داده میشود.
- Master: تنها به عنوان یک فایل توصیفگر (file descriptor) در اختیار پروسه ای قرار میگیرد که درخواست ایجاد PTY را داده است.
مراحل ایجاد یک PTY به این صورت می باشد:
- پروسه ای، فایل dev/ptmx/ را باز میکند.
- سیستمعامل یک فایل توصیفگر master برمیگرداند.
- سیستمعامل یک دستگاه slave متناظر در #/dev/pts/ ایجاد میکند.
- سپس، ورودی از طرف slave به master و بالعکس هدایت میشود.
به کمک تابع ptsname میتوان رابطه بین master و slave را مشخص کرد. در واقع PTY یک کانال ارتباطی دوجانبه مانند pipe ها ایجاد میکند اما با این تفاوت که رابط ترمینال را به برنامهها ارائه میدهد.
شبیه ساز ترمینال
یکی از کاربردهای PTY، امکان به کارگیری شبیه ساز ترمینال مانند xterm، GNOME Terminal و Konsole است. این برنامهها از تعداد زیادی PTY استفاده میکنند و معمولاً به صورت تب یا پنجره در محیط گرافیکی نمایش داده میشوند.
برای مثال و درک بهتر تفاوت PTY و TTY در لینوکس، هنگام بوت شدن، سیستم از یک TTY (مثلاً dev/tty1/) استفاده میکند که در آنجا میتوان وارد سیستم شد یا از طریق دستور startx محیط گرافیکی راهاندازی کرد. سپس با باز کردن یک شبیه ساز ترمینال، PTY جدیدی (مثلاً dev/pts/0/) ایجاد میشود.
تصویر(3)
سایر کاربردهای PTY
علاوه بر شبیه ساز ترمینال، PTY در کاربردهای متنوع دیگری نیز به کار میرود:
1. محیط گرافیکی در خط فرمان (CLI): ابزارهایی مانند tmux و screen که به عنوان مولتیپلکسر ترمینال شناخته میشوند، به کاربران اجازه میدهند تا چندین ترمینال در یک پنجره داشته باشند. این برنامهها مشابه محیط گرافیکی عمل کرده و امکان مدیریت فرایندهای طولانی مدت را بدون وابستگی به یک ترمینال مشخص فراهم میکنند.
2. ارتباطات راه دور: پروتکلهایی مانند ssh و telnet نیز برای تعامل با سیستم از شبیهسازی ترمینال بهره میبرند. در این حالت، PTY به عنوان کانالی جهت برقراری ارتباط بین برنامههای راه دور و سیستم، عمل میکند. برای مثال وقتی با ssh به یک سرور متصل میشوید، ترمینال اختصاص دادهشده، از نوع PTY است.
جمع بندی
در این مقاله به بررسی ویژگی و تفاوت PTY و TTY در لینوکس پرداخته شد. هر دو یک کانال دوجانبه برای انتقال اطلاعات هستند. TTY ترمینال اصلی سیستم محسوب میشود اما PTY قابلیت انعطاف بیشتری را ارائه داده و به برنامهها اجازه میدهد ترمینال های مجازی متعددی ایجاد کنند. این انعطافپذیری باعث توسعه ابزارها و پروتکلهای کاربردی در فضای کاربری میشود.