LPIC-1Linux

آموزش Lpic 1 لینوکس: مدیریت کتابخانه‌های اشتراکی Manage shared libraries

آموزش لینوکس : مدیریت کتابخانه‌های اشتراکی (Manage shared libraries)

در این پست میخواهیم به معرفی و مدیریت کتابخانه‌های اشتراکی یا shared libraries به پردازیم، اما اول باید با مفهوم librarie در لینوکس و برنامه نویسی آشنا شویم.

کتابخانه چیست؟

کتابخانه یکی از مفاهیم ضروری در برنامه نویسی است. کتابخانه یا Library از اصطلاحاتی در برنامه نویسی است که زیاد آن را میشنوید. علاوه بر شنیدن، کار های زیادی هم قرار است با آنها انجام دهید. اصولا library ها چیزهایی هستند که کد نویسی را راحت تر کرده و پایداری آنها را بالاتر میبرند.

کتابخانه مجموعه ای از قوانین و کدهای پیش ساخته است که میتوانید از آنها استفاده کنید. کتابخانه ها در اکثر زبان های برنامه نویسی وجود دارند. اما نوع library های هر زبان با یکدیگر متفاوتند. کتابخانه ها توسط برنامه نویسان در سراسر دنیا نوشته شده اند. میتوانید از آنها برای کامل کردن اپلیکیشن یا برنامه خود استفاده کنید. این مجموعه ها در دسترس همه ی توسعه دهندگان قرار دارند. همچنین کتابخانه ها میتوانند یک سری ویژگی ها را به برنامه نویسی اضافه بکنند. به عنوان مثال، ممکن است عمل تفریق را به صورت پیشفرض نتوانید در برنامه نویسی انجام بدهید. (تاکید میکنم که این یک مثال است). اما بعد از اضافه کردن library های مخصوص، میتوانید از تفریق کردن در کدنویسی های خود استفاده کنید. بنابراین به طور کلی میتوانند برنامه نویسی را برای ما آسان تر کنند.

کتابخانه ها مزایای زیادی برای برنامه نویسی دارند. وجود آنها از چیزهایی است که خیال شما را در برنامه نویسی بسیار آسوده تر میکنند. با این مزایا آشنا خواهیم شد:

وجود کدهای پیش ساخته

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

پایداری بالاتر

کتابخانه ها امتحان خود را پس داده اند. این کدهای پیش ساخته در همه ی جهان منتشر شده اند. بنابراین میلیون ها بار مورد اجرا و تست قرار گرفته اند. پس اگر اشکالی در آنها وجود داشته، به خوبی برطرف شده است. از این رو میتوانند پایداری و ثبات بیشتری را برای شما به ارمغان بیاورند. تقریبا میتوان به کدهای پیش ساخته ای که در library ها وجود دارند اطمینان داشته باشید که دارای باگ یا اشکال خاصی نیستند یا حداقل باگ را دارند.

امنیت بالاتر

برای حفظ امنیت برنامه باید از قوانین خاصی پیروی کنید. کتابخانه ها در مجموعه ی خود دارای قوانینی هستند که گاهی میتوان آنها را به عنوان فریم ورک شناخت. این قوانین باعث میشوند که ویژگی ها و امکانات برنامه از حدود خاصی تجاوز نکنند. همچنین میتوانند کمبودهای کدهایی که ما نوشته ایم را پوشش دهند. بنابراین در چهارچوب این قوانین میشود برنامه را تا حد زیادی ایمن کرد.

کتابخانه (Library) در لینوکس

به طور کلی Library در لینوکس به دو صورت می باشد:

مدیریت کتابخانه‌های اشتراکی (Manage shared libraries)
مدیریت کتابخانه‌های اشتراکی (Manage shared libraries)

Static : در این حالت زمان ساخت برنامه ما Library هایی که لازم داریم را داخل خود برنامه قرار می دهیم پس باعث ساخت یک فایل خیلی بزرگ می باشد که به راحتی قابل نصب است، ولی چند مشکل اساسی دارد، اول این که برنامه بزرگ می شود دوم این که به دلیل این که زمان می برد تا ما بعد از بروزرسانی امنیتی Library اصلی آن را در برنامه خود اعمال کنیم پس یک مشکل امنیتی هم ممکن است ایجاد کند و سوم این که ممکن است چند برنامه به یک Library نیاز داشته باشند و برای همین یک Library  چند بار نصب شود.

فرق بین استاتیک و پویا - مدیریت کتابخانه‌های اشتراکی
فرق بین استاتیک و پویا – مدیریت کتابخانه‌های اشتراکی

Dynamic : در این حالت ما به صورت پویا از Library ها استفاده می کنیم، یعنی لیست Library هایی که لازم دارم در سیستم قرار دارد و ما هر کدام را که لازم داریم آن را صدا می زنیم و اجرا می کنیم. در لینوکس چه apt و چه yum هر دو ویژگی هایی دارن تا وابستگی یا dependency های یک برنامه را تشخیص دهند و Library های آن را هم نصب کنند.

dependency های برنامه VLC - مدیریت کتابخانه‌های اشتراکی
dependency های برنامه VLC – مدیریت کتابخانه‌های اشتراکی

در لینوکس معمولا بیشتر Library ها در lib/ و lib64/ قرار دارد همچنین هر یوزر هم می تواند Library های خودش را در usr/lib/ داشته باشد.

حال برای مثال ما میخواهیم بدانیم دستور ldconfig از چه Library هایی استفاده می کند، برای این کار از دستور ldd و سپس مسیر نصب ldconfig استفاده می کنیم.

نکته: در صورتی که مسیر نصب برنامه ای را نمی دارد از دستور whereis مثل whereis ldconfig استفاده می کنیم.

محل نصب ldconfig در sbin/ldconfig/ می باشد، پس دستور زیر را وارد می کنیم:

# ldd /sbin/ldconfig

خروجی ما می گوید که این برنامه dynamic نیست و به صورت static می باشد:

    not a dynamic executable

حال چرا این فایل static است؟ برای این که خود این برنامه یک فایل کش برای خود ایجاد می کند که در ادامه توضیح می دهیم.

ولی برای مثال برنامه ls یک dynamic است:

# ldd /bin/ls
ls     lsblk  lsmod  
root@funlife:/home/jadi/Downloads# ldd /bin/ls
    linux-vdso.so.1 =>  (0x00007fffef1fc000)
    libselinux.so.1 => /lib/x86_64-linux-gnu/libselinux.so.1 (0x00007f61696b3000)
    libacl.so.1 => /lib/x86_64-linux-gnu/libacl.so.1 (0x00007f61694aa000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f61690e4000)
    libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007f6168e77000)
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f6168c73000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f61698f8000)
    libattr.so.1 => /lib/x86_64-linux-gnu/libattr.so.1 (0x00007f6168a6d000)
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f616884f000)

Dynamic library configs چیست؟

ما یک فایلی در لینوکس داریم در مسیر /etc/ld.so.conf.d/ که اگر از آن cat بگیریم به ما می گوید برو تنظیمات رو از مسیر /etc/ld.so.conf.d/*.conf  اجرا کن. (نکته: این فایل کانفیگ اصلی است)

# cat /etc/ld.so.conf
include /etc/ld.so.conf.d/*.conf

حال اگر مسیر /etc/ld.so.conf.d/*.conf را cat کنیم باز هم می گوید هر تنظیم کجاست و ممکن است شما را به مسیر های مختلف انتقال دهد.

# cat /etc/ld.so.conf
include /etc/ld.so.conf.d/*.conf

# ls /etc/ld.so.conf.d/
fakeroot-x86_64-linux-gnu.conf          i686-linux-gnu.conf                     x86_64-linux-gnu_EGL.conf               
i386-linux-gnu.conf                     libc.conf                               x86_64-linux-gnu_GL.conf                
i386-linux-gnu_GL.conf                  x86_64-linux-gnu.conf                   x86_64-linux-gnu_mirclient8driver.conf  

# cat /etc/ld.so.conf.d/libc.conf 
# libc default configuration
/usr/local/lib

root@funlife:/sbin# cat /etc/ld.so.conf.d/x86_64-linux-gnu_GL.conf 
/usr/lib/x86_64-linux-gnu/mesa

حال لینوکس برای این که سریع عمل کند و نیاز نباشد هر سری برود و تمام این فایل های تو در تو را پیدا کند با کمک دستور ldconfig تمام مسیرها و Library ها را پیدا می کند و همه مسیر ها را در یک فایل به نام etc/ld.so.cache/ ذخیره می کند که ما با دستور زیر چند خط اول این فایل کش را نمایش داده ایم:

# ldconfig -p | head
1358 libs found in cache `/etc/ld.so.cache'
    libzvbi.so.0 (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libzvbi.so.0
    libzvbi-chains.so.0 (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libzvbi-chains.so.0
    libzephyr.so.4 (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libzephyr.so.4
    libzeitgeist-2.0.so.0 (libc6,x86-64) => /usr/lib/x86_64-linux-gnu/libzeitgeist-2.0.so.0
    libzeitgeist-1.0.so.1 (libc6,x86-64) => /usr/lib/libzeitgeist-1.0.so.1
    libzbar.so.0 (libc6,x86-64) => /usr/lib/libzbar.so.0
...
...

symbolic links در لینوکس چیست و چه کاربردی در librarie ها دارد؟

symbolic links ها به صورت خلاصه مانند shortcut عمل می کند، یعنی یک محتوا می تواند چند اسم متفاوت داشته باشد. حالا دلیل این که در librarie ها از آن استفاده می کنیم این است که به مرور زمان ورژن librarie ها تغییر می کند و ممکن است اسم آن ها نیز تغییر کند برای مثال به دستورات زیر نگاه کنید:

# locate libudev.so.1
/lib/i386-linux-gnu/libudev.so.1

ما اگه مسیر libudev.so.1 را با دستور locate نمایش دهیم خروجی نمایش داده شده lib/i386-linux-gnu/libudev.so.1/ است، حال اگر ls از خود lib/i386-linux-gnu/libudev.so.1/ بگیریم به ما می گوید این فایل لینک شده است به فایل دیگری به اسم libudev.so.1.4.0 :

# ls -la /lib/i386-linux-gnu/libudev.so.1
lrwxrwxrwx 1 root root    16 Nov 13 23:05 /lib/i386-linux-gnu/libudev.so.1 -> libudev.so.1.4.0

LD_LIBRARY_PATH چیست؟

LD_LIBRARY_PATH یک متغیر محیطی (Environment variable) است. متغیرهای محیطی مجموعه‌ای از مقادیر نام‌گذاری‌شده هستند که می‌توانند نحوه رفتار کردن فرایندهای در حال اجرا را تغییر داده و بر روی آنها اثر بگذارند. متغیرهای محیطی، از فرایند والد به فرایندهای فرزند به ارث می‌رسند.

این متغیرها بخشی از محیط عملیاتی هستند که فرایند در آن اجرا می‌شود. به عنوان مثال، یک فرایند در حال اجرا می‌تواند مقدار متغیر TEMP را بخواند تا محل مناسبی برای ذخیره کردن فایل‌های موقت خود پیدا کند؛ یا همینطور می‌تواند با خواندن متغیرهای HOME و USERPROFILE، ساختار دایرکتوری که متعلق به کاربر صاحب فرایند است را پیدا کند. این متغیرها در شکل مدرن خود در سال ۱۹۷۹ و در نسخه ۷ یونیکس معرفی شدند و از آن موقع تا کنون در تمامی نسخه‌های یونیکس از لینوکس تا مک اواس ده بکار گرفته شده‌اند.

تمام متغیر محیطی (Environment variable) لینوکس - مدیریت کتابخانه‌های اشتراکی
تمام متغیر محیطی (Environment variable) لینوکس – مدیریت کتابخانه‌های اشتراکی

با دستور:

export

تمام متغیر محیطی (Environment variable) لینوکس را به ما نمایش می دهد که یکی از آن ها LD_LIBRARY_PATH می باشد librarie های dynamic را به ما نمایش می دهد.

export  LD_LIBRARY_PATH=/usr/lib/myoldlibs:/home/user/lpic/libs/

با دستور بالا ما به لینوکس میگیم قبل از این که مسیر های استاندارد را برای librarie ها برسی کنی اول بیاد این مسیر هایی که من معرفی کردم را چک کن و اگر librarie مورد نظر پیدا نشد برو و دیگر مسیر ها را برسی کن، کاربرد این کار هم به دو صورت است، اول این که ممکن است من خودم یک librarie جدید نوشته ام و دوم این که نیاز به یک librarie قدیمی برای نصب یک برنامه قدیمی دارم.

Shares:

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *