<?xml version="1.0"?>
<rss version="2.0"><channel><title>DevOps: &#x631;&#x64A;&#x62F;&#x647;&#x627;&#x62A; (Red Hat)</title><link>https://academy.hsoub.com/devops/linux/redhat/?d=4</link><description>DevOps: &#x631;&#x64A;&#x62F;&#x647;&#x627;&#x62A; (Red Hat)</description><language>ar</language><item><title>&#x625;&#x639;&#x62F;&#x627;&#x62F; &#x627;&#x644;&#x627;&#x633;&#x62A;&#x64A;&#x62B;&#x627;&#x642; &#x628;&#x627;&#x633;&#x62A;&#x62E;&#x62F;&#x627;&#x645; LDAP &#x639;&#x644;&#x649; Red Hat Enterprise Linux</title><link>https://academy.hsoub.com/devops/linux/redhat/%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF-%D8%A7%D9%84%D8%A7%D8%B3%D8%AA%D9%8A%D8%AB%D8%A7%D9%82-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-ldap-%D8%B9%D9%84%D9%89-red-hat-enterprise-linux-r749/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2016_12/redhat-LDAP.png.777e59156f481c5c56bbc832f1bf41ca.png" /></p>

<p>
	يتناول هذا المقال المفاهيم الأساسيّة للاستيثاق باستخدام LDAP: ماهيّته، متى يُستخدَم ولماذا؛ وكيفيةَ ضبط خادوم LDAP وإعداد عميل للاستيثاق عن طريقه اعتمادا على Red Hat Enterprise Linux 7. سنركّز في هذا الدّرس على الاستيثاق المعتمد على LDAP رغم وجود طرق أخرى للاستيثاق.
</p>

<h2 id="بيئة-المختبر">
	بيئة المختبر
</h2>

<p>
	سنفترض وجود بيئة اختبار مكوّنة من جهازيْن تشغّلهما توزيعة RHEL 7:
</p>

<ul>
<li>
		الخادوم: <code>192.168.2.100</code> واسم <a href="https://academy.hsoub.com/devops/servers/%D9%85%D9%82%D8%AF%D9%91%D9%85%D8%A9-%D8%A5%D9%84%D9%89-%D9%85%D9%8F%D8%B5%D8%B7%D9%8E%D9%84%D8%AD%D8%A7%D8%AA-%D9%88%D8%B9%D9%86%D8%A7%D8%B5%D8%B1-%D9%88%D9%85%D9%81%D8%A7%D9%87%D9%8A%D9%85-%D9%86%D8%B8%D8%A7%D9%85-%D8%A3%D8%B3%D9%85%D8%A7%D8%A1-%D8%A7%D9%84%D9%86%D8%B7%D8%A7%D9%82%D8%A7%D8%AA-r5/" rel="">نطاقه المعرَّف بالكامل</a> <code>academy1.virtuallab.dev</code>.
	</li>
	<li>
		العميل: <code>192.168.2.200</code> واسم نطاقه المعرَّف بالكامل <code>ldapclient.virtuallab.dev</code>.
	</li>
</ul>
<p>
	راجع مقال <a href="https://academy.hsoub.com/devops/servers/%D8%A5%D9%86%D8%B4%D8%A7%D8%A1-%D8%B4%D8%A8%D9%83%D8%A9-%D8%AF%D8%A7%D8%AE%D9%84%D9%8A%D8%A9-%D8%A7%D9%81%D8%AA%D8%B1%D8%A7%D8%B6%D9%8A%D8%A9-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-oracle-virtualbox-r263/" rel="">إنشاء شبكة داخلية افتراضية باستخدام Oracle VirtualBox</a> للمزيد حول إنشاء هذه البيئة باستخدام Oracle VirtualBox، ومقال حول<a href="https://academy.hsoub.com/certificates/redhat/rhcsa/%D8%AA%D8%A3%D9%85%D9%8A%D9%86-%D8%A7%D9%84%D8%A7%D8%AA%D8%B5%D8%A7%D9%84%D8%A7%D8%AA-%D8%B9%D9%86-%D8%B7%D8%B1%D9%8A%D9%82-ssh-%D9%88%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF-%D8%A3%D8%B3%D9%85%D8%A7%D8%A1-%D8%A7%D9%84%D9%85%D8%B6%D9%8A%D9%81%D8%A7%D8%AA-%D8%B9%D9%84%D9%89-red-hat-enterprise-linux-r47/#%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF-%D8%A7%D9%84%D8%B4%D8%A8%D9%83%D8%A9-%D9%88%D8%AA%D9%85%D9%8A%D9%8A%D8%B2-%D8%A7%D9%84%D8%A3%D8%B3%D9%85%D8%A7%D8%A1-name-resolution#%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF-%D8%A3%D8%B3%D9%85%D8%A7%D8%A1-%D8%A7%D9%84%D9%85%D8%B6%D9%8A%D9%81%D8%A7%D8%AA" rel=""> إعداد أسماء المضيفات</a>.
</p>

<h2 id="ما-هو-ldap">
	ما هو LDAP؟
</h2>

<p>
	يعرفّ LDAP (اختصار لـLightweight Directory Access Protocol، الميثاق الخفيف للوصول إلى الدّليل) مجموعة من البروتوكولات التي تسمح لعميل بالوصول إلى معلومات مخزّنة مركزيًّا عبر الشبكة. يتعلّق الأمر بمعلومات يُتاح الوصول إليها من أماكن مختلفة أو لمستخدمين كثر؛ مثل صدفات الدّخول (الولوج) Login shells، مسارات الوصول إلى المجلّدات الشخصيّة للمستخدمين أو معلومات أخرى - عناوين أشخاص، أرقام هواتف - عن مستخدمي النظام، على سبيل المثال لا الحصر. جعلُ هذه المعلومات في مكان مركزي يسهّل من صيانتها وتحديثها ويعني أنه يمكن لأي شخص الوصول إليها إذا كان لديه التصريح بذلك.
</p>

<p>
	يدور LDAP حول مفاهيم أساسية ثلاثة:
</p>

<ul>
<li>
		مَدخَل Entry: يُمثّل المَدخَل في LDAP معلومة أو وحدة معلومات، ويُعرَّف باسم مُميَّز Distinguished name.
	</li>
	<li>
		خاصيّة Attribute: وهي بيانات تتعلّق بالمَدخَل.
	</li>
	<li>
		قيم Values: تُسنَد لكلّ خاصيّة قيمة أو مجموعة قيم تفصِل بينها مسافة. يُشار إلى القيمة الوحيدة في المَدخَل (أي التي لا توجد إلا مرة واحدة في خاصيّات المدخل) بالاسم المُميَّز النسبي Relative Distinguished Name.
	</li>
</ul>
<p>
	سنرى في الخطوة التاليّة كيفية تثبيت LDAP على كلّ من الخادوم والعميل.
</p>

<h2 id="تثبيت-ldap-وإعداده-على-الخادوم-والعميل">
	تثبيت LDAP وإعداده على الخادوم والعميل
</h2>

<p>
	يُنفّذ برنامج OpenLDAP مبادئ LDAP على RHEL 7؛ يمكن تثبيته على الخادوم والعميل على التوالي بالأمرين التاليّين:
</p>

<pre class="ipsCode" id="ips_uid_3101_7">
# yum update &amp;&amp; yum install openldap openldap-clients openldap-servers
# yum update &amp;&amp; yum install openldap openldap-clients nss-pam-ldapd</pre>

<p>
	تحوي الحزمة <code>nss-pam-ldapd</code> التي نثبّتها على العميل مجموعة دوال مهمّتها البحث عن معلومات في دليل LDAP والاستيثاق من المستخدمين بناءً على المعلومات المتوفّرة على خادوم LDAP.
</p>

<p>
	يجب أن نعدّ بضعة أمور بعد اكتمال التثبيت.
</p>

<ol>
<li>
		<p>
			تأكّد من SELinux يسمح لـLDAP بالعمل عن طريق تفعيل الإعدادات التاليّة على كلّ من الخادوم والعميل. لا تنس استخدام الخيار <code>P-</code> حتى تستمر التعديلات لما بعد إعادة تشغيل النّظام:
		</p>

		<pre class="ipsCode" id="ips_uid_3101_9">
# setsebool -P allow_ypbind=1 authlogin_nsswitch_use_ldap=1</pre>

		<p>
			يتطلّب الاستيثاق عبر LDAP تفعيل الإعداد <code>allow_ypbind</code>، بينما تحتاج برامج أخرى تفعيل الإعداد <code>authlogin_nsswitch_use_ldap</code> حتى يمكنها استخدام LDAP للاستيثاق.
		</p>

		<p>
			ثم نفعّل خدمة <code>slapd</code> التي تنصِت للاتصالات القادمة إلى خادوم LDAP، مبدئيّا على المنفذ <code>389</code> وتجيب على الطلبات التي تتلقّاها عبر هذه الاتصالات:
		</p>

		<pre class="ipsCode" id="ips_uid_3101_11">
# systemctl enable slapd.service
# systemctl start slapd.service</pre>

		<p>
			تذكّر أن <a href="https://academy.hsoub.com/certificates/redhat/rhcsa/%d9%85%d8%a8%d8%a7%d8%af%d8%a6-%d8%a5%d8%af%d8%a7%d8%b1%d8%a9-%d8%a7%d9%84%d8%b9%d9%85%d9%84%d9%8a%d8%a7%d8%aa-processes-%d8%b9%d9%84%d9%89-redhat-enterprise-linux-r44/#%D9%85%D9%82%D8%AF%D9%85%D8%A9-%D8%A5%D9%84%D9%89-systemd" rel="">نظام التمهيد SystemD</a> يمكّنك من تعطيل الخدمة، إعادة تشغيلها أو إيقافها:
		</p>

		<pre>
 </pre>

		<pre class="ipsCode" id="ips_uid_3101_13">
# systemctl disable slapd.service
# systemctl restart slapd.service
# systemctl stop slapd.service
</pre>

		<p>
			تعمل خدمة <code>slapd</code> بصلاحيّات الحساب <code>ldap</code> (وهو ما يمكن التأكد منه بتنفيذ الأمر <code>ps -e -o <abbr title="Process IDentifier | معرّف العملية أو البرنامج">pid</abbr>,uname,comm | grep slapd</code>)، الأمر الذي يعني أن هذا الحساب يجب أن يكون مالكَ المجلّد <code>var/lib/ldap/</code> من أجل أن تستطيع خدمة <code>slapd</code> تعديل مداخل LDAP التي تُنشئها الأدوات الإداريّة، التي لا تعمل إلا بصلاحيّات الحساب الجذر، في المجلّد المذكور.
		</p>

		<p>
			تأكّد قبل تغيير ملكيّة المجلّد <code>var/lib/ldap/</code> من نسخ نموذج ملفّ الإعداد لقاعدة بيانات LDAP:
		</p>

		<pre class="ipsCode" id="ips_uid_3101_15">
# cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
# chown -R ldap:ldap /var/lib/ldap</pre>

		<p>
			 
		</p>
	</li>
	<li>
		<p>
			ضبط الحساب الإداري لـOpenLDAP وتعيين كلمة سرّ له:
		</p>

		<pre class="ipsCode" id="ips_uid_3101_17">
# slappasswd</pre>

		<p>
			مثل ما يظهر في الصّورة التالية:
		</p>

		<p>
			<a class="ipsAttachLink ipsAttachLink_image" data-fileid="18692" href="https://academy.hsoub.com/uploads/monthly_2016_08/01_slappasswd.png.37a07c4fd7199bebcafe321a7d5617bb.png" rel=""><img alt="01_slappasswd.png" class="ipsImage ipsImage_thumbnailed" data-fileid="18692" data-unique="kdlswktgh" src="https://academy.hsoub.com/uploads/monthly_2016_08/01_slappasswd.thumb.png.80363d0cfc5b65b380f9a947537ca32d.png"></a>
		</p>

		<p>
			ثم ننشئ ملفّ LDIF باسم <code>ldaprootpasswd.ldif</code>. ملفّات LDIF (اختصار لـ LDAP Data Interchange Format، صيغة تبادل البيانات في LDAP) هي تمثيل للبيانات الموجودة في خادوم LDAP والتغيرات التي تطرأ عليها. نضع البيانات التاليّة في الملفّ <code>ldaprootpasswd.ldif</code>:
		</p>

		<pre class="ipsCode" id="ips_uid_3101_19">
dn: olcDatabase={0}config,cn=config
    changetype: modify
    add: olcRootPW
    olcRootPW: {SSHA}PASSWORD</pre>

		<p>
			حيث:
		</p>

		<ul>
<li>
				<code>PASSWORD</code>: كلمة السّر التي حصلنا عليها أعلاه.
			</li>
			<li>
				<code>cn=config</code>: تشير إلى خيار إعداد عامّ.
			</li>
			<li>
				<code>olcDatabase</code>: اسم قاعادة بيانات معيّنة، توجد عادة على المسار <code>etc/openldap/slapd.d/cn=config/</code>.
			</li>
		</ul>
<p>
			يُضيف ملفّ <code>ldaprootpasswd.ldif</code> مدخلا إلى دليل LDAP. يشير كلّ سطر في هذا المدخل إلى خاصيّة وقيمتها اللتين تفصل بينهما نقطتان عموديّتان <code>:</code>؛ أي أن <code>changetype</code>، <code>add</code>، <code>dn</code> و<code>olcRootPW</code> خاصيّات توجد قيمها على نفس السّطر، يمين النقطتين.
		</p>

		<p>
			تنبغي المحافظة في الخطوات المواليّة على نفس الأسماء الشائعة =Common Names, cn المستخدمة أعلاه.
		</p>
	</li>
	<li>
		<p>
			نضيف الآن مدخلا إلى دليل LDAP باستخدام الأمر <code>ldapadd</code> وتحديد عنوان URI الخاصّ بالخادوم وملفّ LDIF الخاصّ بالمدخل على النحو التالي:
		</p>

		<pre class="ipsCode" id="ips_uid_3101_21">
# ldapadd -Y EXTERNAL -H ldapi:/// -f ldaprootpasswd.ldif</pre>

		<p>
			<img alt="02_ldapadd.png" class="ipsImage ipsImage_thumbnailed" data-fileid="18693" data-unique="77ln4inad" src="https://academy.hsoub.com/uploads/monthly_2016_08/02_ldapadd.png.ecb8efde5cf2335de020bbc0c14d605c.png"></p>

		<p>
			ثم نضيف تعريفات للدليل باستيراد الأمثلة الموجودة في المجلّد <code>etc/openldap/schema/</code>:
		</p>

		<pre>
 </pre>

		<pre class="ipsCode" id="ips_uid_3101_23">
# for def in cosine.ldif nis.ldif inetorgperson.ldif; do ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/openldap/schema/$def; done
</pre>

		<p>
			<a class="ipsAttachLink ipsAttachLink_image" data-fileid="18694" href="https://academy.hsoub.com/uploads/monthly_2016_08/03_ldapadd_import.png.d45ac3a7286220608980720f9c434fe4.png" rel=""><img alt="03_ldapadd_import.png" class="ipsImage ipsImage_thumbnailed" data-fileid="18694" data-unique="xfr4wa0ez" src="https://academy.hsoub.com/uploads/monthly_2016_08/03_ldapadd_import.thumb.png.3386f7731e08427c3ff0b8afe156e898.png"></a>
		</p>
	</li>
	<li>
		<p>
			جعل LDAP يستخدم اسم النطاق في قاعدة بياناته.
		</p>

		<pre class="ipsCode" id="ips_uid_3101_25">
dn:olcDatabase={1}monitor,cn=config
changetype:modify
replace: olcAccess
olcAccess: {0}to * by dn.base="gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth" read by dn.base="cn=Manager,dc=virtuallab,dc=dev" read by * none

dn:olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcSuffix
olcSuffix: dc=virtuallab,dc=dev

dn: olcDatabase={2}hdb,cn=config
changetype: modify
replace: olcRootDN
olcRootDN: cn=Manager,dc=virtuallab,dc=dev

dn: olcDatabase={2}hdb,cn=config
changetype: modify
add: olcRootPW
olcRootPW: {SSHA}07/TOeaEPDlpTscePfA5kyij9mmepdr0

dn: olcDatabase={2}hdb,cn=config
changetype: modify
add: olcAccess
olcAccess: {0}to attrs=userPassword,shadowLastChange by dn="cn=Manager,dc=virtuallab,dc=dev" write by anonymous auth by self write by * none
olcAccess: {1}to dn.base="" by * read olcAccess: {2}to * by dn="cn=Manager,dc=virtuallab,dc=dev" write by * read</pre>

		<p>
			نستخدم الأمر <code>ldapmodify</code> للتعديل على مَداخل الدليل:
		</p>

		<pre class="ipsCode" id="ips_uid_3101_27">
# ldapmodify -Y EXTERNAL -H ldapi:/// -f ldapdomain.ldif</pre>

		<p>
			<a class="ipsAttachLink ipsAttachLink_image" data-fileid="18695" href="https://academy.hsoub.com/uploads/monthly_2016_08/04_ldapmodify.png.2415fa96fd6f4715d35d25865d73e07f.png" rel=""><img alt="04_ldapmodify.png" class="ipsImage ipsImage_thumbnailed" data-fileid="18695" data-unique="0kfn677i1" src="https://academy.hsoub.com/uploads/monthly_2016_08/04_ldapmodify.thumb.png.2c170834dc59c8bf9912fc424b4ad0ab.png"></a>
		</p>
	</li>
	<li>
		<p>
			ننشئ ملفّ LDIF باسم <code>baseldapdomain.ldif</code> ونحدّد فيه مداخل لإضافتها إلى الدليل:
		</p>

		<pre class="ipsCode" id="ips_uid_3101_29">
    dn: dc=virtuallab,dc=dev
    objectClass: top
    objectClass: dcObject
    objectclass: organization
    o: virtuallab dev
    dc: virtuallab

    dn: cn=Manager,dc=virtuallab,dc=dev
    objectClass: organizationalRole
    cn: Manager
    description: Directory Manager

    dn: ou=People,dc=virtuallab,dc=dev
    objectClass: organizationalUnit
    ou: People

    dn: ou=Group,dc=virtuallab,dc=dev
    objectClass: organizationalUnit
    ou: Group</pre>

		<p>
			ثم نضيفها إلى الدليل بتنفيذ الأمر <code>ldapadd</code> (مع تحديد اسم النطاق المناسب):
		</p>

		<pre class="ipsCode" id="ips_uid_3101_31">
 # ldapadd -x -D cn=Manager,dc=virtuallab,dc=dev -W -f baseldapdomain.ldif</pre>

		<p>
			<strong>ملحوظة:</strong> أدخل كلمة السّر التي أنشأتها سابقا عندما تُطلب منك.
		</p>

		<p>
			<a class="ipsAttachLink ipsAttachLink_image" data-fileid="18696" href="https://academy.hsoub.com/uploads/monthly_2016_08/05_ldapadd_entry.png.7291bfeae7ebb83e7f94f9b228bf96a7.png" rel=""><img alt="05_ldapadd_entry.png" class="ipsImage ipsImage_thumbnailed" data-fileid="18696" data-unique="gjesgbnq4" src="https://academy.hsoub.com/uploads/monthly_2016_08/05_ldapadd_entry.thumb.png.a712bd8674d3d9cab2f421d21d2b4e36.png"></a>
		</p>
	</li>
	<li>
		<p>
			ننشئ حسابَ مستخدم لإضافته إلى دليل LDAP:
		</p>

		<pre class="ipsCode" id="ips_uid_3101_33">
# adduser ldapuser</pre>

		<p>
			نبدأ بإنشاء ملفّ LDIF باسم <code>ldapgroup.ldif</code> سنستخدمه لإضافة المجموعة التي ينتمي إليها المستخدم السّابق إلى الدّليل:
		</p>

		<pre>
 </pre>

		<pre class="ipsCode" id="ips_uid_3101_35">
# nano ldapgroup.ldif
</pre>

		<p>
			نضيف المحتوى التالي إلى الملفّ:
		</p>

		<pre>
 </pre>

		<pre class="ipsCode" id="ips_uid_3101_38">
dn: cn=Manager,ou=Group,dc=virtuallab,dc=dev
objectClass: top
objectClass: posixGroup
gidNumber: 1012
</pre>

		<p>
			قيمة الخاصيّة <code>gidNumber</code> هي معرّف المجموعة التي ينتمي إليها المستخدم <code>ldapuser</code>السابق. يمكن الحصول عليه بتنفيذ الأمر <code>id -g ldapuser</code>. ننفذ الأمر <code>ldapadd</code>على النحو التالي لإضافة مدخل لمجموعة المستخدم إلى الدليل:
		</p>

		<pre class="ipsCode" id="ips_uid_3101_42">
# ldapadd -x -W -D "cn=Manager,dc=virtuallab,dc=dev" -f ldapgroup.ldif</pre>

		<p>
			<a class="ipsAttachLink ipsAttachLink_image" data-fileid="18697" href="https://academy.hsoub.com/uploads/monthly_2016_08/06_ldapgroup.png.0a8c7425c727a2c5c6f349b66ca67b71.png" rel=""><img alt="06_ldapgroup.png" class="ipsImage ipsImage_thumbnailed" data-fileid="18697" data-unique="wkufou5dk" src="https://academy.hsoub.com/uploads/monthly_2016_08/06_ldapgroup.thumb.png.b3b66ad26f6bb8724ecb9d335fd0bf07.png"></a>
		</p>

		<p>
			نعرّف في ملفّ LDIF جديد باسم <code>ldapuser.ldif</code> بيانات المستخدم <code>ldapuser</code> (استخدم الأمر <code>slappasswd</code> لإنشاء كلمة سرّ للمستخدم وإضافتها للملف):
		</p>

		<pre class="ipsCode" id="ips_uid_3101_44">
dn: uid=ldapuser,ou=People,dc=virtuallab,dc=dev
objectClass: top
objectClass: account
objectClass: posixAccount
objectClass: shadowAccount
cn: ldapuser
uid: ldapuser
uidNumber: 1009
gidNumber: 1012
homeDirectory: /home/ldapuser
userPassword: {SSHA}9A93CS4LCUx9L8s6HPw1PB3ClH5JEI0U
loginShell: /bin/bash
gecos: ldapuser
shadowLastChange: 0
shadowMax: 0
shadowWarning: 0</pre>

		<p>
			ثم ننفّذ الأمر:
		</p>

		<pre class="ipsCode" id="ips_uid_3101_46">
# ldapadd -x -D cn=Manager,dc=virtuallab,dc=dev -W -f ldapuser.ldif</pre>

		<p>
			<a class="ipsAttachLink ipsAttachLink_image" data-fileid="18698" href="https://academy.hsoub.com/uploads/monthly_2016_08/07_ldapuser.png.bd08525fcd768cfe32543fc3b3abac83.png" rel=""><img alt="07_ldapuser.png" class="ipsImage ipsImage_thumbnailed" data-fileid="18698" data-unique="dl1qu7hi6" src="https://academy.hsoub.com/uploads/monthly_2016_08/07_ldapuser.thumb.png.feaff830b012f1ee1d261da7e5f74beb.png"></a>
		</p>

		<p>
			يمكن باستخدام الأمر <code>ldapdelete</code> حذفُ نفس المستخدم من الدليل على النحو التالي (لن نفعل ذلك هنا):
		</p>

		<pre>
 </pre>

		<pre class="ipsCode" id="ips_uid_3101_48">
# ldapdelete -x -W -D cn=Manager,dc=virtuallab,dc=dev "uid=ldapuser,ou=People,dc=virtuallab,dc=dev"
</pre>

		<p>
			نطلُب من <a href="https://academy.hsoub.com/certificates/redhat/rhcsa/%D9%85%D9%82%D8%AF%D9%91%D9%85%D8%A9-%D8%B9%D9%86-%D8%A7%D9%84%D8%AA%D8%AD%D9%83%D9%85-%D9%81%D9%8A-%D8%AD%D8%B1%D9%83%D8%A9-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-%D8%B9%D9%84%D9%89-%D8%A7%D9%84%D8%B4%D8%A8%D9%83%D8%A9-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-iptables-%D9%88firewalld-%D8%B9%D9%84%D9%89-red-hat-enterprise-linux-r50/" rel="">الجدار الناري</a> السماح لخدمة LDAP بالعمل على المنفذ <code>389</code>:
		</p>

		<pre class="ipsCode" id="ips_uid_3101_50">
# firewall-cmd --add-service=ldap
# firewall-cmd --permanent --add-port=389/tcp
# firewall-cmd reload</pre>

		<p>
			 
		</p>
	</li>
	<li>
		<p>
			ننتقل إلى العميل لتفعيل إمكانيّة التسجيل لمستخدمي LDAP.
		</p>

		<p>
			تأكّد من أن العميل يمكنه الوصول إلى الخادوم (والعكس). غيّر - إن لزم الأمر - <a href="https://academy.hsoub.com/certificates/redhat/rhcsa/%D8%AA%D8%A3%D9%85%D9%8A%D9%86-%D8%A7%D9%84%D8%A7%D8%AA%D8%B5%D8%A7%D9%84%D8%A7%D8%AA-%D8%B9%D9%86-%D8%B7%D8%B1%D9%8A%D9%82-ssh-%D9%88%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF-%D8%A3%D8%B3%D9%85%D8%A7%D8%A1-%D8%A7%D9%84%D9%85%D8%B6%D9%8A%D9%81%D8%A7%D8%AA-%D8%B9%D9%84%D9%89-red-hat-enterprise-linux-r47/#%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF-%D8%A7%D9%84%D8%B4%D8%A8%D9%83%D8%A9-%D9%88%D8%AA%D9%85%D9%8A%D9%8A%D8%B2-%D8%A7%D9%84%D8%A3%D8%B3%D9%85%D8%A7%D8%A1-name-resolution" rel="">ملفّ <code>etc/hosts/</code></a> لإضافة عنوان الخادوم على العميل (والعكس، العميل على الخادوم). ننفّذ الأمر التالي - على العميل - لضبط طرق الاستيثاق عليه:
		</p>

		<pre class="ipsCode" id="ips_uid_3101_52">
# authoconfig-tui</pre>

		<p>
			تظهر الواجهة التالية:
		</p>

		<p>
			<a class="ipsAttachLink ipsAttachLink_image" data-fileid="18699" href="https://academy.hsoub.com/uploads/monthly_2016_08/08_ldapuser.png.8e6ec45be6858a8643b2379a57f3405f.png" rel=""><img alt="08_ldapuser.png" class="ipsImage ipsImage_thumbnailed" data-fileid="18699" data-unique="qgwg1ab82" src="https://academy.hsoub.com/uploads/monthly_2016_08/08_ldapuser.thumb.png.6cc73dfc1da34de8ad4e358140aa0c09.png"></a>
		</p>

		<p>
			تأكد من تحديد خياري <code>Use LDAP</code> و<code>Use LDAP authentication</code> بوضع علامة <code>*</code> أمامهما. استخدم الأسهم للانتقال بين الخيارات، والمسافة لتفعيل خيّار أو تعطيله؛ ثم <code>Enter</code> عند الوصول إلى زرّ <code>Next</code>. أضف في الشاشة المواليّة عنوان خادوم LDAP بالصّيغة <code>ldap://academy1.virtuallab.dev</code> ثم الاسم المُميّز القاعدي DN. لم نستخدم شهادة <abbr title="Transport Layer Security | بروتوكول أمن طبقة النقل">TLS</abbr> لذا اترك الخيّار <code><abbr title="Transport Layer Security | بروتوكول أمن طبقة النقل">TLS</abbr></code> غير محدّد.
		</p>

		<p>
			<a class="ipsAttachLink ipsAttachLink_image" data-fileid="18691" href="https://academy.hsoub.com/uploads/monthly_2016_08/09_ldapuser.png.96c72d30dbe735a958b76e68439b4ae4.png" rel=""><img alt="09_ldapuser.png" class="ipsImage ipsImage_thumbnailed" data-fileid="18691" data-unique="c2mjwqjjb" src="https://academy.hsoub.com/uploads/monthly_2016_08/09_ldapuser.thumb.png.2a0af852f89ad41a0128deb6ef6ad842.png"></a>
		</p>

		<p>
			يمكننا الآن اختبار عمل LDAP على العميل بالبحث في الدليل عن المستخدم <code>ldapuser</code>:
		</p>

		<pre class="ipsCode" id="ips_uid_3101_54">
# ldapsearch -x cn=ldapuser -b dc=virtuallab,dc=dev</pre>

		<p>
			يجب أن تظهر جميع معلومات المستخدم <code>ldapuser</code> في الدليل:
		</p>

		<pre>
 </pre>

		<pre class="ipsCode" id="ips_uid_3101_56">
# extended LDIF
#
# LDAPv3
# base &lt;dc=virtuallab,dc=dev&gt; with scope subtree
# filter: cn=ldapuser
# requesting: ALL
#

# ldapuser, People, virtuallab.dev
dn: uid=ldapuser,ou=People,dc=virtuallab,dc=dev
objectClass: top
objectClass: account
objectClass: posixAccount
objectClass: shadowAccount
cn: ldapuser
uid: ldapuser
uidNumber: 1009
gidNumber: 1012
homeDirectory: /home/ldapuser
userPassword:: e1NTSEF9OUE5M0NTNExDVXg5TDhzNkhQdzFQQjNDbEg1SkVJMFU=
(...)
</pre>

		<p>
			نفس الشيء عند استخدام الأمر <code>getent</code> على العميل:
		</p>

		<pre class="ipsCode" id="ips_uid_3101_58">
# getent passwd ldapuser
ldapuser:x:1009:1012:ldapuser:/home/ldapuser:/bin/bash</pre>

		<p>
			 
		</p>
	</li>
</ol>
<p>
	ترجمة - يتصرّف - لمقال <a href="http://www.tecmint.com/setup-ldap-server-and-configure-client-authentication/" rel="external nofollow">RHCSA Series: Setting Up LDAP-based Authentication in RHEL 7 – Part 14</a> لصاحبه Gabriel Cánepa.
</p>
]]></description><guid isPermaLink="false">749</guid><pubDate>Tue, 29 Nov 2016 15:04:00 +0000</pubDate></item><item><title>&#x623;&#x633;&#x627;&#x633;&#x64A;&#x627;&#x62A; &#x627;&#x644;&#x62A;&#x62D;&#x643;&#x645; &#x641;&#x64A; &#x627;&#x644;&#x648;&#x635;&#x648;&#x644; &#x628;&#x627;&#x633;&#x62A;&#x62E;&#x62F;&#x627;&#x645; SELinux &#x641;&#x64A; Red Hat Enterprise Linux</title><link>https://academy.hsoub.com/devops/linux/redhat/%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D8%A7%D9%84%D8%AA%D8%AD%D9%83%D9%85-%D9%81%D9%8A-%D8%A7%D9%84%D9%88%D8%B5%D9%88%D9%84-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-selinux-%D9%81%D9%8A-red-hat-enterprise-linux-r747/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2016_12/redhat-SELinx.png.821586c39d8ead9d0d8f09ce197b43e4.png" /></p>

<p>
	عرضنا في دروس سابقة من هذه السلسلة لوسيلتين من وسائل التحكّم في الوصول على Red Hat Enterprise Linux، وهما <a href="https://academy.hsoub.com/certificates/redhat/rhcsa/%d8%a5%d8%af%d8%a7%d8%b1%d8%a9-%d8%a7%d9%84%d9%85%d8%b3%d8%aa%d8%ae%d8%af%d9%85%d9%8a%d9%86-%d9%88%d8%a7%d9%84%d9%85%d8%ac%d9%85%d9%88%d8%b9%d8%a7%d8%aa-%d8%b9%d9%84%d9%89-red-hat-enterprise-linux-r42/#%D8%A5%D8%AF%D8%A7%D8%B1%D8%A9-%D8%A3%D8%B0%D9%88%D9%86%D8%A7%D8%AA-permissions-%D8%A7%D9%84%D9%85%D8%B3%D8%AA%D8%AE%D8%AF%D9%85%D9%8A%D9%86" rel="">إدارة الأذونات</a> و<a href="https://academy.hsoub.com/certificates/redhat/rhcsa/%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D9%82%D9%88%D8%A7%D8%A6%D9%85-%D8%A7%D9%84%D8%AA%D8%AD%D9%83%D9%85-%D9%81%D9%8A-%D8%A7%D9%84%D9%88%D8%B5%D9%88%D9%84-acl-%D9%88%D8%AA%D8%B1%D9%83%D9%8A%D8%A8-%D8%A3%D9%86%D8%B8%D9%85%D8%A9-%D8%A7%D9%84%D9%85%D9%84%D9%81%D8%A7%D8%AA-%D8%A7%D9%84%D8%B4%D8%A8%D9%83%D9%8A%D8%A9-%D8%B9%D9%84%D9%89-red-hat-enterprise-linux-r46/" rel="">قوائم التحكّم في الوصول</a>. هاتان الآليتان مهمتان وأساسيّتان؛ إلا أن لديهما نقاطَ قصور تأتي آليّة أخرى تُسمّى Security Enhanced Linux (التأمين المُعزَّز في لينكس، وتشتهر بـSELinux) للتغلّب عليها. تنبغي الإشارة هنا إلى أن SELinux ليست الآليّة الوحيدة المستخدمة في توزيعات لينكس للتغلّب على عوامل النّقص في الآليتين المُشار إليهما سابقا. توجد آليّة أخرى تُسمّى AppArmor تتبناها توزيعات مثل Suse وUbuntu.
</p>

<p>
	عند ما يُشغّل مستخدم برنامجا فإن العمليّة Process التي يُنفّذها تعمل بصلاحيّات هذا المستخدِم. يمكن في غياب آليّة مثل SELinux أن تنفّذ أي عمليّة الإجراءات التي تريد على الملفات التي يمكن للمستخدم الذي تعمل بصلاحياته الوصول إليها، مما قد يتسبّب الوصول غير المرخَّص إلى كامل النظام.
</p>

<p>
	بدأت وكالة الأمن القومي الأمريكية NSA بتصميم SELinux من أجل تقييد قدرة العمليّات على الوصول إلى الكائنات (مثل الملفات، المجلدات، منافذ الشبكة، ..إلخ) أو إجراء عمليّات عليها؛ وقصرها على الحدّ الأدنى. يمكن تعديل التقييدات التي يُطبّقها نظام SELinux حسب الحاجة. تُضمِّن توزيعة Red Hat Enterprise Linux 7 وحدة خاصّة بنظام SELinux في النواة وتُفعّل مبدئيا وضع Enforcing. سنشرح في هذا الدّرس المفاهيم الأساسيّة التي يعتمد عليها نظام SELinux في عمله.
</p>

<h2 id="الأوضاع-modes-في-selinux">
	الأوضاع Modes في SELinux
</h2>

<p>
	يعمل SELinux في أحد الأوضاع الثلاثة التالية:
</p>

<ul>
<li>
		<code>Enforcing</code>: يمنع SELinux في هذه الحالة الوصول إلى الكائنات بناءً على مجموعة قواعد السياسة الأمنيّة المعرَّفة في النظام.
	</li>
	<li>
		<code>Permissive</code>: لا يمنع SELinux في هذا الوضع العمليّات من الوصول إلى الكائنات، ويكتفي بتسجيل الإجراءات التي كانت ستُمنَع لو كان الوضع <code>Enforcing</code> مستخدما.
	</li>
	<li>
		<code>Disabled</code>. نظام SELinux معطَّل.
	</li>
</ul>
<p>
	يُظهر الأمر <code>getenforce</code> الوضع الذي يعمل عليه SELinux حاليا؛ بينما يضبط الأمر <code>setenforce</code> وضع SELinux للجلسة الحاليّة، ويتلقّى أحد معطييْن: <code>1</code> لوضع <code>Enforcing</code> و<code>0</code> لوضع <code>Permissive</code>. إن أردت أن يكون تغيير وضع عمل SELinux دائما ولا يقتصر على الجلسة الحاليّة فستحتاج لتحرير الملفّ <code>etc/selinux/config/</code> وتعيين قيمة التعليمة <code>SELINUX</code> بالوضع الذي تريد: <code>permissive</code>، <code>enforcing</code> أو <code>disabled</code>:
</p>

<pre class="ipsCode" id="ips_uid_4375_7">
# getenforce
Enforcing
# setenforce 0
# getenforce
Permissive
# setenforce 1
# getenforce
Enforcing
# cat /etc/selinux/config

    # This file controls the state of SELinux on the system.
    # SELINUX= can take one of these three values:
    #     enforcing - SELinux security policy is enforced.
    #     permissive - SELinux prints warnings instead of enforcing.
    #     disabled - No SELinux policy is loaded.
    SELINUX=enforcing
    # SELINUXTYPE= can take one of three two values:
    #     targeted - Targeted processes are protected,
    #     minimum - Modification of targeted policy. Only selected processes are protected. 
    #     mls - Multi Level Security protection.
    SELINUXTYPE=targeted</pre>

<p>
	يُستخدَم الأمر <code>setenforce</code> عادةً للانتقال بين وضعيْ <code>Enforcing</code> و<code>Permissive</code> أثناء البحث عن أسباب مشكل. مثلا؛ إن ظهر المشكال أثناء تفعيل الوضع <code>Enforcing</code> واختفى عند الانتقال إلى الوضع <code>Permissive</code> فهذا يعني أن المشكل يتعلّق بقاعدة في سياسة SELinux الأمنيّة.
</p>

<h2 id="السياقات-contexts-في-selinux">
	السيّاقات Contexts في SELinux
</h2>

<p>
	السيّاقات هي بيئة تحكّم في الوصول تُتخَّذ فيها الإجراءات بناء على مستخدم SELinux، الدّور Role والنوع Type وبصيغة اختيارية المستوى Level:
</p>

<ul>
<li>
		يُكمّل المستخدمون في SELinux المستخدمين العاديّن، إذ يربط SELinux حساب المستخدم العادي بحساب في SELinux. يُستخدَم حساب SELinux في السيّاق للتحكّم في العمليات من أجل تعريف أدوارها ومستوياتها.
	</li>
	<li>
		يعمل الدّور وسيطا بين أنواع الملفّات والمستخدمين في SELinux إذ يُعرّف ماهي أنواع الملفات التي يمكن لمستخدمي SELinux الوصول إليها. تُساهم الأدوار في الحؤول دون الثغرات التي تؤدي إلى هجمات الارتقاء في الصلاحيّات Privilege escalation.
	</li>
	<li>
		يعرّف SELinux نوعًا لكلّ ملفّ أو عمليّة. تُمنَع العمليّات في الظروف العاديّة من الوصول إلى الملفات التي تستخدمها عمليّات أخرى، أو من الوصول إلى هذه العمليّات. لا يُسمَح لعمليّة بالوصول إلى ملفّات إلا إذا أضيفت قاعدة إلى الساسية الأمنية تُصرّح لها بالوصول إلى النوع المستهدف.
	</li>
</ul>
<p>
	سنرى في ما يلي أمثلة لعمل SELinux.
</p>

<h3 id="تغيير-المنفذ-المبدئي-لخدمة-ssh">
	تغيير المنفذ المبدئي لخدمة <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr>
</h3>

<p>
	شرحنا في درس <a href="https://academy.hsoub.com/certificates/redhat/rhcsa/%D8%AA%D8%A3%D9%85%D9%8A%D9%86-%D8%A7%D9%84%D8%A7%D8%AA%D8%B5%D8%A7%D9%84%D8%A7%D8%AA-%D8%B9%D9%86-%D8%B7%D8%B1%D9%8A%D9%82-ssh-%D9%88%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF-%D8%A3%D8%B3%D9%85%D8%A7%D8%A1-%D8%A7%D9%84%D9%85%D8%B6%D9%8A%D9%81%D8%A7%D8%AA-%D8%B9%D9%84%D9%89-red-hat-enterprise-linux-r47/" rel="">سابق</a> أن تغيير المنفذ المبدئي الذي تنصت عبره خدمة <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr> هو أحد الإجراءات الأمنيّة المتّبعة لتأمين الخادوم ضدّ الهجمات القادمة من شبكة الإنترنت. نحرّر الملفّ <code>etc/<abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">ssh</abbr>/sshd_config/</code> لتغييرالمنفذ الذي تعمل عبره هذه الخدمة ليصبح المنفذ رقم <code>9999</code> (انزع علامة التعليق <code>#</code> عن التعليمة <code>Port</code> وحدّد القيمة <code>9999</code> بدلا من <code>22</code>):
</p>

<pre>
 </pre>

<pre class="ipsCode" id="ips_uid_4375_9">
Port 9999
</pre>

<p>
	نحفظ التعديلات ونعيد تشغيل خدمة <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr> (لاحظ الحرف <code>d</code> في نهاية اسم الخدمة):
</p>

<pre class="ipsCode" id="ips_uid_4375_11">
# systemctl restart sshd
# systemctl status sshd</pre>

<p>
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="18634" href="https://academy.hsoub.com/uploads/monthly_2016_07/01_sshd_status_error.png.9274d34851d5df4983fade8ecd3381eb.png" rel=""><img alt="01_sshd_status_error.png" class="ipsImage ipsImage_thumbnailed" data-fileid="18634" data-unique="7z3mih540" src="https://academy.hsoub.com/uploads/monthly_2016_07/01_sshd_status_error.thumb.png.d2396c903800560610283d4540bef84c.png"></a>
</p>

<p>
	غيّرنا المنفذ الذي تُنصت عبره خدمة <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr> ثم أعدنا تشغيل العمليّة <code>sshd</code> التي تتحكّم في الخدمة ولكن إعادة تشغيل الخدمة أخفقت كما يظهر ذلك عند إظهار حالة الخدمة (الأمر <code>systemctl status</code>). إن كنت تستخدم واجهة رسوميّة فستظهر رسالة بعد تنفيذ أمر إعادة التشغيل تفيد بأن SELinux لاحظ أمرا ما. مالذي حصل إذن؟
</p>

<p>
	يمكّن الفحص السّريع لملف السّجل <code>var/log/audit/audit.log/</code> الذي يحوي معلومات متعلّقة بالأحداث الأمنية على مستوى نظام التشغيل من الحصول على معلومات عن ما حدث. يُشار في ملفّ السّجل المذكور بالنوع <code>AVC</code> إلى المعلومات المتعلقة بـSELinux؛ تمكننا الاستعانة بهذه المعلومة للبحث في المُدخلات ذات الصّلة بـSELinux:
</p>

<pre>
 </pre>

<pre class="ipsCode" id="ips_uid_4375_13">
# grep AVC /var/log/audit/audit.log | tail -1
</pre>

<p>
	نلاحظ أن الخدمة <code>sshd</code> مُنعت من استخدام المنفذ <code>9999</code> نظرا لكونه محجوزا لصالح خدمة أخرى (JBoss Management):
</p>

<p>
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="18635" href="https://academy.hsoub.com/uploads/monthly_2016_07/02_sshd_audit_log.png.8c72005e272dcbc22abe50aa5324c0fd.png" rel=""><img alt="02_sshd_audit_log.png" class="ipsImage ipsImage_thumbnailed" data-fileid="18635" data-unique="w5juzod95" src="https://academy.hsoub.com/uploads/monthly_2016_07/02_sshd_audit_log.thumb.png.45300151784e190c7e478c4f6a07c206.png"></a>
</p>

<p>
	يمكنك تعطيل SELinux كما هو موضّح أعلاه وإعادة تشغيل خدمة <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr> وستجد أن الخدمة تعمل على المنفذ الجديد؛ لكن <strong>لا تفعل</strong>. سنستخدم أداة <code>semanage</code> لإخبارنا بما يجب فعله لنتمكّن من تشغيل خدمة <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr> على أي منفذ نريده دون مشاكل. ننفّذ الأمر التالي للحصول على لائحة بالمنافذ التي يسمح SELinux لخدمة <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr> بالإنصات للاتّصالات القادمة عبرها:
</p>

<pre class="ipsCode" id="ips_uid_4375_15">
# semanage port -l | grep <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">ssh</abbr>
ssh_port_t      tcp     22</pre>

<p>
	يظهر في نتيجة الأمر أن SELinux يسمح لـSSH بالإنصات للاتّصالات القادمة عبر المنفذ 22 فقط، لا غير.
</p>

<p>
	ما سنفعله الآن هو العودة إلى ملفّ إعداد <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr> على المسار <code>etc/<abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">ssh</abbr>/sshd_config/</code> وتغيير المنفذ من <code>9999</code> إلى <code>9998</code>:
</p>

<pre>
 </pre>

<pre class="ipsCode" id="ips_uid_4375_17">
Port 9998
</pre>

<p>
	ثم نضيف المنفذ <code>9998</code> إلى السيّاق <code>ssh_port_t</code> ونعيد تشغيل الخدمة:
</p>

<pre class="ipsCode" id="ips_uid_4375_19">
# semanage port -a -t ssh_port_t -p tcp 9998
# systemctl restart sshd
# systemctl is-active sshd</pre>

<p>
	<img alt="03_ssh_context_port.png" class="ipsImage ipsImage_thumbnailed" data-fileid="18633" data-unique="kkrso858t" src="https://academy.hsoub.com/uploads/monthly_2016_07/03_ssh_context_port.png.2237c6648cb87f78acc6a4a458fa2cf3.png"></p>

<p>
	تمكن ملاحظة أن الخدمة شُغّلت دون أية مشاكل هذه المرة. يوضّح هذا المثال كيف أن SELinux يتحكّم في منافذ الشبكة بالاعتماد على تعريفاته الخاصّة لنوع كلّ منفذ.
</p>

<h3 id="السماح-لخدمة-httpd-بالوصول-إلى-خدمة-sendmail">
	السّماح لخدمة httpd بالوصول إلى خدمة sendmail
</h3>

<p>
	ذكرنا أن SELinux يتحكّم في إمكانيّة وصول عمليّة Process إلى عمليّات أخرى. سنرى الآن مثالا على ذلك. سنفترض أنك تريد تفعيل وحدتي <code>mod_security</code> و<code>mod_evasive</code> على خادوم وِب Apache واستخدامهما لإرسال إشعارات بالبريد الإلكتروني (خدمة <code>sendmail</code>) عند حدوث هجمة حجب خدمة (Dos, Denial of Service). تحتاج في هذه الحالة للسماح لخادوم وِب Apache (خدمة <code>httpd</code>) بالوصول إلى خدمة البريد <code>sendmail</code>.
</p>

<p>
	توجد في SELinux إعدادات تشغيل تُسمّى SELinux booleans (قيم منطقيّة) يمكن عبرها تعطيل أو تفعيل قواعد ضمن سياسة SELinux الأمنية. تُستخدم الأداة <code>semanage</code> للحصول على قائمة بجميع هذه الإعدادات:
</p>

<pre>
 </pre>

<pre class="ipsCode" id="ips_uid_4375_21">
# semanage boolean -l
</pre>

<p>
	يتحكّم الإعداد <code>httpd_can_sendmail</code> في إمكانيّة وصول الخدمة <code>httpd</code> إلى <code>sendmail</code>:
</p>

<pre class="ipsCode" id="ips_uid_4375_23">
# semanage boolean -l | grep httpd_can_sendmail
httpd_can_sendmail      (off, off)      Allow httpd to can sendmail</pre>

<p>
	يظهر في نتيجة الأمر أعلاه أن الإعداد مضبوط على القيمة <code>off</code> بمعنى أن القاعدة الأمنيّة معطّلة، نفعّلها على النحو التالي:
</p>

<pre>
 </pre>

<pre class="ipsCode" id="ips_uid_4375_25">
# setsebool -P httpd_can_sendmail 1
</pre>

<p>
	استخدمنا الأمر <code>setsebool</code> لتفعيل القاعدة بتمرير اسمها والقيمة <code>1</code> (تفعيل). يؤدي استخدام الخيار <code>P-</code> إلى استمرار مفعول الأمر (تفعيل القاعدة) بعد إعادة تشغيل الخادوم. يمكن التأكد من تغيير الإعداد بإعادة تنفيذ أمر <code>semanage</code> السابق:
</p>

<pre class="ipsCode" id="ips_uid_4375_27">
# semanage boolean -l | grep httpd_can_sendmail
httpd_can_sendmail      (on, off)      Allow httpd to can sendmail</pre>

<p>
	<strong>ملحوظة:</strong> يشير الحقل الثاني في نتيجة الأمر <code>semanage boolean</code> (أي <code>(on, off)</code>) في المثال أعلاه إلى قيمة الإعداد حاليّا (<code>on</code>)، وقيمته المبدئيّة (<code>off</code>).
</p>

<h3 id="تقديم-صفحة-وب-توجد-في-مجلد-مغاير-للمجلد-المبدئي">
	تقديم صفحة وِب توجد في مجلّد مغاير للمجلد المبدئي
</h3>

<p>
	سنفترض في هذا المثال أن لديك موقع وِب توجد صفحاته في المجلّد <code>websites/</code> بدلا من المجلّد المبدئي لخادوم الوِب (<code>var/www/html/</code>).
</p>

<ol>
<li>
		<p>
			أنشئ ملفا باسم <code>index.html</code> في المجلد <code>websites/</code> وأضف إليه المحتوى التالي:
		</p>

		<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4375_30">
<span class="tag">&lt;html&gt;</span><span class="pln">
  </span><span class="tag">&lt;h2&gt;</span><span class="pln">SELinux test</span><span class="tag">&lt;/h2&gt;</span><span class="pln">
</span><span class="tag">&lt;/html&gt;</span></pre>

		<p>
			إن نفّذت الأمر التالي:
		</p>

		<pre class="ipsCode" id="ips_uid_4375_32">
# ls -lZ /websites/index.html</pre>

		<p>
			فستجد أن الملفّ <code>index.html</code> من النوع <code>default_t</code> وهو النوع المبدئي في SELinux ولا يمكن لخادوم الوِب الوصولُ إليه.
		</p>
	</li>
	<li>
		<p>
			غيّر قيمة التعليمة <code>DocumentRoot</code> في الملفّ <code>etc/httpd/conf/httpd.conf/</code> لتصبح <code>websites/</code>. حدّث كتلة <code>Directory</code> التي يظهر فيها اسم المجلّد المبدئي السابق؛ مثلا:
		</p>

		<pre>
 </pre>

		<pre class="ipsCode" id="ips_uid_4375_34">
&lt;Directory "/var/www/html"&gt;
  ...
&lt;/Directory&gt;
</pre>

		<p>
			تصبح:
		</p>

		<pre class="ipsCode" id="ips_uid_4375_36">
&lt;Directory "/websites"&gt;
  ...
&lt;/Directory&gt;</pre>

		<p>
			 
		</p>
	</li>
	<li>
		<p>
			أعد تشغيل خادوم الوِب:
		</p>

		<pre class="ipsCode" id="ips_uid_4375_38">
# systemctl restart httpd</pre>

		<p>
			 
		</p>
	</li>
	<li>
		<p>
			أدخل عنوان الخادوم في المتصفّح (أو <code>127.0.0.1</code> إن كان المتصفّح على الخادوم). يجب أن تظهر رسالة خطأ <code>403</code> تفيد بأن الوصول إلى هذا المحتوى ممنوع.
		</p>

		<p>
			<strong>ملحوظة:</strong> إن ظهرت <a data-fileid="18551" href="https://academy.hsoub.com/uploads/monthly_2016_07/01_apache_homepage.thumb.png.ed0d487006e54e57185ec921e3e50d9d.png" rel="">الصفحة المبدئيّة</a> لخادوم الوِب فعلّق جميع الأسطر الموجودة في الملفّ <code>etc/httpd/conf.d/welcome.conf/</code> وأعد تشغيل خادوم الوِب.
		</p>
	</li>
	<li>
		<p>
			نعدّل نوع المجلّد <code>websites/</code> وجميع محتوياته ليصبح <code>httpd_sys_content_t type</code> (بدلا من النوع المبدئي <code>default_t</code>) ممّا يتيح لخادوم الوِب Apache الوصول إلى هذا المحتوى بصلاحيّة القراءة فقط:
		</p>

		<pre class="ipsCode" id="ips_uid_4375_40">
# semanage fcontext -a -t httpd_sys_content_t "/websites(/.*)?"</pre>

		<p>
			ثم نطبّق سياسة SELinux التي عدّلناها للتّو:
		</p>

		<pre class="ipsCode" id="ips_uid_4375_42">
# restorecon -R -v /websites</pre>

		<p>
			 
		</p>
	</li>
</ol>
<p>
	أعد تشغيل خادوم الوِب وافتح عنوان الخادوم في المتصفّح من جديد، وستجد أن خادوم الوِب يعرض محتوى ملفّ HTML الذي أنشأناه سابقا.
</p>

<p>
	موضوع SELinux متشعّب جدا؛ إلا أن المفاهيم التي عرضنا لها في هذا المقال ستمكّنك من إيجاد قاعدة تبني عليها للانتقال إلى مواضيع أخرى تتعلّق بنظام الحماية SELinux.
</p>

<p>
	ترجمة - بتصرّف - لمقال <a href="http://www.tecmint.com/selinux-essentials-and-control-filesystem-access/" rel="external nofollow">RHCSA Series: Mandatory Access Control Essentials with SELinux in RHEL 7 – Part 13</a> لصاحبه Gabriel Cánepa.
</p>
]]></description><guid isPermaLink="false">747</guid><pubDate>Tue, 15 Nov 2016 16:57:00 +0000</pubDate></item><item><title>&#x623;&#x62A;&#x645;&#x62A;&#x629; &#x62A;&#x62B;&#x628;&#x64A;&#x62A; Red Hat Enterprise Linux &#x628;&#x627;&#x633;&#x62A;&#x62E;&#x62F;&#x627;&#x645; Kickstart</title><link>https://academy.hsoub.com/devops/linux/redhat/%D8%A3%D8%AA%D9%85%D8%AA%D8%A9-%D8%AA%D8%AB%D8%A8%D9%8A%D8%AA-red-hat-enterprise-linux-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-kickstart-r748/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2016_11/redhat-Kickstart.png.2a64b50d2d8f7fefea719848753d93aa.png" /></p>

<p>
	يتطلّب عملُ مدير الأنظمة غالبا تثبيتَ نظام التشغيل على أكثر من خادوم؛ فسواء تعلّق الأمر بمركز بيانات أو بيئة للاختبار، سيجد مدير الأنظمة نفسه أمام مهمة تثبيت النظام على أكثر من جهاز. تأخذ الطريقة التقليدية في التثبيت الكثير من الوقت، خصوصا إذا كان عدد الخواديم معتبرا. تتيح Red Hat إمكانية تفادي ضياع الوقت في مثل هذه التثبيتات باستخدام أداة تثبيت تُعرَف بـKickstart.
</p>

<p>
	سنعرِض في هذا المقال لكيفية استخدام Kickstart لتثبيت Red Hat Enterprise Linux 7.
</p>

<h2 id="مقدمة-عن-kickstart-والتثبيت-المؤتمت-automated-installation">
	مقدمة عن Kickstart والتثبيت المؤتمَت Automated installation
</h2>

<p>
	تُستخدَم أداة Kickstart لأتمتة عمليات التثبيت على Red Hat Enterprise Linux وتوزيعات أخرى مشتقة من Fedora (مثل CentOS وOracle Linux)؛ يعني هذا أنّ تدخّل مدير النّظام أثناء عمليّة التثبيت سيكون في الحدّ الأدنى، على عكس عملية التثبيت الاعتيادية التي تتطلّب المتابعة المباشرة من مدير النظام للانتقال من خطوة إلى أخرى. يمكن باستخدام Kickstart الحصول على خواديم بأنظمة تشغيل متطابقة (نفس حزم البرامج وملفات الإعداد) بقليل من الجهد.
</p>

<h3 id="الاستعداد-للتثبيت-باستخدام-kickstart">
	الاستعداد للتثبيت باستخدام Kickstart
</h3>

<p>
	نحتاج لاتّباع الخطوات التاليّة لتنفيذ تثبيت عن طريق Kickstart:
</p>

<ol>
<li>
		إنشاء ملفّ Kickstart وهو ملفّ نصيّ توجد به خيّارات إعداد تُعرَّف مسبقا.
	</li>
	<li>
		توفير ملفّ Kickstart على وسيط تخزين (قرص مُدمَج، قرص صلب أو موقع على الشبكة). يستخدم العميل ملفّ <code>rhel-server-7.2-x86_64-boot.iso</code> للإقلاع عليه، وهو ملفّ ISO يحوي الملفات الأساسيّة فقط للتوزيعة؛ ثم نتيح ملف التوزيعة الكامل <code>rhel-server-7.0-x86_64-dvd.iso</code> على مورد على الشبكة، مثل <a href="https://academy.hsoub.com/certificates/redhat/rhcsa/%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF-%D8%AE%D8%A7%D8%AF%D9%88%D9%85-%D9%88%D9%90%D8%A8-%D9%88%D8%AE%D8%A7%D8%AF%D9%88%D9%85-ftp-%D8%B9%D9%84%D9%89-red-hat-enterprise-linux-r48/" rel="">خادوم HTTP (وِب) أو خادوم FTP</a>. يحوي الملفّ الكامل جميع الحزم الموجودة في التوزيعة ويُستخدَم لتثبيت الحزم التي نحدّدها في ملفّ Kickstart. سنستخدم في حالتنا خادوم RHEL 7 آخر على العنوان <code>192.168.2.100</code>.
	</li>
	<li>
		بدء التثبيت باستخدام Kickstart.
	</li>
</ol>
<p>
	يُنشأ ملفّ Kickstart من حساب زبناء Red Hat حيثُ توجد <a href="https://access.redhat.com/labs/kickstartconfig/" rel="external nofollow">أداة إعداد Kickstart</a>. استخدم هذه الأداة لتحديد خيارات التثبيت التي تناسبك، بعد التمعّن فيها جيدا. تتألف الأداة من مقاطع عدّة تشمل الإعدادات الأساسيّة مثل لغة الواجهة، لوحة المفاتيح والمنطقة الزمنيّة.
</p>

<p>
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="18687" href="https://academy.hsoub.com/uploads/monthly_2016_08/01_kickstart_generator.png.8b147b892c0c0ccf60d0afc936634fb5.png" rel=""><img alt="01_kickstart_generator.png" class="ipsImage ipsImage_thumbnailed" data-fileid="18687" data-unique="cx4b7vhp6" src="https://academy.hsoub.com/uploads/monthly_2016_08/01_kickstart_generator.thumb.png.4d02cfe7bef41c2e9aaf6e098fe88ee6.png"></a>
</p>

<p>
	كما تشمل الأداة جزءًا خاصًّا بمصدر التثبيت (قرص مُدمَج CD، خادوم وِب أو غيرهما).
</p>

<p>
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="18688" href="https://academy.hsoub.com/uploads/monthly_2016_08/02_kickstart_generator.png.1584bf2ba79c934a45a97d4ec8735c6f.png" rel=""><img alt="02_kickstart_generator.png" class="ipsImage ipsImage_thumbnailed" data-fileid="18688" data-unique="nh1jsl8f7" src="https://academy.hsoub.com/uploads/monthly_2016_08/02_kickstart_generator.thumb.png.bf643b74d09f9d8c932cec2cc196c08c.png"></a>
</p>

<p>
	يُعدّ ملفّ Kickstart مبدئيّا لتثبيت الحزم الأساسيّة للنّظام فقط، لكن يمكن تحديد حزم أخرى لتثبيتها.
</p>

<p>
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="18689" href="https://academy.hsoub.com/uploads/monthly_2016_08/03_kickstart_generator.png.9a334825bda395090d13abec90f90439.png" rel=""><img alt="03_kickstart_generator.png" class="ipsImage ipsImage_thumbnailed" data-fileid="18689" data-unique="009on2plb" src="https://academy.hsoub.com/uploads/monthly_2016_08/03_kickstart_generator.thumb.png.d6e85bae1860ee795ba7b2e0dfe24381.png"></a>
</p>

<p>
	إن قرّرت أن التثبيت سيكون عبر خادوم وِب، FTP أو <a href="https://academy.hsoub.com/tags/nfs/" rel="">NFS</a> فتأكّد من أن <a href="https://academy.hsoub.com/certificates/redhat/rhcsa/%D9%85%D9%82%D8%AF%D9%91%D9%85%D8%A9-%D8%B9%D9%86-%D8%A7%D9%84%D8%AA%D8%AD%D9%83%D9%85-%D9%81%D9%8A-%D8%AD%D8%B1%D9%83%D8%A9-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-%D8%B9%D9%84%D9%89-%D8%A7%D9%84%D8%B4%D8%A8%D9%83%D8%A9-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-iptables-%D9%88firewalld-%D8%B9%D9%84%D9%89-red-hat-enterprise-linux-r50/" rel="">الجدار الناري</a> على الخادوم معدّ للسماح بهذه الخدمات. حدّد خادوم وِب مصدرا للتثبيت في أداة إنشاء ملفّ Kickstart واستخدم <code>192.168.2.100</code> عنوانا للخادوم و<code>kickstart/media/</code> بوصفه المجلد الذي يوجد فيه ملفّ ISO الخاصّ بالنظام. نزل الملف بعد إكمال الإعدادات.
</p>

<p>
	يمكنك أيضا إنشاء ملفّ Kickstart يدويا دون اللّجوء إلى الأداة التي توفّرها Red Hat. نختار في المثال التالي لملفّ Kickstart أن تكون لغة التثبيت الإنكليزية، لوحة المفاتيح <code>us</code> والمنطقة الزمنية <code>Africa/Nouakchott</code>. بالنسبة للحزم فهي توجد بين التعليمتيْن <code>packages%</code> و<code>end%</code> وحدّدنا الحزم الأساسية، خادوم نسخ احتياطي Backup server وخادوم طباعة Print server. تظهر في الملفّ أيضا كلمة سرّ الحساب الجذر المعمّاة (التعليمة <code>rootpw</code> مع الخيار <code>iscrypted--</code>). راجع <a href="https://docs.fedoraproject.org/en-US/Fedora/24/html/Installation_Guide/chap-kickstart-installations.html#sect-kickstart-file-create" rel="external nofollow">توثيق Kickstart</a> للمزيد من الخيارات.
</p>

<pre class="ipsCode" id="ips_uid_3545_7">
lang en_US
keyboard us
timezone Africa/Nouakchott --isUtc
rootpw $1$5sOxDlRo$In4KTyX7OmcOW9HUxWtbn0 --iscrypted
#platform x86, AMD64, or Intel EM64T
text
url --url=http://192.168.2.100//kickstart/media
bootloader --location=mbr --append="rhgb quiet crashkernel=auto"
zerombr
clearpart --all --initlabel
autopart
auth --passalgo=sha512 --useshadow
selinux --enforcing
firewall --enabled
firstboot --disable
%packages
@base
@backup-server
@print-server
%end</pre>

<p>
	انتبه للتعليمة التالية في ملفّ إعداد Kickstart:
</p>

<pre>
 </pre>

<pre class="ipsCode" id="ips_uid_3545_9">
url --url=http://192.168.2.100//kickstart/media
</pre>

<p>
	يُستخدَم المجلّد <code>kickstart/media</code> (على خادوم الوِب) لاستخراج محتوى ملف ISO (ملف التثبيت). سنحتاج قبل استخراج محتوى ملف ISO إلى تركيبه Mounting على المسار <code>media/rhel/</code> مع تحديد خيار التركيب <code>o loop-</code> للتعامل مع الملفّ بوصفه جهازا طرفيا حلقيا Loop device:
</p>

<pre>
 </pre>

<pre class="ipsCode" id="ips_uid_3545_11">
# mount -o loop /var/www/html/kickstart/rhel-server-7.0-x86_64-dvd.iso /media/rhel
</pre>

<p>
	يفترض الأمر أعلاه وجود ملف ISO باسم <code>rhel-server-7.0-x86_64-dvd.iso</code> في المجلّد <code>/var/www/html/kickstart/</code> على الخادوم <code>192.168.2.100</code>.
</p>

<p>
	<strong>ملحوظة:</strong> الأجهزة الطرفية الحلقيّة Loop devices هي شبه أجهزة تخيّلية (بمعنى أنها لا توجد فعلا، غير ملموسة) تتيح التعامل مع ملف كما لو أنه جهاز طرفي كتلي Block device (وسيط تخزين مثل قرص صلب). يمكّن تركيب ملفات ISO - التي هي تمثيل لنظام ملفات File system أو تجزئة من قرص صلب - بوصفها أجهزة حلقية من الوصول إلى محتواها كما لو كانت أنظمة ملفات فعلية.
</p>

<p>
	ثم ننسخ جميع محتويات المجلّد <code>media/rhel/</code> إلى المجلّد <code>var/www/html/kickstart/media/</code> ليكون الوصول إليه متاحا عبر خادوم الوِب:
</p>

<pre>
 </pre>

<pre class="ipsCode" id="ips_uid_3545_14">
# cp -R /media/rhel/* /var/www/html/kickstart/media/
</pre>

<p>
	يجب أن نحصُل الآن بسرد محتويات المجلد <code>var/www/html/kickstart/media/</code> على نتيجة تشبه التالي:
</p>

<p>
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="18690" href="https://academy.hsoub.com/uploads/monthly_2016_08/04_mounting_iso.png.62fb3919c613aaa7c78c87631772cf97.png" rel=""><img alt="04_mounting_iso.png" class="ipsImage ipsImage_thumbnailed" data-fileid="18690" data-unique="r1wghxmf5" src="https://academy.hsoub.com/uploads/monthly_2016_08/04_mounting_iso.thumb.png.169db11e2dbbb0be5f95e46bb0801d0e.png"></a>
</p>

<p>
	من الجيد، بغضّ النظر عن الآليّة المستخدمة لإنشاء ملف Kickstart، التحقّق من صيغة الملفّ قبل البدء في استخدامه لتثبيت النظام. ثبّت، لهذا الغرض، حزمة <code>pykickstart</code>:
</p>

<pre>
 </pre>

<pre class="ipsCode" id="ips_uid_3545_16">
# yum update &amp;&amp; yum install pykickstart
</pre>

<p>
	ثم استخدم أداة <code>ksvalidator</code> لفحص الملفّ:
</p>

<pre>
 </pre>

<pre class="ipsCode" id="ips_uid_3545_18">
# ksvalidator /var/www/html/kickstart/academy.bin
</pre>

<p>
	لن تحصُل على أية مخرجات إن كانت صيغة الملفّ صحيحة؛ أما إذا كانت توجد أخطاء في صيغة الملف فستظهر رسائل توضّح أين توجد التعليمات غير الصّحيحة أو غير المعروفة في الملف.
</p>

<h3 id="تنفيذ-عملية-التثبيت">
	تنفيذ عمليّة التثبيت
</h3>

<p>
	نبدأ عمليّة التثبيت بالإقلاع على ملفّ <code>rhel-server-7.2-x86_64-boot.iso</code>؛ ثم نحدّد خيار <strong>تثبيت Red Hat Enterprise Linux 7</strong> ونضغط على زرّ الجدولة <code>Tab</code> في لوحة المفاتيح من أجل إلحاق التعليمات التاليّة بأمر التثبيت:
</p>

<pre>
 </pre>

<pre class="ipsCode" id="ips_uid_3545_20">
# inst.ks=http://192.168.2.100/kickstart/academy.bin
</pre>

<p>
	<img alt="05_add_kickstart_file.png" class="ipsImage ipsImage_thumbnailed" data-fileid="18686" data-unique="btq3zcr4o" src="https://academy.hsoub.com/uploads/monthly_2016_08/05_add_kickstart_file.png.08a200bd57171993713047a30a155f2a.png"></p>

<p>
	تشير التعليمات إلى ملفّ <code>academy.bin</code> الذي أنشأناه سابقا؛ ثم نضغط على زرّ <code>Enter</code> لبدء التثبيت. تظهر أثناء التثبيت الحزم ومجموعات الحزم التي اخترتها عند إنشاء ملفّ Kickstart أعلاه؛ كما تظهر بعد انتهاء التثبيت رسالة تطلُب منك إخراج وسيط التثبيت وسيمكنك بعدها تشغيل النظام الجديد.
</p>

<p>
	يمكن، كما أشرنا سابقا، إنشاء ملفات Kickstart يدويا إلا أن الطريقة المنصوح بها هي استخدام الأداة التي توفّرها Red Hat كل ما كان ذلك ممكنا.
</p>

<p>
	تنشئ عمليّة تثبيت Red Hat Enterprise Linux دائما ملفّا يحوي إعدادات Kickstart للنظام المُثبَّت باسم <code>anaconda-ks.cfg</code> على المسار <code>root/anaconda-ks.cfg/</code>. يمكن استخدام هذا الملفّ أيضا لإعداد خواديم مشابهة باستخدام Kickstart.
</p>

<p>
	من الجيّد التعوّد على استخدام Kickstart لأتمتة تثبيت Red Hat Enterprise Linux؛ فهو طريقة سهلة للتثبيت والحصول على خواديم متشابهة في أقل مدة. نشير في اﻷخير إلى أنه يمكن استخدام Kickstart لتثبيت Red Hat Enterprise Linux بصورة <a href="https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/Installation_Guide/sect-kickstart-howto.html" rel="external nofollow">مؤتمتة تماما</a> باستخدام خادوم إقلاع عبر الشبكة (PXE Server) وضبط <a href="https://academy.hsoub.com/certificates/redhat/rhcsa/%D9%85%D8%A8%D8%A7%D8%AF%D8%A6-%D8%A5%D8%AF%D8%A7%D8%B1%D8%A9-%D8%A7%D9%84%D8%B9%D9%85%D9%84%D9%8A%D8%A7%D8%AA-processes-%D8%B9%D9%84%D9%89-redhat-enterprise-linux-r44/#%D9%85%D8%B1%D8%A7%D8%AD%D9%84-%D8%A7%D9%84%D8%A5%D9%82%D9%84%D8%A7%D8%B9" rel="">محمّل الإقلاع</a> Boot loader لاستخدامه.
</p>

<p>
	ترجمة - بتصرّف - لمقال <a href="http://www.tecmint.com/automatic-rhel-installations-using-kickstart/" rel="external nofollow">RHCSA Series: Automate RHEL 7 Installations Using ‘Kickstart’ – Part 12</a> لصاحبه Gabriel Cánepa.
</p>
]]></description><guid isPermaLink="false">748</guid><pubDate>Sun, 06 Nov 2016 13:14:00 +0000</pubDate></item><item><title>&#x645;&#x642;&#x62F;&#x651;&#x645;&#x629; &#x639;&#x646; &#x627;&#x644;&#x62A;&#x62D;&#x643;&#x645; &#x641;&#x64A; &#x62D;&#x631;&#x643;&#x629; &#x627;&#x644;&#x628;&#x64A;&#x627;&#x646;&#x627;&#x62A; &#x639;&#x644;&#x649; &#x627;&#x644;&#x634;&#x628;&#x643;&#x629; &#x628;&#x627;&#x633;&#x62A;&#x62E;&#x62F;&#x627;&#x645; Iptables &#x648;FirewallD &#x639;&#x644;&#x649; Red Hat Enterprise Linux</title><link>https://academy.hsoub.com/devops/linux/redhat/%D9%85%D9%82%D8%AF%D9%91%D9%85%D8%A9-%D8%B9%D9%86-%D8%A7%D9%84%D8%AA%D8%AD%D9%83%D9%85-%D9%81%D9%8A-%D8%AD%D8%B1%D9%83%D8%A9-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-%D8%B9%D9%84%D9%89-%D8%A7%D9%84%D8%B4%D8%A8%D9%83%D8%A9-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-iptables-%D9%88firewalld-%D8%B9%D9%84%D9%89-red-hat-enterprise-linux-r746/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2016_11/redhat-firewalld-iptables.png.3cd02b863bf2c60c0ad5422bfd561142.png" /></p>

<p>
	<a href="https://academy.hsoub.com/devops/security/firewalls/" rel="">الجدران النارية</a> Firewalls هي أنظمة حماية تتحكّم في حركة البيانات القادمة إلى شبكة أو الخارجة منها، اعتمادا على مجموعة من القواعد المعرَّفة مسبقا؛ على سبيل المثال وجهة الحزم Packets، مصدرها أو نوعية البيانات.
</p>

<p>
	سنعرض في هذا الدرس لأساسيات FirewallD وهو البرنامج المبدئي لإدارة الجدار الناري في Red Hat Enterprise Linux 7، وIptables الذي هو الجدار الناري التقليدي في أنظمة <a href="https://academy.hsoub.com/devops/linux/" rel="">لينكس</a>، ويتوفّر أيضا في RHEL 7.
</p>

<h2 id="مقارنة-بين-firewalld-وiptables">
	مقارنة بين FirewallD وIptables
</h2>

<p>
	يعمل الجداران الناريان FirewallD وIptables عن طريق التخاطب مع النواة عبر نفس الواجهة، أمر <code>iptables</code>؛ إلا أن الاختلاف بينهما يكمن في أن FirewallD يمكنه تعديل الإعدادات أثناء عمل النظام دون ضياع الاتّصالات الجارية. يجب أن يكون FirewallD مثبتا مبدئيا على RHEL 7، إلا أنه يمكن ألا يكون مفعلا. يمكن التحقّق منه بالأوامر التاليّة:
</p>

<pre>
 </pre>

<pre class="ipsCode" id="ips_uid_1370_7">
# yum info firewalld firewall-config
</pre>

<p>
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="18612" href="https://academy.hsoub.com/uploads/monthly_2016_07/01_check_firewall.png.45fb9764d86c53167b0850c913e3e1bf.png" rel=""><img alt="01_check_firewall.png" class="ipsImage ipsImage_thumbnailed" data-fileid="18612" data-unique="743gjf87v" src="https://academy.hsoub.com/uploads/monthly_2016_07/01_check_firewall.thumb.png.9247afd5d5d22dec59498c2c4d075ab8.png"></a>
</p>

<p>
	تُظهر نتيجة الأمر أعلاه أن الجدار الناري FirewallD مثبت فعلا، وكذلك حزمة <code>firewall-config</code> التي توفّر أداة في واجهة المستخدم لإدارة الجدار الناري. الجدار الناري مثبّت، يمكننا الآن التحقق من ما إذا كان مفعّلا أم لا:
</p>

<pre>
 </pre>

<pre class="ipsCode" id="ips_uid_1370_9">
# systemctl status -l firewalld.service
</pre>

<p>
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="18613" href="https://academy.hsoub.com/uploads/monthly_2016_07/02_check_firewall_status.png.a55ec2678730c491a0e9016e82276ca8.png" rel=""><img alt="02_check_firewall_status.png" class="ipsImage ipsImage_thumbnailed" data-fileid="18613" data-unique="5zsatr04a" src="https://academy.hsoub.com/uploads/monthly_2016_07/02_check_firewall_status.thumb.png.e32731d4b350e80068665c11842a50b6.png"></a>
</p>

<p>
	على الجانب الآخر، لا يُضمَّن جدار Iptables الناري مبدئيا في Red Hat Enterprise Linux 7؛ إلا أنه يمكن تثبيته بالأمر:
</p>

<pre>
 </pre>

<pre class="ipsCode" id="ips_uid_1370_11">
# yum update &amp;&amp; yum install iptables-services
</pre>

<p>
	تُشغَّل الخدمتان وتُفعّلان مع الإقلاع عن طريق <a href="https://academy.hsoub.com/devops/linux/%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-systemd-%D8%A7%D9%84%D8%B9%D9%85%D9%84-%D9%85%D8%B9-%D8%A7%D9%84%D8%AE%D8%AF%D9%85%D8%A7%D8%AA%D8%8C-%D8%A7%D9%84%D9%88%D8%AD%D8%AF%D8%A7%D8%AA-units%D8%8C-%D9%88%D8%A7%D9%84%D9%8A%D9%88%D9%85%D9%8A%D8%A7%D8%AA-journal-r130/" rel="">أوامر <code>systemd</code></a> الاعتيادية:
</p>

<pre>
 </pre>

<pre class="ipsCode" id="ips_uid_1370_14">
# systemctl start firewalld.service
# systemctl start iptables.service
# systemctl enable firewalld.service
# systemctl enable iptables.service
</pre>

<p>
	يوجد ملفّ إعداد <code>iptables</code> على المسار <code>etc/sysconfig/iptables/</code> (يجب أن تكون الحزمة مثبتة حتى يوجد الملفّ)؛ بينما توجد ملفات إعداد FirewallD موزعة بين المجلدين <code>usr/lib/firewalld/</code> و<code>etc/firewalld/</code>.
</p>

<p>
	يمكن الحصول على معلومات أكثر عن هذه الأدوات بتنفيذ الأوامر:
</p>

<pre class="ipsCode" id="ips_uid_1370_16">
# man firewalld.conf
# man firewall-cmd
# man iptables</pre>

<p>
	راجع مقال <a href="https://academy.hsoub.com/certificates/redhat/rhcsa/%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D8%A7%D9%84%D8%AA%D8%B9%D8%A7%D9%85%D9%84-%D9%85%D8%B9-%D8%A7%D9%84%D8%B5%D8%AF%D9%81%D8%A9-shell-%D9%81%D9%8A-red-hat-enterprise-linux-r40/" rel=""> أساسيات التعامل مع الصدفة Shell في Red Hat Enterprise Linux </a> لطرق أخرى حول الحصول على المعلومات عن الأوامر في Red Hat Enterprise Linux 7.
</p>

<h2 id="استخدام-iptables-للتحكم-في-حركة-البيانات-عبر-الشبكة">
	استخدام Iptables للتحكم في حركة البيانات عبر الشبكة
</h2>

<p>
	سنذكُر في ما يلي أمثلة لإعداد Iptables على RHEL 7؛ تأكد من مراجعة مقال <a href="https://academy.hsoub.com/devops/security/firewalls/%D9%85%D8%A7-%D9%87%D9%88-%D8%A7%D9%84%D8%AC%D8%AF%D8%A7%D8%B1-%D8%A7%D9%84%D9%86%D8%A7%D8%B1%D9%8A-%D9%88%D9%83%D9%8A%D9%81-%D9%8A%D8%B9%D9%85%D9%84%D8%9F-r114/" rel="">ما هو الجدار الناري وكيف يعمل؟</a> والمقالات المرتبطة به لفهم آلية عمل الجدار الناري بالتفصيل.
</p>

<h3 id="السماح-لحركة-البيانات-المتجهة-إلى-خادوم-الوب-والصادرة-منه">
	السماح لحركة البيانات المتجهة إلى خادوم الوِب والصّادرة منه
</h3>

<p>
	تستخدم خواديم الوِب المنفذين <code>80</code> و<code>443</code> للإنصات للطلبات القادمة إلى الخادوم. المنفذ الأول <code>80</code> خاصّ بحركة البيانات العاديّة بينما يُستخدم المنفذ الثاني <code>443</code> للبيانات المؤمّنة. تطلُب الأوامر التالية من Iptables السماح بحركة البيانات الواردة والصّادرة عبر المنفذين <code>80</code> و<code>443</code> في <a href="https://academy.hsoub.com/devops/servers/%D9%88%D8%A7%D8%AC%D9%87%D8%A7%D8%AA-%D8%B4%D8%A8%D9%83%D8%A9-%D8%A7%D9%84%D8%A5%D9%86%D8%AA%D8%B1%D9%86%D8%AA-%D9%88%D8%A8%D8%B1%D9%88%D8%AA%D9%88%D9%83%D9%88%D9%84%D8%A7%D8%AA%D9%87%D8%A7-%D8%A7%D9%84%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D9%91%D8%A9-r64/#%D8%A7%D9%84%D9%88%D8%A7%D8%AC%D9%87%D8%A7%D8%AA" rel="">واجهة الشبكة</a> <code>enp0s3</code>:
</p>

<pre class="ipsCode" id="ips_uid_1370_18">
# iptables -A INPUT -i enp0s3 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
# iptables -A OUTPUT -o enp0s3 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT
# iptables -A INPUT -i enp0s3 -p tcp --dport 443 -m state --state NEW,ESTABLISHED -j ACCEPT
# iptables -A OUTPUT -o enp0s3 -p tcp --sport 443 -m state --state ESTABLISHED -j ACCEPT</pre>

<h3 id="حجب-بيانات-قادمة-من-شبكة-محددة">
	حجب بيانات قادمة من شبكة محدّدة
</h3>

<p>
	تحتاج أحيانا لمنع اتصالات واردة من شبكة تحدّدها، مثلا <code>192.168.1.0/24</code>. يؤدّي Iptables هذه المهمة بتنفيذ الأمر التالي:
</p>

<pre>
 </pre>

<pre class="ipsCode" id="ips_uid_1370_20">
# iptables -I INPUT -s 192.168.1.0/24 -j DROP
</pre>

<p>
	يحجب الأمر السابق جميع الاتصالات القادمة من عنوان IP ضمن <a href="https://academy.hsoub.com/certificates/cisco/ccna/%D8%A8%D9%86%D8%A7%D8%A1-%D9%85%D8%AE%D8%B7%D8%B7-%D9%84%D8%B9%D9%86%D8%A7%D9%88%D9%8A%D9%86-ip-%D8%B9%D8%A8%D8%B1-%D8%A7%D9%84%D8%B4%D8%A8%D9%83%D8%A7%D8%AA-%D8%A7%D9%84%D9%81%D8%B1%D8%B9%D9%8A%D8%A9-%D8%B9%D9%86%D8%AF-%D8%A8%D9%86%D8%A7%D8%A1-%D8%A7%D9%84%D8%B4%D8%A8%D9%83%D8%A7%D8%AA-r23/" rel="">الشبكة الفرعية</a> <code>192.168.1.0/24</code>؛ يمكننا تخصيص الأمر بحجب الاتصالات القادمة من هذه الشبكة عبر المنفذ <code>22</code> دون غيره:
</p>

<pre>
 </pre>

<pre class="ipsCode" id="ips_uid_1370_22">
# iptables -A INPUT -s 192.168.1.0/24 --dport 22 -j ACCEPT
</pre>

<h3 id="توجيه-البيانات-الواردة-إلى-وجهة-أخرى">
	توجيه البيانات الواردة إلى وجهة أخرى
</h3>

<p>
	يمكن استخدام RHEL 7 فاصلا بين شبكتين بحيث يعيد توجيه البيانات بينهما؛ يجب في هذه الحالة تفعيل إعادة توجيه عناوين IP على النظام بتحرير الملف <code>etc/sysctl.conf/</code> وتعيين القيمة <code>1</code> للتعليمة <code>net.ipv4.ip_forward</code>:
</p>

<pre>
 </pre>

<pre class="ipsCode" id="ips_uid_1370_24">
net.ipv4.ip_forward = 1
</pre>

<p>
	احفظ التعديلات ثم نفّذ الأمر لاعتمادها:
</p>

<pre>
 </pre>

<pre class="ipsCode" id="ips_uid_1370_26">
# sysctl -p /etc/sysctl.conf
</pre>

<p>
	سنفترض أن لدينا طابعة مربوطة بخادوم للطباعة يعمل على العنوان <code>192.168.0.10</code> ويُنصِت للطلبات القادمة عبر المنفذ <code>631</code>. يمكن في هذه الحالة توجيه طلبات الطباعة القادمة إلى الجدار الناري على المنفذ <code>631</code> إلى خادوم الطباعة بالأمر التالي:
</p>

<pre>
 </pre>

<pre class="ipsCode" id="ips_uid_1370_28">
# iptables -t nat -A PREROUTING -i enp0s3 -p tcp --dport 631 -j DNAT --to 192.168.0.10:631
</pre>

<p>
	<strong>ملحوظة:</strong> يجب تذكر أن Iptables يقرأ القواعد الأمنية بالتسلسل، لذا تأكد من القواعد المحدّدة بعد القواعد أعلاه لا تلغيها. نفس الشيء بالنسبة للسياسات المبدئية Default policies.
</p>

<h2 id="جدار-firewalld-الناري">
	جدار FirewallD الناري
</h2>

<p>
	المناطق Zones هي أحد التغييرات التي أضافها جدار FirewallD؛ وهي درجات مختلفة من الموثوقيّة يمنحها مدير النظام للأجهزة والبيانات في الشبكة.
</p>

<p>
	يُستخدم الأمر التالي لسرد لائحة بالمناطق النشطة في FirewallD:
</p>

<pre>
 </pre>

<pre class="ipsCode" id="ips_uid_1370_30">
# firewall-cmd --get-active-zones
public
        interfaces: enp0s3 enp0s9
</pre>

<p>
	يظهر في نتيجة الأمر أعلاه أن المنطقة <code>public</code> التي توجد بها الواجهتان <code>enp0s3</code> و<code>enp0s9</code>، نشطة. نستخدم الأمر التالي للحصول على جميع المعلومات المتوفرة عن منطقة (<code>public</code> في المثال):
</p>

<pre>
 </pre>

<pre class="ipsCode" id="ips_uid_1370_32">
# firewall-cmd --zone=public --list-all
</pre>

<p>
	<img alt="03_firewalld_zones.png" class="ipsImage ipsImage_thumbnailed" data-fileid="18614" data-unique="6u7ynkz5k" src="https://academy.hsoub.com/uploads/monthly_2016_07/03_firewalld_zones.png.d35b98f05c16784a9606fe6b255707fc.png"></p>

<h3 id="السماح-للخدمات-بالمرور-عبر-الجدار-الناري">
	السماح للخدمات بالمرور عبر الجدار الناري
</h3>

<p>
	يتعرّف FirewallD تلقائيا على أسماء عدد من الخدمات، يمكن الحصول على لائحة بها بتنفيذ الأمر:
</p>

<pre>
 </pre>

<pre class="ipsCode" id="ips_uid_1370_34">
# firewall-cmd --get-services
</pre>

<p>
	تطلب الأوامر التالية من الجدار الناري السماح بمرور بيانات الخدمتين <code>http</code> (المنفذ <code>80</code>) و<code>https</code> (المنفذ <code>443</code>) وتفعيلها مع إقلاع النظام (<code>permanent--</code>):
</p>

<pre class="ipsCode" id="ips_uid_1370_36">
# firewall-cmd --zone=MyZone --add-service=http
# firewall-cmd --zone=MyZone --permanent --add-service=http
# firewall-cmd --zone=MyZone --add-service=https
# firewall-cmd --zone=MyZone --permanent --add-service=https
# firewall-cmd --reload</pre>

<p>
	إن لم تحدّد المنطقة عن طريق الخيار <code>zone</code> فستُسخدَم المنطقة المبدئيّة.
</p>

<p>
	استخدم <code>remove</code> مكان <code>add</code> إن أردت حذف القاعدة.
</p>

<h3 id="توجيه-البيانات">
	توجيه البيانات
</h3>

<p>
	يجب التأكد أولا من أن إخفاء العناوين IP masquerading مفعَّل بالنسبة للمنطقة المطلوبة:
</p>

<pre class="ipsCode" id="ips_uid_1370_38">
# firewall-cmd --zone=MyZone --query-masquerade
yes
# firewall-cmd --zone=public --query-masquerade
no</pre>

<p>
	يظهر في نتيجة الأمر السابق أن إخفاء العناوين مفعَّل بالنسبة للمنطقة <code>MyZone</code> بينما هو معطَّل بالنسبة لـ<code>public</code>.
</p>

<p>
	<strong>ملحوظة:</strong> إخفاء العناوين IP masquerading هو آلية في لينكس تشبه ترجمة العناوين Network address translation, NAT في الموجّهات Routers. تمكّن هذه الآلية - مثلا - مجموعة من الأجهزة من الاتّصال بالإنترنت باستخدام نفس عنوان IP؛ حيث يتولى الجهاز الذي يُفعَّل عليه إخفاء العناوين التخاطب مع العالم الخارجي ثم يعيد توجيه الحزم في الشبكة الداخلية.
</p>

<p>
	يمكن تفعيل إخفاء العناوين بالنسبة للمنطقة <code>public</code> على النحو التالي:
</p>

<pre>
 </pre>

<pre class="ipsCode" id="ips_uid_1370_40">
# firewall-cmd --zone=public --add-masquerade
</pre>

<p>
	يؤدي الأمر التالي نفس مهمة مثال التوجيه السابق باستخدام FirewallD بدلا من Iptables:
</p>

<pre>
 </pre>

<pre class="ipsCode" id="ips_uid_1370_42">
# firewall-cmd --zone=public --add-forward-port=port=631:proto=tcp:toport=631:toaddr=192.168.0.10
</pre>

<p>
	لا تنس إعادة تحميل إعدادات الجدار الناري لاعتماد التعديلات:
</p>

<pre>
 </pre>

<pre class="ipsCode" id="ips_uid_1370_45">
# firewall-cmd --reload
</pre>

<p>
	يمكنك الحصول على أمثلة أخرى في درس <a href="https://academy.hsoub.com/certificates/redhat/rhcsa/%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF-%D8%AE%D8%A7%D8%AF%D9%88%D9%85-%D9%88%D9%90%D8%A8-%D9%88%D8%AE%D8%A7%D8%AF%D9%88%D9%85-ftp-%D8%B9%D9%84%D9%89-red-hat-enterprise-linux-r48/" rel="">إعداد خادوم وِب وخادوم FTP على Red Hat Enterprise Linux</a> حيث شرحنا كيفية السماح للبيانات بالمرور عبر المنافذ التي يستخدمها عادة خادومُ الوِب وخادوم FTP وكيفية تغيير القاعدة في الجدار الناري عند تغيير المنفذ الذي تعمل عبره هذه الخدمات. تمكن أيضا الاستعانة ب<a href="https://fedoraproject.org/wiki/FirewallD?rd=FirewallD/" rel="external nofollow">ويكي FirewallD</a> للمزيد من الأمثلة.
</p>

<p>
	ترجمة - بتصرّف - لمقال <a href="http://www.tecmint.com/firewalld-vs-iptables-and-control-network-traffic-in-firewall/" rel="external nofollow">RHCSA Series: Firewall Essentials and Network Traffic Control Using FirewallD and Iptables – Part 11</a> لصاحبه Gabriel Cánepa.
</p>
]]></description><guid isPermaLink="false">746</guid><pubDate>Thu, 27 Oct 2016 15:12:00 +0000</pubDate></item><item><title>&#x625;&#x62F;&#x627;&#x631;&#x629; &#x627;&#x644;&#x62D;&#x632;&#x645;&#x60C; &#x623;&#x62A;&#x645;&#x62A;&#x629; &#x627;&#x644;&#x645;&#x647;&#x627;&#x645;&#x651; &#x648;&#x645;&#x631;&#x627;&#x642;&#x628;&#x629; &#x627;&#x644;&#x633;&#x651;&#x62C;&#x644;&#x627;&#x62A; &#x641;&#x64A; Red Hat Enterprise Linux</title><link>https://academy.hsoub.com/devops/linux/redhat/%D8%A5%D8%AF%D8%A7%D8%B1%D8%A9-%D8%A7%D9%84%D8%AD%D8%B2%D9%85%D8%8C-%D8%A3%D8%AA%D9%85%D8%AA%D8%A9-%D8%A7%D9%84%D9%85%D9%87%D8%A7%D9%85%D9%91-%D9%88%D9%85%D8%B1%D8%A7%D9%82%D8%A8%D8%A9-%D8%A7%D9%84%D8%B3%D9%91%D8%AC%D9%84%D8%A7%D8%AA-%D9%81%D9%8A-red-hat-enterprise-linux-r745/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2016_11/redhat-YUM.png.c7ebf3ae0d0c71bcea0dd14caaf25227.png" /></p>

<p>
	يُراجع هذا المقال تثبيت الحزم، تحديثها وحذفها في توزيعة Red Hat Enterprise Linux 7؛ كما يغطّي أتمتة المهامّ باستخدام <a href="https://academy.hsoub.com/search/?&amp;type=cms_records4&amp;tags=cron" rel="">Cron</a> وكيفيةَ تحليل ملفات السّجلات Logs الموجودة على النظام.
</p>

<h2 id="استخدام-yum-لإدارة-الحزم">
	استخدام Yum لإدارة الحزم
</h2>

<h3 id="تثبيت-الحزم">
	تثبيت الحزم
</h3>

<p>
	يُستخدَم أمر <code>yum</code> لتثبيت الحزم على Red Hat Enterprise Linux بالطريقة التالية:
</p>

<pre class="ipsCode" id="ips_uid_6948_7">
# yum -y install package_name</pre>

<p>
	حيثُ <code>package_name</code> اسم الحزمة التي نريد تثبيتها. يمكننا تثبيت أكثر من حزمة في نفس الوقت بكتابة أسمائها على التوالي. نطلُب في المثال التالي تثبيت الحزم <code>httpd</code> و<code>mlocate</code>:
</p>

<pre class="ipsCode" id="ips_uid_6948_9">
# yum -y install httpd mlocate</pre>

<p>
	يؤدي استخدامُ الخيار <code>y-</code> إلى تجاوز طلب التأكيد الذي يظهر قبل تنزيل الحزم وتثبيتها. يمكن حذفه من الأمر إن أردت.
</p>

<p>
	يُثبّت <code>yum</code> مبدئيا الحزم المطابقة لمعمارية Architecture نظام التشغيل؛ إلا أنه يمكن تخصيص معماريّة الحزمة بإلحاق المعمارية المرغوبة باسم الحزمة. على سبيل المثال، إن كنت تستخدم نظام تشغيل بمعمارية 64 بت فإن تنفيذ الأمر <code>yum install package</code> سيُثبّت الإصدار 64 بت (<code>x86_64</code>) من الحزمة <code>package</code>؛ في حين يؤدي تنفيذ الأمر <code>yum install package.x86</code> إلى تثبيت الإصدار 32 بت، <strong>في حال توفّره</strong>.
</p>

<h3 id="البحث-عن-حزمة">
	البحث عن حزمة
</h3>

<p>
	قد تحتاج أحيانا لتثبيت حزمة ولكنّك لا تعرف اسمها بالضبط؛ يمكن في هذه الحالة استخدام الأمر <code>yum search</code> أو <code>yum search all</code> للبحث في المستودعات المُفعَّلة عن كلمة مفتاحية في اسم الحزمة أو في وصفها، على التوالي.
</p>

<p>
	على سبيل المثال؛ يبحث الأمر التالي ضمن المستودعات المفعَّلة عن الحزم التي تحوي كلمة <code>log</code> في أسمائها أو في مختصر عملها:
</p>

<pre class="ipsCode" id="ips_uid_6948_11">
# yum search log</pre>

<p>
	بينما يبحث الأمر التالي عن الكلمة <code>log</code> في أسماء الحزم، مختصرات عملها، أوصافها وروابط url الخاصّة بها:
</p>

<pre class="ipsCode" id="ips_uid_6948_13">
# yum search all log</pre>

<p>
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="18556" href="https://academy.hsoub.com/uploads/monthly_2016_07/01_yum_search.png.c7b5018b20776e006d9499191f8625b3.png" rel=""><img alt="01_yum_search.png" class="ipsImage ipsImage_thumbnailed" data-fileid="18556" data-unique="oy8c2m5as" src="https://academy.hsoub.com/uploads/monthly_2016_07/01_yum_search.thumb.png.b1c0007387e79fc256307ad322c05b73.png"></a>
</p>

<p>
	ماذا إن كنت تعرف اسم برنامج دون أن تعرف الحزمة التي تُثبته؟ مثلا برنامج <code>ps2pdf</code>. يمكن اللجوء في هذه الحالة إلى الأمر <code>yum whatprovides</code> على النحو التالي:
</p>

<pre class="ipsCode" id="ips_uid_6948_15">
# yum whatprovides "*/ps2pdf"</pre>

<p>
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="18558" href="https://academy.hsoub.com/uploads/monthly_2016_07/02_yum_whatprovides.png.7774e76f3b12d3dffb558328a4e4f43e.png" rel=""><img alt="02_yum_whatprovides.png" class="ipsImage ipsImage_thumbnailed" data-fileid="18558" data-unique="h45j6xgr0" src="https://academy.hsoub.com/uploads/monthly_2016_07/02_yum_whatprovides.thumb.png.103e7816e2bad24f11f539a8f01b5067.png"></a>
</p>

<h3 id="الحصول-على-معلومات-عن-حزمة">
	الحصول على معلومات عن حزمة
</h3>

<p>
	قد تودّ الحصول على معلومات عن حزمة، قبل أن تقرّر تثبيتها على جهازك؛ بعد ظهورها مثلا في نتيجة البحث بالأمر السابق. يمكنك استخدام الأمر <code>yum</code> لهذا الغرض:
</p>

<pre class="ipsCode" id="ips_uid_6948_17">
# yum info logwatch</pre>

<p>
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="18559" href="https://academy.hsoub.com/uploads/monthly_2016_07/03_yum_info.png.bcdbfb8f6db67e78a77e814e8ecd7ee7.png" rel=""><img alt="03_yum_info.png" class="ipsImage ipsImage_thumbnailed" data-fileid="18559" data-unique="77nvb3o70" src="https://academy.hsoub.com/uploads/monthly_2016_07/03_yum_info.thumb.png.94c7173845c64be3791bed672527f6ba.png"></a>
</p>

<h3 id="البحث-عن-تحديثات">
	البحث عن تحديثات
</h3>

<p>
	يُستخدم الأمر <code>yum check-update</code> للبحث عن التحديثات المتوفّرة للحزم. يُظهر الأمر لائحة بالحزم التي يتوفر لها تحديث. يمكنك بعدها تحديث جميع الحزم مرة واحدة بتنفيذ الأمر <code>yum update</code>؛ كما يمكنك تحديث حزمة محدّدة بتنفيذ الأمر <code>yum update package</code> حيثُ <code>package</code> هو اسم الحزمة.
</p>

<h3 id="حذف-حزمة">
	حذف حزمة
</h3>

<p>
	يمكن حذف حزمة بالأمر <code>yum remove</code> على النحو التالي:
</p>

<pre class="ipsCode" id="ips_uid_6948_19">
# yum remove httpd</pre>

<h2 id="حزم-rpm">
	حزم RPM
</h2>

<p>
	يمكن تثبيت البرامج على Red Hat Enterprise Linux بحزم RPM (اختصار لـ RedHat Package Manager) القائمة بذاتها (لا توجد ضمن مستودعات ولا تحتاج للاتصال بالشبكة).
</p>

<h3 id="تثبيت-الحزم-1">
	تثبيت الحزم
</h3>

<p>
	يُستخدَم الأمر <code>rpm</code> لتثبيت هذه الحزم، ويكثُر استخدام الخيارات <code>Uvh-</code> التي تشير إلى أنه يجب تثبيت الحزمة إن لم تكن مثبّتة على النظام ومحاولة تحديثها إن كانت مثبّتة (<code>U-</code>)، إظهار عرض تفصيلي بنتيجة تنفيذ الأمر (<code>v-</code>) وعرض شريط بتقدّم تنفيذ الأمر (<code>h-</code>). مثلا:
</p>

<pre>
 </pre>

<pre class="ipsCode" id="ips_uid_6948_21">
# rpm -Uvh package.rpm
</pre>

<h3 id="عرض-لائحة-بالحزم-المثبتة">
	عرض لائحة بالحزم المثبتة
</h3>

<p>
	يمكن استخدام الأمر <code>rpm</code> مع الخيار <code>qa-</code> (اختصار لـ Query all) لإظهار لائحة بجميع الحزم المثبتة على النظام:
</p>

<pre class="ipsCode" id="ips_uid_6948_23">
# rpm -qa</pre>

<h2 id="جدولة-المهام-باستخدام-cron">
	جدولة المهامّ باستخدام Cron
</h2>

<p>
	تتضمّن أنظمة تشغيل لينكس والأنظمة الشبيهة بيونكس أداة تُسمّى <a href="https://academy.hsoub.com/devops/linux/%D9%83%D9%8A%D9%81-%D9%86%D8%B3%D8%AA%D8%AE%D8%AF%D9%85-%D8%A7%D9%84%D9%85%D9%87%D8%A7%D9%85-%D8%A7%D9%84%D9%85%D8%AC%D8%AF%D9%88%D9%84%D8%A9-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-cron-%D9%81%D9%8A-%D8%A3%D9%86%D8%B8%D9%85%D8%A9-%D9%84%D9%8A%D9%86%D9%83%D8%B3-%D9%88%D9%8A%D9%88%D9%86%D9%83%D8%B3-r277/" rel="">Cron</a> لجدولة المهام (أوامر أو <a href="https://academy.hsoub.com/search/?tags=%D9%85%D8%AF%D8%AE%D9%84+%D8%A5%D9%84%D9%89+%D9%83%D8%AA%D8%A7%D8%A8%D8%A9+%D8%B3%D9%83%D8%B1%D8%A8%D8%AA%D8%A7%D8%AA+%D8%A7%D9%84%D8%B5%D8%AF%D9%81%D8%A9" rel="">سكربتات الصدفة</a>) للعمل دوريا. تبحث أداة Cron كل دقيقة في المجلّد <code>var/spool/cron/</code> عن ملفات بأسماء حسابات موافقة لتلك المذكورة في الملف <code>etc/passwd/</code>. تُرسَل مخرجات تنفيذ المهامّ إلى صاحب المهمّة أو المستخدم المحدَّد في <a href="https://academy.hsoub.com/questions/123-%D9%85%D8%A7%D8%B0%D8%A7-%D9%8A%D8%B9%D9%86%D9%8A-%D9%85%D8%AA%D8%BA%D9%8A%D8%B1-%D8%A7%D9%84%D9%86%D8%B8%D8%A7%D9%85-path%D8%9F/#comment-261" rel="">متغيّر البيئة</a> <code>MAILTO</code> ضمن الملفّ <code>etc/crontab/</code> إن كان موجودا.
</p>

<p>
	يُستخدَم الأمر <code>crontab -e</code> لإنشاء ملفات Crontab التي تأخذ الأسطُر فيها الصيغة التالية:
</p>

<p>
	<img alt="04_crontab_entry.png" class="ipsImage ipsImage_thumbnailed" data-fileid="18560" data-unique="5c1ct1vtm" src="https://academy.hsoub.com/uploads/monthly_2016_07/04_crontab_entry.png.feb0e6306d19272891317595b29a2da6.png"></p>

<p>
	نطلُب في المثال التالي جدولة تحديث قاعدة البيانات الخاصة بالملفات (يستخدمها الأمر <a href="https://academy.hsoub.com/devops/linux/%D9%83%D9%8A%D9%81-%D8%AA%D8%B3%D8%AA%D8%AE%D8%AF%D9%90%D9%85-%D8%A3%D9%85%D8%B1%D9%8E%D9%8A-find-%D9%88-locate-%D9%84%D9%84%D8%A8%D8%AD%D8%AB-%D8%B9%D9%86-%D8%A7%D9%84%D9%85%D9%84%D9%81%D9%91%D8%A7%D8%AA-%D8%B9%D9%84%D9%89-linux-r43/" rel=""><code>locate</code></a> للبحث في الملفات) بحيثُ ينفَّذ أمر الجدولة <code>bin/updatedb/</code> في اليوم الثاني من كلّ شهر عند الساعة 2:15 صباحا:
</p>

<pre>
 </pre>

<pre class="ipsCode" id="ips_uid_6948_25">
15 02 2 * * /bin/updatedb
</pre>

<p>
	يُقرأ السطر أعلاه “نفّذ الأمر <code>bin/updatedb/</code> في اليوم الثاني من الشّهر، كل شهر من السنة بدون النظر في يوم الأسبوع (أحد، اثنان، …إلخ) عند الساعة 2 صباحا والدقيقة 15”. تشير العلامة <code>*</code> إلى أن قيمة الحقل غير معيّنة.
</p>

<p>
	<strong>ملحوظة:</strong> المحرّر المستخدم مبدئيا عند تنفيذ الأمر <code>crontab -e</code> هو <a href="https://academy.hsoub.com/certificates/redhat/rhcsa/%D9%85%D8%B9%D8%A7%D9%84%D8%AC%D8%A9-%D8%A7%D9%84%D9%86%D9%91%D8%B5%D9%88%D8%B5-%D8%B9%D9%84%D9%89-redhat-enterprise-linux-%D8%AA%D8%AD%D8%B1%D9%8A%D8%B1%D9%87%D8%A7-%D8%A8%D9%80-nano-%D9%88-vim-%D9%88%D8%A7%D9%84%D8%A8%D8%AD%D8%AB-%D9%81%D9%8A%D9%87%D8%A7-%D8%A8%D9%80-grep-r43/" rel="">محرّر <code>vi</code></a>.
</p>

<p>
	ستلاحظ بعد إضافة المهمة إلى الجدول إنشاءَ ملفّ باسم <code>root</code> في المجلد <code>var/spool/cron/</code>، كما ذكرنا آنفا. يمكن عرض جميع ملفات Crontab بسرد محتويات المجلّد السّابق الذكر:
</p>

<pre>
 </pre>

<pre class="ipsCode" id="ips_uid_6948_27">
# ls -l /var/spool/cron
</pre>

<p>
	كما يمكن للمستخدم الحالي (<code>root</code>) عرضُ جميع مهامّه المجدولة إما بعرض محتوى الملف <code>var/spool/cron/root/</code> أو بتنفيذ الأمر <code>crontab -l</code>.
</p>

<p>
	تستطيع جدولة مهمّة للعمل أكثر من مرة. نطلُب من Cron في المثال التالي تنفيذ السكربت <code>myscript</code> و<a href="https://academy.hsoub.com/devops/linux/%D9%85%D9%82%D8%AF%D9%85%D8%A9-%D8%A5%D9%84%D9%89-%D8%A5%D8%B9%D8%A7%D8%AF%D8%A9-%D8%AA%D9%88%D8%AC%D9%8A%D9%87-%D8%A7%D9%84%D8%A5%D8%AF%D8%AE%D8%A7%D9%84%D8%A7%D9%84%D8%A5%D8%AE%D8%B1%D8%A7%D8%AC-io-%D9%81%D9%8A-%D9%84%D9%8A%D9%86%D9%83%D8%B3-r39/" rel="">توجيه مخرجاته</a> إلى <code>dev/null/</code> في الدقيقة الأولى من اليومين الأول والخامس عشر من كل شهر:
</p>

<pre class="ipsCode" id="ips_uid_6948_29">
01 00 1 * * /myscript &gt; /dev/null 2&gt;&amp;1
01 00 15 * * /my/script &gt; /dev/null 2&gt;&amp;1</pre>

<p>
	يمكن دمج السّطرين على النحو التالي:
</p>

<pre>
 </pre>

<pre class="ipsCode" id="ips_uid_6948_31">
01 00 1,15 * *  /my/script &gt; /dev/null 2&gt;&amp;1
</pre>

<p>
	نطلُب في المثال التالي تنفيذ سكربت عند الساعة الواحدة و30 دقيقة صباحا في اليوم الأول من الشهر كل ثلاثة أشهر (الأشهر 1، 4، 7 و10):
</p>

<pre>
 </pre>

<pre class="ipsCode" id="ips_uid_6948_33">
30 01 1 1,4,7,10 * /my/other/script &gt; /dev/null 2&gt;&amp;1
</pre>

<p>
	إلا أنه توجد طريقة أسهل من السابقة؛ إذ يتيح Cron تحديد عدد مرات للتنفيذ. إن أردنا مثلا تنفيذ أمر كل 3 دقائق فإننا نستخدم الصّيغة <code>3/*</code> مكان الدقائق. نفس الشي بالنسبة للساعات، الأيام أو الأشهر. يؤدي السّطر التالي نفس غرض السّطر السابق:
</p>

<pre>
 </pre>

<pre class="ipsCode" id="ips_uid_6948_35">
30 01 1 */3 * /my/other/script &gt; /dev/null 2&gt;&amp;1
</pre>

<p>
	توجد اختصارات لجدولة الأوامر للتنفيذ بتردّد ثابت أو مباشرة بعد إعادة تشغيل النظام. يوضّح الجدول التالي هذه الاختصارات والصّيغة المكافئة لها؛  إن أردت استخدام أحد الاختصارات اكتبه مكان الحقول الزمنية الخمسة في ملفّ Cron:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_6948_39">
<span class="pln">@reboot  - - تنفيذ السكربت أو الأمر مباشرة بعد إقلاع النظام.
@yearly  - 00 00 1 1 * - مرة في السنة.
@monthly - 00 00 1 * * - مرة في الشهر.
@weekly  - 00 00 * * 0 - مرة في الأسبوع.
@daily	 - 00 00 * * * - مرة في اليوم.
@hourly	 - 00 * * * *  - مرة في الساعة.
</span></pre>

<p>
	راجع مقال <a href="https://academy.hsoub.com/devops/linux/%D9%83%D9%8A%D9%81-%D8%AA%D8%AC%D8%AF%D9%88%D9%84-%D9%85%D9%87%D8%A7%D9%85%D9%83-%D8%A7%D9%84%D8%B1%D9%88%D8%AA%D9%8A%D9%86%D9%8A%D8%A9-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%A3%D8%AF%D8%A7%D8%AA%D9%8A-cron-%D9%88-anacron-%D9%81%D9%8A-%D9%84%D9%8A%D9%86%D9%83%D8%B3-r82/" rel="">كيف تجدول مهامك الروتينية باستخدام أداتي Cron و Anacron في لينكس</a> للمزيد.
</p>

<h2 id="السجلات">
	السّجلات
</h2>

<p>
	توجد سجلّات النظام في المجلّد <code>var/log/</code>. يحتفظ النظام بسجلات مختلفة داخل هذا المجلّد، موزّعة على مجلّدات فرعية مثل <code>audit</code>، <code>httpd</code> و<code>samba</code>. يعمل النّظام على تقسيم السّجل على ملفات لتجنّب الحصول على ملفات كبيرة جدا؛ تُعرَف هذه العمليّة بالتدوير Rotation حيثُ تُنقَل السجلات القديمة إلى ملفّ آخر بنفس الاسم مع عدد أو تاريخ للترتيب (مثلا <code>secure-20160530</code>).
</p>

<p>
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="18557" href="https://academy.hsoub.com/uploads/monthly_2016_07/05_logs.png.873d5d32fddd63b52ceee8ca56e9bad8.png" rel=""><img alt="05_logs.png" class="ipsImage ipsImage_thumbnailed" data-fileid="18557" data-unique="s3taqkgnt" src="https://academy.hsoub.com/uploads/monthly_2016_07/05_logs.thumb.png.ba6444138cb5849ba20bd05be177235e.png"></a>
</p>

<p>
	من أهمّ ملفات السّجلات: <code>dmesg</code> الذي يحوي الرسائل القادمة من النواة Kernel، ملفّ <code>secure</code> الذي توجد به سجلات لمحاولات الاتصال بالخادوم التي تتطلّب الاستيثاق، <code>messages</code> الذي توجد به رسائل متعلقّة بالنظام ككلّ و<code>wtmp</code>الذي يحوي سجلات بعمليات الدخول Logins والخروج Logouts.
</p>

<p>
	تكمُن أهميّة السّجلات في أنها تعطيك نظرة عن ما يحدُث في النظام أو ما حدث في الماضي. تُستخدَم السّجلات لفحص اختلالات النظام وإصلاحها أو لمراقبة الخادوم. إن أردت تتبّع ما يطرأ على أحد السّجلات مباشرة فيمكنك استخدام الأمر <code>tail</code> مع الخيار <code>f-</code>؛ مثلا:
</p>

<pre>
 </pre>

<pre class="ipsCode" id="ips_uid_6948_41">
# tail -f /var/log/dmesg
</pre>

<p>
	وإن كنت تريد رؤية عمليات الوصول إلى خادوم الوِب فور حدوثها:
</p>

<pre>
 </pre>

<pre class="ipsCode" id="ips_uid_6948_43">
# tail -f /var/log/httpd/access.log
</pre>

<p>
	من المهمّ النظرُ إلى السجلات دوريا، ومعرفة ملفّ السّجلات المناسب لكلّ خدمة تعمل على خادومك.
</p>

<p>
	ترجمة - بتصرّف - لمقال <a href="http://www.tecmint.com/yum-package-management-cron-job-scheduling-monitoring-linux-logs/" rel="external nofollow">RHCSA Series: Yum Package Management, Automating Tasks with Cron and Monitoring System Logs – Part 10</a> لصاحبه Gabriel Cánepa.
</p>
]]></description><guid isPermaLink="false">745</guid><pubDate>Wed, 19 Oct 2016 13:06:00 +0000</pubDate></item><item><title>&#x625;&#x639;&#x62F;&#x627;&#x62F; &#x62E;&#x627;&#x62F;&#x648;&#x645; &#x648;&#x650;&#x628; &#x648;&#x62E;&#x627;&#x62F;&#x648;&#x645; FTP &#x639;&#x644;&#x649; Red Hat Enterprise Linux</title><link>https://academy.hsoub.com/devops/linux/redhat/%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF-%D8%AE%D8%A7%D8%AF%D9%88%D9%85-%D9%88%D9%90%D8%A8-%D9%88%D8%AE%D8%A7%D8%AF%D9%88%D9%85-ftp-%D8%B9%D9%84%D9%89-red-hat-enterprise-linux-r744/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2016_11/redhat-FTP.png.24b02eec09036ae757796ff0c44e8020.png" /></p>

<p>
	تعمل خواديم الوِب Web servers على تقديم المحتوى، صفحات الوِب ومستندات أخرى؛ للعملاء Clients عبر الشبكة. أما خادوم FTP فهو من أقدم طرق توفير الملفات - غير الآمنة - للمستخدمين عبر الشبكة وأكثرها انتشارا. يتوفّر نظام Red Hat Enterprise Linux 7 على الإصدار 2.4 من برنامج Apache لخواديم الوِب؛ كما يتوفّر على برنامج VSFTPD لتأدية عمل خادوم FTP مع إضافة طبقة <abbr title="Transport Layer Security | بروتوكول أمن طبقة النقل">TLS</abbr> لتأمينه.
</p>

<p>
	سنرى في هذا المقال من سلسلة دروس RHCSA كيفية تثبيت خادومي وِب وFTP، إعدادهما وتأمينهما على RHEL 7.
</p>

<h2 id="تثبيت-apache-وخادوم-ftp">
	تثبيت Apache وخادوم FTP
</h2>

<p>
	تفترض الخطوات أدناه أن لديك خادوم RHEL 7 معدًّا وجاهزا للعمل. نبدأ بتثبيت Apache وVSFTPD:
</p>

<pre class="ipsCode" id="ips_uid_7728_7">
# yum update &amp;&amp; yum install httpd vsftpd</pre>

<p>
	يصبح الخادومان بعد اكتمال أمر التثبيت أعلاه جاهزين، ولكن ينبغي أولا تفعيل الخدمتين يدويا ثم تفعيل تشغيلهما مع إقلاع النظام:
</p>

<pre class="ipsCode" id="ips_uid_8718_7">
# systemctl start httpd
# systemctl enable httpd
# systemctl start vsftpd
# systemctl enable vsftpd</pre>

<p>
	نحتاج أيضا لإضافة قاعدة إلى الجدار الناري تسمح بمرور الاتّصالات عبر المنفذين <code>80</code> و<code>21</code> وهما المنفذان المبدئيان لخادومي الوِب وFTPعلى التوالي:
</p>

<pre class="ipsCode" id="ips_uid_8718_9">
# firewall-cmd --zone=public --add-port=80/tcp --permanent
# firewall-cmd --zone=public --add-service=ftp --permanent
# firewall-cmd --reload</pre>

<p>
	افتح المتصفح على الخادوم وأدخل العنوان <code>127.0.0.1</code> للتأكد من أن خادوم الوِب يعمل. يمكنك أيضا الوصول إلى الصفحة من حاسوب آخر يوجد على نفس <a href="https://academy.hsoub.com/devops/servers/%D8%A5%D9%86%D8%B4%D8%A7%D8%A1-%D8%B4%D8%A8%D9%83%D8%A9-%D8%AF%D8%A7%D8%AE%D9%84%D9%8A%D8%A9-%D8%A7%D9%81%D8%AA%D8%B1%D8%A7%D8%B6%D9%8A%D8%A9-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-oracle-virtualbox-r263/" rel="">الشبكة الداخليّة</a> بإدخال عنوان IP الخاصّ بالخادوم؛ مثلا <code>192.168.2.200</code>. يجب أن تظهر الصفحة التاليّة:
</p>

<p>
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="18551" href="https://academy.hsoub.com/uploads/monthly_2016_07/01_apache_homepage.png.206e0b291d296aba4592e54971b53066.png" rel=""><img alt="01_apache_homepage.png" class="ipsImage ipsImage_thumbnailed" data-fileid="18551" data-unique="vpsnf4p1e" src="https://academy.hsoub.com/uploads/monthly_2016_07/01_apache_homepage.thumb.png.ed0d487006e54e57185ec921e3e50d9d.png"></a>
</p>

<p>
	بالنسبة لخادوم FTP فسنحتاج لإعداده قبل أن نتأكد من أنه يعمل على النحو المطلوب؛ وهو ما سنفعله بعد قليل.
</p>

<h2 id="إعداد-خادوم-وب-apache-وتأمينه">
	إعداد خادوم وِب Apache وتأمينه
</h2>

<p>
	يوجد ملفّ الإعداد الأساسي لخادوم الوِب Apache على المسار <code>etc/httpd/conf/httpd.conf/</code>، ويمكن استخدام ملفّات إعداد أخرى بوضعها داخل المجلّد <code>etc/httpd/conf.d/</code>.
</p>

<p>
	تكفي الإعدادات المبدئية في معظم الحالات؛ إلا أنه من الجيّد التعوّد على جميع خيارات الإعداد المتاحة، المشروحة في التوثيق الرسمي.
</p>

<p>
	تأكد دائما من أخذ نسخة احتياطيّة قبل أن تبدأ في تحرير ملفّ الإعداد:
</p>

<pre>
 </pre>

<pre class="ipsCode" id="ips_uid_8718_11">
# cp /etc/httpd/conf/httpd.conf /etc/httpd/conf/httpd.conf.$(date +%Y%m%d)
</pre>

<p>
	افتح الملفّ ب<a href="https://academy.hsoub.com/certificates/redhat/rhcsa/%D9%85%D8%B9%D8%A7%D9%84%D8%AC%D8%A9-%D8%A7%D9%84%D9%86%D8%B5%D9%88%D8%B5-%D8%B9%D9%84%D9%89-redhat-enterprise-linux-%D8%AA%D8%AD%D8%B1%D9%8A%D8%B1%D9%87%D8%A7-%D8%A8%D9%80-nano-%D9%88-vim-%D9%88%D8%A7%D9%84%D8%A8%D8%AD%D8%AB-%D9%81%D9%8A%D9%87%D8%A7-%D8%A8%D9%80-grep-r43/" rel="">محرّر النصوص</a> المفضّل لديك ثم ابحث عن التعليمات التاليّة:
</p>

<ul>
<li>
		<code>ServerRoot</code>: تحدّد قيمةُ هذه التعليمة المجلّدََ الذي توجد به ملفات الإعداد، الأخطاء والسّجلات الخاصّة بخادوم الوِب.
	</li>
	<li>
		<code>Listen</code>: تطلُب من Apache الإنصات للاتصالات القادمة عبر منفَذ و/أو عنوان IP معيَّنين. المنفذ المبدئي هو <code>80</code>.
	</li>
	<li>
		<code>Include</code>: تطلُب من خادوم الوِب تضمين ملفّات إعداد أخرى. يجب أن تكون هذه الملفّات موجودة وإلا فإن خادوم الوِب لن يتمكّن من العمل. يمكن جعل تضمين هذه الملفّات اختياريا باستخدام <code>IncludeOptional</code> بدلا من <code>Include</code>.
	</li>
	<li>
		<code>User</code> و <code>Group</code>: حساب المستخدِم والمجموعة الذين تُشغَّل خدمة الوِب باسمهما.
	</li>
	<li>
		<code>DocumentRoot</code>: مسار المجلّد الذي يستخدمه خادوم الوِب لتقديم المحتوى. تُؤخذ مبدئيا جميع المستندات المقدَّمة للإجابة على الطلبات من هذا المجلّد؛ إلا أنه يمكن استخدام <a href="https://academy.hsoub.com/certificates/redhat/rhcsa/%D8%A5%D8%AF%D8%A7%D8%B1%D8%A9-%D8%A7%D9%84%D9%85%D9%84%D9%81%D8%A7%D8%AA-%D9%88%D8%A7%D9%84%D9%85%D8%AC%D9%84%D8%AF%D8%A7%D8%AA-%D8%B9%D9%84%D9%89-red-hat-enterprise-linux-r41/#%D8%A5%D9%86%D8%B4%D8%A7%D8%A1-%D8%A7%D9%84%D9%88%D8%B5%D9%84%D8%A7%D8%AA-%D8%A7%D9%84%D8%B5%D9%84%D8%A8%D8%A9-%D9%88%D8%A7%D9%84%D8%B1%D9%85%D8%B2%D9%8A%D8%A9" rel="">وصلات رمزية</a> لتقديم مستندات توجد خارج هذا المجلّد.
	</li>
	<li>
		<code>ServerName</code>: تحدّد هذه التعليمة اسم المضيف (أو عنوان IP) والمنفذ الذي يستخدمه خادوم الوِب للتعريف بنفسه.
	</li>
</ul>
<p>
	يتمثّل أول إعداد أمني في إنشاء حساب مستخدِم ومجموعة خاصّين بتشغيل خادوم الوِب (التعليمتان <code>User</code> و<code>Group</code> السابقتان):
</p>

<pre class="ipsCode" id="ips_uid_8718_13">
ServerRoot "/etc/httpd"
Listen 80
User academy
Group academy
ServerName www.exapmle.com
DocumentRoot "/var/www/html"</pre>

<p>
	يمكننا اختبار الإعدادات بالأمر التالي:
</p>

<pre>
 </pre>

<pre class="ipsCode" id="ips_uid_8718_15">
# apachectl configtest
</pre>

<p>
	إن لم يوجد خطأ في الإعدادات فستظهر عبارة <code>Syntax OK</code>.
</p>

<p>
	<strong>ملحوظة:</strong> إن ظهرت رسالة الخطأ <code>Could not reliably determine the server's fully qualified domain name</code> فهذا يعني أنه لم تُحدَّد قيمة للتعليمة <code>ServerName</code> في ملفّ الإعداد.
</p>

<p>
	يمكننا الآن إعادة تشغيل خادوم الوِب لاعتماد الإعدادات:
</p>

<pre class="ipsCode" id="ips_uid_8718_20">
# systemctl restart httpd</pre>

<p>
	<strong>ملحوظة:</strong> لا يمكن - مبدئيا - استخدام منفذ مغاير للمنافذ التي تظهر في نتيجة الأمر التالي في إعداد خادوم الوِب، وذلك نظرا لسياسات SELinux:
</p>

<pre class="ipsCode" id="ips_uid_8718_22">
# semanage port -l | grep -w '^http_port_t'</pre>

<p>
	إن كنت ترغب في استخدام منفذ غير موجود في اللائحة أعلاه (مثلا <code>8100</code> عبر <a href="https://academy.hsoub.com/devops/servers/%d9%88%d8%a7%d8%ac%d9%87%d8%a7%d8%aa-%d8%b4%d8%a8%d9%83%d8%a9-%d8%a7%d9%84%d8%a5%d9%86%d8%aa%d8%b1%d9%86%d8%aa-%d9%88%d8%a8%d8%b1%d9%88%d8%aa%d9%88%d9%83%d9%88%d9%84%d8%a7%d8%aa%d9%87%d8%a7-%d8%a7%d9%84%d8%a3%d8%b3%d8%a7%d8%b3%d9%8a%d9%91%d8%a9-r64/#%D8%A7%D8%A8%D8%B1%D9%88%D8%AA%D9%88%D9%83%D9%88%D9%84-%D8%A7%D9%84%D8%AA%D8%AD%D9%83%D9%85-%D9%81%D9%8A-%D8%A7%D9%84%D8%A5%D8%B1%D8%B3%D8%A7%D9%84-transmission-control-protocol-tcp" rel="">بروتوكول</a> TCP) فستحتاج لإضافة سياق منفذ Port context خاصّ بالخدمة <code>httpd</code>:
</p>

<pre class="ipsCode" id="ips_uid_8718_24">
# semanage port -a -t http_port_t -p tcp 8100</pre>

<p>
	في ما يلي إجراءات إضافيّة يمكن تنفيذها من أجل تأمين أكبر لخادوم وِب Apache:
</p>

<ol>
<li>
		<p>
			تعطيل وصول المستخدِم الذي يُشغَّل Apache باسمه من الوصول إلى الصّدفة:
		</p>

		<pre class="ipsCode" id="ips_uid_8718_26">
# usermod -s /sbin/nologin academy</pre>

		<p>
			 
		</p>
	</li>
	<li>
		<p>
			تعطيل سرد محتويات المجلّدات في Apache لمنع المتصفّح من عرض محتويات مجلّد لا يحوي ملفّ <code>index.html</code>. حرّر الملفّ <code>etc/httpd/conf/httpd.conf/</code> (وكذلك ملفات <a href="academy.hsoub.com/devops/servers/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%B6%D8%A8%D8%B7-%D8%A7%D9%84%D9%85%D8%B3%D8%AA%D8%B6%D9%8A%D9%81%D8%A7%D8%AA-%D8%A7%D9%84%D8%A7%D9%81%D8%AA%D8%B1%D8%A7%D8%B6%D9%8A%D8%A9-%D9%81%D9%8A-%D8%AE%D8%A7%D8%AF%D9%88%D9%85-%D9%88%D8%A8-apache-%D8%B9%D9%84%D9%89-%D8%A3%D9%88%D8%A8%D9%86%D8%AA%D9%88-1404-r10" rel="">المضيفات الافتراضية</a> في حال وجودها) وتأكّد من أن قيمة التعليمة <code>Options</code> في بداية مقاطع <code>Directory</code> تساوي <code>None</code>:
		</p>

		<pre class="ipsCode" id="ips_uid_8718_28">
Options None</pre>

		<p>
			 
		</p>
	</li>
	<li>
		<p>
			إخفاء معلومات التعريف بخادوم الوِب ونظام التشغيل عند الإجابة عن طلبات HTTP. حرّر ملفّ الإعداد <code>etc/httpd/conf/httpd.conf/</code> بتغيير قيمتي التعليمتين <code>ServerTokens</code> و<code>ServerSignature</code> على النحو التالي:
		</p>

		<pre class="ipsCode" id="ips_uid_8718_30">
ServerTokens Prod 
ServerSignature Off</pre>

		<p>
			 
		</p>
	</li>
</ol>
<p>
	ستُعتمَد التعديلات بإعادة تشغيل خادوم الوِب، ويمكنك بد تقديم الصفحات من المجلّد <code>var/www/html/</code>.
</p>

<h2 id="إعداد-خادوم-ftp-وتأمينه">
	إعداد خادوم FTP وتأمينه
</h2>

<p>
	يوجد ملفّ الإعداد الأساسي لخادوم Vsftpd على المسار <code>etc/vsftpd/vsftpd.conf/</code>. يحوي الملفّ - مثل ملفّ إعداد Apache - الكثير من التعليقات التي تشرح عمل التعليمات. تعدّ الإعدادات الأساسيّة كافيّة إلا أنه تجب معرفة التعليمات الموجودة في التوثيق من أجل تشغيل الخادوم بقعاليّة.
</p>

<p>
	بالنسبة لنا استخدمنا الإعدادات التاليّة:
</p>

<pre class="ipsCode" id="ips_uid_8718_32">
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
chroot_local_user=YES
allow_writeable_chroot=YES
listen=NO
listen_ipv6=YES
pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES</pre>

<p>
	من المهمّ الإشارة إلى أن إعطاء القيمة <code>YES</code> للتعليمة <code>chroot_local_user</code> يمنع المستخدمين من الوصول إلى ملفات توجد خارج المجلدات الشخصية الخاصّة بهم.
</p>

<p>
	ثم نضبُط SELinux للسماح لخادوم FTP بقراءة الملفات الموجودة في مجلد المستخدم الشخصي:
</p>

<pre class="ipsCode" id="ips_uid_8718_34">
# setsebool -P ftp_home_dir on</pre>

<p>
	يمكن للعملاء الآن استخدام برنامج مثل Filezilla (عميلFTP) للوصول إلى الملفات على الخادوم. يحتفظ الملفّ <code>var/log/xferlog/</code> بسجلّ التنزيلات والتحميلات التي تحدُث عبر خادوم FTP.
</p>

<p>
	ترجمة - بتصرّف - لمقال <a href="http://www.tecmint.com/rhcsa-series-install-and-secure-apache-web-server-and-ftp-in-rhel/" rel="external nofollow">RHCSA Series: Installing, Configuring and Securing a Web and FTP Server – Part 9</a> لصاحبه Gabriel Cánepa.
</p>
]]></description><guid isPermaLink="false">744</guid><pubDate>Sun, 09 Oct 2016 22:07:00 +0000</pubDate></item><item><title>&#x62A;&#x623;&#x645;&#x64A;&#x646; &#x627;&#x644;&#x627;&#x62A;&#x635;&#x627;&#x644;&#x627;&#x62A; &#x639;&#x646; &#x637;&#x631;&#x64A;&#x642; SSH &#x648;&#x625;&#x639;&#x62F;&#x627;&#x62F; &#x623;&#x633;&#x645;&#x627;&#x621; &#x627;&#x644;&#x645;&#x636;&#x64A;&#x641;&#x627;&#x62A; &#x639;&#x644;&#x649; Red Hat Enterprise Linux</title><link>https://academy.hsoub.com/devops/linux/redhat/%D8%AA%D8%A3%D9%85%D9%8A%D9%86-%D8%A7%D9%84%D8%A7%D8%AA%D8%B5%D8%A7%D9%84%D8%A7%D8%AA-%D8%B9%D9%86-%D8%B7%D8%B1%D9%8A%D9%82-ssh-%D9%88%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF-%D8%A3%D8%B3%D9%85%D8%A7%D8%A1-%D8%A7%D9%84%D9%85%D8%B6%D9%8A%D9%81%D8%A7%D8%AA-%D8%B9%D9%84%D9%89-red-hat-enterprise-linux-r743/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2016_11/redhat-ssh.png.db53b365c10e4f555b891850336c571e.png" /></p>

<p>
	تتطلّب إدارة الخواديم الولوج عن بعد إلى النظام لتنفيذ مهامّ مختلفة باستخدام محاك للطرفيّة. في الواقع، من النادر أن يتواجد مدير النظام مباشرة أمام الخادوم أو حتى في نفس الموقع الجغرافي. يعني هذا أنه سيحتاج لطريقة تمكّنه من الولوج عن بعد إلى الأجهزة التي ستُطلب منه إدارتها.
</p>

<p>
	كان مديرو الأنظمة في البداية يستعملون خدمة <code>telnet</code> للولوج إلى الأنظمة عن بعد؛ إلا أن هذه الخدمة لم تعد مستعملة نظرا لأن الاتصالات التي تتم عبرها غير آمنة وتمكن قراءتها. سنرى في هذا المقال طريقة آمنة للولوج عن بعد إلى الخواديم وكيفيةَ إعداد خدمات الشبكة لتبدأ تلقائيا بعد إقلاع النظام؛ كما سنتعرّض لكيفية ضبط الشبكة واسم المضيف Hostname.
</p>

<h2 id="تثبيت-ssh-وتأمين-الاتصالات">
	تثبيت <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr> وتأمين الاتصالات
</h2>

<p>
	ستحتاج، لتكون قادرا على الاتصال بخواديم RHEL عن بعد عن طريق <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr>، إلى تثبيت الحزم <code>openssh-server </code>، <code>openssh-clients</code> و<code>openssh</code>. لن يكتفي الأمر التالي بتثبيت برنامج الولوج عن بعد بل سيثبّت أيضا أداة نقل الملفات عن بعد وأداة لتأمين تقل الملفات:
</p>

<pre class="ipsCode" id="ips_uid_5373_7">
# yum update &amp;&amp; yum install openssh openssh-clients openssh-server
</pre>

<p>
	تتولى حزمة <code>openssh-server</code> إدارة الاتصالات عبر <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr> من جانب الخادوم، في ما تتولى <code>openssh-clients</code> إدارتها من جانب العميل؛ تثبيتُ الحزمتين - إضافة إلى حزمة <code>openssh</code> - على نفس الجهاز يمكّن من استخدامه للاتّصال بجهاز آخر أو للاتصال به انطلاقا من جهاز آخر.
</p>

<p>
	توجد إعدادات أساسيّة في الملفّ <code>etc/<abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">ssh</abbr>/sshd_config/</code> على الخادوم يزيد تعديل قيمها المبدئيّة من أمان الاتصالات عن بعد:
</p>

<ul>
<li>
		غيّر المنفذ Port المبدئي الذي يُنصت عبره الخادوم لاتصالات <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr>. القيمة المبدئيّة هي <code>22</code>. تأكد قبل تغيير المنفذ أنه غير مُستخدَم؛ مثلا بتنفيذ أمر <code>netstat</code>على النحو التالي (حيث <code>2500</code> هو المنفذ الذي نريد التأكد من شغوره):
	</li>
</ul>
<pre class="ipsCode" id="ips_uid_3971_9">
# netstat -npltu | grep 2500</pre>

<p>
	إن لم يُرجع الأمر أعلاه أية نتيجة فيمكنك استخدام المنفذ <code>2500</code> دون مشاكل. افتح الملف <code>etc/<abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">ssh</abbr>/sshd_config/</code> لتعديل المنفذ المبدئي على الخادوم ليصبح على النحو التالي:
</p>

<pre class="ipsCode" id="ips_uid_3971_11">
Port 2500
</pre>

<ul>
<li>
		ثم في نفس الملفّ عدّل قيمة التعليمة <code>Protocol</code> لتصبح <code>2</code> فقط:
	</li>
</ul>
<pre class="ipsCode" id="ips_uid_3971_13">
Protocol 2</pre>

<p>
	اضبط المهلة الزمنيّة للاستيثاق على القيمة دقيقتين على سبيل المثال، عطّل إمكانيّة الدخول بالحساب الجذر <code>root</code> عن بعد واجعل الولوج عن بعد متاحا فقط لمجموعة محدودة من المستخدمين:
</p>

<pre class="ipsCode" id="ips_uid_3971_15">
LoginGraceTime 2m
PermitRootLogin no
AllowUsers academy</pre>

<p>
	 
</p>

<ol>
<li>
		<p>
			يمكن أيضا تفعيل الاستيثاق المعتمد على المفاتيح بدلا من كلمات السّر:
		</p>

		<pre class="ipsCode" id="ips_uid_3971_17">
PasswordAuthentication no
RSAAuthentication yes
PubkeyAuthentication yes</pre>

		<p>
			 
		</p>
	</li>
</ol>
<p>
	يفترض الإعداد الأخير أنك سبق أن ولّدت زوج مفاتيح لحساب المستخدم على الأجهزة العميلة ونسخت المفتاح العامّ إلى الخادوم مثل ما هو مشروح في درس <a href="https://academy.hsoub.com/devops/servers/%D8%A7%D9%84%D8%B9%D9%85%D9%84-%D9%85%D8%B9-%D8%AE%D9%88%D8%A7%D8%AF%D9%8A%D9%85-ssh-%D8%A7%D9%84%D8%B9%D9%85%D9%84%D8%A7%D8%A1-%D9%88%D8%A7%D9%84%D9%85%D9%81%D8%A7%D8%AA%D9%8A%D8%AD-r55/" rel="">العمل مع خواديم <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr>: العملاء والمفاتيح</a>.
</p>

<h2 id="إعداد-الشبكة-وتمييز-الأسماء-name-resolution">
	إعداد الشبكة وتمييز الأسماء Name resolution
</h2>

<p>
	توجد بضعة ملفات إعداد تتحكّم في إعدادات الشبكة على مستوى النظام عموما:
</p>

<h3 id="1-ملف-etchosts">
	1. ملف <code>etc/hosts/</code>
</h3>

<p>
	يُستخدَم هذا الملفّ لترجمة أسماء المضيفات إلى عناوين IP في الشبكات الصغيرة. يأخذ كلّ سطر في الملفّ الصيغة التاليّة:
</p>

<pre>
 </pre>

<pre class="ipsCode" id="ips_uid_3971_21">
 اسم النطاق المعرَّف بالكامل  اسم المضيف   العنوان
</pre>

<p>
	على سبيل المثال:
</p>

<pre>
 </pre>

<pre class="ipsCode" id="ips_uid_3971_23">
192.168.0.10    rhcsa   rhcsa.redhat.academy.hsoub.com
</pre>

<h3 id="2-ملف-etcresolvconf">
	2. ملفّ <code>etc/resolv.conf/</code>
</h3>

<p>
	يحدّد عناوين IP الخاصّة بخواديم النطاقات ونطاق البحث الذي يُستخدَم لتكملة استعلام عن اسم نطاق في حال عدم تحديد <a href="https://academy.hsoub.com/devops/servers/%D9%85%D9%82%D8%AF%D9%91%D9%85%D8%A9-%D8%A5%D9%84%D9%89-%D9%85%D9%8F%D8%B5%D8%B7%D9%8E%D9%84%D8%AD%D8%A7%D8%AA-%D9%88%D8%B9%D9%86%D8%A7%D8%B5%D8%B1-%D9%88%D9%85%D9%81%D8%A7%D9%87%D9%8A%D9%85-%D9%86%D8%B8%D8%A7%D9%85-%D8%A3%D8%B3%D9%85%D8%A7%D8%A1-%D8%A7%D9%84%D9%86%D8%B7%D8%A7%D9%82%D8%A7%D8%AA-r5/" rel="">اسم النطاق المعرَّف بالكامل</a>. لن تحتاج لتحرير هذا الملفّ في الحالات العاديّة؛ ولكن إن احتجت لتعديل خواديم النطاقات فمن المهمّ الحفاظ على الصيغة التاليّة لكلّ سطر في الملف:
</p>

<pre>
 </pre>

<pre class="ipsCode" id="ips_uid_3971_25">
nameserver  عنوان IP
</pre>

<p>
	على سبيل المثال:
</p>

<pre>
 </pre>

<pre class="ipsCode" id="ips_uid_3971_27">
nameserver 8.8.8.8
</pre>

<h3 id="3-ملف-etchostconf">
	3. ملفّ <code>etc/host.conf/</code>
</h3>

<p>
	يحدّد الطرق والترتيبات التي يستخدمها خادوم تمييز الأسماء لمعرفة عناوين أسماء المضيفات في الشبكة. بمعنى أنه يخبر الخادوم الخدماتِ التي يجب عليه الاستعانة بها ووفق أي ترتيب. توجد في هذا الملفّ خيارات كثيرة؛ إلا أن الإعداد الأساسي والأكثر انتشارا يحوي سطرا بالصيغة التاليّة:
</p>

<pre>
 </pre>

<pre class="ipsCode" id="ips_uid_3971_29">
order bind,hosts
</pre>

<p>
	تشير هذه الصيغة إلى أن خادوم تمييز الأسماء يجب أن يستعلم أولا من الخواديم المحدّدة في الملفّ <code>resolv.conf</code> ثم إن لم يحصُل على نتيجة ينظُر في الملفّ <code>etc/hosts/</code>.
</p>

<h3 id="4-ملف-etcsysconfignetwork">
	4. ملفّ <code>etc/sysconfig/network/</code>
</h3>

<p>
	يحوي هذا الملفّ معلومات التوجيه Routing ومعلومات المضيف العامّة لجميع <a href="https://academy.hsoub.com/devops/servers/%d9%88%d8%a7%d8%ac%d9%87%d8%a7%d8%aa-%d8%b4%d8%a8%d9%83%d8%a9-%d8%a7%d9%84%d8%a5%d9%86%d8%aa%d8%b1%d9%86%d8%aa-%d9%88%d8%a8%d8%b1%d9%88%d8%aa%d9%88%d9%83%d9%88%d9%84%d8%a7%d8%aa%d9%87%d8%a7-%d8%a7%d9%84%d8%a3%d8%b3%d8%a7%d8%b3%d9%8a%d9%91%d8%a9-r64/#%D8%A7%D9%84%D9%88%D8%A7%D8%AC%D9%87%D8%A7%D8%AA" rel="">واجهات الشبكة</a>. يمكن استخدام التعليمات التاليّة:
</p>

<pre class="ipsCode" id="ips_uid_3971_31">
NETWORKING=yes|no
HOSTNAME=value</pre>

<p>
	حيث <code>value</code> هي اسم النطاق المعرَّف بالكامل للمضيف.
</p>

<pre>
 </pre>

<pre class="ipsCode" id="ips_uid_3971_33">
GATEWAY=XXX.XXX.XXX.XXX
</pre>

<p>
	حيث <code>XXX.XXX.XXX.XXX</code> هو عنوان IP الخاصّ بالبوّابة Gateway.
</p>

<pre>
 </pre>

<pre class="ipsCode" id="ips_uid_3971_35">
GATEWAYDEV=value
</pre>

<p>
	تحدّد قيمة هذه التعليمة، في حالة حاسوب توجد به أكثر من واجهة شبكة، الجهازَ الطّرفي Device الذي توجد عليه البواّبة؛ مثلا <code>enp0s3</code>.
</p>

<h3 id="مجلد-etcsysconfignetwork-scripts-ملفات-إعداد-واجهات-الشبكة">
	مجلّد <code>etc/sysconfig/network-scripts/</code> (ملفات إعداد واجهات الشبكة)
</h3>

<p>
	توجد داخل هذا المجلّد ملفات عدّة تبدأ أسماءها بـ<code>ifcfg</code>؛ يظهر بعد السابقة <code>ifcfg</code> في اسم الملفّ اسمُ الواجهة التي يضبط إعداداتها. يمكن عرض أسماء الواجهات الموجودة على الجهاز باستخدام الأمر <code>ip link show</code>:
</p>

<pre>
 </pre>

<pre class="ipsCode" id="ips_uid_3971_37">
# ip link show
1: lo: &lt;LOOPBACK,UP,LOWER_UP&gt; mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: enp0s3: &lt;NO-CARRIER,BROADCAST,MULTICAST,UP&gt; mtu 1500 qdisc pfifo_fast state DOWN mode DEFAULT qlen 1000
    link/ether 08:00:27:21:98:8c brd ff:ff:ff:ff:ff:ff
</pre>

<p>
	تظهر في نتيجة الأمر أعلاه أسماءُ الواجهات <code>enp0s3</code>، <code>lo</code> و<code>enp0s8</code>؛ وعند سرد محتويات المجلّد:
</p>

<pre>
 </pre>

<pre class="ipsCode" id="ips_uid_3971_39">
# ls /etc/sysconfig/network-scripts/
ifcfg-enp0s3     ifdown-eth   ifdown-post    ifdown-TeamPort  ifup-eth   ifup-plip    ifup-sit       init.ipv6-global
ifcfg-lo         ifdown-ib    ifdown-ppp     ifdown-tunnel    ifup-ib    ifup-plusb   ifup-Team      network-functions
ifcfg-Profile_1  ifdown-ippp  ifdown-routes  ifup             ifup-ippp  ifup-post    ifup-TeamPort  network-functions-ipv6
ifdown           ifdown-ipv6  ifdown-sit     ifup-aliases     ifup-ipv6  ifup-ppp     ifup-tunnel
ifdown-bnep      ifdown-isdn  ifdown-Team    ifup-bnep        ifup-isdn  ifup-routes  ifup-wireless
</pre>

<p>
	لاحظ الملفات التي تبدأ أسماءها بـ<code>ifcfg</code> مثل <code>ifcfg-enp0s3</code>. تتشابه إعدادات الواجهات، ما عدا واجهة <code>lo</code>. ينبغي الانتباه إلى أن تعديل قيمة متغيرّات في ملفّ <code>ifcfg</code> الخاصّ بواجهة سيلغي تطبيق التعليمات المشابهة الواردة في الملفّ <code>etc/sysconfig/network/</code> على هذه الواجهة. أضفنا تعليقات إلى تعليمات الملفّات الواردة أدناه من أجل الشّرح؛ إلا أنه ينبغي تجنّب إضافة تعليقات إلى الملفّ الفعلي.
</p>

<pre class="ipsCode" id="ips_uid_3971_43">
# عنوان MAC الخاصّ بالواجهة
HWADDR=08:00:27:4E:59:37
# نوع الاتصال
TYPE=Ethernet
# تشير هذه القيمةإلى أن عنوان آي بي الخاصّ بالواجهة قد حُدِّد يدويا.
# إن كانت قيمة التعليمة هي 
# dhcp 
# فهذا يعني أن عنوان آي بي يحدّده خادوم
# DHCP
# ؛ وبالتالي يجب ألا يكون السطران المواليّان لهذا السطر مذكورين
BOOTPROTO=static
# عنوان آي بي الواجهة
IPADDR=192.168.0.18
# قناع الشبكة
NETMASK=255.255.255.0
# البوابة
GATEWAY=192.168.0.1
# تحدّد ما إذا كان مدير الشبكة 
# Network manager 
# يتحكّم في هذه الواجهة.
# القيمة هنا هيno 
# ؛ من أجل منع تغيير الإعدادات
NM_CONTROLLED=no 
NAME=enp0s3
UUID=14033805-98ef-4049-bc7b-d4bea76ed2eb
# تحدّد هذه التعليمة ما إذا كان على نظام التشغيل تفعيل هذه الواجهة مع إقلاع النظام
# (نعم yes في حالتنا)
ONBOOT=yes</pre>

<h2 id="إعداد-أسماء-المضيفات">
	إعداد أسماء المضيفات
</h2>

<p>
	يُستخدَم الأمر <code>hostnamectl</code> للاستعلام عن أسماء المضيفات ولضبطها على نظام Red Hat Enterprise Linux 7. نفّذ الأمر التالي لعرض الاسم الحالي للمضيف:
</p>

<pre class="ipsCode" id="ips_uid_3971_45">
# hostnamectl 
Static hostname: localhost.localdomain
        Icon name: computer-vm
        Chassis: vm
        Machine ID: df88bf46c92e47e8b4b16df99ab633d9
        Boot ID: dc52c695417a4a6aa77dfdd633b2c3c7
    Virtualization: kvm
Operating System: Red Hat Enterprise Linux
    CPE OS Name: cpe:/o:redhat:enterprise_linux:7.2:GA:server
            Kernel: Linux 3.10.0-327.18.2.el7.x86_64
    Architecture: x86-64</pre>

<p>
	استخدم الخيار <code>set-hostname</code> مع الأمر لتغيير اسم المضيف إلى الاسم المُمرَّر في المعطى الموالي:
</p>

<pre>
 </pre>

<pre class="ipsCode" id="ips_uid_3971_47">
# hostnamectl set-hostname academy1
</pre>

<p>
	يضبُط الأمر أعلاه اسمَ المضيف ليصبح <code>academy1</code>.
</p>

<p>
	أعد تشغيل خدمة <code>hostnamed</code> لاعتماد التعديل دون الحاجة لإعادة تشغيل الجهاز:
</p>

<pre>
 </pre>

<pre class="ipsCode" id="ips_uid_3971_49">
# systemctl restart systemd-hostnamed
</pre>

<p>
	يمكن أيضا استخدام الأداة <code>nmcli</code> لنفس الغرض. يعرض الأمر التالي الاسم الحالي للمضيف:
</p>

<pre>
 </pre>

<pre class="ipsCode" id="ips_uid_3971_51">
# nmcli general hostname
</pre>

<p>
	استخدم الأمر التالي لتغيير اسم المضيف بالأداة <code>nmcli</code>:
</p>

<pre>
 </pre>

<pre class="ipsCode" id="ips_uid_3971_53">
# nmcli general hostname academy1
</pre>

<h2 id="تشغيل-خدمات-الشبكة-مع-إقلاع-النظام">
	تشغيل خدمات الشبكة مع إقلاع النظام
</h2>

<p>
	نريد الآن التأكد من أن خدمات الشبكة ستُشغَّل تلقائيا مع إقلاع نظام التشغيل. يتم هذا الأمر ب<a href="https://academy.hsoub.com/certificates/redhat/rhcsa/%d8%a5%d8%af%d8%a7%d8%b1%d8%a9-%d8%a7%d9%84%d9%85%d9%84%d9%81%d8%a7%d8%aa-%d9%88%d8%a7%d9%84%d9%85%d8%ac%d9%84%d8%af%d8%a7%d8%aa-%d8%b9%d9%84%d9%89-red-hat-enterprise-linux-r41/#%D8%A5%D9%86%D8%B4%D8%A7%D8%A1-%D8%A7%D9%84%D9%88%D8%B5%D9%84%D8%A7%D8%AA-%D8%A7%D9%84%D8%B5%D9%84%D8%A8%D8%A9-%D9%88%D8%A7%D9%84%D8%B1%D9%85%D8%B2%D9%8A%D8%A9" rel="">إنشاء وصلات</a> إلى ملفات محدّدة ضمن مقطع <code>[install]</code> في ملفات إعداد الخدمات (مثل <code>usr/lib/systemd/system/firewalld.service/</code> بالنسبة للجدار الناري <code>firewalld</code>). لكننا لن نتولى عملية إنشاء الوصلات مباشرة؛ بل إن <a href="https://academy.hsoub.com/devops/linux/%d8%a3%d8%b3%d8%a7%d8%b3%d9%8a%d8%a7%d8%aa-systemd-%d8%a7%d9%84%d8%b9%d9%85%d9%84-%d9%85%d8%b9-%d8%a7%d9%84%d8%ae%d8%af%d9%85%d8%a7%d8%aa%d8%8c-%d8%a7%d9%84%d9%88%d8%ad%d8%af%d8%a7%d8%aa-units%d8%8c-%d9%88%d8%a7%d9%84%d9%8a%d9%88%d9%85%d9%8a%d8%a7%d8%aa-journal-r130/" rel="">نظام التمهيد SystemD</a> سيتولى المهمة.
</p>

<p>
	ننفّذ الأمر التالي لتفعيل خدمة الجدار الناري مع الإقلاع:
</p>

<pre>
 </pre>

<pre class="ipsCode" id="ips_uid_3971_55">
# systemctl enable firewalld
</pre>

<p>
	وبالنسبة لخدمة الشبكة:
</p>

<pre>
 </pre>

<pre class="ipsCode" id="ips_uid_3971_57">
# systemctl enable network
</pre>

<p>
	ترجمة - بتصرّف - لمقال <a href="http://www.tecmint.com/rhcsa-series-secure-ssh-set-hostname-enable-network-services-in-rhel-7/" rel="external nofollow">RHCSA Series: Securing <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr>, Setting Hostname and Enabling Network Services – Part 8</a> لصاحبه Gabriel Cánepa.
</p>
]]></description><guid isPermaLink="false">743</guid><pubDate>Wed, 28 Sep 2016 02:00:00 +0000</pubDate></item><item><title>&#x627;&#x633;&#x62A;&#x62E;&#x62F;&#x627;&#x645; &#x642;&#x648;&#x627;&#x626;&#x645; &#x627;&#x644;&#x62A;&#x62D;&#x643;&#x645; &#x641;&#x64A; &#x627;&#x644;&#x648;&#x635;&#x648;&#x644; ACL &#x648;&#x62A;&#x631;&#x643;&#x64A;&#x628; &#x623;&#x646;&#x638;&#x645;&#x629; &#x627;&#x644;&#x645;&#x644;&#x641;&#x627;&#x62A; &#x627;&#x644;&#x634;&#x628;&#x643;&#x64A;&#x629; &#x639;&#x644;&#x649; Red Hat Enterprise Linux</title><link>https://academy.hsoub.com/devops/linux/redhat/%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D9%82%D9%88%D8%A7%D8%A6%D9%85-%D8%A7%D9%84%D8%AA%D8%AD%D9%83%D9%85-%D9%81%D9%8A-%D8%A7%D9%84%D9%88%D8%B5%D9%88%D9%84-acl-%D9%88%D8%AA%D8%B1%D9%83%D9%8A%D8%A8-%D8%A3%D9%86%D8%B8%D9%85%D8%A9-%D8%A7%D9%84%D9%85%D9%84%D9%81%D8%A7%D8%AA-%D8%A7%D9%84%D8%B4%D8%A8%D9%83%D9%8A%D8%A9-%D8%B9%D9%84%D9%89-red-hat-enterprise-linux-r742/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2016_07/redhat-rhcsa-acl.png.73b31058ce85e6f009b701822b2b353e.png" /></p>

<p>
	بدأنا في المقال السابق من سلسلة دروس <a href="https://academy.hsoub.com/certificates/redhat/rhcsa/" rel="">RHCSA</a> شرحَ <a href="https://academy.hsoub.com/certificates/redhat/rhcsa/%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-parted-%D9%88ssm-%D9%84%D9%84%D8%AA%D8%B9%D8%A7%D9%85%D9%84-%D9%85%D8%B9-%D9%88%D8%B3%D8%A7%D8%A6%D8%B7-%D8%A7%D9%84%D8%AA%D8%AE%D8%B2%D9%8A%D9%86-%D8%B9%D9%84%D9%89-red-hat-enterprise-linux-r45/" rel="">كيفية إعداد وسائط التخزين المحليّة باستخدام parted و ssm</a> وشرحنا كيفية إنشاء تجزئات معمّاة وتركيبها Mounting أثناء إقلاع النظام. نذكّر - كما أشرنا إلى ذلك خلال الدرس السابق - بخطورة تنفيذ مهام الإدارة الحرجة على أنظمة الملفّات أثناء تركيبها.
</p>

<p>
	سنراجع في هذا الدرس أهمّ صيغ نظم الملفات المستخدمة في Red Hat Enterprise Linux 7 ثم نغطّي مواضيع تركيب أنظمة الملفات الشبكية (CIFS و NFS)، استخدامها وفصلها؛ إما يدويا أو تلقائيا. سنتطرّق أيضا لماهية قوائم التحكم في الوصول Access control litsts, ACL.
</p>

<p style="text-align: center;">
	<img class="ipsImage ipsImage_thumbnailed" data-fileid="18461" data-unique="ay28m8wfe" src="https://academy.hsoub.com/uploads/monthly_2016_07/redhat-rhcsa-acl.png.7164e438e1ec80d782fddd746c684836.png" alt="redhat-rhcsa-acl.png"></p>

<h2 id="المتطلبات">
	المتطلبات
</h2>

<p>
	تأكد قبل المواصلة مع هذا الدرس من توفّرك على خادوميْ NFS وSamba لتشارك الملفات؛ تمكنك مراجعة الدرسيْن التاليّيْن لإعدادها:
</p>

<ul>
<li>
		<a href="https://academy.hsoub.com/devops/servers/samba/%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF-%D8%AA%D8%B4%D8%A7%D8%B1%D9%83-%D8%A7%D9%84%D9%85%D9%84%D9%81%D8%A7%D8%AA-%D8%B9%D9%84%D9%89-redhat-enterprise-linux-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-samba-r264/" rel="">إعداد تشارك الملفات على RedHat Enterprise Linux باستخدام Samba</a>.
	</li>
	<li>
		<a href="https://academy.hsoub.com/devops/servers/%D8%AA%D8%AB%D8%A8%D9%8A%D8%AA-%D9%86%D8%B8%D8%A7%D9%85-%D8%A7%D9%84%D9%85%D9%84%D9%81%D8%A7%D8%AA-%D8%A7%D9%84%D8%B4%D8%A8%D9%83%D9%8A-nfs-%D9%88%D8%AA%D8%B1%D9%83%D9%8A%D8%A8%D9%87-%D8%B9%D9%84%D9%89-%D8%A3%D9%88%D8%A8%D9%88%D9%86%D8%AA%D9%88-r272/" rel="">تثبيت نظام الملفات الشبكي NFS وتركيبه على أوبونتو</a>.
	</li>
</ul>
<p>
	سنستخدم في هذا الدرس جهازيْن؛ الأول على العنوان <code>192.168.2.100</code> ويشغّل خدمتيْ Samba و NFS (لا يهمّ نظام التشغيل)؛ أما الثاني وهو العميل فيعمل بنظام RHEL 7 على العنوان <code>192.168.2.200</code>؛ وهو الذي سنطبق عليه الخطوات المشروحة هنا.
</p>

<h2 id="أنظمة-الملفات-على-rhel-7">
	أنظمة الملفات على RHEL 7
</h2>

<p>
	اعتمد نظام التشغيل RHEL 7 نظام الملفات XFS مبدئيا نظرا لأدائه العالي وقابليته الكبيرة للتمدّد Scalability. يدعم XFS مبدئيا معيار <code>user_xattr</code> (خاصيّات المستخدم الموسَّعة Extended user attributes) وقوائم التحكم في الوصول ACL؛ وهو ما يعني أنك لا تحتاج للتصريح برغبتك في استخدام هذه الخيارات حتى تكون متاحة؛ عكسَ ماهو كائن في أنظمة الملفّات <code>ext3</code> و<code>ext4</code> (تنصح ردهات بعدم استخدام نظام <code>ext2</code> للملفات على RHEL 7) التي يتوجّب فيها ذكر هذه الخاصيّات، في ملفّ <code>fstab</code> على سبيل المثال.
</p>

<p>
	خاصيّات المستخدم الموسَّعة هي تمديد لخاصيات الملف وتأخذ صيغة “خاصيّة:قيمة”. تُربَط هذه الخاصيّات بملفّ أو مجلَّد وتُستخدَم لإضافة وظائف جديدة إلى نظام الملفّات؛ ترميز Encoding الملفّ، أو نوع <code>mime</code> الخاصّ به على سبيل المثال.
</p>

<h2 id="قوائم-التحكم-في-الوصول">
	قوائم التحكم في الوصول
</h2>

<p>
	صُمّمت قوائم التحكم في الوصول ACL لتمكين مدير النظام من التحكّم في وصول المستخدمين إلى الملفّات بطريقة أكثر تفصيلا مما تتيحه <a href="https://academy.hsoub.com/certificates/redhat/rhcsa/%D8%A5%D8%AF%D8%A7%D8%B1%D8%A9-%D8%A7%D9%84%D9%85%D9%84%D9%81%D8%A7%D8%AA-%D9%88%D8%A7%D9%84%D9%85%D8%AC%D9%84%D8%AF%D8%A7%D8%AA-%D8%B9%D9%84%D9%89-red-hat-enterprise-linux-r41/" rel="">الأذون التقليدية</a>. سنعرض في الفقرات أدناه كيف تُستعمَل قوائم التحكّم في الوصول عمليا.
</p>

<p>
	يوجد نوعان من قوائم التحكم في الوصول؛ قوائم التحكم في الوصول الخاصّة بالنفاذ Access ACLs التي يمكن تطبيقها سواءً على الملفّات أو المجلّدات، وتلك المبدئية Default ACLs التي لا تُطبَّق إلا على المجلّدات. إن لم تُعيَّن قوائم تحكّم في الوصول لملفّات موجودة في مجلّد فإنها تأخذ قوائم التحكّم في الوصول المبدئية المطبّقة على المجلّد الأب.
</p>

<p>
	يمكن لقوائم التحكم في الوصول أن تُعدّ بالنسبة لمستخدم، مجموعة مستخدمين أو لمستخدم لا ينتمي لمجموعة المستخدمين المالكة للملفّ.
</p>

<p>
	نستخدم الأمر <code>setfacl</code> مع الخيار <code>m-</code> لضبط قوائم التحكّم في الوصول؛ ومع الخيار <code>x-</code> لحذفها.
</p>

<p>
	ننشئ في ما يلي <a href="https://academy.hsoub.com/certificates/redhat/rhcsa/%D8%A5%D8%AF%D8%A7%D8%B1%D8%A9-%D8%A7%D9%84%D9%85%D8%B3%D8%AA%D8%AE%D8%AF%D9%85%D9%8A%D9%86-%D9%88%D8%A7%D9%84%D9%85%D8%AC%D9%85%D9%88%D8%B9%D8%A7%D8%AA-%D8%B9%D9%84%D9%89-red-hat-enterprise-linux-r42/" rel="">مجموعة مستخدمين</a> باسم <code>academy</code> ثم نضيف إليها المستخدمَيْن <code>ahmed</code> و <code>fatima</code>:
</p>

<pre class="ipsCode" id="ips_uid_3936_7">
# groupadd academy
# useradd ahmed
# useradd fatima
# passwd ahmed
New password:
Retype new password:
# passwd fatima
New password:
Retype new password:
# usermod -a -G academy ahmed
# usermod -a -G academy fatima</pre>

<p>
	ثم نتأكد من أن المستخدمَين ينتميان إلى المجموعة <code>academy</code>:
</p>

<pre class="ipsCode" id="ips_uid_3936_9">
# id ahmed
uid=1006(ahmed) gid=1009(ahmed) groups=1009(ahmed),1008(academy)
# id fatima
uid=1007(fatima) gid=1010(fatima) groups=1010(fatima),1008(academy)</pre>

<p>
	يظهر جيدا أن المستخدميْن ينتميان إلى المجموعة <code>academy</code> إضافة لانتمائهما لمجموعة بنفس اسم المستخدم (تُنشَأ مع إنشاء المستخدم مجموعة تحمل نفس الاسم).
</p>

<p>
	سننشئ الآن مجلدا باسم <code>playground</code> داخل المجلّد <code>mnt/</code>، وننشئ داخله ملفّا باسم <code>testfile.txt</code>؛ ثم نجعل <code>academy</code> هي المجموعة المالكة للملفّ ونحدّد الأذون عليه بـ<code>770</code> (أذون القراءة، الكتابة والتنفيذ لكل من المالك والمجموعة المالكة، ولا أذون لبقية المستخدمين):
</p>

<pre class="ipsCode" id="ips_uid_3936_11">
# mkdir /mnt/playground
# touch /mnt/playground/testfile.txt
# chown :academy /mnt/playground/testfile.txt
# chmod 770 /mnt/playground/testfile.txt</pre>

<p>
	ثم ننتقل إلى الحساب <code>ahmed</code> ثم نكتب عن طريقه الجملة التالية في الملفّ <code>mnt/playground/testfile.txt/</code>، ونعود إلى الحساب الجذر:
</p>

<pre class="ipsCode" id="ips_uid_3936_13">
# su ahmed
$ echo "My name is Ahmed" &gt; /mnt/playground/testfile.txt
$ exit</pre>

<p>
	نكرّر نفس الشيء مع الحساب <code>fatima</code> ولكن بكتابة جملة جديدة في آخر الملفّ:
</p>

<pre class="ipsCode" id="ips_uid_3936_15">
# su fatima
$ echo "My name is Fatima" &gt;&gt; /mnt/playground/testfile.txt
$ exit</pre>

<p>
	<strong>ملحوظة 1:</strong> استخدمنا <a href="https://academy.hsoub.com/certificates/redhat/rhcsa/%d8%a5%d8%af%d8%a7%d8%b1%d8%a9-%d8%a7%d9%84%d9%85%d9%84%d9%81%d8%a7%d8%aa-%d9%88%d8%a7%d9%84%d9%85%d8%ac%d9%84%d8%af%d8%a7%d8%aa-%d8%b9%d9%84%d9%89-red-hat-enterprise-linux-r41/#%D8%A5%D8%B9%D8%A7%D8%AF%D8%A9-%D8%AA%D9%88%D8%AC%D9%8A%D9%87-%D8%A7%D9%84%D9%85%D8%AF%D8%AE%D9%84%D8%A7%D8%AA-%D9%88%D8%A7%D9%84%D9%85%D8%AE%D8%B1%D8%AC%D8%A7%D8%AA" rel="">عامل التوجيه</a> <code>&lt;&lt;</code> مع المستخدم الثاني (<code>fatima</code>) حتى لا نحذف ما أضافه المستخدم الأول (<code>ahmed</code>).
</p>

<p>
	<strong>ملحوظة 2:</strong> يعود السبب في كون <code>ahmed</code> و <code>fatima</code> يستطيعان الكتابة في الملف <code>mnt/playground/testfile.txt/</code> إلى انتمائهما للمجموعة <code>academy</code> التي جعلناها مالكة الملف وأعطيناها كلّ الأذون عليه.
</p>

<p>
	سننشئ مستخدما ثالثا <code>samir</code>:
</p>

<pre class="ipsCode" id="ips_uid_3936_17">
# useradd samir
# passwd samir
New password:
Retype new password:</pre>

<p>
	يريد <code>samir</code> الكتابة في الملفّ <code>mnt/playground/testfile.txt/</code>؛ ستخفق العمليّة كما هو متوقع نظرا لعدم امتلاكه إذن الكتابة في الملفّ.
</p>

<p>
	لكن ماذا إن أردنا إتاحة إمكانيّة الكتابة على الملفّ <code>mnt/playground/testfile.txt/</code> للمستخدم <code>samir</code>، الذي لا ينتمي إلى المجموعة <code>academy</code>؟ الإجابة الآنية هي إضافته للمجموعة <code>academy</code>؛ لكن هذا سيمنحه إذن الكتابة على <strong>جميع الملفات</strong> التي تملكها المجموعة، وهو ما لا نرغب فيه.
</p>

<p>
	يمكننا استخدام قوائم التحكم في الوصول لهذا الغرض.
</p>

<p>
	يطلب الأمر <code>setfacl</code> عند استخدام الخيار <code>m-</code> التعديل على قوائم التحكم في الوصول الخاصّة بملفّ أو إضافتها، ويُستخدَم على النحو التالي: 
</p>

<pre class="ipsCode" id="ips_uid_3936_19">
setfacl -m &lt;rules&gt; &lt;files&gt;
</pre>

<p>
	حيث <code>&lt;files&gt;</code> ملفّ أو مجموعة ملفّات، و<code>&lt;rules&gt;</code> قواعد تأخذ إحدى الصيغ التاليّة:
</p>

<ul>
<li>
		<code>u:&lt;uid&gt;:&lt;perms&gt;</code>: تضبُط قوائم التحكم في الوصول الخاصّة بالنفاذ على الملفّ بالنسبة لمستخدم؛ حيث <code>uid</code> معرّف المستخدم أو اسمه و<code>perms</code> الأذون التي نريد إعطاءها له.
	</li>
	<li>
		<code>g:&lt;gid&gt;:&lt;perms&gt;</code>: تضبط قوائم التحكم في الوصول الخاصّة بالنفاذ على الملفّ بالنسبة لمجموعة مستخدمين؛ حيث <code>gid</code> معرّف المجموعة أو اسمها و<code>perms</code> الأذون التي نريد إعطاءها له.
	</li>
	<li>
		<code>m:&lt;perms&gt;</code>: تحدّد قناع الأذون الفعلية Effective rights mask؛ وهي طريقة لتقييد الأذون الممنوحة للمستخدمين أو المجموعات غير المستخدم المالك والمجموعة المالكة
	</li>
	<li>
		<code>o:&lt;perms&gt;</code>: تعيّن قوائم التحكم في الوصول الخاصّة بالنفاذ بالنسبة المستخدمين غير المنتمين للمجموعة المالكة للملفّ.
	</li>
</ul>
<p>
	نحصُل على ما نريد بتطبيق القاعدة الأولى على الملفّ <code>mnt/playground/testfile.txt/</code>:
</p>

<pre class="ipsCode" id="ips_uid_3936_21">
# setfacl -m u:samir:rwx /mnt/playground/testfile.txt 
</pre>

<p>
	يضيف الأمر أعلاه قائمة للتحكم في الوصول تعطي للمستخدم <code>samir</code> أذون الكتابة <code>w</code>، القراءة <code>r</code> والتنفيذ <code>x</code> على الملفّ <code>mnt/playground/testfile.txt/</code>.
</p>

<p>
	يمكن الآن للمستخدم <code>samir</code> الكتابة في الملف <code>mnt/playground/testfile.txt/</code>.
</p>

<p>
	استخدم الأمر <code>getfacl</code> لعرض قوائم التحكم في الوصول بالنسبة لملفّ أو مجلّد:
</p>

<pre class="ipsCode" id="ips_uid_3936_23">
# getfacl /mnt/playground/testfile.txt
getfacl: Removing leading '/' from absolute path names
# file: mnt/playground/testfile.txt
# owner: root
# group: academy
user::rwx
user:samir:rwx
group::rwx
mask::rwx
other::---</pre>

<p>
	بالنسبة لقوائم التحكم في الوصول المبدئية فيمكن ضبطها بإضافة حرف <code>d</code> قبل القاعدة على النحو التالي (حيث <code>directory</code> مسار المجلّد): 
</p>

<pre class="ipsCode" id="ips_uid_3936_25">
# setfacl -m d:o:r &lt;directory&gt;
</pre>

<p>
	ستسمح قائمة التحكم في الوصول المبدئية التي عرّفها الأمر السابق لجميع المستخدمين غير الأعضاء في المجموعة المالكة بالحصول على إذن قراءة المحتويات التي ستضاف للمجلّد مستقبلا. تطبّق هذه القائمة على كل عنصر يُضاف إلى المجلّد ما لم تحدَّد له قائمة تحكم خاصّة به.
</p>

<p>
	لاحظ الفرق في نتيجة تنفيذ الأمر <code>getfacl</code> قبل ضبط قوائم التحكم في الوصول المبدئية وبعدها:
</p>

<pre class="ipsCode" id="ips_uid_3936_27">
# getfacl /mnt/playground/
    getfacl: Removing leading '/' from absolute path names
    # file: mnt/playground/
    # owner: root
    # group: root
    user::rwx
    group::r-x
    other::r-x

# setfacl -m d:o:r /mnt/playground

# getfacl /mnt/playground/
getfacl: Removing leading '/' from absolute path names
    # file: mnt/playground/
    # owner: root
    # group: root
    user::rwx
    group::r-x
    other::r-x
    default:user::rwx
    default:group::r-x
    default:other::r--</pre>

<h2 id="تركيب-نظام-الملفات-الشبكي-nfs">
	تركيب نظام الملفات الشبكي NFS
</h2>

<p>
	يُستخدَم الأمر <code>showmount -e</code> لسرد مجلدات NFS المتاحة على الخادوم. يتوفّر الأمر ضمن حزمة <code>nfs-utils</code>، لذا يجب أولا تثبيت هذه الحزمة:
</p>

<pre class="ipsCode" id="ips_uid_3936_29">
# yum update &amp;&amp; yum install nfs-utils
</pre>

<p>
	ثم ننفّذ الأمر:
</p>

<pre class="ipsCode" id="ips_uid_3936_31">
# showmount -e 192.168.2.100
Export list for 192.168.2.100:
/share 192.168.2.200</pre>

<p>
	تشير نتيجة الأمر أعلاه إلى أن الخادوم على العنوان <code>192.168.2.100</code> يتشارك المجلّد <code>share/</code> مع العنوان <code>192.168.2.200</code> (عنوان الجهاز الذي نستخدمه).<br>
	يمكن استخدام أمر <code>mount</code> لتركيب مجلدات متشاركة عبر نظام NFS على نظام الملفّات المحلي كالتالي:
</p>

<pre class="ipsCode" id="ips_uid_3936_33">
# mount -t nfs -o [options] remote_host:/remote/directory /local/directory
</pre>

<p>
	حيث <code>options</code> خيارات التركيب (ليست ضرورية)، <code>remote_host</code> عنوان الخادوم الذي توجد عليه الملفّات المتشاركة، <code>remote/directory/</code> مسار الملفّ على الخادوم البعيد و<code>local/directory/</code> مسار التركيب على نظام الملفّات المحلي. يُكتَب الأمر في حالتنا (<code>share/</code> هو مسار المجلد على الخادوم، كما يظهر في نتيجة الأمر <code>showmount</code> السابق؛ و<code>mnt/nfs/</code> هو مجلد أنشأناه على نظام الملفات المحلي للتركيب عليه):
</p>

<pre class="ipsCode" id="ips_uid_3936_35">
# mkdir /mnt/nfs
# mount -t nfs 192.168.2.100:/share /mnt/nfs</pre>

<p>
	<strong>ملحوظة:</strong> إن حصلت على خطأ <code>Job for rpc-statd.service failed</code> فهذا يعني أن الخدمة <code>rpcbind</code> التي يستغلها النظام للتواصل مع نظام الملفات الشبكي غير مشغَّلة. نفذ - في هذه الحالة - الأمرين التاليين لتشغيلها وتفعيلها مع إقلاع النظام:
</p>

<pre class="ipsCode" id="ips_uid_3936_37">
# systemctl enable rpcbind.socket
# systemctl restart rpcbind.service</pre>

<p>
	ثم أعد تشغيل الجهاز وأعد تنفيذ أمر التركيب السابق.
</p>

<p>
	يتيح الأمر <code>mount</code> تركيب المجلدات للعمل عليها، لكن هذا التركيب لا يدوم لما بعد إعادة تشغيل النظام؛ إن أردنا جعل التركيب دائما فيجب أن نضيف سطرا جديدا إلى ملفّ <code>etc/fstab/</code> المعدّ لهذا الغرض؛ يأخذ السطر الهيئة التالية: 
</p>

<pre class="ipsCode" id="ips_uid_3936_39">
remote_host:/remote/directory /local/directory nfs options 0 0
</pre>

<p>
	تمكن ملاحظة أن المتغيرات المستخدمة هي نفسها المستخدمة مع أمر <code>mount</code>؛ المختلف هنا هو التموضع. يكون السطر - بعد تطبيق هذه الهيئة على حالتنا - على النحو التالي:
</p>

<pre class="ipsCode" id="ips_uid_3936_41">
192.168.2.100:/share /mnt/nfs nfs defaults 0 0
</pre>

<h2 id="تركيب-ملفات-samba">
	تركيب ملفات Samba
</h2>

<p>
	يكثُر استخدام خادوم Samba لتشارك الملفات في البيئات المختلطة (أنظمة تشغيل مختلفة، مثل وندوز ولينكس). تتيح أداة <code>smbclient</code> التي تأتي ضمن الحزمة <code>samba-client</code>، عرض الملفات المتوفّرة للتشارك عن طريق Samba:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3936_45">
<span class="pln"># smbclient -L 192.168.2.100 -U samba_user
Enter samba_user's password: 
Domain=[MYGROUP] OS=[Windows 6.1] Server=[Samba 4.2.10]

        Sharename        Type        Comment
        ---------        ----        -------
        samba_share      Disk        Directory for collaboration
        IPC$             IPC         IPC Service (Samba Server Version 4.2.10)
        samba_user       Disk        Home Directories

        Domain=[MYGROUP] OS=[Windows 6.1] Server=[Samba 4.2.10]

        Server                     Comment
        ---------                  -------

        Workgroup                  Master
        ---------                  -------</span></pre>

<p>
	سيُطلب منك إدخال كلمة سر المستخدم <code>samba_user</code>؛ الذي هو عضو في مستخدمي Samba على الخادوم. راجع مقال <a href="https://academy.hsoub.com/devops/servers/samba/%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF-%D8%AA%D8%B4%D8%A7%D8%B1%D9%83-%D8%A7%D9%84%D9%85%D9%84%D9%81%D8%A7%D8%AA-%D8%B9%D9%84%D9%89-redhat-enterprise-linux-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-samba-r264/" rel="">إعداد تشارك الملفات على RedHat Enterprise Linux باستخدام Samba</a> للمزيد من التفاصيل عن إعداد Samba لمشاركة الملفات.
</p>

<p>
	ستحتاج من أجل تركيب مجلدات متشاركة عبر خادوم Samba لتثبيت الحزمة <code>cifs-utils</code> على العميل (جهازك):
</p>

<pre class="ipsCode" id="ips_uid_3936_47">
# yum update &amp;&amp; yum install cifs-utils
</pre>

<p>
	ثم استخدم الأمر <code>mount</code> على النحو التالي:
</p>

<pre class="ipsCode" id="ips_uid_3936_49">
# mount -t cifs -o credentials=/path/to/credentials/file //remote_host/samba_share /local/directory
</pre>

<p>
	يحدّد الخيار <code>credentials</code> ملفّا لمعلومات استثياق مستخدم يحقّ له الوصول إلى المجلدات المتشاركة على الخادوم، <code>remote_host</code> هو عنوان الخادوم؛ <code>samba_share</code> اسم المجلد المتشارَك على الخادوم كما يظهر في نتيجة الأمر <code>smbclient</code> و<code>local/directory/</code> مسار مجلد التركيب المحلي.
</p>

<p>
	ننشئ قبل تنفيذ أمر التركيب مجلدا خاصا لهذا الغرض: 
</p>

<pre class="ipsCode" id="ips_uid_3936_51">
# mkdir /mnt/samba
</pre>

<p>
	ثم ننشئ ملفّ الاستيثاق <code>smbcredentials.</code>، وهو ملفّ مخفي، في المجلد الشخصي للمستخدم الجذر (<code>/root/</code>) مع تحديد الأذون بـ<code>600</code> حتى لا يمكن لغير المستخدم الجذر قراءة محتواه. نضع داخل ملفّ الاستيثاق البيانات على النحو التالي:
</p>

<pre class="ipsCode" id="ips_uid_3936_53">
username=samba_user
password=samba_user password</pre>

<p>
	تحدّد قيمة المعطى الأول اسمَ المستخدم، وقيمةُ المعطى الثاني كلمةَ السر. 
</p>

<pre class="ipsCode" id="ips_uid_3936_55">
# mount -t cifs -o credentials=/root/.smbcredentials //192.168.2.100/samba_share /mnt/samba
</pre>

<p>
	إن أردت جعل الملفّ متاحا تلقائيا فيمكنك إضافة سطر على النحو التالي إلى ملفّ <code>etc/fstab/</code>:
</p>

<pre class="ipsCode" id="ips_uid_3936_59">
//192.168.0.10/samba_share /mnt/samba  cifs credentials=/root/.smbcredentials,defaults 0 0
</pre>

<p>
	يمكن حذف ملفّ الاستيثاق (خيار <code>credentials</code>) إذا كان المجلد على الخادوم متاحا للعموم.
</p>

<p>
	يجب الانتباه إلى أنه يجب ليُركَّب المجلّد - في حالتيْ NFS وSamba - أن يكون الخادوم حيث توجد مجلدات التشارك متاحا عبر الشبكة.
</p>

<p>
	لا تكتف بقراءة الدرس؛ طبّق ما قرأته أكثر من مرة بطرق الخاصّة واستخدم <a href="https://academy.hsoub.com/questions/c6-devops/" rel="">قسم الأسئلة</a> إن واجهتك مشكلة (مع تحديدها).
</p>

<p>
	ترجمة -وبتصرّف- للمقال <a href="http://www.tecmint.com/rhcsa-exam-configure-acls-and-mount-nfs-samba-shares/2/" rel="external nofollow">RHCSA Series: Using ACLs (Access Control Lists) and Mounting Samba / NFS Shares – Part 7</a> لصاحبه Gabriel Cánepa.
</p>
]]></description><guid isPermaLink="false">742</guid><pubDate>Thu, 14 Jul 2016 09:07:09 +0000</pubDate></item><item><title>&#x627;&#x633;&#x62A;&#x62E;&#x62F;&#x627;&#x645; Parted &#x648; SSM &#x644;&#x644;&#x62A;&#x639;&#x627;&#x645;&#x644; &#x645;&#x639; &#x648;&#x633;&#x627;&#x626;&#x637; &#x627;&#x644;&#x62A;&#x62E;&#x632;&#x64A;&#x646; &#x639;&#x644;&#x649; Red Hat Enterprise Linux</title><link>https://academy.hsoub.com/devops/linux/redhat/%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-parted-%D9%88-ssm-%D9%84%D9%84%D8%AA%D8%B9%D8%A7%D9%85%D9%84-%D9%85%D8%B9-%D9%88%D8%B3%D8%A7%D8%A6%D8%B7-%D8%A7%D9%84%D8%AA%D8%AE%D8%B2%D9%8A%D9%86-%D8%B9%D9%84%D9%89-red-hat-enterprise-linux-r741/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2016_06/redhat-rhcsa-parted-ssm.png.c01a576f7757a18b34059ac0bfd01553.png" /></p>

<p>
	نتطرّق في هذا المقال من سلسلة الدروس عن شهادة RHCSA من RedHat لكيفيّة إعداد نظام التخزين وضبطه على RedHat Enterprise Linux 7 باستخدام الأداة Parted وهي الأداة المبدئيّة للتعامل مع وحدات التخزين في RHEL؛ سنقدّم أيضا مدير نظام التخزين System storage manager, SSM الذي يسهّل المهمّة كثيرا.
</p>

<p style="text-align: center;">
	<img class="ipsImage ipsImage_thumbnailed" data-fileid="18257" data-unique="615sw3eyh" src="https://academy.hsoub.com/uploads/monthly_2016_06/redhat-rhcsa-parted-ssm.png.c4fc1488ddd5edc8a011e10c8d2dd6e9.png" alt="redhat-rhcsa-parted-ssm.png"></p>

<h2 id="إنشاء-التجزئات-partitions-والتعديل-عليها-في-redhat-enterprise-linux">
	إنشاء التجزئات Partitions والتعديل عليها في RedHat Enterprise Linux
</h2>

<p>
	تُستَخدم الأداة <code>parted</code> مبدئيا للتعامل مع التجزئات في RHEL؛ ويمكن باستخدامها:
</p>

<ul>
<li>
		عرض جدول التجزئات الحاليّة،
	</li>
	<li>
		التعديل على التجزئات الحاليّة بزيادة حجمها أو نقصه،
	</li>
	<li>
		إنشاء تجزئات جديدة على المساحة الفارغة من القرص أو على أجهزة تخزين جديدة.
	</li>
</ul>
<p>
	<strong>ملحوظة:</strong> نستخدم آلة تخيّلية باستخدام VirtualBox كما هو مشروح في درس <a href="https://academy.hsoub.com/devops/linux/%D8%AA%D8%AB%D8%A8%D9%8A%D8%AA-red-hat-enterprise-linux-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-virtualbox-r249/" rel="">تثبيت Red Hat Enterprise Linux باستخدام VirtualBox</a>. أضفنا إليها قرصا تخيّليا جديدا لنختبر عليه أوامر <code>parted</code>. تمكن إضافة القرص التخيلي باختيّار إعدادات الآلة Settings، ثم تحديد التخزين Storage من نافذة الإعدادات ثم إنشاء قرص تخيليّ بالنقر عل أيقونة الإضافة التي تظهر بجانب خيّار Controller: SATA عند الحوم حوله بالمؤشر.
</p>

<p>
	يُستحسَن قبل البدء في إنشاء تجزئات جديدة أو التعديل على التجزئات الموجودة التأكّد من عدم استخدام أيّ من التجزئات على القرص. إن كانت لديك مساحة إبدال Swap على القرص فستحتاج لتعطيلها. الطريقة الأسهل لتهيئة هذه المتطلّبات هو إقلاع النظام على وضع الإنقاذ Rescue mode باستخدام وسيط التثبيت (قرص ضوئي أو مفتاح USB):
</p>

<ul>
<li>
		اذهب إلى قائمة الأجهزة الطرفيّة Devices في VirtualBox ثم اختر الأقراص الضوئيّة Optical devices وحدّد مسار ملفّ ISO الخاصّ بتثبيت النظام.
	</li>
	<li>
		بعد إعادة تشغيل النظام والإقلاع على وسيط التثبيت تظهر قائمة الاختيّار التاليّة؛ حدّد خيار Troubleshooting (استكشاف الأخطاء).
	</li>
</ul>
<p style="text-align: center;">
	<img alt="01_rescue_mode_rhel.png" class="ipsImage ipsImage_thumbnailed" data-fileid="16959" data-unique="fmkvwxxzm" src="https://academy.hsoub.com/uploads/monthly_2016_05/01_rescue_mode_rhel.png.57f25ffe61899b435365fece242e270e.png"></p>

<ul>
<li>
		تظهر قائمة Troubleshooting؛ اختر منها Rescue a Red Hat Enterprise Linux system (أصلح نظاما يستخدم RHEL)
	</li>
</ul>
<p style="text-align: center;">
	<img alt="02_rescue_mode_rhel.png" class="ipsImage ipsImage_thumbnailed" data-fileid="16960" data-unique="z55iudig0" src="https://academy.hsoub.com/uploads/monthly_2016_05/02_rescue_mode_rhel.png.893e40350e7acb228d495f2a56525996.png"></p>

<ul>
<li>
		انتظر قليلا حتى تظهر لك إمكانيّة تحديد الخيّار. توجد أربعة خيارات اختر منها Skip to shell (تجاوز إلى الصّدفة) بكتابة الرقم الظاهر أمامها (3).
	</li>
</ul>
<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="16961" href="https://academy.hsoub.com/uploads/monthly_2016_05/03_rescue_mode_rhel.png.f6eef2e01a1e6148c698a6eda4fbeafe.png" rel="external"><img alt="03_rescue_mode_rhel.png" class="ipsImage ipsImage_thumbnailed" data-fileid="16961" data-unique="jz8ckagav" src="https://academy.hsoub.com/uploads/monthly_2016_05/03_rescue_mode_rhel.thumb.png.8eed2d151d66cf2c81d65cbf2899c836.png"></a>
</p>

<p>
	تحصُل باتّباع الخطوات السابقة على صدفة يمكنك تنفيذ أوامر Parted منها.
</p>

<h3 id="إنشاء-تجزئة-جديدة">
	إنشاء تجزئة جديدة
</h3>

<p>
	نستخدم الأمر <code>parted</code> على النحو التالي لإنشاء تجزئة جديدة على القرص <code>sdb</code> (أي القرص الثاني، يُشار للقرص الأوّل بـ <code>sda</code>):
</p>

<pre class="ipsCode" id="ips_uid_7633_8">
# parted /dev/sdb</pre>

<p>
	<strong>ملحوظة 1: </strong> يحتوي المجلّد <code>dev/</code> على ملفّات خاصّة للتعامل مع العتاد؛ يستخدم النظام الملفّ <code>dev/sda/</code> للتعامل مع القرص الأوّل في الجهاز، <code>dev/sdb/</code> مع الثاني، <code>dev/sdc/</code> مع الثالث، وهكذا. يُشار إلى التجزئات الموجودة على قرص بأرقام: <code>dev/sda1/</code> التجزئة الأولى من القرص الأول، <code>dev/sda2/</code> التجزئة الثانية من القرص الأول، <code>dev/sdb1/</code> التجزئة الأولى من القرص الثاني، وهكذا.
</p>

<p>
	<strong>ملحوظة 2:</strong> يحوي القرص الأول <code>dev/sda/</code> ملفّات نظام التشغيل المثبّت على الجهاز. تطبيق أوامر بطريقة خاطئة على هذا القرص قد يجعل النظام غير قابل للاستخدام.
</p>

<p>
	سيظهر محثّ جديد لإدخال الأوامر الخاصّة بالأداة <code>parted</code>:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="16962" href="https://academy.hsoub.com/uploads/monthly_2016_05/04_parted_create.png.cd277a935ccdabcb390e1ee521de0e96.png" rel="external"><img alt="04_parted_create.png" class="ipsImage ipsImage_thumbnailed" data-fileid="16962" data-unique="pkkk50kpc" src="https://academy.hsoub.com/uploads/monthly_2016_05/04_parted_create.thumb.png.21ca6d659868c52f1daa35aeccd9ecc3.png"></a>
</p>

<p>
	نفّذ الأمر <code>print</code> في سطر أوامر <code>parted</code> للحصول على قائمة بالتجزئات الحاليّة على القرص:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="16963" href="https://academy.hsoub.com/uploads/monthly_2016_05/05_parted_print.png.478857b2badf928ccefa1114b60e51a6.png" rel="external"><img alt="05_parted_print.png" class="ipsImage ipsImage_thumbnailed" data-fileid="16963" data-unique="7ju4ejovd" src="https://academy.hsoub.com/uploads/monthly_2016_05/05_parted_print.thumb.png.ae12bf9508b5e23e1fe69012ca2a4b06.png"></a>
</p>

<p>
	لا توجد حتى الآن أية تجزئة على القرص الذي تبلغ مساحته 8,5GB. سننشئ على هذا القرص تجزئة أوّليّة بمساحة تبلغ 7GB. نهيّئ Format التجزئة بنظام الملفّات <code>xfs</code> الذي يُستخدَم مبدئيا على RHEL؛ إلا أن بإمكانك الاختيار من بين نظم ملفّات أخرى كثيرة. سنبدأ بإنشاء التجزئة باستخدام الأمر <code>mkpart</code> ثم نهيّئها باستخدام الأمر <code>mkfs.fstype</code>؛ إذ أن دعم الأمر <code>mkpart</code> لأنظمة الملفات الحديثة ليس جيّدا.
</p>

<p>
	نضبُط في ما يلي لصيقة Label للقرص ثم ننشئ تجزئة أوليّة على القرص <code>dev/sdb/</code> تبدأ من أول القرص (<code>%0</code>) وتنتهي عند 7GB (أي 7000MB)؛ ثم نستخدم الأمر <code>print</code> في الأداة Parted لعرض جدول تجزئات القرص. أثناء عمليّة الإنشاء يُطلّب منّا نوعيّة نظام الملفّات الذي نريد، نترك الخيار المبدئي.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="16964" href="https://academy.hsoub.com/uploads/monthly_2016_05/06_parted_mkpart.png.80993f16297aee55d49d1084ffb63041.png" rel="external"><img alt="06_parted_mkpart.png" class="ipsImage ipsImage_thumbnailed" data-fileid="16964" data-unique="ua3oqz32r" src="https://academy.hsoub.com/uploads/monthly_2016_05/06_parted_mkpart.thumb.png.03364e598b5727deaf5af5f42c931643.png"></a>
</p>

<p>
	<strong>ملحوظة:</strong> لصيقة القرص Disk lable (تُسمّى أيضا جدول التجزئة Partition table أو خريطة التجزئة Partition map) هو سجّل يستخدمه النظام للحصول على معلومات عن التجزئة. يدعم الأمر <code>mklable</code> صيغ تجزئة محدّدة من بينها <code>bsd</code>، <code>gpt</code>، <code>msdos</code> و<code>mac</code>.
</p>

<p>
	نستخدم الآن الأمر <code>mkfs.xfs</code> لتهيئة التجزئة التي أنشأناها. نخرج من سطر الأوامر الخاص بالأداة Parted بتنفيذ الأمر <code>quit</code> ثم ننفّذ الأمر على النحو التالي:
</p>

<pre class="ipsCode" id="ips_uid_6690_8">
# mkfs.xfs /dev/sdb1
# parted /dev/sdb print</pre>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="16965" href="https://academy.hsoub.com/uploads/monthly_2016_05/07_mkfs_xfs.png.3afbfc6d2061c591967c9cd9cb41b170.png" rel="external"><img alt="07_mkfs_xfs.png" class="ipsImage ipsImage_thumbnailed" data-fileid="16965" data-unique="m1etjw7jk" src="https://academy.hsoub.com/uploads/monthly_2016_05/07_mkfs_xfs.thumb.png.eea09cdc67b8b758e37cb9577771af2b.png"></a><img alt="imageproxy.php?img=&amp;key=e4ac65570db3469d" class="ipsImage ipsImage_thumbnailed" data-fileid="o_1ajssuik513dl1bod12u41gmkgj712" data-unique="ga9vlp79a" src="" style="opacity: 1; display: none;"></p>

<p>
	لاحظ إرفاق التجزئة أثناء إنشائها ببيانات وصفيّة Meta data خاصّة بنظام الملفّات xfs.
</p>

<h3 id="تغيير-مساحة-تجزئة">
	تغيير مساحة تجزئة
</h3>

<p>
	تتيح الأداة Parted أمر <code>resize</code> لتغيير مساحة التجزئة، إلا أن هذا الأمر لا ينطبق سوى على نظم الملفّات القديمة مثل <code>ext2</code>، <code>fat32</code> و<code>fat16</code>؛ أي أن الطريقة الوحيدة لتغيير مساحة التجزئة هي بحذفها ثم إنشائها من جديد وهو ما يعني حذف محتويات التجزئة وضياعها. تستخدم توزيعة RHEL نمط تجزئة LVM لتلافي هذه الصعوبة في إدارة التجزئات (سنرى كيف يعمل بعد قليل).
</p>

<p>
	نعرض في ما يلي لائحة بالتجزئات على القرص <code>sdb</code> ثم نحذف التجزئة الأولى:
</p>

<pre class="ipsCode" id="ips_uid_6690_10">
# parted /dev/sdb print
# parted /dev/sdb rm 1</pre>

<p>
	من المستحسَن ألا تستخدم هذا الأمر على نظام إنتاج حقيقي.
</p>

<h2 id="مدير-التجزئات-المنطقية-logical-volume-manager">
	مدير التجزئات المنطقية Logical volume manager
</h2>

<p>
	رأينا أنّ تعديل مساحة التجزئات الموجودة على القرص بعد إنشائها بالطريقة التقليديّة المشروحة أعلاه صعب وربما يؤدي لفقدان بيانات؛ لهذا يجب النّظر إلى إمكانيّة الاستعانة بمدير التجزئات المنطقيّة LVM. يعمل مدير التجزئات على تجميع وسائط تخزين عدّة لتبدو كأنها وسيط تخزين واحد ثم إنشاء تجزئات انطلاقا من هذه الوحدة المجمَّعة. تكمُن الميزة التي تقدّمها هذه الطريقة في سهولة تمديد أو تقليص التجزئات المنطقيّة دون مصاعب تُذكر.
</p>

<p>
	يبيّن المخطَّط التالي البنية الأساسيّة لمدير التجزئات المنطقيّة.
</p>

<p style="text-align: center;">
	<img alt="08_lvm.png" class="ipsImage ipsImage_thumbnailed" data-fileid="16969" data-unique="z1uxn0q8o" src="https://academy.hsoub.com/uploads/monthly_2016_05/08_lvm.png.5d139671bb0d832b34a2f57a07942a0f.png"></p>

<p>
	سنشرح في ما يلي أساسيّات استخدام مدير التجزئات المنطقيّة LVM. نهيّئ لهذا الغرض قرصين ملموسين تخيّليّيْن جديديْن بنفس طريقة إنشاء القرص التخيّلي في الفقرات السابقة. سنستخدم القرصيْن لإنشاء مجموعة تجزئة Volume group ننشئ عليها التجزئات المنطقيّة.
</p>

<h3 id="إنشاء-التجزئات-الملموسة-physical-volumes">
	إنشاء التجزئات الملموسة Physical Volumes
</h3>

<p>
	نبدأ بإنشاء تجزئتيْن جديدتين ملموستيْن تأخذ كلّ واحدة منهما كامل القرص الذي توجد عليه. بالنسبة للقرص التخيلي الثالث (الأول هو قرص النظام، الثاني هو القرص الذي استخدمناه في الجزء الأول من المقال):
</p>

<pre class="ipsCode" id="ips_uid_6690_12">
# parted /dev/sdc
(parted) mklable msdos
(parted) mkpart 
Partition type? primary/secondary? p
File system type? [ext2]?
Start? 0%
End? 100%
(parted) print
Model: ATA VBOX HARDDISK (scsi)
Disk /dev/sdb: 8590MB
sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk flags:
Number  Start       End         Size            Type    File system Flags
1         1049kb    8590MB  8589MB      primary
quit</pre>

<p>
	نعيد نفس الشيء بالنسبة للرابع:
</p>

<pre class="ipsCode" id="ips_uid_6690_14">
# parted /dev/sdd</pre>

<p>
	ننفذ بالعودة إلى سطر الأوامر بعد تهيئة التجزئتين الأمرين التاليّين:
</p>

<pre class="ipsCode" id="ips_uid_6690_16">
# pvcreate /dev/sdc1
# pvcreate /dev/sdd1</pre>

<p>
	تظهر في كلّ مرة رسالة بأن إنشاء التجزئة الملموسة تم بطريقة صحيحة. الأمر <code>pvcreate</code> جزء من مدير التجزئات المنطقيّة ومهمّته إنشاء التجزئات الملموسة التي سنجمّعها كما سنرى من أجل إنشاء تجزئات منطقية في ما بعد. إن أردت إظهار معلومات عن التجزئات الملموسة التي أنشأناها بالأمر <code>pvcreate</code> فيمكنك استخدام الأمر <code>pvdisplay</code>:
</p>

<pre class="ipsCode" id="ips_uid_6690_18">
# pvdisplay /dev/sdc1
# pvdisplay /dev/sdd1</pre>

<p>
	يُظهر الأمر اسمَ التجزئة والمجموعة التي تنتمي إليها مع بيانات أخرى. لا توجد لحدّ الساعة مجموعة تجزئات؛ لذا سننشئ واحدة.
</p>

<h3 id="إنشاء-مجموعة-تجزئات-volume-group">
	إنشاء مجموعة تجزئات Volume group
</h3>

<p>
	يُستخدم الأمر <code>vgcreate</code> لإنشاء مجموعة تجزئات. ننشئ في الأمر التالي مجموعة تجزئات باسم <code>hsoub_vg</code> تتكون من تجزئتين ملمومستين هما <code>dev/sdc/1</code> و <code>dev/sdd1/</code>:
</p>

<pre class="ipsCode" id="ips_uid_6690_20">
# vgcreate hsoub_vg /dev/sd{c,d}1</pre>

<p>
	تظهر رسالة تفيد بإنشاء مجموعة التجزئات.
</p>

<p>
	ستلاحظ الآن عند تنفيذ الأمر <code>pvdisplay /dev/sdv1</code> اسم المجموعة ضمن معلومات التجزئة. إن أردت رؤية معلومات عن مجموعة التجزئات فيمكنك تنفيذ الأمر <code>vgdisplay</code>: 
</p>

<pre class="ipsCode" id="ips_uid_6690_22">
#  vgdisplay hsoub_vg
</pre>

<h3 id="إنشاء-تجزئات-منطقية">
	إنشاء تجزئات منطقية
</h3>

<p>
	جهّزنا مجموعة التجزئات؛ يمكننا الآن استخدامها لإنشاء تجزئات منطقية باستخدام الأمر <code>lvcreate</code>. يمكن أن نحدّد مساحة التجزئة إما بالوحدة (<code>GB</code> مثلا) أو بمداها (100 بالمئة)، المعطى الأخير للأمر هو اسم مجموعة التجزئات التي نريد تطبيق الأمر عليها:
</p>

<pre class="ipsCode" id="ips_uid_6690_24">
# lvcreate -L 3G -n vol01_docs hsoub_vg
# lvcreate -L 1G -n vol02_logs hsoub_vg
# lvcreate -l 100%FREE -n vol03_homes hsoub_vg</pre>

<p>
	يحدّد الخيار <code>L-</code> مساحة التجزئة بالوحدة، <code>l-</code> النسبة من المجموعة و <code>n-</code>اسم التجزئة المنطقيّة. في الأمرين الأول والثاني أعلاه أنشأنا تجزئتين منطقيتين مساحتاهما على التوالي <code>3G</code> و<code>1G</code>. في الأمر الثالث طلبنا أن تأخذ التجزئة كامل المساحة <strong>المتبقيّة على مجموعة التجزئة</strong> .
</p>

<p>
	يمكن باستخدام الأمر <code>lvdisplay</code> إظهار التجزئات المنطقية الموجودة على مجموعة تجزئات كالتالي: 
</p>

<pre class="ipsCode" id="ips_uid_6690_26">
# lvdisplay hsoub_vg
</pre>

<h3 id="تهيئة-التجزئات-المنطقية-وتركيبها">
	تهيئة التجزئات المنطقية وتركيبها
</h3>

<p>
	يمكنك بعد إنشاء التجزئات المنطقيّة تهيئتها بنظام الملفات الذي تريد؛ نستخدم في المثال التالي نظام الملفّات <code>ext4</code> (من المهمّ اختيار نظام الملفات المناسب؛ <code>xfs</code> مثلا لا يدعم تغيير مساحة التجزئة):
</p>

<pre class="ipsCode" id="ips_uid_6690_28">
# mkfs.ext4 /dev/hsoub_vg/vol01_docs
# mkfs.ext4 /dev/hsoub_vg/vol02_logs
# mkfs.ext4 /dev/hsoub_vg/vol03_homes</pre>

<p>
	لاحظ مسار التجزئات المنطقيّة. توجد مجموعة التجزئات على المسار <code>dev/hsoub_vg/</code> حيث <code>hsoub_vg</code> هو مجموعة التجزئة، وبداخل المجلّد توجد التجزئات المنطقيّة التي أنشأناها سابقا.
</p>

<p>
	يأتي بعد التهيئة تركيبُ التجزئات حتى يمكن استخدامها:
</p>

<pre class="ipsCode" id="ips_uid_6690_30">
# mkdir /mnt/docs /mnt/logs /mnt/homes
# mount /dev/hsoub_vg/vol01_docs /mnt/docs
# mount /dev/hsoub_vg/vol02_logs /mnt/logs
# mount /dev/hsoub_vg/vol03_homes /mnt/homes</pre>

<p>
	<strong>ملحوظة: </strong> يعني التركيب Mounting إتاحة إمكانية الوصول لنظام الملفات انطلاقا من نقطة معينة في شجرة ملفات لينكس. بدون هذه الخطوة لا يمكن استعمال التجزئة.
</p>

<p>
	يمكن الآن تخزين الملفّات في المجلّد <code>mnt/docs/</code> وسيضعها النظام على التجزئة المنطقيّة <code>vol01_docs</code>. ينطبق نفس المبدأ على بقيّة التجزئات والمسارات.
</p>

<h3 id="حذف-التجزئات-المنطقية-مجموعة-التجزئات-والتجزئات-الملموسة">
	حذف التجزئات المنطقية، مجموعة التجزئات والتجزئات الملموسة
</h3>

<p>
	نستخدم الأوامر <code>vgremove</code>، <code>lvremove</code> و<code>pvremove</code> لحذف تجزئة منطقية، مجموعة تجزئات وتجزئات ملموسة على التوالي. سنحتاج أولا لفصلها (نزع تركيبها) بالأمر <code>umount</code>:
</p>

<pre class="ipsCode" id="ips_uid_6690_32">
# umount /mnt/docs /mnt/logs /mnt/homes
# lvremove /dev/hsoub_vg/vol01_docs /dev/hsoub_vg/vol02_logs /dev/hsoub_vg/vol03_homes</pre>

<p>
	ستظهر رسالة تطلُب منك تأكيد رغبتك في حذف التجزئات؛ اضغط زر <code>y</code> للتأكيد. ثم نحذف مجموعة التجزئات ومن بعدها التجزئات الملموسة:
</p>

<pre class="ipsCode" id="ips_uid_6690_34">
# vgremove /dev/hsoub_vg
# pvremove /dev/sd{b,c}1</pre>

<p>
	سنخرج الآن من وضع الإنقاذ بعد أن رأينا آلية عمل التجزئات المنطقية. استخدم الأمر <code>exit</code> للخروج من وضع الإنقاذ ثم انزع القرص الضوئي التخيلي حتى يستطيع النظام الإقلاع من القرص التخيليّ (يمكن أيضا إطفاء الآلة التخيليّة مباشرة من VirtualBox ونزع القرص الضوئي ثم تشغيلها من جديد).
</p>

<h2 id="استخدام-مدير-وسائط-التخزين-ssm-لإنشاء-التجزئات-المنطقية-وإدارتها">
	استخدام مدير وسائط التخزين SSM لإنشاء التجزئات المنطقية وإدارتها
</h2>

<p>
	مدير وسائط التخزين SSM (اختصار لـ System storage manager) هو أداة تعمل واجهةً بين لإدارة وسائط التخزين بطريقة أسهل. رأينا في الفقرات السابقة أنّه يلزم تنفيذ خمسة أوامر لإنشاء تجزئة منطقيّة والبدء في استخدامها (<code>mkfs </code>، <code>lvcreate </code>، <code>vgcreate </code>،<code>pvcreate</code> و <code>mount</code>). يمكن باستخدام <code>ssm</code> اختصار هذه الخطوات في خطوة واحدة.
</p>

<p>
	نبدأ بتحديث حزم النظام وتثبيت مدير وسائط التخزين:
</p>

<pre class="ipsCode" id="ips_uid_6690_36">
$ su -
Password:
# yum update &amp;&amp; yum install system-storage-manager</pre>

<p>
	ثم نستخدم الأمر <code>ssm</code> لإنشاء تجزئات بنفس الخاصيّات السابقة:
</p>

<pre class="ipsCode" id="ips_uid_6690_38">
# ssm create -s 3G -n vol01_docs -p hsoub_vg --fstype ext4 /mnt/docs /dev/sd{c,d}1
# ssm create -s 1G -n vol02_logs -p hsoub_vg --fstype ext4 /mnt/logs
# ssm create -n vol03_homes -p hsoub_vg --fstype ext4 /mnt/homes</pre>

<p>
	<strong>ملحوظة:</strong> تأكد من وجود المجلدات على المسارات <code>mnt/logs </code>، <code>/mnt/docs/</code> و <code>mnt/homes/</code> حتى يمكن تركيب التجزئات عليها.
</p>

<p>
	يمكن من الأوامر استنتاجُ عمل الخيارات:
</p>

<ul>
<li>
		المساحة: <code>s-</code>.
	</li>
	<li>
		اسم التجزئة المنطقية: <code>n-</code>.
	</li>
	<li>
		مجموعة التجزئات: <code>p-</code>.
	</li>
	<li>
		نقطة التركيب: المسارات <code>mnt/logs</code>، <code>/mnt/docs/</code> و<code>mnt/homes/</code>.
	</li>
	<li>
		التجزئات الملموسة: <code>dev/sd{c,d}1/</code>.
	</li>
</ul>
<p>
	لم نحدّد في الأمر الأخير مساحة التجزئة؛ في هذه الحالة تأخذ التجزئة كامل المساحة <strong>المتبقيّة</strong> على مجموعة التجزئات. حدّدنا في الأمر الأول التجزئات الملموسة التي ستتكوّن منها مجموعة التجزئات؛ بينما لم نفعل ذلك في الأمريْن الآخريْن إذ لم نعد نحتاجه بعد إنجاز المهمة في الأمر الأول.
</p>

<p>
	نفَّذ <code>ssm</code> في الأوامر أعلاه المهامّ التالية:
</p>

<ul>
<li>
		إعداد التجزئات الملموسة.
	</li>
	<li>
		إنشاء مجموعة تجزئات.
	</li>
	<li>
		إنشاء تجزئات منطقيّة.
	</li>
	<li>
		تهيئة التجزئات المنطقيّة.
	</li>
	<li>
		تركيب التجزئات المنطقيّة.
	</li>
</ul>
<p>
	يمكننا الآن عرض معلومات عن التجزئات الملموسة، مجموعات التجزئات والتجزئات المنطقيّة على التوالي بالأوامر:
</p>

<pre class="ipsCode" id="ips_uid_6690_40">
# ssm list dev
# ssm list pool
# ssm list vol</pre>

<p>
	من أهم الميزات التي توفّرها التجزئات المنطقيّة إمكانيّة التعديل على مساحتها (تصغيرها أو تكبيرها) مباشرة. نفرض مثلا أن التجزئة <code>vol02_logs</code> توشك على الامتلاء بينما توجد مساحة فارغة كبيرة على التجزئة <code>vol03_homes</code>. لحد الساعة لا توجد مساحة فارغة على مجموعة التجزئات <code>hsoub_vg</code> لأننا استهلكناها كلَّها بإنشاء تجزئات منطقية عليها؛ يمكن التأكد من ذلك بتنفيذ الأمر <code>ssm list pool</code>:
</p>

<p style="text-align: center;">
	<img alt="09_ssm_list_pool.png" class="ipsImage ipsImage_thumbnailed" data-fileid="16966" data-unique="7z5muscp4" src="https://academy.hsoub.com/uploads/monthly_2016_05/09_ssm_list_pool.png.e0867b4229430271a5f5097e4c19d9b0.png"></p>

<p>
	ما سنفعله هو تقليص مساحة التجزئة <code>vol03_homes</code> ثم منح المساحة المقتطعة منها للتجزئة الممتلئة <code>vol02_logs</code> .
</p>

<p>
	يعدّل الأمر التالي على التجزئات المنطقيّة بحيث تصبح مساحة <code>vol03_homes</code> تساوي <code>4GB</code> بدلا من <code>11GB</code>:
</p>

<pre class="ipsCode" id="ips_uid_6690_42">
# ssm resize -s 4G /dev/hsoub_vg/vol03_homes
</pre>

<p>
	إن أعدنا تنفيذ الأمر <code>ssm list pool</code> الآن فسنرى وجود مساحة غير مستقلة على المجموعة <code>hsoub_vg</code>. يمكننا الآن زيادة مساحة التجزئة <code>vol02_logs</code>:
</p>

<pre class="ipsCode" id="ips_uid_6690_44">
# ssm resize -s+2G /dev/hsoub_vg/vol02_logs
</pre>

<p>
	يطلُب الأمر زيادة مساحة التجزئة <code>vol02_logs</code> بـ<code>2GB</code>.
</p>

<p>
	يمكن باستخدام الأمر <code>ssm remove</code> حذفُ تجزئة منطقيّة على النحو التالي: 
</p>

<pre class="ipsCode" id="ips_uid_6690_46">
# ssm remove /dev/hsoub_vg/vol01_docs
</pre>

<p>
	ستظهر رسالة تطلب منك التأكيد على خيّار الحذف. لحذف مجموعة تجزئات نحذف التجزئات المنطقيّة أولا ثم ننفّ الأمر:
</p>

<pre class="ipsCode" id="ips_uid_6690_48">
# ssm remove hsoub_vg
</pre>

<h2 id="إدارة-التجزئات-المعماة-بواسطة-ssm">
	إدارة التجزئات المعماة بواسطة SSM
</h2>

<p>
	يتوفّر مدير وسائط التخزين SSM على إمكانيّة تعميّة تجزئات موجودة أو إنشاء تجزئات وتعميّتها. سنحتاج لهذا الغرض لتثبيت حزمة <code>cryptsetup</code> إن لم تكن مثبّتة قبلا، على النحو التالي:
</p>

<pre class="ipsCode" id="ips_uid_6690_50">
# yum update &amp;&amp; yum install cryptsetup
</pre>

<p>
	ثم ننفذ الأوامر التالية لإنشاء تجزئات معمّاة، سيُطلب منك إدخال عبارة سرّ Passphrase وتأكيدها.
</p>

<pre class="ipsCode" id="ips_uid_6690_52">
# ssm create -s 3G -n vol01_docs -p hsoub_vg --fstype ext4 --encrypt luks /mnt/docs /dev/sd{c,d}1
# ssm create -s 1G -n vol02_logs -p hsoub_vg --fstype ext4 --encrypt luks /mnt/logs
# ssm create -n vol03_homes -p hsoub_vg --fstype ext4 --encrypt luks /mnt/homes</pre>

<p>
	لا تختلف الأوامر عن الأوامر السابقة لإنشاء التجزئات سوى في إضافة الخيار <code>encrypt--</code> الذي يحدّد نوعيّة التعميّة (<code>luks</code> في حالتنا، وهي طريقة تعميّة ينتشر استخدامها على أنظمة لينكس).
</p>

<p>
	يجب أن نضيف التجزئات إلى ملف <code>etc/fstab/</code> حتى تكون متاحة بعد إقلاع النظام. سنستخدم معرّفات التجزئات <code>UUID</code> التي يمكننا الحصول عليها بتنفيذ الأمر <code>blkid</code>:
</p>

<pre class="ipsCode" id="ips_uid_6690_54">
# blkid -o value UUID /dev/hsoub_vg/vol01_docs
# blkid -o value UUID /dev/hsoub_vg/vol02_logs
# blkid -o value UUID /dev/hsoub_vg/vol03_homes</pre>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="16967" href="https://academy.hsoub.com/uploads/monthly_2016_05/10_blkid.png.8724a200fbd3020d302e54f9ce5838a2.png" rel="external"><img alt="10_blkid.png" class="ipsImage ipsImage_thumbnailed" data-fileid="16967" data-unique="hpspxiqc8" src="https://academy.hsoub.com/uploads/monthly_2016_05/10_blkid.thumb.png.806f4570f37ec1b65750e62470e05316.png"></a>
</p>

<p>
	ثم نضع المحتوى التالي في الملفّ <code>etc/crypttab/</code> (استخدم المعرفات التي حصلت عليها في الخطوة السابقة):
</p>

<pre class="ipsCode" id="ips_uid_6690_56">
docs UUID=ba77d113-f849-4ddf-8048-13860399fca8 none
logs UUID=58f89c5a-f694-4443-83d6-2e83878e30e4 none
homes UUID=92245af6-3f38-4e07-8dd8-787f4690d7ac none</pre>

<p>
	ثم نضيف ما يلي إلى ملفّ <code>etc/fstab/</code> (أسفل المحتوى الموجود في الملفّ):
</p>

<pre class="ipsCode" id="ips_uid_6690_58">
# Logical volume vol01_docs:
/dev/mapper/docs        /mnt/docs       ext4    defaults        0       2
# Logical volume vol02_logs
/dev/mapper/logs        /mnt/logs       ext4    defaults        0       2
# Logical volume vol03_homes
/dev/mapper/homes       /mnt/homes      ext4    defaults        0       2</pre>

<p>
	لاحظ أن الاسم الظاهر بعد <code>dev/mapper/</code> هو نفس المعرّف المحدَّد في الملفّ <code>etc/crypttab/</code>.
</p>

<p>
	نفّذ الأمر <code>systemctl reboot</code> لإعادة التشغيل وستجد أنّ النظام يطلُب عبارة السرّ من أجل تركيب التجزئات.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="16968" href="https://academy.hsoub.com/uploads/monthly_2016_05/11_blkid.png.23ebba8b7f5e73d67fd8cc8c30eb455f.png" rel="external"><img alt="11_blkid.png" class="ipsImage ipsImage_thumbnailed" data-fileid="16968" data-unique="orsm2ht1g" src="https://academy.hsoub.com/uploads/monthly_2016_05/11_blkid.thumb.png.b1a362a7532ee4cc54cea04aca0359cc.png"></a>
</p>

<p>
	<strong>ملحوظة:</strong> تأكّد من كتابة التعليمات في الملفّات <code>etc/crypttab</code> و <code>etc/fstab/</code> بطريقة صحيحة؛ وإلا فيمكن ألّا يقلع النظام. إن حدث خطأ ستُطلَب منك كلمة سر الحساب الجذر؛ ويمكنك بعدها تصحيح محتوى الملفّ ثم إعادة تشغيل النظام بالأمر السابق.
</p>

<p>
	يمكنك التأكد من أنّ التجزئات رُكِّبت في النقاط التي حدّدناها سلفا بتنفيذ الأمر <code>mount</code> لإظهار نقاط التركيب ثم استخدام <code>grep</code> لاختيار تلك التي توجد بها <code>mnt</code> حيث ركّبنا التجزئات:
</p>

<pre class="ipsCode" id="ips_uid_6690_60">
# mount | grep "mnt"
/dev/mapper/logs on /mnt/logs type ext4 (rw,realtime,seclabel,data=ordered)
/dev/mapper/docs on /mnt/docs type ext4 (rw,realtime,seclabel,data=ordered)
/dev/mapper/homes on /mnt/homes type ext4 (rw,realtime,seclabel,data=ordered)</pre>

<h2 id="خاتمة">
	خاتمة
</h2>

<p>
	رأينا في هذا الدرس مبادئ إعداد نظام التخزين بالطريقة التقليدية وباستخدام أدوات إدارة التجزئات الحديثة مثل <code>lvm</code> و <code>ssm</code>. من المهم الانتباه إلى التعامل مع التجزئات يؤثّر مباشرة على عمل النظام ويمكن لخطأ في تنفيذ أمر مّا أن يجعل النظام غير قابل للاستخدام؛ لذا تدرّب أولا على نظام غير أساسي (أو تخيلي، وهي الطريقة الأسهل) إلى أن تتأكد من فهمك لآلية عمل مختلف الأدوات قبل أن تنتقل إلى بيئة إنتاج.
</p>

<p>
	ترجمة -وبتصرّف- للمقال <a href="http://www.tecmint.com/rhcsa-exam-create-format-resize-delete-and-encrypt-partitions-in-linux" rel="external nofollow">RHCSA Series: Using ‘Parted’ and ‘SSM’ to Configure and Encrypt System Storage – Part 6</a> لصاحبه Gabriel Cánepa.
</p>
]]></description><guid isPermaLink="false">741</guid><pubDate>Thu, 30 Jun 2016 20:45:00 +0000</pubDate></item><item><title>&#x623;&#x633;&#x627;&#x633;&#x64A;&#x651;&#x627;&#x62A; &#x627;&#x644;&#x62D;&#x648;&#x633;&#x628;&#x629; &#x627;&#x644;&#x627;&#x641;&#x62A;&#x631;&#x627;&#x636;&#x64A;&#x651;&#x629; Virtualization &#x628;&#x627;&#x633;&#x62A;&#x62E;&#x62F;&#x627;&#x645; KVM &#x639;&#x644;&#x649; Red Hat Enterprise Linux</title><link>https://academy.hsoub.com/devops/linux/redhat/%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D9%91%D8%A7%D8%AA-%D8%A7%D9%84%D8%AD%D9%88%D8%B3%D8%A8%D8%A9-%D8%A7%D9%84%D8%A7%D9%81%D8%AA%D8%B1%D8%A7%D8%B6%D9%8A%D9%91%D8%A9-virtualization-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-kvm-%D8%B9%D9%84%D9%89-red-hat-enterprise-linux-r750/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2017_02/redhat-KVM.png.9ce5d3294806cafd4ea87aacbad111d1.png" /></p>

<p>
	يشير مصطلح الحوسبة الافتراضيّة (التخيّليّة أو الوهميّة) Virtualization إلى إمكانيّة استخدام أنظمة تشغيل مستقلّة ومنفصلة في وقت واحد على نفس العتاد Hardware. يُعرَف النظام الذي يشغّل العتاد الذي تعمل عليه الأنظمة الأخرى، يُعرَف بالمضيف Host؛ في ما يُعدّ كلّ من واحد الأنظمة الأخرى ضيفا Guest.
</p>

<p style="text-align: center;">
	<img alt="redhat-KVM.png" class="ipsImage ipsImage_thumbnailed" data-fileid="21346" data-unique="igcuo83c9" src="https://academy.hsoub.com/uploads/monthly_2017_02/redhat-KVM.png.100e92c748ad2d7b57cf57912f991714.png" style=""></p>

<p>
	يتولّى برنامج يُعرف بالمراقِب Hypervisor توفير موارد افتراضيّة (معالج، ذاكرة عشوائيّة، <a href="https://academy.hsoub.com/devops/servers/%D9%88%D8%A7%D8%AC%D9%87%D8%A7%D8%AA-%D8%B4%D8%A8%D9%83%D8%A9-%D8%A7%D9%84%D8%A5%D9%86%D8%AA%D8%B1%D9%86%D8%AA-%D9%88%D8%A8%D8%B1%D9%88%D8%AA%D9%88%D9%83%D9%88%D9%84%D8%A7%D8%AA%D9%87%D8%A7-%D8%A7%D9%84%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D9%91%D8%A9-r64/#%D8%A7%D9%84%D9%88%D8%A7%D8%AC%D9%87%D8%A7%D8%AA" rel="">واجهات شبكة</a> وغيرها) بالاعتماد على الموارد الفعليّة (العتاد). يُطلَق عادة على نظامٍ ضيف اسمُ الآلة الافتراضية (الجهاز الافتراضي) Virtual machine.
</p>

<p>
	تمكّن الحوسبة الافتراضيّة من الاقتصاد في النفقات من حيث العتاد المطلوب، البنية التحتيّة للشبكة وجهد الصيّانة؛ إضافةً إلى التقليل من المساحة المطلوب تخصيصها لإنشاء بيئة تحتية لنظام معلوماتي. يتناول هذا المقال أساسيّات الحوسبة الافتراضية في Red Hat Enterprise Linux 7 باستخدام KVM (اختصار Kernel-based Virtual Machine؛ الأجهزة الافتراضيّة المعتمدة على نواة لينكس).
</p>

<h2 id="التحقق-من-المتطلبات-وتثبيت-الحزم">
	التحقّق من المتطلّبات وتثبيت الحزم
</h2>

<p>
	يكمن الشّرط الأول لإنشاء أجهزة افتراضيّة في ضرورة دعم المعالج لتقنيّة الحوسبة الافتراضيّة. يمكن التأكد بتنفيذ الأمر التالي من ذلك:
</p>

<pre class="ipsCode" id="ips_uid_6549_7">
# grep -E 'svm|vmx' /proc/cpuinfo</pre>

<p>
	إن كان لديك معالج Intel يدعم الحوسبة الافتراضيّة فستظهر <code>vmx</code> في النتيجة؛ أما إذا كان المعالج من نوع AMD ويدعم هذه التقنيّة فستظهر <code>svm</code> في نتيجة تنفيذ الأمر. ستحتاج إلى تفعيل الحوسبة الافتراضية على <a href="https://academy.hsoub.com/certificates/redhat/rhcsa/%D9%85%D8%A8%D8%A7%D8%AF%D8%A6-%D8%A5%D8%AF%D8%A7%D8%B1%D8%A9-%D8%A7%D9%84%D8%B9%D9%85%D9%84%D9%8A%D8%A7%D8%AA-processes-%D8%B9%D9%84%D9%89-redhat-enterprise-linux-r44#%D9%85%D8%B1%D8%A7%D8%AD%D9%84-%D8%A7%D9%84%D8%A5%D9%82%D9%84%D8%A7%D8%B9" rel="">محمِّل الإقلاع الأولى</a> (BIOS أو UEFI)؛ بعد التأكد من دعم المعالج لها.
</p>

<p>
	ثم ننتقل للخطوة التاليّة وهيّ تثبيت الحزم التي تجلب المراقب KVM وتجعله متاحا على النظام (المُضيف). هذه الحزم هي:
</p>

<ul>
<li>
		<code>qemu-kvm</code>: توفّر إمكانيّة محاكاة العتاد من أجل إنشاء الموارد الافتراضية وجعلها تحت تصرّف النظام الضّيف.
	</li>
	<li>
		<code>qemu-img</code>: أداة تعمل على سطر الأوامر للتعامل مع نظائر الأقراص Disk images.
	</li>
	<li>
		<code>libvirt</code>: تتوفّر هذه الحزمة على الأدوات التي تمكّن من استغلال إمكانيّات الحوسبة الافتراضية التي يتوفّر عليها نظام التّشغيل.
	</li>
	<li>
		<code>libvirt-python</code>: وحدة تتيح للتطبيقات المكتوبة بلغة البرمجة Python استخدامَ الأدوات التي توفّرها الحزمة السّابقة.
	</li>
	<li>
		<code>libguestfs-tools</code> و <code>virt-install</code>: مجموعة من الأدوات تعمل على سطر الأومار لإدارة الأجهزة الافتراضية.
	</li>
</ul>
<p>
	<strong>ملحوظة:</strong> نظائر الأقراص Images هي ملفّات تضمّ المحتوى والبنية الخاصّين بتجزئة قرص أو قرص تخزين كامل؛ مثل الأقراص الصّلبة، الأقراص الضّوئية أو مفاتيح USB. تمكّن النظائر من تكرار محتوى القرص وبنيته تماما، بغضّ النظر عن نوعية نظام الملفات المستخدم على القرص. تأخذ هذه الملفات عادة الامتداد <code>img</code> او <code>iso</code>.
</p>

<p>
	أمر التثبيت:
</p>

<pre>
 </pre>

<pre class="ipsCode" id="ips_uid_6549_9">
# yum update &amp;&amp; yum install qemu-kvm qemu-img libvirt libvirt-python libguestfs-tools virt-install
</pre>

<p>
	ننفذ الأمرين التاليّين - بعد اكتمال تثبيت الحزم - لبدء تشغيل الخدمة <code>libvirtd</code> وتفعيلها مع إقلاع النظام:
</p>

<pre>
 </pre>

<pre class="ipsCode" id="ips_uid_6549_11">
# systemctl start libvirtd.service
# systemctl enable libvirtd.service
</pre>

<p>
	لا يمكن <strong>مبدئيًّا</strong> للجهاز الافتراضي التخاطب مع الشبكة المحليّة LAN أو الإنترنت؛ ولكن يمكنه التخاطب مع الأجهزة الافتراضية الموجودة على نفس المضيف، ومع المضيف نفسه. يجب، لكي يُتاح للأجهزة الضيفة (Guests) الوصولُ إلى الشبكة المحليّة أو الإنترنت؛ إعداد إحدى واجهات الشبكة على المُضيف لتكون جسرا Bridge للأجهزة الضيفة:
</p>

<ol>
<li>
		<p>
			نضيف السّطر التالي إلى ملفّ إعداد الواجهة (يوجد على الأرجح في المجلّد <code>etc/sysconfig/network-scripts/</code> ويبدأ اسمه بـ<code>ifcfg</code>):
		</p>

		<pre class="ipsCode" id="ips_uid_6549_13">
BRIDGE=br0</pre>

		<p>
			حيثُ <code>br0</code> الاسم الذي اخترناه للجسر.
		</p>

		<p>
			ننشئ ملفّ إعداد للجسر <code>br0</code> باسم <code>ifcfg-br0</code> ضمن<a href="https://academy.hsoub.com/certificates/redhat/rhcsa/%D8%AA%D8%A3%D9%85%D9%8A%D9%86-%D8%A7%D9%84%D8%A7%D8%AA%D8%B5%D8%A7%D9%84%D8%A7%D8%AA-%D8%B9%D9%86-%D8%B7%D8%B1%D9%8A%D9%82-ssh-%D9%88%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF-%D8%A3%D8%B3%D9%85%D8%A7%D8%A1-%D8%A7%D9%84%D9%85%D8%B6%D9%8A%D9%81%D8%A7%D8%AA-%D8%B9%D9%84%D9%89-red-hat-enterprise-linux-r47#%D9%85%D8%AC%D9%84%D8%AF-etcsysconfignetwork-scripts-%D9%85%D9%84%D9%81%D8%A7%D8%AA-%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF-%D9%88%D8%A7%D8%AC%D9%87%D8%A7%D8%AA-%D8%A7%D9%84%D8%B4%D8%A8%D9%83%D8%A9" rel=""> المجلّد etc/sysconfig/network-scripts/</a> ونضيف إليه المحتوى التالي؛ غيّر عنوان IP، عنوان البوّابة Gateway ومعلومات DNS بما يناسب:
		</p>

		<pre>
 </pre>

		<pre class="ipsCode" id="ips_uid_6549_15">
DEVICE=br0
TYPE=Bridge
BOOTPROTO=static
IPADDR=192.168.0.18
NETMASK=255.255.255.0
GATEWAY=192.168.0.1
NM_CONTROLLED=no
DEFROUTE=yes
PEERDNS=yes
PEERROUTES=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_PEERDNS=yes
IPV6_PEERROUTES=yes
IPV6_FAILURE_FATAL=no
NAME=br0
ONBOOT=yes
DNS1=8.8.8.8
DNS2=8.8.4.4
</pre>

		<p>
			ثم نفعّل إمكانيّة إعادة التوجيه في الملفّ <code>etc/sysctl.conf/</code>:
		</p>

		<pre class="ipsCode" id="ips_uid_6549_17">
net.ipv4.ip_forward = 1</pre>

		<p>
			لم يتبقّ لنا سوى اعتماد التعديلات بتنفيذ الأمر:
		</p>

		<pre class="ipsCode" id="ips_uid_6549_20">
# sysctl -p</pre>

		<p>
			 
		</p>
	</li>
</ol>
<p>
	تذكّر أنه يمكنك تحديد نوعيّة البيانات المسموح بمرورها عن طريق <a href="https://academy.hsoub.com/certificates/redhat/rhcsa/%D9%85%D9%82%D8%AF%D9%91%D9%85%D8%A9-%D8%B9%D9%86-%D8%A7%D9%84%D8%AA%D8%AD%D9%83%D9%85-%D9%81%D9%8A-%D8%AD%D8%B1%D9%83%D8%A9-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-%D8%B9%D9%84%D9%89-%D8%A7%D9%84%D8%B4%D8%A8%D9%83%D8%A9-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-iptables-%D9%88firewalld-%D8%B9%D9%84%D9%89-red-hat-enterprise-linux-r50/" rel="">الجدار الناري FirewallD</a>
</p>

<h2 id="إنشاء-الأجهزة-الافتراضية">
	إنشاء الأجهزة الافتراضية
</h2>

<p>
	يحتفظ مراقب الأجهزة الافتراضية <strong>مبدئيا</strong> بملفات الأجهزة التي ينشئها في المجلد <code>var/lib/libvirt/images/</code>؛ يُنصَح بألا يُعدَّل على آلية العمل هذه إلا إذا كانت هناك حاجة ماسة لذلك. ستحتاج - إن عدّلت مسار ملفات الأجهزة الافتراضية المبدئي - إلى التعامل مع إعدادات <a href="https://academy.hsoub.com/certificates/redhat/rhcsa/%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D8%A7%D9%84%D8%AA%D8%AD%D9%83%D9%85-%D9%81%D9%8A-%D8%A7%D9%84%D9%88%D8%B5%D9%88%D9%84-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-selinux-%D9%81%D9%8A-red-hat-enterprise-linux-r51/" rel="">SELinux</a> الخاصّة بهذه الملفات مباشرة. تأكّد من أنّ نظام الملفات لديك يحوي مساحة كافيّة لإنشاء الآلات الافتراضية التي ترغب فيها.
</p>

<p>
	ينشئ الأمر التالي جهازا افتراضيًّا باسم <code>academy-virt01</code> بمعالج افتراضي واحد، ذاكرة عشوائيّة تبلغ <code>1GB</code> وقرص صلب ذي مساحة تخزينية تبلغ <code>20GB</code> (يُمثَّل القرص الصّلب بالملف <code>var/lib/libvirt/images/academy-virt01.img/</code>). نحدّد الملف <code>rhel-server-7.2-x86_64-dvd.iso</code> الموجود على المسار <code>home/hsoub/ISOs/</code> ليكون وسيط تثبيت والواجهة <code>br0</code> لتكون جسرا للاتّصال:
</p>

<pre class="ipsCode" id="ips_uid_6549_22">
# virt-install \
--network bridge=br0
--name academy-virt01 \
--ram=1024 \
--vcpus=1 \
--disk path=/var/lib/libvirt/images/academy-virt01.img,size=20 \
--graphics none \
--cdrom /home/hsoub/ISOs/rhel-server-7.0-x86_64-dvd.iso
--extra-args="console=tty0 console=ttyS0,115200"</pre>

<p>
	يمكن استخدام وسيط تثبيت موجود على <a href="https://academy.hsoub.com/certificates/redhat/rhcsa/%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF-%D8%AE%D8%A7%D8%AF%D9%88%D9%85-%D9%88%D9%90%D8%A8-%D9%88%D8%AE%D8%A7%D8%AF%D9%88%D9%85-ftp-%D8%B9%D9%84%D9%89-red-hat-enterprise-linux-r48/" rel="">خادوم HTTP</a> بدلا من القرص المحلّي. استخدم في هذه الحالة الخيّار <code>location--</code> بدلا من <code>cdrom--</code> وحدّد رابط ملفّ التثبيت على الخادوم. يحدّد الخيار <code>graphics none--</code> وضع التثبيت باختيار وضع نصّي (غير رسومي)؛ يمكن حذف هذا الخيّار إن كنت تستخدم واجهة رسوميّة. يمرّر الخيّار الأخير <code>extra-args--</code> معطيات إقلاع النواة Kernel إلى المثبّت من أجل إعداد طرفيّة للوصول إلى الآلة الافتراضية (يشبه الأمر وصلَ شاشة بحاسوب ملموس).
</p>

<p>
	ينتج عن تنفيذ الأمر السابق إنشاء جهاز افتراضي بالمواصفات المذكورة وبدء تثبيت نظام تشغيل (RHEL 7) عليه.
</p>

<h2 id="إدارة-الأجهزة-الافتراضية">
	إدارة الأجهزة الافتراضية
</h2>

<p>
	في ما يلي المهامّ الأساسيّة التي تحتاج - بوصفك مدير نظام - لمعرفة كيفية أدائها. تُنفَّذ الأوامر التالية على النّظام المضيف.
</p>

<ol>
<li>
		<p>
			سرد قائمة بالأجهزة الافتراضية
		</p>

		<pre class="ipsCode" id="ips_uid_6549_24">
# virsh list --all</pre>

		<p>
			يظهر الأمر قائمة بالأجهزة الافتراضية المُنشأة، أسماءها وحالتها. من المهم الانتباه لمعرّف الجهاز (VM Id)، إذ ستحتاجه لتنفيذ أوامر إدارية أخرى.
		</p>
	</li>
	<li>
		<p>
			عرض معلومات عن نظام ضيف (حيث <code>VM_Id</code> معرّف الجهاز الافتراضي):
		</p>

		<pre class="ipsCode" id="ips_uid_6549_26">
# virsh dominfo VM_Id</pre>

		<p>
			 
		</p>
	</li>
	<li>
		<p>
			بدء تشغيل، إعادة تشغيل أو إيقاف نظامٍ ضيف:
		</p>

		<pre class="ipsCode" id="ips_uid_6549_30">
# virsh start VM_Id
# virsh reboot VM_Id
# virsh shutdown VM_Id</pre>

		<p>
			 
		</p>
	</li>
	<li>
		<p>
			الوصول إلى طرفيّة الجهاز (في حال إعداداها عند إنشاء الجهاز الافتراضي):
		</p>

		<pre class="ipsCode" id="ips_uid_6549_32">
# virsh console VM_Id</pre>

		<p>
			 
		</p>
	</li>
	<li>
		<p>
			تعديل حجم الذاكرة العشوائيّة المتاحة لجهاز افتراضي أو عدد معالجاته الافتراضية:
		</p>

		<p>
			يحتاج التعديل على هذه الموارد أولا إطفاء الجهاز:
		</p>

		<pre class="ipsCode" id="ips_uid_6549_34">
# virsh shutdown VM_Id</pre>

		<p>
			ننفذ الأمر التالي للتعديل على إعدادات الجهاز الافتراضي:
		</p>

		<pre class="ipsCode" id="ips_uid_6549_36">
# virsh edit VM_Id</pre>

		<p>
			ثم نعدّل قيمة الذاكرة الموجودة بين الوسمين <code>memory</code>:
		</p>

		<pre>
 </pre>

		<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_6549_40">
<span class="tag">&lt;memory&gt;</span><span class="pln">القيمة الجديدة للذاكرة العشوائيّة</span><span class="tag">&lt;/memory&gt;</span></pre>

		<p>
			انتبه إلى أن الوحدة المستخدمة للذاكرة هي الميغابايت MB. مثلا؛ اكتب <code>2048</code> إن كنت تريد تخصيص <code>2GB</code> لذاكرة الجهاز.
		</p>

		<p>
			وبالنسبة للمعالج:
		</p>

		<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_6549_42">
<span class="tag">&lt;cpu&gt;</span><span class="pln">عدد المعالجات الافتراضية</span><span class="tag">&lt;/cpu&gt;</span></pre>

		<p>
			ثم نعيد تشغيل الجهاز باعتماد التغييرات الجديدة:
		</p>

		<pre>
 </pre>

		<pre class="ipsCode" id="ips_uid_6549_44">
# virsh create /etc/libvirt/qemu/academy-virt01.xml
</pre>

		<p>
			يمكن ضبط حجم الذاكرة العشوائيّة دون الحاجة لفتح ملف الإعداد بالأمر <code>virsh setmem</code> (حيث <code>mem_size</code> الحجم الجديد):
		</p>

		<pre class="ipsCode" id="ips_uid_6549_46">
# virsh setmem VM_Id mem_size</pre>

		<p>
			يمكن بطريقة مشابهة ضبط عدد معالجات جهاز افتراضي:
		</p>

		<pre class="ipsCode" id="ips_uid_6549_48">
# virsh  setvcpus VM_Id vcpus_count</pre>

		<p>
			 
		</p>
	</li>
</ol>
<p>
	تمكن مراجعة هذا <a href="https://docs.fedoraproject.org/en-US/Fedora/13/html/Virtualization_Guide/chap-Virtualization-Managing_guests_with_virsh.html" rel="external nofollow">الدليل</a> للحصول على قائمة بخيارات الأمر <code>virsh</code> واستعمالاته لإدارة الأجهزة الافتراضية.
</p>

<p>
	ترجمة - بتصرّف - لمقال <a href="http://www.tecmint.com/kvm-virtualization-basics-and-guest-administration/2/" rel="external nofollow">RHCSA Series: Essentials of Virtualization and Guest Administration with KVM – Part 15</a> لصاحبه Gabriel Cánepa.
</p>
]]></description><guid isPermaLink="false">750</guid><pubDate>Sat, 11 Jun 2016 23:04:00 +0000</pubDate></item><item><title>&#x645;&#x628;&#x627;&#x62F;&#x626; &#x625;&#x62F;&#x627;&#x631;&#x629; &#x627;&#x644;&#x639;&#x645;&#x644;&#x64A;&#x627;&#x62A; (Processes) &#x639;&#x644;&#x649; RedHat Enterprise Linux</title><link>https://academy.hsoub.com/devops/linux/redhat/%D9%85%D8%A8%D8%A7%D8%AF%D8%A6-%D8%A5%D8%AF%D8%A7%D8%B1%D8%A9-%D8%A7%D9%84%D8%B9%D9%85%D9%84%D9%8A%D8%A7%D8%AA-processes-%D8%B9%D9%84%D9%89-redhat-enterprise-linux-r740/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2016_05/rhcsa-redhat-processes.png.d5a782c68bc28df1109c421f11ca87ed.png" /></p>

<p>
	تعرَضنا في دروس سابقة لكيفيّة <a href="https://academy.hsoub.com/certificates/redhat/rhcsa/%D8%A5%D8%AF%D8%A7%D8%B1%D8%A9-%D8%A7%D9%84%D9%85%D9%84%D9%81%D8%A7%D8%AA-%D9%88%D8%A7%D9%84%D9%85%D8%AC%D9%84%D8%AF%D8%A7%D8%AA-%D8%B9%D9%84%D9%89-red-hat-enterprise-linux-r41/" rel="">إدارة الملفات</a> و <a href="https://academy.hsoub.com/certificates/redhat/rhcsa/%D8%A5%D8%AF%D8%A7%D8%B1%D8%A9-%D8%A7%D9%84%D9%85%D8%B3%D8%AA%D8%AE%D8%AF%D9%85%D9%8A%D9%86-%D9%88%D8%A7%D9%84%D9%85%D8%AC%D9%85%D9%88%D8%B9%D8%A7%D8%AA-%D8%B9%D9%84%D9%89-red-hat-enterprise-linux-r42/" rel="">المستخدمين</a> على RedHat Enterprise Linux؛ نواصل في هذا الدّرس تناول المهامّ الأساسيّة لإدارة خادوم بشرح مبادئ إدارة العمليّات على RedHat Enterprise Linux 7.
</p>

<p style="text-align: center;">
	<img class="ipsImage ipsImage_thumbnailed" data-fileid="17027" data-unique="jtavlv9nx" src="https://academy.hsoub.com/uploads/monthly_2016_05/rhcsa-redhat-processes.png.23e212011f8d82dd861f5ff29c0b51ee.png" alt="rhcsa-redhat-processes.png"></p>

<p>
	نبدأ أوّلا بنظرة عامّة على ما يحدُث ابتداءً من اللحظة التي تشغّل فيها زرّ الطاقة على خادوم يعمل على توزيعة RHEL إلى اللحظة التي تظهر فيها شاشة تسجيل الدخول عبر سطر الأوامر.
</p>

<h2 id="مراحل-الإقلاع">
	مراحل الإقلاع
</h2>

<p>
	تنطبق هذه المراحل على توزيعات غنو/لينكس الأخرى مع وجود اختلافات طفيفة.
</p>

<ol>
<li>
		يبدأ اختبار التشغيل الذاتي Power On Self Test بالتحقّق من العتاد Hardware.
	</li>
	<li>
		ينقل اختبار التشغيل الذاتي بعد اكتماله التحكمَ إلى محمِّل الإقلاع الأوّلي First stage boot loader الذي يوجد إما في مقطع الإقلاع على أحد أقراص الجهاز (نظام BIOS)؛ أو في تجزئة Partition منفصلة (نظام UEFI).
	</li>
	<li>
		يمرّر محمّل الإقلاع الأولي التحكّم إلى محمّل الإقلاع الثاني Second stage boot loader الذي يوجد في المجلّد <code>boot/</code>. محمّل الإقلاع الأكثر استخداما هو GRUB (اختصار لـ GRand Unified Boot Loader). يبحث محمّل الإقلاع عن نواة النظام Kernel ونظام ملفات خاصّ يُعرف بـ <code>initramfs</code> يحوي ملفّات وبرامج مهمتها إنجاز الخطوات الضروريّة لتركيب Mount نظام الملفّات الجذر (وهو نظام الملفّات المستخدَم في التجزئة التي يوجد عليها المجلّد <code>root/</code>).
	</li>
	<li>
		تضبط النواة العتاد الموصول بالنظام، ثم بعد تركيب نظام الملفات الجذر تشغّل عمليّة بمعرّف العمليات <code>1</code> <abbr title="Process IDentifier | معرّف العملية أو البرنامج"><abbr title="Process IDentifier | معرّف العملية أو البرنامج"><abbr title="Process IDentifier | معرّف العملية أو البرنامج"><abbr title="Process IDentifier | معرّف العملية أو البرنامج"><abbr title="Process IDentifier | معرّف العملية أو البرنامج"><abbr title="Process IDentifier | معرّف العملية أو البرنامج"><abbr title="Process IDentifier | معرّف العملية أو البرنامج"><abbr title="Process IDentifier | معرّف العملية أو البرنامج"><abbr title="Process IDentifier | معرّف العملية أو البرنامج"><abbr title="Process IDentifier | معرّف العملية أو البرنامج">PID</abbr></abbr></abbr></abbr></abbr></abbr></abbr></abbr></abbr></abbr>. تجهّز هذه العمليّة بقيّة العمليّات التي من بينها العمليّة المسؤولة عن تسجيل الدخول. تُعرَف العمليّة ذات المعرّف <code>1</code> بعمليّة التمهيد Initialization (أو init اختصارا).
	</li>
</ol>
<p>
	<strong>ملحوظة:</strong> يغلب وصف محمّل الإقلاع Boot loader دون تحديد على محمّل الإقلاع الثاني.
</p>

<p>
	يمكننا باستخدام الأمر <code>ps</code> عرض لائحة بالعمليّات الحاليّة ذات العمليّة الأم (أي العمليّة التي بدأت تشغيلَ هذه العمليّات) <code>systemd</code> (عمليّة التمهيد في نظام التمهيد SystemD الذي انتقلت إليه أغلب توزيعات لينكس الحديثة):
</p>

<pre class="ipsCode" id="ips_uid_4026_7">
$ ps -o ppid,<abbr title="Process IDentifier | معرّف العملية أو البرنامج"><abbr title="Process IDentifier | معرّف العملية أو البرنامج"><abbr title="Process IDentifier | معرّف العملية أو البرنامج"><abbr title="Process IDentifier | معرّف العملية أو البرنامج"><abbr title="Process IDentifier | معرّف العملية أو البرنامج"><abbr title="Process IDentifier | معرّف العملية أو البرنامج"><abbr title="Process IDentifier | معرّف العملية أو البرنامج">pid</abbr></abbr></abbr></abbr></abbr></abbr></abbr>,uname,comm --ppid=1</pre>

<p>
	يمكّننا الخيار <code>o-</code> من تحديد نوعيّة المخرجات التي نرغب في عرضها؛ وهي في هذه الحالة معرّف العمليّة الأمّ <code>ppid</code>، معرّف العمليّة <code><abbr title="Process IDentifier | معرّف العملية أو البرنامج"><abbr title="Process IDentifier | معرّف العملية أو البرنامج"><abbr title="Process IDentifier | معرّف العملية أو البرنامج"><abbr title="Process IDentifier | معرّف العملية أو البرنامج"><abbr title="Process IDentifier | معرّف العملية أو البرنامج"><abbr title="Process IDentifier | معرّف العملية أو البرنامج"><abbr title="Process IDentifier | معرّف العملية أو البرنامج"><abbr title="Process IDentifier | معرّف العملية أو البرنامج"><abbr title="Process IDentifier | معرّف العملية أو البرنامج"><abbr title="Process IDentifier | معرّف العملية أو البرنامج">pid</abbr></abbr></abbr></abbr></abbr></abbr></abbr></abbr></abbr></abbr></code>، اسم المستخدم الذي شغّل العمليّة <code>uname</code> والأمر <code>comm</code>. يحدّد المعطى الأخير شرطا هو أن يكون معرّف العمليّة الأم يساوي <code>1</code> (عمليّة التمهيد).
</p>

<p>
	في ما يلي جزء من نتيجةِ تنفيذٍ للأمر: 
</p>

<pre class="ipsCode" id="ips_uid_4026_9">
PPID <abbr title="Process IDentifier | معرّف العملية أو البرنامج"><abbr title="Process IDentifier | معرّف العملية أو البرنامج"><abbr title="Process IDentifier | معرّف العملية أو البرنامج"><abbr title="Process IDentifier | معرّف العملية أو البرنامج"><abbr title="Process IDentifier | معرّف العملية أو البرنامج"><abbr title="Process IDentifier | معرّف العملية أو البرنامج"><abbr title="Process IDentifier | معرّف العملية أو البرنامج">PID</abbr></abbr></abbr></abbr></abbr></abbr></abbr> USER     COMMAND
1   478 root     systemd-journal
1   497 root     lvmetad
1   513 root     systemd-udevd
1   620 root     auditd
1   644 root     alsactl
1   645 root     smartd
1   646 libstor+ lsmd
1   649 root     rngd
1   650 root     abrtd
1   651 root     abrt-watch-log
1   655 root     ModemManager
1   656 root     systemd-logind
1   657 root     irqbalance
1   658 avahi    avahi-daemon
1   659 root     firewalld
1   662 root     accounts-daemon
1   667 root     rsyslogd
1   668 root     abrt-watch-log
1   673 rtkit    rtkit-daemon
1   675 dbus     dbus-daemon
1   690 root     gssproxy
1   752 root     VBoxService
1   760 root     ksmtuned
1   762 polkitd  polkitd
(...)
</pre>

<p>
	<strong>ملحوظة:</strong> لجعل النتيجة أسهل للتصفح أعد توجيه الأمر <code>ps</code> أعلاه إلى <code>less</code>؛ ثم استخدم زرّ المسافة على لوحة المفاتيح للانتقال إلى الصفحة الموالية في النتائج، <code>Ctrl</code>+<code>u</code> للانتقال إلى الصفحة السابقة و <code>q</code> للعودة إلى سطر الأوامر:
</p>

<pre class="ipsCode" id="ips_uid_4026_11">
$ ps -o ppid,<abbr title="Process IDentifier | معرّف العملية أو البرنامج"><abbr title="Process IDentifier | معرّف العملية أو البرنامج"><abbr title="Process IDentifier | معرّف العملية أو البرنامج"><abbr title="Process IDentifier | معرّف العملية أو البرنامج"><abbr title="Process IDentifier | معرّف العملية أو البرنامج"><abbr title="Process IDentifier | معرّف العملية أو البرنامج"><abbr title="Process IDentifier | معرّف العملية أو البرنامج">pid</abbr></abbr></abbr></abbr></abbr></abbr></abbr>,uname,comm --ppid=1 | less
</pre>

<p>
	يساعد تخصيص مخرجات الأمر <code>ps</code> في أمور منها على سبيل المثال معرفة العمليّات التي تتسبّب في زيادة استخدام المعالج أو الذاكرة:
</p>

<pre class="ipsCode" id="ips_uid_4026_13">
$ ps aux --sort=+pcpu    # ترتيب العمليات تصاعديًّا حسب نسبة استخدام المعالج
$ ps aux --sort=-pcpu    # ترتيب العمليات تنازليًّا حسب نسبة استخدام المعالج
$ ps aux --sort=+pmem    # ترتيب العمليات تصاعديًّا حسب نسبة استخدام الذاكرة
$ ps aux --sort=-pmem    # ترتيب العمليات تنازليًّا حسب نسبة استخدام الذاكرة
# ترتيب العمليّات تصاعديًّا حسب استخدام المعالج وتنازليًّا حسب استخدام الذاكرة
$ ps aux --sort=+pcpu,-pmem      </pre>

<h2 id="مقدمة-إلى-systemd">
	مقدمة إلى SystemD
</h2>

<p>
	اعتمدت أغلب توزيعات لينكس الحديثة نظام التمهيد SystemD بدلا من أنظمة التمهيد القديمة (مثل SysVinit) نظرا للميزات التي يقدّمها؛ ومن أهمها:
</p>

<ol>
<li>
		إمكانيّة أكبر لتنفيذ العمليّات بالتوازي أثناء التمهيد؛ على عكس SysVinit الأبطأ (ينفّذ SysVinit العمليّات الواحدة تلو الأخرى وينتظر التحقّق من اعتماديّات العمليّات قبل البدء في تشغيل خدمات النظام).
	</li>
	<li>
		يعمل بعد التمهيد على إدارة موارد النظام بطريقة أفضل؛ فالخدمات تشغَّل عند الحاجة إليها فقط من أجل تجنّب استهلاك موارد النظام في عمليّات غير متسخدَمة.
	</li>
	<li>
		التوافق العكسيّ مع سكربتات SysVinit.
	</li>
</ol>
<p>
	تدير الأداة <code>systemctl</code> نظام التمهيد SystemD؛ التي تؤدي دورَ الأدوات <code>chkconfig<font face="Droid Arabic Naskh, Open Sans, Helvetica Neue, Helvetica, Tahoma, Arial, sans-serif"> و </font></code><code>service</code> و <code>shutdown</code> في نظام التمهيد SysVinit. يبيِّن الجدول التالي التشابه بين عمل <code>systemctl</code> وعمل الأدوات المذكورة.
</p>

<center>
	<table border="1"><tbody>
<tr>
<th style="padding: 5px 10px; background-color: #ecf0f1;" width="30%">
					الأمر في SysVinit
				</th>
				<th style="padding: 5px 10px; background-color: #ecf0f1;" width="30%">
					الأمر في SystemD
				</th>
				<th style="padding: 5px 10px; background-color: #ecf0f1;" width="50%">
					الوصف
				</th>
			</tr>
<tr>
<td style="padding: 5px 10px;">
					<code>service name start</code>
				</td>
				<td style="padding: 5px 10px;">
					<code>systemctl start name</code>
				</td>
				<td style="padding: 5px 10px;">
					تشغيل الخدمة name
				</td>
			</tr>
<tr>
<td style="padding: 5px 10px;">
					<code>service name stop</code>
				</td>
				<td style="padding: 5px 10px;">
					<code>systemctl stop name</code>
				</td>
				<td style="padding: 5px 10px;">
					إيقاف الخدمة name
				</td>
			</tr>
<tr>
<td style="padding: 5px 10px;">
					<code>service name condrestart</code>
				</td>
				<td style="padding: 5px 10px;">
					<code>systemctl try-restart name</code>
				</td>
				<td style="padding: 5px 10px;">
					إعادة تشغيل الخدمة بشرط أن تكون تعمل حاليا
				</td>
			</tr>
<tr>
<td style="padding: 5px 10px;">
					<code>service name restart</code>
				</td>
				<td style="padding: 5px 10px;">
					<code>systemctl restart name</code>
				</td>
				<td style="padding: 5px 10px;">
					إعادة تشغيل الخدمة
				</td>
			</tr>
<tr>
<td style="padding: 5px 10px;">
					<code>service name reload</code>
				</td>
				<td style="padding: 5px 10px;">
					<code>systemctl reload name</code>
				</td>
				<td style="padding: 5px 10px;">
					إعادة تحميل إعدادات الخدمة
				</td>
			</tr>
<tr>
<td style="padding: 5px 10px;">
					<code>service name status</code>
				</td>
				<td style="padding: 5px 10px;">
					<code>systemctl status name</code>
				</td>
				<td style="padding: 5px 10px;">
					عرض حالة الخدمة
				</td>
			</tr>
<tr>
<td style="padding: 5px 10px;">
					<code>service –status-all</code>
				</td>
				<td style="padding: 5px 10px;">
					<code>systemctl</code>
				</td>
				<td style="padding: 5px 10px;">
					عرض حالة جميع الخدمات
				</td>
			</tr>
<tr>
<td style="padding: 5px 10px;">
					<code>chkconfig name on</code>
				</td>
				<td style="padding: 5px 10px;">
					<code>systemctl enable name</code>
				</td>
				<td style="padding: 5px 10px;">
					تفعيل تشغيل الخدمة مع إقلاع النظام حسب ما هو محدّد في ملف الوحدة Unit file. تتمثّل عمليّة تفعيل خدمة للتشغيل التلقائي مع الإقلاع (أو تعطيلها) في إضافة وصلات رمزيّة (أو حذفها) إلى المجلّد <code>etc/systemd/system/</code> (أو حذفها منه).
				</td>
			</tr>
<tr>
<td style="padding: 5px 10px;">
					<code>chkconfig name off</code>
				</td>
				<td style="padding: 5px 10px;">
					<code>systemctl disable name</code>
				</td>
				<td style="padding: 5px 10px;">
					تعطيل تشغيل خدمة مع إقلاع النظام.
				</td>
			</tr>
<tr>
<td style="padding: 5px 10px;">
					<code>chkconfig --list name</code>
				</td>
				<td style="padding: 5px 10px;">
					<code>systemctl is-enabled name</code>
				</td>
				<td style="padding: 5px 10px;">
					يتحقّق من ما إذا كانت الخدمة مفعَّلة حاليا أم لا
				</td>
			</tr>
<tr>
<td style="padding: 5px 10px;">
					<code>chkconfig --list</code>
				</td>
				<td style="padding: 5px 10px;">
					<code>systemctl --type=service</code>
				</td>
				<td style="padding: 5px 10px;">
					تعطيل جميع الخدمات مع ذكر ما إذا كانت الخدمة معطّلة أم مفعَّلة.
				</td>
			</tr>
<tr>
<td style="padding: 5px 10px;">
					<code>shutdown -h now </code>
				</td>
				<td style="padding: 5px 10px;">
					<code>systemctl poweroff</code>
				</td>
				<td style="padding: 5px 10px;">
					إيقاف الجهاز
				</td>
			</tr>
<tr>
<td style="padding: 5px 10px;">
					<code>shutdown -r now</code>
				</td>
				<td style="padding: 5px 10px;">
					<code>systemctl reboot</code>
				</td>
				<td style="padding: 5px 10px;">
					إعادة تشغيل النظام
				</td>
			</tr>
</tbody></table>
</center>

<p>
	أضاف SystemD مفهومي الوحدة Unit إلى نظام التمهيد (التي يمكن أن تكون خدمة Service، نقطة تركيب Mount point، جهاز طرفي Device أو مقبس شبكي Network socket) والوجهة Target (الكيفيّة التي يدير بها SystemD عمليّات عدّة مرتبطة في ما بينها).
</p>

<p>
	راجع مقال <a href="https://academy.hsoub.com/devops/linux/%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-systemd-%D8%A7%D9%84%D8%B9%D9%85%D9%84-%D9%85%D8%B9-%D8%A7%D9%84%D8%AE%D8%AF%D9%85%D8%A7%D8%AA%D8%8C-%D8%A7%D9%84%D9%88%D8%AD%D8%AF%D8%A7%D8%AA-units%D8%8C-%D9%88%D8%A7%D9%84%D9%8A%D9%88%D9%85%D9%8A%D8%A7%D8%AA-journal-r130/" rel="">أساسيات Systemd: العمل مع الخدمات، الوحدات Units، واليوميات Journal</a> للمزيد حول نظام التمهيد SystemD.
</p>

<h2 id="إدارة-العمليات">
	إدارة العمليات
</h2>

<h3 id="تعديل-الأولوية-في-التنفيذ">
	تعديل الأولوية في التنفيذ
</h3>

<p>
	يُستخدَم الأمر <code>renice</code> للتعديل على الأولويّة المعطاة لعمليّة أو عدّة عمليات. تستخدم النواةُ الأولويات لتحديد الكيفيّة التي ستخصّص بها موارد الجهاز للعمليّات. تتراوح الأولويّات Priorities (وتُعرَف أيضا بـ Nices) بين <code>20-</code> و <code>19</code>:
</p>

<pre class="ipsCode" id="ips_uid_4026_15">
$ renice priority identifier</pre>

<p>
	نحدّد بالمعطى الأول <code>priority</code> الأولويّة التي نريد منحها؛ ثم نحدّد في المعطى الثاني معرّفات عمليّات <code>p-</code>، معرّفات مستخدمين (أو أسماءهم) <code>u-</code> أو معرّفات مجموعات مستخدمين (أو أسماءها) <code>g-</code>. يمكن للمستخدم العادي تغيير أولويّة عمليّاته فقط بشرط ألا يؤدّي التغيير إلى نقص قيمة الأولويّة (قيمة أقلّ تعني أولويّة أكبر). بمعنى أنه يمكن للمستخدم تقليص استخدام عمليّاته للموارد إلا أنه لا يمكنه زيادتها.
</p>

<p>
	يحاول الأمر التالي تغيير قيمة أولويّة العمليّة ذات المعرّف <code>10079</code> إلى <code>1-</code>:
</p>

<pre class="ipsCode" id="ips_uid_4026_17">
$ renice -1 -p 10079</pre>

<p>
	إن أردنا تغيير جميع عمليّات المستخدم <code>academy</code> إلى نفس القيمة نطبّق الأمر كالتالي:
</p>

<pre class="ipsCode" id="ips_uid_4026_19">
# renice -1 -u academy
</pre>

<h3 id="إنهاء-عملية">
	إنهاء عملية
</h3>

<p>
	يُستخدَم الأمر <code>kill</code> لإنهاء العمليّات؛ إلا أن طريقة إنهاء العمليّة تختلف. ينهي الأمر <code>kill</code> العمليّة بإحدى طريقتيْن: إما أن يطلُب من العمليّة إنهاء مهامها (اجمعي أغراضك وانصرفي) أو يتولى هو المهمة بنفسه. إن لم نحدّد طريقة الإنهاء فسيستخدم الأمرُ الطريقةَ الأولى؛ لتحديد الطريقة الثانيّة نستخدم الخيّار <code>9-</code>. في الواقع، <code>9</code> هو معرّف إشارة يُرسلها النظام إلى العمليّة؛ وتتميّز بأنها إشارة لا يمكن للعمليّة تجاهلها (عكسَ الإشارة <code>15</code> اللطيفة المستخدَمة في طريقة الإنهاء الأولى).
</p>

<p>
	يوجد الأمر <code>pkill</code> الذي يعمل على إنهاء العمليّات بطريقة مشابهة للأمر <code>kill</code> مع فرق أن <code>kill</code> ينهي عمليّة (أو مجموعة عمليّات) بناء على المعرّف؛ في حين أن <code>pkill</code> يمكن أن يستخدم اسم العمليّة أو خاصيّات أخرى.
</p>

<p>
	استخدم أمر <code>pgrep</code> إن أردت عرض عمليّات توافق شروطا معينة؛ إن طبّقت أمر <code>pkill</code> على نفس الشروط فسينهي جميع العمليّات التي تنطبق عليها.
</p>

<p>
	في المثال التالي نطلُب إنهاء جميع عمليّات المستخدم <code>academy</code>:
</p>

<pre class="ipsCode" id="ips_uid_4026_21">
# pkill -u academy
</pre>

<p>
	إنهاء العمليّات ليس عمليّة هامشيّة؛ لذا من المستحسن عرض لائحة بالعمليّات التي ينطبق عليها الأمر أعلاه قبل تنفيذه: 
</p>

<pre class="ipsCode" id="ips_uid_4026_23">
# pgrep -l -u academy
</pre>

<p>
	يمكنك الحصول على مزيد من التفاصيل عن الأوامر <code>ps</code>، <code>kill</code> والإشارات Signals في مقال <a href="https://academy.hsoub.com/devops/linux/%D8%A5%D8%AF%D8%A7%D8%B1%D8%A9-%D8%A7%D9%84%D8%B9%D9%85%D9%84%D9%8A%D8%A7%D8%AA-process-%D9%81%D9%8A-%D9%84%D9%8A%D9%86%D9%83%D8%B3-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%A7%D9%84%D8%B7%D8%B1%D9%81%D9%8A%D8%A9-r70/" rel="">إدارة العمليات (Process) في لينكس باستخدام الطرفية</a>.
</p>

<p>
	ترجمة -وبتصرّف- للمقال <a href="http://www.tecmint.com/rhcsa-exam-boot-process-and-process-management/" rel="external nofollow">RHCSA Series: Process Management in RHEL 7: Boot, Shutdown, and Everything in Between – Part 5</a> لصاحبه Gabriel Cánepa.
</p>
]]></description><guid isPermaLink="false">740</guid><pubDate>Tue, 31 May 2016 06:14:52 +0000</pubDate></item><item><title>&#x645;&#x639;&#x627;&#x644;&#x62C;&#x629; &#x627;&#x644;&#x646;&#x635;&#x648;&#x635; &#x639;&#x644;&#x649; RedHat Enterprise Linux: &#x62A;&#x62D;&#x631;&#x64A;&#x631;&#x647;&#x627; &#x628;&#x640; Nano &#x648; Vim &#x648;&#x627;&#x644;&#x628;&#x62D;&#x62B; &#x641;&#x64A;&#x647;&#x627; &#x628;&#x640; grep</title><link>https://academy.hsoub.com/devops/linux/redhat/%D9%85%D8%B9%D8%A7%D9%84%D8%AC%D8%A9-%D8%A7%D9%84%D9%86%D8%B5%D9%88%D8%B5-%D8%B9%D9%84%D9%89-redhat-enterprise-linux-%D8%AA%D8%AD%D8%B1%D9%8A%D8%B1%D9%87%D8%A7-%D8%A8%D9%80-nano-%D9%88-vim-%D9%88%D8%A7%D9%84%D8%A8%D8%AD%D8%AB-%D9%81%D9%8A%D9%87%D8%A7-%D8%A8%D9%80-grep-r739/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2016_05/file-editors-vim-nano-redhat.png.d89066f9a4b95d2c06a646f63efe3b11.png" /></p>

<p>
	يعدّ التعامل مع الملفات النصيّة من المهامّ المتكرّرة التي على مدير النّظُم تنفيذها. تشمل هذه المهمّة التّعديل على الملفّات الموجودة (ملفات إعداد غالبا) أو إنشاء ملفّات جديدة. سنقدّم في هذا الدّرس البرنامجيْن الأكثر استخداما لتحرير الملفات النصيّة على RHEL (وتوزيعات لينكس عموما)؛ وهما Nano و Vim. يشتهر Nano بسهولة استخدامه، خصوصا بالنسبة للمبتدئين؛ فيما يتميّز Vim بإضافاته الفعّالة التي تجعل منه أكثر من مجرّد محرّر نصوص. لن ندخل في شرح المحرّر الذي يجب عليك اختيّاره؛ جرّب ثم اختر ما يناسبك.
</p>

<p style="text-align: center;">
	<img alt="file-editors-vim-nano-redhat.png" class="ipsImage ipsImage_thumbnailed" data-fileid="16915" data-unique="vhdwtp7f0" src="https://academy.hsoub.com/uploads/monthly_2016_05/file-editors-vim-nano-redhat.png.ace3554ad3b4cdd491f8da96e0d241e4.png"></p>

<h2 id="استخدام-nano-لتحرير-الملفات-النصية">
	استخدام Nano لتحرير الملفات النصية
</h2>

<p>
	يُستخدَم أمر <code>nano</code> لبدء تشغيل محرّر النصوص Nano. يمكن فتح ملفّ بتمرير مساره إلى الأمر؛ سيظهر محتوى الملفّ في هذا الحالة داخل المحرّر. إن لم يكن الملفّ موجودا فسيُنشئ المحرّر ملفا فارغا بنفس الاسم ويفتحه إلا أنه لن يُخزَّن إلا إذا طلبت ذلك من المحرّر (سنرى كيف في ما بعد). إن استُخدِم الأمر دون معطيات فسيظهر المحرّر بمحتوى فارغ.
</p>

<p style="text-align: center;">
	<img alt="01_nano_editor.png" class="ipsImage ipsImage_thumbnailed" data-fileid="16579" data-unique="c28mrdmov" src="https://academy.hsoub.com/uploads/monthly_2016_05/01_nano_editor.png.abee2bb21fc01624e36064de7cac32fb.png"></p>

<p>
	يظهر في أعلى المحرّر إلى اليسار رقم الإصدار وفي الوسط اسم الملفّ المفتوح أو صوان Buffer جديد (تخزين مؤقّت) إن نُفِّذ الأمر دون تمرير معطى. ثم تأتي منطقة تحرير النّص (بيضاء في الصّورة) وفي الأسفل أدوات للتحكّم. تظهر أدوات التحكّم على هيئة حرف تسبقه علامة <code>^</code> التي تشير إلى زرّ <code>Ctrl</code> في لوحة المفاتيح؛ أي أنه يجب الضّغط على زرّ <code>Ctrl</code> والحرف المشار إليه من أجل استعمال أداة التحكّم.
</p>

<p>
	أهم أدوات التحكم هي التالية:
</p>

<ul>
<li>
		<code>Ctrl+G</code>: تظهر صفحة المساعدة.
	</li>
	<li>
		<code>Ctrl+X</code>: تخرُج من المحرّر.
	</li>
	<li>
		<code>Ctrl+O</code>: تخزّن محتوى الملفّ.
	</li>
	<li>
		<code>Ctrl+J</code>: تسويّة محاذاة النّص.
	</li>
	<li>
		<code>Ctrl+R</code>: إدراج محتوى ملفّ بذكر مساره الكامل (المُطلَق) في الملفّ الحالي.
	</li>
	<li>
		<code>Ctrl+W</code>: البحث داخل الملفّ.
	</li>
	<li>
		<code>Ctrl + K</code>: يقصّ السطر الحالي.
	</li>
	<li>
		<code>Ctrl + U</code>: يُلصق المحتوى المقصوص.
	</li>
	<li>
		<code>Ctrl + C</code>: يُظهر وضعيّة المؤشر (السطر والعمود). إن طلبت من المحرّر عملية مثل الحفظ وأردت إلغاءها يمكن أيضا استخدام هذا الاختصار.
	</li>
	<li>
		يُستخدم الاختصاران <code>Ctrl+F</code> و <code>Ctrl+B</code> على التوالي لتقديم المؤشّر أو إرجاعه بحرف.
	</li>
	<li>
		يُستخدم الاختصاران <code>Ctrl+P</code> و <code>Ctrl+N</code> على التوالي للانتقال إلى الأعلى أو الأسفل؛ سطرا في كل مرة.
	</li>
	<li>
		يُستخدم الاختصاران <code>Ctrl+space</code> و<code>Alt+space</code> على التوالي لتقديم المؤشّر أو إرجاعه بكلمة.
	</li>
	<li>
		<code>Ctrl + _</code>: الانتقال إلى سطر وعمود تحدّدهما بالصّيغة <code>X,Y</code> حيث <code>X</code> رقم السّطر و<code>Y</code> رقم العمود.
	</li>
</ul>
<h2 id="استخدام-vim-لتحرير-الملفات-النصية">
	استخدام Vim لتحرير الملفات النصية
</h2>

<p>
	محرّر Vim هو نسخة محسَّنة من محرّر Vi؛ وهو محرّر نصوص مشهور الأنظمة الشبيهة بيونكس. يتميّز محرّر Vim بعمله حسب أوضاع Modes مختلفة:
</p>

<ul>
<li>
		<strong>وضع الأوامر: </strong> يُستخدَم لتصفّح الملف وتنفيذ أوامر عليه. تتكوّن الأوامر من حرف أو أكثر وهي حسّاسة لحالة الأحرف Case-sensitive. إن أردت إعادة تنفيذ أحد الأوامر عدّة مرات فيمكنك كتابة عدد المرات قبله (توجد بضعة استثناءات لهذه القاعدة). مثلا؛ ينسخ الأمرُ <span style="font-family:courier new,courier,monospace;"><code>yy</code></span> (أو <code>Y</code>) كامل السّطر الحالي وعند كتابة العدد <code>4</code> أمامه كالتالي <code>4yy</code> (أو <code>4Y</code>) فإنه ينسخ السّطر الحالي إضافة للأسطر الثلاثة الموالية (4 أسطر في المجموع).
	</li>
	<li>
		<strong>وضع <code>ex</code></strong>: يمكن في هذا الوضع تطبيق أوامر محرّر <code>ex</code> (محرّر نصوص يعمل على أنظمة يونكس) لتنفيذ عمليّات مثل حفظ الملفّ الحالي أو تنفيذ برنامج أو أمر خارجي. اضغط على زر <code>Exc</code> ثم أدخل نقطتين عموديّتيْن <code>:</code> إن أردت الوصول إلى وضع <code>ex</code> من وضع الأوامر؛ ثم اكتب بعدهما أمر <code>ex</code> الذي تودّ تنفيذه.
	</li>
	<li>
		<strong>وضع الإدخال</strong> : يُستخدم زر <code>i</code> للانتقال من وضع الأوامر إلى وضع الإدخال (كتابة نصّ). ينتج عن الضّغط على أزرار في لوحة المفاتيح أثناء وضع الإدخال ظهور النّص في المحرّر.
	</li>
	<li>
		تمكن دائما العودة إلى وضع الأوامر، مهما كان الوضع الذي توجد فيه، بالضّغط على زرّ <code>Esc</code>.
	</li>
</ul>
<p>
	نشغّل محرّر النصوص Vim بتنفيذ الأمر <code>vim</code> في سطر الأوامر. يكون المحرّر عند بدء تشغيله على وضع الأوامر.
</p>

<p>
	ننفّذ الأمر <code>help:</code> للحصول على المساعدة (لا تنس الضغط على زر <code>Enter</code> بعد كتابة الأمر ليُنفَّذ). يبدو المحرّر كالتالي بعد تنفيذ الأمر السابق.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="16580" href="https://academy.hsoub.com/uploads/monthly_2016_05/02_vim_editor_help.png.74b56cef1d2dde60dd7e9108c9cded1f.png" rel="external"><img alt="02_vim_editor_help.png" class="ipsImage ipsImage_thumbnailed" data-fileid="16580" data-unique="mxzi0y883" src="https://academy.hsoub.com/uploads/monthly_2016_05/02_vim_editor_help.thumb.png.2359c9925c0792aa2207e1394109c360.png"></a>
</p>

<p>
	تُقدّم صفحة المساعدة في الأعلى فهرسا بمحتوياتها على هيئة مقاطع مخصّصة حسب المواضيع. انتقل إلى الموضوع الذي ترغب في عرض معلومات عنه باستخدام الأسهم على لوحة المفاتيح ثم عند الوصول إلى اسم الموضوع في الفهرس اضغط على الزّريْن <code>[+Ctrl</code> لعرض محتويات المقطع المخصَّص للموضوع. يظهر في أسفل الشاشة اسم الملفّ الحالي.
</p>

<ul>
<li>
		إن أردت إغلاق الملف دون حفظ التعديلات نفّذ الأمر التالي:
		<pre class="ipsCode" id="ips_uid_9349_7">
:q!</pre>

		<p>
			يُستخدَم نفس الأمر أيضا للخروج من صفحة المساعدة.
		</p>
	</li>
	<li>
		<p>
			استخدم أحد الأوامر التاليّة لحفظ التعديلات على ملفّ:
		</p>

		<pre class="ipsCode" id="ips_uid_9349_9">
:wq!
:x!
ZZ</pre>

		<p>
			لاحظ ألا وجود للنقطتيْن في الأمر الأخير (<code>ZZ</code>).
		</p>
	</li>
	<li>
		استخدم الأمر <code>Ndd</code> أثناء وضع الأوامر لقصّ عدد <code>N</code> من الأسطر، ابتداءً من السّطر الحالي.
	</li>
	<li>
		استخدم الأمر <code>Myy</code> أثناء وضع الأوامر لنسخ عدد <code>M</code> من الأسطر، ابتداءً من السّطر الحالي.
	</li>
	<li>
		استخدم الأمر <code>p</code> للصق الأسطُر التي نسختها أو قصصتها سابقا.
	</li>
	<li>
		<p>
			يُستخدَم الأمر <code>r:</code> إن أردت إدراج محتوى ملف في الملفّ الحالي. إن أردنا مثلا إدراج محتوى الملف <code>etc/fstab/</code> في الملف الحالي ننفّذ الأمر كالتالي:
		</p>

		<pre class="ipsCode" id="ips_uid_9349_11">
:r /etc/fstab</pre>

		<p>
			يمكن أيضا إدراج نتيجة تنفيذ أمر من أوامر النّظام كالتالي:
		</p>
	</li>
</ul>
<pre class="ipsCode" id="ips_uid_9349_13">
:r! command</pre>

<p style="margin-right: 40px;">
	مثلا؛ لإضافة التاريخ والوقت في مكان المؤشّر نكتب:
</p>

<pre class="ipsCode" id="ips_uid_9349_15">
:r! date</pre>

<ul>
<li>
		تابع درس <a href="https://academy.hsoub.com/programming/workflow/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-vim-%D8%A7%D9%84%D8%AC%D8%B2%D8%A1-%D8%A7%D9%84%D8%A3%D9%88%D9%84-r71/" rel="">أساسيّات Vim</a> للمزيد حول الموضوع.
	</li>
</ul>
<h2 id="استخدام-أمر-grep-والتعابير-النمطية-regular-expressions">
	استخدام أمر grep والتعابير النمطية Regular expressions
</h2>

<p>
	يعد البحث في الملفات النصيّة من الأمور الاعتياديّة لأي مدير أنظمة. يكثُر استخدام أمر <code>grep</code> مع التعابير النمطيّة لهذا الغرض.
</p>

<p>
	التعابير النمطيّة (تُعرَف بـ <code>regex</code>أو <code>regexp</code>) هي طريقة للتعرّف على سلسلة محارف تتبع نمطا (صيغة أو هيئة) تُحدَّد بعبارة. سنعرض في ما يلي لأمثلة قاعديّة في التعامل مع التعابير النمطيّة؛ راجع مقال <a href="https://academy.hsoub.com/devops/linux/%D9%85%D9%82%D8%AF%D9%85%D8%A9-%D9%81%D9%8A-%D8%A7%D9%84%D8%AA%D8%B9%D8%A7%D8%A8%D9%8A%D8%B1-%D8%A7%D9%84%D9%86%D9%85%D8%B7%D9%8A%D8%A9-regular-expressions-r63/" rel=""> مقدمة في التعابير النمطية</a> لتفاصيل أكثر.
</p>

<ul>
<li>
		<p>
			نفرض مثلا أنك تريد التأكد من دعم معالجك للحوسبة الافتراضيّة Virtualization. يعني وجود سلسلة المحارف <code>svm</code>أو <code>vmx</code> في الملفّ <code>proc/cpuinfo/</code> أن المعالج يدعم التقنيّة المذكورة. نستخدم أمر <code>grep</code> كما يلي للبحث في الملف:
		</p>

		<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_2661_7">
<span class="pln">$ grep -i 'svm\|vmx' /proc/cpuinfo</span></pre>

		<p>
			تُستخدم العصى العموديّة <code>|</code> (تشير إلى العامل <strong>أو</strong> Or) للبحث عن توجد إحدى العبارتين <code>svm</code> أو <code>vmx</code>. يجب تخليص Escape العامل بـ<code>\</code> وإلا فإن أمر <code>grep</code> سيتعامل معه كمحرف عادي لا دلالة له وليس بوصفه عاملا. يطلُب الخيار <code>i-</code> من الأمر ألا يعتدّ بحالة الأحرف (كبيرة أو صغيرة).
		</p>
	</li>
</ul>
<p>
	يمكن باستخدام الخيّار <code>E-</code> تجاوز الحاجة لتخليص العوامل؛ ما يجعل الأمر يفسّرها مباشرة؛ يُكتَب الأمر السابق مثلا:
</p>

<pre class="ipsCode" id="ips_uid_9349_21">
$ grep -Ei 'svm|vmx' /proc/cpuinfo
</pre>

<ul>
<li>
		يمكن أن يكون التعبير النمطي عبارة عن مجال من خيارات توضَع بين معكوفين مربعين <code>[]</code>.
	</li>
</ul>
<p>
	يُقرأ التعبير النمطي <code>c[aeiou]t</code> مثلا: حرف <code>c</code>، يتبعه واحد من الأحرف التالية <code>aeiou</code> ثم حرف <code>t</code>. تُطابق الكلمات التاليّة هذا التعبير النمطي: <code>cat</code>، <code>cet</code>، <code>cot</code>، <code>cit</code> و<code>cut</code>. يمكن أيضا وضع مجال من الأحرف أو الأرقام بين المعكوفين؛ على سبيل المثال <code>[a-z]</code> و<code>[0-9]</code> يوافقان على التوالي أي حرف أبجدية لاتيني صغير Lowercase والأرقام من <code>0</code> إلى <code>9</code>. إن أردنا الإشارة إلى أن الحرف يمكن أن يتكرّر نضع عدد مرات التكرار بين معكوفين <code>{X}</code> بعد العبارة.
</p>

<p>
	يستخرج الأمر التالي معرّف جهاز التخزين من الملفّ <code>etc/fstab/</code>:
</p>

<pre class="ipsCode" id="ips_uid_9349_23">
$ grep -Ei '[0-9a-f]{8}-([0-9a-f]{4}-){3}[0-9a-f]{12}' -o /etc/fstab
</pre>

<p>
	نأخذ الجزء الأول من العبارة:
</p>

<pre class="ipsCode" id="ips_uid_9349_25">
[0-9a-f]{8}-
</pre>

<p>
	بمكن فهم الجزء كالتالي: لدينا ثماني خانات تتبعها خانة تاسعة توجد بها عارضة <code>-</code>. بالنسبة للخانات الثمانيّة فقيمة كل واحدة يمكن أن تكون إما رقما من بين الأرقام <code>0</code> إلى<code>9</code> أو حرفا من بين الأحرف <code>a</code> إلى <code>f</code>.<br>
	ينطبق نفس المبدأ على بقيّة أجزاء العبارة. يشير العدد بين معكوفين بعد الأقواس إلى أن عدد مرات تكرار الجزء الموجود بينها.<br>
	في المحصّلة: يمكن تقسيم العبارة إلى ثلاثة أجزاء:
</p>

<pre class="ipsCode" id="ips_uid_9349_27">
[0-9a-f]{8}-
([0-9a-f]{4}-){3}
[0-9a-f]{12}</pre>

<p>
	يتشابه الجزء الأول والأخير (الثالث) مع فرق ألا وجود لعارضة في الجزء الأخير وكونه مكونا من <code>12</code> محرفا؛ بدلا من <code>8</code> قبل العارضة في الجزء الأول. أما الجزء الثاني فهو مكوّن من ثلاثة أجزاء؛ وتمكن إعادة كتابته كالتالي:
</p>

<pre class="ipsCode" id="ips_uid_9349_29">
[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-
</pre>

<p>
	يطلُب الخيار <code>o-</code> من الأمر طباعة جزء الملف المطابق للعبارة دون غيره.
</p>

<h3 id="الأنماط-المعرفة-مسبقا">
	الأنماط المعرَّفة مسبقا
</h3>

<p>
	توجد تعابير نمطيّة معرّفة مسبقا؛ وفي ما يلي أهمها:
</p>

<center>
	<table border="1"><tbody>
<tr>
<th style="padding: 5px 10px; background-color: #ecf0f1">
					النمط                     
				</th>
				<th style="padding: 5px 10px; background-color: #ecf0f1">
					المعنى
				</th>
			</tr>
<tr>
<td style="padding: 5px 10px;">
					<code>[[:alnum:]]</code>
				</td>
				<td style="padding: 5px 10px;">
					جميع الحروف اللاتينية (الصغيرة والكبيرة) إضافة للأرقام من 0 إلى 9
				</td>
			</tr>
<tr>
<td style="padding: 5px 10px;">
					<code>[[:alpha:]] </code>
				</td>
				<td style="padding: 5px 10px;">
					أي حرف لاتيني، صغيرا كان أم كبيرا
				</td>
			</tr>
<tr>
<td style="padding: 5px 10px;">
					<code>[[:blank:]]</code>
				</td>
				<td style="padding: 5px 10px;">
					مسافة أو علامة الجدولة Tabulation
				</td>
			</tr>
<tr>
<td style="padding: 5px 10px;">
					<code>[[:digit:]]</code>
				</td>
				<td style="padding: 5px 10px;">
					أي رقم من 0 إلى 9
				</td>
			</tr>
<tr>
<td style="padding: 5px 10px;">
					<code>[[:lower:]]</code>
				</td>
				<td style="padding: 5px 10px;">
					أي حرف لاتيني صغير
				</td>
			</tr>
<tr>
<td style="padding: 5px 10px;">
					<code>[[:space:]]</code>
				</td>
				<td style="padding: 5px 10px;">
					مساحة
				</td>
			</tr>
<tr>
<td style="padding: 5px 10px;">
					<code>[[:punct:]] </code>
				</td>
				<td style="padding: 5px 10px;">
					علامات التنقيط
				</td>
			</tr>
<tr>
<td style="padding: 5px 10px;">
					<code>[[:upper:]] </code>
				</td>
				<td style="padding: 5px 10px;">
					أي حرف لاتيني كبير
				</td>
			</tr>
<tr>
<td style="padding: 5px 10px;">
					<code>[:word:] </code>
				</td>
				<td style="padding: 5px 10px;">
					جميع الأحرف اللاتينية، الأرقام من 0 إلى 9 أو عارضة سفليّة <code>_</code> Underscore
				</td>
			</tr>
</tbody></table>
</center>

<p>
	يطبع الأمر التالي جميع أسطر الملفّ <code>etc/passwd/</code>التي تحوي سلسلة من أربعة أرقام: 
</p>

<pre class="ipsCode" id="ips_uid_9349_31">
$ grep -Ei [[:digit:]]{4} /etc/passwd
</pre>

<p>
	ترجمة -وبتصرّف- للمقال <a href="http://www.tecmint.com/rhcsa-exam-how-to-use-nano-vi-editors/" rel="external nofollow">RHCSA Series: Editing Text Files with Nano and Vim / Analyzing text with grep and regexps – Part 4</a> لصاحبه Gabriel Cánepa.
</p>
]]></description><guid isPermaLink="false">739</guid><pubDate>Sat, 28 May 2016 07:13:34 +0000</pubDate></item><item><title>&#x625;&#x62F;&#x627;&#x631;&#x629; &#x627;&#x644;&#x645;&#x633;&#x62A;&#x62E;&#x62F;&#x645;&#x64A;&#x646; &#x648;&#x627;&#x644;&#x645;&#x62C;&#x645;&#x648;&#x639;&#x627;&#x62A; &#x639;&#x644;&#x649; Red Hat Enterprise Linux</title><link>https://academy.hsoub.com/devops/linux/redhat/%D8%A5%D8%AF%D8%A7%D8%B1%D8%A9-%D8%A7%D9%84%D9%85%D8%B3%D8%AA%D8%AE%D8%AF%D9%85%D9%8A%D9%86-%D9%88%D8%A7%D9%84%D9%85%D8%AC%D9%85%D9%88%D8%B9%D8%A7%D8%AA-%D8%B9%D9%84%D9%89-red-hat-enterprise-linux-r738/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2016_05/rhcsa-users-groups.png.d736aacf2ff211156f5d3300afc3e955.png" /></p>

<p>
	تتطلّب إدارة خادوم Red Hat Enterprise Linux، مثل أي خادوم عموما، معرفة كيفيّة إضافة حسابات المستخدمين، تعديلها، تعليقها أو حذفها. ستحتاج أيضا خلال إدارة الخادوم لمعرفة كيف تمنح المستخدمين الصّلاحيات الضروريّة على الملفات، المجلّدات وموارد النّظام الأخرى حتى يتمكنوا من إنجاز مهامهم.
</p>

<p style="text-align: center;">
	<img class="ipsImage ipsImage_thumbnailed" data-fileid="16819" data-unique="pxzxrq323" src="https://academy.hsoub.com/uploads/monthly_2016_05/rhcsa-users-groups.png.ce72abbdc94c04c682bb2390f0fb6ffc.png" alt="rhcsa-users-groups.png"></p>

<h2 id="إدارة-حسابات-المستخدمين">
	إدارة حسابات المستخدمين
</h2>

<p>
	تحتاج حتى تتمكّن من إدارة المستخدمين أن تكون لديك صلاحيّات المدير الأعلى (الجذر <code>root</code>). لذا سنبدأ بالانتقال إلى المستخدم الجذر بتنفيذ الأمر:
</p>

<pre class="ipsCode" id="ips_uid_281_7">
$ su -
Password: 
Last login: Wed May 11 12:58:50 GMT 2016 on pts/0
[root@localhost ~]#</pre>

<p>
	يُستخدَم الأمر <code>su</code> للتبديل بين حسابات المستخدمين؛ وعند تمرير المعطى <code>-</code> له فسينتقل للحساب الجذر بعد طلب كلمة السّر.
</p>

<p>
	<strong>ملحوظة</strong> تشير العلامة <code>#</code> أمام الأمر إلى أنه يُنفَّذ من الحساب الجذر.
</p>

<h3 id="إضافة-مستخدم-جديد">
	إضافة مستخدم جديد
</h3>

<p>
	يُستخدَم الأمران التاليان لإضافة حساب مستخدِم جديد:
</p>

<pre class="ipsCode" id="ips_uid_281_9">
# adduser username
# useradd username</pre>

<p>
	حيثُ <code>username</code> هو اسم الحساب الجديد.
</p>

<p>
	<strong>ملحوظة 1:</strong> إن كانت لديك تجربة سابقة مع توزيعات دبيانيّة (أوبونتو مثلا) فـ <code>adduser</code> هناك مختلف عنه هنا. الأمر <code>adduser</code> في RHEL (والتوزيعات المبنيّة على ردهات عموما) هو مجرّد وصلة رمزيّة للأمر <code>useradd</code>؛ بينما هو سكربت منفصل في دبيان؛ ولكنّه يعتمد على <code>useradd</code> وأوامر أخرى.
</p>

<p>
	<strong>ملحوظة 2:</strong> ستحتاج أولا لتعيين كلمة سرّ للحساب قبل التمكن من البدء في استخدامه (سنرى كيف ذلك بعد قليل).
</p>

<p>
	ينفّذ النظام المهامّ التاليّة عند إضافة مستخدم جديد:
</p>

<ul>
<li>
		إنشاء مجلّد شخصي للمستخدِم (مبدئيا على المسار <code>home/username/</code> ما لم يُطلب منه غير ذلك).
	</li>
	<li>
		تُنسَخ الملفات <code>bash_logout.</code> و<code>bash_profile.</code> و<code>bashrc.</code> (وهي ملفات مخفيّة) إلى المجلّد الشخصي للمستخدِم. تُستعمَل هذه الملفات لضبط الإعدادات الخاصّة بجلسة Session المستخدم.
	</li>
	<li>
		إنشاء مجلّد خاص بمسلَك بريد Mail spool المستخدِم.
	</li>
	<li>
		إنشاء مجموعة مستخدمين بنفس اسم الحساب وإضافته إليها.
	</li>
</ul>
<p>
	<strong>ملحوظة:</strong> مسلك البريد هو ملفّ يخزّن رأسيات البريد (مثل عنوان المُرسِل، تاريخ التسليم، … إلخ) ومحتوياته. يوجد على المسار <code>/var/spool/mail/</code> مجلّد فرعي لكلّ مستخدم على النّظام. يستخدم بعض عملاء البريد هذا المجلّد بينما لا يستخدمه البعض الآخر.
</p>

<p>
	يُخزّن النظام معلومات عامّة عن جميع الحسابات في الملف <code>etc/passwd/</code>. توجد في هذا الملفّ أسطُر يمثّل كل واحد منها سجلّا لحساب مستخدِم. يأخذ كلّ سطر الصّيغة التاليّة:
</p>

<pre class="ipsCode" id="ips_uid_281_11">
[username]:[x]:[UID]:[GID]:[Comment]:[Home directory]:[Default shell]</pre>

<p>
	السّطر مكوّن من حقول تفصل نقطتان <code>:</code> بين كل حقلين.
</p>

<ul>
<li>
		يضمّ الحقل الأول <code>[username]</code> اسمَ الحساب.
	</li>
	<li>
		يشير الحقل الثاني <code>[x]</code> إلى أن الحساب محميّ بكلمة سرّ توجد معمّاةً Encrypted في الملفّ (<code>etc/shadow/</code>).
	</li>
	<li>
		يوجد في الحقليْن الثالث والرابع (<code>[UID]</code> و<code>[GID]</code>) على التوالي معرّف المستخدِم ومعرّف المجموعة الأوليّة Primary group التي ينتمي إليها.
	</li>
	<li>
		الحقل الخامس <code>[Comment]</code> هو تعليق حول الحساب؛ يوضع فيه عادة وصفٌ للحساب وعمله.
	</li>
	<li>
		يعرّف الحقل السادس <code>[Home directory]</code> المسار المُطلق لمجلد المستخدِم الشخصي.
	</li>
	<li>
		يحدّد الحقل السابع الأخير <code>[Default shell]</code> الصّدفة Shell التي تُسنَد للمستخدِم بعد ولوجه إلى النظام.
	</li>
</ul>
<p>
	يوجد ملفّ آخر يشبه <code>etc/passwd/</code> من المهمّ التعوّد عليه وهو <code>etc/group/</code>. يحتفظ النظام في هذا الملفّ بمعلومات مجموعات المستخدِمين، سطر لكلّ مجموعة. صيغة السّطر هي كالتالي:
</p>

<pre class="ipsCode" id="ips_uid_281_13">
[Group name]:[Group password]:[GID]:[Group members]</pre>

<ul>
<li>
		يحدّد الحقل الأول <code>[Group name]</code> اسم المجموعة.
	</li>
	<li>
		يُخصّص الحقل الثاني <code>[Group password]</code> لكلمة سر المجموعة في حال وجودها. توجد غالبا علامة <code>x</code> في هذا الحقل دلالةً على عدم وجود كلمة سر.
	</li>
	<li>
		الحقل الثالث <code>[GID]</code> مطابق للحقل الرابع <code>[GID]</code> في ملف <code>etc/passwd</code>.
	</li>
	<li>
		يقدّم الحقل الرابع <code>[Group members]</code> لائحة بالمستخدمين المنضوين تحت هذه المجموعة. يفصل بين أسماء الحسابات بفاصلة <code>,</code>.
	</li>
</ul>
<h3 id="تعيين-كلمة-سر-للمستخدم">
	تعيين كلمة سر للمستخدم
</h3>

<p>
	يبقى الحساب المنشَأ حديثا بالأمر <code>useradd</code> (أو <code>adduser</code>) معطّلا إلى أن نعيّن له كلمة سرّ؛ نستخدم أمر <code>passwd</code> لهذا الغرض:
</p>

<pre class="ipsCode" id="ips_uid_281_15">
# passwd username
</pre>

<p>
	سيُطلب منك إدخال كلمة سر للحساب ثم تكرارها؛ كما في المثال التالي:
</p>

<pre class="ipsCode" id="ips_uid_281_17">
# useradd academy
# passwd academy
Changing password for user academy.
New password: 
Retype new password: 
passwd: all authentication tokens updated successfully.</pre>

<h3 id="طلب-تغيير-كلمة-السر-عند-أول-دخول">
	طلب تغيير كلمة السر عند أول دخول
</h3>

<p>
	يدير الأمر <code>chage</code> معلومات تاريخ الحساب مثل عدد الأيام التي يجب بعدها تغيير كلمة سرّ الحساب وتاريخ آخر تغيير لكلمة السّر. يحدّد الخيّار <code>d-</code>، إذا ذُكر بعده تاريخٌ بالصيغة <code>YYYY-MM-DD</code>، تاريخ آخر مرة غُيِّرت فيها كلمة السّر؛ أما إذا ذكر بعده عدد فيفترض أن آخر تعديل تمّ بعد تاريخ 1 يناير 1970 بهذا العدد من الأيام (<code>chage -d 1</code> تعني أن التعديل كان يوم 2 يناير 1970، <code>chage -d 2</code> تعني أن التعديل كان يوم 3 يناير 1970 وهكذا). يفرض تمريرُ القيمة <code>0</code> للخيّار <code>d-</code> مع الأمر <code>chage</code> على المستخدِم تغيير كلمة السّر بعد الولوج إلى الحساب.
</p>

<p>
	نعدّل في المثال التالي تاريخ التعديل الأخير لكلمة السّر ثم نحاول الدخول إلى الحساب <code>academy</code> بكلمة السّر التي عيّناها في الفقرة السابقة (اخرج من الحساب الجذر إن سبق لك تسجيل الدّخول به؛ واستخدم حسابا عاديًّا بعد تنفيذ الأمر <code>chage</code>):
</p>

<pre class="ipsCode" id="ips_uid_281_19">
# chage -d 0 academy
# exit
logout
$ su academy
Password: 
You are required to change your password immediately (root enforced)
Changing password for academy.
(current) UNIX password:
New password: 
Retype new password: 
$</pre>

<p>
	ننتقل بالأمر <code>su</code> لاستخدام اسم الحساب الممرّر له (<code>academy</code> في حالتنا)؛ ستُطلب منا كلمة السّر التي عيناها سابق ثم بعد الولوج تظهر رسالة تطلب منا تعديل كلمة السّر. ندخل كلمة السر الحالية للاستمرار ثم نختار كلمة سر جديدة ونكرّرها.
</p>

<h3 id="التعديل-على-الحساب">
	التعديل على الحساب
</h3>

<p>
	يمكن بعد إضافة مستخدم تعديل حسابه في أي وقت بالأمر <code>usermod</code>:
</p>

<pre class="ipsCode" id="ips_uid_281_21">
# usermod options username</pre>

<p>
	تحدّد خياراتٌ <code>options</code> سلوك الأمر و <code>username</code> الحساب الذي تُطبَّق عليه.
</p>

<h3 id="تحديد-تاريخ-انتهاء-صلاحية-لحساب-مستخدم">
	تحديد تاريخ انتهاء صلاحيّة لحساب مستخدِم
</h3>

<p>
	يتيح خيّار <code>expiredate--</code> عند استخدامه مع الأمر <code>usermod</code> تحديد تاريخ يُعطَّل بعده الحساب.
</p>

<p>
	ننتقل في المثال التالي إلى استخدام الحساب الإداري (الجذر <code>root</code>)، ثم ننشئ حسابا جديدا باسم <code>academy1</code>:
</p>

<pre class="ipsCode" id="ips_uid_281_24">
$ su -
Password: 
# useradd academy1</pre>

<p>
	يمكننا إظهار معلومات تاريخ الحساب بالأمر التالي:
</p>

<pre class="ipsCode" id="ips_uid_281_26">
# chage -l academy1
Last password change                    : May 11, 2016
Password expires                    : never
Password inactive                   : never
Account expires                     : never
Minimum number of days between password change      : 0
Maximum number of days between password change      : 99999
Number of days of warning before password expires   : 7</pre>

<p>
	نلاحظ أن قيمة <code>Account expires</code> ( انتهاء صلاحيّة الحساب) هي <code>never</code> أي أنه لا يوجد تاريخ انتهاء صلاحيّة. نستخدم الخيار <code>expiredate--</code> مع الأمر <code>usermod</code> لتحديد تاريخ انتهاء صلاحية للحساب <code>academy1</code> ثم نعرض معلومات عمر الحساب من جديد:
</p>

<pre class="ipsCode" id="ips_uid_281_28">
# usermod --expiredate=2016-06-01 academy1
# chage -l academy1
Last password change                    : May 11, 2016
Password expires                    : never
Password inactive                   : never
Account expires                     : Jun 01, 2016
Minimum number of days between password change      : 0
Maximum number of days between password change      : 99999
Number of days of warning before password expires   : 7</pre>

<p>
	لاحظ تغيّر قيمة <code>Account expires</code>.
</p>

<h3 id="إضافة-مستخدم-إلى-مجموعة-ثانية">
	إضافة مستخدم إلى مجموعة ثانية
</h3>

<p>
	يُستخدم الخياران <code>aG-</code> مع الأمر <code>usermod</code> لإضافة مستخدم موجود إلى مجموعة أخرى غير المجموعة الأوليّة. ننشئ في المثال التالي مجموعة باسم <code>hsoub</code> ثم نضيف إليها المستخدم <code>academy</code>:
</p>

<pre class="ipsCode" id="ips_uid_281_30">
# groupadd hsoub
# usermod -aG hsoub academy</pre>

<p>
	لاحظ أن اسمَ المجموعة يسبق اسم الحساب. يمكن التأكد من إضافة الحساب إلى المجموعة بعرض المجموعات التي ينتمي إليها الحساب <code>academy</code> كالتالي:
</p>

<pre class="ipsCode" id="ips_uid_281_32">
# groups academy
academy : academy hsoub</pre>

<p>
	أي أن الحساب <code>academy</code> ينتمي إلى المجموعتيْن <code>academy</code> (المجموعة الأوليّة) و<code>hsoub</code>.
</p>

<h3 id="حذف-مستخدم-من-مجموعة">
	حذف مستخدم من مجموعة
</h3>

<p>
	إن أردت حذف مستخدم من جميع المجموعات الثانويّة وإبقاء الأوليّة فقط فيمكن ذلك على النحو التالي:
</p>

<pre class="ipsCode" id="ips_uid_281_34">
# usermod -G "" academy
# groups academy
academy : academy</pre>

<p>
	إن كان المستخدم عضوا في أكثر من مجموعة ثانويّة فيمكن حذفه من بعضها بذكر تلك التي ينتمي إليها فقط مع الخيّار <code>G-</code>. مثلا ينتمي العضو <code>academy</code> للمجموعات <code>hsoub2</code>، <code>hsoub1</code> و<code>hsoub3</code>، ونريد حذفه من <code>hsoub2</code>؛ ننفذ الأمر كالتالي:
</p>

<pre class="ipsCode" id="ips_uid_281_36">
# usermod -G hsoub1,hsoub3 academy</pre>

<h3 id="تعديل-المسار-المبدئي-لمجلد-المستخدم-أو-الصدفة-المسندة-إليه">
	تعديل المسار المبدئي لمجلّد المستخدم أو الصّدفة المسندة إليه
</h3>

<p>
	استخدم الخيار <code>d-</code> متبوعا بمسار تريده مع الأمر <code>usermod</code> إن أردت تغيير مكان المجلّد الشّخصي للمستخدِم. 
</p>

<pre class="ipsCode" id="ips_uid_281_38">
# usermod -d /home/test academy
</pre>

<p>
	نفس المبدأ مع الصّدفة المبدئية (<code>bash</code>)؛ استخدم الخيار <code>shell--</code> متبوعا بمسار صدفة أخرى (<code>sh</code> مثلا): 
</p>

<pre class="ipsCode" id="ips_uid_281_40">
# usermod --shell /bin/sh academy
</pre>

<h3 id="قفل-كلمة-المرور">
	قفل كلمة المرور
</h3>

<p>
	يمكن باستخدام الخيّار <code>L-</code> مع الأمر <code>usermod</code> قفل كلمة سر المستخدم وبالتالي منعه من الدخول إلى الحساب وتعطيله: 
</p>

<pre class="ipsCode" id="ips_uid_281_42">
# usermod -L academy
</pre>

<p>
	إن جرّبت الآن الدخول إلى الحساب <code>academy</code> (بعد الخروج من الحساب الجذر) فستظهر رسالة بوجود خطأ في عمليّة الاستيثاق:
</p>

<pre class="ipsCode" id="ips_uid_281_44">
$ su academy
Password: 
su: Authentication failure</pre>

<p>
	عد إلى الحساب الجذر واستخدم الخيّار <code>U-</code> لإلغاء قفل كلمة المرور وتفعيل الحساب.
</p>

<pre class="ipsCode" id="ips_uid_281_46">
# usermod -U academy</pre>

<p>
	يمكن الآن الدخول إلى الحساب <code>academy</code>.
</p>

<h3 id="حذف-مجموعة-أو-مستخدم">
	حذف مجموعة أو مستخدِم
</h3>

<p>
	استخدِم الأمر <code>groupdel</code> لحذف مجموعة مستخدمين. بالنسبة لحساب مستخدم فالأمر المستخدَم هو <code>userdel</code> (إضافة الخيار <code>r-</code> تحذف أيضا محتوى المجلد الشخصي ومسلك البريد).
</p>

<pre class="ipsCode" id="ips_uid_281_48">
# groupdel group_name
# userdel -r user_name</pre>

<h2 id="إدارة-أذونات-permissions-المستخدمين">
	إدارة أذونات Permissions المستخدمين
</h2>

<p>
	يعدّ أمر <code>ls</code> أحد أكثر الأوامر استخداما أثناء إدارة الخواديم. استخدم الخيّار <code>l-</code> مع <code>ls</code> لسرد قائمة مفصّلة بمحتويات مجلّد. يمكن أيضا تطبيق الأمر على ملفّ واحد لعرض تفاصيله. تظهر عند استخدام الأمر <code>ls -l</code> خاصيّات الملفّ ومن بينها وضعه Mode الذي يوجد في بداية كل مُخرَج؛ وهو مكون من عشرة محارف.
</p>

<p>
	يحدّد المحرف الأول نوع الملف ويمكن أن يأخذ إحدى القيم التالية:
</p>

<ul>
<li>
		<code>-</code>: ملفّ عادي.
	</li>
	<li>
		<code>d</code>: مجلّد.
	</li>
	<li>
		<code>l</code>: وصلة رمزيّة.
	</li>
	<li>
		<code>c</code>: جهاز طرفيّ محرفي Character device (يعالج تدفق البيانات محرفا محرفا؛ مثل الطرفيّة).
	</li>
	<li>
		<code>b</code>: جهاز طرفيّ كتليّ Block device (يعالج البيانات على كتل، مثل وسائط التخزين).
	</li>
</ul>
<p>
	تحدّد المحارف التسعة التاليّة الأذونات المطبّقة على الملفّ. تُقسّم المحارف التسعة إلى ثلاث مجموعات، تحوي كل مجموعة ثلاثة محارف. تمثّل المحارف الثلاثة أذونات الملف وهي، من اليسار إلى اليمين، القراءة (<code>r</code>)، الكتابة (<code>w</code>) والتنفيذ (<code>x</code>). تشير المجموعات الثلاثة على التوالي (من اليسار إلى اليمين) إلى أذونات المستخدِم صاحب الملفّ (user, <code>u</code>)، مجموعة المستخدمين مالكة الملفّ (Group, <code>g</code>) وبقيّة المستخدمين (Other, <code>o</code>). يظهر الحرف الموافق للإذن إذا كان الإذن معيّنا وإلا تظهر مكانه علامة <code>-</code>.
</p>

<p>
	راجع المقالات التاليّة لمزيد من التفاصيل عن أذونات المستخدمين:
</p>

<ul>
<li>
		<a href="https://academy.hsoub.com/devops/linux/%D9%85%D8%A8%D8%A7%D8%AF%D8%A6-%D8%A3%D8%B0%D9%88%D9%86%D8%A7%D8%AA-%D8%A7%D9%84%D9%85%D9%84%D9%81%D8%A7%D8%AA-file-permissions-%D8%B9%D9%84%D9%89-%D9%84%D9%8A%D9%86%D9%83%D8%B3-r242/" rel="">مبادئ أذونات الملفات (File permissions) على لينكس</a>.
	</li>
	<li>
		<a href="https://academy.hsoub.com/devops/linux/%D9%85%D9%82%D8%AF%D9%85%D8%A9-%D8%A5%D9%84%D9%89-%D8%A3%D8%B0%D9%88%D9%86%D8%A7%D8%AA-%D9%84%D9%8A%D9%86%D9%83%D8%B3-linux-permissions-r25/" rel="">مقدمة إلى أذونات لينكس Linux Permissions</a>.
	</li>
</ul>
<p>
	يُستخدَم الأمر <code>chmod</code> لتغيير أذونات الملفّ كالتالي: 
</p>

<pre class="ipsCode" id="ips_uid_281_50">
# chmod new_mode file
</pre>

<p>
	حيث <code>new_mode</code> رمز عددي أو عبارة تحدّد الأذون الجديدة.
</p>

<p>
	يُحسَب الرمز العددي بناء على المكافئ العددي لكلّ إذن (<code>4</code> للقراءة، <code>2</code> للكتابة و<code>1</code> لإذن التنفيذ، و<code>0</code> عند غياب الإذن) حيثُ تجمع المكافئات بالنسبة لصاحب الملفّ، المجموعة المالكة للملف وبقيّة المستخدمين.
</p>

<p style="text-align: center;">
	<img alt="01_file_permissions.png" class="ipsImage ipsImage_thumbnailed" data-fileid="16357" data-unique="yloyg53ra" src="https://academy.hsoub.com/uploads/monthly_2016_05/01_file_permissions.png.aa4506dcbfc169cf573cfd32675bf35f.png"></p>

<p>
	توضّح الصورة أعلاه مثالا على حساب الرمز العددي للإذن: توجد ثلاثة مجموعات كلّ واحدة مكوّنة من ثلاثة محارف. تشير المجموعة الأولى ابتداءً من اليسار لأذون مالك الملفّ، الثانيّة لأذون المجموعة والثالثة لأذون بقيّة المستخدمين. تشير المحارف في كلّ مجموعة لإذن معيّن: القراءة (المحرف الأول في كلّ مجموعة من اليسار)، الكتابة (المحرف الثاني) والتنفيذ (المحرف الثالث). إذا كان الإذن موجودا يُشار إليه بالحرف الموافق (<code>w</code>، <code>r</code> أو <code>x</code>) وإلا توضع مكانه علامة <code>-</code>. للحصول على الرمز العددي نجمع المكافئات بالنسبة لكل مجموعة ثم نضعها معا بالترتيب المذكور: المستخدم صاحب الملف في اليسار، المجموعة في الوسط وبقية المستخدمين على اليمين.
</p>

<p>
	نستخدم أمر <code>chmod</code> لتعيين الأذون الجديدة. ننشئ في المثال التالي ملفّا باسم <code>myfile</code> ثم نعرض معلوماته، نلاحظ أن الأذون هي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_281_54">
<span class="pln">rw-rw-r--</span></pre>

<p>
	والرمز العددي الموافق لها هو <code>664</code>. ثم نستخدم أمر <code>chmod</code> لتعيين الأذون الجديدة باستخدام الرمز <code>744</code> وفي الأخير نعرض معلومات الملفّ من جديد ونلاحظ التغيّر.
</p>

<pre class="ipsCode" id="ips_uid_281_56">
$ touch myfile
$ ls -l myfile 
-rw-rw-r--. 1 academy academy 0 May 11 14:55 myfile
$ chmod 744 myfile 
$ ls -l myfile 
-rwxr--r--. 1 academy academy 0 May 11 14:55 myfile</pre>

<h3 id="تعيين-إذن-لجميع-المستخدمين">
	تعيين إذن لجميع المستخدمين
</h3>

<p>
	يمكنك جعل إذن على ملف متاحا لجميع المستخدمين (صاحب الملف، المجموعة والبقيّة) بالأمر <code>chmod</code>. نفرض مثلا أن لديك سكربت تريد إتاحة إمكانية تنفيذه للجميع؛ استخدم الأمر <code>chmod</code> كالتالي: 
</p>

<pre class="ipsCode" id="ips_uid_281_58">
# chmod a+x script.sh
</pre>

<p>
	يُقرأ الأمر "امنح الإذن <code>x</code> (التنفيذ) لجميع المستخدمين <code>a</code>". يمكن أيضا استخدام نفس الطريقة مع المستخدم مالك الملف، المجموعة أو بقية المستخدمين:
</p>

<ul>
<li>
		امنح إذن الكتابة <code>w</code> للمستخدم صاحب الملف <code>o</code>:
	</li>
</ul>
<pre class="ipsCode" id="ips_uid_281_60">
# chmod o+w script.sh</pre>

<ul>
<li>
		امنح إذن القراءة <code>r</code> للمجموعة <code>g</code>:
	</li>
</ul>
<pre class="ipsCode" id="ips_uid_281_62">
# chmod g+r script.sh</pre>

<ul>
<li>
		امنح أذون القراءة <code>r</code>، الكتابة <code>w</code> والتنفيذ <code>x</code> للمجموعة:
	</li>
</ul>
<pre class="ipsCode" id="ips_uid_281_64">
# chmod g+rwx script.sh</pre>

<ul>
<li>
		أما إذا أردنا نزع الإذن فنستخدم علامة <code>-</code> بدلا من <code>+</code> كالتالي:
	</li>
</ul>
<pre class="ipsCode" id="ips_uid_281_66">
# chmod o-r script.sh</pre>

<h3 id="تغيير-ملكية-ملف">
	تغيير ملكية ملف
</h3>

<p>
	يظهر عند سرد ملفات مجلّد أو تفاصيل ملفّ (بأمر <code>ls -l</code>) المستخدِم صاحب الملف والمجموعة التي ينتمي إليها. مثلا:
</p>

<pre class="ipsCode" id="ips_uid_281_68">
$ cd 
$ ls -la
total 60
drwx------. 16 academy academy 4096 May 11 20:36 .
drwxr-xr-x. 11 root  root  4096 May 11 12:59 ..
drwxr-xr-x. 2 academy academy  6 Apr 15 00:42 Desktop
drwxr-xr-x. 2 academy academy  6 Apr 15 00:42 Documents
drwxr-xr-x. 2 academy academy  6 Apr 15 00:42 Downloads
drwxrwxr-x. 2 academy academy  6 Apr 27 20:51 folder
drwxrwxr-x. 2 academy academy 38 Apr 29 17:08 links_folder
drwxr-xr-x. 2 academy academy  6 Apr 15 00:42 Music
-rwxr--r--. 1 academy academy  0 May 11 14:55 myfile
drwxr-xr-x. 2 academy academy  6 Apr 15 00:42 Pictures
drwxr-xr-x. 2 academy academy  6 Apr 15 00:42 Public
drwxr-xr-x. 2 academy academy  6 Apr 15 00:42 Templates
drwxr-xr-x. 2 academy academy  6 Apr 15 00:42 Videos</pre>

<p>
	انتقلنا في المثال أعلاه إلى المجلّد الشخصي للمستخدم الحالي (بتنفيذ أمر <code>cd</code> دون معطيات) ثم سردنا محتويات المجلّد بالأمر <code>ls -la</code>. يطلُب الخيّار <code>a-</code> من الأمر إظهار جميع المحتويات بما فيها الملفات المخفيّة (التي يبدأ اسمها بنقطة <code>.</code>). يظهر اسم المستخدم مالك الملف في العمود الثالث واسم المجموعة في العمود الرابع (جميع الملفات الظاهرة في نتيجة الأمر تعود للمستخدم <code>academy</code> والمجموعة <code>academy</code> ما عدا المجلّد <code>..</code> الذي يشير إلى المجلّد الأعلى من المجلّد الحالي في البنية الشجرية والذي يملكه المستخدم والمجموعة <code>root</code>).
</p>

<p>
	نستخدم الأمر <code>chown</code> لتغيير ملكيّة ملفّ. يمكن تغيير المستخدم المالك والمجموعة في نفس الوقت أو كلّ على حدة.
</p>

<ul>
<li>
		تغيير المستخدم المالك والمجموعة معا (لاحظ وجود النقطتين في الأمر):
	</li>
</ul>
<pre class="ipsCode" id="ips_uid_281_70">
# chown user:group file</pre>

<ul>
<li>
		تغيير المستخدم المالك دون تغيير المجموعة:
	</li>
</ul>
<pre class="ipsCode" id="ips_uid_281_72">
# chown user: file</pre>

<ul>
<li>
		تغيير المجموعة المالكة دون تغيير المستخدِم:
	</li>
</ul>
<pre class="ipsCode" id="ips_uid_281_74">
# chown :group file</pre>

<h3>
	نسخ أذون ملف وتطبيقها على آخر
</h3>

<p>
	إن أردت جعل أذون ملف مطابقة تماما لأذون ملفّ آخر فيمكنك استخدام الخيّار <code>reference--</code>مع الأمر <code>chown</code> على النحو التالي:
</p>

<pre class="ipsCode" id="ips_uid_281_76">
# chown --reference=ref_file file</pre>

<p>
	حيث <code>ref_file</code> هو الملف المرجِع و<code>file</code> الملف الذي تريد نسخ الأذون إليه. يؤدي الأمر أيضا إلى تغييرملكيّة الملف <code>file</code>.
</p>

<h3 id="إعداد-الخيار-الخاص-بضبط-معرف-المجموعة-setgid">
	إعداد الخيار الخاص بضبط معرف المجموعة setgid
</h3>

<p>
	صُمِّم خيار <code>setgid</code> لإتاحة إمكانية الوصول إلى ملفّ بصلاحيات مجموعة المستخدمين المالكة للملف بغضّ النظر عن المستخدِم الذي يصل إليه فعلا. يمكن أن يُقرأ الأمر على النحو التالي : “اجعل الوصول إلى هذا الملف متاحا وفق أذونات المجموعة التي تملكه بغضّ النظر عن المستخدم الذي يحاول الوصول إليه”.
</p>

<p>
	يُطبّق ضبط معرّف المجموعة على النحو التالي:
</p>

<pre class="ipsCode" id="ips_uid_281_78">
# chmod g+s file</pre>

<p>
	أو بإضافة الرقم <code>2</code> أمام الرمز العددي للأذون:
</p>

<pre class="ipsCode" id="ips_uid_281_80">
# chmod 2750 file</pre>

<p>
	نفترض أن الأذون على الملف <code>file</code> هي <code>760</code> مما يعني أنه لا يُتاح إذن القراءة إلا للمستخدم مالك الملف أو المجموعة التي ينتمي إليها. إن حاول مستخدم غير المستخدم المالك ولا ينتمي للمجموعة قراءة محتوى الملف فلن يستطيع. إن ضبطنا خيار <code>setgid</code> بإحدى الطريقتين المذكورتين (<code>g+s</code> أو <code>2760</code>) فسيمكن لأي مستخدم مهما كان قراءة الملف، لأنه أصبح يستفيد من صلاحيات المجموعة حتى ولو لم يكن واحدا منها؛ ولكنه لن يستطيع تنفيذ الملف لأن المجموعة لا تملك هذا الإذن.
</p>

<p>
	راجع مقال <a href="https://academy.hsoub.com/devops/linux/%D8%B4%D8%B1%D8%AD-%D8%A3%D8%B0%D9%88%D9%86%D8%A7%D8%AA-%D8%A7%D9%84%D9%85%D9%84%D9%81%D8%A7%D8%AA-file-permissions-%D8%B9%D9%84%D9%89-%D9%84%D9%8A%D9%86%D9%83%D8%B3-%D9%88%D9%8A%D9%88%D9%86%D9%83%D8%B3-r240/" rel="">شرح أذونات الملفات (File permissions) على لينكس ويونكس</a> للمزيد عن معرّف المجموعة (ومعرّف المستخدم).
</p>

<h2 id="خاتمة">
	خاتمة
</h2>

<p>
	تتطلّب إدارة خواديم RHEL معرفة عميقة بأذون الملفات وصلاحيات المستخدمين والمجموعات؛ لذا تأكد من تطبيق المعلومات الواردة في هذا المقال جيّدا حتى تستوعبها. إن وجدت استشكالات فيمكنك التعليق على هذا الدّرس أو استخدام <a href="https://academy.hsoub.com/questions/c6-devops/" rel="">قسم الأسئلة</a> للحصول على المساعدة.
</p>

<p>
	ترجمة -وبتصرّف- للمقال <a href="http://www.tecmint.com/rhcsa-exam-manage-users-and-groups" rel="external nofollow">RHCSA Series: How to Manage Users and Groups in RHEL 7 – Part 3</a> لصاحبه Gabriel Cánepa.
</p>
]]></description><guid isPermaLink="false">738</guid><pubDate>Thu, 26 May 2016 13:22:00 +0000</pubDate></item><item><title>&#x625;&#x62F;&#x627;&#x631;&#x629; &#x627;&#x644;&#x645;&#x644;&#x641;&#x627;&#x62A; &#x648;&#x627;&#x644;&#x645;&#x62C;&#x644;&#x62F;&#x627;&#x62A; &#x639;&#x644;&#x649; Red Hat Enterprise Linux</title><link>https://academy.hsoub.com/devops/linux/redhat/%D8%A5%D8%AF%D8%A7%D8%B1%D8%A9-%D8%A7%D9%84%D9%85%D9%84%D9%81%D8%A7%D8%AA-%D9%88%D8%A7%D9%84%D9%85%D8%AC%D9%84%D8%AF%D8%A7%D8%AA-%D8%B9%D9%84%D9%89-red-hat-enterprise-linux-r737/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2016_05/redhat-rhcsa-files-folders.png.cddaea16092ea889467c5aa6be5224af.png" /></p>

<p>
	نكمل في هذا الدّرس، الثاني من سلسلة الدّروس التحضيريّة لـ<a href="https://academy.hsoub.com/certificates/redhat/rhcsa/" rel="">شهادة RHCSA</a>، ما بدأناه في الدّرس الأول؛ بالتّركيز على <a href="https://academy.hsoub.com/certificates/redhat/rhcsa/%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D8%A7%D9%84%D8%AA%D8%B9%D8%A7%D9%85%D9%84-%D9%85%D8%B9-%D8%A7%D9%84%D8%B5%D8%AF%D9%81%D8%A9-shell-%D9%81%D9%8A-red-hat-enterprise-linux-r40/" rel="">أوامر إدارة الملفّات والمجلّدات في Red Hat Enterprise Linux</a>. هذه المهارات مطلوبة للحصول على الشهادة، كما أنها من الأنشطة التي لا يكاد يخلو يوم عمل بالنسبة لمدير أنظمة لينكس منها.
</p>

<p style="text-align: center;">
	<img class="ipsImage ipsImage_thumbnailed" data-fileid="16594" data-unique="pnu77b8n7" src="https://academy.hsoub.com/uploads/monthly_2016_05/redhat-rhcsa-files-folders.png.062d7c9cdc27c6361129ec7e9c5dbc51.png" alt="redhat-rhcsa-files-folders.png"></p>

<p>
	أغلب الشروحات الواردة هنا تصلُح على توزيعات لينكس الأخرى.
</p>

<h2 id="إنشاء-الملفات-والمجلدات-حذفها-نسخها-ونقلها">
	إنشاء الملفات والمجلدات، حذفها، نسخها ونقلها
</h2>

<p>
	يعدّ إنشاء الملفات أو حذفها من سطر الأوامر أول ما تجب عليك معرفته في إطار إدارة الملفات. نفس الشيء بالنّسبة للمجلّدات التي ما هي في النهاية سوى ملفّ بمواصفات خاصّة.
</p>

<h3 id="إنشاء-ملف-أمر-touch">
	إنشاء ملف: أمر touch
</h3>

<p>
	يُستخدَم أمر <code>touch</code> لإنشاء ملف فارغ أو لتحديث بيانات الوصول والتّعديل على ملف موجود. ننشئ في المثال التالي ملفًّا باسم <code>testfile</code>، ثم نسرد معلومات الملفّ باستخدام الأمر <code>ls -l</code>. يظهر وقت إنشاء الملف <code>Apr 27 20:41</code> وتاريخه. نضيف محتوى إلى الملف ثم نعيد سرد معلوماته ونلاحظ تغيّرات من ضمنها التاريخ <code>Apr 27 20:43</code>.
</p>

<pre class="ipsCode" id="ips_uid_9432_7">
$ touch testfile
$ ls -l testfile 
-rw-rw-r--. 1 meyil meyil 0 Apr 27 20:41 testfile
$ echo "Hsoub Academy" &gt; testfile 
$ ls -l testfile 
-rw-rw-r--. 1 meyil meyil 14 Apr 27 20:43 testfile</pre>

<p>
	انتظر دقيقة تقريبا ثم نفذ أمر <code>touch</code> على الملفّ. سيظهر تغيّر في تاريخ التّعديل. يمكنك التأكّد من أن محتواه لم يتغير بتنفيذ أمر <code>cat</code>.
</p>

<pre class="ipsCode" id="ips_uid_9432_9">
$ touch testfile 
$ ls -l testfile 
-rw-rw-r--. 1 meyil meyil 14 Apr 27 20:44 testfile
$ cat testfile 
Hsoub Academy</pre>

<p>
	يُنشأ الملف الناتج عن تنفيذ أمر <code>touch</code> في المجلّد الحالي؛ إذا أردت إنشاءه في مجلّد مغاير فيمكنك تمرير المسار إلى الأمر على النحو التالي:
</p>

<pre class="ipsCode" id="ips_uid_9432_11">
$ touch folder/filename
</pre>

<p>
	يُنشئ الأمر ملفّا باسم <code>filename</code> ضمن المجلّد <code>folder</code>.
</p>

<h3 id="تحديد-نوع-ملف-أمر-file">
	تحديد نوع ملف: أمر file
</h3>

<p>
	يمكنك استخدام أمر <code>file</code> لتحديد نوع الملفّ (ملفّ، مجلّد، قرص صلب، … إلخ).
</p>

<pre class="ipsCode" id="ips_uid_9432_13">
$ file testfile
testfile: ASCII text</pre>

<h3 id="حذف-ملف-أمر-rm">
	حذف ملف: أمر rm
</h3>

<p>
	يحذف أمر <code>rm</code> الملف المرَّر في المعطى:
</p>

<pre class="ipsCode" id="ips_uid_9432_15">
$ rm testfile</pre>

<p>
	يمكن أيضا تمرير مسار الملف كاملا إن لم يكن موجودا في مجلّد العمل: 
</p>

<pre class="ipsCode" id="ips_uid_9432_17">
$ rm folder/testfile
</pre>

<p>
	توجد خيّارات يمكن تمريرها للأمر <code>rm</code>؛ سنرى بضعةً منها بعد قليل.
</p>

<h3 id="إنشاء-مجلد-أمر-mkdir">
	إنشاء مجلد: أمر mkdir
</h3>

<p>
	يمكن إنشاء مجلّد ضمن مجلّد العمل بأمر <code>mkdir</code> على النحو التالي: 
</p>

<pre class="ipsCode" id="ips_uid_9432_19">
$ mkdir directory
</pre>

<p>
	استخدم خيار <code>p-</code> مع أمر <code>mkdir</code> إن أردت إنشاء مسار كامل:
</p>

<pre class="ipsCode" id="ips_uid_9432_21">
$ mkdir -p dirA/dirA1/dirA12/</pre>

<p>
	ينتُج عن تنفيذ الأمر مع الخيار <code>p-</code> في المثال السابق إنشاءُ مجلّد باسم <code>dirA</code> وبداخله مجلّد فرعي <code>dirA1</code> وبداخل هذا الأخير مجلد باسم <code>dirA12</code>.
</p>

<h3 id="حذف-مجلد-أمر-rmdir-أو-rm">
	حذف مجلد: أمر rmdir أو rm
</h3>

<p>
	إن كان المجلّد فارغا فيمكن حذفه بالأمر <code>rmdir</code>:
</p>

<pre class="ipsCode" id="ips_uid_9432_23">
$ rmdir directory</pre>

<p>
	أما إن لم يكن فارغا فستحتاج لحذف محتوياته أولا أو استخدام خيّار <code>r-</code> مع أمر <code>rm</code> الذي يحذف المجلّد وما حوى:
</p>

<pre class="ipsCode" id="ips_uid_9432_25">
$ rm -r dirA/dirA1/dirA12/</pre>

<p>
	يوجد أيضا خيّار <code>f-</code> الذي يُستخدَم مع <code>r-</code> لتأكيد الحذف وعدم إظهار أية رسائل تطلُب التأكيد:
</p>

<pre class="ipsCode" id="ips_uid_9432_27">
$ rm -rf dirA
</pre>

<p>
	ينبغي الحذر عموما عند استخدام أمر <code>rm</code> وبالأخص مع خيّارَيْ <code>r-</code> و<code>f-</code>؛ فالاستخدام غير الحذر ربّما يؤدّي لضياع البيانات والكثير من المشاكل.
</p>

<h2 id="إعادة-توجيه-المدخلات-والمخرجات">
	إعادة توجيه المدخلات والمخرجات
</h2>

<p>
	يتيح سطر الأوامر إمكانية توجيه مُخرَج أمر، أي نتيجة تنفيذه، إلى أمر آخر عن طريق ما يُسمّى بالأنابيب Pipelines. تُصبح حصيلة الأمر الموجَّه (المُخرَج) معطى (مُدخَلا) للأمر الموجَّه إليه. توجد حيلة أخرى تُعرف بإعادة التوجيه Redirecting تتمثّل في حفظ نتيجة أمر في ملفّ، أو أخذ محتوى ملفّ وجعله مُدخلا للأمر.
</p>

<p>
	سنحتاج حتى نستوعب مفهوميْ الأنابيب وإعادة التوجيه إلى فهم تدفّقات الإدخال والإخراج Input and Output Streams.
</p>

<p>
	<strong>ملحوظة:</strong> التدفقات Streams هي سلسلة من المحارف تنتقل من مَصدر إلى وِجهة. المُدخَل Input هو البيانات التي يتلقّاها الأمر أما المُخرَج Output فهو البيانات التي تنتج عن تنفيذ الأمر.
</p>

<ul>
<li>
		<strong>الإدخال المعياري Standard input, stdin</strong>: وهو المَصدر المبدئي الذي يتلقّى منه الأمر المُدخلات؛ أي لوحة المفاتيح.
	</li>
	<li>
		<strong>الإخراج المعياريّ Standard output, stdout</strong>: وهو الوجهة المبدئية التي يُرسل إليها الأمر مُخرجاته؛ أي سطر الأوامر (الشّاشة).
	</li>
	<li>
		<strong>الخطأ المعياريّ Standard erro, stderr</strong>: وهو الوجهة التي يُرسل إليها الأمر رسائل الخطأ في حال حدوثها؛ أي سطر الأوامر.
	</li>
</ul>
<p>
	نأخذ الأمر التالي مثالا:
</p>

<pre class="ipsCode" id="ips_uid_9432_29">
$ ls /var /hsoub
ls: cannot access /hsoub: No such file or directory
/var:
account  adm  cache  crash  db  empty  games  gopher  kerberos  lib  local  lock  log  mail  nis  opt  preserve  run  spool  tmp  yp</pre>

<p>
	يطلُب الأمر السابق عرض محتويات المجلديْن <code>var/</code> و <code>hsoub/</code>.
</p>

<p>
	يسير التدفّق من الإدخال المعياري (لوحة المفاتيح) إلى الإخراج المعياري (سطر الأوامر، الشّاشة)؛ أي أن الأمر <code>ls</code> يأخذ المُدخَل <code>var/</code> من لوحة المفاتيح (الضّغط على زرّ <code>Enter</code>) ثم يرسل نتيجة التنفيذ (المُخرَج، أي لائحة بالمجلّدات والملفّات الموجودة في المجلّد <code>var/</code>) إلى الشاشة لعرضها.
</p>

<p>
	بالنّسبة لـ <code>hsoub/</code> فالمجلّد غير موجود لذا تظهر رسالة خطأ بذلك؛ في هذه الحالة يسير التدفّق من الإدخال المعياري (لوحة المفاتيح) إلى الخطأ المعياري (سطر الأوامر، الشّاشة) الذي يعرض رسالة الخطأ.
</p>

<p>
	ربما تطرح السّؤال؛ ما علاقة التدفقات المعياريّة بالأنابيب وإعادة التوجيه؟
</p>

<p>
	الجواب هو أننا أثناء إعادة التوجيه نجعل ملفّا مكان أحد التدفقات المعيارية. مثلا؛ بدل أن تظهر نتيجة الأمر على الشاشة (الإخراج المعياري، stdout) "نوجّهها" إلى ملف. أي أننا نقول للأمر "لا تستخدم الإخراج المعياري، استخدم ملفا مكانه" (ينطبق نفس المبدأ على التدفقات الأخرى). بالنسبة للأنابيب فنطلب من الأمر الأول إرسال مخرجاته ليس إلى الإخراج المعياري بل إلى أمر ثان؛ ونقول للأمر الثاني "خذ مدخلاتك ليس من الإدخال المعياري بل من الأمر الذي قبلك".
</p>

<p>
	أعد قراءة الجمل الأخيرة بتأنّ.
</p>

<p>
	توجد عوامل Operators للتّوجيه؛ وذلك على النّحو التالي:
</p>

<center>
	<table border="1"><tbody>
<tr>
<th style="padding: 5px 10px; background-color: rgb(251, 252, 252);">
					العامِل     
				</th>
				<th style="padding: 5px 10px; background-color: #fbfcfc;">
					العمل
				</th>
			</tr>
<tr>
<td style="padding: 5px 10px; text-align: center;">
					<code>&lt;</code>
				</td>
				<td style="padding: 5px 10px;">
					يعيد توجيه الإخراج المعياري (مُخرَج الأمر) إلى ملف. إن كان الملف موجودا فسيُبدَل محتواه وإن لم يكن موجودا فسيُنشَأ.
				</td>
			</tr>
<tr>
<td style="padding: 5px 10px; text-align: center;">
					<code>&lt;&lt;</code>
				</td>
				<td style="padding: 5px 10px;">
					يعيد توجيه الإخراج المعياري ويلصقه في نهاية ملف.
				</td>
			</tr>
<tr>
<td style="padding: 5px 10px; text-align: center;">
					<code>&lt;2</code>
				</td>
				<td style="padding: 5px 10px;">
					يعيد توجيه الخطأ المعياري إلى ملف. إن كان الملف موجودا فسيُبدَل محتواه وإن لم يكن موجودا فسيُنشَأ.
				</td>
			</tr>
<tr>
<td style="padding: 5px 10px; text-align: center;">
					<code>&lt;&lt;2</code>
				</td>
				<td style="padding: 5px 10px;">
					يعيد توجيه الخطأ المعياري ويلصقه في نهاية ملف
				</td>
			</tr>
<tr>
<td style="padding: 5px 10px; text-align: center;">
					<code>&lt;&amp;</code>
				</td>
				<td style="padding: 5px 10px;">
					يعيد توجيه كلّ من الإخراج والخطأ إلى ملف. إن كان الملف موجودا فسيُبدَل محتواه وإن لم يكن موجودا فسيُنشَأ.
				</td>
			</tr>
<tr>
<td style="padding: 5px 10px; text-align: center;">
					<code>&gt;</code>
				</td>
				<td style="padding: 5px 10px;">
					يستخدم الملفّ المحدّد مكان الإدخال المعياري (معطى، مُدخَل).
				</td>
			</tr>
<tr>
<td style="padding: 5px 10px; text-align: center;">
					<code>&lt;&gt;</code>
				</td>
				<td style="padding: 5px 10px;">
					يُستخدَم الملف المحدّد مكان للإخراج والإدخال
				</td>
			</tr>
</tbody></table>
</center>

<p>
	يُرمَز للأنبوب بـ <code>|</code> الذي يوضَع بين أمرين (أو أكثر) كما سنرى.
</p>

<p id="أمثلة-على-إعادة-التوجيه-واستخدام-الأنابيب">
	إليك أمثلة على إعادة التوجيه واستخدام الأنابيب:
</p>

<h3 id="إعادة-توجيه-مخرج-أمر-إلى-ملف">
	إعادة توجيه مخرج أمر إلى ملف
</h3>

<p>
	نفترض أنك تريد سرد جميع الملفات والمجلدات الموجودة في مجلّد ثم حفظ النتيجة في ملف. يمكن إنجاز هذه المهمّة بالأمر التالي:
</p>

<pre class="ipsCode" id="ips_uid_9432_31">
$ ls -1 /var/mail &gt; mail.txt</pre>

<p>
	يسرُد الأمر <code>ls -1 /var/mail</code> محتويات المجلّد <code>var/mail/</code>؛ يطلُب الخيّار <code>1-</code> من أمر <code>ls</code> طباعة ملف واحد في كل سطر. نستخدم عامل إعادة التوجيه <code>&lt;</code> لنحيل التدفق من الإخراج المعياري (<code>stdout</code>) إلى الملف <code>mail.txt</code>.
</p>

<h3 id="إعادة-توجيه-المخرج-ورسائل-الخطأ-في-نفس-الوقت">
	إعادة توجيه المخرج ورسائل الخطأ في نفس الوقت
</h3>

<p>
	يوجد على الأنظمة الشبيهة بيونكس ملفّ خاص يسمّى ملفّ العدم (أو الثّقب الأسود). الملفّ موجود على المسار <code>dev/null/</code> ويتميّز بكونه "يبتلع" كلّ ما يُكتَب فيه فلا يبقى له أثر في النظام. يُستخدَم هذا الملفّ عادة للتخلّص من تدفق مخرجات عمليّة على لينكس عبر توجيهها إليه. 
</p>

<pre class="ipsCode" id="ips_uid_9432_33">
$ ls /var /hsoub
ls: cannot access /hsoub: No such file or directory
/var:
account  adm  cache  crash  db  empty  games  gopher  kerberos  lib  local  lock  log  mail  nis  opt  preserve  run  spool  tmp  yp
$ ls /var/hsoub &amp;&gt; /dev/null
</pre>

<p>
	لاحظ أن تنفيذ الأمر الثاني لا تنتج عنه أية مخرجات ولا رسائل خطأ؛ على عكس الأول الذي يظهر رسالة خطأ بالنسبة للمجلّد غير الموجود ومحتوى المجلّد الآخر.
</p>

<h3 id="استخدام-ملف-مدخلا-لأمر">
	استخدام ملف مدخلا لأمر
</h3>

<p>
	يُستخدَم أمر <code>cat</code> لطباعة محتوى ملفّ يمرّر اسمه في معطيات الأمر على النحو التالي:
</p>

<pre class="ipsCode" id="ips_uid_9432_35">
$ cat file
</pre>

<p>
	غير أنه يمكننا استخدام إعادة التوجيه مع الأمر <code>cat</code>؛ مثلا:
</p>

<pre class="ipsCode" id="ips_uid_9432_37">
$ cat &lt; mail.txt
</pre>

<h3 id="جعل-مخرج-أمر-مدخلا-لآخر">
	جعل مخرج أمر مدخلا لآخر
</h3>

<p>
	نفترض أنك تريد حساب عدد الملفات والمجلّدات الفرعيّة في المجلّد الحالي. أحد الحلول هو سرد محتويات المجلّد باستخدام الخيّار <code>1-</code> مع <code>ls</code> ثم استخدام أنبوب <code>|</code> لتمرير هذا المُخرَج إلى أمر <code>wc</code> الذي يحسب عدد الأسطر إذا استُخدم معه الخيار <code>l-</code>؛ كالتالي: 
</p>

<pre class="ipsCode" id="ips_uid_9432_39">
$ ls -1 | wc -l
</pre>

<p>
	راجع مقال <a href="https://academy.hsoub.com/devops/linux/%D9%85%D9%82%D8%AF%D9%85%D8%A9-%D8%A5%D9%84%D9%89-%D8%A5%D8%B9%D8%A7%D8%AF%D8%A9-%D8%AA%D9%88%D8%AC%D9%8A%D9%87-%D8%A7%D9%84%D8%A5%D8%AF%D8%AE%D8%A7%D9%84%D8%A7%D9%84%D8%A5%D8%AE%D8%B1%D8%A7%D8%AC-io-%D9%81%D9%8A-%D9%84%D9%8A%D9%86%D9%83%D8%B3-r39/" rel="">مقدمة إلى إعادة توجيه الإدخال/الإخراج (I/O) في لينكس</a> للمزيد حول الموضوع.
</p>

<h2 id="تجميع-الملفات-وضغطها">
	تجميع الملفات وضغطها
</h2>

<p>
	يُستخدَم التجميع (أو الأرشفة) لجمع أكثر من ملفّ معا؛ مثلا لإرسالها عبر البريد أو لنقلها إلى وسيط تخزين آخر. تُطبَّق غالبا على الملفّات المجمّعة (الأرشيفات) خوارزميّات ضغط للتقليل من حجم الملفّ. الأمر الأشهر للتّجميع على لينكس هو <code>tar</code>. بالنّسبة للخوارزميّات فالثلاثة التالية هي الأكثر شيوعا على غنو/لينكس: <code>gzip</code>، <code>bzip2</code> و<code>xz</code>. يعدّ <code>gzip</code> الأقدم من بينها والأقل كفاءة، <code>bzip2</code> أحدث منه وأحسن؛ أما <code>xz</code> فهو الأحدث من بين الثلاثة والأكثر كفاءة. يشير امتداد الملفّات المضغوطة إلى الخوارزميّة المستخدمة <code>gz.</code> بالنسبة لـ<code>gzip</code>، و<code>bz2.</code> بالنسبة لـ<code>bzip2</code> و<code>xz.</code> بالسبة لخوارزميّة <code>xz</code>.
</p>

<p>
	يجمع الأمر التالي الملفّين <code>file1</code> و <code>file2</code> في أرشيف باسم <code>archive.tar</code>:
</p>

<pre class="ipsCode" id="ips_uid_9432_45">
$ tar -cf archive.tar file1 file2
</pre>

<p>
	يُخبر الخيّار <code>c-</code> الأمر <code>tar</code> أننا بصدد إنشاء ملف مجمَّع؛ أما الخيّار <code>f-</code> فيحدّد اسم ملف التجميع؛ الذي يسبق اسمُه اسمَ الملفات التي نريد جمعها.
</p>

<p>
	<strong>ملحوظة 1:</strong> إن كنت تريد استخدام أكثر من خيار في نفس الوقت فيمكنك كتابتها ملتصقة مع وجود الشرطة <code>-</code> أمامها. تنطيق هذه الملاحظة على الخيارات المختصرة .<br><strong>ملحوظة 2:</strong> غالبا توجد أكثر من طريقة لكتابة الخيّار، واحدة مختصرة مثل <code>c-</code> وأخرى مسهبة مثل <code>create--</code>. تشير صفحة التوثيق إلى الاثنين.<br><strong>ملحوظة 3:</strong> ابدأ عند كتابة خيارات <code>tar</code> بتلك التي تحدّد الوضع (الإنشاء، الاستخراج، …إلخ) واجعل الخيار <code>f</code> هو الأخير.
</p>

<p>
	في مايلي بعض الخيارات المهمة المستعملة مع أمر <code>tar</code> لتجميع الملفات.
</p>

<p>
	ينبغي أولا تحديد ما نريده من الأمر <code>tar</code>؛ هل نريد إنشاء أرشيف أو استخراج ملفات من أرشيف أم شيئا آخر. تحدّد الخيارات التاليّة الأوضاع الأساسيّة التي يعمل عليها <code>tar</code>.
</p>

<center>
	<table border="1"><tbody>
<tr>
<th style="padding: 5px 10px; background-color: #fbfcfc;">
					الخيار
				</th>
				<th style="padding: 5px 10px; background-color: #fbfcfc;">
					العمل
				</th>
			</tr>
<tr>
<td style="padding: 5px 10px; text-align: center;">
					<code>c</code>
				</td>
				<td style="padding: 5px 10px;">
					إنشاء ملف تجميع
				</td>
			</tr>
<tr>
<td style="padding: 5px 10px; text-align: center;">
					<code>A</code>
				</td>
				<td style="padding: 5px 10px;">
					إضافة ملفات تجميع إلى ملف تجميع آخر
				</td>
			</tr>
<tr>
<td style="padding: 5px 10px; text-align: center;">
					<code>r</code>
				</td>
				<td style="padding: 5px 10px;">
					إضافة ملفّات (ليست ملفات تجميع) إلى ملفّ تجميع
				</td>
			</tr>
<tr>
<td style="padding: 5px 10px; text-align: center;">
					<code>u</code>
				</td>
				<td style="padding: 5px 10px;">
					وضع النسخ الأحدث من الملفاّت مكان النّسخ القديمة ضمن ملفّ التجميع
				</td>
			</tr>
<tr>
<td style="padding: 5px 10px; text-align: center;">
					<code>d</code>
				</td>
				<td style="padding: 5px 10px;">
					مقارنة ملفات ضمن الأرشيف بتلك بتلك الموجودة في مجلّد
				</td>
			</tr>
<tr>
<td style="padding: 5px 10px; text-align: center;">
					<code>t</code>
				</td>
				<td style="padding: 5px 10px;">
					سرد محتوى الأرشيف
				</td>
			</tr>
<tr>
<td style="padding: 5px 10px; text-align: center;">
					<code>x</code>
				</td>
				<td style="padding: 5px 10px;">
					استخراج ملفّات من الأرشيف
				</td>
			</tr>
</tbody></table>
</center>

<p>
	<strong>ملحوظة:</strong> لا يمكن استخدام خيّاريْن من القائمة أعلاه في نفس الوقت.
</p>

<p>
	تأتي بعد تحديد وضع العمل خيّارات تكيّف عمل <code>tar</code>؛ ومن أهمها التاليّة.
</p>

<center>
	<table border="1"><tbody>
<tr>
<th style="padding: 5px 10px; background-color: #fbfcfc;">
					الخيار
				</th>
				<th style="padding: 5px 10px; background-color: #fbfcfc;">
					العمل
				</th>
			</tr>
<tr>
<td style="padding: 5px 10px; text-align: center;">
					<code>C</code>
				</td>
				<td style="padding: 5px 10px;">
					الانتقال إلى مجلّد معيَّن قبل بدء عمل الأمر
				</td>
			</tr>
<tr>
<td style="padding: 5px 10px; text-align: center;">
					<code>p</code>
				</td>
				<td style="padding: 5px 10px;">
					المحافظة على أذون الملفّات
				</td>
			</tr>
<tr>
<td style="padding: 5px 10px; text-align: center;">
					<code>v</code>
				</td>
				<td style="padding: 5px 10px;">
					<p>
						سرد جميع الملفّات المقروءة أو المستخرجة.
					</p>

					<p>
						يُظهر هذا الخيار عند استخدامه في الوضع t- المشار إليه حجمَ الملفّات، مالكها والتاريخ.
					</p>
				</td>
			</tr>
<tr>
<td style="padding: 5px 10px; text-align: center;">
					<code>'--exclude='FILE</code>
				</td>
				<td style="padding: 5px 10px;">
					يستبعد الملفّ <code>FILE</code> من الأرشيف
				</td>
			</tr>
<tr>
<td style="padding: 5px 10px; text-align: center;">
					<code>z</code>
				</td>
				<td style="padding: 5px 10px;">
					يستعمل خوارزميّة gzip لضغط الأرشيف
				</td>
			</tr>
<tr>
<td style="padding: 5px 10px; text-align: center;">
					<code>j</code>
				</td>
				<td style="padding: 5px 10px;">
					يستعمل خوارزميّة bzip2 لضغط الأرشيف
				</td>
			</tr>
<tr>
<td style="padding: 5px 10px; text-align: center;">
					<code>J</code>
				</td>
				<td style="padding: 5px 10px;">
					يستعمل خوارزميّة xz لضغط الأرشيف
				</td>
			</tr>
</tbody></table>
</center>

<p>
	<strong>ملحوظة:</strong> يأخذ <code>tar</code> مبدئيا مسارات نسبية، يظهر الخطأ <code>tar: Removing leading / from member names</code> عند إعطاء مسار مطلق. هذا السلوك معد لأسباب أمنية، لذا ينصح بالالتزام بمسارات نسبية، وإن كان لابد من استخدام مسارات مطلقة يمكن استخدام الخيار <code>P-</code>؛ مثلا على النحو التالي:
</p>

<pre class="ipsCode" id="ips_uid_9432_47">
$ tar -cPf archive.tar /home/academy/</pre>

<h3 id="أمثلة-على-استخدام-أمر-tar">
	أمثلة على استخدام أمر tar
</h3>

<ul>
<li id="إنشاء-ملف-تجميع-وضغطه">
		إنشاء ملف تجميع وضغطه:
	</li>
</ul>
<p>
	ينشئ الأمر التالي ملف تجميع لجميع الملفات الموجودة في المجلّد <code>hsoub/academy</code>: 
</p>

<pre class="ipsCode" id="ips_uid_9432_49">
$ tar cf academy.tar hsoub/academy/*
</pre>

<p>
	نختار خوارزميّة ضغط إن أردنا ضغط الملفّ أثناء التجميع (لاحظ امتداد الملف والخيّار المستخدم):
</p>

<ul>
<li>
		خوارزميّة <code>gzip</code>:
	</li>
</ul>
<pre class="ipsCode" id="ips_uid_9432_51">
$ tar czf academy.tar.gz hsoub/academy/*</pre>

<ul>
<li>
		خوارزميّة <code>bzip2</code>:
	</li>
</ul>
<pre class="ipsCode" id="ips_uid_9432_53">
$ tar cjf academy.tar.bzp2 hsoub/academy/*</pre>

<ul>
<li>
		خوارزميّة <code>xz</code>:
	</li>
</ul>
<pre class="ipsCode" id="ips_uid_9432_55">
$ tar cJf academy.tar.xz hsoub/academy/*</pre>

<ul>
<li>
		<p>
			المحافظة على الأذون والملكيّة أثناء تجميع الملفات:
		</p>
	</li>
</ul>
<p>
	ترغب أحيانا في ترك أذون الملفّات وملكيتها كما هي أثناء تجميعها أو ضغطها؛ مثلا أثناء النسخ الاحتياطي لمجلدات مستخدمي النظام. يحمل ملف التجميع في السلوك المبدئي لأمر <code>tar</code> أذونَ وصلاحياتِ المستخدِم الذي ينفذ الأمر.
</p>

<p>
	نستخدم الخيّارين <code>same-permissions--</code> و <code>same-owner--</code> في المثال التالي للمحافظة على الصلاحيّات والأذون:
</p>

<pre class="ipsCode" id="ips_uid_9432_57">
$ tar cJf academy.tar.xz hsoub/academy/* --same-permissions --same-owner
</pre>

<h2 id="إنشاء-الوصلات-الصلبة-والرمزية">
	إنشاء الوصلات الصلبة والرمزية
</h2>

<p>
	توجد في لينكس نوعيّة من الملفات تسمى الوصلات Links وهي مؤشرات تحيل إلى ملفّ آخر. تنقسم الوصلات إلى صلبة Hard ورمزيّة Symbolic (أو ليّنة Soft).<br>
	تشير الوصلات الصّلبة إلى نفس مساحة القرص التي يستغلها الملف؛ بينما تشير الوصلات اللينة إلى أسماء الملفات. يعني هذا أنك عند حذف وصلة صلبة فأنت تحذف الملف من القرص الصّلب؛ بينما عندما تحذف وصلة رمزيّة فالمحذوف هو المؤشر فقط. الخلاصة هي أن الوصلة الصّلبة تحيل لبيانات على القرص بينما الوصلة الرمزيّة تحيل لاسم الملف فقط.
</p>

<p>
	من الفروقات بين النوعين أن الوصلة الصلبة لا تأخذ مساحة من القرص (هذه المساحة موجودة أصلا وأخذها الملف الذي تشير إليه الوصلة) بينما تأخذ الوصلة الرمزية مساحة صغيرة. يسهل نقل الوصلات الرمزيّة بين <a href="https://academy.hsoub.com/questions/1784-%D9%85%D8%A7-%D9%87%D9%88-%D9%86%D8%B8%D8%A7%D9%85-%D8%A7%D9%84%D9%85%D9%84%D9%81%D8%A7%D8%AA-%D8%9F/" rel="">نظم الملفات</a> على عكس الوصلات الصّلبة.
</p>

<p>
	يُستخدم الأمر <code>ln</code> لإنشاء الوصلات. إن لم نحدّد خيارا مع الأمر فسينشئ وصلة صلبة. لإنشاء وصلة لينة نستخدم الخيار <code>s-</code>. نمرّر للأمر معطيَيْن؛ الأول هو الملف الهدف (الذي نريد إنشاء وصلة له) والثاني اسم الوصلة.
</p>

<ul>
<li>
		وصلة صلبة باسم <code>LINK_NAME</code> تشير إلى الملف <code>TARGET</code>:
	</li>
</ul>
<pre class="ipsCode" id="ips_uid_9432_60">
$ ln TARGET LINK_NAME</pre>

<ul>
<li>
		وصلة رمزية باسم <code>LINK_NAME</code> تشير إلى الملف <code>TARGET</code>:
	</li>
</ul>
<pre class="ipsCode" id="ips_uid_9432_62">
$ ln -s TARGET LINK_NAME</pre>

<h3>
	أمثلة على الوصلات
</h3>

<p>
	لا توجد طريقة أفضل من إنشاء الوصلات لفهم كيفيّة عملها.
</p>

<p>
	نبدأ بإنشاء مجلد ننشئ فيه ملفات هذا المثال، ثم ننتقل إليه:
</p>

<pre class="ipsCode" id="ips_uid_9432_64">
$ mkdir links_folder
$ cd links_folder</pre>

<p>
	ثم ننشئ ملفا باسم <code>links_test</code> ونكتب فيه بضعة كلمات:
</p>

<pre class="ipsCode" id="ips_uid_9432_66">
$ touch links_test
$ echo "Testing links..." &gt; links_test</pre>

<p>
	نستخدم الآن الأمر <code>ln</code> لإنشاء وصلة صلبة باسم <code>hard_link</code> تشير إلى الملف <code>links_test</code>:
</p>

<pre class="ipsCode" id="ips_uid_9432_68">
$ ln links_test hard_link
</pre>

<p>
	ثم وصلة رمزية باسم <code>soft_link</code> تشير لنفس الملفّ:
</p>

<pre class="ipsCode" id="ips_uid_9432_70">
$ ln -s links_test soft_link</pre>

<p>
	نسرُد محتوى المجلد:
</p>

<pre class="ipsCode" id="ips_uid_9432_72">
$ ls -l
total 8
-rw-rw-r--. 2 meyil meyil 17 Apr 29 16:57 hard_link
-rw-rw-r--. 2 meyil meyil 17 Apr 29 16:57 links_test
lrwxrwxrwx. 1 meyil meyil 10 Apr 29 16:57 soft_link -&gt; links_test</pre>

<p>
	لاحظ أن معلومات الملفيْن <code>hard_link</code> و<code>links_test</code> متطابقة تماما. على عكس الملف <code>soft_link</code> الذي توجد أمامه علامة تدلّ على الملفّ الذي يشير إليه.
</p>

<p>
	نجرّب الآن عرض محتويات الملفّات الثلاثة:
</p>

<pre class="ipsCode" id="ips_uid_9432_74">
$ cat hard_link 
Testing links...
$ cat soft_link 
Testing links...
$ cat links_test 
Testing links...</pre>

<p>
	لا فرق من هذه الناحية، نفس المحتوى. نجرّب حذف الملفّ الأصلي:
</p>

<pre class="ipsCode" id="ips_uid_9432_76">
$ rm links_test
</pre>

<p>
	ثم نعرض محتوى الوصلة الصّلبة:
</p>

<pre class="ipsCode" id="ips_uid_9432_78">
$ cat hard_link 
Testing links...</pre>

<p>
	نفس المحتوى، لم يتغيّر شيء. ماذا لو عرضنا محتوى الوصلة الرمزيّة؟:
</p>

<pre class="ipsCode" id="ips_uid_9432_80">
$ cat soft_link 
cat: soft_link: No such file or directory</pre>

<p>
	تقول رسالة الخطأ إن الملف <code>soft_link</code> غير موجود؛ ولكنه يظهر عند عرض محتويات المجلّد:
</p>

<pre class="ipsCode" id="ips_uid_9432_82">
ls -l
total 4
-rw-rw-r--. 1 meyil meyil 17 Apr 29 17:07 hard_link
lrwxrwxrwx. 1 meyil meyil 10 Apr 29 17:08 soft_link -&gt; links_test</pre>

<p>
	يعود السبب في ذلك إلى أن الملفّ <code>soft_link</code> يشير إلى اسم الملف <code>links_test</code> الذي لم يعد موجودا؛ أما الوصلة الصلبة فلديها إمكانيّة الوصول المباشر إلى البيانات على القرص الصّلب.
</p>

<p>
	يكثُر استخدام الوصلات الرمزية للإشارة إلى ملفّات تتغيّر باستمرار. لنفرض مثلا أن برنامجا ما يحتاج لمكتبة برمجيّة تُحدّث باستمرار؛ بدلا من كتابة اسم المكتبة وإصدارها مباشرة في البرنامج وتحديثه عند كل تحديث للمكتبة، بدلا منذ ذلك ننشئ وصلة رمزية نستخدمها في البرنامج وعند تحديث المكتبة نحدّث الوصلة الرمزية لتشير إلى الإصدار الجديد. هذه الطريقة أسهل، أسرع وآمَن؛ خصوصا إذا كان رابط المكتبة يظهر عشرات المرات في البرنامج.
</p>

<h2 id="خلاصة">
	خلاصة
</h2>

<p>
	تحدّثنا في هذا المقال عن الأوامر الأهم في إدارة الملفّات والمجلدات علي Red Hat Enterprise Linux ولينكس عموما. تأكد من مراجعة ما ورد في هذا المقال لاستيعابه ومتابعة الدروس الأخرى في السّلسة.
</p>

<p>
	إن كانت لديك إضافات فاستخدم مربّع التعليقات. يوجد أيضا <a href="https://academy.hsoub.com/questions/c6-devops/" rel="">قسم للأسئلة</a> استخدمه لطرح استشكالاتك.
</p>

<p>
	ترجمة -وبتصرّف- للمقال <a href="www.tecmint.com/file-and-directory-management-in-linux/" rel="external">RHCSA Series: How to Perform File and Directory Management – Part 2</a> لصاحبه Gabriel Cánepa.
</p>
]]></description><guid isPermaLink="false">737</guid><pubDate>Wed, 18 May 2016 11:07:00 +0000</pubDate></item><item><title>&#x623;&#x633;&#x627;&#x633;&#x64A;&#x627;&#x62A; &#x627;&#x644;&#x62A;&#x639;&#x627;&#x645;&#x644; &#x645;&#x639; &#x627;&#x644;&#x635;&#x62F;&#x641;&#x629; Shell &#x641;&#x64A; Red Hat Enterprise Linux</title><link>https://academy.hsoub.com/devops/linux/redhat/%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D8%A7%D9%84%D8%AA%D8%B9%D8%A7%D9%85%D9%84-%D9%85%D8%B9-%D8%A7%D9%84%D8%B5%D8%AF%D9%81%D8%A9-shell-%D9%81%D9%8A-red-hat-enterprise-linux-r736/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2016_04/redhat-rhcsa-shell-commands.png.68c5dff485c0ddb89f5bc9e8ceb7acf9.png" /></p>

<p>
	يعالج هذا الدرس، الأول من سلسلة دروس عن <a href="https://academy.hsoub.com/certificates/redhat/rhcsa/" rel="">شهادة RHCSA</a>، أساسيّات التعامل مع الطرفيّة Terminal في RHEL. سنفترض أن لديك توزيعة RHEL 7 مثبّتة وجاهزة للعمل؛ يمكنك الاستعانة بدرس <a href="https://academy.hsoub.com/devops/linux/%D8%AA%D8%AB%D8%A8%D9%8A%D8%AA-red-hat-enterprise-linux-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-virtualbox-r249/" rel="">تثبيت Red Hat Enterprise Linux باستخدام VirtualBox</a> لتجهيز بيئة للعمل عليها.
</p>

<p style="text-align: center;">
	<img class="ipsImage ipsImage_thumbnailed" data-fileid="15720" data-unique="pn5hzwb4v" src="https://academy.hsoub.com/uploads/monthly_2016_04/redhat-rhcsa-shell-commands.png.3705156fbdd3225f473e4ae2148e5fa0.png" alt="redhat-rhcsa-shell-commands.png"></p>

<h2 id="بنية-الأوامر-في-shell">
	بنية الأوامر في Shell
</h2>

<p>
	لا تثبّت -عادةً- واجهة رسومية في الخواديم؛ لذا ستجد نفسك في الغالب أمام واجهة نصيّة تمثّلها الصّدفة Shell التي تقدّم محثّا Prompt ينتظر منك إدخال أوامر تتفاعل عن طريقها مع مختلف خدمات نظام التّشغيل. بالنسبة للخواديم بواجهة رسوميّة فيمكن تشغيل برنامج الطرفيّة Terminal وستظهر نافذة بمحثّ تُكتَب فيه الأوامر. يُنفَّذ الأمر في الطرفيّة بالضّغط على زرّ <code>Enter</code> في لوحة المفاتيح، ويتكوّن من جزأين:
</p>

<ul>
<li>
		اسم الأمر
	</li>
	<li>
		ومعطيات Arguments.
	</li>
</ul>
<p>
	تُغيّر معطياتٌ (تُسمّى خيارات Options، وتكون مسبوقة عادة بشرطة <code>-</code>) سلوكَ الأمر على نحوّ محدَّد سلفا؛ بينما تعيّن المعطيات الأخرى الكائنات التي سيعمل عليها الأمر.
</p>

<p>
	<strong>ملحوظة:</strong> برنامج الصّدفة المبدئي Default في RHEL وكثير من توزيعات لينكس هو Bash (اختصار لـBourne again shell). توجد برامج أخرى للصّدفة يمكن تثبيتها مثل C Shell و Ksh.
</p>

<h2>
	الحصول على معلومات عن الأوامر 
</h2>

<p>
	توجد وسائل عدّة يمكن من خلالها الحصول على معلومات مفصَّلة عن أوامر الصّدفة.
</p>

<h3>
	الأوامر  المضمنة Built-in والأوامر المنفصلة
</h3>

<p>
	تنقسم الأوامر في الصّدفة إلى نوعين؛ أوامر مضمَّنة وأخرى مستقلة أو منفصلة. تعدّ الأولى جزءًا من الصّدفة نفسها أمّا الثانيّة فهي برامج تُثبَّت على النظام إما مبدئيًّا أو يُثبّتها المستخدم.
</p>

<p>
	يساعد الأمر <code>type</code> في تحديد ما إذا كان أمر مّا مضمَّنا في الصّدفة أو أن حزمة (برنامجا) آخر منفصلة عن الصّدفة توفّره. يمكّننا هذا الفصل بين طبيعة الأوامر أن نعرف أين يمكننا الحصول على معلومات أكثر عن أمر عندما نحتاج لذلك. إن كان الأمر مضمّنا في الصّدفة فسنبحث عن معلوماته في صفحة التوثيق الخاصّة بها؛ أما إذا كان منفصلا عنها فسنبحث عن المعلومات عنه في صفحة التوثيق الخاصّة بالبرنامج الذي يوفّره.
</p>

<pre class="ipsCode" id="ips_uid_8648_8">
$ type cd
cd is a shell builtin
$ type top
top is /usr/bin/top
$ type type
type is a shell builtin
$ type less
less is /usr/bin/less</pre>

<p>
	<strong>ملحوظة:</strong> تشير علامة الدولار <code>$</code> إلى محثّ المستخدم العادي، وليست جزءا من الأمر. السّطر أو الأسطر الموالية للسّطر الذي توجد به علامة الدولار هو نتيجة تنفيذ الأمر.
</p>

<p>
	في الأمثلة أعلاه ننفّذ الأمر <code>type</code> ونمرّر له اسم الأمر الذي نريد معرفة هل هو مضمَّن في الصّدفة أم منفصل عنها. تظهر بعد تنفيذ كل أمر نتيجة؛
</p>

<p>
	تشير النتيجة:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_2469_7">
<span class="pln">cd is a shell builtin </span></pre>

<p>
	إلى أن الأمر <code>cd</code> مضمَّن في الصّدفة؛ نفس الشيء ينطبق على <code>type</code>. إن لم يكن الأمر مضمّنا في الصّدفة، بمعنى أن حزمةً منفصلةً توفّره، فسيظهر مسار الحزمة كما هو الحال مع أمرَي <code>top</code> و<code>less</code> في الأمثلة السّابقة.
</p>

<p>
	من بين الأوامر المعروفة المضّمنة في الصّدفة:
</p>

<ul>
<li>
		أمر <code>echo</code> الذي يطبع سلسلة محارف.
	</li>
	<li>
		أمر <code>pwd</code> الذي يطبع مسار المجلّد الحالي.
	</li>
</ul>
<h3 id="توثيق-الأوامر">
	توثيق الأوامر
</h3>

<p>
	يمكننا الاستعانة بصفحات التوثيق عند الشّك في عمل أمر مّا. تُستدعى صفحات التوثيق بالأمر <code>man</code>. توجد إضافة إلى صفحات توثيق الأوامر صفحاتُ توثيق خاصّة بالملفّات المهمّة مثل <code>hosts </code>،<code>fstab</code> و <code>inittab</code>؛ دوال المكتبات البرمجيّة، الصّدفات، الأجهزة الطّرفية وميزات أخرى.
</p>

<p>
	نستخدم الأمر <code>man</code> مثلا على النحو التالي لعرض معلومات عن عمل الأمر <code>uname</code>:
</p>

<pre class="ipsCode" id="ips_uid_8648_38">
$ man uname</pre>

<p>
	في ما يلي مقتطَف من النتيجة:
</p>

<pre class="ipsCode" id="ips_uid_8648_40">
UNAME(1)                         User Commands                        UNAME(1)

NAME
    uname - print system information

SYNOPSIS
    uname [OPTION]...

DESCRIPTION
    Print certain system information.  With no OPTION, same as -s</pre>

<p>
	يوجد مصدر آخر مهمّ للبحث عن معلومات أمر مّا وهو أمر <code>info</code> الذي يقدّم عادة معلومات أشمل من أمر <code>man</code>. يُمرَّر اسم الأمر الذي نريد معلومات عنه إلى <code>info</code> على النّحو التالي:
</p>

<pre class="ipsCode" id="ips_uid_8648_44">
$ info ls
$ info cut</pre>

<p>
	كما تتوفّر ملفّات مساعدة في المجلّدات الفرعيّة للمجلّد <code>usr/share/doc/</code>.
</p>

<p>
	حاول التعوّد على استخدام الطّرق الثلاث المذكورة أعلاه للبحث عن معلومات حول أمر تريد استخدامه أو تشّك في معطياته. انتبه خصوصا للمعلومات المذكورة عن صيغة استخدام كلّ أمر.
</p>

<h2>
	أوامر أساسية
</h2>

<h3>
	أمر exec
</h3>

<p>
	ينفّذ أمرُ <code>exec</code> الأمرَ الممرّر في المعطى. في الغالب يمكن تنفيذ الأمر الأخير دون الحاجة لتمريره إلى <code>exec</code> إلا أنّ خصوصيّة <code>exec</code> هي أنها تنشئ عمليّة Process جديدة تحلّ مكان عمليّة الصّدفة بدلا من العمل بالتوازي معها. عندما تنتهي العمليّة الجديدة تنتهي معها عمليّة الصّدفة.
</p>

<p>
	نقارن بين الحالتي التاليتيْن لتوضيح المسألة:
</p>

<pre class="ipsCode" id="ips_uid_8648_12">
$ top
$ exec top</pre>

<p>
	ننفّذ في الحالة الأولى أمر <code>top</code> الذي يعرض قائمة بالعمليّات العاملة على النظام؛ ثم نضغط الزّر <code>q</code> لإنهاء الأمر؛ ستلاحظ أن المحثّ يظهر من جديد. في الحالة الثّانيّة يُنفَّذ الأمر <code>top</code> وتظهر قائمة بالعمليّات؛ ولكن عند الضّغط على زر <code>q</code> تختفي الطرفيّة.
</p>

<h3 id="أمر-export">
	أمر export
</h3>

<p>
	يُستخدَم أمر <code>export</code> لـ”تصدير” متغيّر إلى متغيّرات النّظام. متغيّرات النّظام (أو متغيّرات البيئة Environment variables) هي مجموعة من المتغيّرات تؤثّر قيّمها على سلوك البرامج أثناء تنفيذها؛ بعضها معدّ مبدئيًّا مع النّظام ويُتاح الوصول إليه لجميع البرامج. لكي يُضاف متغيّر إلى هذه المتغيّرات فيجب أن يُصدَّر إليها؛ وهذا هو عمل الأمر export.
</p>

<p>
	راجع السؤال التالي من قسم الأسئلة والأجوبة <a href="https://academy.hsoub.com/questions/123-%D9%85%D8%A7%D8%B0%D8%A7-%D9%8A%D8%B9%D9%86%D9%8A-%D9%85%D8%AA%D8%BA%D9%8A%D8%B1-%D8%A7%D9%84%D9%86%D8%B8%D8%A7%D9%85-path%D8%9F/" rel="">ماذا يعني متغير النظام PATH؟</a> أو درس <a href="https://academy.hsoub.com/programming/general/%D8%A7%D9%84%D8%B7%D9%91%D8%B1%D9%8A%D9%82-%D9%86%D8%AD%D9%88-%D9%81%D9%87%D9%85-%D9%85%D9%8F%D8%AA%D8%BA%D9%8A%D8%B1-%D8%A7%D9%84%D9%85%D8%B3%D8%A7%D8%B1-path-r58/" rel="">الطريق نحو فهم متغير المسار PATH</a> لمعلومات أكثر ومثال على متغيّرات النّظام.
</p>

<h3 id="أمر-history">
	أمر history
</h3>

<p>
	يعرض الأمرُ لائحة بالأوامر التي نفّذها الحساب الذي تستخدمه على النظام، مع ترقيمها. تمكن إعادة تنفيذ الأمر بكتابة رقمه في اللائحة مسبوقا بعلامة تعجّب. مثلا:
</p>

<pre class="ipsCode" id="ips_uid_8648_26">
$ history
13  tty
14  exec top
15  ps -ef | grep bash
16  ps -ef | grep 3817 | grep -v grep
17  ps -ef | grep bash
18  tty
19  exec top
20  ps -ef | grep bash
21  ps -ef | grep 4692
22  ps -ef | grep 4692 | grep -v
23  ps -ef | grep 4692 | grep -v grep
24  exit
25  history
</pre>

<p>
	لإعادة تنفيذ الأمر رقم <code>19</code> (أي <code>exec top</code>):
</p>

<pre class="ipsCode" id="ips_uid_8648_20">
!19</pre>

<p>
	يمكننا أيضا البحثُ في سجلّ الأوامر بالضّّغط على الزّريْن <code>Ctrl</code> و<code>r</code> ثم البدء في كتابة الأمر الذي نبحث عنه وستظهر الأوامر الموافقة لما نكتب مباشرة مع إمكانيّة التعديل عليها.
</p>

<p>
	يُحتَفَظ بلائحة الأوامر في ملف باسم <code>bash_history.</code> يوجد بالمجلَّد الشخصيّ للمستخدِم. تحتفظ الصّدفة مبدئيًّا بآخر 1000 أمر نفّذها المستخدم؛ إلا أن بإمكانك تغيير هذه القيمة بالتعديل على قيمة متغيّر النّظام Environment variable الذي يحتفظ بهذه القيمة وهو <code>HISTSIZE</code>. يمكن استخدام أمر <code>export</code> لتعديل قيمة المتغيّر. نستخدم في المثال التالي أمر <code>echo</code> لعرض قيمة المتغيّر قبل التعديل ثم نعدّله ونطبع قيمته الجديدة (لاحظ استخدام علامة <code>$</code> قبل اسم المتغير عند تمريره للأمر <code>echo</code>):
</p>

<pre class="ipsCode" id="ips_uid_8648_46">
$ echo $HISTSIZE
1000
$ export HISTSIZE=2000
$ echo $HISTSIZE
2000</pre>

<p>
	إلا أن طريقة التغيير هذه ليست دائمة؛ إذ سيعيد النّظام قيمة <code>HISTSIZE</code> المبدئية إذا أعيد تشغيله أو عند الخروج من الطرفيّة. لجعل التّعديل دائما نعدّل الملف <code>bashrc.</code> يدويًّا ونعيّن قيمة المتغيّر <code>HISTSIZE</code> (لا تترك فراغا بين علامة <code>=</code> وطرفيّ العمليّة):
</p>

<pre class="ipsCode" id="ips_uid_8648_24">
HISTSIZE=2000</pre>

<p>
	<strong>ملحوظة</strong>: لن يُعتمَد هذا التعديل إلا عند فتح جلسة جديدة.
</p>

<h3 id="أمر-alias">
	أمر alias
</h3>

<p>
	الاختصارات Aliases هي صيغ مختصرة لأمر أطول. إن كانت ملفّات موقع الويب توجد على المسار <code>/var/www/</code> ونستخدم أمر <code>cd</code> للانتقال إليها على النحو التالي:
</p>

<pre class="ipsCode" id="ips_uid_8648_30">
cd /var/www</pre>

<p>
	فيمكننا تعريف كنية (اختصار) <code>www</code> تعمل كما لو أنها أمر ويؤدي تنفيذها إلى الانتقال إلى المجلّد المذكور.
</p>

<p>
	يعرض الأمر <code>alias</code> إن نُفِّذ دون معطيات، أو بتمرير المعطى <code>p-</code>، لائحة بالاختصارات المضبوطة. إن أردت إعداد اختصار جديد فيمكنك ذلك بذكر اسم الاختصار ثم الأمر الذي تحلّ محله على النحو التالي:
</p>

<pre class="ipsCode" id="ips_uid_8648_32">
$ alias ls='ls --color=auto'</pre>

<p>
	يغيّر الاختصار السّابقة عمل الأمر <code>ls</code> بإضافة معطيات نريد أن تعمل مبدئيًّا؛ إظهار كلّ نوع من الملفات بلون مختلف عند تنفيذ أمر <code>ls</code>.
</p>

<p>
	<strong>ملحوظة:</strong> يمكنك إعطاء أي اسم تريده للاختصار؛ حتى ولو كان اسم أمر موجود سلفا؛ لذا ينبغي الحذر في اختيار أسماء الاختصاصرات. كما يمكنك أيضا إدراج أكثر من أمر في الاختصار على أن تفصل بينها بنقطة فاصلة <code>;</code>:
</p>

<pre class="ipsCode" id="ips_uid_8648_34">
$ alias myNewCommand='cd /usr/bin; ls; cd; clear'</pre>

<p>
	يعمل الأمر <code>alias</code> على تعديل الاختصارات بالنسبة للجلسة الحاليّة دون أن تكون التغييرات دائمة. لجعل الاختصارات تعمل بعد إعادة تشغيل النّظام أو بعد الخروج من الجلسة الحاليّة أضفها إلى الملف <code>bashrc.</code> الموجود في ملفك الشّخصي؛ إختصار واحد في كلّ سطر (في آخر الملفّ، تحت سطر <code>User specific aliases and functions #</code>)؛ مثلا:
</p>

<pre class="ipsCode" id="ips_uid_8648_36">
alias myNewCommand='cd /usr/bin; ls; cd; clear'</pre>

<p>
	ستُعتمَد التعديلات بعد الخروج من الجلسة الحاليّة.
</p>

<p>
	إن أردت أمثلة أكثر تفصيلا عن الاختصارات فدرس <a href="https://academy.hsoub.com/devops/linux/%D9%85%D9%82%D8%AF%D9%91%D9%85%D8%A9-%D8%A5%D9%84%D9%89-%D8%A7%D8%AE%D8%AA%D8%B5%D8%A7%D8%B1%D8%A7%D8%AA-%D8%A7%D9%84%D8%B7%D8%B1%D9%81%D9%8A%D8%A9-aliases-%D9%88%D8%AF%D9%88%D8%A7%D9%84%D9%87%D8%A7-%D8%A3%D9%86%D8%AC%D8%B2-%D9%85%D9%87%D8%A7%D9%85%D9%83-%D8%A8%D8%B3%D8%B1%D8%B9%D8%A9-r65/" rel="">مقدّمة إلى اختصارات الطرفية (Aliases) ودوالها - أنجز مهامك بسرعة!</a> يقدّمها.
</p>

<h3 id="أمر-exit">
	أمر exit
</h3>

<p>
	ينهي كلّ من أمري <code>exit</code> و<code>logout</code> جلسة الصّدفة. الفرق بين الاثنين أن أمر <code>exit</code> ينهي أي صدفة مهما كان نوعها بينما ينهي أمر <code>logout</code> صدفات تسجيل الدّخول؛ وهي تلك المشغَّلة تلقائيًّا عند تسجيل الدّخول من الواجهة النصيّة (الواجهة غير الرّسوميّة).
</p>

<p>
	<strong>ملحوظة:</strong> الصّدفة Shell هي اسم عامّ لأي برنامج يعطيك واجهة نصيّة للتّفاعل مع النّظام. توجد أنواع عدّة من الصّدفات؛ التفاعليّة Interactive، غير التّفاعليّة، صدفات تسجيل الدّخول Login وصدفات ما بعد الدخول Non-login. صدفات تسجيل الدّخول هي جزء من عمليّة الدّخول إلى النّظام (مثلا في خادوم ليست لديه واجهة رسوميّة)؛ أما صدفات ما بعد الدخول فيشّغلها المستخدم بعد ولوجه إلى النّظام؛ ومن أمثلتها برنامج Terminal في الواجهة الرّسومية.
</p>

<p>
	جرّب تنفيذ الأمر <code>logout </code>في برنامج الطرفيّة في الواجهة الرسوميّة ولاحظ الرسالة التي تظهر.
</p>

<h3 id="أمر-expand">
	أمر expand
</h3>

<p>
	لا تتعامل بعض البرامج المعالجة النصيّة جيّدا مع علامة الجدولة Tabulation وتحتاج بالتالي إلى استبدال المسافة بها. يؤدّي أمر <code>expand</code>، الذي يأتي ضمن حزمة برامج <code>coreutils</code>، هذه المهمة. سنفترض أن لدينا ملفًّا باسم <code>numbers</code> (امتداد الملفات ليس ذا أهميّة كبيرة في لينكس) به أرقام تفصل بينها علامات جدولة. نستخدم أمر <code>cat</code> لعرض محتوى الملفّ في الطّرفيّة:
</p>

<pre class="ipsCode" id="ips_uid_8648_48">
$ cat numbers 
one two three   four
five    six seven   eight
nine    ten twelve  thirteen</pre>

<p>
	نضع مسافات مكان علامات الجدولة كالتالي:
</p>

<pre class="ipsCode" id="ips_uid_8648_50">
$ expand --tabs=1 numbers</pre>

<p>
	يحدّد المعطى <code>tabs--</code> عدد المسافات التي نضعها مكان الجدولة (مسافة واحدة في المثال). تظهر النتيجة على النحو التالي:
</p>

<pre class="ipsCode" id="ips_uid_8648_52">
one two three four
five six seven eight
nine ten twelve  thirteen</pre>

<p>
	لاحظ أن التغييرات لا تحدُث على الملفّ، بل تُطبع مباشرة في الطّرفيّة (التي تُعرَف بـ<a href="https://academy.hsoub.com/devops/linux/%D9%85%D9%82%D8%AF%D9%91%D9%85%D8%A9-%D8%A5%D9%84%D9%89-%D8%A5%D8%B9%D8%A7%D8%AF%D8%A9-%D8%AA%D9%88%D8%AC%D9%8A%D9%87-%D8%A7%D9%84%D8%A5%D8%AF%D8%AE%D8%A7%D9%84%D8%A7%D9%84%D8%A5%D8%AE%D8%B1%D8%A7%D8%AC-io-%D9%81%D9%8A-%D9%84%D9%8A%D9%86%D9%83%D8%B3-r39/" rel="">الإدخال المعياري Standard input, stdin</a>).
</p>

<p>
	إن رغبت في الإجراء المعاكس لعمل <code>expand</code> (بمعني إحلال علامات جدولة مكان المسافات) فأمر <code>unexpand</code> موجود لهذا الغرض ويُستعمَل بنفس المبدأ.
</p>

<h3 id="أمرا-head-وtail">
	أمرا head و tail
</h3>

<p>
	يطبع أمر <code>head</code>، إن استُخدِم دون خيارات، الأسطرَ العشرة الأولى من الملفّ المذكور اسمُه في المعطى. يمكن تغيير هذا السلوك المبدئيّ باستخدام خيّار <code>n-</code> متبوعا برقم يمثّل عدد الأسطر التي تود إظهارها:
</p>

<pre class="ipsCode" id="ips_uid_8648_54">
$ head -n3 /etc/passwd</pre>

<p>
	يعمل أمر <code>tail</code> بطريقة مشابهة لكنّه بدلا من طباعة الأسطر الأولى يطبَع الأسطر الأخيرة.
</p>

<pre class="ipsCode" id="ips_uid_8648_56">
$ tail -n3 /etc/passwd</pre>

<p>
	يوفّر أمر <code>tail</code> باستخدام خيّار <code>f-</code> ميزةَ عرض الأسطر الأخيرة من ملف فور إضافتها إليه. يمكن استخدام هذه الميزة مثلا لمتابعة سجلّ Log في الوقت الحقيقيّ:
</p>

<pre class="ipsCode" id="ips_uid_8648_58">
$ tail -f file.log</pre>

<h3 id="أمر-paste">
	أمر paste
</h3>

<p>
	يأخذ أمر <code>paste</code> ملفيّن نصّييْن بمحاذاة أسطُر الملفّ الأول منهما بجانب الثاني ووضع فاصل بين السّطريْن. إن استُخدِم الأمر دون تحديد الفاصل فسيُستخدَم الفاصل المبدئي (علامة الجدولة). إن أردت تخصيص الفاصل فيمكن استخدام الخيّار <code>d-</code>. يطبع الأمر النتيجة مباشرة في الطّرفيّة دون تعديل على أي من الملفّيْن. في المثال التالي نُظهِر محتوى الملفّيْن <code>file1</code> و <code>file2</code> بالأمر <code>cat</code> ثم نستخدم <code>paste</code> لدمج الاثنيْن:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_2469_15">
<span class="pln">$ cat file1
1
2
3
4

$ cat file 2
one
two
three
four

$ paste -d= file1 file2
1=one
2=two
3=three
4=four
5=five
6=six</span></pre>

<p>
	استخدمنا في المثال السّابق الخيار <code>d-</code> لتحديد الفاصل؛ وهو في هذه الحالة علامة التساوي <code>=</code>. لاحظ ألا وجود لمسافة بين الخيار <code>d-</code> والعلامة التي اخترناها للفصل بين سطريْ الملفّين؛ كما أن أسطُر الملفّ في المعطى الأول تأتي أولا تليها علامة الفصل ثم أسطر الملف الثاني.
</p>

<h3 id="أمر-split">
	أمر split
</h3>

<p>
	يعمل الأمر <code>split</code> على تقسيم ملفّ إلى ملفّيْن أو أكثر وتسميّتهما اعتمادا على لاحقة Suffix من اختيارنا. لدينا معايير تقسيم عدّة للاختيّار بينها؛ الحجم Size، عدد الأسطُر، عدد الملفات الناتجة وطبيعتها. بالنسبة للّاحقة فيمكن أن تكون أحرفا أو أرقاما.
</p>

<p>
	يقسّم الأمر التالي الملف <code>bash.pdf</code> إلى ملفّات حجمُ كلّ واحد منها <code>50KB</code>. تبدأ الملفّات الناتجة بـ<code>_bash</code> يليها عدد.
</p>

<pre class="ipsCode" id="ips_uid_8648_62">
$ split -b 50KB -d bash.pdf bash_</pre>

<p>
	الخيّار <code>b-</code> يحدّد معيار التقسيم بحجم <code>50KB</code>؛ الخيّار <code>d-</code> يحدّد نوعيّة اللّاحقة (أعداد مرتَّبة)، <code>bash.pdf</code> اسم الملفّ الذي نريد تقسيمه و<code>_bash</code> السّابقة التي تبدأ بها أسماء الملفّات المتحصَّل عليها. مثال على النتجية:
</p>

<pre class="ipsCode" id="ips_uid_8648_64">
bash_00
bash_01
bash_02
bash_03
bash_04
bash_05</pre>

<p>
	لو لم نستخدم الخيّار <code>d-</code> لكانت النتيجة كالتالي:
</p>

<pre class="ipsCode" id="ips_uid_8648_66">
bash_aa
bash_ab
bash_ac
bash_ad
bash_ae
bash_af</pre>

<p>
	إن أردت دمج الملفّات الناتجة والحصول على الملفّ الأصلي فأمر <code>cat</code> يفي بالغرض:
</p>

<pre class="ipsCode" id="ips_uid_8648_68">
$ cat bash_00 bash_01 bash_02 bash_03 bash_04 bash_05 &gt; bash.pdf</pre>

<h3 id="أمر-tr">
	أمر tr
</h3>

<p>
	يُستخدَم أمر <code>tr</code> لإحلال محارف Characters مكان أخرى. نستخدم في المثال التالي ملف <code>file2</code> السابق وننفذ عليه أمر <code>tr</code> لإحلال <code>O</code> مكان <code>o</code> :
</p>

<pre class="ipsCode" id="ips_uid_8648_70">
$ cat file2 | tr o O</pre>

<p>
	يُستخدَم الأنبوب Pipe (<code>|</code>) لتوجيه نتيجة أمر إلى آخر؛ تُصبِح نتيجة الأمر اﻷول في هذه الحالة هي معطى الأمر الثاني. في المثال نطبع محتوى الملف <code>file2</code> ثم نمرّره للأمر <code>tr</code>؛ تظهر النتيجة في الطرفيّة:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_8648_78">
<span class="pln">One
twO
three
fOur
five
six</span></pre>

<p>
	يمكن تطبيق التحويل على مجال من الأحرف؛ في المثال التالي نُحوِّل جميع الأحرف الصّغيرة في الملف <code>file2</code> إلى أحرف كبيرة:
</p>

<pre class="ipsCode" id="ips_uid_8648_76">
$ cat file2 | tr [a-z] [A-Z]
ONE
TWO
THREE
FOUR
FIVE
SIX</pre>

<h3>
	أمرا sort و uniq
</h3>

<p>
	يتيح أمر <code>uniq</code> إمكانيّة إظهار الأسطر المكرّرة في ملف نصّي أو حذفها. يجب الانتباه إلى أن <code>uniq</code> لا يكشف التكرار إلا إذا كانت الأسطُر المتكرّرة متتالية. لذا فإن تنفيذ <code>uniq</code> يسبقه غالبا ترتيب الملفّ بالأمر <code>sort</code>.
</p>

<p>
	يفترض أمر <code>sort</code> مبدئيّا أن السّطر يتكوّن من حقول عدّة تفصل بينها مسافات؛ ويعتمد الحقل الأول لترتيب أسطُر الملف. لاحظ المثال التالي وكيف حذف أمر <code>uniq</code> أحد الأسطر بعد ترتيب الملفّ بـ <code>sort</code>:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_2469_11">
<span class="pln">$ cat file3
Jan Doe 111
Dave Null 114
Peter Cramp 113
Dave Smith 112
Dave Null 114

$ sort file3 | uniq
Dave Null 114
Dave Smith 112
Jan Doe 111
Peter Cramp 113</span></pre>

<p>
	يمكّننا خيار <code>k-</code> متبوعا برقم يمثّل موقع الحقل في السّطر (الثاني، الثالث، …) من اختيّار حقل مغاير للحقل المبدئي في ترتيب الملف. لاحظ الترتيب في المثالين:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_2469_13">
<span class="pln">$ sort -k2 file3 | uniq
Peter Cramp 113
Jan Doe 111
Dave Null 114
Dave Smith 112

$ sort -k3 file3 | uniqJan Doe 111
Dave Smith 112
Peter Cramp 113
Dave Null 114</span></pre>

<p>
	يتيح أمر <code>sort</code>  كذلك حذف الأسطُر المكرّرة مباشرة دون الحاجة لتمرير نتيجة الترتيب إلى <code>uniq</code> وذلك باستخدام الخيّار <code>u-:</code>
</p>

<pre class="ipsCode" id="ips_uid_8648_84">
$ sort -u file3
Dave Null 114
Dave Smith 112
Jan Doe 111
Peter Cramp 113</pre>

<h3 id="أمر-cut">
	أمر cut
</h3>

<p>
	يستخرج أمر <code>cut</code> أجزاءً من أسطر ويعرضها في الطّرفيّة. يعتمد الأمر على عدد البايتات (الخيار <code>b-</code>)، المحارف (<code>c-</code>) أو الحقول (<code>f-</code>).
</p>

<p>
	يتّخذ أمر <code>cut</code> مبدئيا المسافة فاصلا بين الحقول؛ إلا أن بالإمكان تخصيص الفاصل بالخيّار <code>d-</code>.
</p>

<p>
	نستخدم في المثال التالي أمر <code>cut</code> لاستخراج الحقليْن الأول والثالث من الملف <code>etc/passwd/</code> اعتمادا على أنه يُفصَل بين الحقول بعلامة <code>:</code>.
</p>

<pre class="ipsCode" id="ips_uid_8648_86">
cut -d: -f1,3 /etc/passwd</pre>

<p>
	يحدّد <code>d-</code> الفاصل بين الحقول (<code>:</code>)، و <span style="font-family:courier new,courier,monospace;"><code>f-</code></span> الحقول التي نستبقيها (الحقل الأول والثالث).
</p>

<h2 id="خاتمة">
	خاتمة
</h2>

<p>
	رأينا في هذا الدّرس أساسيّات التعامل مع الطّرفيّة، كيفيةَ الحصول على المساعدة عندما نحتاج إليها وأوامرَ هامّة لمعالجة الملفات النّصيّة من سطر الأوامر.
</p>

<p>
	استخدم وسائل المساعدة التي تحدثنا عنها للحصول على معلومات أكثر عن الأوامر الواردة في المقال. يمكنك استخدام مربع التعليقات في الأسفل لطرح استشكالات عن موضوع الدّرس.
</p>

<p>
	ترجمة -وبتصرّف- للمقال <a href="http://www.tecmint.com/rhcsa-exam-reviewing-essential-commands-system-documentation/" rel="external nofollow">RHCSA Series: Reviewing Essential Commands &amp; System Documentation</a> لصاحبه Gabriel Cánepa.
</p>
]]></description><guid isPermaLink="false">736</guid><pubDate>Tue, 26 Apr 2016 11:13:38 +0000</pubDate></item><item><title>&#x645;&#x642;&#x62F;&#x645;&#x629; &#x625;&#x644;&#x649; &#x634;&#x647;&#x627;&#x62F;&#x629; &#x625;&#x62F;&#x627;&#x631;&#x629; &#x623;&#x646;&#x638;&#x645;&#x629; &#x644;&#x64A;&#x646;&#x643;&#x633; RHCSA &#x645;&#x646; Red Hat</title><link>https://academy.hsoub.com/devops/linux/redhat/%D9%85%D9%82%D8%AF%D9%85%D8%A9-%D8%A5%D9%84%D9%89-%D8%B4%D9%87%D8%A7%D8%AF%D8%A9-%D8%A5%D8%AF%D8%A7%D8%B1%D8%A9-%D8%A3%D9%86%D8%B8%D9%85%D8%A9-%D9%84%D9%8A%D9%86%D9%83%D8%B3-rhcsa-%D9%85%D9%86-red-hat-r734/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2016_04/570a16c464853_redhat-certification-rhcs(1).png.8159713cdeea8efe2fa9ac6b35570b0c.png" /></p>

<p>
	صُمّمت شهادة Red Hat Certified System Administrator, RHCSA لاختبار المترشّح في المعارف والمهارات الضّروريّة المشتركة بين مختلف مجالات إدارة أنظمة لينكس. تعدّ شهادة RHCSA مدخل <a href="https://academy.hsoub.com/certificates/general/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%B4%D9%87%D8%A7%D8%AF%D8%A7%D8%AA-red-hat-%D8%A7%D9%84%D9%85%D8%AA%D8%AE%D8%B5%D9%91%D8%B5%D8%A9-r37/" rel="">مسار الشهادات الخاصّ بـ Red Hat</a>؛ وتليها شهادة Red Hat Certified Engineer التي تعدّ إحدى شهادات لينكس الأكثر قبولا.
</p>

<p style="text-align: center;">
	<img alt="redhat-certification-rhcs (1).png" class="ipsImage ipsImage_thumbnailed" data-fileid="14882" data-unique="38pph6vw0" src="https://academy.hsoub.com/uploads/monthly_2016_04/570a16c26f44b_redhat-certification-rhcs(1).png.119374d08e3a4a3b8e82bcd88227a077.png"></p>

<h2 id="لماذا-التقدم-لشهادة-rhcsa">
	لماذا التقدم لشهادة RHCSA
</h2>

<p>
	تتطلّب شهادة RHCSA الكثير من الاستعداد قبل التقدّم للامتحان؛ كما أنها مكلّفة. يجب أن تكون إجابة السّؤال “لماذا أريد هذه الشهادة؟” حاضرة في ذهنك قبل البدء في طريق الحصول عليها. في ما يلي أمور ينبغي الانتباه إليها قبل اتّخاذ القرار النهائي:
</p>

<ul>
<li>
		شهادة RHCSA ضروريّة بالنسبة لبعض المؤسسات التي تعتمد بكثافة على حلول Red Hat التقنيّة.
	</li>
	<li>
		ستمثّل الشهادة إضافة محسوسة لسيرتك الذاتيّة مما قد يؤدّي إلى فرص وظيفية أكثر. ولكن يجب الانتباه أيضا إلى أن الحصول على الشهادة ليس ضمانا بالحصول على الوظيفة. يجب الاستمرار في العمل والتطوير المستمر لقدراتك.
	</li>
	<li>
		توفّر Red Hat موادّ دراسية جيدة <a href="https://www.redhat.com/en/services/training" rel="external nofollow">للتحضير</a>؛ ستحصُل على معرفة جيدة حول توزيعة Red Hat Enterprise Linux بمتابعتك لهذه الموارد الدراسية.
	</li>
	<li>
		إن كنت مدير نظم لينكس متمرّسا فسيحسّن التحضير للشهادة من مهاراتك ويزيد الحصول عليها من ثقتك بقدراتك.
	</li>
	<li>
		ينبغي الانتباه أيضا إلى أن الشهادة ليست بديلا عن الخبرة التي تكتسبها من العمل اليومي.
	</li>
	<li>
		قد لا تتجاوز الامتحان من أول محاولة وتضطّر بالتالي لدفع ثمن المحاولة مرة أخرى. يجب أن تكون على وعي بهذه المخاطرة؛ وأن تقبلها.
	</li>
</ul>
<h2 id="تكلفة-شهادة-rhcsa-وطريقة-إجراء-الامتحان">
	تكلفة شهادة RHCSA وطريقة إجراء الامتحان
</h2>

<p>
	تصلُح شهادة RHCSA لمدة ثلاث سنوات من تاريخ الحصول عليها.
</p>

<h3 id="سير-الامتحان">
	سير الامتحان
</h3>

<p>
	يدوم امتحان الشهادة ساعتين ونصف، وهو امتحان تطبيقي لا مكان فيه للنظري؛ بمعنى أن لديك مهامّ ويجب تنفيذها. يبلغ عدد الأسئلة في العادة عشرين سؤالا مجموع درجاتها 300. الحد الأدنى للتجاوز هو 210 درجات. تُطرَح على كل مترشّح أسئلة فريدة (بمعنى أن الأسئلة تختلف من مترشّح لآخر) وتصله نتائج الامتحان بالبريد الإلكتروني في غضون سبعة أيام من إجرائه.
</p>

<h3 id="تكلفة-الشهادة">
	تكلفة الشهادة
</h3>

<p>
	يمكن تقسيم التكلفة الكليّة للشهادة إلى قسمين: تكلفة إجراء الاختبار وتكلفة التحضير له (اختياري). يكلّف التقدّم للاختبار حوالي 400$ حسب المنطقة الجغرافية. يمكن احتساب ما بين 200 إلى 300 دولار أمريكي في المواد الدراسية التحضيرية.
</p>

<h2 id="نصائح-قبل-التقدم-للشهادة">
	نصائح قبل التقدم للشهادة
</h2>

<p>
	الخبرة في إدارة الأنظمة مطلوبة لنيل الشهادة؛ إلا أنها ليست شرطًا لازما. يستطيع من ليست له خبرة كبيرة بإدارة أنظمة لينكس التقدّم للاختبار؛ إلا أن التحضير المكثّف جدا مطلوب في هذه الحالة. ستحتاج لمعرفة وحدات الاختبار والتركيز جيدا عليها لاستيعابها. “الممارسة ثم الممارسة” هي الوسيلة الوحيدة لفهم متطلبات الشهادة؛ طبّق كل خطوة من كل وحدة مرات ومرات. ربما تحتاج لثلاث أو أربع ساعات يوميا من التحضير لأسابيع متتالية وبوجود مواد تحضير جيدة حتى تنال الشهادة من أول محاولة.
</p>

<p>
	تفصّل صفحة الامتحان <a href="https://www.redhat.com/en/services/training/ex200-red-hat-certified-system-administrator-rhcsa-exam" rel="external nofollow">EX200</a> على موقع Red Hat الوحدات والمواضيع التي يُنتظَر من المترشح إتقانها.
</p>

<h2 id="سلسلة-دروس-rhcsa">
	سلسلة دروس RHCSA
</h2>

<p>
	تفترض هذه السلسة - على الأقل - معرفةً يسيرة بأوامر لينكس القاعديّة مثل:
</p>

<ul>
<li>
		تبديل مجلّد العمل: أمر <code>cd</code>.
	</li>
	<li>
		سرد محتويات مجلّد: أمر <code>ls</code>.
	</li>
	<li>
		نسخ الملفات: أمر <code>cp</code>.
	</li>
	<li>
		نقل الملفات أو إعادة تسميتها: أمر <code>mv</code>.
	</li>
	<li>
		إنشاء ملفات فارغة أو تحديث الختم الزمني لملفات موجودة: أمر <code>touch</code>.
	</li>
	<li>
		حذف الملفات: أمر <code>rm</code>.
	</li>
	<li>
		إنشاء مجلّد: أمر <code>mkdir</code>.
	</li>
</ul>
<p>
	سنمرّ خلال دروس هذه السلسلة على بعض الأوامر أعلاه مع أمثلة مشروحة؛ كما يمكنك استخدام طرق مذكورة في السلسلة للحصول على معلومات أكثر عنها. يمكن الحصول على نسخة من توزيعة RHEL 7 من <a href="http://developers.redhat.com/products/rhel/get-started" rel="external nofollow">موقع مطوري Red Hat</a> (هذه النسخة موجّهة للاستخدام الشّخصي فقط وينبغي ألا تُستَخدم في بيئة إنتاج).
</p>

<p>
	راجع سلسلة مقالات <a href="https://academy.hsoub.com/search/?tags=%D9%85%D8%AF%D8%AE%D9%84%20%D8%A5%D9%84%D9%89%20%D9%84%D9%8A%D9%86%D9%83%D8%B3" rel="">مدخل إلى لينكس</a> إن كانت المواضيع أعلاه غريبة عليك.
</p>

<p>
	تتكوّن هذه السلسلة من 15 درسا تغطّي المواضيع التالية:
</p>

<ul>
<li>
		مراجعة الأوامر الأساسيّة وكيفية الاستفادة من التوثيق Documentation.
	</li>
	<li>
		إدارة الملفات والمجلّدات.
	</li>
	<li>
		إدارة المستخدمين والمجموعات.
	</li>
	<li>
		التعامل مع الملفات النصّيّة: تحريرها بـ Nano و Vim؛ تحليلها بـ grep والتعابير النمطية.
	</li>
	<li>
		إدارة العمليات Process management.
	</li>
	<li>
		إعداد وسائط التخزين وتعميّتها.
	</li>
	<li>
		استخدام لوائح التحكم في الوصول Access control lists, ACL وتركيب المجلدات على الشبكة.
	</li>
	<li>
		تأمين <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة"><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة"><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة"><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr></abbr></abbr></abbr>، ضبط اسم المضيِّف Hostname وتفعيل خدمات الشبكة.
	</li>
	<li>
		تثبيت خادوم ويب ونقل الملفات، إعداده وتأمينه.
	</li>
	<li>
		إدارة الحزم بـ Yum، جدولة المهام بـ Cron ومراقبة سجلات Logs النظام.
	</li>
	<li>
		أساسيات الجدار الناري Firewall ومراقبة الشّبكة.
	</li>
	<li>
		أتممة تثبيت RHEL 7 باستخدام Kickstart.
	</li>
	<li>
		أساسيات التحكّم في الوصول في SELinux.
	</li>
	<li>
		إعداد الاستيثاق Authentication بميثاق LDAP على RHEL 7.
	</li>
	<li>
		أساسيّات الحوسبة الافتراضيّة Virtualization وإدارة الضّيوف Guest بـKVM.
	</li>
</ul>
<p>
	<strong>تنبيه:</strong> اعتُمِد أثناء التخطيط للسلسلة على التفاصيل الواردة في صفحة الامتحان EX200 المذكورة أعلاه إذ أن Red Hat تشترط على المترشحين عدم نشر الأسئلة التي تُطرح عليهم في الامتحان. يجب التأكيد أن المصدر الرسمي الوحيد لأسئلة الامتحان هو Red Hat التي يمكن أن تغيّر مواضيعه إن رأت ذلك مناسبا.
</p>
]]></description><guid isPermaLink="false">734</guid><pubDate>Fri, 15 Apr 2016 09:23:40 +0000</pubDate></item><item><title>&#x645;&#x62F;&#x62E;&#x644; &#x625;&#x644;&#x649; &#x634;&#x647;&#x627;&#x62F;&#x627;&#x62A; Red Hat &#x627;&#x644;&#x645;&#x62A;&#x62E;&#x635;&#x635;&#x629;</title><link>https://academy.hsoub.com/devops/linux/redhat/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%B4%D9%87%D8%A7%D8%AF%D8%A7%D8%AA-red-hat-%D8%A7%D9%84%D9%85%D8%AA%D8%AE%D8%B5%D8%B5%D8%A9-r733/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2016_04/redhat-certification.png.ffdee461fb3f6e8f064f91ae421581ad.png" /></p>

<p>
	تعدّ شركة Red Hat إحدى الشركات الرائدة في مجال الحلول المتعلّقة بأنظمة لينكس، فهي أول شركة متخصّصة في البرمجيات مفتوحة المصدر <a href="http://www.techeye.net/business/red-hat-is-first-2-billion-open-sourcer" rel="external nofollow">تتجاوز عائداتها ملياري دولار</a>، أربع سنوات فقط بعد تسجيل اسمها أولَ شركة في هذا المجال تتجاوز مليار دولار، سنة 2012. تُطوِّر الشركة توزيعة Red Hat Entreprise Linux المعروفة اختصارا بـ RHEL وتسوّقها عبر نظام الاشتراكات، وهي من أكثر توزيعات لينكس استخداما في المؤسسات الكبيرة؛ إذ أن أكثر من 90 بالمئة من الشركات الخمسمئة الكبرى تعتمد على RHEL لتشغيل بنيتها <a href="https://www.redhat.com/en/files/resources/tr-certification-value-infographic-inc0342957-201601-en.pdf" rel="external nofollow">حسب بيانات الشركة</a> المتعلّقة بزبنائها سنة 2014. توفّر Red Hat، إلى جانب تطويرها لتوزيعة لينكس وحلول برمجية أخرى (مثل خادوم التطبيقات JBoss)، برامجَ تدريبية وشهاداتٍ متخصّصة في إدارة الأنظمة التي تعمل بتوزيعة RHEL أو حلول Red Hat الأخرى.
</p>

<p style="text-align: center;">
	<img class="ipsImage ipsImage_thumbnailed" data-fileid="14881" data-unique="5azvgdebf" src="https://academy.hsoub.com/uploads/monthly_2016_04/redhat-certification.png.92b78f872b60c7a1a0950fbcb48736da.png" alt="redhat-certification.png"></p>

<p>
	يشبه مسار الشهادات المتخصصة في RHEL مسارات تقدّمها شركات تقنية أخرى من حيث تتالي الشهادات:
</p>

<ul>
<li>
		يبدأ المستوى الأول من المسار بشهادة مدير أنظمة Red Hat Certified System Administrator, RHCSA
	</li>
	<li>
		تليها شهادة مهندس Red Hat Certified Engineer, RHCE
	</li>
	<li>
		ثم شهادة مصمّم نُظُم Red Hat Certified Architect, RHCA
	</li>
</ul>
<p>
	تمثّل شهادة RHCSA مدخَل المسار ويجب على المترشّح الحصولُ عليها قبل أن يستطيع التقدّم لبقية الشهادات؛ أما شهادة RHCA فهي الأعلى في السّلم وينبغي للمترشّح النجاح في الشهادتين الأخرييْن قبل التقدّم للحصول عليها.
</p>

<p>
	تتخذ شهادات Red Hat من الاختبارات العمليّة وسيلةً لتقويم أداء المترشح بدلا من الاكتفاء بطرح أسئلة بخيارات متعدّدة. تدوم الاختبارات ساعتين ونصف على الأقل، يُطلَب من المترشح إكمال مهامّ تتعلّق بأهداف الاختبار.
</p>

<h2 id="شهادة-rhcsa">
	شهادة مدير أنظمة RHCSA
</h2>

<p>
	يحصُل المترشح على شهادة مدير أنظمة RHCSA بعد تجاوزه لاختبار EX200 الذي يقوِّم معرفة المترشح ومهاراته بأساسيات إدارة الأنظمة المبنية على RHEL. يُنظَر إلى المهارات المطلوبة لتجاوز اختبار EX200 على أنها مشتركة في مختلف البيئات ومخطّطات النشر Deployment المعتمدة على التوزيعة.<br>
	يشمل اختبار الشهادة المواضيع التالية:
</p>

<ul>
<li>
		معرفة الأدوات الأساسية للتعامل مع الملفات، المجلّدات، سطر الأوامر والتوثيق Documentation؛ واستيعاب آلية استخدامها.
	</li>
	<li>
		تشغيل أنظمة RHEL بما في ذلك تحديد مستوى التشغيل Run level عند الإقلاع، التعرّف على العمليات Processes، تشغيل الآلات الوهمية Virtual machines وإيقافها؛ والتحكّم في الخدمات Services.
	</li>
	<li>
		ضبط وسائل التخزين المحليّة Local storage.
	</li>
	<li>
		إنشاء أنظمة الملفات File systems وإعدادها؛ بما في ذلك خاصيّات النّظام مثل <a href="https://academy.hsoub.com/tags/%D8%A3%D8%B0%D9%88%D9%86%D8%A7%D8%AA/" rel="">الأذونات</a>، <a href="https://academy.hsoub.com/tags/%D8%AA%D8%B9%D9%85%D9%8A%D8%A9/" rel="">التعميّة</a> Encryption، لوائح التحكّم في الوصول Access control lists وغيرها.
	</li>
	<li>
		نشر الأنظمة، إعدادها وصيانتها. يدخل في هذا الإطار تثبيت البرامج، تحديثها وخدمات النظام الأساسية.
	</li>
	<li>
		إدارة <a href="https://academy.hsoub.com/devops/linux/%D8%B6%D8%A8%D8%B7-%D9%88%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF-%D8%A7%D9%84%D9%85%D8%B3%D8%AA%D8%AE%D8%AF%D9%85%D9%8A%D9%86-%D9%88%D8%A7%D9%84%D9%85%D8%AC%D9%85%D9%88%D8%B9%D8%A7%D8%AA-%D9%81%D9%8A-%D9%84%D9%8A%D9%86%D9%83%D8%B3-r78/" rel="">المستخدمين والمجموعات</a>، بما ذلك استخدامُ دليل مركزيّ للاستيثاق Authentication.
	</li>
	<li>
		إدارة <a href="https://academy.hsoub.com/tags/%D8%A3%D9%85%D9%86/" rel="">الأمان</a>؛ ومنها إعداد الجدار النّاريّ Firewall و SELinux.
	</li>
</ul>
<h2 id="شهادة-rhce">
	شهادة RHCE
</h2>

<p>
	وهي الشهادة الثانيّة في مسار شهادات RHEL. يجب على المتقدّم لهذه الشهادة أن يكون حاصلا على شهادة RHCSA صالحة (الاختبار EX200) وأن يجتاز اختبار EX300. يُنتَظر من المتقدّمين للحصول على شهادة RHCE أن يكونوا على دراية جيّدة بإدارة أنظمة RHEL مع خبرة سنة إلى ثلاث سنوات في العمل على توزيعة RHEL في إطار مؤسسي.
</p>

<p>
	يشمل اختبار EX300 المواضيع التالية:
</p>

<ul>
<li>
		إعداد المسارات الثابتة Static routes، ترشيح الحزم Packet filtering، وترجمة عناوين الشبكة Network address translation, NAT.
	</li>
	<li>
		ضبط معطيات الشغيل الخاصّة بنواة لينكس.
	</li>
	<li>
		إعداد وسائط التّخزين من نوع iSCSI.
	</li>
	<li>
		إنتاج تقارير عن استخدام موارد النظام واستغلالها.
	</li>
	<li>
		استخدام سكربتات Shell لتشغيل أنشطة صيانة النظام آليّا.
	</li>
	<li>
		إعداد الولوج إلى النظام بما في ذلك الولوج عن بعد.
	</li>
	<li>
		إعداد النظام لتوفير خدمات الشبكة مثل HTTP/HTTPS، FTP، نظام الملفات الشبكي NFS، تشارك الملفات بميثاق SMB، البريد الإلكتروني بميثاق SMTP، الولوج عن بعد بـSSH ومزامنة التوقيت بميثاق NTP.
	</li>
</ul>
<h2 id="شهادة-rhca">
	شهادة RHCA
</h2>

<p>
	وتعدّ الشهادة الأكثر تقدّما من بين شهادات RHEL. تتوجّه الشهادة إلى الخبراء الذين يريدون التّدليل على قدرتهم على استخدام RHEL وتقنيات Red Hat أخرى ضمن بيئات عمل موجودة أو يُخطَّط لإنشائها. ينبغي على المتقدّم لهذه الشهادة - إضافة إلى امتلاكه لشهادتي RHCSA وRHCE سابقتيْ الذكر - تجاوز خمسة اختبارات في أحد المجالات التالية:
</p>

<ul>
<li>
		مراكز البيانات Datacenters (اختيار خمسة من بين <a href="https://www.redhat.com/en/services/certification/rhca/datacenter" rel="external nofollow">تسعة اختبارات</a>): يتوجّه للحاصلين على شهادة RHCE ممّن يودون إبراز قدراتهم على التخطيط لمراكز بيانات تعتمد على حلول Red Hat وتشغيلها.
	</li>
	<li>
		الحوسبة السحابيّة Cloud (الاختيار من بين <a href="https://www.redhat.com/en/services/certification/rhca/cloud" rel="external nofollow">ثمانية اختبارات</a>): يُنتظر من المتقدّمين للتخصّص في هذا المجال الفهمُ العميق لحلول Red Hat في مجال إنشاء بنى تحتيّة سحابيّة والعمل عليها.
	</li>
	<li>
		منصات التطبيقات Application platform (تجاوز <a href="https://www.redhat.com/en/services/certification/rhca/application-platform" rel="external nofollow">خمسة اختبارات</a>): يتركّز اهتمام هذا المجال على الأدوات الخاصّة ببناء التطبيقات وإدارتها.
	</li>
	<li>
		تطوير التطبيقات Application development (الاختيار من بين <a href="https://www.redhat.com/en/services/certification/rhca/application-platform" rel="external nofollow">ثمانية اختبارات</a>): يختصّ بالمهارات اللّازمة لتطوير تطبيقات المؤسسات، دمجها Integration وتصميم بناها التحتيّة.
	</li>
	<li>
		العمليّات والتطوير DevOps (<a href="https://www.redhat.com/en/services/certification/rhca/devops" rel="external nofollow">خمسة اختبارات</a>؛ بعضها في طور التّحضير): تركّز الاختبارات في هذا المجال على المهارات اللّازمة للتسريع من نقل التطبيقات بين بيئات العمل والانتقال بها بين الأطوار المختلفة من التطوير إلى العمل في بيئة الإنتاج مرورا بالبناء والاختبار. تعدّ الحاويّات Containers جزءا هامًّا من مواضيع هذا المجال.
	</li>
</ul>
<p>
	يمكن أن نلاحظ وجود تقاطع بين المجالات في الاختبارات المطلوبة.
</p>

<h2 id="التسعير-والصلاحية">
	التسعير والصلاحية
</h2>

<p>
	تسعّر Red Hat شهاداتها حسب الاختبارات المطلوبة لنيلها. تبلغ تكلفة الاختبار 400 دولار أمريكي بالنسبة لاختبارات الشهادتيْن RHCSA و RHCE؛ أي 400 دولار لكلّ واحدة منهما. فيما تصل التكلفة إلى 600 دولار بالنسبة لاختبارات شهادة RHCA؛ أي 3000 دولار للشهادة. يمكن أن تختلف التسعيرة حسب المنطقة الجغرافية.
</p>

<p>
	تصلُح شهادة RHCSA لمدة ثلاث سنوات ابتداءً من تاريخ نيلها؛ تزيد مدة الصلاحية المتبقيّة للشهادة بثلاث سنوات إن حصل صاحبها على الشهادة الموالية RHCE التي تدوم مدة صلاحيتها لثلاث سنوات من تاريخ الحصول عليها. نفس المبدأ يُطبَّق عند الحصول على شهادة متخصّصة من شهادات RHCA ما عدا بضعة شهادات متعلّقة بـ JBoss.
</p>

<h2 id="التدريب-والتحضير">
	التدريب والتحضير
</h2>

<p>
	توفّر Red Hat <a href="https://www.redhat.com/en/services/training/all-courses-exams" rel="external nofollow">دورات تدريبيّة</a> لمختلف اختباراتها إما في مراكز تابعة للشركة أو على الإنترنت؛ كما تتيح <a href="http://www.redhat.com/en/services/training/learning-subscription" rel="external nofollow">اشتراكا مدته سنة</a> لكامل المحتوى التعليمي على موقعها. يمكن أيضا اتباع دورات تحضيرية لدى أحد المراكز المتعاونة <a href="https://www.redhat.com/en/services/training/locations-facilities" rel="external nofollow">المعتمدة</a>.
</p>
]]></description><guid isPermaLink="false">733</guid><pubDate>Mon, 11 Apr 2016 13:52:28 +0000</pubDate></item></channel></rss>
