فصل 29- ‏ ‎/dev‎ و ‎/proc‎

فصل ‎29‎-‏ ‎/dev‎ و ‎/proc‎

فهرست مطالب
‎29.1‎- ‎/dev‎
‎29.2‎- ‎/proc‎

یک سیستم فایل لینوکس یا یونیکس به طور معمول دارای دایرکتوری‌های خاص منظوره ‎/dev‎ و ‎/proc‎ است.


‎29.1‎-‏ ‎/dev‎

شاخه ‎/dev‎ محتوی مدخل‌هایی برای دستگاه‌های فیزیکی است که می‌توانند در سخت‌افزار حاضر باشند یا نباشند. ‎[1]‎ این‌ مدخل‌ها به طور نسبتا مناسبی فایل‌های دستگاه نامیده می‌شوند. به عنوان مثال، پارتیشن‌های دیسک سخت شامل سیستم‌فایل(های) متصل شده(mounted) دارای مدخل‌هایی در ‎/dev‎ هستند، همچنانکه df نشان می‌دهد.

bash$ df

Filesystem           1k-blocks      Used Available Use%
 Mounted on
 /dev/hda6               495876    222748    247527  48% /
 /dev/hda1                50755      3887     44248   9% /boot
 /dev/hda8               367013     13262    334803   4% /home
 /dev/hda5              1714416   1123624    503704  70% /usr

از جمله سایر موارد، شاخه ‎/dev‎ محتوی دستگاه‌های loopback، از قبیل ‎/dev/loop0‎ است. دستگاه loopback شگردی است که اجازه می‌دهد یک فایل معمولی آنچنان دستیابی بشود که اگر یک دستگاه بلوکی بود، دستیابی می‌گردید. ‎[2]‎ این شگرد، سوار کردن یک سیستم فایل کامل را در یک فایل بزرگ منفرد میسر می‌سازد. مثال ‎17-8‎ و مثال ‎17-7‎ را ببینید.

برخی از شبه دستگاه‌ها در ‎/dev‎، همچون ‎/dev/null‎‏، ‎/dev/zero‎‏، ‎/dev/urandom‎‏، ‎/dev/sda1‎ (پارتیشن دیسک سخت)، ‎/dev/udp‎ (درگاه ‎User Datagram Packet‎)، و ‎/dev/tcp‎ دارای استفاده‌های تعیین شده دیگری هستند.

به عنوان نمونه:

برای mount نمودن یک دیسک USB، سطر زیر را در فایل ‎/etc/fstab‎ درج کنید. ‎[3]‎

/dev/sda1    /mnt/flashdrive    auto    noauto,user,noatime    0 0
(همچنین مثال ‎A-23‎ را ببینید.)

کنترل آنکه آیا دیسک در داخل گرداننده CD وجود دارد (متصل شده به ‎/dev/hdc‎):

head -1 /dev/hdc

#   head: cannot open '/dev/hdc' for reading: No medium found
#                                            (دیسک در درایو نیست.)

#  head: error reading '/dev/hdc': Input/output error
#    (یک دیسک در درایو وجود دارد، اما نمی‌تواند خوانده شود، احتمالاً
#+                               یک دیسک خالی CDR نوشته نشده است.)

#                      ظاهر شدن جریانی از کاراکترها و حروف نامفهوم
#  (یک دیسک از قبل ضبط شده در درایو وجود دارد، و این خروجی خام است
#+                            -- جریانی از داده‌های اسکی و باینری.)
#ما در اینجا حکمت استفاده از head برای محدود کردن خروجی به قسمت‌های
#+  قابل کنترل، به جای استفاده از cat یا چیزی مانند آن را می‌بینیم.

#  اکنون، موضوع فقط کنترل و تجزیه خروجی و انجام عمل متناسب آن است.

هنگام اجرای یک فرمان روی فایل شبه دستگاه ‎/dev/tcp/$host/$port‎، به وسیله Bash یک ارتباط TCP به socket مرتبط دایر می‌شود.

مثال‌های زیر فرض می‌کنند یک ارتباط اینترنتی فعال وجود دارد.

به دست آوردن زمان از ‎nist.gov‎:

bash$ cat </dev/tcp/time.nist.gov/13

53082 04-03-18 04:26:54 68 0 0 502.3 UTC(NIST) *

[این مثال اهدایی Mark است.]

تعمیم دادن مورد فوق در یک اسکریپت:

#!/bin/bash
#        این اسکریپت باید با اختیارات کاربر ارشد اجرا گردد.

URL="time.nist.gov/13"

Time=$(cat </dev/tcp/"$URL")
UTC=$(echo "$Time" | awk '{print$3}')   # فیلد سوم، زمان ‎UTC (GMT)‎ است‎
# تمرین: این اسکریپت را برای مناطق ساعتی مختلف ویرایش کنید.

echo "UTC Time = "$UTC""

دانلود کردن یک ‎URL‎:

bash$ exec 5<>/dev/tcp/www.net.cn/80
bash$ echo -e "GET / HTTP/1.0\n" >&5
bash$ cat <&5

[با تشکر از ‎Mark‎ و ‎Mihai Maties‎.]

مثال ‎29-1‎. به کار بردن ‎/dev/tcp‎ برای عیب‌یابی

#!/bin/bash
# dev-tcp.sh: تغییر مسیر ‎/dev/tcp‎ برای کنترل ارتباط اینترنتی.

# اسکریپت نوشته ‎Troy Engel‎ است.
#   با مجوز استفاده گردیده است.
 
TCP_HOST=news-15.net       # یک ISP اسپم دوست معروف.
TCP_PORT=80                #         Port 80 is http
  
# تلاش برای ارتباط. (تا حدودی مشابه با یک ‎ping‎ . . .) 
echo "HEAD / HTTP/1.0" >/dev/tcp/${TCP_HOST}/${TCP_PORT}
MYEXIT=$?

: <<EXPLANATION
If bash was compiled with --enable-net-redirections, it has the capability of
using a special character device for both TCP and UDP redirections. These
redirections are used identically as STDIN/STDOUT/STDERR. The device entries
are 30,36 for /dev/tcp:

  mknod /dev/tcp c 30 36

>From the bash reference:
/dev/tcp/host/port
    If host is a valid hostname or Internet address, and port is an integer
port number or service name, Bash attempts to open a TCP connection to the
corresponding socket.
EXPLANATION

   
if [ "X$MYEXIT" = "X0" ]; then
  echo "Connection successful. Exit code: $MYEXIT"
else
  echo "Connection unsuccessful. Exit code: $MYEXIT"
fi

exit $MYEXIT

مثال ‎29-2‎. نواختن موزیک

#!/bin/bash
# music.sh

#               موزیک بدون فایل‌های خارجی

#                   مولف: ‎Antonio Macchi‎
# در این راهنما با مجوز به کار رفته است.


# ‎/dev/dsp default = 8000 frames per second, 8 bits per frame (1 byte),
#+ 1 channel (mono)

duration=2000       # If 8000 bytes = 1 second, then 2000 = 1/4 second.
volume=$'\xc0'      # Max volume = \xff (or \x00).
mute=$'\x80'        # No volume = \x80 (the middle).

function mknote ()  # $1=Note Hz in bytes (e.g. A = 440Hz ::
{                   #+ 8000 fps / 440 = 16 :: A = 16 bytes per second)
  for t in `seq 0 $duration`
  do
    test $(( $t % $1 )) = 0 && echo -n $volume || echo -n $mute
  done
}

e=`mknote 49`
g=`mknote 41`
a=`mknote 36`
b=`mknote 32`
c=`mknote 30`
cis=`mknote 29`
d=`mknote 27`
e2=`mknote 24`
n=`mknote 32767`
# European notation.

echo -n "$g$e2$d$c$d$c$a$g$n$g$e$n$g$e2$d$c$c$b$c$cis$n$cis$d \
$n$g$e2$d$c$d$c$a$g$n$g$e$n$g$a$d$c$b$a$b$c" > /dev/dsp
# dsp = Digital Signal Processor

exit      # یک مثال جالب از یک اسکریپت پوسته زیبا!

مترجم: فایل دستگاه ‎/dev/dsp‎ بخشی از درایور ‏OSS‏ ‎(Open Sound System)‎ است که از    # 
مدتها قبل ALSA جایگزین آن گردیده است. بنابراین برای اجرای اسکریپت فوق و شنیدن   # 
خروجی آن، به احتمال بسیار با مشکل مواجه می‌شوید. برای رفع اشکال، به جای تغییر    # 
مسیر داده‌ها به ‎/dev/dsp‎ می‌توانید از لوله‌کشی داده‌ها به aplay استفاده کنید.       # 
آخرین سطر echo را به این صورت تغییر دهید:                                       # 





#echo -n "$g$e2$d$c$d$c$a$g$n$g$e$n$g$e2$d$c$c$b$c$cis$n$cis$d \
$n$g$e2$d$c$d$c$a$g$n$g$e$n$g$a$d$c$b$a$b$c" | aplay
چنانچه مایل باشید این قطعه را به صورت استریو بشنوید می‌توانید aplay را با استفاده #
از گزینه ‎--channels‎ به صورت ‎aplay --channels=2‎ به کار ببرید.                     #

یادداشت‌ها

[1]

مدخل‌ها در ‎/dev‎ محل‌ اتصال برای دستگاه‌های فیزیکی و مجازی فراهم می‌سازند. این مدخل‌ها فضای بسیار اندکی را استفاده می‌کنند.

برخی دستگاه‌ها، از قبیل ‎/dev/null‎‏، ‎/dev/zero‎، و ‎/dev/urandom‎ مجازی هستند. آنها دستگاه‌های فیزیکی واقعی نیستند و فقط در نرم‌افزار وجود دارند.

[2]

در مقایسه با یک دستگاه کاراکتری که داده‌ها را در واحدهای کاراکتری دستیابی می‌کند، یک دستگاه بلوکی داده‌ها را به صورت قطعات یا بلوک‌ها می‌خواند یا می‌نویسد. مثال دستگاه‌های بلوکی، درایوهای دیسک سخت، درایوهای CDROM، و فلش دیسک‌ها هستند. نمونه‌های دستگاه کاراکتری، صفحه کلیدها، مودم‌ها، کارت‌های صدا هستند.

[3]

البته، محل اتصال ‎/mnt/flashdrive‎ باید موجود باشد. اگر نباشد، آنوقت، به عنوان کاربر ارشد، ‎mkdir /mnt/flashdrive‎ را اجرا کنید.

در حقیقت برای mount کردن درایو از این فرمان استفاده کنید: ‎mount /mnt/flashdrive‎

توزیع‌های جدیدتر لینوکس درایو‌های flash را بدون مداخله کاربر به طور خودکار در شاخه ‎/media‎ متصل می‌کنند.