<?xml version="1.0"?>
<rss version="2.0"><channel><title>DevOps: Linux &#x644;&#x64A;&#x646;&#x643;&#x633;</title><link>https://academy.hsoub.com/devops/linux/page/4/?d=4</link><description>DevOps: Linux &#x644;&#x64A;&#x646;&#x643;&#x633;</description><language>ar</language><item><title>&#x62F;&#x644;&#x64A;&#x644; &#x627;&#x644;&#x631;&#x628;&#x637; &#x627;&#x644;&#x634;&#x628;&#x643;&#x64A; &#x641;&#x64A; &#x62A;&#x631;&#x645;&#x64A;&#x632; CIDR &#x648;&#x636;&#x628;&#x637;&#x647; &#x641;&#x64A; &#x644;&#x64A;&#x646;&#x643;&#x633;</title><link>https://academy.hsoub.com/devops/linux/%D8%AF%D9%84%D9%8A%D9%84-%D8%A7%D9%84%D8%B1%D8%A8%D8%B7-%D8%A7%D9%84%D8%B4%D8%A8%D9%83%D9%8A-%D9%81%D9%8A-%D8%AA%D8%B1%D9%85%D9%8A%D8%B2-cidr-%D9%88%D8%B6%D8%A8%D8%B7%D9%87-%D9%81%D9%8A-%D9%84%D9%8A%D9%86%D9%83%D8%B3-r565/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2021_12/61b330f904e13_-----CIDR---.png.db0c6f581423732756a82ac585641fea.png" /></p>

<p>
	يعد الترميز الشبكي أحد مفاهيم <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%D9%88%D8%AC%D9%8A%D9%87-%D8%A7%D9%84%D8%B4%D8%A8%D9%83%D9%8A-%D9%81%D9%8A-%D9%86%D8%B8%D8%A7%D9%85-%D8%A7%D9%84%D8%AA%D8%B4%D8%BA%D9%8A%D9%84-%D9%84%D9%8A%D9%86%D9%83%D8%B3-r564/" rel="">التوجيه</a> الرئيسية في الشبكات التي يجب أن يكون بديهيًا للمستخدم المحترف <a href="https://academy.hsoub.com/devops/linux/%D9%85%D8%A7-%D9%87%D9%88-%D9%86%D8%B8%D8%A7%D9%85-%D8%A7%D9%84%D8%AA%D8%B4%D8%BA%D9%8A%D9%84-%D9%84%D9%8A%D9%86%D9%83%D8%B3%D8%9F-r451/" rel="">لنظام التشغيل لينكس</a>، إذ سنوضح في هذه المقالة ما هو CIDR، وما هي آلية عمله. يرمز اختصار CIDR إلى <a href="https://academy.hsoub.com/devops/networking/%D8%A7%D9%84%D8%A5%D8%B5%D8%AF%D8%A7%D8%B1-%D8%A7%D9%84%D8%B3%D8%A7%D8%AF%D8%B3-%D9%85%D9%86-%D8%A8%D8%B1%D9%88%D8%AA%D9%88%D9%83%D9%88%D9%84-ip-r504/" rel="">التوجيه بين النطاقات عديم التصنيف</a>، وهو نظام ترميز عنونة الشبكة الذي يستخدم لتحديد الجزء الخاص بعنوان الشبكة في عنوان IP.
</p>

<h2>
	فئات عناوين الشبكة
</h2>

<p>
	قبل أن نبدأ بشرح آلية عمل CIDR دعونا نطلع على ترميز الشبكة الفئوي classful الذي حل CIDR محله. طُرِح النظام الفئوي في عام 1981، وكان يعرِّف 5 فئات لعناوين الشبكة تستخدم في تحديد الأجهزة الموصولة على الإنترنت وعنونتها. تحدَّد الفئة المخصصة للشبكة بأول 4 بتات من العنوان.
</p>
<style type="text/css">
table {
    width: 100%;
}

thead {
    vertical-align: middle;
    text-align: center;
} 

td, th {
    border: 1px solid #dddddd;
    text-align: right;
    padding: 8px;
    text-align: inherit;

}
tr:nth-child(even) {
    background-color: #dddddd;
}</style>
<table>
<thead><tr>
<th>
				العنوان/ الشبكة
			</th>
			<th>
				الشبكات
			</th>
			<th>
				CIDR
			</th>
			<th>
				قناع الشبكة
			</th>
			<th>
				النهاية
			</th>
			<th>
				البداية
			</th>
			<th>
				البتات البادئة
			</th>
			<th>
				الفئة
			</th>
		</tr></thead>
<tbody>
<tr>
<td>
				16,177,216 (2<sup>24</sup>)
			</td>
			<td>
				128
			</td>
			<td>
				8/
			</td>
			<td>
				255.0.0.0
			</td>
			<td>
				127.255.255.255
			</td>
			<td>
				0.0.0.0
			</td>
			<td>
				0
			</td>
			<td>
				A
			</td>
		</tr>
<tr>
<td>
				65,536 (2<sup>16</sup>)
			</td>
			<td>
				16,384
			</td>
			<td>
				16/
			</td>
			<td>
				255.255.0.0
			</td>
			<td>
				191.255.255.255
			</td>
			<td>
				128.0.0.0
			</td>
			<td>
				10
			</td>
			<td>
				B
			</td>
		</tr>
<tr>
<td>
				256 (2<sup>8</sup>)
			</td>
			<td>
				2,097,152
			</td>
			<td>
				24/
			</td>
			<td>
				255.255.255.0
			</td>
			<td>
				223.255.255.255
			</td>
			<td>
				192.0.0.0
			</td>
			<td>
				110
			</td>
			<td>
				C
			</td>
		</tr>
<tr>
<td>
				غير محددة
			</td>
			<td>
				غير محددة
			</td>
			<td>
				 
			</td>
			<td>
				 
			</td>
			<td>
				239.255.255.255
			</td>
			<td>
				224.0.0.0
			</td>
			<td>
				1110
			</td>
			<td>
				D
			</td>
		</tr>
<tr>
<td>
				غير محددة
			</td>
			<td>
				غير محددة
			</td>
			<td>
				 
			</td>
			<td>
				 
			</td>
			<td>
				255.255.255.255
			</td>
			<td>
				240.0.0.0
			</td>
			<td>
				1111
			</td>
			<td>
				E
			</td>
		</tr>
</tbody>
</table>
<p>
	يعرض الجدول فئات عناوين الشبكة الخمسة التي تحددها عنونة الشبكة الفئوية، متضمنًا كلًا من قناع الشبكة وترميز CIDR لكل فئة. الفئات A و B و C هي مجالات عناوين البث الأحادي unicast التي يشيع إسنادها إلى المؤسَّسات. يشير البث الأحادي إلى أن رزم البيانات ترسَل إلى مضيف واحد. أما الفئة D مخصصة لما يسمى بمجال عناوين البث المتعدد multicast، إذ ترسل في هذا المجال رزم البيانات إلى جميع المضيفين الموجودين ضمن شبكة محددة. لم يكن هذا المجال من <a href="https://academy.hsoub.com/devops/networking/%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-%D9%88%D8%A7%D9%84%D8%B9%D9%86%D8%A7%D9%88%D9%8A%D9%86-%D9%88%D8%A7%D9%84%D8%A3%D8%AE%D8%B7%D8%A7%D8%A1-%D9%81%D9%8A-%D8%A8%D8%B1%D9%88%D8%AA%D9%88%D9%83%D9%88%D9%84-ip-r498/" rel="">العناوين IP</a> مستخدمًا تقريبًا. وأما مجال عناوين الفئة E كان محجوزًا لإمكانية التوسع في المستقبل لكنه لم يستخدَم أيضًا قط.
</p>

<p>
	لاحظ أنه لا يوجد إلا 3 احتمالات لأقنعة الشبكة التي تتوافق مع كل فئة من الشبكات الفئوية، وهي: 255.0.0.0 (8 بت)، و 255.255.0.0 (16 بت)، و 255.255.255.0 (24 بت)، مقسَّمةً إلى ثمانيات منفصلة. هذا إحدى العوامل التي جعلت تخصيص العناوين العامة Public IP addresses محدودًا، ويرجع ذلك إلى عدد الشبكات المحدود نسبيًا الذي تحدده هذه الفئات.
</p>

<p>
	للأسف أدى تخصيص الشبكات الفئوية إلى هدر ضخم في العناوين. فمثلًا عندما تطلب المؤسَّسات الحصول على عدد من العناوين الذي يكون أكبر من عدد العناوين المتاحة في شبكة من الفئة C، سيخصص لهم شبكةً كاملةً من الفئة B سواءً احتاجوا إلى جميع العناوين في تلك الشبكة أم لا. وينطبق المثال ذاته على الشبكات من الفئة B، فبعض المؤسَّسات الكبرى احتاجت إلى شبكة أكبر من الشبكات من الفئة B فخصِّصت لهم شبكات من الفئة A. وبالتالي خُصص عدد هائل من العناوين IP لبعض المؤسَّسات الكبرى فقط.
</p>

<p>
	من المهم أن نفهم أن أول 4 بتات (التي تكون أقصى اليسار) من العنوان هي من تحدد فئة الشبكة، وليس قناع الشبكة أو CIDR المكافئ له. هذا يعني من الناحية العملية أنه لا يمكن تقسيم الشبكات الضخمة إلى شبكات فرعية على مستوى الإنترنت، لأن <a href="https://academy.hsoub.com/certificates/cisco/ccna/%d8%a7%d8%b3%d8%aa%d9%83%d8%b4%d8%a7%d9%81-%d9%88%d8%b8%d8%a7%d8%a6%d9%81-%d8%a7%d9%84%d9%85%d9%88%d8%ac%d9%87%d8%a7%d8%aa-%d9%81%d9%8a-%d8%a7%d9%84%d8%b4%d8%a8%d9%83%d8%a7%d8%aa-r21/" rel="">الموجهات</a> على الإنترنت تستطيع تحديد مسارًا واحدًا فقط إلى كل شبكة فئوية مخصصة. إضافةً إلى ذلك، رغم أن المؤسسَّسات التي تملك الشبكات الفئوية الضخمة تستطيع تقسيمها إلى شبكات فرعية، لكن توجيه الرزم إلى مواقع جغرافية أخرى تنتمي إلى نفس الشبكة سيتطلب عندها أن تستخدم المؤسَّسة شبكات داخلية خاصة أو <a href="https://academy.hsoub.com/devops/security/vpn/" rel="">شبكات خاصة افتراضية <abbr title="Virtual Private Network | الشبكة الخاصة الافتراضية">VPN</abbr></a> عامة ذات تكلفة باهظة.
</p>

<p>
	مثلًا ليكن لدينا شركة تتضمن 6 أقسام وتحتاج إلى تخصيص 400 عنوان IP لكل منها، التي يعادل مجموعها 2400 عنوان. لن تفي شبكة واحدة من الفئة C التي تحتوي على 256 عنوان IP فقط بالغرض، لذا ستُخصَّص للشركة شبكة من الفئة B التي تعنون حتى 65,536 جهاز، لذا ستهدَر العناوين 63,136 المتبقية لأنه لا يمكن تخصيصها لمؤسَّسة أخرى.
</p>

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		اقتباس
	</div>

	<div class="ipsQuote_contents ipsClearfix">
		<p>
			<strong>ملاحظة:</strong> من الضروري في هذا المثال استخدام جزء من مجموعة عناوين 10.0.0.0/8 CIDR الخاصة الحالية بدلًا من العنوان العام من الفئة B، وهذا تجنبًا لذكر عناوين عامة قد تكون مخصصةً لإحدى المؤسَّسات.
		</p>
	</div>
</blockquote>

<p>
	استخدمت برنامج <strong>sipcalc</strong> على موجه الأوامر لتوفير المعلومات الشبكية لهذه الشبكة من الفئة B التي اخترتها عشوائيًا من مجال العناوين العام المزيف. يوفر الأمر <code>sipcalc</code> عددًا كبيرًا من المعلومات عن عنوان أو مجال من العناوين IP. وكما سترى لاحقًا، يستطيع هذا الأمر توليد قائمةً بالشبكات الفرعية ضمن مجال عناوين محدد عند تزويده بقناع الشبكة. قد تضطر إلى تثبيت برنامج <strong>sipcalc</strong>، حيث أنه لم يكن مثبتًا افتراضيًا على <a href="https://academy.hsoub.com/files/24-%D8%A3%D9%86%D8%B8%D9%85%D8%A9-%D8%A7%D9%84%D8%AA%D8%B4%D8%BA%D9%8A%D9%84-%D9%84%D9%84%D9%85%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D9%86/" rel="">نظام التشغيل</a> فيدورا Fedora لدي.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_5494_13" style="">
<span class="pln">$ sipcalc </span><span class="lit">10.125</span><span class="pun">.</span><span class="lit">0.0</span><span class="pun">/</span><span class="lit">16</span><span class="pln">   
</span><span class="pun">-[</span><span class="pln">ipv4 </span><span class="pun">:</span><span class="pln"> </span><span class="lit">10.125</span><span class="pun">.</span><span class="lit">0.0</span><span class="pun">/</span><span class="lit">16</span><span class="pun">]</span><span class="pln"> </span><span class="pun">-</span><span class="pln"> </span><span class="lit">0</span><span class="pln">

</span><span class="pun">[</span><span class="pln">CIDR</span><span class="pun">]</span><span class="pln">
</span><span class="typ">Host</span><span class="pln"> address            </span><span class="pun">-</span><span class="pln"> </span><span class="lit">10.125</span><span class="pun">.</span><span class="lit">0.0</span><span class="pln">
</span><span class="typ">Host</span><span class="pln"> address </span><span class="pun">(</span><span class="pln">decimal</span><span class="pun">)</span><span class="pln">  </span><span class="pun">-</span><span class="pln"> </span><span class="lit">175964160</span><span class="pln">
</span><span class="typ">Host</span><span class="pln"> address </span><span class="pun">(</span><span class="pln">hex</span><span class="pun">)</span><span class="pln">      </span><span class="pun">-</span><span class="pln"> A7D0000
</span><span class="typ">Network</span><span class="pln"> address         </span><span class="pun">-</span><span class="pln"> </span><span class="lit">10.125</span><span class="pun">.</span><span class="lit">0.0</span><span class="pln">
</span><span class="typ">Network</span><span class="pln"> mask            </span><span class="pun">-</span><span class="pln"> </span><span class="lit">255.255</span><span class="pun">.</span><span class="lit">0.0</span><span class="pln">
</span><span class="typ">Network</span><span class="pln"> mask </span><span class="pun">(</span><span class="pln">bits</span><span class="pun">)</span><span class="pln">     </span><span class="pun">-</span><span class="pln"> </span><span class="lit">16</span><span class="pln">
</span><span class="typ">Network</span><span class="pln"> mask </span><span class="pun">(</span><span class="pln">hex</span><span class="pun">)</span><span class="pln">      </span><span class="pun">-</span><span class="pln"> FFFF0000
</span><span class="typ">Broadcast</span><span class="pln"> address       </span><span class="pun">-</span><span class="pln"> </span><span class="lit">10.125</span><span class="pun">.</span><span class="lit">255.255</span><span class="pln">
</span><span class="typ">Cisco</span><span class="pln"> wildcard          </span><span class="pun">-</span><span class="pln"> </span><span class="lit">0.0</span><span class="pun">.</span><span class="lit">255.255</span><span class="pln">
</span><span class="typ">Addresses</span><span class="pln"> in network    </span><span class="pun">-</span><span class="pln"> </span><span class="lit">65536</span><span class="pln">
</span><span class="typ">Network</span><span class="pln"> range           </span><span class="pun">-</span><span class="pln"> </span><span class="lit">10.125</span><span class="pun">.</span><span class="lit">0.0</span><span class="pln"> </span><span class="pun">-</span><span class="pln"> </span><span class="lit">10.125</span><span class="pun">.</span><span class="lit">255.255</span><span class="pln">
</span><span class="typ">Usable</span><span class="pln"> range            </span><span class="pun">-</span><span class="pln"> </span><span class="lit">10.125</span><span class="pun">.</span><span class="lit">0.1</span><span class="pln"> </span><span class="pun">-</span><span class="pln"> </span><span class="lit">10.125</span><span class="pun">.</span><span class="lit">255.254</span></pre>

<p>
	يظهر خرج الأمر <strong>sipcalc</strong> عنوان الشبكة network address وقناع الشبكة netmask ومجال عناوين الشبكة network address range إضافةً إلى العناوين المتاحة في هذا المجال وغير ذلك. إن العنوان 10.125.0.0 هو عنوان الشبكة والعنوان 10.125.255.255 هو عنوان البث العام broadcast لهذه الشبكة. لا يمكن إسناد هذين العنوانين إلى المضيفين.
</p>

<p>
	كان الخيار الآخر المتاح تخصيص عدة شبكات من الفئة C للشركة. سيخفض هذا الخيار عناوين IP المهدورة بدرجة كبيرة لكن سيصبح ضبط التوجيه بين شبكات هذه الشركة معقدًا أكثر من ضبط التوجيه لشبكة واحدة. كما سيخفض هذا الخيار عدد الشبكات المتاحة من الفئة C التي تستطيع مؤسسات أخرى حجزها.
</p>

<h2>
	مفهوم CIDR
</h2>

<p>
	طُرح مفهوم ترميز CIDR في عام 1993 كوسيلة <a href="http://www.linuxjournal.com/article/3017" rel="external nofollow">لإطالة عمر عناوين IPV4</a> التي كانت تنفد منها العناوين المتاحة. حقق ترميز CIDR هذا بأن أتاح للمؤسَّسات أن تستفيد استفادةً كاملةً من مجالات عناوين IPV4 المسنَدة إليها، وبإتاحة بعض مجالات العناوين التي كانت محجوزة.
</p>

<p>
	حسّن نهج <a href="https://tools.ietf.org/html/rfc1918" rel="external nofollow">RFC1918</a> من CIDR بتخصيص شبكات محجوزة من مجالات الفئات A و B و C لا يمكن توجيهها خارج الشبكة الداخلية. تستطيع أية مؤسَّسة استخدام هذه الشبكات الخاصة private networks بحرية ضمن شبكاتها الداخلية. لذا لم يعد ضروريًا أن يسنَد عنوان IP عام لكل حاسوب. كانت لهذه الخاصية الحصة الأكبر في حل عدة مشاكل.
</p>

<table>
<thead><tr>
<th>
				عدد عناوين IP
			</th>
			<th>
				مجال العناوين
			</th>
			<th>
				مجموعة CIDR
			</th>
		</tr></thead>
<tbody>
<tr>
<td>
				16,777,216
			</td>
			<td>
				10.0.0.0 – 10.255.255.255
			</td>
			<td>
				10.0.0.0/8
			</td>
		</tr>
<tr>
<td>
				1,048,576
			</td>
			<td>
				172.16.0.0 – 172.31.255.25
			</td>
			<td>
				172.16.0.0/12
			</td>
		</tr>
<tr>
<td>
				65,536
			</td>
			<td>
				192.168.0.0 – 192.168.255.255
			</td>
			<td>
				192.168.0.0/16
			</td>
		</tr>
</tbody>
</table>
<p>
	أتاحت هذه الشبكات الخاصة الداخلية تخصيص عنوان IP عام أو أكثر قليلًا للمؤسَّسة الواحدة لتتمكن من الوصول إلى الإنترنت الخارجي، وتوفير مجالات عناوين خاصة واسعة ضمن الشبكات الداخلية. ويمكن لأكثر من مؤسَّسة مختلفة استخدام أي مجال من مجالات العناوين هذه، لأن عناوين الشبكة الخاصة هذه لا يمكن توجيهها عبر الإنترنت، لكن بالطبع تستطيع المؤسَّسات التوجيه بين الشبكات الخاصة داخليًا.
</p>

<p>
	لنعد إلى الشركة في مثالنا، ولنفترض أنها تحتاج إلى عنوان IP عام واحد فقط للاتصال بالعالم الخارجي. لا يخصص مزود الخدمة الذي تتعامل معه الشركة مجموعات تحتوي أقل من 4 عناوين، اثنان منهم محجوزان لعنوان الشبكة وعنوان البث العام، ويبقى عنوانين فقط يمكن إسنادهما إلى الأجهزة. يحقق هذا توازنًا بين العناوين التي لا يمكن إسنادها بسبب المغالاة في تقسيم الشبكة إلى شبكات فرعية subnetting، والعناوين المهدورة، والكلفة المترتبة على العميل.
</p>

<p>
	يخصص مزود خدمة الإنترنت عنوان شبكة عام للشركة، وهو 10.125.16.32/30. تذكر مثلًا أننا سنستخدم جزءًا من الشبكة الخاصة 10.0.0.0/8 على أنه شبكة عامة. سيوفر هذا التخصيص للشركة الشبكة العامة التالية:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_5494_18" style="">
<span class="pln">$ sipcalc </span><span class="lit">10.125</span><span class="pun">.</span><span class="lit">16.32</span><span class="pun">/</span><span class="lit">30</span><span class="pln">
</span><span class="pun">-[</span><span class="pln">ipv4 </span><span class="pun">:</span><span class="pln"> </span><span class="lit">10.125</span><span class="pun">.</span><span class="lit">16.32</span><span class="pun">/</span><span class="lit">30</span><span class="pun">]</span><span class="pln"> </span><span class="pun">-</span><span class="pln"> </span><span class="lit">0</span><span class="pln">

</span><span class="pun">[</span><span class="pln">CIDR</span><span class="pun">]</span><span class="pln">
</span><span class="typ">Host</span><span class="pln"> address            </span><span class="pun">-</span><span class="pln"> </span><span class="lit">10.125</span><span class="pun">.</span><span class="lit">16.32</span><span class="pln">
</span><span class="typ">Host</span><span class="pln"> address </span><span class="pun">(</span><span class="pln">decimal</span><span class="pun">)</span><span class="pln">  </span><span class="pun">-</span><span class="pln"> </span><span class="lit">175968288</span><span class="pln">
</span><span class="typ">Host</span><span class="pln"> address </span><span class="pun">(</span><span class="pln">hex</span><span class="pun">)</span><span class="pln">      </span><span class="pun">-</span><span class="pln"> A7D1020
</span><span class="typ">Network</span><span class="pln"> address         </span><span class="pun">-</span><span class="pln"> </span><span class="lit">10.125</span><span class="pun">.</span><span class="lit">16.32</span><span class="pln">
</span><span class="typ">Network</span><span class="pln"> mask            </span><span class="pun">-</span><span class="pln"> </span><span class="lit">255.255</span><span class="pun">.</span><span class="lit">255.252</span><span class="pln">
</span><span class="typ">Network</span><span class="pln"> mask </span><span class="pun">(</span><span class="pln">bits</span><span class="pun">)</span><span class="pln">     </span><span class="pun">-</span><span class="pln"> </span><span class="lit">30</span><span class="pln">
</span><span class="typ">Network</span><span class="pln"> mask </span><span class="pun">(</span><span class="pln">hex</span><span class="pun">)</span><span class="pln">      </span><span class="pun">-</span><span class="pln"> FFFFFFFC
</span><span class="typ">Broadcast</span><span class="pln"> address       </span><span class="pun">-</span><span class="pln"> </span><span class="lit">10.125</span><span class="pun">.</span><span class="lit">16.35</span><span class="pln">
</span><span class="typ">Cisco</span><span class="pln"> wildcard          </span><span class="pun">-</span><span class="pln"> </span><span class="lit">0.0</span><span class="pun">.</span><span class="lit">0.3</span><span class="pln">
</span><span class="typ">Addresses</span><span class="pln"> in network    </span><span class="pun">-</span><span class="pln"> </span><span class="lit">4</span><span class="pln">
</span><span class="typ">Network</span><span class="pln"> range           </span><span class="pun">-</span><span class="pln"> </span><span class="lit">10.125</span><span class="pun">.</span><span class="lit">16.32</span><span class="pln"> </span><span class="pun">-</span><span class="pln"> </span><span class="lit">10.125</span><span class="pun">.</span><span class="lit">16.35</span><span class="pln">
</span><span class="typ">Usable</span><span class="pln"> range            </span><span class="pun">-</span><span class="pln"> </span><span class="lit">10.125</span><span class="pun">.</span><span class="lit">16.33</span><span class="pln"> </span><span class="pun">-</span><span class="pln"> </span><span class="lit">10.125</span><span class="pun">.</span><span class="lit">16.34</span></pre>

<p>
	تستطيع الشركة في مثالنا أن تختار استخدام أي مجال من مجالات الشبكة الخاصة ضمن شبكتها الداخلية، ثم تستعين بخدمة ترجمة عنوان الشبكة NAT للوصول إلى العالم الخارجي من شبكتها الداخلية الخاصة.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_5494_22" style="">
<span class="pln">$ sipcalc </span><span class="lit">172.16</span><span class="pun">.</span><span class="lit">0.0</span><span class="pun">/</span><span class="lit">12</span><span class="pln">
</span><span class="pun">-[</span><span class="pln">ipv4 </span><span class="pun">:</span><span class="pln"> </span><span class="lit">172.16</span><span class="pun">.</span><span class="lit">0.0</span><span class="pun">/</span><span class="lit">12</span><span class="pun">]</span><span class="pln"> </span><span class="pun">-</span><span class="pln"> </span><span class="lit">0</span><span class="pln">

</span><span class="pun">[</span><span class="pln">CIDR</span><span class="pun">]</span><span class="pln">
</span><span class="typ">Host</span><span class="pln"> address            </span><span class="pun">-</span><span class="pln"> </span><span class="lit">172.16</span><span class="pun">.</span><span class="lit">0.0</span><span class="pln">
</span><span class="typ">Host</span><span class="pln"> address </span><span class="pun">(</span><span class="pln">decimal</span><span class="pun">)</span><span class="pln">  </span><span class="pun">-</span><span class="pln"> </span><span class="lit">2886729728</span><span class="pln">
</span><span class="typ">Host</span><span class="pln"> address </span><span class="pun">(</span><span class="pln">hex</span><span class="pun">)</span><span class="pln">      </span><span class="pun">-</span><span class="pln"> AC100000
</span><span class="typ">Network</span><span class="pln"> address         </span><span class="pun">-</span><span class="pln"> </span><span class="lit">172.16</span><span class="pun">.</span><span class="lit">0.0</span><span class="pln">
</span><span class="typ">Network</span><span class="pln"> mask            </span><span class="pun">-</span><span class="pln"> </span><span class="lit">255.240</span><span class="pun">.</span><span class="lit">0.0</span><span class="pln">
</span><span class="typ">Network</span><span class="pln"> mask </span><span class="pun">(</span><span class="pln">bits</span><span class="pun">)</span><span class="pln">     </span><span class="pun">-</span><span class="pln"> </span><span class="lit">12</span><span class="pln">
</span><span class="typ">Network</span><span class="pln"> mask </span><span class="pun">(</span><span class="pln">hex</span><span class="pun">)</span><span class="pln">      </span><span class="pun">-</span><span class="pln"> FFF00000
</span><span class="typ">Broadcast</span><span class="pln"> address       </span><span class="pun">-</span><span class="pln"> </span><span class="lit">172.31</span><span class="pun">.</span><span class="lit">255.255</span><span class="pln">
</span><span class="typ">Cisco</span><span class="pln"> wildcard          </span><span class="pun">-</span><span class="pln"> </span><span class="lit">0.15</span><span class="pun">.</span><span class="lit">255.255</span><span class="pln">
</span><span class="typ">Addresses</span><span class="pln"> in network    </span><span class="pun">-</span><span class="pln"> </span><span class="lit">1048576</span><span class="pln">
</span><span class="typ">Network</span><span class="pln"> range           </span><span class="pun">-</span><span class="pln"> </span><span class="lit">172.16</span><span class="pun">.</span><span class="lit">0.0</span><span class="pln"> </span><span class="pun">-</span><span class="pln"> </span><span class="lit">172.31</span><span class="pun">.</span><span class="lit">255.255</span><span class="pln">
</span><span class="typ">Usable</span><span class="pln"> range            </span><span class="pun">-</span><span class="pln"> </span><span class="lit">172.16</span><span class="pun">.</span><span class="lit">0.1</span><span class="pln"> </span><span class="pun">-</span><span class="pln"> </span><span class="lit">172.31</span><span class="pun">.</span><span class="lit">255.254</span></pre>

<p>
	في الوهلة الأولى، قد يكون أول أمر واضح تفعله هو اختيار شبكة من المجال الخاص 172.16.0.0/12 لتوفير مجال واسع بما يكفي لشبكة داخلية واحدة. يمكنهم مثلًا اختيار الشبكة 172.16.0.0/12 التي ستوفر حيز الشبكة الداخلية التالية لهم.
</p>

<p>
	لاحظ أن هذه الشبكة لا تتوافق مع الشبكة من الفئة B المتعارف عليها لأنها تتضمن عددًا أقل من بتات الشبكة في قناع الشبكة، وبالتالي هي توفر حيزًا أوسع لبتات عنوان المضيف، إذ تتيح بتات الشبكة الاثنا عشرة حيز عشرين بتًا للمضيفين، أو 1,048,576 مضيف بالمجمَل. هذا العدد من المضيفين أكبر بكثير من العدد الذي توفره الشبكة من الفئة B المتعارف عليها للشبكة الواحدة. كما أنه حيز أوسع بكثير مما يحتاجون إليه فعلًا لشبكتهم.
</p>

<h2>
	أقنعة الشبكة متغيرة الطول VLSM
</h2>

<p>
	رافق CIDR ظهور نهج جديد مختلف عن نهج تحديد قناع الشبكة المتعارف عليه، يسمى أقنعة الشبكة متغيرة الطول VLSM. أشرنا إلى هذا النهج عند استخدام قناع شبكة من 12 بت لمجال العناوين الخاص المحدد بمجموعة CIDR Block في المثال السابق.
</p>

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

<p>
	تستطيع استخدام الأمر <code>sipcalc - s xx</code> لحساب عدد الشبكات الفرعية في مجال العناوين الخاصة، حيث تستبدل <strong>xx</strong> بعدد البتات في قناع الشبكة. مثلًا يستعرض الأمر في المثال التالي <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> الستة عشرة للشبكة 172.16.0.0/12 التي قناع الشبكة الخاص بها هو 16 بت.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_5494_24" style="">
<span class="pln">$ sipcalc </span><span class="lit">172.16</span><span class="pun">.</span><span class="lit">0.0</span><span class="pun">/</span><span class="lit">12</span><span class="pln"> </span><span class="pun">-</span><span class="pln">s </span><span class="lit">16</span><span class="pln">
</span><span class="pun">-[</span><span class="pln">ipv4 </span><span class="pun">:</span><span class="pln"> </span><span class="lit">172.16</span><span class="pun">.</span><span class="lit">0.0</span><span class="pun">/</span><span class="lit">12</span><span class="pun">]</span><span class="pln"> </span><span class="pun">-</span><span class="pln"> </span><span class="lit">0</span><span class="pln">

</span><span class="pun">[</span><span class="typ">Split</span><span class="pln"> network</span><span class="pun">]</span><span class="pln">
</span><span class="typ">Network</span><span class="pln">                 </span><span class="pun">-</span><span class="pln"> </span><span class="lit">172.16</span><span class="pun">.</span><span class="lit">0.0</span><span class="pln">      </span><span class="pun">-</span><span class="pln"> </span><span class="lit">172.16</span><span class="pun">.</span><span class="lit">255.255</span><span class="pln">
</span><span class="typ">Network</span><span class="pln">                 </span><span class="pun">-</span><span class="pln"> </span><span class="lit">172.17</span><span class="pun">.</span><span class="lit">0.0</span><span class="pln">      </span><span class="pun">-</span><span class="pln"> </span><span class="lit">172.17</span><span class="pun">.</span><span class="lit">255.255</span><span class="pln">
</span><span class="typ">Network</span><span class="pln">                 </span><span class="pun">-</span><span class="pln"> </span><span class="lit">172.18</span><span class="pun">.</span><span class="lit">0.0</span><span class="pln">      </span><span class="pun">-</span><span class="pln"> </span><span class="lit">172.18</span><span class="pun">.</span><span class="lit">255.255</span><span class="pln">
</span><span class="typ">Network</span><span class="pln">                 </span><span class="pun">-</span><span class="pln"> </span><span class="lit">172.19</span><span class="pun">.</span><span class="lit">0.0</span><span class="pln">      </span><span class="pun">-</span><span class="pln"> </span><span class="lit">172.19</span><span class="pun">.</span><span class="lit">255.255</span><span class="pln">
</span><span class="typ">Network</span><span class="pln">                 </span><span class="pun">-</span><span class="pln"> </span><span class="lit">172.20</span><span class="pun">.</span><span class="lit">0.0</span><span class="pln">      </span><span class="pun">-</span><span class="pln"> </span><span class="lit">172.20</span><span class="pun">.</span><span class="lit">255.255</span><span class="pln">
</span><span class="typ">Network</span><span class="pln">                 </span><span class="pun">-</span><span class="pln"> </span><span class="lit">172.21</span><span class="pun">.</span><span class="lit">0.0</span><span class="pln">      </span><span class="pun">-</span><span class="pln"> </span><span class="lit">172.21</span><span class="pun">.</span><span class="lit">255.255</span><span class="pln">
</span><span class="typ">Network</span><span class="pln">                 </span><span class="pun">-</span><span class="pln"> </span><span class="lit">172.22</span><span class="pun">.</span><span class="lit">0.0</span><span class="pln">      </span><span class="pun">-</span><span class="pln"> </span><span class="lit">172.22</span><span class="pun">.</span><span class="lit">255.255</span><span class="pln">
</span><span class="typ">Network</span><span class="pln">                 </span><span class="pun">-</span><span class="pln"> </span><span class="lit">172.23</span><span class="pun">.</span><span class="lit">0.0</span><span class="pln">      </span><span class="pun">-</span><span class="pln"> </span><span class="lit">172.23</span><span class="pun">.</span><span class="lit">255.255</span><span class="pln">
</span><span class="typ">Network</span><span class="pln">                 </span><span class="pun">-</span><span class="pln"> </span><span class="lit">172.24</span><span class="pun">.</span><span class="lit">0.0</span><span class="pln">      </span><span class="pun">-</span><span class="pln"> </span><span class="lit">172.24</span><span class="pun">.</span><span class="lit">255.255</span><span class="pln">
</span><span class="typ">Network</span><span class="pln">                 </span><span class="pun">-</span><span class="pln"> </span><span class="lit">172.25</span><span class="pun">.</span><span class="lit">0.0</span><span class="pln">      </span><span class="pun">-</span><span class="pln"> </span><span class="lit">172.25</span><span class="pun">.</span><span class="lit">255.255</span><span class="pln">
</span><span class="typ">Network</span><span class="pln">                 </span><span class="pun">-</span><span class="pln"> </span><span class="lit">172.26</span><span class="pun">.</span><span class="lit">0.0</span><span class="pln">      </span><span class="pun">-</span><span class="pln"> </span><span class="lit">172.26</span><span class="pun">.</span><span class="lit">255.255</span><span class="pln">
</span><span class="typ">Network</span><span class="pln">                 </span><span class="pun">-</span><span class="pln"> </span><span class="lit">172.27</span><span class="pun">.</span><span class="lit">0.0</span><span class="pln">      </span><span class="pun">-</span><span class="pln"> </span><span class="lit">172.27</span><span class="pun">.</span><span class="lit">255.255</span><span class="pln">
</span><span class="typ">Network</span><span class="pln">                 </span><span class="pun">-</span><span class="pln"> </span><span class="lit">172.28</span><span class="pun">.</span><span class="lit">0.0</span><span class="pln">      </span><span class="pun">-</span><span class="pln"> </span><span class="lit">172.28</span><span class="pun">.</span><span class="lit">255.255</span><span class="pln">
</span><span class="typ">Network</span><span class="pln">                 </span><span class="pun">-</span><span class="pln"> </span><span class="lit">172.29</span><span class="pun">.</span><span class="lit">0.0</span><span class="pln">      </span><span class="pun">-</span><span class="pln"> </span><span class="lit">172.29</span><span class="pun">.</span><span class="lit">255.255</span><span class="pln">
</span><span class="typ">Network</span><span class="pln">                 </span><span class="pun">-</span><span class="pln"> </span><span class="lit">172.30</span><span class="pun">.</span><span class="lit">0.0</span><span class="pln">      </span><span class="pun">-</span><span class="pln"> </span><span class="lit">172.30</span><span class="pun">.</span><span class="lit">255.255</span><span class="pln">
</span><span class="typ">Network</span><span class="pln">                 </span><span class="pun">-</span><span class="pln"> </span><span class="lit">172.31</span><span class="pun">.</span><span class="lit">0.0</span><span class="pln">      </span><span class="pun">-</span><span class="pln"> </span><span class="lit">172.31</span><span class="pun">.</span><span class="lit">255.255</span></pre>

<p>
	باستخدامهم الأمر <code>sipcalc</code> لحساب عدد العناوين التي يوفرها عدد مختلف من البتات في قناع الشبكة 172.16.0.0/12، يحددون ما يلي:
</p>

<table>
<thead><tr>
<th>
				عدد العناوين
			</th>
			<th>
				عدد البتات في قناع الشبكة
			</th>
		</tr></thead>
<tbody>
<tr>
<td>
				1,048,576
			</td>
			<td>
				12
			</td>
		</tr>
<tr>
<td>
				65,536
			</td>
			<td>
				16
			</td>
		</tr>
<tr>
<td>
				32,768
			</td>
			<td>
				17
			</td>
		</tr>
<tr>
<td>
				16,384
			</td>
			<td>
				18
			</td>
		</tr>
<tr>
<td>
				8,192
			</td>
			<td>
				19
			</td>
		</tr>
<tr>
<td>
				4,096
			</td>
			<td>
				20
			</td>
		</tr>
</tbody>
</table>
<p>
	سبق وذكرنا أن الشركة تحتاج إلى 2400 عنوان IP. تختار الشركة أن تستخدم قناع شبكة ذو 19 بت الذي يوفر 8,192 عنوانًا، وذلك لتتيح مجالًا فسيحًا للتوسع وتخفض العدد الإجمالي من العناوين إلى عدد تستطيع إدارته في ذات الوقت. واستخدموا في حساب الشبكات الفرعية المتاحة الأمر <code>sipcalc</code> وفق ما يلي:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_5494_27" style="">
<span class="pln">$ sipcalc </span><span class="lit">172.16</span><span class="pun">.</span><span class="lit">0.0</span><span class="pun">/</span><span class="lit">12</span><span class="pln"> </span><span class="pun">-</span><span class="pln">s </span><span class="lit">19</span><span class="pln">

</span><span class="pun">-[</span><span class="pln">ipv4 </span><span class="pun">:</span><span class="pln"> </span><span class="lit">172.16</span><span class="pun">.</span><span class="lit">0.0</span><span class="pun">/</span><span class="lit">12</span><span class="pun">]</span><span class="pln"> </span><span class="pun">-</span><span class="pln"> </span><span class="lit">0</span><span class="pln">

</span><span class="pun">[</span><span class="typ">Split</span><span class="pln"> network</span><span class="pun">]</span><span class="pln">
</span><span class="typ">Network</span><span class="pln">                 </span><span class="pun">-</span><span class="pln"> </span><span class="lit">172.16</span><span class="pun">.</span><span class="lit">0.0</span><span class="pln">      </span><span class="pun">-</span><span class="pln"> </span><span class="lit">172.16</span><span class="pun">.</span><span class="lit">31.255</span><span class="pln">
</span><span class="typ">Network</span><span class="pln">                 </span><span class="pun">-</span><span class="pln"> </span><span class="lit">172.16</span><span class="pun">.</span><span class="lit">32.0</span><span class="pln">     </span><span class="pun">-</span><span class="pln"> </span><span class="lit">172.16</span><span class="pun">.</span><span class="lit">63.255</span><span class="pln">
</span><span class="typ">Network</span><span class="pln">                 </span><span class="pun">-</span><span class="pln"> </span><span class="lit">172.16</span><span class="pun">.</span><span class="lit">64.0</span><span class="pln">     </span><span class="pun">-</span><span class="pln"> </span><span class="lit">172.16</span><span class="pun">.</span><span class="lit">95.255</span><span class="pln">
</span><span class="typ">Network</span><span class="pln">                 </span><span class="pun">-</span><span class="pln"> </span><span class="lit">172.16</span><span class="pun">.</span><span class="lit">96.0</span><span class="pln">     </span><span class="pun">-</span><span class="pln"> </span><span class="lit">172.16</span><span class="pun">.</span><span class="lit">127.255</span><span class="pln">
</span><span class="typ">Network</span><span class="pln">                 </span><span class="pun">-</span><span class="pln"> </span><span class="lit">172.16</span><span class="pun">.</span><span class="lit">128.0</span><span class="pln">    </span><span class="pun">-</span><span class="pln"> </span><span class="lit">172.16</span><span class="pun">.</span><span class="lit">159.255</span><span class="pln">
</span><span class="typ">Network</span><span class="pln">                 </span><span class="pun">-</span><span class="pln"> </span><span class="lit">172.16</span><span class="pun">.</span><span class="lit">160.0</span><span class="pln">    </span><span class="pun">-</span><span class="pln"> </span><span class="lit">172.16</span><span class="pun">.</span><span class="lit">191.255</span><span class="pln">
</span><span class="typ">Network</span><span class="pln">                 </span><span class="pun">-</span><span class="pln"> </span><span class="lit">172.16</span><span class="pun">.</span><span class="lit">192.0</span><span class="pln">    </span><span class="pun">-</span><span class="pln"> </span><span class="lit">172.16</span><span class="pun">.</span><span class="lit">223.255</span><span class="pln">
</span><span class="typ">Network</span><span class="pln">                 </span><span class="pun">-</span><span class="pln"> </span><span class="lit">172.16</span><span class="pun">.</span><span class="lit">224.0</span><span class="pln">    </span><span class="pun">-</span><span class="pln"> </span><span class="lit">172.16</span><span class="pun">.</span><span class="lit">255.255</span><span class="pln">
</span><span class="str">&lt;snip&gt;</span><span class="pln">
</span><span class="typ">Network</span><span class="pln">                 </span><span class="pun">-</span><span class="pln"> </span><span class="lit">172.31</span><span class="pun">.</span><span class="lit">0.0</span><span class="pln">      </span><span class="pun">-</span><span class="pln"> </span><span class="lit">172.31</span><span class="pun">.</span><span class="lit">31.255</span><span class="pln">
</span><span class="typ">Network</span><span class="pln">                 </span><span class="pun">-</span><span class="pln"> </span><span class="lit">172.31</span><span class="pun">.</span><span class="lit">32.0</span><span class="pln">     </span><span class="pun">-</span><span class="pln"> </span><span class="lit">172.31</span><span class="pun">.</span><span class="lit">63.255</span><span class="pln">
</span><span class="typ">Network</span><span class="pln">                 </span><span class="pun">-</span><span class="pln"> </span><span class="lit">172.31</span><span class="pun">.</span><span class="lit">64.0</span><span class="pln">     </span><span class="pun">-</span><span class="pln"> </span><span class="lit">172.31</span><span class="pun">.</span><span class="lit">95.255</span><span class="pln">
</span><span class="typ">Network</span><span class="pln">                 </span><span class="pun">-</span><span class="pln"> </span><span class="lit">172.31</span><span class="pun">.</span><span class="lit">96.0</span><span class="pln">     </span><span class="pun">-</span><span class="pln"> </span><span class="lit">172.31</span><span class="pun">.</span><span class="lit">127.255</span><span class="pln">
</span><span class="typ">Network</span><span class="pln">                 </span><span class="pun">-</span><span class="pln"> </span><span class="lit">172.31</span><span class="pun">.</span><span class="lit">128.0</span><span class="pln">    </span><span class="pun">-</span><span class="pln"> </span><span class="lit">172.31</span><span class="pun">.</span><span class="lit">159.255</span><span class="pln">
</span><span class="typ">Network</span><span class="pln">                 </span><span class="pun">-</span><span class="pln"> </span><span class="lit">172.31</span><span class="pun">.</span><span class="lit">160.0</span><span class="pln">    </span><span class="pun">-</span><span class="pln"> </span><span class="lit">172.31</span><span class="pun">.</span><span class="lit">191.255</span><span class="pln">
</span><span class="typ">Network</span><span class="pln">                 </span><span class="pun">-</span><span class="pln"> </span><span class="lit">172.31</span><span class="pun">.</span><span class="lit">192.0</span><span class="pln">    </span><span class="pun">-</span><span class="pln"> </span><span class="lit">172.31</span><span class="pun">.</span><span class="lit">223.255</span><span class="pln">
</span><span class="typ">Network</span><span class="pln">                 </span><span class="pun">-</span><span class="pln"> </span><span class="lit">172.31</span><span class="pun">.</span><span class="lit">224.0</span><span class="pln">    </span><span class="pun">-</span><span class="pln"> </span><span class="lit">172.31</span><span class="pun">.</span><span class="lit">255.255</span></pre>

<p>
	اختارت الشركة عشوائيًا استخدام الشبكة الفرعية 172.30.64.0/19، لتبدو مواصفات شبكتها كما يلي:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_5494_29" style="">
<span class="pln">$ sipcalc </span><span class="lit">172.30</span><span class="pun">.</span><span class="lit">64.0</span><span class="pun">/</span><span class="lit">19</span><span class="pln">
</span><span class="pun">-[</span><span class="pln">ipv4 </span><span class="pun">:</span><span class="pln"> </span><span class="lit">172.30</span><span class="pun">.</span><span class="lit">64.0</span><span class="pun">/</span><span class="lit">19</span><span class="pun">]</span><span class="pln"> </span><span class="pun">-</span><span class="pln"> </span><span class="lit">0</span><span class="pln">

</span><span class="pun">[</span><span class="pln">CIDR</span><span class="pun">]</span><span class="pln">
</span><span class="typ">Host</span><span class="pln"> address            </span><span class="pun">-</span><span class="pln"> </span><span class="lit">172.30</span><span class="pun">.</span><span class="lit">64.0</span><span class="pln">
</span><span class="typ">Host</span><span class="pln"> address </span><span class="pun">(</span><span class="pln">decimal</span><span class="pun">)</span><span class="pln">  </span><span class="pun">-</span><span class="pln"> </span><span class="lit">2887663616</span><span class="pln">
</span><span class="typ">Host</span><span class="pln"> address </span><span class="pun">(</span><span class="pln">hex</span><span class="pun">)</span><span class="pln">      </span><span class="pun">-</span><span class="pln"> AC1E4000
</span><span class="typ">Network</span><span class="pln"> address         </span><span class="pun">-</span><span class="pln"> </span><span class="lit">172.30</span><span class="pun">.</span><span class="lit">64.0</span><span class="pln">
</span><span class="typ">Network</span><span class="pln"> mask            </span><span class="pun">-</span><span class="pln"> </span><span class="lit">255.255</span><span class="pun">.</span><span class="lit">224.0</span><span class="pln">
</span><span class="typ">Network</span><span class="pln"> mask </span><span class="pun">(</span><span class="pln">bits</span><span class="pun">)</span><span class="pln">     </span><span class="pun">-</span><span class="pln"> </span><span class="lit">19</span><span class="pln">
</span><span class="typ">Network</span><span class="pln"> mask </span><span class="pun">(</span><span class="pln">hex</span><span class="pun">)</span><span class="pln">      </span><span class="pun">-</span><span class="pln"> FFFFE000
</span><span class="typ">Broadcast</span><span class="pln"> address       </span><span class="pun">-</span><span class="pln"> </span><span class="lit">172.30</span><span class="pun">.</span><span class="lit">95.255</span><span class="pln">
</span><span class="typ">Cisco</span><span class="pln"> wildcard          </span><span class="pun">-</span><span class="pln"> </span><span class="lit">0.0</span><span class="pun">.</span><span class="lit">31.255</span><span class="pln">
</span><span class="typ">Addresses</span><span class="pln"> in network    </span><span class="pun">-</span><span class="pln"> </span><span class="lit">8192</span><span class="pln">
</span><span class="typ">Network</span><span class="pln"> range           </span><span class="pun">-</span><span class="pln"> </span><span class="lit">172.30</span><span class="pun">.</span><span class="lit">64.0</span><span class="pln"> </span><span class="pun">-</span><span class="pln"> </span><span class="lit">172.30</span><span class="pun">.</span><span class="lit">95.255</span><span class="pln">
</span><span class="typ">Usable</span><span class="pln"> range            </span><span class="pun">-</span><span class="pln"> </span><span class="lit">172.30</span><span class="pun">.</span><span class="lit">64.1</span><span class="pln"> </span><span class="pun">-</span><span class="pln"> </span><span class="lit">172.30</span><span class="pun">.</span><span class="lit">95.254</span></pre>

<p>
	طبعًا هذه إحدى الشبكات الفرعية المحتمَلة ذات 19 بت من بين 128 شبكة فرعية في مجال العناوين الخاصة، ولا فرق في أية شبكة فرعية كانت ستختارها.
</p>

<p>
	كما يوجد لديها خيار آخر وهو استخدام مجال العناوين الخاصة 192.168.0.0/16 واختيار إحدى الشبكات الفرعية المتاحة ذات 19 بت من ذلك المجال. يمكنك التدرب بتحديد ما هي الشبكات الفرعية المتاحة في ذلك المجال، وما هو عددها.
</p>

<h2>
	الخاتمة
</h2>

<p>
	إن استخدام ترميز CIDR إلى جانب إعادة تنظيم مجموعة CIDR للعناوين الموزعة مسبقًا، إضافةً إلى استخدام أقنعة الشبكة متغيرة الطول، يوفر مزيدًا من عناوين IP العامة المتاحة، ومزيدًا من المرونة في تخصيص العناوين العامة. يراعي تصميم ترميز CIDR مع أقنعة الشبكة متغيرة الطول المخطط الشبكي الفئوي المتعارف عليه إلى جانب تأمين مرونة أكبر وتوافر عناوين IP للاستخدام الداخلي الخاص لمختلف فئات المؤسَّسات. يمكن تقسيم مجالات العناوين الخاصة إضافةً إلى مجالات العناوين العامة المخصصة بسهولة إلى شبكات فرعية، بإضافة بتات إلى قناع الشبكة دون مراعاة فئات الشبكة.
</p>

<p>
	يمكن استخدام ترميز CIDR عند الإشارة إلى الشبكات الفئوية لكن فقط كاختصار رمزي.
</p>

<p>
	ترجمة -وبتصرف- للمقال <a href="https://opensource.com/article/16/12/cidr-network-notataion-configuration-linux" rel="external nofollow">A Linux networking guide to CIDR notation and configuration</a> لصاحبه David Both.
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
<li>
		<a href="https://academy.hsoub.com/devops/linux/%D8%B7%D8%B1%D9%8A%D9%82%D8%A9-%D8%B6%D8%A8%D8%B7-%D8%A7%D9%84%D8%B4%D8%A8%D9%83%D8%A9-%D9%81%D9%8A-%D9%86%D8%B8%D8%A7%D9%85-%D8%A7%D9%84%D8%AA%D8%B4%D8%BA%D9%8A%D9%84-%D9%84%D9%8A%D9%86%D9%83%D8%B3-r563/" rel="">طريقة ضبط الشبكة في نظام التشغيل لينكس </a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/devops/networking/%D9%85%D8%B9%D9%85%D8%A7%D8%B1%D9%8A%D8%A9-%D8%A7%D9%84%D8%B4%D8%A8%D9%83%D8%A9-%D8%A7%D9%84%D8%AD%D8%A7%D8%B3%D9%88%D8%A8%D9%8A%D8%A9-%D9%88%D8%B4%D8%A8%D9%83%D8%A9-%D8%A7%D9%84%D8%A5%D9%86%D8%AA%D8%B1%D9%86%D8%AA-network-architecture-r484/" rel="">معمارية الشبكة الحاسوبية وشبكة الإنترنت (Network Architecture)</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/devops/linux/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%B7%D8%B1%D9%81%D9%8A%D9%91%D8%A9-%D9%84%D9%8A%D9%86%D9%83%D8%B3-linux-terminal-r18/" rel="">مدخل إلى طرفيّة لينكس Linux Terminal</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">565</guid><pubDate>Fri, 10 Dec 2021 19:04:40 +0000</pubDate></item><item><title>&#x645;&#x642;&#x62F;&#x645;&#x629; &#x641;&#x64A; &#x627;&#x644;&#x62A;&#x648;&#x62C;&#x64A;&#x647; &#x627;&#x644;&#x634;&#x628;&#x643;&#x64A; &#x641;&#x64A; &#x646;&#x638;&#x627;&#x645; &#x627;&#x644;&#x62A;&#x634;&#x63A;&#x64A;&#x644; &#x644;&#x64A;&#x646;&#x643;&#x633;</title><link>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%D9%88%D8%AC%D9%8A%D9%87-%D8%A7%D9%84%D8%B4%D8%A8%D9%83%D9%8A-%D9%81%D9%8A-%D9%86%D8%B8%D8%A7%D9%85-%D8%A7%D9%84%D8%AA%D8%B4%D8%BA%D9%8A%D9%84-%D9%84%D9%8A%D9%86%D9%83%D8%B3-r564/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2021_12/61b32718482c4_-------.png.193a8fc2967416072767882efa6bc41a.png" /></p>

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

<p>
	لا بد أن نضبط على أي حاسوب متصل بشبكة بعض <a href="https://academy.hsoub.com/devops/networking/%D8%AA%D9%88%D8%AC%D9%8A%D9%87-routing-%D8%A7%D9%84%D8%B1%D8%B2%D9%85-%D8%B6%D9%85%D9%86-%D8%A7%D9%84%D8%B4%D8%A8%D9%83%D8%A7%D8%AA-%D8%A7%D9%84%D8%AD%D8%A7%D8%B3%D9%88%D8%A8%D9%8A%D8%A9-r499/" rel="">تعليمات التوجيه لرزم</a> packets الشبكة من <a href="https://academy.hsoub.com/devops/servers/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D8%A8%D8%B1%D9%88%D8%AA%D9%88%D9%83%D9%88%D9%84-tcpip-%D9%88%D8%A8%D8%B9%D8%B6-%D9%85%D9%86-%D8%AE%D8%AF%D9%85%D8%A7%D8%AA%D9%87-r169/" rel="">نموذج TCP/IP</a> التي يرسلها المضيف المحلي. تكون هذه العملية سهلةً عادةً لأن معظم البيئات الشبكية بسيطة جدًا، ولا يوجد إلا خيارين للرزم المغادِرة، فهي إما ترسَل إلى جهاز موصول على الشبكة المحلية أو على جهاز موجود في شبكة بعيدة.
</p>

<p>
	نسمي الشبكة "المحلية" بالشبكة المنطقية logical، وأحيانًا نسميها أيضًا بالشبكة الفيزيائية physical التي يوجد المضيف المحلي local host فيها. تعود تسميتها بالشبكة المنطقية لأنها الشبكة الفرعية subnet المحلية التي يسنَد فيها <a href="https://academy.hsoub.com/devops/networking/%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-%D9%88%D8%A7%D9%84%D8%B9%D9%86%D8%A7%D9%88%D9%8A%D9%86-%D9%88%D8%A7%D9%84%D8%A3%D8%AE%D8%B7%D8%A7%D8%A1-%D9%81%D9%8A-%D8%A8%D8%B1%D9%88%D8%AA%D9%88%D9%83%D9%88%D9%84-ip-r498/" rel="">IP</a> من مجال عناوينها إلى المضيف، أما تسميتها بالفيزيائية لأن المضيف موصول إلى مبدل واحد switch أو أكثر، الذي يكون بدوره موصولًا مع بقية أجزاء الشبكة المحلية.
</p>

<h2>
	نموذج TCP/IP الشبكي
</h2>

<p>
	يفضَّل قبل البدء بالحديث عن التوجيه، فهم آلية إيجاد الرزم للمسار المؤدي إلى المضيف الصحيح على الشبكة. يعرّف <a href="https://academy.hsoub.com/certificates/comptia/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%B4%D8%A8%D9%83%D8%A7%D8%AA-%D8%A7%D9%84%D8%AD%D9%88%D8%A7%D8%B3%D9%8A%D8%A8-%D9%85%D8%B5%D8%B7%D9%84%D8%AD%D8%A7%D8%AA-%D9%88%D9%81%D9%87%D9%85-%D8%B7%D8%A8%D9%82%D8%A7%D8%AA-%D8%A7%D9%84%D8%B4%D8%A8%D9%83%D8%A9-r65/" rel="">نموذج TCP/IP الشبكي</a> مجموعةً مؤلفةً من 5 طبقات تشرح آلية إرسال رزم البيانات من مضيف إلى آخر، سواءً كان المضيف الذي سيستقبل الرزم موصولًا على الشبكة المحلية أو في الطرف الآخر من العالم. سنذكر في الشرح التالي عن هذا النموذج رقم كل طبقة، وأسماء وحدات البيانات data units التي تعالجها هذه الطبقة.
</p>

<p>
	الطبقة الخامسة: طبقة التطبيقات Application layer: الرسالة. تضم هذه الطبقة بروتوكولات الاتصال اللازمة لتواصُل تطبيقات الشبكة المختلفة، مثل بروتوكولات <a href="https://academy.hsoub.com/programming/general/%d9%85%d8%af%d8%ae%d9%84-%d8%a5%d9%84%d9%89-http-r73/" rel="">HTTP</a> و <a href="https://academy.hsoub.com/devops/servers/%d9%85%d8%af%d8%ae%d9%84-%d8%a5%d9%84%d9%89-%d8%a8%d8%b1%d9%88%d8%aa%d9%88%d9%83%d9%88%d9%84-%d8%b6%d8%a8%d8%b7-%d8%a7%d9%84%d9%85%d8%b6%d9%8a%d9%81-%d8%af%d9%8a%d9%86%d8%a7%d9%85%d9%8a%d9%83%d9%8a%d8%a7-dhcp-r170/" rel="">DHCP</a> و <a href="https://academy.hsoub.com/devops/security/ssh/%D8%A3%D9%86%D9%81%D8%A7%D9%82-ssh%D8%8C-%D9%85%D8%A7%D9%87%D9%8A%D8%AA%D9%87%D8%A7-%D9%88%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF%D9%87%D8%A7-r76/" rel=""><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr></a> و <a href="https://academy.hsoub.com/apps/web/wordpress/3-%D8%A3%D8%AE%D8%B7%D8%A7%D8%A1-%D8%B4%D8%A7%D8%A6%D8%B9%D8%A9-%D8%B9%D9%86%D8%AF-%D8%B1%D9%81%D8%B9-%D8%A7%D9%84%D9%85%D9%84%D9%81%D8%A7%D8%AA-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%A8%D8%B1%D9%88%D8%AA%D9%88%D9%83%D9%88%D9%84-ftp-%D9%88%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%A5%D8%B5%D9%84%D8%A7%D8%AD%D9%87%D8%A7-r116/" rel="">FTP</a> و SMTP و <a href="https://academy.hsoub.com/programming/php/%D9%85%D9%84%D8%A7%D8%AD%D8%B8%D8%A7%D8%AA-%D8%AD%D9%88%D9%84-%D8%A7%D8%B3%D8%AA%D8%B9%D9%85%D8%A7%D9%84-%D8%A8%D8%B1%D9%88%D8%AA%D9%88%D9%83%D9%88%D9%84-imap-%D9%81%D9%8A-php-r1175/" rel="">IMAP</a> وغيرها. عندما تطلب صفحة موقع من موقع إلكتروني بعيد، يرسَل طلب اتصال إلى <a href="https://academy.hsoub.com/devops/servers/%D8%AF%D9%84%D9%8A%D9%84-%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF-%D8%AE%D8%A7%D8%AF%D9%85-%D9%88%D9%8A%D8%A8-%D9%85%D8%AD%D9%84%D9%8A-%D8%AE%D8%B7%D9%88%D8%A9-%D8%A8%D8%AE%D8%B7%D9%88%D8%A9-r422/" rel="">خادم الويب web</a>، ويعاد إرسال الرد إلى مضيفك ضمن هذه الطبقة، ثم يعرض المتصفح صفحة الموقع في نافذته.
</p>

<p>
	الطبقة الرابعة: طبقة النقل Transport layer: مقطع TCP segment. توفر هذه الطبقة نقل البيانات من طرفٍ إلى طرف ودفق الخدمات الإدارية المنفصلة عن البيانات وأنواع البروتوكولات التي تنقََل. تستخدم المنافذ مثل المنفذ 80 لبروتوكول HTTP ومنفذ 25 لبروتوكول SMTP في إنشاء الاتصالات بين المضيف المرسل والمضيف البعيد.
</p>

<p>
	الطبقة الثالثة: طبقة الإنترنت Internet layer: الرزمة. ينفَّذ توجيه الرزم في هذه الطبقة، فهي الطبقة المسؤولة عن توجيه الرزم عبر شبكتين أو أكثر حتى تصل إلى وجهتها النهائية. تستخدم هذه الطبقة عناوين IP وجدول التوجيه routing table في تحديد الجهاز التالي الذي سترسَل إليه الرزم، فإذا كان الجهاز التالي موجِّهًا، فإن كل موجه مسؤول عن إرسال رزم البيانات حصرًا إلى الموجه الذي يليه في المسار، وهو ليس مسؤولًا عن رسم كامل المسار بدءًا من المضيف المحلي وانتهاءً بالمضيف الوجهة. تتمحور معظم طبقة الإنترنت حول موجّهات تتواصل مع موجّهات أخرى لتحدد الموجه التالي في السلسلة.
</p>

<p>
	الطبقة الثانية: طبقة ربط البيانات Data Link layer: الإطار Frame. تدير هذه الطبقة الاتصالات المباشرة بين العتاد الصلب للمضيفين في الشبكة المحلية أو المنطقية أو الفيزيائية الواحدة. تستخدم هذه الطبقة عناوين التحكم بالوصول إلى الوسط MAC المدمجة في بطاقات الشبكة NICs لتحديد الأجهزة الفيزيائية المتصلة بالشبكة المحلية. لا تستطيع هذه الطبقة الوصول إلى المضيفين غير المتصلين بالشبكة المحلية.
</p>

<p>
	الطبقة الأولى: الطبقة الفيزيائية Physical layer: البتات Bits. هذه طبقة العتاد الصلب التي تتألف من بطاقات الشبكة وكبل الإيثرنت Ethernet الفيزيائي إضافةً إلى البروتوكولات التي تعمل على مستوى العتاد الصلب والتي تستخدَم في نقل البتات المنفردة التي تشكل أطر البيانات بين أي مضيفين أو بين عقد الشبكة الأخرى المتصلة محليًا.
</p>

<h3>
	مثال بسيط
</h3>

<p>
	إذًا كيف تبدو آلية إرسال البيانات من المضيف الموصول على الشبكة باستخدام نموذج TCP/IP الشبكي في التطبيق العملي؟ اختلقت مثالًا عن كيفية انتقال البيانات من شبكة إلى أخرى، سيرسل فيه حاسوبي طلبًا لتحميل صفحة موقع من مخدم بعيد.
</p>

<ol>
<li>
		في طبقة التطبيقات سينشئ المتصفح رسالة طلب اتصال بالمضيف البعيد عن طريق بروتوكول HTTP، ولتكن www.example.com، ليعيد إرسال البيانات التي تكوِّن محتويات صفحة الموقع. هذه هي الرسالة التي لا تحتوي إلا على عنوان IP خادم الويب البعيد.
	</li>
	<li>
		تغلّف طبقة النقل الرسالة المتضمنة طلب صفحة الموقع في مخطط بيانات datagram من نمط بروتوكول TCP مع عنوان IP خادم الويب البعيد باعتباره الوجهة. أصبحت هذه الرزمة الآن تتضمن المنفذ port المصدر الذي سيولّد الطلب، الذي يكون عادةً منفذًا عشوائيًا برقم مرتفع، حتى تعلم البيانات التي يعاد إرسالها أي منفذ يستمع المتصفح إليه، والمنفذ الوجهة على المضيف البعيد (الذي يكون 80 في هذه الحالة)، وذلك إضافةً إلى رزمة الطلب الأصلية.
	</li>
	<li>
		تغلف طبقة الإنترنت مخطط بيانات TCP في رزمة تتضمن أيضًا كلًا من عنواني IP المصدر والوجهة.
	</li>
	<li>
		تستخدم طبقة ربط البيانات بروتوكول استبيان العناوين ARP لتحديد عنوان MAC الفيزيائي للموجه الافتراضي، وتغلف رزمة الإنترنت في إطار يتضمن كلًا من عنواني MAC المصدر والوجهة.
	</li>
	<li>
		يرسَل الإطار عبر سلك يكون عادةً CAT5 أو CAT6 من بطاقة شبكة المضيف المحلي إلى بطاقة شبكة الموجه الافتراضي.
	</li>
	<li>
		يفتح الموجه الافتراضي مخطط البيانات ليطلع على العنوان IP الوجهة، ثم يحدد الموجه عنوان IP الموجه التالي الذي سينقل الإطار إلى الخطوة التالية في رحلته عن طريق جدول التوجيه الخاص به. ثم يعيد الموجه تغليف الإطار بمخطط بيانات جديد يتضمن عنوان MAC الخاص به بصفته العنوان المصدر وعنوان MAC الخاص بالموجه التالي، ثم يرسله عبر الواجهة interface الصحيحة. يؤدي الموجه مهمته في التوجيه في الطبقة الثالثة وهي طبقة الإنترنت.
	</li>
</ol>
<p>
	لاحظ أن <a href="https://academy.hsoub.com/certificates/cisco/ccna/%D8%AA%D8%A3%D9%85%D9%8A%D9%86-%D8%A7%D9%84%D9%85%D8%A8%D8%AF%D9%84%D8%A7%D8%AA-%D9%81%D9%8A-%D8%B4%D8%A8%D9%83%D8%A7%D8%AA-ethernet-r15/" rel="">المبدلات switches</a> تعد مخفية بالنسبة لبروتوكلات جميع الطبقات عدا الأولى، لذا فإنها لا تؤثر على نقل البيانات بأي طريقة منطقية. تقتصر وظيفة المبدل على توفير وسائل بسيطة لربط عدة مضيفين في شبكة فيزيائية واحدة من خلال كبل إيثرنت.
</p>

<p>
	استخدم الأمر <code>arp [-n]‎</code> لعرض جميع عناوين MAC المخزنة في جدول arp الخاص بمضيفك، ستكون دائمًا عناوين لمضيفين موصولين على شبكتك المحلية.
</p>

<h2>
	جدول التوجيه
</h2>

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

<p>
	يستخدم جدول التوجيه المشابه للجدول البسيط في النموذج الأول في تحديد المسار الوحيد المتاح للمضيف المحلي ولتحديد هل يجب إرسال الرزم إلى الموجه الذي يعد البوابة الافتراضية default gateway router. يعرض الأمر <code>route -n</code> جدول التوجيه، ومهمة الخيار <code>n-</code> أن لا تعرَض في النتيجة إلا العناوين IP دون أن يحاول إجراء بحث DNS عن أسماء المضيفين hostnames المرتبطة بتلك العناوين واستبدالها بها إن وجدت. يعرض الأمر <code>netstat -rn</code> نتائج مشابهة إلى حد كبير لنتائج الأمر <code>route -n</code>.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_3957_26" style="">
<span class="pun">[</span><span class="pln">root@host1 </span><span class="pun">~]#</span><span class="pln"> route </span><span class="pun">-</span><span class="pln">n
</span><span class="typ">Kernel</span><span class="pln"> IP routing table
</span><span class="typ">Destination</span><span class="pln">     </span><span class="typ">Gateway</span><span class="pln">         </span><span class="typ">Genmask</span><span class="pln">         </span><span class="typ">Flags</span><span class="pln"> </span><span class="typ">Metric</span><span class="pln"> </span><span class="typ">Ref</span><span class="pln">    </span><span class="typ">Use</span><span class="pln"> </span><span class="typ">Iface</span><span class="pln">
</span><span class="lit">0.0</span><span class="pun">.</span><span class="lit">0.0</span><span class="pln">         </span><span class="lit">192.168</span><span class="pun">.</span><span class="lit">0.254</span><span class="pln">   </span><span class="lit">0.0</span><span class="pun">.</span><span class="lit">0.0</span><span class="pln">         UG    </span><span class="lit">100</span><span class="pln">    </span><span class="lit">0</span><span class="pln">        </span><span class="lit">0</span><span class="pln"> eno1
</span><span class="lit">192.168</span><span class="pun">.</span><span class="lit">0.0</span><span class="pln">     </span><span class="lit">0.0</span><span class="pun">.</span><span class="lit">0.0</span><span class="pln">         </span><span class="lit">255.255</span><span class="pun">.</span><span class="lit">255.0</span><span class="pln">   U     </span><span class="lit">100</span><span class="pln">    </span><span class="lit">0</span><span class="pln">        </span><span class="lit">0</span><span class="pln"> eno1</span></pre>

<p>
	تكون القيمة في عمود الوجهة destination هي 0.0.0.0 دومًا للبواية الافتراضية عندما يستخدم خيار <code>n-</code>. أما في حال لم يستخدم هذا الخيار تظهر كلمة "Default" في عمود الوجهة في خرج الأمر. إن تحديد قناع الشبكة للبوابة الافتراضية بالقيمة 0.0.0.0 يعني أن أية شبكة غير مرسلة إلى الشبكة المحلية أو إلى موجه خارجي آخر حددناه بسطر توجيه إضافي خاص به في جدول التوجيه، سترسَل إلى البوابة الافتراضية بغض النظر عن فئة class هذه الشبكة.
</p>

<p>
	يشير عمود Iface (اختصارًا لكلمة Interface واجهة) إلى بطاقة الشبكة للبيانات الصادرة، وهو في هذه الحالة eno1. أما بالنسبة للمضيفين الذي يؤدون وظيفة الموجه يحتمَل أن يكون لها بطاقتي شبكة على الأقل وأحيانًا أكثر. ستكون كل بطاقة شبكة مستخدمة كموجه موصولة بشبكة فيزيائية ومنطقية مختلفة. تشير الرايات في عمود Flag إلى أن سطر التوجيه فعّالًا UP بالراية (U)، وتحدد أي سطر مخصص للبوابة الافتراضية ويرمز بالراية (G). كما توجد عدة رايات أخرى.
</p>

<p>
	إن تحديد مسارات التوجيه أمر شديد البساطة في معظم المضيفين:
</p>

<ul>
<li>
		إذا كان المضيف الوجهة موصولًا على الشبكة المحلية، أرسل البيانات مباشرةً إليه.
	</li>
	<li>
		إذا كان المضيف الوجهة على شبكة بعيدة يمكن الوصول إليها من خلال بوابة محلية مذكورة ضمن جدول التوجيه، أرسل البيانات إلى تلك البوابة المحددة ضمن الجدول.
	</li>
	<li>
		إذا كان المضيف الوجهة على شبكة بعيدة، ولا يوجد أي سطر توجيه يحدد مسارًا إلى ذلك المضيف، أرسل البيانات إلى البوابة الافتراضية.
	</li>
</ul>
<p>
	تعني هذه القواعد ببساطة أنه في حال فشل جميع الاحتمالات لعدم وجود تطابق مع المسارات المحددة في أسطر التوجيه أرسل الرزمة إلى البوابة الافتراضية.
</p>

<p>
	إن النموذج الثاني التالي هو لجدول توجيه أعقد بعض الشيء، لأنه ينتمي إلى مضيف يعمل <a href="https://academy.hsoub.com/devops/linux/%D9%85%D8%A7-%D9%87%D9%88-%D9%86%D8%B8%D8%A7%D9%85-%D8%A7%D9%84%D8%AA%D8%B4%D8%BA%D9%8A%D9%84-%D9%84%D9%8A%D9%86%D9%83%D8%B3%D8%9F-r451/" rel="">بنظام تشغيل لينكس</a> ويؤدي وظيفة موجه موصول بثلاث شبكات، تفضي إحداها إلى شبكة الإنترنت. إن الشبكتين المحليتين من الفئة C وهما: 192.168.0.0/24 على الواجهة eth1، والشبكة 192.168.25.0/24 على الواجهة eth2، لكل منهما أسطر توجيه في جدول التوجيه، إضافةً إلى المسار الافتراضي default route الذي يفضي إلى بقية العالم على الواجهة eth0.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_3957_28" style="">
<span class="pun">[</span><span class="pln">root@host2 </span><span class="pun">~]#</span><span class="pln"> route </span><span class="pun">-</span><span class="pln">n
</span><span class="typ">Kernel</span><span class="pln"> IP routing table
</span><span class="typ">Destination</span><span class="pln">     </span><span class="typ">Gateway</span><span class="pln">         </span><span class="typ">Genmask</span><span class="pln">         </span><span class="typ">Flags</span><span class="pln"> </span><span class="typ">Metric</span><span class="pln"> </span><span class="typ">Ref</span><span class="pln">    </span><span class="typ">Use</span><span class="pln">  </span><span class="typ">Iface</span><span class="pln">
</span><span class="lit">192.168</span><span class="pun">.</span><span class="lit">1.24</span><span class="pln">        </span><span class="lit">0.0</span><span class="pun">.</span><span class="lit">0.0</span><span class="pln">         </span><span class="lit">255.255</span><span class="pun">.</span><span class="lit">255.252</span><span class="pln">    U       </span><span class="lit">0</span><span class="pln">          </span><span class="lit">0</span><span class="pln">       </span><span class="lit">0</span><span class="pln">    eth0
</span><span class="lit">192.168</span><span class="pun">.</span><span class="lit">0.0</span><span class="pln">         </span><span class="lit">0.0</span><span class="pun">.</span><span class="lit">0.0</span><span class="pln">          </span><span class="lit">255.255</span><span class="pun">.</span><span class="lit">255.0</span><span class="pln">       U       </span><span class="lit">0</span><span class="pln">          </span><span class="lit">0</span><span class="pln">       </span><span class="lit">0</span><span class="pln">    eth1
</span><span class="lit">192.168</span><span class="pun">.</span><span class="lit">25.0</span><span class="pln">        </span><span class="lit">0.0</span><span class="pun">.</span><span class="lit">0.0</span><span class="pln">         </span><span class="lit">255.255</span><span class="pun">.</span><span class="lit">255.0</span><span class="pln">       U       </span><span class="lit">0</span><span class="pln">          </span><span class="lit">0</span><span class="pln">       </span><span class="lit">0</span><span class="pln">    eth2
</span><span class="lit">0.0</span><span class="pun">.</span><span class="lit">0.0</span><span class="pln">            </span><span class="lit">192.168</span><span class="pun">.</span><span class="lit">1.25</span><span class="pln">       </span><span class="lit">0.0</span><span class="pun">.</span><span class="lit">0.0</span><span class="pln">                UG     </span><span class="lit">0</span><span class="pln">           </span><span class="lit">0</span><span class="pln">      </span><span class="lit">0</span><span class="pln">    eth0</span></pre>

<p>
	لاحظ أنه لا يزال لدينا بوابة افتراضية واحدة فقط وهي على الواجهة eth0. لكن إضافةً إلى سطر المسار الافتراضي الذي يشير مباشرةً إلى عنوان IP الموجه من طرف الشبكة المحلية LAN، يوجد أيضًا سطر لكامل الشبكة التي عنوانها 192.168.1.24/30. لا تتضمن هذه الشبكة إلا عنوانين يمكن استخدامهما، أحدهما 192.168.1.25/30 المخصص لطرف الشبكة المحلية على الموجه، والآخر 192.168.1.26/30 مخصص للمضيف نفسه.
</p>

<h2>
	ضبط التوجيه
</h2>

<p>
	إذًا كيف نضبط جدول التوجيه؟ بالنسبة للمضيفين المتصلين بالشبكة الذين يتلقون معلوماتهم من خدمة DHCP، يزودهم <a href="https://academy.hsoub.com/devops/servers/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%A8%D8%B1%D9%88%D8%AA%D9%88%D9%83%D9%88%D9%84-%D8%B6%D8%A8%D8%B7-%D8%A7%D9%84%D9%85%D8%B6%D9%8A%D9%81-%D8%AF%D9%8A%D9%86%D8%A7%D9%85%D9%8A%D9%83%D9%8A%D8%A7-dhcp-r170/" rel="">خادم DHCP</a> بمعلومات ضبط المسار الافتراضي default route إلى جانب أسماء <a href="https://academy.hsoub.com/devops/servers/dns/%D9%85%D9%82%D8%A7%D8%B1%D9%86%D8%A9-%D8%A8%D9%8A%D9%86-%D8%A3%D9%86%D9%88%D8%A7%D8%B9-%D8%A7%D9%84%D8%AE%D9%88%D8%A7%D8%AF%D9%8A%D9%85-%D9%81%D9%8A-%D9%86%D8%B8%D8%A7%D9%85-dns-%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%A7%D8%AE%D8%AA%D9%8A%D8%A7%D8%B1-%D8%A7%D9%84%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF-%D8%A7%D9%84%D9%85%D9%86%D8%A7%D8%B3%D8%A8-%D9%84%D9%84%D8%AE%D8%A7%D8%AF%D9%88%D9%85-r15/" rel="">خوادم DNS</a> وعناوين IP المضيفين وأحيانًا معلومات أخرى مثل عنوان IP لخادم NTP. أما بالنسبة للذين يضبطون إعدادات ثابتة يدويًا لن يكون ضبط جدول التوجيه معقدًا إلا في بعض الحالات.
</p>

<p>
	في معظم الحالات يكون ضبط المسار الافتراضي في جدول التوجيه من خلال إضافة المسار الافتراضي إلى ملف <code>‎/etc/sysconfig/network</code> مثل النموذج التالي:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_3957_30" style="">
<span class="pln">GATEWAY</span><span class="pun">=</span><span class="lit">192.168</span><span class="pun">.</span><span class="lit">0.1</span></pre>

<p>
	لا نضبط في ملف network إلا البوابة الافتراضية.
</p>

<p>
	أما النهج الآخر المتَّبع في ضبط البوابة الافتراضية يدويًا هو إضافتها إلى ملف إعدادات الواجهة interface المناسب في مجلد <code>‎/etc/sysconfig/network-scripts</code>. فمثلًا لضبط بوابة لملف إعدادات الواجهة eth0 نضيف السطر ذاته الذي أضفناه في النموذج السابق إلى ملف ifcfg-eth0. إذا أضفنا السطر هنا علينا أن نحذفه من ملف network.
</p>

<p>
	أما في البيئات الأكثر تعقيدًا، مثل البيئة التي يكون فيها الحاسوب المضيف موصولاً لأكثر من شبكة باستخدام أكثر من بطاقة شبكة، وعندما يكون علينا إدخال سطري توجيه على الأقل إلى جدول التوجيه، وغالبًا تكون أكثر سطرين، يجب أن تستخدم ملف توجيه route في مجلد <code>‎/etc/sysconfig/network-scripts</code>. إذا كانت بطاقة الشبكة enp7s1 سيكون ملف التوجيه route-enp7s1 وسنضيف إليه المُدخَل الموضَّح في النموذج التالي:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_3957_32" style="">
<span class="kwd">default</span><span class="pln"> via </span><span class="lit">192.168</span><span class="pun">.</span><span class="lit">0.1</span><span class="pln"> dev enp7s1</span></pre>

<p>
	ستنفَّذ عندها إعدادات البوابة الافتراضية في ملفات route-interface وسيتم تجاهل أية إعدادات للبوابة الافتراضية مذكورة في ملف network.
</p>

<p>
	بالطبع تستطيع إضافة أسطر التوجيه بتنفيذ الأمر <code>route</code> في موجه الأوامر، لكن قد تستهلك هذه الطريقة وقتًا لأنك ستضطر إلى إعادة تنفيذ هذا الأمر في كل مرة يقلع فيها النظام، لذا يفضَّل أن تتبع النهج الأخرى التي ذكرناها، أو إنشاء نص برمجي script ينفذ هذا الأمر عند الإقلاع. لقد أنشأت نصًا برمجيًا يحتوي على السطرين التاليين الموضحين في النموذج التالي على أحد الأنظمة التي أديرها.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_3957_34" style="">
<span class="pln">route del </span><span class="kwd">default</span><span class="pln">
route add </span><span class="kwd">default</span><span class="pln"> gw </span><span class="lit">192.168</span><span class="pun">.</span><span class="lit">0.1</span></pre>

<p>
	لاحظ أن ذكر اسم الجهاز اختياري في جميع الأوامر التي ذكرناها، ولم أستخدمه ضمن النص البرمجي.
</p>

<h2>
	الخاتمة
</h2>

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

<p>
	ترجمة -وبتصرف- للمقال <a href="https://opensource.com/business/16/8/introduction-linux-network-routing" rel="external nofollow">‎An introduction to Linux network routing</a> لصاحبه.
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
<li>
		<a href="https://academy.hsoub.com/programming/general/%D8%B9%D9%84%D9%88%D9%85-%D8%A7%D9%84%D8%AD%D8%A7%D8%B3%D9%88%D8%A8/" rel="">المدخل الشامل لتعلم علوم الحاسوب</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/devops/servers/%D8%AA%D9%88%D8%B5%D9%8A%D9%84-%D8%A7%D9%84%D8%B4%D9%91%D8%A8%D9%83%D8%A7%D8%AA-networking-%D9%84%D9%85%D9%8F%D8%AF%D8%B1%D8%A7%D8%A1-%D8%A7%D9%84%D8%AE%D9%88%D8%A7%D8%AF%D9%8A%D9%85-r62/" rel="">توصيل الشّبكات (Networking) لمُدراء الخواديم</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/certificates/cisco/ccna/%d8%a7%d8%b3%d8%aa%d9%83%d8%b4%d8%a7%d9%81-%d9%88%d8%b8%d8%a7%d8%a6%d9%81-%d8%a7%d9%84%d9%85%d9%88%d8%ac%d9%87%d8%a7%d8%aa-%d9%81%d9%8a-%d8%a7%d9%84%d8%b4%d8%a8%d9%83%d8%a7%d8%aa-r21/" rel="">استكشاف وظائف الموجهات في الشبكات</a>
	</li>
	<li>
		النسخة الكاملة من كتاب <a href="https://academy.hsoub.com/files/24-%D8%A3%D9%86%D8%B8%D9%85%D8%A9-%D8%A7%D9%84%D8%AA%D8%B4%D8%BA%D9%8A%D9%84-%D9%84%D9%84%D9%85%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D9%86/" rel="">أنظمة التشغيل للمبرمجين</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">564</guid><pubDate>Tue, 14 Dec 2021 17:04:00 +0000</pubDate></item><item><title>&#x637;&#x631;&#x64A;&#x642;&#x629; &#x636;&#x628;&#x637; &#x627;&#x644;&#x634;&#x628;&#x643;&#x629; &#x641;&#x64A; &#x646;&#x638;&#x627;&#x645; &#x627;&#x644;&#x62A;&#x634;&#x63A;&#x64A;&#x644; &#x644;&#x64A;&#x646;&#x643;&#x633;</title><link>https://academy.hsoub.com/devops/linux/%D8%B7%D8%B1%D9%8A%D9%82%D8%A9-%D8%B6%D8%A8%D8%B7-%D8%A7%D9%84%D8%B4%D8%A8%D9%83%D8%A9-%D9%81%D9%8A-%D9%86%D8%B8%D8%A7%D9%85-%D8%A7%D9%84%D8%AA%D8%B4%D8%BA%D9%8A%D9%84-%D9%84%D9%8A%D9%86%D9%83%D8%B3-r563/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2021_12/61b3242fb6406_------.png.be2ebce5c0d61960c6925ad1f500e4cf.png" /></p>

<p>
	إن وصل حاسوبك المثبت عليه <a href="https://academy.hsoub.com/devops/linux/%D9%85%D8%A7-%D9%87%D9%88-%D9%86%D8%B8%D8%A7%D9%85-%D8%A7%D9%84%D8%AA%D8%B4%D8%BA%D9%8A%D9%84-%D9%84%D9%8A%D9%86%D9%83%D8%B3%D8%9F-r451/" rel="">نظام التشغيل لينكس</a> على الشبكة ليس بهذه البساطة. سنتناول في هذه المقالة ملفات إعدادات الشبكة الرئيسية في توزيعات نظام لينكس المبنية على ريدهات Red Hat، وسنطلع على خدمتي بدء تشغيل وإدارة الشبكة، وهما: خدمة بدء تشغيل <strong>الشبكة</strong> الموقَّرة، ومدير الشبكة NetworkManager المثير للجدل.
</p>

<p>
	تستطيع إدارة عدة بطاقات شبكة بسهولة في نظام لينكس، فعادةً تحتوي الحواسيب المحمولة على بطاقات شبكة سلكية ولاسلكية wireless، ويمكن أن تدعم بطاقات واي ماكس WiMax للشبكات الخليوية. كما تدعم الحواسيب المكتبية تعدد بطاقات الشبكة، فتستطيع أن تستخدم حاسوبك المثبَّت عليه نظام لينكس كعميل متعدد الشبكات multi-network أو <a href="https://academy.hsoub.com/certificates/cisco/ccna/%d8%a8%d8%af%d8%a1-%d8%aa%d8%b4%d8%ba%d9%8a%d9%84-%d8%a7%d9%84%d9%85%d9%88%d8%ac%d9%87%d8%a7%d8%aa-routers-%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-r24/" rel="">موجه router</a> للشبكات الداخلية، وهي حالة طبقتها في بعض الأنظمة التي عملت عليها.
</p>

<h2>
	ملفات إعدادات بطاقة الشبكة
</h2>

<p>
	يخصَّص ملف إعدادات لكل بطاقة شبكة في المجلد <code>‎/etc/sysconfig/network-scripts</code>، وتكون صيغة تسمية هذه الملفات كالتالي <code>ifcfg-&lt;interface-name&gt;X</code> حيث أن interface name هو اسم بطاقة الشبكة، و X هو رقمها الذي يبدأ من الصفر أو الواحد حسب اصطلاح التسمية المعتمَد. فمثلًا يكون اسم أول بطاقة شبكة من نوع <a href="https://academy.hsoub.com/certificates/cisco/ccna/%D8%B4%D8%B1%D8%AD-%D8%A8%D8%B1%D9%88%D8%AA%D9%88%D9%83%D9%88%D9%84-%D8%A5%D9%8A%D8%AB%D8%B1%D9%86%D8%AA-ethernet-r8/" rel="">إيثرنت</a> Ethernet interface كما يلي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_8267_7" style="">
<span class="pln">‎/etc/sysconfig/network-scripts/ifcfg-eth0
</span></pre>

<p>
	أما بقية الملفات في مجلد <code>‎/etc/sysconfig/network-scripts</code> يكون معظمها نصوص برمجية أو سكربتات scripts تستخدَم لتشغيل الخدمات أو بطاقات الشبكة وإيقافها وتأدية عدة مهام متعلقة بضبط الشبكة.
</p>

<p>
	يرتبط كل ملف من ملفات إعدادات بطاقة الشبكة ببطاقة شبكة فيزيائية محددة من خلال العنوان الفيزيائي MAC address للبطاقة.
</p>

<h2>
	اصطلاحات تسمية بطاقة الشبكة
</h2>

<p>
	كانت اصطلاحات تسمية بطاقات الشبكة بسيطة وغير معقدة وسهلة حسب اعتقادي، فاستخدام اصطلاح التسمية <code>ethX</code> بدا منطقيًا لي وكانت تسهل كتابته، ولم يتطلب أية خطوات إضافية لمعرفة إلى أية بطاقة شبكة ينتمي الاسم الطويل والمبهم. لكن للأسف كانت ترغمني إضافة بطاقة جديدة غالبًا على إعادة تسمية بطاقات الشبكة، وكان يؤدي هذا إلى تعطيل النصوص البرمجية والإعدادات. وقد تغيرت هذه الآلية أكثر من مرة.
</p>

<p>
	بعد مضي فترة اتسمت فيها التسميات بأنها طويلةً ومبهمةً، أصبح لدينا الآن مجموعة ثالثة من اصطلاحات التسمية الأفضل نوعًا ما. لا تزال الأسماء مثل <code>ethX</code> مستخدمة في توزيعة سينتوس CentOS من الإصدار 6.x. أما اصطلاحات التسمية الأحدث التي تكون الأسماء فيها مثل <code>eno1</code> أو <code>enp0s3</code> مستخدَمة في RHEL 7 و CentOS 7 والإصدارات الأحدث من توزيعة فيدورا Fedora. يمكنك الاطلاع على اصطلاح التسمية في توزيعتَي RHEL 6 و CentOS 6 في دليل استخدام ريدهات في <a href="https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/6/html/Deployment_Guide/appe-Consistent_Network_Device_Naming.html" rel="external nofollow">الملحق A. تسمية أجهزة الشبكة المعتمَد</a>، والاطلاع على اصطلاح التسمية في التوزيعات RHEL 7 و CentOS 7 والإصدارات الحالية من فيدورا في دليل الشبكة في ريدهات في <a href="https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/Networking_Guide/ch-Consistent_Network_Device_Naming.html" rel="external nofollow">الفصل الثامن: تسمية أجهزة الشبكة المعتمَد</a>.
</p>

<h2>
	نماذج عن ملفات الإعدادات
</h2>

<p>
	يحدد هذا النموذج من ملف إعدادات بطاقة الشبكة المسمَّى باسم <code>ifcfg-eth0</code> ضبط عنوان IP ثابت لخادم مثبَّت عليه توزيعة CentOS 6.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_8267_9" style="">
<span class="com"># Intel Corporation 82566DC-2 Gigabit Network Connection</span><span class="pln">
DEVICE</span><span class="pun">=</span><span class="pln">eth0
HWADDR</span><span class="pun">=</span><span class="lit">00</span><span class="pun">:</span><span class="lit">16</span><span class="pun">:</span><span class="lit">76</span><span class="pun">:</span><span class="lit">02</span><span class="pun">:</span><span class="pln">BA</span><span class="pun">:</span><span class="pln">DB
ONBOOT</span><span class="pun">=</span><span class="pln">yes
IPADDR</span><span class="pun">=</span><span class="lit">192.168</span><span class="pun">.</span><span class="lit">0.10</span><span class="pln">
BROADCAST</span><span class="pun">=</span><span class="lit">192.168</span><span class="pun">.</span><span class="lit">0.255</span><span class="pln">
NETMASK</span><span class="pun">=</span><span class="lit">255.255</span><span class="pun">.</span><span class="lit">255.0</span><span class="pln">
NETWORK</span><span class="pun">=</span><span class="lit">192.168</span><span class="pun">.</span><span class="lit">0.0</span><span class="pln">
SEARCH</span><span class="pun">=</span><span class="str">"example.com"</span><span class="pln">
BOOTPROTO</span><span class="pun">=</span><span class="kwd">static</span><span class="pln">
GATEWAY</span><span class="pun">=</span><span class="lit">192.168</span><span class="pun">.</span><span class="lit">0.254</span><span class="pln">
DNS1</span><span class="pun">=</span><span class="lit">192.168</span><span class="pun">.</span><span class="lit">0.254</span><span class="pln">
DNS2</span><span class="pun">=</span><span class="lit">8.8</span><span class="pun">.</span><span class="lit">8.8</span><span class="pln">
TYPE</span><span class="pun">=</span><span class="typ">Ethernet</span><span class="pln">
USERCTL</span><span class="pun">=</span><span class="pln">no
IPV6INIT</span><span class="pun">=</span><span class="pln">no</span></pre>

<p>
	تبين الإعدادات الواردة في هذا الملف أنه ينفذ المهمات التالية: يشغل بطاقة الشبكة عند إقلاع الجهاز، ويسند لها عنوان IP ثابت، ويحدد نطاق domain وبوابة الشبكة gateway، ويحدد خادمَي DNS، ولا يسمح لأي مستخدم غير المستخدم الجذر root بتشغيل وإيقاف بطاقة الشبكة.
</p>

<p>
	يتضمن ملف إعدادات بطاقة الشبكة التالي المسمَّى باسم <code>ifcfg-eno1</code> إعدادات <a href="https://academy.hsoub.com/devops/servers/%d9%85%d8%af%d8%ae%d9%84-%d8%a5%d9%84%d9%89-%d8%a8%d8%b1%d9%88%d8%aa%d9%88%d9%83%d9%88%d9%84-%d8%b6%d8%a8%d8%b7-%d8%a7%d9%84%d9%85%d8%b6%d9%8a%d9%81-%d8%af%d9%8a%d9%86%d8%a7%d9%85%d9%8a%d9%83%d9%8a%d8%a7-dhcp-r170/" rel="">خدمة DHCP</a> لمحطة عمل مكتبية desktop workstation.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_8267_11" style="">
<span class="pln">TYPE</span><span class="pun">=</span><span class="typ">Ethernet</span><span class="pln">
BOOTPROTO</span><span class="pun">=</span><span class="pln">dhcp
DEFROUTE</span><span class="pun">=</span><span class="pln">yes
IPV4_FAILURE_FATAL</span><span class="pun">=</span><span class="pln">no
IPV6INIT</span><span class="pun">=</span><span class="pln">no
IPV6_AUTOCONF</span><span class="pun">=</span><span class="pln">no
IPV6_DEFROUTE</span><span class="pun">=</span><span class="pln">no
IPV6_FAILURE_FATAL</span><span class="pun">=</span><span class="pln">no
NAME</span><span class="pun">=</span><span class="pln">eno1
UUID</span><span class="pun">=</span><span class="pln">a67804ff</span><span class="pun">-</span><span class="lit">177a</span><span class="pun">-</span><span class="lit">4efb</span><span class="pun">-</span><span class="lit">959d</span><span class="pun">-</span><span class="pln">c3f98ba0947e
ONBOOT</span><span class="pun">=</span><span class="pln">yes
HWADDR</span><span class="pun">=</span><span class="pln">E8</span><span class="pun">:</span><span class="lit">40</span><span class="pun">:</span><span class="pln">F2</span><span class="pun">:</span><span class="lit">3D</span><span class="pun">:</span><span class="lit">0E</span><span class="pun">:</span><span class="pln">A8
IPV6_PEERDNS</span><span class="pun">=</span><span class="pln">no
IPV6_PEERROUTES</span><span class="pun">=</span><span class="pln">no</span></pre>

<p>
	في نموذج ملف الإعدادات الثاني لم تحدَّد مدخلات DHCP <a href="https://academy.hsoub.com/devops/networking/%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-%D9%88%D8%A7%D9%84%D8%B9%D9%86%D8%A7%D9%88%D9%8A%D9%86-%D9%88%D8%A7%D9%84%D8%A3%D8%AE%D8%B7%D8%A7%D8%A1-%D9%81%D9%8A-%D8%A8%D8%B1%D9%88%D8%AA%D9%88%D9%83%D9%88%D9%84-ip-r498/" rel="">والعنوان IP</a> ونطاق البحث وجميع معلومات الشبكة الأخرى لأن خادم DHCP هو من يوفّرها. يمكن تجاوز بنود الإعدادات مثل البنود المتعلقة <a href="https://academy.hsoub.com/devops/servers/dns/%D9%85%D9%82%D8%A7%D8%B1%D9%86%D8%A9-%D8%A8%D9%8A%D9%86-%D8%A3%D9%86%D9%88%D8%A7%D8%B9-%D8%A7%D9%84%D8%AE%D9%88%D8%A7%D8%AF%D9%8A%D9%85-%D9%81%D9%8A-%D9%86%D8%B8%D8%A7%D9%85-dns-%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%A7%D8%AE%D8%AA%D9%8A%D8%A7%D8%B1-%D8%A7%D9%84%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF-%D8%A7%D9%84%D9%85%D9%86%D8%A7%D8%B3%D8%A8-%D9%84%D9%84%D8%AE%D8%A7%D8%AF%D9%88%D9%85-r15/" rel="">بخوادم DNS</a> في ملف إعدادات بطاقة الشبكة بإضافة سطري DNS1 و DNS2، تمامًا مثل نموذج الإعدادات الثابتة السابق.
</p>

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

<p>
	يحدد سطر <code>HWADDR</code> في كلا ملفي إعدادات بطاقة الشبكة العنوان MAC address لبطاقة الشبكة الفيزيائية، وهذا يربط بين بطاقة الشبكة الفيزيائية بملف إعدادات بطاقة الشبكة الموافق لها. يجب أن تعدّل عنوان MAC في الملف إذا بدّلت بطاقة الشبكة.
</p>

<p>
	يمكنك معرفة MAC address لبطاقة الشبكة NIC بعدة وسائل، أختار منها عادةً الأمر <code>ifconfig</code> الذي يعرض جميع بطاقات الشبكة المثبتة على الجهاز، وعنوان MAC لكل منها وإحصائيات متنوعة مرتبطة بها. يُطبع عنوان MAC للعديد من بطاقات الشبكة الحديثة على علبتها أو على ملصَق موجود على بطاقة الشبكة نفسها. لكن تولَّد معظم ملفات إعدادات بطاقة الشبكة تلقائيًا أثناء عملية تثبيت بطاقة الشبكة أو فور رصد بطاقة الشبكة المركَّبة حديثًا، ليتضمن ملف إعدادات بطاقة الشبكة الجديد عنوان MAC address.
</p>

<p>
	يشير سطر <code>ONBOOT</code> أن تفعيل بطاقة الشبكة يكون عند إقلاع الجهاز. إذا عدلنا هذا السطر إلى <code>no</code> يصبح تفعيل بطاقة الشبكة إما يدويًا أو من خلال واجهة مدير الشبكة بعد تسجيل الدخول.
</p>

<p>
	يشير السطر <code>USERCTL</code> أنه لا يسمح للمستخدمين غير المخوّلين بإدارة بطاقة الشبكة، أي تشغيلها وإيقافها. تعديل هذا المعامل parameter إلى <code>yes</code> يسمح للمستخدمين العاديين أن يفعِّلوا بطاقة الشبكة ويوقفوا تفعيلها.
</p>

<p>
	لا يهم ترتيب الأسطر في ملف إعدادات بطاقة الشبكة، إذ أنه سيؤدي مهامه كيفما رتبت الأسطر. وكما هو متعارف عليه، تكتَب أسماء الخيارات بأحرف كبيرة وتكتَب القيم بأحرف صغيرة. ويمكن أن تضع قيم الخيارات بين علامتي اقتباس ""، لكن لا يكون ذلك ضروريًا إلا في الحالة التي تكون فيها القيم رقمًا أو أكثر من كلمة واحدة.
</p>

<h2>
	خيارات الإعدادات
</h2>

<p>
	اخترت لك بعض أكثر الخيارات المستخدَمة في ملف إعدادات بطاقة الشبكة لتطلع عليها من بين العديد من خيارات الإعدادات:
</p>

<ul>
<li>
		<code>DEVICE</code>: الاسم المنطقي للجهاز، مثل <code>eth0</code> أو <code>enp0s2</code>.
	</li>
	<li>
		<code>HWADDR</code>: عنوان MAC address لبطاقة الشبكة المرتبطة بهذا الملف، مثل <code>00:16:76:02:BA:DB</code>.
	</li>
	<li>
		<code>ONBOOT</code>: تشغيل خدمات الشبكة على هذا الجهاز عندما يقلع المضيف. خياراته هي "yes/no". يكون هذا الخيار مضبوطًا على "no" عادةً، ولا تعمل الشبكة إلا عندما يسجل مستخدم الدخول إلى سطح المكتب. إذا أردت أن تعمل خدمات الشبكة حتى لو لم يسجل أي مستخدم دخوله عدّل هذا الخيار إلى "yes".
	</li>
	<li>
		<code>IPADDR</code>: عنوان IP المسنَد إلى بطاقة الشبكة، مثل 192.168.0.10.
	</li>
	<li>
		<code>BROADCAST</code>: عنوان البث المخصص لهذه الشبكة، مثل 192.168.0.255.
	</li>
	<li>
		<code>NETMASK</code>: قناع الشبكة لهذه الشبكة الفرعية مثل القناع من الفئة C التالي: 255.255.255.0.
	</li>
	<li>
		<code>NETWORK</code>: معرف الشبكة ID لهذه الشبكة الفرعية مثل معرف الشبكة من الفئة C التالي: 192.168.0.0.
	</li>
	<li>
		<code>SEARCH</code>: <a href="https://academy.hsoub.com/devops/servers/dns/%D8%AA%D9%86%D8%B5%D9%8A%D8%A8-%D9%88%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF-%D8%AE%D8%AF%D9%85%D8%A9-%D8%A7%D8%B3%D9%85-%D8%A7%D9%84%D9%86%D8%B7%D8%A7%D9%82-dns-%D8%B9%D9%84%D9%89-%D8%AE%D9%88%D8%A7%D8%AF%D9%8A%D9%85-%D8%A3%D9%88%D8%A8%D9%86%D8%AA%D9%88-r176/" rel="">اسم نطاق DNS</a> الذي يبحث عنه عند إجراء عمليات البحث عن أسماء المضيفين غير المؤهلة unqualified hostnames.
	</li>
	<li>
		<code>BOOTPROTO</code>: بروتوكول الإقلاع لبطاقة الشبكة هذه. تكون الخيارات كالتالي: <code>static</code> و <code>DHCP</code> و <code>bootp</code> و <code>none</code>. يشير خيار "none" افتراضيًا إلى ثابت static.
	</li>
	<li>
		<code>GATEWAY</code>: موجه الشبكة أو البوابة الافتراضية default gateway لهذه الشبكة الفرعية، مثل 192.168.0.254.
	</li>
	<li>
		<code>ETHTOOL_OPTS</code>: يستخدم هذا الخيار لضبط بنود إعدادات معينة لبطاقة الشبكة مثل السرعة وحالة الازدواج duplex وحالة التفاوض التلقائي autonegotiation. يجب أن تجمَع قيم هذا الخيار بين علامتي اقتباس واحدة لوجود عدة قيم منفصلة له، مثل: "autoneg off speed 100 duplex full".
	</li>
	<li>
		<code>DNS1</code>: خادم DNS الرئيسي مثل 192.168.0.254، وهو خادم موجود ضمن الشبكة المحلية. تضاف خوادم DNS المحددة هنا إلى ملف <code>‎/etc/resolv.conf</code> عند استخدام NetworkManager، أو عندما يكون خيار موجّه peerdns محددًا بالخيار <code>yes</code>. وإلا يجب أن تضاف خوادم DNS إلى الملف <code>‎/etc/resolv.conf</code> يدويًا ويتم تجاهلها هنا ضمن هذا الملف.
	</li>
	<li>
		<code>DNS2</code>: خادم DNS الثانوي، مثلًا 8.8.8.8، وهو أحد خوادم DNS المجانية الخاصة بجوجل Google. يجدر الإشارة أن إضافة خادم DNS ثانوي آخر tertiary DNS server غير مدعومة في ملف إعدادات بطاقة الشبكة، لكن يمكنك ضبطه في الملف الثابت <code>resolv.conf</code> .
	</li>
	<li>
		<code>TYPE</code>: نوع الشبكة الذي يكون عادةً <code>Ethernet</code>، إذ أن القيمة الوحيدة الأخرى التي رأيتها في هذا الخيار كانت <code>Token Ring</code>، لكن ذلك عرَضي في معظم الأحيان.
	</li>
	<li>
		<code>PEERDNS</code>: يشير خيار <code>yes</code> أن ملف <code>‎/etc/resolv.conf</code> سيعدَّل بإدراج مدخلات خادم DNS ضمنه، التي نحددها في خياري <code>DNS1</code> و <code>DNS2</code> ضمن هذا الملف. يشير الخيار "No" إلى عدم تعديل ملف <code>resolv.conf</code>. يكون خيار "Yes" الخيار الافتراضي عندما نحدد خيار <code>DHCP</code> في سطر <code>BOOTPROTO</code>.
	</li>
	<li>
		<code>USERCTL</code>: يحدد سماحية تشغيل وإيقاف بطاقة الشبكة للمستخدمين غير المخوّلين، وتكون خياراته "yes/no".
	</li>
	<li>
		<code>IPV6INIT</code>: يبين هل تطبَّق <a href="https://academy.hsoub.com/devops/networking/%D8%A7%D9%84%D8%A5%D8%B5%D8%AF%D8%A7%D8%B1-%D8%A7%D9%84%D8%B3%D8%A7%D8%AF%D8%B3-%D9%85%D9%86-%D8%A8%D8%B1%D9%88%D8%AA%D9%88%D9%83%D9%88%D9%84-ip-r504/" rel="">بروتوكولات IPV6</a> على بطاقة الشبكة هذه أم لا، وتكون خياراته "yes/no".
	</li>
</ul>
<p>
	تحديد الخيار <code>DHCP</code> يؤدي إلى تجاهل معظم الخيارات الأخرى، لتكون الخيارات الوحيدة المطلوبة في هذه الحالة هي <code>BOOTPROTO</code> و <code>ONBOOT</code> و <code>HWADDR</code>. من الخيارات الأخرى التي لا يتم تجاهلها وقد تجدها مفيدةً خياري <code>DNS1</code> و <code>PEERDNS</code> وذلك في حالة أردت تجاوز مدخلات DNS التي يزودك بها خادم DHCP.
</p>

<h2>
	ملف الشبكة القديم
</h2>

<p>
	ستتعامل مع ملف واحد قديم وأصبح مهملًا الآن وهو ملف الشبكة network. الذي يتضمن في إصدارات فيدورا وريد هات وسينتوس عادةً سطرًا واحدًا يحتوي تعليقًا، وتجده في المسار <code>‎/etc/sysconfig</code>. كان يستخدم سابقًا لتفعيل أو تعطيل الربط الشبكي، إضافةً إلى تحديد اسم مضيف الشبكة كما هو مبين في النموذج التالي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_8267_16" style="">
<span class="pln">NETWORKING</span><span class="pun">=</span><span class="pln">yes
HOSTNAME</span><span class="pun">=</span><span class="pln">host</span><span class="pun">.</span><span class="pln">example</span><span class="pun">.</span><span class="pln">com</span></pre>

<p>
	إن هذا الملف موجود في فيدورا منذ إصدارها 19 لكنه غير مستخدَم. لا يزال مستخدمًا في إصدارات RHEL/CentOS 6.x، لكنه لم يعد مستخدمًا في RHEL/CentOS 7.x، إذ يحدَّد اسم مضيف الشبكة حاليًا في الملف <code>‎/etc/hostname</code>.
</p>

<h2>
	ملفات الشبكة الأخرى
</h2>

<p>
	يحتوي مجلد <code>‎/etc/sysconfig/network-files</code> العديد من الملفات الأخرى التي تكون جميعها عادةً نصوص <a href="https://academy.hsoub.com/devops/linux/%D8%AF%D9%84%D9%8A%D9%84-%D9%85%D9%8A%D9%8E%D8%B3%D9%91%D9%8E%D8%B1-%D9%84%D9%83%D8%AA%D8%A7%D8%A8%D8%A9-%D8%B3%D9%83%D8%B1%D8%A8%D8%AA%D8%A7%D8%AA-shell-r56/" rel="">باش BASH تنفيذية</a> وليست ملفات إعدادات. إن هذا بالنسبة لي على الأقل إحدى أكثر الاستثناءات المزعجة للتسلسل الهرمي القياسي <a href="https://academy.hsoub.com/devops/linux/%D9%83%D9%8A%D9%81-%D8%AA%D9%81%D9%87%D9%85-%D9%87%D9%8A%D9%83%D9%84%D9%8A%D8%A9-%D9%86%D8%B8%D8%A7%D9%85-%D8%A7%D9%84%D9%85%D9%84%D9%81%D8%A7%D8%AA-%D9%81%D9%8A-%D9%84%D9%86%D9%83%D8%B3-r53/" rel="">لنظام الملفات في لينكس</a> FHS الذي ينص صراحةً أن ملفات الإعدادات، وليست الملفات التنفيذية، هي الملفات الوحيدة التي نجدها ضمن المسار<code>etc/</code>.
</p>

<p>
	ملف <code>route-&lt;interface&gt;‎</code> هو أحد ملفات الشبكة الأخرى الموجودة في المسار <code>‎/etc/sysconfig/network-files</code>. إذا أردت أن تضبط أسطر توجيه ثابتة static routes في نظام متصل بأكثر من شبكة multi-homed system، أنشئ ملف توجيه route لكل بطاقة شبكة. فمثلًا يسمى الملف التالي <em>route-eth0</em>، وهو يحدد أسطر التوجيه لبطاقة شبكة محددة لكل من الشبكات والمضيفين الفرديين.
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_8267_18" style="">
<span class="kwd">default</span><span class="pln"> </span><span class="lit">192.168</span><span class="pun">.</span><span class="lit">2.1</span><span class="pln"> dev eth0
</span><span class="lit">10.10</span><span class="pun">.</span><span class="lit">10.0</span><span class="pun">/</span><span class="lit">24</span><span class="pln"> via </span><span class="lit">192.168</span><span class="pun">.</span><span class="lit">0.1</span><span class="pln"> dev eth0
</span><span class="lit">192.168</span><span class="pun">.</span><span class="lit">1.0</span><span class="pun">/</span><span class="lit">24</span><span class="pln"> via </span><span class="lit">192.168</span><span class="pun">.</span><span class="lit">0.1</span><span class="pln"> dev eth0

</span><span class="lit">192.168</span><span class="pun">.</span><span class="lit">96.11</span><span class="pln"> via </span><span class="lit">192.168</span><span class="pun">.</span><span class="lit">97.1</span><span class="pln">
</span><span class="lit">192.168</span><span class="pun">.</span><span class="lit">15.100</span><span class="pln"> via </span><span class="lit">192.168</span><span class="pun">.</span><span class="lit">15.32</span><span class="pln">
</span><span class="lit">192.168</span><span class="pun">.</span><span class="lit">96.12</span><span class="pln"> via </span><span class="lit">192.168</span><span class="pun">.</span><span class="lit">97.1</span><span class="pln">
</span><span class="lit">192.168</span><span class="pun">.</span><span class="lit">97.100</span><span class="pln"> via </span><span class="lit">192.168</span><span class="pun">.</span><span class="lit">97.1</span></pre>

<p>
	نادرًا ما يستخدم هذا الملف، إلا في حالة كنت تستخدم المضيف كموجه في بعض احتياجات التوجيه المعقدة. اطلع على <a href="https://access.redhat.com/documentation/en/red-hat-enterprise-linux/" rel="external nofollow">دليل الربط الشبكي</a> الخاص بإصدار ريد هات إنتربرايس لينكس أو سينتوس لديك للحصول على المزيد من تفاصيل ضبط أسطر التوجيه.
</p>

<h2>
	بدء تشغيل الشبكة
</h2>

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

<h2>
	الشبكة
</h2>

<p>
	كانت خدمات الشبكة القديمة هي المستخدَمة افتراضيًا في إدارة مهام بدء تشغيل الشبكة وإيقافها في التوزيعات المبنية على ريد هات حتى عام 2004. كان نص التشغيل البرمجي SystemV يستخدم ملفات إعدادات ثابتة لتشغيل الشبكة السلكية أو اللاسلكية عند إقلاع الجهاز، أو عند تنفيذ أمر بسيط مثل <code>service network start</code> في واجهة الأوامر. لا تزال هذه الخدمة متوفرة لكن يعاد توجيه الأوامر من خلال systemd.
</p>

<p>
	لا تستطيع خدمة الشبكة مراقبة الأجهزة القابلة للتوصيل أو <a href="https://academy.hsoub.com/certificates/cisco/ccna/%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%A7%D9%84%D8%B4%D8%A8%D9%83%D8%A7%D8%AA-%D8%A7%D9%84%D9%84%D8%A7%D8%B3%D9%84%D9%83%D9%8A%D8%A9-r20/" rel="">الشبكات اللاسلكية</a> المتغيرة، لذا يصعب استخدامها على الحواسيب المحمولة أو الحواسيب من نوع نت بوك netbook.
</p>

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

<h2>
	مدير الشبكة
</h2>

<p>
	طرحت ريدهات مدير الشبكة NetworkManager في عام 2004 لتسهيل عملية ضبط الشبكة والاتصالات وأتمتتها، وخاصةً للشبكات اللاسلكية. كانت الغاية منه تفادي اضطرار المستخدم إلى ضبط كل شبكة لاسلكية يدويًا. مع أن الغاية منه كانت تسهيل إدارة الشبكة على المستخدمين غير التقنيين، إلا أنها تتطلب أن يجري مدير النظام بعض التعديلات، لأن العديد من الوظائف المعتادة أصبحت تعالجها شريحة جديدة من ملفات الإعدادات والنصوص البرمجية. هذا يعني أن ملفات الإعدادات القياسية معرضة لأن يكتب مدير الشبكة فيها في كل مرة يعاد تشغيل خدمات الشبكة، وهذا يشمل كل عملية إعادة إقلاع.
</p>

<p>
	إن العفريت <code>udev</code> هو مدير نواة الجهاز المسؤول عن تسمية جميع الأجهزة تسميةً منهجيةً ومتواصلةً، وهذا يشمل أجهزة الشبكة وأجهزة التخزين القابلة للإزالة. كما تستخدم لمطابقة أسماء أجهزة الشبكة مثل <code>eth0</code> أو <code>eno1</code> مع عنوان MAC لبطاقة الشبكة.
</p>

<h2>
	آلية عمله التقريبية
</h2>

<p>
	يرصد مدير الأجهزة udev إضافة جهاز جديد إلى النظام مثل بطاقة شبكة جديدة، وينشئ قاعدةً للتعرف عليه وتسميته إذا لم يكن موجودًا مسبقًا. تغيرت تفاصيل آلية تنفيذ ذلك في الإصدارات الأحدث من فيدورا وسينتوس وريد هات. يمكنك الاطلاع على الشرح المفصَّل للنهج المتَّبع في تسمية الأجهزة في <a href="https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/Networking_Guide/index.html" rel="external nofollow">دليل الربط الشبكي في ريد هات 7</a>، إضافةً إلى شرح من أين تشتَق هذه الأسماء.
</p>

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

<p>
	ينشئ العفريت udev قيدًا لكل بطاقة شبكة في ملف قواعد الشبكة. يستخدم مدير الشبكة هذه القيود إضافةً إلى المعلومات الواردة في ملفات إعدادات بطاقة الشبكة الموجودة في مجلد <code>‎/etc/sysconfig/network-scripts</code> في تهيئة كل بطاقة شبكة.
</p>

<h2>
	قرار مدراء النظام
</h2>

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

<p>
	لا أنصح شخصيًا بالرجوع إلى خدمات الشبكة الأقدم، لأنني لحظة فهمت آلية عمل مدير الشبكة و udev معًا لتوفير نظام تسمية ثابت وضبط تلقائي لكل من الأجهزة الحالية والجديدة، بدا كل شيء منطقيًا بالنسبة لي وجعل ذلك إدارة بطاقات الشبكة أسهل. برأيي إن مدير الشبكة يجمع ميزات الخدمتين.
</p>

<p>
	لكن كما جرت العادة في <a href="https://academy.hsoub.com/files/24-%D8%A3%D9%86%D8%B8%D9%85%D8%A9-%D8%A7%D9%84%D8%AA%D8%B4%D8%BA%D9%8A%D9%84-%D9%84%D9%84%D9%85%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D9%86/" rel="">نظام التشغيل</a> لينكس، إن اتخاذ قرار أية خدمة ستستخدم يعود إليك.
</p>

<p>
	ترجمة -وبتصرف- للمقال <a href="https://opensource.com/life/16/6/how-configure-networking-linux" rel="external nofollow">‎How to configure networking in Linux</a> لصاحبه David Both.
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
<li>
		<a href="https://academy.hsoub.com/certificates/cisco/ccna/%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D8%B4%D8%A8%D9%83%D8%A7%D8%AA-%D8%A7%D9%84%D8%AD%D9%88%D8%A7%D8%B3%D9%8A%D8%A8-r2/" rel="">أساسيات شبكات الحواسيب</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/devops/networking/%D9%85%D8%B9%D9%85%D8%A7%D8%B1%D9%8A%D8%A9-%D8%A7%D9%84%D8%B4%D8%A8%D9%83%D8%A9-%D8%A7%D9%84%D8%AD%D8%A7%D8%B3%D9%88%D8%A8%D9%8A%D8%A9-%D9%88%D8%B4%D8%A8%D9%83%D8%A9-%D8%A7%D9%84%D8%A5%D9%86%D8%AA%D8%B1%D9%86%D8%AA-network-architecture-r484/" rel="">معمارية الشبكة الحاسوبية وشبكة الإنترنت (Network Architecture)</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/devops/servers/dns/%D8%A3%D8%AF%D9%88%D8%A7%D8%AA-%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A9-%D9%84%D9%84%D8%A7%D8%B3%D8%AA%D8%B9%D9%84%D8%A7%D9%85-%D8%B9%D9%86-%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-%D8%B9%D9%84%D9%89-%D9%84%D9%8A%D9%86%D9%83%D8%B3-r323/" rel="">أدوات أساسية للاستعلام عن أسماء النطاقات على لينكس</a>
	</li>
	<li>
		<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="">بناء مخطط لعناوين IP عبر الشبكات الفرعية عند بناء الشبكات</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/certificates/cisco/ccna/%D8%A7%D8%B3%D8%AA%D8%B9%D9%85%D8%A7%D9%84-%D9%85%D9%88%D8%AC%D9%87-%D8%B3%D9%8A%D8%B3%D9%83%D9%88-cisco-router-%D9%83%D8%AE%D8%A7%D8%AF%D9%88%D9%85-dhcp-%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-r28/" rel="">استعمال موجه سيسكو Cisco router كخادوم DHCP عند بناء الشبكات</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/devops/networking/%D8%A7%D9%84%D8%B4%D8%A8%D9%83%D8%A7%D8%AA-%D8%A7%D9%84%D8%AD%D8%A7%D8%B3%D9%88%D8%A8%D9%8A%D8%A9-%D9%85%D8%AA%D8%B9%D8%AF%D8%AF%D8%A9-%D8%A7%D9%84%D9%88%D8%B5%D9%88%D9%84-multi-access-networks-r491/" rel="">الشبكات الحاسوبية متعددة الوصول (Multi-Access Networks)</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">563</guid><pubDate>Fri, 10 Dec 2021 10:15:35 +0000</pubDate></item><item><title>&#x627;&#x644;&#x628;&#x62D;&#x62B; &#x639;&#x646; &#x627;&#x644;&#x645;&#x644;&#x641;&#x627;&#x62A; &#x648;&#x627;&#x644;&#x645;&#x62C;&#x644;&#x62F;&#x627;&#x62A; &#x639;&#x644;&#x649; &#x644;&#x64A;&#x646;&#x643;&#x633; &#x628;&#x627;&#x633;&#x62A;&#x62E;&#x62F;&#x627;&#x645; &#x627;&#x644;&#x623;&#x645;&#x631; find</title><link>https://academy.hsoub.com/devops/linux/%D8%A7%D9%84%D8%A8%D8%AD%D8%AB-%D8%B9%D9%86-%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-%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%A3%D9%85%D8%B1-find-r560/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2021_12/61ae00bc1e666_06________fin-0-0.png.0aa473a51a4a504f3df2a67ae1bd8a46.png" /></p>

<p>
	مهما كنت منظمًا في ترتيب ملفاتك ومجلداتك، ستجد نفسك في بعض الأحيان تحاول البحث عن ملف ما ولا تستطيع إيجاده. ربما تكون قد نسيت اسم الملف أو أحيانا تتذكر اسم الملف، ولكن تنسى أين قمت بحفظه. أحيانًا تحاول الوصول لملف لم تنشئه أنت أصلًا. مهما كان المأزق الذي تمرّ به، على نظام POSIX ستجد دومًا الأمر <code>find</code> لمساعدتك.
</p>

<h2>
	تثبيت الأمر find
</h2>

<p>
	الأمر <code>find</code> معرَّف ضمن <a href="https://pubs.opengroup.org/onlinepubs/9699919799.2018edition/" rel="external nofollow">معايير POSIX</a>، والتي تحدد المقاييس المفتوحة التي تتبعها أنظمة POSIX. وببساطة عند استخدامك لأحد أنظمة التشغيل التي تتبع تلك المعايير ومنها <a href="https://academy.hsoub.com/devops/linux/%D9%85%D8%A7-%D9%87%D9%88-%D9%86%D8%B8%D8%A7%D9%85-%D8%A7%D9%84%D8%AA%D8%B4%D8%BA%D9%8A%D9%84-%D9%84%D9%8A%D9%86%D9%83%D8%B3%D8%9F-r451/" rel="">لينكس</a>، و BSD، وماك فالأمر <code>find</code> مثبت لديك مسبقًا.
</p>

<p>
	مع ذلك ليست كل أوامر <code>find</code> متماثلة. مثلا الأمر نفسه في جنو يحوي مزايا غير موجودة في ذات الأمر <code>find</code> على أنظمة BSD أو بيزي بوكس Busybox أو سولاريس Solaris أو قد يحتوي على مزايا متماثلة لكن طريقة تضمينها مختلفة. في هذا المقال سنستخدم الأمر <code>find</code> الخاص بجنو الموجود في حزمة <a href="https://www.gnu.org/software/findutils/" rel="external nofollow"><code>findutils</code></a> بسبب سهولة توافرها وشعبيتها الكبيرة. معظم الأوامر التي سنشرحها في هذا المقال تعمل مع تضمينات أخرى للأمر <code>find</code>. ولتفادي الحصول على نتائج مختلفة نزِّل نسخة جنو من الأمر وثبتها لديك.
</p>

<h2>
	بحث عن ملف بالاسم
</h2>

<p>
	يمكنك العثور على ملف بالاسم عبر اسم الملف بالكامل أو أجزاء منه مع <a href="https://academy.hsoub.com/programming/general/%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-%D9%81%D9%8A-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-r1374/" rel="">استخدام التعابير النمطية</a>. الأمر <code>find</code> يحتاج أن تمرر له مسار المجلد الذي تريد البحث داخله، خيارات لتحديد الخاصية التي سيتم البحث من خلالها (مثلًا الخيار <code>name-</code> للبحث بإسم الملف حسّاس للحالة)، ثم نص البحث. افتراضيا سيتم معاملة نص البحث حرفيًا: الأمر <code>find</code> سيبحث عن الملفات التي تطابق تماما النص المُدخل بين علامتي اقتباس إلّا إذا كنت تستخدم صيغة التعبير النمطي.
</p>

<p>
	بفرض أن مجلد مستنداتك يحوي أربع ملفات: <code>Foo</code> و <code>foo</code> و <code>foobar.txt</code> و <code>foo.xml</code>. يبحث الأمر التالي عن ملف باسم <code>"foo"</code> حرفيًا:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_9180_8" style="">
<span class="pln">$ find </span><span class="pun">~</span><span class="pln"> </span><span class="pun">-</span><span class="pln">name </span><span class="str">"foo"</span><span class="pln">
</span><span class="pun">/</span><span class="pln">home</span><span class="pun">/</span><span class="pln">tux</span><span class="pun">/</span><span class="typ">Documents</span><span class="pun">/</span><span class="pln">examples</span><span class="pun">/</span><span class="pln">foo</span></pre>

<p>
	يمكن جعل البحث غير حساس لحالة الأحرف عبر تمرير الخيار <code>iname-</code>:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_9180_10" style="">
<span class="pln">$ find </span><span class="pun">~</span><span class="pln"> </span><span class="pun">-</span><span class="pln">iname </span><span class="str">"foo"</span><span class="pln">
</span><span class="pun">/</span><span class="pln">home</span><span class="pun">/</span><span class="pln">tux</span><span class="pun">/</span><span class="typ">Documents</span><span class="pun">/</span><span class="pln">examples</span><span class="pun">/</span><span class="pln">foo
</span><span class="pun">/</span><span class="pln">home</span><span class="pun">/</span><span class="pln">tux</span><span class="pun">/</span><span class="typ">Documents</span><span class="pun">/</span><span class="pln">examples</span><span class="pun">/</span><span class="typ">Foo</span></pre>

<h2>
	محارف البدل Wildcards
</h2>

<p>
	يمكنك استخدام محارف البدل الأساسية للصدفة لتتمكن من العثور على باقي الملفات، محرف النجمة (<code>*</code>) يمثل أي عدد من الحروف والأرقام:
</p>

<pre class="ipsCode prettyprint lang-xml prettyprinted" id="ips_uid_9180_20" style="">
<span class="pln">$ find ~ -iname "foo*"
/home/tux/Documents/examples/foo
/home/tux/Documents/examples/Foo
/home/tux/Documents/examples/foo.xml
/home/tux/Documents/examples/foobar.txt</span></pre>

<p>
	محرف إشارة الاستفهام (<code>?</code>) يمثل محرفًا واحدًا:
</p>

<pre class="ipsCode prettyprint lang-xml prettyprinted" id="ips_uid_9180_18" style="">
<span class="pln">$ find ~ -iname "foo*.???"
/home/tux/Documents/examples/foo.xml
/home/tux/Documents/examples/foobar.txt</span></pre>

<p>
	هذه ليست صيغة التعابير النمطية، لذا في المثال السابق محرف النقطة (<code>.</code>) يمثل النقطة حرفيًا.
</p>

<h2>
	التعابير النمطية Regular expressions
</h2>

<p>
	يمكنك أيضا استخدام التعابير النمطية. على عكس الخيارين <code>iname-</code> و <code>name-</code> الذين يعبران عن الحالة الحساسة لحالة الأحرف والحالة الغير حساسة لحالة الأحرف على اسم الملف، الخيارين <code>regex-</code> و <code>iregex-</code> يطبقان على كامل مسار الملف، وليس فقط اسم الملف. هذا يعني أنك إذا قمت بالبحث عن <code>foo</code>، لن تحصل على نتيجة لأن <code>foo</code> لا تطابق المسار <code>home/tux/Documents/foo/</code>. بدل من ذلك يمكنك إما البحث عن المسار بشكل كامل، أو استخدام سلسلة محارف البدل في بداية نص البحث:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_9180_22" style="">
<span class="pln">$ find </span><span class="pun">~</span><span class="pln"> </span><span class="pun">-</span><span class="pln">iregex </span><span class="str">".*foo"</span><span class="pln">
</span><span class="pun">/</span><span class="pln">home</span><span class="pun">/</span><span class="pln">tux</span><span class="pun">/</span><span class="typ">Documents</span><span class="pun">/</span><span class="pln">examples</span><span class="pun">/</span><span class="pln">foo
</span><span class="pun">/</span><span class="pln">home</span><span class="pun">/</span><span class="pln">tux</span><span class="pun">/</span><span class="typ">Documents</span><span class="pun">/</span><span class="pln">examples</span><span class="pun">/</span><span class="typ">Foo</span></pre>

<h2>
	إيجاد ملف تم تعديله الأسبوع الماضي
</h2>

<p>
	لإيجاد ملف تم تعديله الأسبوع الماضي، استخدم الخيار <code>mtime-</code> مع عدد سالب يعبر عن عدد الأيام السابقة:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_9180_25" style="">
<span class="pln">$ find </span><span class="pun">~</span><span class="pln"> </span><span class="pun">-</span><span class="pln">mtime </span><span class="pun">-</span><span class="lit">7</span><span class="pln">
</span><span class="pun">/</span><span class="pln">home</span><span class="pun">/</span><span class="pln">tux</span><span class="pun">/</span><span class="typ">Documents</span><span class="pun">/</span><span class="pln">examples</span><span class="pun">/</span><span class="pln">foo
</span><span class="pun">/</span><span class="pln">home</span><span class="pun">/</span><span class="pln">tux</span><span class="pun">/</span><span class="typ">Documents</span><span class="pun">/</span><span class="pln">examples</span><span class="pun">/</span><span class="typ">Foo</span><span class="pln">
</span><span class="pun">/</span><span class="pln">home</span><span class="pun">/</span><span class="pln">tux</span><span class="pun">/</span><span class="typ">Documents</span><span class="pun">/</span><span class="pln">examples</span><span class="pun">/</span><span class="pln">foo</span><span class="pun">.</span><span class="pln">xml
</span><span class="pun">/</span><span class="pln">home</span><span class="pun">/</span><span class="pln">tux</span><span class="pun">/</span><span class="typ">Documents</span><span class="pun">/</span><span class="pln">examples</span><span class="pun">/</span><span class="pln">foobar</span><span class="pun">.</span><span class="pln">txt</span></pre>

<h2>
	إيجاد ملف تم تعديله خلال مدة محددة من الأيام
</h2>

<p>
	يمكنك دمج استخدام الخيار <code>mtime-</code> عدة مرات لإيجاد ملف تم تعديله خلال مدة محددة من الأيام. للمعامل للخيار <code>mtime-</code> الأول مرر قيمة أقرب يوم تم تعديل الملف فيه، للمعامل للخيار الثانِ مرر قيمة أكبر عدد من الأيام في الماضي. في المثال التالي سيتم البحث عن الملفات التي تم تعديلها قبل يوم واحد مضى، ولكن ليس قبل سبعة أيام:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_9180_27" style="">
<span class="pln">$ find </span><span class="pun">~</span><span class="pln"> </span><span class="pun">-</span><span class="pln">mtime </span><span class="pun">+</span><span class="lit">1</span><span class="pln"> </span><span class="pun">-</span><span class="pln">mtime </span><span class="pun">-</span><span class="lit">7</span></pre>

<h2>
	تحديد البحث بنوع الملف
</h2>

<p>
	من الشائع تحديد نتيجة البحث بواسطة <code>find</code> حسب نوع الملف الذي ت قوم بالبحث عنه. لا يجب استخدام هذا الخيار في حال كنت لست متأكد من نوع الملف الذي تبحث عنه، لكن إذا كنت تبحث تحديدا عن ملف وليس مجلد أو العكس مجلد وليس عن ملف، فهذا الخيار سيصفي النتائج كما تحتاج تمامًا. الخيار هو <code>type-</code>، ومعاملاته هي أحرف رموز تمثل عدة أنواع من البيانات. الأشيع منها هو:
</p>

<ul>
<li>
		<code>d</code> - مجلد
	</li>
	<li>
		<code>f</code> - ملف
	</li>
	<li>
		<code>l</code> - وصلة رمزية
	</li>
	<li>
		<code>s</code> - مقبس
	</li>
	<li>
		<code>p</code> - أنبوب مسمّى (تستخدم ل FIFO)
	</li>
	<li>
		<code>b</code> - كتلة خاصة (عادة كون قرص صلب باسم)
	</li>
</ul>
<p>
	التالي بعض الأمثلة:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_9180_31" style="">
<span class="pln">$ find </span><span class="pun">~</span><span class="pln"> </span><span class="pun">-</span><span class="pln">type d </span><span class="pun">-</span><span class="pln">name </span><span class="str">"Doc*"</span><span class="pln">
</span><span class="pun">/</span><span class="pln">home</span><span class="pun">/</span><span class="pln">tux</span><span class="pun">/</span><span class="typ">Documents</span><span class="pln">
$ find </span><span class="pun">~</span><span class="pln"> </span><span class="pun">-</span><span class="pln">type f </span><span class="pun">-</span><span class="pln">name </span><span class="str">"Doc*"</span><span class="pln">
</span><span class="pun">/</span><span class="pln">home</span><span class="pun">/</span><span class="pln">tux</span><span class="pun">/</span><span class="typ">Downloads</span><span class="pun">/</span><span class="lit">10th</span><span class="pun">-</span><span class="typ">Doctor</span><span class="pun">.</span><span class="pln">gif
$ find </span><span class="pun">/</span><span class="pln">dev </span><span class="pun">-</span><span class="pln">type b </span><span class="pun">-</span><span class="pln">name </span><span class="str">"sda*"</span><span class="pln">
</span><span class="pun">/</span><span class="pln">dev</span><span class="pun">/</span><span class="pln">sda
</span><span class="pun">/</span><span class="pln">dev</span><span class="pun">/</span><span class="pln">sda1</span></pre>

<h2>
	ضبط نطاق البحث
</h2>

<p>
	الأمر <code>find</code> افتراضيا يعمل بشكل تكراري، أي أنه يقوم بالبحث في المجلدات داخل المجلدات داخل المجلدات (وهكذا دواليك). يمكن للأمر أن يكون مزعجًا بعض الشيء في أنظمة الملفات الكبيرة، يمكنك عندها استخدام الخيار <code>maxdepth-</code> للتحكم بعدد الطبقات التي تريد الأمر <code>find</code> أن يقوم بالبحث داخلها في هيكلية الملفات لديك:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_9180_33" style="">
<span class="pln">$ find </span><span class="pun">/</span><span class="pln">usr </span><span class="pun">-</span><span class="pln">iname </span><span class="str">"*xml"</span><span class="pln"> </span><span class="pun">|</span><span class="pln"> wc </span><span class="pun">-</span><span class="pln">l
</span><span class="lit">15588</span><span class="pln">
$ find </span><span class="pun">/</span><span class="pln">usr </span><span class="pun">-</span><span class="pln">maxdepth </span><span class="lit">2</span><span class="pln"> </span><span class="pun">-</span><span class="pln">iname </span><span class="str">"*xml"</span><span class="pln"> </span><span class="pun">|</span><span class="pln"> wc </span><span class="pun">-</span><span class="pln">l
</span><span class="lit">15</span></pre>

<h2>
	الاستنتاج
</h2>

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

<p>
	ترجمة -وبتصرف- للمقال <a href="https://opensource.com/article/21/9/linux-find-command" rel="external nofollow">Find files and directories on Linux with the find command</a> لصاحبه Seth Kenlon.
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
<li>
		<a href="https://academy.hsoub.com/devops/linux/%D8%AA%D8%B9%D9%84%D9%85-%D9%81%D9%83-%D8%B6%D8%BA%D8%B7-%D9%85%D9%84%D9%81%D8%A7%D8%AA-targz-%D8%A8%D8%A7%D8%B3%D8%AA%D8%B9%D9%85%D8%A7%D9%84-%D8%A7%D9%84%D8%A3%D9%85%D8%B1-tar-%D9%81%D9%8A-%D9%84%D9%8A%D9%86%D9%83%D8%B3-r559/" rel="">تعلم فك ضغط ملفات tar.gz باستعمال الأمر tar في لينكس</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/devops/linux/%D8%AA%D8%B9%D8%AF%D9%8A%D9%84-%D8%A7%D9%84%D8%B5%D9%88%D8%B1-%D9%88%D8%A7%D9%84%D8%AA%D9%84%D8%A7%D8%B9%D8%A8-%D8%A8%D9%87%D8%A7-%D8%B9%D8%A8%D8%B1-%D8%B3%D8%B7%D8%B1-%D8%A7%D9%84%D8%A3%D9%88%D8%A7%D9%85%D8%B1-%D9%81%D9%8A-%D9%84%D9%8A%D9%86%D9%83%D8%B3-r555/" rel="">تعديل الصور والتلاعب بها عبر سطر الأوامر في لينكس</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/devops/linux/4-%D8%A3%D8%AF%D9%88%D8%A7%D8%AA-%D9%85%D9%81%D8%AA%D9%88%D8%AD%D8%A9-%D8%A7%D9%84%D9%85%D8%B5%D8%AF%D8%B1-%D9%85%D9%86-%D8%A3%D8%AC%D9%84-%D9%85%D8%B1%D8%A7%D9%82%D8%A8%D8%A9-%D9%86%D8%B8%D8%A7%D9%85-%D9%84%D9%8A%D9%86%D9%83%D8%B3-r523/" rel="">4 أدوات مفتوحة المصدر من أجل مراقبة نظام لينكس</a>
	</li>
	<li>
		النسخة الكاملة من كتاب <a href="https://academy.hsoub.com/files/24-%D8%A3%D9%86%D8%B8%D9%85%D8%A9-%D8%A7%D9%84%D8%AA%D8%B4%D8%BA%D9%8A%D9%84-%D9%84%D9%84%D9%85%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D9%86/" rel="">أنظمة التشغيل للمبرمجين</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">560</guid><pubDate>Thu, 02 Dec 2021 18:03:00 +0000</pubDate></item><item><title>&#x62A;&#x639;&#x644;&#x645; &#x641;&#x643; &#x636;&#x63A;&#x637; &#x645;&#x644;&#x641;&#x627;&#x62A; tar.gz &#x628;&#x627;&#x633;&#x62A;&#x639;&#x645;&#x627;&#x644; &#x627;&#x644;&#x623;&#x645;&#x631; tar &#x641;&#x64A; &#x644;&#x64A;&#x646;&#x643;&#x633;</title><link>https://academy.hsoub.com/devops/linux/%D8%AA%D8%B9%D9%84%D9%85-%D9%81%D9%83-%D8%B6%D8%BA%D8%B7-%D9%85%D9%84%D9%81%D8%A7%D8%AA-targz-%D8%A8%D8%A7%D8%B3%D8%AA%D8%B9%D9%85%D8%A7%D9%84-%D8%A7%D9%84%D8%A3%D9%85%D8%B1-tar-%D9%81%D9%8A-%D9%84%D9%8A%D9%86%D9%83%D8%B3-r559/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2021_12/61ae00928c260_05_____tar.gz_tar__-0-0.png.ca99692a68e72a85b708f9e21e37f3c7.png" /></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%a3%d8%af%d9%88%d8%a7%d8%aa-%d8%b6%d8%ba%d8%b7-%d8%a7%d9%84%d9%85%d9%84%d9%81%d9%91%d8%a7%d8%aa-%d8%b9%d9%84%d9%89-%d9%86%d8%b8%d8%a7%d9%85-%d9%84%d9%8a%d9%86%d9%83%d8%b3-r67/" rel="">بضغط الملفات</a> وإنشاءها واستخراجها من ملفات tar المضغوطة. إذا كنت أحد مستخدمي البرامج مفتوحة المصدر، فغالبًا ما صادفت ملفات من نوع <code>tar.</code> يعود تاريخ انشاء أداة الأرشفة مفتوحة المصدر tar إلى العام 1979، لذا فهي واسعة الانتشار في عالم POSIX. هدفها بسيط: أخذ ملف أو مجموعة من الملفات وتغليفها في ملف واحد، يدعى أرشيف أشرطة التسجيل tar archive. وقد سمي بذلك لأنه عندما تم اختراع tar كان يستخدم لتخزين البيانات على أشرطة التسجيل.
</p>

<p>
	من يتعرف على صيغة tar حديثا فسوف يقوم بتشبيهها بملفات <code>zip.</code>، لكن على عكسها فعليا ملفات tar <em>ليست</em> مضغوطة. صيغة tar تقوم فقط بإنشاء حاوية للملفات، لكن يمكننا ضغط الملفات باستخدام أدوات أخرى. طرق الضغط الشائعة التي تطبق على ملف <code>tar.</code> هي Gzip وbzip2، وxz. هذا هو سبب ندرة مصادفتك لملف بصيغة <code>tar.</code> فقط وعادة ما تصادف الملفات بالصيغ الشائعة <code>tar.gz.</code> أو <code>tgz.</code>
</p>

<h2>
	تثبيت الأمر tar
</h2>

<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%A3%D9%85%D8%B1-tar-%D9%81%D9%8A-%D9%84%D9%8A%D9%86%D9%83%D8%B3-r243/" rel="">الأمر tar</a> على لينكس و BSD و إيلوموس و وحتى ماك مثبتًا لديك مسبقًا.
</p>

<p>
	على ويندوز أسهل طريقة للتعامل مع الملفات من النوع <code>tar.</code> هي عبر تنصيب الأداة <a href="http://www.7-zip.org/" rel="external nofollow">‎7-Zip</a> المفتوحة المصدر برخصة <a href="https://academy.hsoub.com/freelance/general/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D8%A3%D9%86%D9%88%D8%A7%D8%B9-%D8%A7%D9%84%D8%AA%D8%B1%D8%A7%D8%AE%D9%8A%D8%B5-%D8%A7%D9%84%D8%AD%D8%B1%D8%A9-%D8%A7%D9%84%D8%AA%D9%8A-%D8%AA%D8%B3%D9%85%D8%AD-%D9%84%D9%83-%D8%A8%D8%A8%D9%8A%D8%B9-%D8%A7%D9%84%D9%85%D9%88%D8%A7%D8%AF-%D8%A8%D8%B4%D9%83%D9%84-%D8%AA%D8%AC%D8%A7%D8%B1%D9%8A-r43/" rel="">LGPL</a>. اسم الأداة يوحي أنها أداة للتعامل مع الصيغة zip، لكن يمكنها التعامل أيضا مع ملفات الأرشيف من النوع tar، وتوفر أيضا واجهة أوامر لموجه الأوامر cmd.
</p>

<p>
	إذا كنت تريد أداة للتعامل مع tar فقط على ويندوز، فيمكنك تثبيت جنو tar عبر WSL على ويندوز 10 وما فوق عبر <a href="https://www.cygwin.com/" rel="external nofollow">Cygwin</a>.
</p>

<h2>
	إنشاء ملف أرشيف tarball
</h2>

<p>
	ملفات الأرشيف من النوع tar عادة ما يشار إليها بالاسم tarball، وذلك فقط اختصارًا لاسمها باللغة الإنجليزية، حيث كلمة tarball أقصر من كتابة tar archive، والتي تعني أرشيف tar.
</p>

<p>
	إنشاء ملف tar باستخدام <a href="https://academy.hsoub.com/programming/java/%D9%85%D9%82%D8%AF%D9%85%D8%A9-%D8%A5%D9%84%D9%89-%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D9%88%D8%A7%D8%AC%D9%87%D8%A7%D8%AA-%D8%A7%D9%84%D9%85%D8%B3%D8%AA%D8%AE%D8%AF%D9%85-%D8%A7%D9%84%D8%B1%D8%B3%D9%88%D9%85%D9%8A%D8%A9-gui-%D9%81%D9%8A-%D8%AC%D8%A7%D9%81%D8%A7-r1070/" rel="">واجهة المستخدم المرئية GUI</a>، يحتاج لثلاث خطوات على الأكثر. سنستخدم في مثالنا هذا KDE، العملية ستكون مشابهة على كل من جنوم و XFCE:
</p>

<ol>
<li>
		أنشئ مجلدًا.
	</li>
	<li>
		ضع ملفاتك في ذلك المجلد.
	</li>
	<li>
		اضغط بالزر الأيمن للفأرة على المجلد واختر "ضغط".
	</li>
</ol>
<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="83360" href="https://academy.hsoub.com/uploads/monthly_2021_11/compress.jpg.40d2a6d42bfb1b85a1d624601471318d.jpg" rel=""><img alt="compress.jpg" class="ipsImage ipsImage_thumbnailed" data-fileid="83360" data-unique="4mhkol1tw" src="https://academy.hsoub.com/uploads/monthly_2021_11/compress.jpg.40d2a6d42bfb1b85a1d624601471318d.jpg"></a>
</p>

<p>
	العملية مشابهة أيضًا في الصَدفَة، لجمع عدة ملفات في ملف أرشيف واحد، ضع ملفاتك في مجلد ثم نفذ الأمر tar، ومرر له اسم ملف الأرشيف الذي تريد إنشاءه ثم المجلد الذي تريد أرشفته:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_5141_16" style="">
<span class="pln">$ tar </span><span class="pun">--</span><span class="pln">create </span><span class="pun">--</span><span class="pln">verbose </span><span class="pun">--</span><span class="pln">file archive</span><span class="pun">.</span><span class="pln">tar myfiles</span></pre>

<p>
	تتميز الأداة tar عن باقي الأوامر عادةً أنها لا تحتاج لوجود إشارة السالب (<code>-</code>) قبل اختصارات الخيارات الممررة لها، مما يتيح للمستخدم اختصار عدة أوامر مقعدة كالتالي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_5141_14" style="">
<span class="pln">$ tar cvf archive</span><span class="pun">.</span><span class="pln">tar myfiles</span></pre>

<p>
	يمكنك أيضا عدم وضع الملفات في مجلد قبل أرشفتها، لكنها تُعَد عادةً سيئة، لأنه لا أحد تقريبًا يرغب أن يجد خمسين ملفًا فجأة مبعثرين على سطح المكتب لديه بعد فك ضغط ذلك الأرشيف. هذا النوع من ملفات الأرشيف يدعى عادة قنبلة tar أو tarbomb -شبهوا الأمر بعملية رمي قنبلة- وليس ذلك دائما بمعنى سلبي. قنابل tar مفيدة لعمليات الترقيع patching وأدوات تنصيب البرامج؛ فالأمر يعتمد على معرفتك متى تستطيع استخدام تلك الطريقة من عدمه.
</p>

<h2>
	ضغط ملف الأرشيف
</h2>

<p>
	عند إنشاء ملف tar فلن تكون الملفات داخله مضغوطة، فهو فقط سيجعل تلك الملفات كتلة واحدة يكون من السهل نقلها معًا. يمكننا لضغط ذلك الملف استدعاء <a href="https://www.gnu.org/software/gzip/" rel="external nofollow">Gzip</a> أو <a href="http://bzip.org/" rel="external nofollow">bzip</a>:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_5141_20" style="">
<span class="pln">$ tar </span><span class="pun">--</span><span class="pln">create </span><span class="pun">--</span><span class="pln">bzip2 </span><span class="pun">--</span><span class="pln">file foo</span><span class="pun">.</span><span class="pln">tar</span><span class="pun">.</span><span class="pln">bz2 myfiles  
$ tar </span><span class="pun">--</span><span class="pln">create </span><span class="pun">--</span><span class="pln">gzip </span><span class="pun">--</span><span class="pln">file foo</span><span class="pun">.</span><span class="pln">tar</span><span class="pun">.</span><span class="pln">gz myfiles</span></pre>

<p>
	من أشيع اللواحق لملفات الأرشيف tar المضغوطة عبر Gzip هي <code>tar.gz.</code> و <code>tgz.</code>، و للملفات المضغوطة عبر bzip هي <code>tar.bz2.</code> و <code>tbz.</code>.
</p>

<h2>
	استخراج الملفات من الأرشيف
</h2>

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

<p style="text-align: center;">
	<img alt="extract_0.jpg" class="ipsImage ipsImage_thumbnailed" data-fileid="83361" data-unique="st6ua246u" src="https://academy.hsoub.com/uploads/monthly_2021_11/extract_0.jpg.66edde42e5c1162e1c724b6893ec6d3e.jpg" style=""></p>

<p>
	<a href="https://ar.wikipedia.org/wiki/%D8%AF%D9%88%D9%84%D9%81%D9%8A%D9%86_(%D9%85%D8%AF%D9%8A%D8%B1_%D9%85%D9%84%D9%81%D8%A7%D8%AA)" rel="external nofollow">مدير ملفات دولفين Dolphin</a> يوفر ميزة التعرف التلقائي على الملفات المستخرجة من الأرشيف اذا كانت محتواة في مجلد أو يجب إنشاء مجلد حاوي لها. تفيد هذه الميزة في تفادي مشكلة قنابل tar، حيث سينشئ مجلدًا جديدًا سيحوي بداخله كل الملفات المستخرجة.
</p>

<p>
	عبر الصدفة، أمر استخراج الملفات من ملف الأرشيف بديهي للغاية:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_5141_24" style="">
<span class="pln">$ tar </span><span class="pun">--</span><span class="pln">extract </span><span class="pun">--</span><span class="pln">file archive</span><span class="pun">.</span><span class="pln">tar</span><span class="pun">.</span><span class="pln">gz</span></pre>

<p>
	يمكنك اختصار الخيارات للأمر السابق كالتالي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_5141_26" style="">
<span class="pln">$ tar xf archive</span><span class="pun">.</span><span class="pln">tar</span><span class="pun">.</span><span class="pln">gz</span></pre>

<p>
	يمكنك أيضا استخدام أداة tar لفك ضغط ملفات <code>zip.</code>:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_5141_28" style="">
<span class="pln">$ tar </span><span class="pun">--</span><span class="pln">extract </span><span class="pun">--</span><span class="pln">file archive</span><span class="pun">.</span><span class="pln">zip</span></pre>

<h2>
	أوامر tar متقدمة
</h2>

<p>
	أدوات tar قوية وعملية جدًا فحالما تعتاد على المبادئ الأساسية لها، ستبني عليها لاكتشاف مزايا أخرى.
</p>

<h3>
	إضافة ملف أو مجلد إلى ملف tar
</h3>

<p>
	في حال كنت تملك ملف tar وتريد إضافة ملف جديد داخله، يمكنك فعل ذلك دون الحاجة لاستخراج محتوياته ثم إعادة أرشفتها فقط لإضافة الملف الجديد.
</p>

<p>
	معظم أنظمة سطح مكتب<a href="https://academy.hsoub.com/devops/linux/%D9%85%D8%A7-%D9%87%D9%88-%D9%86%D8%B8%D8%A7%D9%85-%D8%A7%D9%84%D8%AA%D8%B4%D8%BA%D9%8A%D9%84-%D9%84%D9%8A%D9%86%D9%83%D8%B3%D8%9F-r451/" rel=""> لينكس</a> و BSD تأتي مع واجهة مرئية للتعامل مع ملفات الأرشيف، يمكنك استخدامها والتعامل مع ملف الأرشيف وكأنه مجلد عادي آخر، يمكنك رؤية محتوياته، استخراج ملفات معينة منه، إضافة ملفات جديدة إليه، وحتى استعراض الملفات النصية والصور داخله.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="83359" href="https://academy.hsoub.com/uploads/monthly_2021_11/ark.jpg.73c5319fbf39183f072705a8fec66463.jpg" rel=""><img alt="ark.jpg" class="ipsImage ipsImage_thumbnailed" data-fileid="83359" data-unique="90r7g25m0" src="https://academy.hsoub.com/uploads/monthly_2021_11/ark.jpg.73c5319fbf39183f072705a8fec66463.jpg"></a>
</p>

<p style="text-align: center;">
	أداة الأرشفة آرك Ark
</p>

<p>
	عبر الصدفة، يمكنك إضافة ملف أو مجلد إلى ملف أرشيف tar طالما أنه غير مضغوط بعد، إذا كان ملف الأرشيف مضغوطًا يجب عليك أولًا فك ضغطه فقط وليس استخراج ملفات الأرشيف داخله.
</p>

<p>
	على سبيل المثال، إذا كان ملف الأرشيف مضغوطًا بواسطة <a href="https://academy.hsoub.com/programming/general/%D8%A7%D9%84%D8%B6%D8%BA%D8%B7-%D8%A7%D9%84%D9%86%D8%B4%D8%B7-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-gzip-r686/" rel="">Gzip</a>:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_5141_32" style="">
<span class="pln">$ gunzip archive</span><span class="pun">.</span><span class="pln">tar</span><span class="pun">.</span><span class="pln">gz
$ ls
archive</span><span class="pun">.</span><span class="pln">tar</span></pre>

<p>
	الآن بعدما أصبح لديك ملف tar غير مضغوط، يمكنك إضافة الملف أو المجلد الجديد إليه:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_5141_34" style="">
<span class="pln">$ tar </span><span class="pun">--</span><span class="pln">append </span><span class="pun">--</span><span class="pln">file archive</span><span class="pun">.</span><span class="pln">tar foo</span><span class="pun">.</span><span class="pln">txt
$ tar </span><span class="pun">--</span><span class="pln">append </span><span class="pun">--</span><span class="pln">file archive</span><span class="pun">.</span><span class="pln">tar bar</span><span class="pun">/</span></pre>

<p>
	اختصارًا يمكن تنفيذ الأمر السابق كالتالي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_5141_36" style="">
<span class="pln">$ tar rf archive</span><span class="pun">.</span><span class="pln">tar foo</span><span class="pun">.</span><span class="pln">txt
$ tar rf archive</span><span class="pun">.</span><span class="pln">tar bar</span><span class="pun">/</span></pre>

<h3>
	مشاهدة قائمة بالملفات داخل ملف tar
</h3>

<p>
	لمشاهدة الملفات داخل ملف أرشيف، <a href="https://academy.hsoub.com/programming/general/%D8%A7%D9%84%D9%81%D8%B1%D9%82-%D8%A8%D9%8A%D9%86-%D8%A7%D9%84%D8%B6%D8%BA%D8%B7-gzipping-%D9%88%D8%A7%D9%84%D8%AA%D8%B5%D8%BA%D9%8A%D8%B1-minification-r679/" rel="">سواء كان مضغوطًا أم لا</a>، يمكنك استخدام الخيار <code>list--</code>:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_5141_38" style="">
<span class="pln">$ tar </span><span class="pun">--</span><span class="pln">list </span><span class="pun">--</span><span class="pln">file archive</span><span class="pun">.</span><span class="pln">tar</span><span class="pun">.</span><span class="pln">gz  
myfiles</span><span class="pun">/</span><span class="pln">
myfiles</span><span class="pun">/</span><span class="pln">one
myfiles</span><span class="pun">/</span><span class="pln">two
myfiles</span><span class="pun">/</span><span class="pln">three
bar</span><span class="pun">/</span><span class="pln">
bar</span><span class="pun">/</span><span class="pln">four
foo</span><span class="pun">.</span><span class="pln">txt</span></pre>

<p>
	النسخة المختصرة تكون كالتالي
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_5141_42" style="">
<span class="pln">$ tar tf archive</span><span class="pun">.</span><span class="pln">tar</span><span class="pun">.</span><span class="pln">gz</span></pre>

<h3>
	استخراج ملف واحد أو عدة ملفات أو مجلدات من أرشيف tar
</h3>

<p>
	أحيانًا لا تريد استخراج كل الملفات من الأرشيف، وفقط تريد استخراج ملف واحد أو بضعة ملفات منه. بعد عرضك لمحتويات ملف أرشيف tar، استخدم الأمر <code>tar</code> لفك الضغط كالمعتاد ولكن مع إضافة مسار الملف الذي تريد استخراجه بمفرده:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_5141_44" style="">
<span class="pln">$ tar xvf archive</span><span class="pun">.</span><span class="pln">tar</span><span class="pun">.</span><span class="pln">gz bar</span><span class="pun">/</span><span class="pln">four
bar</span><span class="pun">/</span><span class="pln">four</span></pre>

<p>
	الآن تم استخراج الملف "four" إلى مجلد جديد يدعى "bar". إذا كان المجلد "bar" موجود مسبقًا، فسيتم وضع الملف "four" داخله. ولاستخراج عدة ملفات أو مجلدات سننفذ نفس الأمر السابق تقريبًا:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_5141_46" style="">
<span class="pln">$ tar xvf archive</span><span class="pun">.</span><span class="pln">tar</span><span class="pun">.</span><span class="pln">gz myfiles</span><span class="pun">/</span><span class="pln">one bar</span><span class="pun">/</span><span class="pln">four
myfiles</span><span class="pun">/</span><span class="pln">one
bar</span><span class="pun">/</span><span class="pln">four</span></pre>

<p>
	يمكنك أيضا استخدام المحارف البديلة wildcards:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_5141_48" style="">
<span class="pln">$ tar xvf archive</span><span class="pun">.</span><span class="pln">tar</span><span class="pun">.</span><span class="pln">gz </span><span class="pun">--</span><span class="pln">wildcards </span><span class="str">'*.txt'</span><span class="pln">
foo</span><span class="pun">.</span><span class="pln">txt</span></pre>

<h3>
	استخراج الملفات من ملف tar إلى مجلد
</h3>

<p>
	ذكرنا سابقًا أن بعض ملفات tar هي قنابل tar تترك خلفها بعد استخراج محتوياتها الكثير من الملفات المبعثرة. إذا نظرت لمحتويات ملف tar ولاحظت أن الملفات داخله غير محتواة داخل مجلد، يمكنك تحديد مجلد الوجهة ليتم استخراجها مباشرة إليه:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_5141_50" style="">
<span class="pln">$ tar </span><span class="pun">--</span><span class="pln">list </span><span class="pun">--</span><span class="pln">file archive</span><span class="pun">.</span><span class="pln">tar</span><span class="pun">.</span><span class="pln">gz
foo
bar
baz
$ mkdir newfiles
$ tar xvf archive</span><span class="pun">.</span><span class="pln">tar</span><span class="pun">.</span><span class="pln">gz </span><span class="pun">-</span><span class="pln">C newfiles</span></pre>

<p>
	الأمر السابق يستخرج محتويات الملف "archive.tar.gs" إلى المجلد الجديد newfiles بشكل مرتب.
</p>

<p>
	خيار مجلد الوجهة له فوائد أخرى غير ترتيب الملفات المستخرجة في مجلد واحد، مثلًا لتوزيع الملفات لنسخها في بنية مجلدات موجودة مسبقًا. إذا كنت تعمل على <a href="https://academy.hsoub.com/learn/front-end-web-development/" rel="">تطوير موقع إلكتروني</a> وتريد إرسال ملفات جديدة لصاحب الموقع، يمكنك القيام بذلك بعدة طرق. الطريقة البديهية هي إرفاق تلك الملفات داخل <a href="https://academy.hsoub.com/devops/servers/mail/" rel="">بريد إلكتروني</a> وإرسالها له مع شرح عن مكان نسخ كل من تلك الملفات: "ملف <code>index.php</code> المرفق يجب وضعه داخل المجلد <code>/var/www/example.com/store</code>، والملف <code>vouchers.php</code> يجب وضعه داخل <code>/var/www/example.com/deals...</code> ".
</p>

<p>
	الطريقة الأجدى لتنفيذ ذلك تكون بإنشاء أرشيف tar لهذه الملفات:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_5141_54" style="">
<span class="pln">$ tar cvf updates</span><span class="pun">-</span><span class="lit">20170621.tar</span><span class="pun">.</span><span class="pln">bz2 var
var</span><span class="pun">/</span><span class="pln">www</span><span class="pun">/</span><span class="pln">example</span><span class="pun">.</span><span class="pln">com</span><span class="pun">/</span><span class="pln">store</span><span class="pun">/</span><span class="pln">index</span><span class="pun">.</span><span class="pln">php
var</span><span class="pun">/</span><span class="pln">www</span><span class="pun">/</span><span class="pln">example</span><span class="pun">.</span><span class="pln">com</span><span class="pun">/</span><span class="pln">deals</span><span class="pun">/</span><span class="pln">voucher</span><span class="pun">.</span><span class="pln">php
var</span><span class="pun">/</span><span class="pln">www</span><span class="pun">/</span><span class="pln">example</span><span class="pun">.</span><span class="pln">com</span><span class="pun">/</span><span class="pln">images</span><span class="pun">/</span><span class="pln">banner</span><span class="pun">.</span><span class="pln">jpg
var</span><span class="pun">/</span><span class="pln">www</span><span class="pun">/</span><span class="pln">example</span><span class="pun">.</span><span class="pln">com</span><span class="pun">/</span><span class="pln">images</span><span class="pun">/</span><span class="pln">badge</span><span class="pun">.</span><span class="pln">jpg
var</span><span class="pun">/</span><span class="pln">www</span><span class="pun">/</span><span class="pln">example</span><span class="pun">.</span><span class="pln">com</span><span class="pun">/</span><span class="pln">images</span><span class="pun">/</span><span class="pln">llama</span><span class="pun">-</span><span class="pln">eating</span><span class="pun">-</span><span class="pln">apple</span><span class="pun">-</span><span class="pln">pie</span><span class="pun">.</span><span class="pln">gif</span></pre>

<p>
	متضمنة بنية المجلدات والملفات داخلها، الآن ليس على صاحب الموقع سوى استخراج الملفات من ملف الأرشيف مباشرة داخل مجلد الجذر على خادمه. أداة tar تتحقق من تواجد المجلد <code>var/www/example.com/</code> وكذلك المجلدات داخله <code>store</code> و <code>deals</code> و <code>images</code>، وتقوم بتوزيع الملفات في مجلداتها المناسبة. يمكن اعتبار هذه الطريقة نسخ ولصق لكن بسرعة وبسهولة.
</p>

<h2>
	الفرق بين نسخة tar من جنو ومن BSD
</h2>

<p>
	تنسيق tar هو مجرد تنسيق، وهو مفتوح المصدر، لهذا السبب يمكن لعدة أدوات أن تقوم بإنشائه.
</p>

<p>
	هناك أداتي tar شائعتين: أداة جنو tar، والتي تأتي مثبتة افتراضيًا على بعض أنظمة لينكس، وأداة tar التابعة لأنظمة BSD، والمثبتة بشكل افتراضي على BSD، ماك، وبعض أنظمة لينكس الأخرى. للاستخدام العام، كلا الإصدارين سيكون كافيًا. كل الأمثلة المذكورة في هذا المقال ستعمل على كلا الإصدارين. لكن هناك اختلافات بسيطة بينهما. حالما تعتاد على واحدة منهما يمكنك تجربة الأخرى,
</p>

<p>
	غالبًا ستحتاج لتثبيت الإصدار "الآخر" من الأمر <code>tar</code> يدويًا. لتفادي الخلط بين الأداتين، أداة جنو tar تسمى <code>gtar</code> وأداة BSD tar تسمى <code>bsdtar</code>، على أن يكون الأمر <code>tar</code> هو وصلة رمزية أو اسم بديل لأحد تلك الأداتين المثبتة مسبقا على جهازك.
</p>

<p>
	ترجمة -وبتصرف- للمقال <a href="https://opensource.com/article/17/7/how-unzip-targz-file" rel="external nofollow">How to unzip a tar.gz file</a> لصاحبه Seth Kenlon.
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
<li>
		<a href="https://academy.hsoub.com/devops/linux/%D8%A7%D8%AD%D8%AA%D8%B1%D9%81-%D8%A7%D9%84%D8%A3%D9%85%D8%B1-ls-%D9%81%D9%8A-%D9%84%D9%8A%D9%86%D9%83%D8%B3-r558/" rel="">احترف الأمر ls في لينكس </a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/devops/linux/%D9%85%D8%A7-%D8%A7%D9%84%D9%81%D8%B1%D9%88%D9%82-%D8%A8%D9%8A%D9%86-%D8%A7%D9%84%D8%A3%D9%88%D8%A7%D9%85%D8%B1-grep-%D9%88egrep-fgrep-r320/" rel="">ما الفروق بين الأوامر grep وegrep fgrep</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/devops/linux/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%A7%D9%84%D8%A3%D9%85%D8%B1-ss-%D9%81%D9%8A-%D9%84%D9%8A%D9%86%D9%83%D8%B3-r357/" rel="">مدخل إلى الأمر ss في لينكس</a>
	</li>
	<li>
		<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="">كيف تستخدِم أمرَي find و locate للبحث عن الملفّات على Linux</a>
	</li>
	<li>
		النسخة الكاملة من كتاب <a href="https://academy.hsoub.com/files/24-%D8%A3%D9%86%D8%B8%D9%85%D8%A9-%D8%A7%D9%84%D8%AA%D8%B4%D8%BA%D9%8A%D9%84-%D9%84%D9%84%D9%85%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D9%86/" rel="">أنظمة التشغيل للمبرمجين</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">559</guid><pubDate>Mon, 29 Nov 2021 17:05:00 +0000</pubDate></item><item><title>&#x627;&#x62D;&#x62A;&#x631;&#x641; &#x627;&#x644;&#x623;&#x645;&#x631; ls &#x641;&#x64A; &#x644;&#x64A;&#x646;&#x643;&#x633;</title><link>https://academy.hsoub.com/devops/linux/%D8%A7%D8%AD%D8%AA%D8%B1%D9%81-%D8%A7%D9%84%D8%A3%D9%85%D8%B1-ls-%D9%81%D9%8A-%D9%84%D9%8A%D9%86%D9%83%D8%B3-r558/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2021_12/6.png.5aa1cc771b06c6437110079fa64dc70c.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%85-%D8%A3%D9%88%D8%A7%D9%85%D8%B1-cd-%D9%88-pwd-%D9%88-ls-%D9%84%D8%A7%D8%B3%D8%AA%D9%83%D8%B4%D8%A7%D9%81-%D9%86%D8%B8%D8%A7%D9%85-%D8%A7%D9%84%D9%85%D9%84%D9%81%D8%A7%D8%AA-%D8%B9%D9%84%D9%89-%D9%86%D8%B8%D8%A7%D9%85-%D9%84%D9%8A%D9%86%D9%83%D8%B3-r305/" rel="">الأمر ls</a> في لينكس العديد من الخيارات الرائعة التي ستعطيك معلومات مهمة عن ملفاتك. الأمر <code>ls</code> يقوم بعرض قائمة بالملفات على أنظمة POSIX وهو أمر سهل وبسيط، عادة ما يقلل من شأنه لأن مهمته بسيطة (فهو فعليًا يفعل مهمة واحدة فقط)، ولكن يمكنك تعديل استخدامك له لتحصل على الكثير منه.
</p>

<p>
	من بين <a href="https://academy.hsoub.com/devops/linux/%D8%B9%D8%B4%D8%B1%D9%88%D9%86-%D8%A3%D9%85%D8%B1%D8%A7-%D9%81%D9%8A-%D9%84%D9%8A%D9%86%D9%83%D8%B3-%D9%8A%D9%81%D8%AA%D8%B1%D8%B6-%D8%A3%D9%86-%D9%8A%D8%B9%D8%B1%D9%81%D9%87%D8%A7-%D9%83%D9%84-%D9%85%D8%AF%D9%8A%D8%B1-%D9%86%D8%B8%D9%85-r355/" rel="">أهم أوامر لينكس التي يجب أن تعرفها</a>، يحتل الأمر <code>ls</code> المرتبة الثالثة ربما بينها، لأن الأمر <code>ls</code> ليس فقط يعرض قائمة بالملفات، بل أيضا يعرض لك معلومات مهمة عنها. مثل من يملك الملف أو المجلد، متى تم تعديل الملف آخر مرة، وحتى نوع الملف، وهو أمر مهم يبيّن لك أين تقف الآن وما الملفات والأغراض المتاحة في المسار الحالي وماذا يمكنك أن تفعل بهم.
</p>

<p>
	إذا كانت خبرتك مع الأمر <code>ls</code> مقتصرة على الاسم البديل لهذا الأمر التي يأتي جاهزًا مع توزيعتك في ملف <code>bashrc.</code>، فربما فاتك الكثير.
</p>

<h2>
	جنو أو BSD؟
</h2>

<p>
	قبل أن نلقي نظرةً على خفايا الأمر <code>ls</code>، يجب أن تحدد أي إصدار من <code>ls</code> لديك. أشهر إصدارين هما إصدار جنو، الذي يأتي ضمن حزمة <code>coreutils</code> ضمن جنو، وإصدار BSD. إذا كنت تعمل على <a href="https://academy.hsoub.com/devops/linux/%D9%85%D8%A7-%D9%87%D9%88-%D9%86%D8%B8%D8%A7%D9%85-%D8%A7%D9%84%D8%AA%D8%B4%D8%BA%D9%8A%D9%84-%D9%84%D9%8A%D9%86%D9%83%D8%B3%D8%9F-r451/" rel="">لينكس</a>، فعلى الأغلب الأمر <code>ls</code> مثبت لديك أما إذا كنت تعمل على BSD أو نظام ماك، فأنت تملك نسخة إصدار BSD فهناك فروقات، سنغطيها في هذا المقال.
</p>

<p>
	يمكنك معرفة النسخة التي لديك باستخدام الخيار <code>version--</code>:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_4807_12" style="">
<span class="pln">$ ls </span><span class="pun">--</span><span class="pln">version</span></pre>

<p>
	إذا كان الخرج يحتوي على معلومات عن حزمة coreutils الخاصة بجنو، فلديك الإصدار الخاص بجنو، أما إذا ظهر لك خطأ فأنت تملك نسخة BSD (يمكنك تنفيذ الأمر <code>man ls | head</code> للتأكد).
</p>

<p>
	يجب عليك التحقق أيضا من الإعدادات المسبقة التي قد تأتي مع توزيعتك. التخصيصات في الأوامر عادة تكون موجودة داخل الملف <code>HOME/.bashrc$</code> أو <code>HOME/.bash_aliases$</code> أو داخل <code>HOME/.profile$</code>، وعادة تكون موجودة لإعطاء اسم بديل للأمر <code>ls</code> يتضمن خصائص أكثر تعقيدًا، مثال:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_4807_10" style="">
<span class="pln">alias ls</span><span class="pun">=</span><span class="str">'ls --color'</span></pre>

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

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_4807_14" style="">
<span class="pln">$ \ls</span></pre>

<h2>
	التصنيف
</h2>

<p>
	عند تنفيذ الأمر <code>ls</code> بمفرده سيعرض قائمة بالملفات موزعة على أعمدة بقدر العرض المتوفر على الطرفية لديك:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4807_20" style="">
<span class="pln">$ ls </span><span class="pun">~/</span><span class="pln">example
bunko        jdk</span><span class="pun">-</span><span class="lit">10.0</span><span class="pun">.</span><span class="lit">2</span><span class="pln">
chapterize   otf2ttf</span><span class="pun">.</span><span class="pln">ff
despacer     overtar</span><span class="pun">.</span><span class="pln">sh
estimate</span><span class="pun">.</span><span class="pln">sh  pandoc</span><span class="pun">-</span><span class="lit">2.7</span><span class="pun">.</span><span class="lit">1</span><span class="pln">
fop</span><span class="pun">-</span><span class="lit">2.3</span><span class="pln">      safe_yaml
games        tt</span></pre>

<p>
	المعلومات التي ستظهر مفيدة، لكن بدون رموز تفيد التمييز بين أنواع الملفات (مجلد - ملف نصي - صورة - الخ…) فلن تفيدنا كثيرًا.
</p>

<p>
	يمكنك استخدام الخيار <code>F-</code> (أو <code>classify--</code> في نسخة جنو) لعرض رمز بعد كل اسم ملف لتمييز نوعه:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4807_22" style="">
<span class="pln">$ ls </span><span class="pun">~/</span><span class="pln">example </span><span class="pun">-</span><span class="pln">F
bunko         jdk</span><span class="pun">-</span><span class="lit">10.0</span><span class="pun">.</span><span class="lit">2</span><span class="pun">/</span><span class="pln">
chapterize</span><span class="pun">*</span><span class="pln">   otf2ttf</span><span class="pun">.</span><span class="pln">ff</span><span class="pun">*</span><span class="pln">
despacer</span><span class="pun">*</span><span class="pln">     overtar</span><span class="pun">.</span><span class="pln">sh</span><span class="pun">*</span><span class="pln">
estimate</span><span class="pun">.</span><span class="pln">sh   pandoc@
fop</span><span class="pun">-</span><span class="lit">2.3</span><span class="pun">/</span><span class="pln">      pandoc</span><span class="pun">-</span><span class="lit">2.7</span><span class="pun">.</span><span class="lit">1</span><span class="pun">/</span><span class="pln">
games</span><span class="pun">/</span><span class="pln">        tt</span><span class="pun">*</span></pre>

<p>
	الرموز بعد أسماء الملفات تدل على نوع الملف، وتحمل الدلالات التالية:
</p>

<ul>
<li>
		خط مائل عكسي (<code>/</code>) يدل على نوع المجلد.
	</li>
	<li>
		محرف النجمة (<code>*</code>) يدل أن الملف تنفيذي. يتضمن ذلك الملفات الثنائية (الشيفرة المصرّفة) وكذلك <a href="https://academy.hsoub.com/programming/general/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%A7%D9%84%D8%AA%D8%B9%D8%A7%D9%85%D9%84-%D9%85%D8%B9-%D8%A7%D9%84%D9%86%D8%B5%D9%88%D8%B5-%D9%81%D9%8A-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-r1341/" rel="">النصوص البرمجية</a> (الملفات النصية التي تملك صلاحية التنفيذ).
	</li>
	<li>
		المحرف (<code>@</code>) يدل على وصلة رمزية (أو اسم بديل).
	</li>
	<li>
		محرف المساواة (<code>=</code>) يدل على مقبس.
	</li>
	<li>
		على BSD، محرف إشارة النسبة المئوية (<code>%</code>) يدل على أن الملف مشار إليه كمحذوف whiteout (وهي طريقة لحذف الملفات على بعض الأنظمة).
	</li>
	<li>
		على جنو، محرف إشارة الأصغر (<code>&lt;</code>) يدل على باب (طريقة للتواصل بين الإجرائيات على ايلوموس و سولاريس)
	</li>
	<li>
		محرف الخط العمودي (<code>|</code>) يدل على FIFO.
	</li>
</ul>
<p>
	نسخة أبسط من هذا الخيار هي <code>p-</code>، وهي تبيّن فقط الفرق بين الملفات والمجلدات.
</p>

<h2>
	عرض قائمة تفاصيل طويلة
</h2>

<p>
	نحتاج في كثير من الأحيان إلى عرض تفاصيل أكثر عن الملفات من خرج الأمر <code>ls</code>، لذا العديد من التوزيعات تُعِّين اسمًا بديلا على شكل <code>ll</code> تكون قيمته <code>ls -l</code>. تعرض القائمة الطويلة العديد من الخصائص المهمة لنا مثل الصلاحيات، المستخدم مالك الملف، المجموعة التي ينتمي إليها الملف، حجم الملف بالبايت، وتاريخ آخر تعديل على الملف:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_4807_27" style="">
<span class="pln">$ ls </span><span class="pun">-</span><span class="pln">l
</span><span class="pun">-</span><span class="pln">rwxrwx</span><span class="pun">---.</span><span class="pln"> </span><span class="lit">1</span><span class="pln"> seth users         </span><span class="lit">455</span><span class="pln"> </span><span class="typ">Mar</span><span class="pln">  </span><span class="lit">2</span><span class="pln">  </span><span class="lit">2017</span><span class="pln"> estimate</span><span class="pun">.</span><span class="pln">sh
</span><span class="pun">-</span><span class="pln">rwxrwxr</span><span class="pun">-</span><span class="pln">x</span><span class="pun">.</span><span class="pln"> </span><span class="lit">1</span><span class="pln"> seth users         </span><span class="lit">662</span><span class="pln"> </span><span class="typ">Apr</span><span class="pln"> </span><span class="lit">29</span><span class="pln"> </span><span class="lit">22</span><span class="pun">:</span><span class="lit">27</span><span class="pln"> factorial
</span><span class="pun">-</span><span class="pln">rwxrwx</span><span class="pun">---.</span><span class="pln"> </span><span class="lit">1</span><span class="pln"> seth users    </span><span class="lit">20697793</span><span class="pln"> </span><span class="typ">Jun</span><span class="pln"> </span><span class="lit">29</span><span class="pln">  </span><span class="lit">2018</span><span class="pln"> fop</span><span class="pun">-</span><span class="lit">2.3</span><span class="pun">-</span><span class="pln">bin</span><span class="pun">.</span><span class="pln">tar</span><span class="pun">.</span><span class="pln">gz
</span><span class="pun">-</span><span class="pln">rwxrwxr</span><span class="pun">-</span><span class="pln">x</span><span class="pun">.</span><span class="pln"> </span><span class="lit">1</span><span class="pln"> seth users        </span><span class="lit">6210</span><span class="pln"> </span><span class="typ">May</span><span class="pln"> </span><span class="lit">22</span><span class="pln"> </span><span class="lit">10</span><span class="pun">:</span><span class="lit">22</span><span class="pln"> geteltorito
</span><span class="pun">-</span><span class="pln">rwxrwx</span><span class="pun">---.</span><span class="pln"> </span><span class="lit">1</span><span class="pln"> seth users         </span><span class="lit">177</span><span class="pln"> </span><span class="typ">Nov</span><span class="pln"> </span><span class="lit">12</span><span class="pln">  </span><span class="lit">2018</span><span class="pln"> html4mutt</span><span class="pun">.</span><span class="pln">sh
</span><span class="pun">[...]</span></pre>

<p>
	إذا كانت وحدة البايت مربكة لك، أضف الخيار <code>h-</code> (أو الخيار <code>human--</code> على جنو) ليتم ترجمة الحجوم الى صيغة مقروءة بشكل أفضل:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_4807_35" style="">
<span class="pln">$ ls </span><span class="pun">--</span><span class="pln">human
</span><span class="pun">-</span><span class="pln">rwxrwx</span><span class="pun">---.</span><span class="pln"> </span><span class="lit">1</span><span class="pln"> seth users    </span><span class="lit">455</span><span class="pln"> </span><span class="typ">Mar</span><span class="pln">  </span><span class="lit">2</span><span class="pln">  </span><span class="lit">2017</span><span class="pln"> estimate</span><span class="pun">.</span><span class="pln">sh
</span><span class="pun">-</span><span class="pln">rwxrwxr</span><span class="pun">-</span><span class="pln">x</span><span class="pun">.</span><span class="pln"> </span><span class="lit">1</span><span class="pln"> seth seth     </span><span class="lit">662</span><span class="pln"> </span><span class="typ">Apr</span><span class="pln"> </span><span class="lit">29</span><span class="pln"> </span><span class="lit">22</span><span class="pun">:</span><span class="lit">27</span><span class="pln"> factorial
</span><span class="pun">-</span><span class="pln">rwxrwx</span><span class="pun">---.</span><span class="pln"> </span><span class="lit">1</span><span class="pln"> seth users    </span><span class="lit">20M</span><span class="pln"> </span><span class="typ">Jun</span><span class="pln"> </span><span class="lit">29</span><span class="pln">  </span><span class="lit">2018</span><span class="pln"> fop</span><span class="pun">-</span><span class="lit">2.3</span><span class="pun">-</span><span class="pln">bin</span><span class="pun">.</span><span class="pln">tar</span><span class="pun">.</span><span class="pln">gz
</span><span class="pun">-</span><span class="pln">rwxrwxr</span><span class="pun">-</span><span class="pln">x</span><span class="pun">.</span><span class="pln"> </span><span class="lit">1</span><span class="pln"> seth seth    </span><span class="lit">6.1K</span><span class="pln"> </span><span class="typ">May</span><span class="pln"> </span><span class="lit">22</span><span class="pln"> </span><span class="lit">10</span><span class="pun">:</span><span class="lit">22</span><span class="pln"> geteltorito
</span><span class="pun">-</span><span class="pln">rwxrwx</span><span class="pun">---.</span><span class="pln"> </span><span class="lit">1</span><span class="pln"> seth users    </span><span class="lit">177</span><span class="pln"> </span><span class="typ">Nov</span><span class="pln"> </span><span class="lit">12</span><span class="pln">  </span><span class="lit">2018</span><span class="pln"> html4mutt</span><span class="pun">.</span><span class="pln">sh</span></pre>

<p>
	يمكنك تخفيف المعلومات الظاهرة عبر إظهار فقط عمود مالك الملف باستخدام الخيار <code>o-</code> أو فقط عمود المجموعة المالكة للملف عبر الخيار <code>g-</code>:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_4807_31" style="">
<span class="pln">$ ls </span><span class="pun">-</span><span class="pln">o
</span><span class="pun">-</span><span class="pln">rwxrwx</span><span class="pun">---.</span><span class="pln"> </span><span class="lit">1</span><span class="pln"> seth    </span><span class="lit">455</span><span class="pln"> </span><span class="typ">Mar</span><span class="pln">  </span><span class="lit">2</span><span class="pln">  </span><span class="lit">2017</span><span class="pln"> estimate</span><span class="pun">.</span><span class="pln">sh
</span><span class="pun">-</span><span class="pln">rwxrwxr</span><span class="pun">-</span><span class="pln">x</span><span class="pun">.</span><span class="pln"> </span><span class="lit">1</span><span class="pln"> seth    </span><span class="lit">662</span><span class="pln"> </span><span class="typ">Apr</span><span class="pln"> </span><span class="lit">29</span><span class="pln"> </span><span class="lit">22</span><span class="pun">:</span><span class="lit">27</span><span class="pln"> factorial
</span><span class="pun">-</span><span class="pln">rwxrwx</span><span class="pun">---.</span><span class="pln"> </span><span class="lit">1</span><span class="pln"> seth    </span><span class="lit">20M</span><span class="pln"> </span><span class="typ">Jun</span><span class="pln"> </span><span class="lit">29</span><span class="pln">  </span><span class="lit">2018</span><span class="pln"> fop</span><span class="pun">-</span><span class="lit">2.3</span><span class="pun">-</span><span class="pln">bin</span><span class="pun">.</span><span class="pln">tar</span><span class="pun">.</span><span class="pln">gz
</span><span class="pun">-</span><span class="pln">rwxrwxr</span><span class="pun">-</span><span class="pln">x</span><span class="pun">.</span><span class="pln"> </span><span class="lit">1</span><span class="pln"> seth   </span><span class="lit">6.1K</span><span class="pln"> </span><span class="typ">May</span><span class="pln"> </span><span class="lit">22</span><span class="pln"> </span><span class="lit">10</span><span class="pun">:</span><span class="lit">22</span><span class="pln"> geteltorito
</span><span class="pun">-</span><span class="pln">rwxrwx</span><span class="pun">---.</span><span class="pln"> </span><span class="lit">1</span><span class="pln"> seth    </span><span class="lit">177</span><span class="pln"> </span><span class="typ">Nov</span><span class="pln"> </span><span class="lit">12</span><span class="pln">  </span><span class="lit">2018</span><span class="pln"> html4mutt</span><span class="pun">.</span><span class="pln">sh</span></pre>

<p>
	يمكنك دمج الخيارين لإخفاء كلا العمودين.
</p>

<h2>
	صيغة الوقت والتاريخ
</h2>

<p>
	صيغة قائمة التفاصيل الطويلة للأمر <code>ls</code> تكون عادةً على الشكل التالي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_4807_37" style="">
<span class="pun">-</span><span class="pln">rwxrwx</span><span class="pun">---.</span><span class="pln"> </span><span class="lit">1</span><span class="pln"> seth users         </span><span class="lit">455</span><span class="pln"> </span><span class="typ">Mar</span><span class="pln">  </span><span class="lit">2</span><span class="pln">  </span><span class="lit">2017</span><span class="pln"> estimate</span><span class="pun">.</span><span class="pln">sh
</span><span class="pun">-</span><span class="pln">rwxrwxr</span><span class="pun">-</span><span class="pln">x</span><span class="pun">.</span><span class="pln"> </span><span class="lit">1</span><span class="pln"> seth users         </span><span class="lit">662</span><span class="pln"> </span><span class="typ">Apr</span><span class="pln"> </span><span class="lit">29</span><span class="pln"> </span><span class="lit">22</span><span class="pun">:</span><span class="lit">27</span><span class="pln"> factorial
</span><span class="pun">-</span><span class="pln">rwxrwx</span><span class="pun">---.</span><span class="pln"> </span><span class="lit">1</span><span class="pln"> seth users    </span><span class="lit">20697793</span><span class="pln"> </span><span class="typ">Jun</span><span class="pln"> </span><span class="lit">29</span><span class="pln">  </span><span class="lit">2018</span><span class="pln"> fop</span><span class="pun">-</span><span class="lit">2.3</span><span class="pun">-</span><span class="pln">bin</span><span class="pun">.</span><span class="pln">tar</span><span class="pun">.</span><span class="pln">gz
</span><span class="pun">-</span><span class="pln">rwxrwxr</span><span class="pun">-</span><span class="pln">x</span><span class="pun">.</span><span class="pln"> </span><span class="lit">1</span><span class="pln"> seth users        </span><span class="lit">6210</span><span class="pln"> </span><span class="typ">May</span><span class="pln"> </span><span class="lit">22</span><span class="pln"> </span><span class="lit">10</span><span class="pun">:</span><span class="lit">22</span><span class="pln"> geteltorito
</span><span class="pun">-</span><span class="pln">rwxrwx</span><span class="pun">---.</span><span class="pln"> </span><span class="lit">1</span><span class="pln"> seth users         </span><span class="lit">177</span><span class="pln"> </span><span class="typ">Nov</span><span class="pln"> </span><span class="lit">12</span><span class="pln">  </span><span class="lit">2018</span><span class="pln"> html4mutt</span><span class="pun">.</span><span class="pln">sh</span></pre>

<p>
	لا يمكن ترتيب أسماء الشهور بهذه الصيغة بسهولة، لا حسابيا (حسب اذا كنت تفضل أسماء الشهور أو رقم يدل على ترتيبها) ولا إدراكيًا. يمكنك تغيير صيغة عرض العلامة الزمنية عبر الخيار <code>time-style--</code> إضافة إلى اسم الصيغة. الصيغ المتاحة هي:
</p>

<ul>
<li>
		(1970-01-01 21:12:00) full-iso.
	</li>
	<li>
		long-iso (1970-01-01 21:12).
	</li>
	<li>
		iso (01-01 21:12).
	</li>
	<li>
		locale (سيتم استخدام إعداداتك المحلية).
	</li>
	<li>
		posix-STYLE (بدل كلمة STYLE بالمعرّف المحلي).
	</li>
</ul>
<p>
	يمكنك أيضا إنشاء صيغة مخصصة مماثلة للصيغ التي يدعمها الأمر <code>date</code>.
</p>

<h2>
	الترتيب بحسب الوقت
</h2>

<p>
	يرتب الأمر <code>ls</code> القائمة افتراضيًا حسب الترتيب الأبجدي. يمكنك تغيير الترتيب إلى الترتيب بحسب الوقت الذي تم فيه تعديل الملفات آخر مرة (الأحدث أولًا) باستخدام الخيار <code>t-</code>:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_4807_43" style="">
<span class="pln">$ touch foo bar baz
$ ls
bar  baz  foo
$ touch foo
$ ls </span><span class="pun">-</span><span class="pln">t
foo bar baz</span></pre>

<h2>
	نوع القائمة
</h2>

<p>
	الخرج القياسي للأمر <code>ls</code> يوازن بين قابلية القراءة والتوفير في المساحة، لكن أحيانا تحتاج أن تكون قائمة الملفات بترتيب معين. ولتحديد تنسيق القائمة ليكون عناصر وبينها فاصلة، نستخدم الخيار <code>m-</code>:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4807_49" style="">
<span class="pln">ls </span><span class="pun">-</span><span class="pln">m </span><span class="pun">~/</span><span class="pln">example
bar</span><span class="pun">,</span><span class="pln"> baz</span><span class="pun">,</span><span class="pln"> foo</span></pre>

<p>
	لإجبار وضع العناصر بحيث يكون كل ملف بسطر، نستخدم الخيار <code>1-</code> (رقم واحد وليس حرف L صغير):
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_4807_47" style="">
<span class="pln"> $ ls </span><span class="pun">-</span><span class="lit">1</span><span class="pln"> </span><span class="pun">~/</span><span class="pln">bin</span><span class="pun">/</span><span class="pln">
 bar
 baz
 foo</span></pre>

<p>
	لترتيب العناصر حسب اللاحقة لكل ملف وليس حسب اسم الملف، نستخدم الخيار <code>X-</code>:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_4807_51" style="">
<span class="pln">$ ls
bar</span><span class="pun">.</span><span class="pln">xfc  baz</span><span class="pun">.</span><span class="pln">txt  foo</span><span class="pun">.</span><span class="pln">asc
$ ls </span><span class="pun">-</span><span class="pln">X
foo</span><span class="pun">.</span><span class="pln">asc  baz</span><span class="pun">.</span><span class="pln">txt  bar</span><span class="pun">.</span><span class="pln">xfc</span></pre>

<h2>
	إخفاء الملفات من الخرج التي قد لا تحتاج لرؤيتها
</h2>

<p>
	هناك بعض العناصر في خرج الأمر <code>ls</code> التي قد لا تهتم لرؤيتها، مثل المحارف الوصفية <code>.</code> و <code>..</code> التي تدل على "المسار الحالي" و "مستوى واحد للخلف" على التوالي. اذا كان لديك معرفة بكيفية التنقل بين المجلدات داخل الطرفية، فأنت تعلم أن كل مسار يشير إلى نفسه كـ <code>.</code> وللمسار الأب كـ <code>..</code>، لذ قد لا تحتاج لرؤية تلك الدلالات في كل مرة تستخدم بها الخيار <code>a-</code> لعرض الملفات المخفية.
</p>

<p>
	لعرض تقريبا كل الملفات المخفية (ما عدا <code>.</code> و <code>..</code>) يمكنك استخدام <code>A-</code>:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_4807_53" style="">
<span class="pln">$ ls </span><span class="pun">-</span><span class="pln">a
</span><span class="pun">.</span><span class="pln">
</span><span class="pun">..</span><span class="pln">
</span><span class="pun">.</span><span class="pln">android
</span><span class="pun">.</span><span class="pln">atom
</span><span class="pun">.</span><span class="pln">bash_aliases
</span><span class="pun">[...]</span></pre>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_4807_55" style="">
<span class="pln">$ ls </span><span class="pun">-</span><span class="pln">A
</span><span class="pun">.</span><span class="pln">android
</span><span class="pun">.</span><span class="pln">atom
</span><span class="pun">.</span><span class="pln">bash_aliases
</span><span class="pun">[...]</span></pre>

<p>
	هناك عُرف في العديد من أدوات يونكس أن يتم حفظ ملفات النسخ الاحتياطي باسم ملف متبوع بمحرف مميز ما. على سبيل المثال <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>، يقوم بحفظ ملفات النسخ الاحتياطية باسم متبوع بالمحرف <code>~</code> .
</p>

<p>
	هذه الملفات ستنقذك في الكثير من المرات، لكن قد لا تحتاج لرؤيتها دومًا داخل قائمة الملفات، لإخفائها يمكنك استعمال الخيار <code>B-</code> أو <code>igonre-backups--</code> وسيقوم الأمر <code>ls</code> بإخفاء ملفات النسخ الاحتياطي ذات اللواحق المشهورة (هذا الخيار غير متوفر في إصدار BSD للأمر <code>ls</code>):
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_4807_58" style="">
<span class="pln">$ ls
bar</span><span class="pun">.</span><span class="pln">xfc  baz</span><span class="pun">.</span><span class="pln">txt  foo</span><span class="pun">.</span><span class="pln">asc</span><span class="pun">~</span><span class="pln">  foo</span><span class="pun">.</span><span class="pln">asc
$ ls </span><span class="pun">-</span><span class="pln">B
bar</span><span class="pun">.</span><span class="pln">xfc  baz</span><span class="pun">.</span><span class="pln">txt  foo</span><span class="pun">.</span><span class="pln">asc</span></pre>

<p>
	ملفات النسخ الاحتياطي لازالت موجودة، فقط تم إخفائها من قائمة الملفات.
</p>

<p>
	جنو إيماكس GNU Emacs يحفظ ملفات نسخ احتياطي (إلا إذا تم تغيير إعدادات ذلك) عبر وضع محرف المربع <code>#</code> قبل وبعد اسم الملف. تطبيقات أخرى أيضا ستستخدم صيغ أخرى لأسماء الملفات تلك. لذا يمكنك تحديد نمط مخصص لاسم الملفات التي تود إخفاءها من الخرج عبر الخيار <code>hide--</code>:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4807_60" style="">
<span class="pln">$ ls
bar</span><span class="pun">.</span><span class="pln">xfc  baz</span><span class="pun">.</span><span class="pln">txt  </span><span class="pun">#</span><span class="pln">foo</span><span class="pun">.</span><span class="pln">asc</span><span class="pun">#</span><span class="pln">  foo</span><span class="pun">.</span><span class="pln">asc
$ ls </span><span class="pun">--</span><span class="pln">hide</span><span class="pun">=</span><span class="str">"#*#"</span><span class="pln">
bar</span><span class="pun">.</span><span class="pln">xfc  baz</span><span class="pun">.</span><span class="pln">txt  foo</span><span class="pun">.</span><span class="pln">asc</span></pre>

<h2>
	عرض محتويات المجلدات
</h2>

<p>
	لن يعرض الأمر <code>ls</code> محتويات المجلدات إلا إذا حددت له مجلدًا معينًا لعرض محتوياته، لذلك يمكنك استخدام الخيار <code>R-</code> لعرض شجرة محتويات كل المجلدات:
</p>

<pre class="ipsCode prettyprint prettyprinted" id="ips_uid_4807_66" style="">
<span class="pln">  $ ls </span><span class="pun">-</span><span class="pln">F
  example</span><span class="pun">/</span><span class="pln">  quux</span><span class="pun">*</span><span class="pln">  xyz</span><span class="pun">.</span><span class="pln">txt
  $ ls </span><span class="pun">-</span><span class="pln">R
  quux  xyz</span><span class="pun">.</span><span class="pln">txt

  </span><span class="pun">./</span><span class="pln">example</span><span class="pun">:</span><span class="pln">
  bar</span><span class="pun">.</span><span class="pln">xfc  baz</span><span class="pun">.</span><span class="pln">txt  </span><span class="com">#foo.asc#  foo.asc</span></pre>

<h2>
	تبسيط استخدام الخيارات المكررة عبر الاسم البديل
</h2>

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

<p>
	الحل يكون بتحديد اسم بديل للأمر <code>ls</code> يتضمن الخيارات التي توفر لك المعلومات التي تحتاجها دومًا. لتعيين اسم بديل في جلسة باش Bash، أنشئ ملفًا في مجلد المنزل لحسابك بالاسم <code>bash_aliases.</code> (يجب وضع النقطة في بداية اسم الملف). في هذا الملف حدد قائمة الأوامر التي تريد تعيين اسمًا بديلا لها ثم قيمة هذا الاسم البديل. مثال:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4807_68" style="">
<span class="pln">alias ls</span><span class="pun">=</span><span class="str">'ls -A -F -B --human --color'</span></pre>

<p>
	السطر السابق يجعل صدفة باش تترجم الأمر <code>ls</code> الى <code>ls -A -F -B --human --color</code>.
</p>

<p>
	ولست مقيدًا بتعيين أسماء بديلة للأوامر المتوفرة فقط. بل يمكنك إنشاء أسماء بديلة خاصة بك:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4807_70" style="">
<span class="pln">alias ll</span><span class="pun">=</span><span class="str">'ls -l'</span><span class="pln">
alias la</span><span class="pun">=</span><span class="str">'ls -A'</span><span class="pln">
alias lh</span><span class="pun">=</span><span class="str">'ls -h'</span></pre>

<p>
	لكي تُفعّل تلك الأسماء البديلة، يجب على الصدفة أن تعلم بوجود ملف الإعدادات <code>bash_aliases.</code>. قم بفتح الملف <code>bashrc.</code> في محرر النصوص (أو قم بإنشائه، إن لم يكن موجودًا)، وضع داخله الشيفرة التالية:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_4807_72" style="">
<span class="kwd">if</span><span class="pln"> </span><span class="pun">[</span><span class="pln"> </span><span class="pun">-</span><span class="pln">e $HOME</span><span class="pun">/.</span><span class="pln">bash_aliases </span><span class="pun">];</span><span class="pln"> then
    source $HOME</span><span class="pun">/.</span><span class="pln">bash_aliases
fi</span></pre>

<p>
	في كل مرة سيحمّل الملف <code>bashrc.</code> (أي في كل مرة سيتم فيها إنشاء جلسة صدفة جديدة)، سيقوم باش بتحميل الملف <code>bash_aliases.</code> إلى البيئة الحالية. يمكنك إغلاق وإعادة فتح الجلسة الحالية لتفعيل ذلك أو يمكنك إجبار تحميل الإعدادات عبر تنفيذ الأمر:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_4807_76" style="">
<span class="pln">$ source </span><span class="pun">~/.</span><span class="pln">bashrc</span></pre>

<p>
	إذا نسيت بعد فترة ما إذا كنت قد قمت بتعيين اسم بديل لأمر ما أم لا، الأمر <code>which</code> سيخبرك بذلك:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4807_78" style="">
<span class="pln">$ which ls
alias ls</span><span class="pun">=</span><span class="str">'ls -A -F -B --human --color'</span><span class="pln">
        </span><span class="pun">/</span><span class="pln">usr</span><span class="pun">/</span><span class="pln">bin</span><span class="pun">/</span><span class="pln">ls</span></pre>

<p>
	إذا كنت قد حددت اسما بديلا للأمر <code>ls</code> قيمته هو الأمر نفسه مع بضعة خيارات أخرى. وتريد تنفيذ الأمر بمفرده وتجاهل الاسم البديل المعين له يمكنك إسباق الأمر بمحرف الخط المائل العكسي (<code>\</code>). مثلا في الاسم البديل السابق استخدمنا الخيار <code>B-</code> لإخفاء ملفات النسخ الاحتياطي من الخرج، أما في حال أردت مشاهدة تلك الملفات وتجاهل الاسم البديل ينفذ الأمر كالتالي:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_4807_80" style="">
<span class="pln">$ ls
bar  baz  foo
$ \ls
bar  baz  baz</span><span class="pun">~</span><span class="pln">  foo</span></pre>

<h2>
	ختاما
</h2>

<p>
	يحوي الأمر <code>ls</code> العديد من الخيارات المفيدة، العديد منها متخصصة بحالة معينة أو تعتمد على نوع الطرفية التي تستخدمها. يمكنك القراءة ومعرفة المزيد من الخيارات بتنفيذ الأمر <code>info ls</code> على أنظمة جنو، أو <code>man ls</code> على أنظمة جنو و BSD.
</p>

<p>
	قد تجد من الغريب على نظام شعاره الأساسي هو "قم بعمل واحد، وقم به جيدًا" أن يثقل أمرا واحدا بخمسين خيار. لكن حقيقةً أن الأمر <code>ls</code> يقوم بشيء واحد فقط: يظهر قائمة بالملفات. والخمسين خيار المتوفرين سيمكنوك من تحديد كيف تريد هذه القائمة، بالفعل <code>ls</code> يقوم بعمل واحد ويقوم به جيدًا.
</p>

<p>
	ترجمة -وبتصرف- للمقال <a href="https://opensource.com/article/19/7/master-ls-command" rel="external nofollow">Master the Linux ls command</a> لصاحبه Seth Kenlon.
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
<li>
		<a href="https://academy.hsoub.com/devops/linux/%D9%85%D8%A7-%D8%A7%D9%84%D9%81%D8%B1%D9%88%D9%82-%D8%A8%D9%8A%D9%86-%D8%A7%D9%84%D8%A3%D9%88%D8%A7%D9%85%D8%B1-grep-%D9%88egrep-fgrep-r320/" rel="">ما الفروق بين الأوامر grep وegrep fgrep</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/devops/linux/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%A7%D9%84%D8%A3%D9%85%D8%B1-ss-%D9%81%D9%8A-%D9%84%D9%8A%D9%86%D9%83%D8%B3-r357/" rel="">مدخل إلى الأمر ss في لينكس</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%D9%85%D8%B1-tar-%D9%81%D9%8A-%D9%84%D9%8A%D9%86%D9%83%D8%B3-r243/" rel="">مقدمة إلى أمر tar في لينكس</a>
	</li>
	<li>
		<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="">كيف تستخدِم أمرَي find و locate للبحث عن الملفّات على Linux</a>
	</li>
	<li>
		النسخة الكاملة من كتاب <a href="https://academy.hsoub.com/files/24-%D8%A3%D9%86%D8%B8%D9%85%D8%A9-%D8%A7%D9%84%D8%AA%D8%B4%D8%BA%D9%8A%D9%84-%D9%84%D9%84%D9%85%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D9%86/" rel="">أنظمة التشغيل للمبرمجين</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">558</guid><pubDate>Fri, 26 Nov 2021 17:07:00 +0000</pubDate></item><item><title>&#x627;&#x644;&#x62A;&#x62D;&#x643;&#x645; &#x628;&#x627;&#x644;&#x648;&#x635;&#x648;&#x644; &#x625;&#x644;&#x649; &#x627;&#x644;&#x623;&#x642;&#x631;&#x627;&#x635; &#x627;&#x644;&#x62E;&#x627;&#x631;&#x62C;&#x64A;&#x629; &#x641;&#x64A; &#x644;&#x64A;&#x646;&#x643;&#x633;</title><link>https://academy.hsoub.com/devops/linux/%D8%A7%D9%84%D8%AA%D8%AD%D9%83%D9%85-%D8%A8%D8%A7%D9%84%D9%88%D8%B5%D9%88%D9%84-%D8%A5%D9%84%D9%89-%D8%A7%D9%84%D8%A3%D9%82%D8%B1%D8%A7%D8%B5-%D8%A7%D9%84%D8%AE%D8%A7%D8%B1%D8%AC%D9%8A%D8%A9-%D9%81%D9%8A-%D9%84%D9%8A%D9%86%D9%83%D8%B3-r557/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2021_12/61ae00627c4c5_03-0-0-0-0-0-0(1).png.e34bb9a729abdf945981145ffd221e62.png" /></p>

<p>
	يقدم التخزين السحابي العديد من المزايا، لكن لن يغنيك ذلك عن امتلاكك لبياناتك على قرص صلب فيزيائي خاص بك. عندما تخزن بياناتك على القرص الصلب ستعلم تماما أين بياناتك، ويمكنك الوصول اليها دائما عند الحاجة. الأمر الأفضل من ذلك حتى أن تخزن بياناتك على قرص محمول، مثل ذاكرة اليو اس بي USB Drive، لست فقط على علم أين تقع بياناتك بل يمكنك حملها معك لأي مكان. إذا كنت مستخدم جديد للينكس، أو كنت تحاول التعامل مع نظام ملفات لينكس على قرص خارجي، قد تجد الأقراص الخارجية أمرا مربكًا، ستكون عرضة لأخطاء في الصلاحيات أو التضارب فيها، أو حتى خسارة البيانات الوصفية للملفات metadata، هناك إجابتين "صحيحتين" لذلك: نظام ملفات ExFAT <a href="https://academy.hsoub.com/certificates/cisco/ccna/%D9%85%D9%82%D8%AF%D9%85%D8%A9-%D8%A5%D9%84%D9%89-%D9%84%D9%88%D8%A7%D8%A6%D8%AD-%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-access-control-lists-r76/" rel="">وقوائم التحكم بالوصول ACL</a>.
</p>

<h2>
	نظام ملفات ExFAT
</h2>

<p>
	رسميا، كان نظام ملفات ExFAT معرضًا لمخاطر قانونية كثيرة من قبل مايكروسوفت لأنها كانت تمتلك الشيفرة الخاصة به. قاموا بمقاضاة شركات ومنظمات عديدة من قبل دفاعًا عن ملكيتهم لنظام الملفات FAT، لذا كان الخوف مسيطرًا أنهم قد يعيدوا الكرّة مع نظام ExFAT. لكن مؤخرًا قامت مايكروسوفت بجعل معايير نظام ExFAT مفتوح المصدر. لم يوفروا برنامج تشغيل له ولكنه يوجد برنامج تشغيل حالي له على لينكس، وبعد أن توفر للمطورين إمكانية الوصول للمعايير بشكل كامل أصبح التطوير والتحسين عليها أمرًا حتميًا.
</p>

<p>
	محاسن نظام ExFAT أنه عابر للمنصات (ويندوز، ماك، والعديد من الأجهزة المحمولة تستخدمه)، وقد تم تصميمه دون اعتبار لنظام الصلاحيات على الملفات. حيث يمكنك توصيل محرك خارجي بتنسيق ملفات ExFAT لأي جهاز حاسوب، وكل الملفات ستكون متاحة للجميع. سيُعد هذا أمرا أيجابيًا أو سلبيًا بحسب طريقة استخدامك، لكن بالنسبة للاستعمال مع ملفات الوسائط المتعددة ذلك يعد أمرا إيجابيا جدًا.
</p>

<h2>
	قوائم التحكم بالوصول ACL
</h2>

<p>
	يمكنك -إن كنت تفضل- استخدام نظام ملفات لينكس على محرك الملفات المحمول، لكن لجعل مشاركة الملفات أمرا سلسًا يجب استخدام قوائم التحكم بالوصول <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="">ACL </a>اختصارًا إلى Access control lists.
</p>

<p>
	عند إنشاء ملف أو مجلد على محرك ملفات، يوجد إعدادات افتراضية على نظامك ستحدد ما الصلاحيات التي سيحصل عليها هذا الملف أو المجلد. في معظم الحالات، الإعدادات الافتراضية تكون كافية ومنطقية، مثلا عند إنشائك لملف في مسار مجلد المنزل لحسابك الشخصي فعادةً أنت لا تريد إعطاء صلاحية الوصول إليه للمستخدمين الآخرين. لكن عندما تنشئ ملفًا في محرك خارجي، فأغلب الأحيان ستحتاج مشاركته مع الآخرين (حتى لو كان الشخص الآخر هو أنت لكن من جهاز حاسوب آخر).
</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="">بت لاصق sticky bit</a>. قائمة التحكم بالوصول هي طبقة من سياسات الحماية تقع في الخصائص الإضافية للمجلدات والملفات وتسمح لك بتحديد استثناءات على الصلاحيات المحددة من قبل <a href="https://academy.hsoub.com/programming/c/%D8%A7%D9%84%D9%81%D8%B5%D9%84-%D8%A7%D9%84%D8%B1%D8%A7%D8%A8%D8%B9-%D9%81%D9%87%D9%85-%D8%A7%D9%84%D9%85%D9%84%D9%81%D8%A7%D8%AA-files-%D9%88%D8%A3%D9%86%D8%B8%D9%85%D8%A9-%D8%A7%D9%84%D9%85%D9%84%D9%81%D8%A7%D8%AA-file-systems-r979/" rel="">نظام الملفات</a>. وأكثر ما توفره هذه الطبقة، هي تجاوز نموذج المالك الوحيد والمجموعة المالكة الوحيدة لنظام صلاحيات يونكس التقليدي.
</p>

<p>
	على سبيل المثال، بينما حسابي بإسم حسان (بالمعرّف 1000) على جهازي المكتبي يملك مجلدًا على سطح المكتب، حساب آخر لي بإسم حسان على جهازي المحمول (بالمعرّف 500) من وجهة نظر نظام الملفات هو لا يملك نفس المجلد ولا يصل إليه، فقط لأن المعرّف لكل من الحسابين مختلف.
</p>

<p>
	نفس المشكلة مع نظام تملّك المجموعات، مجموعة بالمعرّف 1000 قد تملك مجلدًا على جهاز، مجموعة أخرى على جهاز آخر بمعرّف مغاير (500 أو 10922) لن تصل إلى نفس المجلد. قائمة التحكم بالوصول تستطيع حل المشكلة بإضافة مُلّاك أفراد أو مجموعات ثانويين للمجلدات والملفات.
</p>

<h2>
	مشاهدة قائمة الوصول الحالية
</h2>

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

<p>
	يمكنك مشاهدتها عبر الطرفية بتنفيذ الأمر التالي:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6947_13" style="">
<span class="pln">$ getfacl </span><span class="pun">./</span><span class="pln">example
</span><span class="com"># file: /run/media/drive/example</span><span class="pln">
</span><span class="com"># owner: hassan</span><span class="pln">
</span><span class="com"># group: users</span><span class="pln">
user</span><span class="pun">::</span><span class="pln">rwx
group</span><span class="pun">::</span><span class="pln">rwx
other</span><span class="pun">::</span><span class="pln">r</span><span class="pun">--</span></pre>

<p>
	أسطر التعليق الظاهرة هي مرجع فقط، تدل على أسم الملف وحساب المالك والمجموعة المالكة للملف الحالي الذي تستعرض معلومات عنه حاليًا. الأسطر اللاحقة لذلك تُظهر القواعد المطبقة على هذا <a href="https://academy.hsoub.com/devops/linux/%d8%a3%d8%b3%d8%a7%d8%b3%d9%8a%d8%a7%d8%aa-%d8%a5%d8%af%d8%a7%d8%b1%d8%a9-%d8%a7%d9%84%d9%85%d9%84%d9%81%d9%91%d8%a7%d8%aa-%d9%88%d8%a7%d9%84%d8%aa%d9%86%d9%82%d9%91%d9%84-%d9%81%d9%8a-%d9%84%d9%8a%d9%86%d9%83%d8%b3-r24/" rel="">الملف</a> أو المجلد. في المثال السابق، صلاحيات المستخدم المالك مضبوطة للقيمة <code>rwx</code>، ومثلها للمجموعة المالكة <code>rwx</code>، وللباقي <code>--r</code>. هذه الصلاحيات تعكس الصلاحيات الافتراضية لقائمة التحكم بالوصول الافتراضية <a href="https://academy.hsoub.com/devops/servers/databases/%D8%AA%D8%AD%D9%84%D9%8A%D9%84-%D9%86%D8%B8%D8%A7%D9%85-%D8%A7%D9%84%D9%85%D9%84%D9%81%D8%A7%D8%AA-%D9%84%D8%A5%D8%AF%D8%A7%D8%B1%D8%A9-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-%D9%88%D8%AA%D8%AE%D8%B2%D9%8A%D9%86%D9%87%D8%A7-%D9%88%D8%A7%D8%AE%D8%AA%D9%84%D8%A7%D9%81%D9%87-%D8%B9%D9%86-%D9%86%D8%B8%D8%A7%D9%85-%D9%82%D8%A7%D8%B9%D8%AF%D8%A9-%D8%A7%D9%84%D8%A8%D9%8A%D8%A7%D9%86%D8%A7%D8%AA-r509/" rel="">لنظام الملفات</a>:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6947_11" style="">
<span class="pln">$ ls </span><span class="pun">-</span><span class="pln">lA </span><span class="pun">/</span><span class="pln">run</span><span class="pun">/</span><span class="pln">media</span><span class="pun">/</span><span class="pln">drive
drwxrwxr</span><span class="pun">--</span><span class="pln"> </span><span class="lit">26</span><span class="pln"> hassan users </span><span class="lit">4096</span><span class="pln"> </span><span class="typ">Jan</span><span class="pln"> </span><span class="lit">16</span><span class="pln"> </span><span class="lit">21</span><span class="pun">:</span><span class="lit">04</span><span class="pln"> example
$ id
uid</span><span class="pun">=</span><span class="lit">1000</span><span class="pun">(</span><span class="pln">hassan</span><span class="pun">)</span><span class="pln"> gid</span><span class="pun">=</span><span class="lit">100</span><span class="pun">(</span><span class="pln">users</span><span class="pun">)</span><span class="pln"> groups</span><span class="pun">=</span><span class="lit">100</span><span class="pun">(</span><span class="pln">users</span><span class="pun">)...</span></pre>

<p>
	طالما أن حساب المستخدم hassan (بالمعرف 1000) أو حساب عضو في المجموعة <code>users</code> (بالمعرف 100) يتعاملون مع المجلد <code>example</code>، فلهم صلاحية وصول كاملة. أي حساب آخر سيمتلك صلاحية القراءة <code>r</code> فقط.
</p>

<h2>
	تعيين قائمة التحكم بالوصول
</h2>

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

<p>
	إذا كنت فقط تريد تعديل إعدادات صلاحيات نظام الملفات، يمكنك استخدام أحد الأمرين <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=""><code>chmod</code></a> أو <code>setfacl</code> وهي إعدادات تحكم بالوصول عامة لأنك لا تضيف صلاحيات جديدة عن تلك المتاحة ليونكس من معايير نظام الملفات.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6947_15" style="">
<span class="pln">$ setfacl </span><span class="pun">--</span><span class="pln">modify g</span><span class="pun">::</span><span class="pln">r example
$ getfacl </span><span class="pun">./</span><span class="pln">example </span><span class="pun">|</span><span class="pln"> grep </span><span class="str">"group::"</span><span class="pln">
group</span><span class="pun">::</span><span class="pln">r</span><span class="pun">--</span><span class="pln">
$ ls </span><span class="pun">-</span><span class="pln">l </span><span class="pun">.</span><span class="pln"> </span><span class="pun">|</span><span class="pln"> grep example
drwxr</span><span class="pun">--</span><span class="pln">r</span><span class="pun">--</span><span class="pln"> </span><span class="lit">26</span><span class="pln"> hassan users </span><span class="lit">4096</span><span class="pln"> </span><span class="typ">Jan</span><span class="pln"> </span><span class="lit">16</span><span class="pln"> </span><span class="lit">21</span><span class="pun">:</span><span class="lit">04</span><span class="pln"> example</span></pre>

<p>
	العملية نفسها ممكنة عبر استعمال الأمر <code>chmod</code>:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6947_17" style="">
<span class="pln">$ chmod g</span><span class="pun">+</span><span class="pln">x example
$ getfacl </span><span class="pun">./</span><span class="pln">example </span><span class="pun">|</span><span class="pln"> grep </span><span class="str">"group::"</span><span class="pln">
group</span><span class="pun">::</span><span class="pln">r</span><span class="pun">-</span><span class="pln">x
$ ls </span><span class="pun">-</span><span class="pln">l </span><span class="pun">.</span><span class="pln"> </span><span class="pun">|</span><span class="pln"> grep example
drwxr</span><span class="pun">-</span><span class="pln">xr</span><span class="pun">--</span><span class="pln"> </span><span class="lit">26</span><span class="pln"> seth users </span><span class="lit">4096</span><span class="pln"> </span><span class="typ">Jan</span><span class="pln"> </span><span class="lit">16</span><span class="pln"> </span><span class="lit">21</span><span class="pun">:</span><span class="lit">04</span><span class="pln"> example</span></pre>

<h2>
	إضافة مستخدمين ومجموعات
</h2>

<p>
	للاستفادة من مزايا التي توفرها قوائم التحكم بالوصول يجب أن نستخدمها لإضافة صلاحيات إضافية مغايرة الصلاحيات الأصلية في يونكس. إذا سجلت الدخول على جهاز سطح المكتب من حسابي <code>hassan</code> ذو المعرّف 1000، وأعلم أنني أريد الوصول واستعمال مجلد مخزن على القرص المحمول من حساب <code>hassan</code> ذو المعرّف 500 من جهازي المحمول، لن يكون عندها كافيا أن أحدد مالك المجلد هو الحساب <code>hassan</code> فقط، لأن المعرّفين لكلا الحسابين ليسا متطابقين.
</p>

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

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6947_19" style="">
<span class="pln">$ setfacl </span><span class="pun">--</span><span class="pln">modify u</span><span class="pun">:</span><span class="lit">500</span><span class="pun">:</span><span class="pln">rwx example
$ getfacl example
</span><span class="pun">#</span><span class="pln"> file</span><span class="pun">:</span><span class="pln"> </span><span class="str">/run/</span><span class="pln">media</span><span class="pun">/</span><span class="pln">drive</span><span class="pun">/</span><span class="pln">example
</span><span class="pun">#</span><span class="pln"> owner</span><span class="pun">:</span><span class="pln"> hassan
</span><span class="pun">#</span><span class="pln"> group</span><span class="pun">:</span><span class="pln"> users
user</span><span class="pun">::</span><span class="pln">rwx
user</span><span class="pun">:</span><span class="lit">500</span><span class="pun">:</span><span class="pln">rwx
</span><span class="pun">[...]</span></pre>

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

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

<h2>
	تعيين القواعد الافتراضية لقوائم التحكم بالوصول
</h2>

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

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

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6947_21" style="">
<span class="pln"> $ setfacl </span><span class="pun">--</span><span class="kwd">default</span><span class="pln"> </span><span class="pun">--</span><span class="pln">modify u</span><span class="pun">:</span><span class="lit">500</span><span class="pun">:</span><span class="pln">rwx example
 $ setfacl </span><span class="pun">--</span><span class="kwd">default</span><span class="pln"> </span><span class="pun">--</span><span class="pln">modify u</span><span class="pun">:</span><span class="lit">1000</span><span class="pun">:</span><span class="pln">rwx example
 $ getfacl </span><span class="pun">--</span><span class="pln">omit</span><span class="pun">-</span><span class="pln">header example
 user</span><span class="pun">::</span><span class="pln">rwx
 user</span><span class="pun">:</span><span class="lit">500</span><span class="pun">:</span><span class="pln">rwx
 group</span><span class="pun">::</span><span class="pln">rw</span><span class="pun">-</span><span class="pln">
 mask</span><span class="pun">::</span><span class="pln">rwx
 other</span><span class="pun">::</span><span class="pln">r</span><span class="pun">-</span><span class="pln">x
 </span><span class="kwd">default</span><span class="pun">:</span><span class="pln">user</span><span class="pun">::</span><span class="pln">rwx
 </span><span class="kwd">default</span><span class="pun">:</span><span class="pln">group</span><span class="pun">::</span><span class="pln">rw</span><span class="pun">-</span><span class="pln">
 </span><span class="kwd">default</span><span class="pun">:</span><span class="pln">group</span><span class="pun">:</span><span class="lit">500</span><span class="pun">:</span><span class="pln">rwx
 </span><span class="kwd">default</span><span class="pun">:</span><span class="pln">group</span><span class="pun">:</span><span class="lit">1000</span><span class="pun">:</span><span class="pln">rwx
 </span><span class="kwd">default</span><span class="pun">:</span><span class="pln">mask</span><span class="pun">::</span><span class="pln">rwx
 </span><span class="kwd">default</span><span class="pun">:</span><span class="pln">other</span><span class="pun">::</span><span class="pln">r</span><span class="pun">-</span><span class="pln">x</span></pre>

<p>
	الآن عندما يقوم مستخدم بإنشاء مجلد جديد داخل المجلد <code>example</code>، سيتم توريث قائمة التحكم بالوصول له لتكون نفسها للمجلد الأب:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6947_23" style="">
<span class="pln">$ cd example
$ mkdir penguins
$ getfacl </span><span class="pun">--</span><span class="pln">omit</span><span class="pun">-</span><span class="pln">header penguins
user</span><span class="pun">::</span><span class="pln">rwx
group</span><span class="pun">::</span><span class="pln">rw</span><span class="pun">-</span><span class="pln">
group</span><span class="pun">:</span><span class="lit">500</span><span class="pun">:</span><span class="pln">rwx
group</span><span class="pun">:</span><span class="lit">1000</span><span class="pun">:</span><span class="pln">rwx
mask</span><span class="pun">::</span><span class="pln">rwx
other</span><span class="pun">::</span><span class="pln">r</span><span class="pun">-</span><span class="pln">x
</span><span class="kwd">default</span><span class="pun">:</span><span class="pln">user</span><span class="pun">::</span><span class="pln">rwx
</span><span class="kwd">default</span><span class="pun">:</span><span class="pln">group</span><span class="pun">::</span><span class="pln">rw</span><span class="pun">-</span><span class="pln">
</span><span class="kwd">default</span><span class="pun">:</span><span class="pln">group</span><span class="pun">:</span><span class="lit">500</span><span class="pun">:</span><span class="pln">rwx
</span><span class="kwd">default</span><span class="pun">:</span><span class="pln">group</span><span class="pun">:</span><span class="lit">1000</span><span class="pun">:</span><span class="pln">rwx
</span><span class="kwd">default</span><span class="pun">:</span><span class="pln">mask</span><span class="pun">::</span><span class="pln">rwx
</span><span class="kwd">default</span><span class="pun">:</span><span class="pln">other</span><span class="pun">::</span><span class="pln">r</span><span class="pun">-</span><span class="pln">x</span></pre>

<p>
	هذا يعني أن أي مجلد أو ملف سيرث تلقائيا نفس قائمة التحكم بالوصول، ولن يتم استثناء أي من الحسابين بالمعرّفات 500 أو 100 من الوصول للملفات أو المجلدات.
</p>

<h2>
	قائمة تحكم بالوصول عملية لمحركات الأقراص الخارجية
</h2>

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

<p>
	لنفرض مثلا لديك مخزن ملفات USB يدعى mydrive منسّق بنظام الملفات <code>ext4</code>. وتريد السماح بالوصول للملفات المخزنة فيه لكل من حساباتك على جهاز سطح المكتب والجهاز المحمول وأيضا زميلك أحمد.
</p>

<p>
	أولا قم بإنشاء مجلد في أعلى مستوى من في مخزن الملفات:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6947_25" style="">
<span class="pln">$ mkdir </span><span class="pun">/</span><span class="pln">mnt</span><span class="pun">/</span><span class="pln">mydrive</span><span class="pun">/</span><span class="pln">umbrella</span></pre>

<p>
	ثم قم بتطبيق قائمة تحكم بالوصول على ذلك المجلد لضمان الوصول لكل حسابات المستخدمين الذي تريد:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6947_27" style="">
<span class="pln">$ setfacl </span><span class="pun">--</span><span class="pln">modify \
  u</span><span class="pun">:</span><span class="lit">500</span><span class="pun">:</span><span class="pln">rwx</span><span class="pun">,</span><span class="pln">u</span><span class="pun">:</span><span class="lit">1000</span><span class="pun">:</span><span class="pln">rwx</span><span class="pun">,</span><span class="pln">u</span><span class="pun">:</span><span class="pln">ahmad</span><span class="pun">:</span><span class="pln">rwx \
  </span><span class="pun">/</span><span class="pln">mnt</span><span class="pun">/</span><span class="pln">mydrive</span><span class="pun">/</span><span class="pln">umbrella</span></pre>

<p>
	أخيرًا تقوم بتطبيق قائمة تحكم بالوصول افتراضية ليتم توريثها لكل الملفات والمجلدات المنشأة داخل الملف <code>umbrella</code> (الأمر التالي يستخدم اختصار خيار <code>modify--</code>):
</p>

<pre class="ipsCode">
$ setfacl --default -m u:500:rwx,u:1000:rwx,u:ahmad:rwx \
  /mnt/mydrive/umbrella
</pre>

<h2>
	تطبيق القواعد الافتراضية على نظام حالي
</h2>

<p>
	إذا كنت تريد تطبيق قائمة تحكم بالوصول واحدة لعدة ملفات موجودة مسبقًا، يمكنك الاستعانة بالأمر <code>find</code>.
</p>

<p>
	أولا نقوم بالبحث عن المجلدات التي نريدها ثم نطبق عليها قائمة التحكم بالوصول:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_6947_29" style="">
<span class="pln"> $ find </span><span class="pun">/</span><span class="pln">mnt</span><span class="pun">/</span><span class="pln">mydrive</span><span class="pun">/</span><span class="pln">umbrella </span><span class="pun">-</span><span class="pln">type d </span><span class="pun">|</span><span class="pln"> \
   parallel </span><span class="pun">--</span><span class="pln">max</span><span class="pun">-</span><span class="pln">args</span><span class="pun">=</span><span class="lit">6</span><span class="pln"> setfacl \
   </span><span class="pun">--</span><span class="kwd">default</span><span class="pln"> </span><span class="pun">-</span><span class="pln">m u</span><span class="pun">:</span><span class="lit">500</span><span class="pun">:</span><span class="pln">rwx</span><span class="pun">,</span><span class="pln">u</span><span class="pun">:</span><span class="lit">1000</span><span class="pun">:</span><span class="pln">rwx</span><span class="pun">,</span><span class="pln">u</span><span class="pun">:</span><span class="pln">ahmad</span><span class="pun">:</span><span class="pln">rwx</span></pre>

<p>
	إن تطبيق صلاحية التنفيذ للملفات بشكل عشوائي أمر غير محبذ، لذا نبحث عن كل الملفات ونغير الصلاحيات لها إلى <code>rw</code>. الملفات التي تتطلب التنفيذ يمكن تعيين صلاحية التنفيذ لها إما بشكل يدوي أو عبر إضافة لاحقة لها:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6947_31" style="">
<span class="pln"> $ find </span><span class="pun">/</span><span class="pln">mnt</span><span class="pun">/</span><span class="pln">mydrive</span><span class="pun">/</span><span class="pln">umbrella </span><span class="pun">-</span><span class="pln">type f </span><span class="pun">|</span><span class="pln"> \
   parallel </span><span class="pun">--</span><span class="pln">max</span><span class="pun">-</span><span class="pln">args</span><span class="pun">=</span><span class="lit">6</span><span class="pln"> setfacl \
   </span><span class="pun">--</span><span class="kwd">default</span><span class="pln"> </span><span class="pun">-</span><span class="pln">m u</span><span class="pun">:</span><span class="lit">500</span><span class="pun">:</span><span class="pln">rw</span><span class="pun">,</span><span class="pln">u</span><span class="pun">:</span><span class="lit">1000</span><span class="pun">:</span><span class="pln">rw</span><span class="pun">,</span><span class="pln">u</span><span class="pun">:</span><span class="pln">ahmad</span><span class="pun">:</span><span class="pln">rw</span></pre>

<p>
	يمكنك تغيير المعاملات الممررة للأوامر السابقة بحسب حاجتك (لا تقم بتنفيذ الأمر الذي يقوم بمسح صلاحية التنفيذ على المجلد <code>user/</code>، أو على مجلد يحتوي فقط على ملفات تنفيذية).
</p>

<h2>
	المحركات الخارجية
</h2>

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

<p>
	ترجمة -وبتصرف- للمقال <a href="https://opensource.com/article/19/1/cups-printing-linux" rel="external nofollow">Access control lists and external drives on Linux: What you need to know</a> لصاحبه Seth Kenlon.
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
<li>
		<a href="https://academy.hsoub.com/devops/linux/%D8%A7%D9%84%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D8%A7%D8%AE%D8%AA%D9%86%D8%A7%D9%82%D8%A7%D8%AA-%D8%A7%D9%84%D8%A3%D8%AF%D8%A7%D8%A1-%D9%81%D9%8A-%D9%86%D8%B8%D8%A7%D9%85-%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%A3%D8%AF%D9%88%D8%A7%D8%AA-%D9%85%D9%81%D8%AA%D9%88%D8%AD%D8%A9-%D8%A7%D9%84%D9%85%D8%B5%D8%AF%D8%B1-r525/" rel="">التعرف على اختناقات الأداء في نظام لينكس باستخدام الأدوات مفتوحة المصدر</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/devops/linux/%D9%86%D8%B5%D8%A7%D8%A6%D8%AD-%D9%88%D8%AD%D9%8A%D9%84-%D9%84%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D9%86%D8%B8%D8%A7%D9%85-cups-%D9%84%D9%84%D8%B7%D8%A8%D8%A7%D8%B9%D8%A9-%D9%81%D9%8A-%D9%84%D9%8A%D9%86%D9%83%D8%B3-r556/" rel="">نصائح وحيل لاستخدام نظام CUPS للطباعة في لينكس </a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/devops/linux/%D8%AA%D8%B9%D8%AF%D9%8A%D9%84-%D8%A7%D9%84%D8%B5%D9%88%D8%B1-%D9%88%D8%A7%D9%84%D8%AA%D9%84%D8%A7%D8%B9%D8%A8-%D8%A8%D9%87%D8%A7-%D8%B9%D8%A8%D8%B1-%D8%B3%D8%B7%D8%B1-%D8%A7%D9%84%D8%A3%D9%88%D8%A7%D9%85%D8%B1-%D9%81%D9%8A-%D9%84%D9%8A%D9%86%D9%83%D8%B3-r555/" rel="">تعديل الصور والتلاعب بها عبر سطر الأوامر في لينكس </a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/devops/linux/%D8%A7%D9%84%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D8%A7%D8%AE%D8%AA%D9%86%D8%A7%D9%82%D8%A7%D8%AA-%D8%A7%D9%84%D8%A3%D8%AF%D8%A7%D8%A1-%D9%81%D9%8A-%D9%86%D8%B8%D8%A7%D9%85-%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%A3%D8%AF%D9%88%D8%A7%D8%AA-%D9%85%D9%81%D8%AA%D9%88%D8%AD%D8%A9-%D8%A7%D9%84%D9%85%D8%B5%D8%AF%D8%B1-r525/" rel="">التعرف على اختناقات الأداء في نظام لينكس باستخدام الأدوات مفتوحة المصدر</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/devops/linux/%D9%81%D9%8A%D8%AF%D9%8A%D9%88-%D8%A7%D9%84%D8%A3%D8%B0%D9%88%D9%86%D8%A7%D8%AA-%D9%81%D9%8A-%D9%86%D8%B8%D8%A7%D9%85-%D9%84%D9%8A%D9%86%D9%83%D8%B3-r425/" rel="">[فيديو] الأذونات في نظام لينكس</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">557</guid><pubDate>Tue, 23 Nov 2021 17:02:00 +0000</pubDate></item><item><title>&#x646;&#x635;&#x627;&#x626;&#x62D; &#x648;&#x62D;&#x64A;&#x644; &#x644;&#x627;&#x633;&#x62A;&#x62E;&#x62F;&#x627;&#x645; &#x646;&#x638;&#x627;&#x645; CUPS &#x644;&#x644;&#x637;&#x628;&#x627;&#x639;&#x629; &#x641;&#x64A; &#x644;&#x64A;&#x646;&#x643;&#x633;</title><link>https://academy.hsoub.com/devops/linux/%D9%86%D8%B5%D8%A7%D8%A6%D8%AD-%D9%88%D8%AD%D9%8A%D9%84-%D9%84%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D9%86%D8%B8%D8%A7%D9%85-cups-%D9%84%D9%84%D8%B7%D8%A8%D8%A7%D8%B9%D8%A9-%D9%81%D9%8A-%D9%84%D9%8A%D9%86%D9%83%D8%B3-r556/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2021_12/61ae003792c04_02-CUPS-0-0-0-0-0-0(1).png.9c3e99533e39b2819a34dc691dff4c2d.png" /></p>

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

<p>
	سابقًا كان الأمر ممكنا في حال كنت تعمل لدى منظمة لديها <a href="https://academy.hsoub.com/entrepreneurship/planning/%d8%a7%d9%84%d9%85%d9%82%d8%a7%d9%8a%d9%8a%d8%b3-%d8%a7%d9%84%d8%ae%d9%85%d8%b3%d8%a9-%d8%a7%d9%84%d8%a3%d9%87%d9%85-%d9%81%d9%8a-%d8%aa%d9%82%d9%8a%d9%8a%d9%85-%d8%a3%d8%af%d8%a7%d8%a1-%d9%81%d8%b1%d9%8a%d9%82-%d8%a7%d9%84%d8%af%d8%b9%d9%85-%d8%a7%d9%84%d9%81%d9%86%d9%8a-%d9%81%d9%8a-%d8%b4%d8%b1%d9%83%d8%aa%d9%83-%d8%a7%d9%84%d9%86%d8%a7%d8%b4%d8%a6%d8%a9-r245/" rel="">فريق دعم فني</a> لإعدادها ويوجد العتاد المخصص لذلك أو حتى خادم خاص للطباعة، إذ كانت هناك العديد من المعايير والبروتوكولات المختلفة للتعامل مع الطابعات، وجزء صغير من الباعة الكبار (عادةً الذين يستخدمون يونكس) يقدمون دعمًا متخصصًا وبرامج تشغيل لجميع منتجاتها.
</p>

<p>
	لكن إذا أراد أحد المهتمين <a href="https://academy.hsoub.com/entrepreneurship/general/%d9%85%d8%a7-%d9%8a%d9%85%d9%83%d9%86-%d8%a3%d9%86-%d9%8a%d8%aa%d8%b9%d9%84%d9%91%d9%8e%d9%85%d9%87-%d8%b9%d8%a7%d9%84%d9%85-%d8%a7%d9%84%d8%a3%d8%b9%d9%85%d8%a7%d9%84-%d9%85%d9%86-%d8%a7%d9%84%d9%85%d8%b5%d8%a7%d8%af%d8%b1-%d8%a7%d9%84%d9%85%d9%81%d8%aa%d9%88%d8%ad%d8%a9-r54/" rel="">بالمصادر مفتوحة</a> اقتناء طابعة منزلية تعمل على توزيعة <a href="https://academy.hsoub.com/devops/linux/%D9%85%D8%A7-%D9%87%D9%88-%D9%86%D8%B8%D8%A7%D9%85-%D8%A7%D9%84%D8%AA%D8%B4%D8%BA%D9%8A%D9%84-%D9%84%D9%8A%D9%86%D9%83%D8%B3%D8%9F-r451/" rel="">لينكس</a> المفضلة لديه، كان لذلك قصة أخرى، فكان عليه أن يقضي الكثير من الوقت على المنتديات، أو مجموعات الأخبار، أو حتى على نظام دردشة IRC (هل تتذكر أسلاف شبكات التواصل والمحادثة تلك؟) وهو يسأل عن الطابعات التي يسهل تنصيب برامج التشغيل الخاصة بها على لينكس.
</p>

<p>
	أُصدرت أول نسخة من نظام <a href="https://www.cups.org/" rel="external nofollow">CUPS</a> في عام 1999، من قبل شركة Easy Software Products، وهو اختصارًا لنظام الطباعة المشترك ليونكس Common Unix Printing System، تبنت النظام حينها معظم توزيعات لينكس الشهيرة وعينته كنظام الطباعة الافتراضي فيها. كان سبب النجاح الكبير لهذا النظام هو كونه معيارًا واحدًا قادر على التعامل مع عدة طابعات وبروتوكولات مختلفة .
</p>

<p>
	لكن إذا لم تقم شركة الطابعة بتوفير محرك CUPS (برنامج تعريفي على نظام CUPS) لطابعتها، فسيكون من الصعب أو يستحيل جعلها تعمل، لكن بعض الأشخاص الأذكياء وظفوا الهندسة العكسية لحل تلك المشكلة. وكانت هناك بعض الطابعات تستطيع العمل مع هذا النظام مباشرةً، وهي تلك التي تدعم بوست سكربت PostScript وبروتوكول الطباعة عبر الانترنت Internet Printing Protocol (يختصر إلى IPP).
</p>

<h2>
	تبني آبل لنظام الطباعة CUPS
</h2>

<p>
	في بدايات الألفية الثانية كانت شركة أبل تعاني لبناء نظام طباعة جديد لنظامها الحديث Mac OS X فقررت آنذاك في شهر آذار عام 2002 توفير الوقت من خلال تبني CUPS داخل نظام تشغيلها الرئيسي.
</p>

<p>
	لا أحد من شركات الطابعات تمكن من تجاهل الحصة السوقية لأجهزة شركة أبل، لذا أصبح الكثير من برامج تشغيل الطابعات الجديدة لأنظمة Mac OS X تدعم CUPS، مرورًا بمعظم الشركات ومنتجاتها، من تصميم بصري، وطباعة الصور.
</p>

<p>
	أصبحت CUPS مهمة للغاية بالنسبة لآبل التي اشترت البرمجية من Easy Software Products عام 2007؛ ومنذ ذلك الحين وأبل مستمرة في دعم وتطوير ما أصبح <a href="https://academy.hsoub.com/entrepreneurship/general/%D9%86%D8%B8%D8%B1%D8%A9-%D8%B9%D9%84%D9%89-%D8%A7%D9%84%D9%85%D8%B3%D8%A7%D8%A6%D9%84-%D8%A7%D9%84%D9%82%D8%A7%D9%86%D9%88%D9%86%D9%8A%D8%A9-%D9%88%D8%A7%D9%84%D8%A3%D8%AE%D9%84%D8%A7%D9%82%D9%8A%D8%A9-%D9%81%D9%8A-%D8%B1%D9%8A%D8%A7%D8%AF%D8%A9-%D8%A7%D9%84%D8%A3%D8%B9%D9%85%D8%A7%D9%84-r700/" rel="">ملكيتها الفكرية</a>.
</p>

<h2>
	ما علاقة كل هذا بجنو/لينكس؟
</h2>

<p>
	في حين أن آبل ضمنت CUPS داخل نظام MacOS X، كان قد استخدم بشكل افتراضي في العديد من التوزيعات ومتاحًا لمعظم التوزيعات الأخرى. لكن القليل من برامج التشغيل المخصصة كانت متاحة، ما يعني أنهم لم يكونوا مصنفين ومحزّمين ك "مخصص لجنو/لينكس".
</p>

<p>
	بمجرد أن أصبحت محركات CUPS متاحة داخل نظام MacOS X، انتشرت طريقة بين محبي جنو/لينكس وهي تنزيل ملفات المحركات واستخراج ملفات PPD منها، ثم تجربتها مع طابعتك.
</p>

<p>
	هذا كان سحر CUPS: إن توفر محرك تشغيل، فهو غالبًا سيعمل على جميع أنظمة التشغيل التي تستخدم CUPS للطباعة، طالما أنه يستخدم بروتوكول مدعوم (مثل IPP). هكذا بدأت تتوفر برامج تشغيل الطابعات لجنو/لينكس.
</p>

<h2>
	انتشار دعم CUPS
</h2>

<p>
	أدرك بائعي الطابعات بعد ذلك كله أنه من السهل توفير برامج تشغيل لأنظمة جنو/لينكس بعد أن قاموا بتطويرها لدعم ماك. حاليًا من السهل إيجاد برنامج تشغيل لجنو/لينكس خاص بطابعة ما حتى الحديثة منها. بعض التوزيعات تتضمن <a href="https://academy.hsoub.com/devops/linux/%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D8%A5%D8%AF%D8%A7%D8%B1%D8%A9-%D8%A7%D9%84%D8%AD%D8%B2%D9%85-apt-%D8%8Cyum-%D8%8Cdnf-%D8%8Cpkg-r231/" rel="">حزم</a> تحتوي على الكثير من برامج التشغيل، ومعظم العلامات التجارية تقدم برامج تشغيل مخصصة أحيانا عبر تقديمها داخل حزمة، وأحيانا أخرى مع ملف PPD في ملف مضغوط.
</p>

<p>
	تطبيقات متقدمة للتحكم بالطابعة متوفرة أيضًا، بعضها رسمي، وبعضها غير رسمي، مما يجعل بالإمكان على سبيل المثال مراقبة مستويات الحبر أو تنظيف رؤوس الطباعة.
</p>

<p>
	في بعض الحالات، يكون تثبيت طابعة على جنو/لينكس أسهل حتى من تثبيتها على أنظمة التشغيل الأخرى. خصوصًا مع التوزيعات التي تستخدم <a href="https://academy.hsoub.com/devops/servers/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%B6%D8%A8%D8%B7-%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF%D8%A7%D8%AA-%D8%A7%D9%84%D8%B4%D8%A8%D9%83%D8%A7%D8%AA-%D8%B9%D9%84%D9%89-%D8%AE%D8%A7%D8%AF%D9%88%D9%85-%D8%A3%D9%88%D8%A8%D9%86%D8%AA%D9%88-r160/" rel="">الشبكات بدون إعداد</a> (مثل بونجور Bonjour، أفاهي Avahi) للاستكشاف التلقائي ومشاركة الطابعات عبر الشبكة.
</p>

<h2>
	حيل ونصائح
</h2>

<ul>
<li>
		تثبيت طابعة PDF: تثبيت طابعة PDF على جنو/لينكس سهل للغاية فقط ابحث عن حزمة <code>cups-pdf</code> على توزيعتك المفضلة وثبتها، إن لم تُنشئ الحزمة طابعة PDF تلقائيا، يمكنك إضافة واحدة من إعدادات النظام لتتمكن من طباعة ملفات PDF من خلال أي تطبيق.
	</li>
	<li>
		الوصول لواجهة الويب الخاصة بنظام CUPS: إذا كانت الواجهة الافتراضية لإدارة الطابعات لديك لا تعمل أو لا تعجبك، فاستخدم متصفح الويب واذهب إلى العنوان <a href="http://localhost:631/admin" rel="external nofollow">http://localhost:631/admin</a>. بإمكانك إدارة كل الطابعات المنصبة على حاسوبك، ضبط الإعدادات الخاصة بهم، وحتى إضافة طابعة جديدة كل ذلك عبر واجهة الويب تلك. قد تكون الواجهة متاحة على الحواسيب الأخرى المتصلة بشبكتك المحلية في هذه الحالة فقط قم بتغيير اسم النطاق localhost باسم مضيف الآخر أو عنوان الآي بي <a href="https://academy.hsoub.com/devops/networking/%D8%B4%D8%A8%D9%83%D8%A9-%D8%A7%D9%84%D8%A5%D9%86%D8%AA%D8%B1%D9%86%D8%AA-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%A8%D8%B1%D9%88%D8%AA%D9%88%D9%83%D9%88%D9%84-ip-r497/" rel="">IP</a> الخاص به.
	</li>
	<li>
		التأكد من مستوى الحبر: إن كانت طابعتك من إحدى الأنواع التالية: Epson ،Canon ،HP، Sony. فبإمكانك رؤية مستوى الحبر عبر تطبيق بسيط. ابحث عن الحزمة <code>ink</code> في مستودعات حزمة نظام التشغيل لديك.
	</li>
	<li>
		المشاركة في تطوير CUPS: كحال العديد من المشاريع مفتوحة المصدر، CUPS يتم تطويره من خلال جيت هاب Github. قم بزيارة موقع <a href="https://www.cups.org/" rel="external nofollow">CUPS</a> وقسم <a href="https://github.com/apple/cups/issues" rel="external nofollow">المشاكل في GitHub</a> لتتعرف على كيفية المساهمة في التطوير.
	</li>
</ul>
<h2>
	رخصة CUPS
</h2>

<p>
	في بادئ الأمر تم اصدار CUPS تحت رخصة GPLv2 فمن غير المؤكد لماذا لكن ربما لجعل توزيعها أسهل داخل جنو/لينكس أو ربما كان ذلك شائعا بين المشاريع مفتوحة المصدر في ذاك الوقت.
</p>

<p>
	لاحقا في شهر نوفمبر عام 2017 قررت شركة أبل تغيير الرخصة إلى Apache 2.0. العديد من المراقبين علّق أن ذلك يتماشى مع استراتيجية الشركة لنقل الملكية الفكرية لمشاريعها مفتوحة المصدر إلى تراخيص تتماشى مع عمل الشركة في حين يمكن أن ينتج هذا التغيير في الرخصة مشاكل في تضمين CUPS داخل جنو/لينكس، لكنه ما زال متوفرًا في معظم التوزيعات.
</p>

<h2>
	في الختام
</h2>

<p>
	تم إصدار CUPS في عام 1999، علينا شكر جميع من ساهم في نجاح هذا المشروع مفتوح المصدر، من مبرمجيه الأوائل، لمطوري برامج التشغيل، وصولًا للعاملين على صيانته حاليًا.
</p>

<p>
	في المرة القادمة التي تطبع فيها مستخدمًا نظام التشغيل جنو/لينكس المفضل لديك، تذكر أن تقول "شكرًا" لكل من عمل على لنظام CUPS.
</p>

<p>
	شركة أبل غير مشهورة بمساهماتها في مجال البرامج مفتوحة المصدر، لكن إن أمعنت النظر (مثلا إلى <a href="https://opensource.apple.com/" rel="external nofollow">إصدارات آبل المفتوحة المصدر</a> و<a href="https://developer.apple.com/opensource/" rel="external nofollow">التطوير مفتوح المصدر</a>)، فسوف تلاحظ كمّ المكونات مفتوحة المصدر في أنظمة تشغيل وبرامج آبل.
</p>

<p>
	ترجمة -وبتصرف- للمقال <a href="https://opensource.com/article/19/1/cups-printing-linux" rel="external nofollow">Tips and tricks for using CUPS for printing with Linux</a> لصاحبه Antoine Thomas.
</p>

<h2>
	 اقرأ أيضًا
</h2>

<ul>
<li>
		<a href="https://academy.hsoub.com/devops/linux/%D8%AA%D8%B9%D8%AF%D9%8A%D9%84-%D8%A7%D9%84%D8%B5%D9%88%D8%B1-%D9%88%D8%A7%D9%84%D8%AA%D9%84%D8%A7%D8%B9%D8%A8-%D8%A8%D9%87%D8%A7-%D8%B9%D8%A8%D8%B1-%D8%B3%D8%B7%D8%B1-%D8%A7%D9%84%D8%A3%D9%88%D8%A7%D9%85%D8%B1-%D9%81%D9%8A-%D9%84%D9%8A%D9%86%D9%83%D8%B3-r555/" rel="">تعديل الصور والتلاعب بها عبر سطر الأوامر في لينكس </a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/devops/linux/%D8%A7%D9%84%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D8%A7%D8%AE%D8%AA%D9%86%D8%A7%D9%82%D8%A7%D8%AA-%D8%A7%D9%84%D8%A3%D8%AF%D8%A7%D8%A1-%D9%81%D9%8A-%D9%86%D8%B8%D8%A7%D9%85-%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%A3%D8%AF%D9%88%D8%A7%D8%AA-%D9%85%D9%81%D8%AA%D9%88%D8%AD%D8%A9-%D8%A7%D9%84%D9%85%D8%B5%D8%AF%D8%B1-r525/" rel="">التعرف على اختناقات الأداء في نظام لينكس باستخدام الأدوات مفتوحة المصدر</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/devops/linux/%D9%81%D9%8A%D8%AF%D9%8A%D9%88-%D8%A7%D9%84%D8%A3%D8%B0%D9%88%D9%86%D8%A7%D8%AA-%D9%81%D9%8A-%D9%86%D8%B8%D8%A7%D9%85-%D9%84%D9%8A%D9%86%D9%83%D8%B3-r425/" rel="">[فيديو] الأذونات في نظام لينكس</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">556</guid><pubDate>Wed, 17 Nov 2021 17:00:00 +0000</pubDate></item><item><title>&#x62A;&#x639;&#x62F;&#x64A;&#x644; &#x627;&#x644;&#x635;&#x648;&#x631; &#x648;&#x627;&#x644;&#x62A;&#x644;&#x627;&#x639;&#x628; &#x628;&#x647;&#x627; &#x639;&#x628;&#x631; &#x633;&#x637;&#x631; &#x627;&#x644;&#x623;&#x648;&#x627;&#x645;&#x631; &#x641;&#x64A; &#x644;&#x64A;&#x646;&#x643;&#x633;</title><link>https://academy.hsoub.com/devops/linux/%D8%AA%D8%B9%D8%AF%D9%8A%D9%84-%D8%A7%D9%84%D8%B5%D9%88%D8%B1-%D9%88%D8%A7%D9%84%D8%AA%D9%84%D8%A7%D8%B9%D8%A8-%D8%A8%D9%87%D8%A7-%D8%B9%D8%A8%D8%B1-%D8%B3%D8%B7%D8%B1-%D8%A7%D9%84%D8%A3%D9%88%D8%A7%D9%85%D8%B1-%D9%81%D9%8A-%D9%84%D9%8A%D9%86%D9%83%D8%B3-r555/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2021_12/61adfff4b4f58_01_________-0-0-0-0-0.png.7fa2f86d2199ac46b9683a830f346303.png" /></p>

<p>
	سنشرح في هذا المقال كيفية استخدام الحزمة ImageMagick للتعديل على مقاس الصور وحجمها وحتى دمجها معًا والتعديل عليها كإضافة إطار، فالأداة ImageMagick هي أداة متعددة المهام تمكنك من التعديل على الصور عبر سطر الأوامر. في حين يمكنك استخدام برامج سطح المكتب العديدة للتعديل على الصور مثل <a href="https://academy.hsoub.com/design/graphic/gimp/%D9%86%D8%B8%D8%B1%D8%A9-%D8%B9%D8%A7%D9%85%D8%A9-%D8%B9%D9%84%D9%89-%D8%B5%D9%8A%D8%BA-%D8%A7%D9%84%D8%B5%D9%88%D8%B1-%D8%A7%D9%84%D9%85%D8%B3%D8%AA%D8%AE%D8%AF%D9%85%D8%A9-%D9%81%D9%8A-%D8%AC%D9%8A%D9%85%D8%A8-r405/" rel="">GIMP</a> أو GLIMPSE أو <a href="https://academy.hsoub.com/design/graphic/photoshop/" rel="">Photoshop</a>، لكن أحيانًا يكون من الأسهل والأسرع الاستعانة بأحد أدوات حزمة ImageMagick، بالإضافة لكونها تدعم مجموعة متنوعة من صيغ الصور، من ضمنها صور JPG وPNG.
</p>

<h2>
	تثبيت ImageMagick على لينكس
</h2>

<p>
	يمكنك تثبيت ImageMagick في <a href="https://academy.hsoub.com/devops/linux/%D9%85%D8%A7-%D9%87%D9%88-%D9%86%D8%B8%D8%A7%D9%85-%D8%A7%D9%84%D8%AA%D8%B4%D8%BA%D9%8A%D9%84-%D9%84%D9%8A%D9%86%D9%83%D8%B3%D8%9F-r451/" rel="">نظام التشغيل لينكس</a> باستخدام مدير الحزم المتوفر لديك.
</p>

<p>
	مثال، على التوزيعات المشابهة لفيدورا تنفذ الأمر:
</p>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_4828_6" style="">
<span class="pln">$ sudo dnf install imagemagick</span></pre>

<p>
	على التوزيعات المشابهة لديبيان يكون أمر التثبيت كالتالي:
</p>

<pre class="ipsCode prettyprint prettyprinted" id="ips_uid_4828_8" style="">
<span class="pln">$ sudo apt install imagemagick</span></pre>

<p>
	أما على نظام ماك فاستخدم MacPorts أو Homebrew وعلى <a href="https://academy.hsoub.com/apps/windows/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-windows-10-r172/" rel="">نظام ويندوز</a>، استخدم Chocolatey.
</p>

<h2>
	تصميم شبكة من الصور
</h2>

<p>
	كثيرا ما أجد نفسي أعدل على الصور قبل نشرها، لنفرض أن لدي عدة صور للقطات شاشة وأريد نشرها على شكل شبكة من الصور، للقيام بذلك استخدم الأمر <code>montage</code> من حزمة ImageMagick.
</p>

<p>
	الصيغة العامة للأمر <code>montage</code> هي كالتالي:
</p>

<pre class="ipsCode prettyprint lang-ruby prettyprinted" id="ips_uid_4828_10" style="">
<span class="pln">montage </span><span class="pun">{</span><span class="pln">input</span><span class="pun">}</span><span class="pln"> </span><span class="pun">{</span><span class="pln">actions</span><span class="pun">}</span><span class="pln"> </span><span class="pun">{</span><span class="pln">output</span><span class="pun">}</span></pre>

<p>
	في حالتي لدي صور لقطات الشاشة جميعها بنفس القياس: 320×240 بكسل، ولإنشاء شبكة مؤلفة من ستة صور صورتين عرضًا وثلاثة طولًا، يمكنني استخدام الأمر السابق كالتالي:
</p>

<pre class="ipsCode prettyprint prettyprinted" id="ips_uid_4828_12" style="">
<span class="pln">$ montage acronia</span><span class="pun">.</span><span class="pln">png \
ascii</span><span class="pun">-</span><span class="pln">table</span><span class="pun">.</span><span class="pln">png \
music</span><span class="pun">.</span><span class="pln">png \
programming</span><span class="pun">-</span><span class="pln">chess</span><span class="pun">.</span><span class="pln">png \
petra</span><span class="pun">.</span><span class="pln">png \
amb</span><span class="pun">.</span><span class="pln">png \
</span><span class="pun">-</span><span class="pln">tile </span><span class="lit">2x3</span><span class="pln"> </span><span class="pun">-</span><span class="pln">geometry </span><span class="pun">+</span><span class="lit">1</span><span class="pun">+</span><span class="lit">1</span><span class="pln"> \ 
screenshot</span><span class="pun">-</span><span class="pln">montage</span><span class="pun">.</span><span class="pln">png</span></pre>

<p>
	سينتج صورةً واحدةً مؤلفةً من لقطات الشاشة الستة، مع إطار فاصل حول كل صورة بعرض واحد بكسل، بالحساب يتبيّن أن قياس الصورة الناتجة سيكون 644 بكسل عرضًا و726 بكسل طولًا.
</p>

<p>
	لاحظ ترتيب الصور، إذ يقوم الأمر <code>montage</code> في ImageMagick بترتيب الصور من اليسار إلى اليمين ومن الأعلى إلى الأسفل.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="83235" href="https://academy.hsoub.com/uploads/monthly_2021_11/screenshot-montage_0.png.e5949562d6c303444038d80b464d769d.png" rel=""><img alt="screenshot-montage_0.png" class="ipsImage ipsImage_thumbnailed" data-fileid="83235" data-unique="ovnm5yqw2" src="https://academy.hsoub.com/uploads/monthly_2021_11/screenshot-montage_0.thumb.png.24810944b8f7e1d5f5b94f3f525725a7.png"></a>
</p>

<p>
	في مثالي هذا، في الصف الأول من الصور ومن اليسار تظهر صورة اللعبة مفتوحة المصدر 2D shooter Acronia، وبجانبها صورة جدول محارف ASCII، وفي الصف الأوسط صورة مشغل موسيقى مفتوح المصدر وبجانبه صورة مثال برمجي للعبة شطرنج، وفي الصف الثالث والأخير تظهر صورة لعبة Post Apocalyptic Petra مفتوحة المصدر وبجانبها صورة FreeDOS AMB مساعد القراءة.
</p>

<h2>
	تعديل مقاس الصور
</h2>

<p>
	عادةً ما أقوم باستخدام ImageMagick على خادم الويب الخاص بي لتعديل قياس الصور، لنفرض مثلا أنّي أريد تضمين صورة لقططي على موقعي الالكتروني. الصورة التي التقطتها عبر كاميرا الهاتف حجمها كبير جدًا حوالي 4000×3000 بكسل بحجم 3.3 ميغابايت. هذا الحجم كبير جدًا بالنسبة لصفحة ويب. في هذه الحالة استخدم أداة التحويل <code>convert</code> من حزمة ImageMagick لتصغير قياس الصورة وبالتالي تقليل حجمها لأستطيع تضمينها ضمن صفحة الويب دون التأثير على سرعة تحميل الصفحة.
</p>

<p>
	تحوي ImageMagick حزمة أدوات متكاملة أشهرها الأمر <code>convert</code> الصيغة العامة لاستخدامه هي كالتالي:
</p>

<pre class="ipsCode">
convert {input} {actions} {output}
</pre>

<p>
	لتعديل حجم صورة اسمها PXL_20210413_015045733.jpg إلى قياس أكثر ملائمة 500 بكسل عرضًا نستخدم الأمر كالتالي:
</p>

<pre class="ipsCode prettyprint lang-css prettyprinted" id="ips_uid_4828_16" style="">
<span class="pln">$ convert PXL_20210413_015045733</span><span class="pun">.</span><span class="pln">jpg </span><span class="pun">-</span><span class="pln">resize </span><span class="lit">500x</span><span class="pln"> sleeping</span><span class="pun">-</span><span class="pln">cats</span><span class="pun">.</span><span class="pln">jpg</span></pre>

<p>
	الصورة الجديدة الناتجة أصبح حجمها 65 كيلو بايت فقط.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="83236" href="https://academy.hsoub.com/uploads/monthly_2021_11/sleeping-cats.jpg.78ba4fd2650e3cf10b260e501bbc78b2.jpg" rel=""><img alt="sleeping-cats.jpg" class="ipsImage ipsImage_thumbnailed" data-fileid="83236" data-unique="ytr04atb7" src="https://academy.hsoub.com/uploads/monthly_2021_11/sleeping-cats.jpg.78ba4fd2650e3cf10b260e501bbc78b2.jpg"></a>
</p>

<p>
	يمكنك تحديد كِلا البعدين لقياس الصورة الناتجة عبر تمرير قيمة العرض والطول إلى الخيار <code>resize-</code> لكن عند تحديد العرض فقط فإن ImageMagick ستقوم بحسابته وتحديد الطول تلقائيا للمحافظة على نسبة الطول إلى العرض وتضمن في هذه الحالة عدم تشوه الصورة.
</p>

<h2>
	أتمتة معالجة الصور في Bash
</h2>

<p>
	يمكن لنص برمجي (سكربت باش) يستخدم أدوات ImageMagick أن يجعل من تحضير الصور للنشر أمرًا سريعًا وسهلًا. لا يتعامل الكتّاب مع الكلمات فقط، إنما مع الصور أيضًا. من متطلبات الكتابة التقنية عرض الكثير من لقطات الشاشة لتوضيح العمليات والتقنيات المستخدمة. فقد تختلف متطلبات منصات النشر من حيث حجم وصيغة الصور المطلوبة.
</p>

<p>
	باعتباري مستشار تقني ومهندس أنظمة، كتبت العديد من التوثيقات للعملاء، عادة بصيغة <a href="https://academy.hsoub.com/apps/productivity/office/microsoft-word/" rel="">مايكروسوفت وورد (doc.)</a> باعتبارها الصيغة المطلوبة. يمكن لأي مستند أن يزداد حجمه كلما تم إضافة المحتوى إليه خصوصًا إن كان بالمحتوى صور كثيرة. في الماضي أغلب لقطات الشاشة كانت بصيغة (bmp.)، والتي يمكن أن تكون بأحجام كبيرة جدًا، فمثلًا مستند لشرح طريقة تثبيت نظام تشغيل على الخادم سيكون حجمه كبيرًا جدًا.
</p>

<p>
	<a href="https://academy.hsoub.com/apps/web/%D8%AF%D9%84%D9%8A%D9%84%D9%83-%D8%A7%D9%84%D8%B4%D8%A7%D9%85%D9%84-%D9%84%D9%80%D8%AA%D8%AD%D8%B3%D9%8A%D9%86-%D8%A3%D8%AF%D8%A7%D8%A1-%D8%A7%D9%84%D8%B5%D9%88%D8%B1-%D8%B9%D9%84%D9%89-%D9%85%D9%88%D9%82%D8%B9%D9%83-%E2%80%93-%D8%A7%D9%84%D8%AC%D8%B2%D8%A1-1-r88/" rel="">تحسين الصور</a> بتصغير حجمها مع الحفاظ على وضوح المحتوى وقابلية القراءة للنصوص في الصورة كان عملًا مرهقًا. كان يمكن تحويل ملفات Bitmap إلى jpeg ولاحقًا إلى png. استمرت الصعوبة في التعديل حتى عندما انتقلت لاحقًا من استخدام حزمة الأوفيس إلى <a href="https://academy.hsoub.com/apps/productivity/liberoffice/%D9%85%D9%82%D8%AF%D9%85%D8%A9-%D8%A5%D9%84%D9%89-%D8%AD%D8%B2%D9%85%D8%A9-%D8%A3%D8%AF%D9%88%D8%A7%D8%AA-%D8%A7%D9%84%D9%85%D9%83%D8%AA%D8%A8-%D8%A7%D9%84%D8%AD%D8%B1-libreoffice-r1//" rel="">LibreOffice</a>. لحسن الحظ أغلب أدوات التقاط الشاشة تقوم بحفظ الصور بصيغ صغيرة الحجم مثل png.
</p>

<p>
	موقع Openscource.com (وأغلب المواقع) يضع قيودًا معينة للصور في مقالاته حتى يجري <a href="https://academy.hsoub.com/marketing/search-engine-optimisation/%D8%AA%D8%AD%D8%B3%D9%8A%D9%86-%D9%85%D8%AD%D8%B1%D9%83%D8%A7%D8%AA-%D8%A7%D9%84%D8%A8%D8%AD%D8%AB-seo-%D9%88%D8%A3%D9%87%D9%85%D9%8A%D8%AA%D9%87-%D9%84%D9%85%D9%88%D9%82%D8%B9%D9%83-%D8%A7%D9%84%D8%A5%D9%84%D9%83%D8%AA%D8%B1%D9%88%D9%86%D9%8A-r490/" rel="">تحسينها لمحركات البحث</a>. قمت بتطوير طريقة سريعة بثلاث خطوات لتجهيز الصور لنشرها في مقالاتي. الخطوة الأولى هي التحضير لالتقاط الصور بذكاء، كأن أقوم بتغيير حجم النافذة أو تغيير نوع الخط أما الخطوتان الإضافيتان أصبحا مكررتين جدًا، وهما التأكد أن الصورة لن تزيد على 600 بكسل عرضًا وتطبيق إطار حول الصورة.
</p>

<h3>
	النص البرمجي prepimg.sh
</h3>

<p>
	قمت بكتابة نص البرمجي أو سكربت في <a href="https://wiki.hsoub.com/Bash" rel="external">Bash</a> يدعى prepimg.sh لتولي تلك المهام، وهو يستخدم أداتين من حزمة <a href="https://imagemagick.org/index.php" rel="external nofollow">ImageMagick</a>.
</p>

<h4>
	الخطوة الأولى تعديل قياس الصورة
</h4>

<p>
	أداة التقاط الشاشة تحفظ الصور في المجلد <code>Pictures</code> باسم عام افتراضي مثال <code>Screenshot-20210923222312.png</code>. النص البرمجي <code>prepimg.sh</code> يتحقق من قياس عرض الملفات بالـبكسل في هذا المجلد ويقوم بتعديل قياس أي صورة تزيد عن الحد المسموح. هذه الخطوة تستخدم البرنامج <code>identify</code> من حزمة <code>ImageMagick</code> لتحديد عرض الصورة (w%).
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4828_22" style="">
<span class="pln">$ identify </span><span class="pun">-</span><span class="pln">format </span><span class="pun">%</span><span class="pln">w </span><span class="typ">Screenshot</span><span class="pun">-</span><span class="lit">20210903202655.png</span><span class="pln">
</span><span class="lit">1217</span></pre>

<p>
	تم إسناد قيمة عرض الصورة إلى المتغير <code>w</code> لمقارنته بالحد الأعلى المسموح 600 بكسل. بالإمكان تعديل هذا الحد عبر المتغير <code>MAXWIDTH$</code> فإذا تجاوز العرض قيمة MAXWIDTH، فعندها يتم استدعاء برنامج آخر من حزمة ImageMagick يدعى <code>convert</code> يقوم بتصغير عرض الصورة. التالي تابع من النص البرمجي الذي يقوم بمعالجة الصورة:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4828_20" style="">
<span class="pln">   </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">[</span><span class="pln"> </span><span class="str">"$W"</span><span class="pln"> </span><span class="pun">-</span><span class="pln">gt </span><span class="str">"$MAXWIDTH"</span><span class="pln"> </span><span class="pun">]</span><span class="pln">
     then
         </span><span class="pun">[[</span><span class="pln"> $VERBOSE </span><span class="pun">-</span><span class="pln">gt </span><span class="lit">0</span><span class="pln"> </span><span class="pun">]]</span><span class="pln"> </span><span class="pun">&amp;&amp;</span><span class="pln"> echo </span><span class="str">"${1} is ${W} - reducing"</span><span class="pln">
         convert </span><span class="pun">-</span><span class="pln">resize </span><span class="str">"${MAXWIDTH}"</span><span class="pln"> \
                 </span><span class="str">"${SCREENSHOTS}"</span><span class="pun">/</span><span class="str">"${1}"</span><span class="pln"> \
                 </span><span class="str">"${READY}"</span><span class="pun">/</span><span class="str">"${1}"</span><span class="pln">

     </span><span class="pun">...</span></pre>

<p>
	يتم تصغير حجم الصورة كما ينبغي و حفظها في مختلف محدد باستخدام المتغير <code>READY$</code>. في حالة استخدامي يتم تغيير مقاس الصورة لتصبح 598 بكسل أي أصغر قليلا من الحد المسموح به وذلك لترك مسافة لإضافة للإطار لاحقا.
</p>

<h4>
	الخطوة الثانية إضافة إطار للصورة
</h4>

<p>
	أحيانًا قد تبدو الصورة وكأنها مدمجة مع خلفية <a href="https://academy.hsoub.com/programming/html/html-%D9%88-css-%D9%84%D9%84%D9%85%D8%A8%D8%AA%D8%AF%D8%A6%D9%8A%D9%86-%D9%83%D9%8A%D9%81-%D8%AA%D8%B5%D9%85%D9%85-%D8%A3%D9%88%D9%84-%D8%B5%D9%81%D8%AD%D8%A9-%D9%88%D9%8A%D8%A8-%D9%84%D9%83-r242/" rel="">صفحة الويب</a>. هذا بسبب أن الألوان الواقعة على أطراف الصورة تكون مماثلة لألوان خلفية الصفحة. التالي مثال على ذلك:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="83234" href="https://academy.hsoub.com/uploads/monthly_2021_11/noborder_example.png.7d77f47fdc4384bcea97037895cc29d6.png" rel=""><img alt="noborder_example.png" class="ipsImage ipsImage_thumbnailed" data-fileid="83234" data-unique="53ra1pgfr" src="https://academy.hsoub.com/uploads/monthly_2021_11/noborder_example.png.7d77f47fdc4384bcea97037895cc29d6.png"></a>
</p>

<p style="text-align: center;">
	صورة بدون إطار
</p>

<p>
	كما نلاحظ في الصورة العليا، من المستحيل تحديد أين تقع حدود الصورة. هذه المشكلة غير محصورة باللون الأبيض فحسب بل تعتمد على لون خلفية الصورة ولون خلفية صفحة الويب للموقع فإذا كانت خلفية الموقع باللون الأحمر وحدود الصورة أيضًا حمراء، ستظهر نفس المشكلة، لذلك كتبت أمرًا يعالج هذه المشكلة باستخدام الأداة <code>convert</code> وهو الأمر التالي:
</p>

<pre class="ipsCode">
convert -bordercolor black -border 1 Screenshot-20210903202655.png
</pre>

<p>
	الخيار <code>border-</code> يضيف إطار لكل صورة بمقدار 1 بكسل. يكفي تمرير هذا الخيار لإضافة الإطار، لكنني أريد تحديد لون الإطار أيضا لذا سأستخدم الخيار <code>bordercolor-</code>
</p>

<p>
	الصورة التالية هي نفس الصورة لكن بعد إضافة الإطار، ألا تبدو أوضح الآن؟
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="83233" href="https://academy.hsoub.com/uploads/monthly_2021_11/border_example.png.6d0d72803fc1bd151e9840d88ba8a430.png" rel=""><img alt="border_example.png" class="ipsImage ipsImage_thumbnailed" data-fileid="83233" data-unique="cdp8o51o3" src="https://academy.hsoub.com/uploads/monthly_2021_11/border_example.png.6d0d72803fc1bd151e9840d88ba8a430.png"></a>
</p>

<p style="text-align: center;">
	الصورة بعد إضافة الإطار
</p>

<h4>
	الخطوة الثالثة تجهيز كل الصور
</h4>

<p>
	قمت باستخدام حلقة <code>for</code> للمرور على صور لقطات الشاشة في المجلد الخاص بها، وأقوم باستدعاء التابع <code>process_img</code> لكل ملف، إذ يتولى التابع تعديل عرض الصورة وإضافة الإطار وأيضا يقوم بالتحقق فيما إذا كان الملف الذي يتعامل معه حاليا هو ملف صورة.
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4828_24" style="">
<span class="pln">process_img</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
     </span><span class="pun">#</span><span class="pln"> verify that file is an image file</span><span class="pun">,</span><span class="pln"> and then </span><span class="kwd">get</span><span class="pln"> dimensions
     </span><span class="kwd">if</span><span class="pln"> file </span><span class="str">"${SCREENSHOTS}"</span><span class="pun">/</span><span class="str">"${1}"</span><span class="pln"> </span><span class="pun">|</span><span class="pln"> grep </span><span class="pun">-</span><span class="pln">qE </span><span class="str">'image|bitmap'</span><span class="pun">;</span><span class="pln"> then
         </span><span class="pun">[[</span><span class="pln"> $VERBOSE </span><span class="pun">-</span><span class="pln">gt </span><span class="lit">0</span><span class="pln"> </span><span class="pun">]]</span><span class="pln"> </span><span class="pun">&amp;&amp;</span><span class="pln"> echo </span><span class="str">"${1} is an image"</span><span class="pln">
         W</span><span class="pun">=</span><span class="pln">$</span><span class="pun">(</span><span class="pln">identify </span><span class="pun">-</span><span class="pln">format </span><span class="pun">%</span><span class="pln">w </span><span class="str">"${SCREENSHOTS}"</span><span class="pun">/</span><span class="str">"${1}"</span><span class="pun">)</span><span class="pln">
     </span><span class="kwd">else</span><span class="pln">
         echo </span><span class="str">"File ${SCREENSHOTS}/${1} is not an image."</span><span class="pln">
         W</span><span class="pun">=</span><span class="lit">0</span><span class="pln">
     fi

     </span><span class="pun">#</span><span class="pln"> resize and border
     </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">[</span><span class="pln"> </span><span class="str">"$W"</span><span class="pln"> </span><span class="pun">-</span><span class="pln">gt </span><span class="str">"$MAXWIDTH"</span><span class="pln"> </span><span class="pun">]</span><span class="pln">
     then
         </span><span class="pun">[[</span><span class="pln"> $VERBOSE </span><span class="pun">-</span><span class="pln">gt </span><span class="lit">0</span><span class="pln"> </span><span class="pun">]]</span><span class="pln"> </span><span class="pun">&amp;&amp;</span><span class="pln"> echo </span><span class="str">"${1} is ${W} - reducing"</span><span class="pln">
         convert </span><span class="pun">-</span><span class="pln">resize </span><span class="str">"${MAXWIDTH}"</span><span class="pln"> \
                 </span><span class="pun">-</span><span class="pln">bordercolor $BORDER \
                 </span><span class="pun">-</span><span class="pln">border </span><span class="lit">1</span><span class="pln"> \
                 </span><span class="str">"${SCREENSHOTS}"</span><span class="pun">/</span><span class="str">"${1}"</span><span class="pln"> \
                 </span><span class="str">"${READY}"</span><span class="pun">/</span><span class="str">"${1}"</span><span class="pln">
     </span><span class="kwd">else</span><span class="pln">
         convert </span><span class="pun">-</span><span class="pln">bordercolor $BORDER \
                 </span><span class="pun">-</span><span class="pln">border </span><span class="lit">1</span><span class="pln"> \
                 </span><span class="str">"${SCREENSHOTS}"</span><span class="pun">/</span><span class="str">"${1}"</span><span class="pln"> \
                 </span><span class="str">"${READY}"</span><span class="pun">/</span><span class="str">"${1}"</span><span class="pln">
     fi
 </span><span class="pun">}</span></pre>

<p>
	الخطوة الأخيرة للنص البرمجي هي حفظ ملف الصورة المُعالَج في مجلد فرعي اسمه <code>Ready</code>، والمحدد من قبل المتحول المسمى <code>READY$</code> وهذه الخطوة تضمن الإبقاء على ملف الصورة الأصلي للاستخدام لاحقًا.
</p>

<h4>
	الخطوة الرابعة تجهيز البرنامج
</h4>

<p>
	الملف <code>Prepimg.sh</code> يتضمن أيضا شرحًا للخيارات التي يمكن استخدامها معه:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_4828_26" style="">
<span class="pln">$ prepimg</span><span class="pun">.</span><span class="pln">sh </span><span class="pun">-</span><span class="pln">h
prepimg</span><span class="pun">.</span><span class="pln">sh </span><span class="typ">Version</span><span class="pln"> </span><span class="lit">0.7</span><span class="pln"> </span><span class="pun">-</span><span class="pln"> written by </span><span class="typ">Alan</span><span class="pln"> </span><span class="typ">Formy</span><span class="pun">-</span><span class="typ">Duval</span><span class="pln">
prepimg</span><span class="pun">.</span><span class="pln">sh </span><span class="pun">[</span><span class="pln">OPTIONS</span><span class="pun">]</span><span class="pln">
</span><span class="pun">--</span><span class="pln">verbose</span><span class="pun">,</span><span class="pln"> </span><span class="pun">-</span><span class="pln">v </span><span class="typ">Be</span><span class="pln"> verbose
</span><span class="pun">--</span><span class="pln">directory</span><span class="pun">,</span><span class="pln"> </span><span class="pun">-</span><span class="pln">d </span><span class="typ">Screenshot</span><span class="pln"> directory </span><span class="pun">(</span><span class="kwd">default</span><span class="pun">:</span><span class="pln"> </span><span class="str">/home/</span><span class="pln">alan</span><span class="pun">/</span><span class="typ">Pictures</span><span class="pun">/</span><span class="typ">Screenshots</span><span class="pun">)</span><span class="pln">
</span><span class="pun">--</span><span class="pln">ready</span><span class="pun">,</span><span class="pln"> </span><span class="pun">-</span><span class="pln">r </span><span class="typ">Ready</span><span class="pln"> directory </span><span class="pun">(</span><span class="kwd">default</span><span class="pun">:</span><span class="pln"> </span><span class="str">/home/</span><span class="pln">alan</span><span class="pun">/</span><span class="typ">Pictures</span><span class="pun">/</span><span class="typ">Screenshots</span><span class="pun">/</span><span class="typ">Ready</span><span class="pun">)</span><span class="pln">
</span><span class="pun">--</span><span class="pln">border</span><span class="pun">,</span><span class="pln"> </span><span class="pun">-</span><span class="pln">b </span><span class="typ">Border</span><span class="pln"> color </span><span class="pun">(</span><span class="kwd">default</span><span class="pun">:</span><span class="pln"> black</span><span class="pun">)</span></pre>

<p>
	الشفرة المبينة في هذا المقال غير كاملة ويجب اعتبارها شيفرة وهمية. تستطيع مراجعة النص البرمجي كاملًا في مستودع <a href="https://gitlab.com/alanfoss/prepimg" rel="external nofollow">prepimg</a> في <a href="https://academy.hsoub.com/programming/workflow/git/%D9%81%D9%8A%D8%AF%D9%8A%D9%88-%D8%A7%D9%84%D8%A7%D8%AA%D8%B5%D8%A7%D9%84-%D8%A8%D8%AE%D8%AF%D9%85%D8%A9-github-%D8%AF%D9%88%D9%86-%D9%83%D9%84%D9%85%D8%A9-%D8%B3%D8%B1-r661/" rel="">GitHub</a>.
</p>

<p>
	إن كنت تفضل البرمجة النصية باستخدام Bash أو البرمجة بلغات أخرى مثل <a href="https://academy.hsoub.com/programming/c/" rel="">C</a> أو <a href="https://wiki.hsoub.com/Python" rel="external">Python</a>، فالأتمتة ستساعدك بشكل كبير. مرّة تلو الأخرى، أدرك كيف لشيفرة صغيرة أن تخفف من المشاكل مما يسمح لنا الاستفادة من الوقت بشكل أفضل.
</p>

<p>
	ننصحك بالرجوع إلى التوثيق العربي للغة <a href="https://wiki.hsoub.com/Bash" rel="external">Bash</a> أو لغة على موسوعة حسوب لتعلمها وكتابة سكربتات احترافية فيها لأتمتة المهام.
</p>

<h2>
	ختاما
</h2>

<p>
	ImageMagick هي حزمة من الأدوات المفيدة جدًا للتعديل على الصور، بإمكانك الاستفادة من استخدامها في إجراء العديد من العمليات على الصور من تعديل وتصميم. أيضا ستوفر عليك الكثير من الوقت في حال استخدمت أدواتها في أتمتة المهام المتكررة الخاصة بتنسيق الصور وتعديل قياسها وحجمها.
</p>

<p>
	ترجمة -وبتصرّف- للمقالات:
</p>

<ul>
<li>
		<a href="https://opensource.com/article/21/9/photo-montage-imagemagick" rel="external nofollow">Create a photo collage from the Linux command line</a>
	</li>
	<li>
		<a href="https://opensource.com/article/21/9/resize-image-linux" rel="external nofollow">Resize an image from the Linux terminal</a>
	</li>
	<li>
		<a href="https://opensource.com/article/21/10/image-processing-bash-script?utm_campaign=intrel" rel="external nofollow">Automate image processing with this Bash script</a>
	</li>
</ul>
<p>
	لصاحبه Jim Hall.
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
<li>
		<a href="https://academy.hsoub.com/devops/linux/4-%D8%A3%D8%AF%D9%88%D8%A7%D8%AA-%D9%85%D9%81%D8%AA%D9%88%D8%AD%D8%A9-%D8%A7%D9%84%D9%85%D8%B5%D8%AF%D8%B1-%D9%85%D9%86-%D8%A3%D8%AC%D9%84-%D9%85%D8%B1%D8%A7%D9%82%D8%A8%D8%A9-%D9%86%D8%B8%D8%A7%D9%85-%D9%84%D9%8A%D9%86%D9%83%D8%B3-r523/" rel="">4 أدوات مفتوحة المصدر من أجل مراقبة نظام لينكس</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/devops/linux/%D8%A7%D9%84%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D8%A7%D8%AE%D8%AA%D9%86%D8%A7%D9%82%D8%A7%D8%AA-%D8%A7%D9%84%D8%A3%D8%AF%D8%A7%D8%A1-%D9%81%D9%8A-%D9%86%D8%B8%D8%A7%D9%85-%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%A3%D8%AF%D9%88%D8%A7%D8%AA-%D9%85%D9%81%D8%AA%D9%88%D8%AD%D8%A9-%D8%A7%D9%84%D9%85%D8%B5%D8%AF%D8%B1-r525/" rel="">التعرف على اختناقات الأداء في نظام لينكس باستخدام الأدوات مفتوحة المصدر</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/devops/linux/%D9%81%D9%8A%D8%AF%D9%8A%D9%88-%D8%A7%D9%84%D8%A3%D8%B0%D9%88%D9%86%D8%A7%D8%AA-%D9%81%D9%8A-%D9%86%D8%B8%D8%A7%D9%85-%D9%84%D9%8A%D9%86%D9%83%D8%B3-r425/" rel="">[فيديو] الأذونات في نظام لينكس</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">555</guid><pubDate>Sun, 14 Nov 2021 17:00:00 +0000</pubDate></item><item><title>&#x627;&#x644;&#x62A;&#x639;&#x631;&#x641; &#x639;&#x644;&#x649; &#x627;&#x62E;&#x62A;&#x646;&#x627;&#x642;&#x627;&#x62A; &#x627;&#x644;&#x623;&#x62F;&#x627;&#x621; &#x641;&#x64A; &#x646;&#x638;&#x627;&#x645; &#x644;&#x64A;&#x646;&#x643;&#x633; &#x628;&#x627;&#x633;&#x62A;&#x62E;&#x62F;&#x627;&#x645; &#x627;&#x644;&#x623;&#x62F;&#x648;&#x627;&#x62A; &#x645;&#x641;&#x62A;&#x648;&#x62D;&#x629; &#x627;&#x644;&#x645;&#x635;&#x62F;&#x631;</title><link>https://academy.hsoub.com/devops/linux/%D8%A7%D9%84%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D8%A7%D8%AE%D8%AA%D9%86%D8%A7%D9%82%D8%A7%D8%AA-%D8%A7%D9%84%D8%A3%D8%AF%D8%A7%D8%A1-%D9%81%D9%8A-%D9%86%D8%B8%D8%A7%D9%85-%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%A3%D8%AF%D9%88%D8%A7%D8%AA-%D9%85%D9%81%D8%AA%D9%88%D8%AD%D8%A9-%D8%A7%D9%84%D9%85%D8%B5%D8%AF%D8%B1-r525/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2021_08/610656301756f_----------.png.e0df09a3d7d6b3fb171de4f04ea14524.png" /></p>

<p>
	لقد اقتضى التعرّف على مشكلة اختناق العتاد hardware bottlenecks، ضرورة امتلاك خبرات عالية في العديد من المجالات التقنية، وقد أصبح من السهل مؤخرًا كشف هذه المشاكل باستخدام أدوات مراقبة الأداء مفتوحة المصدر ذات الواجهات الرسومية التي تسمح لأي مستخدم بتشخيص المشكلة التي يعاني منها، دون شراء أدوات مكلفة، ودون الحاجة إلى تعلّم الأوامر المعقدة.
</p>

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

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

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

<p>
	تجعل الأدوات ذات الواجهات الرسومية التي تتيحها منصة Open Source لكشف اختناق الأداء أمرًا بسيطًا، فالهدف من هذه المقالة أن تقدّم للقارئ مقاربةً بسيطةً يمكن استخدامها في أية حالة تواجه المستخدم.
</p>

<h2>
	من أين نبدأ
</h2>

<p>
	يتألف الحاسوب من ستة موارد عتادية أساسية وهي:
</p>

<ul>
<li>
		المعالجات
	</li>
	<li>
		الذاكرة
	</li>
	<li>
		التخزين
	</li>
	<li>
		منافذ اتصال USB
	</li>
	<li>
		الاتصال بالانترنت
	</li>
	<li>
		المعالج الرسومي
	</li>
</ul>
<p>
	يمكن لأيٍ من الموارد السابقة في حال أصبح أداؤه سيئًا، أن يسبب اختناقًا في الأداء، ويجب عند تشخيص الاختناق أن نراقب الموارد الستة سابقة الذكر.
</p>

<p>
	توجد العديد من الأدوات مفتوحة المصدر التي يمكن استخدامها لمراقبة الموارد المختلفة في الحاسوب، حيث سنستخدم أداة <a data-ss1627813354="1" data-ss1628685745="1" href="https://wiki.gnome.org/Apps/SystemMonitor" rel="external nofollow">GNOME System Monitor</a> لأن مخرجاتها سهلة الفهم. ويمكن الحصول على هذه الأداة بسهولة من مستودعات توزيعات لينكس، حيث سيكون علينا فقط تشغيل الأداة ومن ثم نضغط على تبويب الموارد Resources، ويمكن التعرف على العديد من مشاكل الأداء مباشرةً.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="73180" data-ss1627813354="1" data-ss1628685745="1" href="https://academy.hsoub.com/uploads/monthly_2021_08/1_system_monitor_resources_panel.jpg.e578c049b444314c98c4cfb94ef581d1.jpg" rel=""><img alt="1_system_monitor_resources_panel.jpg" class="ipsImage ipsImage_thumbnailed" data-fileid="73180" data-unique="xiuubu3u4" src="https://academy.hsoub.com/uploads/monthly_2021_08/1_system_monitor_resources_panel.jpg.e578c049b444314c98c4cfb94ef581d1.jpg"></a>
</p>

<p style="text-align: center;">
	الشكل 1: تكتشف الأداة System Monitor العديد من المشاكل.
</p>

<p>
	تُظهر لوحة Resources ثلاثة أقسام رئيسية هي تاريخ وحدة المعالجة المركزية CPU History، وتاريخ الذاكرة والذاكرة المبدلة Memory and Swap History، وتاريخ الشبكة Network History، حيث يمكن بمجرد إلقاء نظرة سريعة أن نلاحظ إذا كانت المعالجات غارقةً في العمل، أو إذا كان الحاسب قد نفّذ من الذاكرة، أو أنه يستهلك كامل عرض المجال الخاص بالانترنت
</p>

<p>
	يجب تفقد هذه الأداة عند الشعور بأن أداء الحاسب قد أصبح سيئًا لأنها تبين بسهولة بعض الأدلة على مشاكل الأداء الأكثر شيوعًا.
</p>

<h2>
	التعرف على اختناقات المعالج
</h2>

<p>
	يجب أن نتعرف على العتاد المتاح لدينا عند تشخيص الاختناق، حيث تتوفر العديد من الأدوات للتعرف على مواصفات الحاسوب المستخدم وتفاصيل العتاد الكاملة، وتُعَد الأداة <a data-ss1627813354="1" data-ss1628685745="1" href="https://github.com/lpereira/hardinfo/" rel="external nofollow">HardInfo</a> من أفضل الأدوات، وذلك لأنها شائعة وتمتلك واجهات رسومية سهلة القراءة.
</p>

<p>
	بعد تشغيل الأداة HardInfo يحصل اختيار التبويب Computer -‏&gt; Summary، فتظهر لوحة تتضمن معلومات وحدة المعالجة المركزية مثل عدد الأنوية cores والنياسب أو الخيوط threads، والسرعات speeds، كما أنها تتضمن معلومات عن اللوحة الأم وبقية مكونات الحاسب.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="73181" data-ss1627813354="1" data-ss1628685745="1" href="https://academy.hsoub.com/uploads/monthly_2021_08/2_hardinfo_summary_panel.jpg.c2c6e4d87f1728cda1a8c167a5f9baf9.jpg" rel=""><img alt="2_hardinfo_summary_panel.jpg" class="ipsImage ipsImage_thumbnailed" data-fileid="73181" data-unique="mlzkhxy4t" src="https://academy.hsoub.com/uploads/monthly_2021_08/2_hardinfo_summary_panel.jpg.c2c6e4d87f1728cda1a8c167a5f9baf9.jpg"></a>
</p>

<p style="text-align: center;">
	الشكل 2: تُظهر واجهة أداة HardInfo التفاصيل عن العتاد المتوفر في الجهاز.
</p>

<p>
	تبيّن الأداة HardInfo أن الحاسب المستخدم في المثال يمتلك وحدة معالجة مركزية فيزيائية واحدة، والتي تتضمن معالجين أو نواتين. حيث تدعم كل نواة استخدام خيطين أو ما يعرف بالمعالجات المنطقية، مما يجعل العدد الكلي المتاح أربع معالجات منطقية، وهذا بالضبط ما أظهره الجزء الخاص بتاريخ المعالج من أداة System Monitor في الشكل 1.
</p>

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

<p>
	يمكن التعرف على هذه الحالة عندما تُظهِر أداة System Monitor أن استخدام المعالج المنطقي تجاوز 80% أو 90% لفترة زمنية مستمرة. حيث نجد في المثال التالي أن ثلاثة من المعالجات المنطقية الأربعة قد استُهلِكت استهلاكًا كاملًا، وهذا ما يُعَد اختناقًا لأنقدرة وحدة المعالجة المركزية المتاحة لم تعد كافيةً لتنفيذ أي من الأعمال الأخرى في حال ورودها.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="73182" data-ss1627813354="1" data-ss1628685745="1" href="https://academy.hsoub.com/uploads/monthly_2021_08/3_system_monitor_100_processor_utilization.jpg.11508a30c81446f6be8ee908f57d9e81.jpg" rel=""><img alt="3_system_monitor_100_processor_utilization.jpg" class="ipsImage ipsImage_thumbnailed" data-fileid="73182" data-unique="bqz1htggt" src="https://academy.hsoub.com/uploads/monthly_2021_08/3_system_monitor_100_processor_utilization.jpg.11508a30c81446f6be8ee908f57d9e81.jpg"></a>
</p>

<p style="text-align: center;">
	الشكل 3: اختناق في عمل المعالج
</p>

<h3>
	معرفة أي تطبيق هو سبب المشكلة؟
</h3>

<p>
	يجب أن نعرف أي تطبيق أو مجموعة التطبيقات التي تستهلك وحدة المعالجة المركزية، حيث يمكن أن نشاهد العمليات مرتّبةً وفقًا إلى نسبة استهلاكها لوحدة المعالجة المركزية عند الضغط على تبويب Processes في أداة System Monitor ومن ثم بالضغط على ترويسة ‎% CPU، كما يمكن عندها معرفة أي من التطبيقات يخنق النظام.
</p>

<p style="text-align: center;">
	<img alt="4_system_monitor_processes_panel.jpg" class="ipsImage ipsImage_thumbnailed" data-fileid="73183" data-unique="bby9w2isb" src="https://academy.hsoub.com/uploads/monthly_2021_08/4_system_monitor_processes_panel.jpg.150088d07ea4982319edc2bec6d34c7c.jpg" style=""></p>

<p style="text-align: center;">
	الشكل 4: التعرف على العمليات المسيئة.
</p>

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

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

<p>
	يمكن في حال كان المستخدم يتمتع بصلاحيات المدير Administrator إدارة هذه العملية، إذ يمكن تغيير أولويتها وإيقافها، أو إعادتها للعمل، أو إنهائها أو قتلها، مما يؤدي إلى حل مشكلة الاختناق مباشرةً.
</p>

<p style="text-align: center;">
	<img alt="5_system_monitor_manage_a_process.jpg" class="ipsImage ipsImage_thumbnailed" data-fileid="73184" data-unique="sqj27l762" src="https://academy.hsoub.com/uploads/monthly_2021_08/5_system_monitor_manage_a_process.jpg.b7c66b84b649a639ad721c4a824cdc7d.jpg" style=""></p>

<p style="text-align: center;">
	الشكل 5: الضغط بالزر اليميني على العملية لإدارتها.
</p>

<p>
	كيف يمكن أن نحل مشاكل اختناق المعالجة؟ يمكن في البدائة إدارة العملية التي تكون سبب المشكلة فور حدوثها، حيث يمكن منع الاختناق من الحدوث باستبدال هذا التطبيق بآخر، أو من خلال محاولة تجنب استخدامه أو تغيير سلوك المستخدم عند استخدام هذا التطبيق، إضافةً إلى إمكانية جدولة التطبيق في ساعات عدم استخدام الحاسب من قِبل المستخدم.
</p>

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

<h3>
	اختناقات المعالج الشائعة
</h3>

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

<p>
	يمكن أن نجد معالجًا منطقيًا عالقًا دائمًا بنسبة استخدام 100، وقد يعني ذلك أنه إما مشغول جدًا أو أنه توجد عملية ما قد أصبحت بحالة جمود، كما يمكن أن نتأكد بأن العملية قد أصبحت جامدةً عندما لا تمارس العملية أي نشاط متعلق بـ قرص التخزين (مثلما ستُظهِر لوحة العمليات Processes في أداة System Monitor).
</p>

<p>
	وفي الختام يمكن ملاحظة أنه عندما تصبح جميع المعالجات المنطقية في حالة اختناق، فإن الذاكرة تصبح مستخدمةً كليًا أيضًا. يمكن أن تسبب حالات نفاد الذاكرة Out-of-memory اختناقات في المعالج، وفي هذه الحالة يجب العمل على حل مشاكل الذاكرة المخفية والابتعاد عن التركيز الكثيف على حل مشكلة المعالج، والتي تُعَد عارضًا من أعراض المشكلة الحقيقية.
</p>

<h2>
	التعرف على اختناقات الذاكرة
</h2>

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

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

<p>
	تُظهر لوحة الموارد Resources ضمن أداة System Monitor؛ إجمالي الذاكرة والكمية المستخدمة منها، ويمكن في لوحة العمليات Processes مشاهدة استخدام الذاكرة لكل عملية على حدى.
</p>

<p>
	يظهر الشكل الجزء من لوحة الموارد Resources ضمن أداة System Monitor التي تتعقب تراكم استخدام الذاكرة.
</p>

<p style="text-align: center;">
	<img alt="6_system_monitor_out_of_memory.jpg" class="ipsImage ipsImage_thumbnailed" data-fileid="73185" data-unique="436vgd7j7" src="https://academy.hsoub.com/uploads/monthly_2021_08/6_system_monitor_out_of_memory.jpg.f93eadfda452dea5889d23689c6a67d9.jpg" style=""></p>

<p style="text-align: center;">
	الشكل 6: اختناق الذاكرة.
</p>

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

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

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

<p>
	تُعَد مسألة اختيار حجم التبادل أمرًا هامًا، حيث يرتبط تحديده بخيارات المستخدم، لذا فعليه أن يقرر على سبيل المثال معدل نشاط جزء التبادل وسرعته والتوقعات منه وغيرها من القضايا التي تؤثر إجمالًا على أداء الحاسب، إذ يرتبط تحديد حجم جزء التبادل المستخدم بحجم الذاكرة الإجمالي الموجود وعادةً لا يتجاوز نسبة 20% من إجمالي الذاكرة.
</p>

<p>
	أما الحالة الثانية التي تحدث عندما تكون كلٍ من الذاكرة وجزء التبادل، فهما مُستخدمان كليًا فهي حالة اختناق الذاكرة، أين يبدو الحاسب وكأنه لا يستجيب، ومن الممكن أن يصل إلى حالة تجمد thrashing والتي لا يكون فيها الحاسب قادرًا على تنفيذ الكثير من العمليات إضافةً إلى عمليات إدارة الذاكرة.
</p>

<p>
	يظهر الشكل 6 أعلاه حاسوبًا قديمًا يمتلك ذاكرة نفاذ عشوائي ذات حجم 2 غيغابايت، وبما أنّ استهلاك الذاكرة تجاوز 80%، فقد بدأ النظام بالكتابة في جزء التبادل، وهو ما سبب انحسارًا في مدى استجابة الحاسب. تُظهر هذه الصورة بأن استهلاك الذاكرة قد تجاوز 90% وأن الحاسب قد دخل في حالة الجمود.
</p>

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

<h2>
	التعرف على اختناقات التخزين
</h2>

<p>
	توجد اليوم العديد من الأشكال لوسائط التخزين فبعض منها يكون أقراص HDD أو أقراص SSD. يمكن أن تكون واجهات الربط مع هذه الأقراص منافذ PCIe وSATA وThunderbolt وUSB.مهما كان نوع وسيط التخزين الذي تمتلكه فيمكن اتباع نفس الإجرائية للتعرف على اختناقات الأقراص.
</p>

<p>
	نقوم بتشغيل أداة System Monitor ثم من لوحة العمليات Processes نراقب معدلات الإدخال والإخراج من أجل العمليات بشكل إفرادي مما يتيح التعرف على العمليات التي تقوم بمعظم عمليات الإدخال والإخراج من وإلى القرص.
</p>

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

<p>
	يمكن أن نكتب الأمر <a data-ss1627813354="1" data-ss1628685745="1" href="https://academy.hsoub.com/devops/linux/4-%D8%A3%D8%AF%D9%88%D8%A7%D8%AA-%D9%85%D9%81%D8%AA%D9%88%D8%AD%D8%A9-%D8%A7%D9%84%D9%85%D8%B5%D8%AF%D8%B1-%D9%85%D9%86-%D8%A3%D8%AC%D9%84-%D9%85%D8%B1%D8%A7%D9%82%D8%A8%D8%A9-%D9%86%D8%B8%D8%A7%D9%85-%D9%84%D9%8A%D9%86%D9%83%D8%B3-r523/" rel="">atop</a> ضمن موجه الأوامر، حيث يُظهر الخرج أدناه بأن الجهاز sdb مشغول بنسبة 101%، ويعني ذلك بوضوح أنّه قد وصل الجهاز إلى حد استخدامه الأعظمي وأنه يُقيِّد سرعة النظام على تنفيذ الأعمال.
</p>

<p style="text-align: center;">
	<img alt="7_atop_storage_bottleneck.jpg" class="ipsImage ipsImage_thumbnailed" data-fileid="73186" data-unique="za8z6z06u" src="https://academy.hsoub.com/uploads/monthly_2021_08/7_atop_storage_bottleneck.jpg.31419d4b1325353e44f9c803a83cf4e1.jpg" style=""></p>

<p style="text-align: center;">
	الشكل 7: يتعرف الأمر atop على اختناق القرص.
</p>

<p>
	يمكن أن نلاحظ أن أحد المعالجات ينتظر القرص الصلب بنسبة 85% من وقته لكي يؤدي مهامه، ويحدث ذلك عندما يصبح جهاز التخزين بحالة اختناق. عمليًا، سيراقب العديد من المستخدمين حدوث انتظار المعالج لوحدات الإدخال والإخراج لكشف حدوث اختناقات التخزين، حيث يمكن استخدام الأمر atop لكشف حدوث اختناق القرص الصلب بسهولة، ومن ثم يمكن استخدام لوحة العمليات Processes من أداة System Monitor للتعرف على العمليات الإفرادية التي تسبب مشكلة الاختناق.
</p>

<h2>
	كيفية التعرف على اختناقات منفذ USB
</h2>

<p>
	يستخدِم العديد من الناس منافذ USB باستمرار طوال اليوم، ومع ذلك لا يتأكدون مما إذا كان استخدام هذه المنافذ مثاليًا، وذلك مهما كان نوع الجهاز الذي توصله عبر منفذ USB، لهذا يجب التأكد من الحصول على أفضل أداء ممكن من هذه الجهاز.
</p>

<p style="text-align: center;">
	<img alt="8_usb_standards_speeds.jpg" class="ipsImage ipsImage_thumbnailed" data-fileid="73187" data-unique="h13yivlia" src="https://academy.hsoub.com/uploads/monthly_2021_08/8_usb_standards_speeds.jpg.37ea28c28f7b008dbffc552c425acf62.jpg" style=""></p>

<p style="text-align: center;">
	الشكل 8: تتفاوت سرعة منافذ USB كثيرًا (Howard Fosdick, بناءً على شكل قدمه <a data-ss1627813354="1" data-ss1628685745="1" href="https://www.samsung.com/us/computing/memory-storage/solid-state-drives/" rel="external nofollow">Tripplite</a> و <a data-ss1627813354="1" data-ss1628685745="1" href="https://en.wikipedia.org/wiki/USB" rel="external nofollow">Wikipedia</a>, منشورة برخصة <a data-ss1627813354="1" data-ss1628685745="1" href="https://creativecommons.org/licenses/by-sa/4.0/" rel="external nofollow">CC BY-SA 4.0</a>).
</p>

<p>
	يظهر التبويب USB Devices ضمن أداة HardInfo المعايير الخاصة بمنافذ USB التي يدعمها الحاسوب، حيث تتيح معظم الحواسيب إمكانية استخدام منافذ USB بسرعات مختلفة، كما يمكن أن نعرف السرعة لأحد منافذ الـ USB بالاعتماد على لون المنفذ. يمكن أيضًا معرفة سرعة المنفذ الموجود في الحاسب عن طريق موازنة لونه مع الألوان المستخدمة في الشكل السابق، كما يمكن العودة إلى الدليل الورقي أو الإلكتروني المُرفق بالحاسب الشخصي، والذي يتضمن عدد المنافذ الموجودة على الحاسب وسرعة كل منها.
</p>

<p>
	إذا أردنا مشاهدة السرعات الحقيقية التي نحصل عليها، فيمكننا اختبارها باستخدام الأداة <a data-ss1627813354="1" data-ss1628685745="1" href="https://wiki.gnome.org/Apps/Disks" rel="external nofollow">GNOME Disks</a> مفتوحة المصدر، حيث سنشغّل الأداة ومن ثم اختيار Benchmark Disk، وعند تشغيل عملية الاختبار، ستظهر السرعة الحقيقية الأعظمية التي يمكن الحصول عليها من أحد المنافذ الذي أوصِل إليه جهاز ما.
</p>

<p>
	يمكن أن نحصل على سرعات نقل متفاوتة من أجل أحد المنافذ، وذلك تبعًا لنوع الجهاز الموصول بالمنفذ، حيث يعتمد تحديد معدل المعطيات على تشكيلة مكونة من المنفذ والجهاز الموصول به. فعلى سبيل المثال، عند وصل جهاز ما يمكن أن يعمل بسرعة 3.1 وقد وُصل بمنفذ ذي سرعة 2.0، فإن الجهاز سيعمل بسرعة 2.0 دون مشاكل ولن يظهر أي إنذار بأن الجهاز يعمل بسرعة أقل من سرعته الأعظمية؛ بينما إذا وُصِل جهاز يعمل بسرعة 2.0 إلى منفذ 3.1، فسيعمل ولكن بسرعة 2.0. لذا فمن أجل الحصول على عمل USB سريع، يجب أن نضمن أن كلًا من المنفذ والجهاز يدعمان السرعة. وتوفر الأداة GNOME Disks الوسائل اللازمة للتحقق من ذلك.
</p>

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

<h2>
	كيفية التعرف على اختناقات اتصال الإنترنت
</h2>

<p>
	تُظهر لوحة الموارد Resources ضمن أداة System Monitor، سرعة الاتصال بالإنترنت في الزمن الحقيقي كما هو ظاهر في الشكل 1.
</p>

<p>
	توجد العديد من الأدوات المبنية بلغة بايثون لاختبار سرعة الانترنت الأعظمية، ولكن يمكننا اختبار السرعة باستخدام المواقع على الانترنت مثل <a data-ss1627813354="1" data-ss1628685745="1" href="https://www.speedtest.net/" rel="external nofollow">Speedtest</a> و<a data-ss1627813354="1" data-ss1628685745="1" href="https://fast.com/" rel="external nofollow">Fast.com</a> و<a data-ss1627813354="1" data-ss1628685745="1" href="https://www.speakeasy.net/speedtest/" rel="external nofollow">Speakeasy</a>، حيث يجب علينا إغلاق كل شيء وتشغيل عملية اختبار السرعة فقط، وذلك للحصول على أفضل نتيجة ممكنة، إضافةً إلى إطفاء اتصال <abbr title="Virtual Private Network | الشبكة الخاصة الافتراضية">VPN</abbr> وتشغيل الاختبارات في أوقات متفرقة من اليوم، وموازنة النتائج من عدة مواقع اختبار سرعة.
</p>

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

<p>
	يمكن في حال وجود موجه Router مستقل أن يتم الاختبار بوجوده وبغيابه، وبهذا يمكن أن نحكم فيما إذا كان الموجه يمثل نقطة الاختناق أم لا. وفي حال وجود خدمات اللاسلكي WiFi، فيجب أن يَجري الاختبار بوجودها وبغيابها، أي بوصل الكابل مباشرةً بين الجهاز المحمول وجهاز المودم)، ففي الحقيقة توجد عدة حالات اشتكى فيها المستخدمون من مزود الخدمة الخاص بهم علمًا أنّ مشكلتهم الحقيقية كانت الاختناق في خدمات الاتصال اللاسلكي والذي كان بإمكانهم حلها بأنفسهم، ففي حال كان أحد البرامج يستهلك كامل اتصال الانترنت، فيجب معرفته باستخدام الأمر nethogs، وهو متاح لدى أغلب منصات تنزيل البرمجيات.
</p>

<p>
	لقد أظهرت أداة System Monitor في أحد الأيام فجأةً وجود استهلاك إنترنت مفاجئ، وعند كتابة الأمر nethogs في موجه الأوامر، حدث التعرف فورًا على سبب استهلاك عرض المجال بأنه عملية تحديث لمضاد الفايروسات Clamav
</p>

<p style="text-align: center;">
	<img alt="9_nethogs_bandwidth_consumers.jpg" class="ipsImage ipsImage_thumbnailed" data-fileid="73188" data-unique="ooxjet23l" src="https://academy.hsoub.com/uploads/monthly_2021_08/9_nethogs_bandwidth_consumers.jpg.81324e2cafeee35e68926283552753e9.jpg" style=""></p>

<p style="text-align: center;">
	الشكل 9: تتعرف الأداة Nethogs على البرامج التي تستهلك عرض المجال.
</p>

<h2>
	التعرف على اختناقات معالج الرسوم
</h2>

<p>
	يجب معرفة نوع معالج الرسوم الموجود في الحاسب، فإذا كان يحدث توصيل الشاشة إلى اللوحة الأم من الخلف في الحاسب الشخصي، فهذا يدل على وجود معالج رسومي مدمج؛ أما إذا كان توصيل الشاشة إلى اللوحة الأم عن طريق بطاقة إضافية تُركّب على اللوحة الأم، فهذا يعني وجود نظام فرعي مستقل لمعالجة الرسوم، والتي تُعرف بإسم بطاقة الفيديو Video Card، أو بطاقة الرسوميات Graphics Card. تكون البطاقات هذه أكثر قوةً وكلفةً من المعالجات الرسومية المدمجة باللوحة الأم، علمًا أن الحواسيب المحمولة تستخدم المعالجات الرسومية المدمجة دومًا ولا يمكن إضافة بطاقة رسومية إليها.
</p>

<p>
	تُظهر لوحة PCI Devices ضمن أداة HardInfo، معلومات حول وحدة معالجة الرسوميات لديك، كما يمكن أن تُظهر كمية الذاكرة المخصصة للفيديو (عن طريق البحث عن الذاكرة المعنونة باسم قابلة للجلب المسبق Prefetchable).
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="73178" data-ss1627813354="1" data-ss1628685745="1" href="https://academy.hsoub.com/uploads/monthly_2021_08/10_hardinfo_video_card_information.jpg.a1cc6ab5c694f7442e83a8ade9c28b5d.jpg" rel=""><img alt="10_hardinfo_video_card_information.jpg" class="ipsImage ipsImage_thumbnailed" data-fileid="73178" data-unique="tbfdlr1zu" src="https://academy.hsoub.com/uploads/monthly_2021_08/10_hardinfo_video_card_information.jpg.a1cc6ab5c694f7442e83a8ade9c28b5d.jpg"></a>
</p>

<p style="text-align: center;">
	الشكل 10: توفر الأداة HardInfo معلومات عن المعالجة الرسومية.
</p>

<p>
	تعمل وِحدتَي المعالجة المركزية و معالجة الرسوميات بتكامل، حيث يمكن ببساطة أن نقول أن وحدة المعالجة المركزية تحضر الإطارات Frames لوحدة معالجة الرسوميات لتُظهِرها، ويحدث الاختناق في معالج الرسوم عندما تنتظر وحدة المعالجة المركزية العمل من وحدة معالجة الرسوميات، والتي تكون مشغولةً كليًا، حيث يمكن كشف ذلك عن طريق مراقبة معدلات استخدام كلا الوحدتين، إذ تتيح الأدوات مفتوحة المصدر Conky و<a data-ss1627813354="1" data-ss1628685745="1" href="https://academy.hsoub.com/devops/linux/4-%D8%A3%D8%AF%D9%88%D8%A7%D8%AA-%D9%85%D9%81%D8%AA%D9%88%D8%AD%D8%A9-%D8%A7%D9%84%D9%85%D8%B5%D8%AF%D8%B1-%D9%85%D9%86-%D8%A3%D8%AC%D9%84-%D9%85%D8%B1%D8%A7%D9%82%D8%A8%D8%A9-%D9%86%D8%B8%D8%A7%D9%85-%D9%84%D9%8A%D9%86%D9%83%D8%B3-r523/" rel="">Glances</a> ذلك بسهولة.
</p>

<p>
	فيما يلي مثال تم الحصول عليه باستخدام الأداة Conky، ويمكن ملاحظة أن النظام يمتلك كميةً وافرةً من قدرة المعالجة في وحدة المعالجة المركزية؛ أما وحدة معالجات الرسوميات، فهي مستهلكة بنسبة 25%، فلو تخيلنا أنّ هذا الرقم قارب الـ 100%، فعندها نعلم أنّ وحدة المعالجة المركزية تنتظر وحدة معالجة الرسوميات، وأنه توجد حالة اختناق في وحدة معالجة الرسوميات.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="73179" data-ss1627813354="1" data-ss1628685745="1" href="https://academy.hsoub.com/uploads/monthly_2021_08/11_conky_cpu_and_gup_monitoring.jpg.571a3a625ac34d0d04b451fb15153955.jpg" rel=""><img alt="11_conky_cpu_and_gup_monitoring.jpg" class="ipsImage ipsImage_thumbnailed" data-fileid="73179" data-unique="37t6x9xty" src="https://academy.hsoub.com/uploads/monthly_2021_08/11_conky_cpu_and_gup_monitoring.jpg.571a3a625ac34d0d04b451fb15153955.jpg"></a>
</p>

<p style="text-align: center;">
	الشكل 11: تظهر أداة Conky استخدام وحدة المعالجة المركزية ووحدة معالجة الرسوميات (صورة مقتبسة من <a data-ss1627813354="1" data-ss1628685745="1" href="https://askubuntu.com/questions/387594/how-to-measure-gpu-usage" rel="external nofollow">منتدى AskUbunt</a>u).
</p>

<p>
	يمكن في بعض الحواسيب أن نضطر إلى استخدام أدوات مصنّعة خصيصًا من قِبل الشركة المصنعة لبطاقة الفيديو، وتتوفر هذه الأدوات للتنزيل من موقع GitHub.
</p>

<h2>
	الخلاصة
</h2>

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

<p>
	اقتضى التعرّف على مشكلة اختناق العتاد hardware bottlenecks امتلاك خبرات عالية في العديد من المجالات التقنية، وحديثًا أصبح من السهل كشف هذه المشاكل باستخدام أدوات مراقبة الأداء مفتوحة المصدر ذات الواجهات الرسومية التي تسمح لأي مستخدم بتشخيص المشكلة التي يعاني منها، دون شراء أدوات مكلفة، ودون الحاجة إلى تعلّم الأوامر المعقدة.
</p>

<p>
	جميع الصورة منشورة برخصة <a data-ss1627813354="1" data-ss1628685745="1" href="https://creativecommons.org/licenses/by-sa/4.0/" rel="external nofollow">CC BY-SA 4.0</a> لصاحبها Howard Fosdick إلا إن ذكر خلاف ذلك.
</p>

<p>
	ترجمة -وبتصرف- للمقال <a data-ss1627813354="1" data-ss1628685745="1" href="https://opensource.com/article/21/3/linux-performance-bottlenecks" rel="external nofollow">Identify Linux performance bottlenecks using open source tools</a> لصاحبه Howard Fosdick.
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
<li>
		<a data-ss1627813354="1" data-ss1628685745="1" href="https://academy.hsoub.com/devops/linux/4-%D8%A3%D8%AF%D9%88%D8%A7%D8%AA-%D9%85%D9%81%D8%AA%D9%88%D8%AD%D8%A9-%D8%A7%D9%84%D9%85%D8%B5%D8%AF%D8%B1-%D9%85%D9%86-%D8%A3%D8%AC%D9%84-%D9%85%D8%B1%D8%A7%D9%82%D8%A8%D8%A9-%D9%86%D8%B8%D8%A7%D9%85-%D9%84%D9%8A%D9%86%D9%83%D8%B3-r523/" rel="">4 أدوات مفتوحة المصدر من أجل مراقبة نظام لينكس </a>
	</li>
	<li>
		<a data-ss1627813354="1" data-ss1628685745="1" href="https://academy.hsoub.com/devops/linux/%D9%85%D8%A7-%D9%87%D9%88-%D9%86%D8%B8%D8%A7%D9%85-%D8%A7%D9%84%D8%AA%D8%B4%D8%BA%D9%8A%D9%84-%D9%84%D9%8A%D9%86%D9%83%D8%B3%D8%9F-r451/" rel="">ما هو نظام التشغيل لينكس؟</a>
	</li>
	<li>
		<a data-ss1627813354="1" data-ss1628685745="1" href="https://academy.hsoub.com/devops/linux/%D8%AF%D9%84%D9%8A%D9%84-%D8%A7%D9%84%D9%85%D8%B3%D8%AA%D8%AE%D8%AF%D9%85-%D9%84%D9%84%D8%B1%D9%88%D8%A7%D8%A8%D8%B7-%D9%81%D9%8A-%D9%86%D8%B8%D8%A7%D9%85-%D9%85%D9%84%D9%81%D8%A7%D8%AA-%D9%84%D9%8A%D9%86%D9%83%D8%B3-r371/" rel="">دليل المستخدم للروابط في نظام ملفات لينكس</a>
	</li>
	<li>
		<a data-ss1627813354="1" data-ss1628685745="1" href="https://academy.hsoub.com/devops/linux/%D8%B9%D8%B4%D8%B1%D9%88%D9%86-%D8%A3%D9%85%D8%B1%D8%A7-%D9%81%D9%8A-%D9%84%D9%8A%D9%86%D9%83%D8%B3-%D9%8A%D9%81%D8%AA%D8%B1%D8%B6-%D8%A3%D9%86-%D9%8A%D8%B9%D8%B1%D9%81%D9%87%D8%A7-%D9%83%D9%84-%D9%85%D8%AF%D9%8A%D8%B1-%D9%86%D8%B8%D9%85-r355/" rel="">عشرون أمرا في لينكس يفترض أن يعرفها كل مدير نظم</a>
	</li>
	<li>
		<a data-ss1627813354="1" data-ss1628685745="1" href="https://academy.hsoub.com/devops/linux/4-%D8%A3%D8%AF%D9%88%D8%A7%D8%AA-%D9%85%D9%81%D8%AA%D9%88%D8%AD%D8%A9-%D8%A7%D9%84%D9%85%D8%B5%D8%AF%D8%B1-%D9%85%D9%86-%D8%A3%D8%AC%D9%84-%D9%85%D8%B1%D8%A7%D9%82%D8%A8%D8%A9-%D9%86%D8%B8%D8%A7%D9%85-%D9%84%D9%8A%D9%86%D9%83%D8%B3-r523/" rel="">4 أدوات مفتوحة المصدر من أجل مراقبة نظام لينكس</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">525</guid><pubDate>Mon, 09 Aug 2021 14:02:00 +0000</pubDate></item><item><title>4 &#x623;&#x62F;&#x648;&#x627;&#x62A; &#x645;&#x641;&#x62A;&#x648;&#x62D;&#x629; &#x627;&#x644;&#x645;&#x635;&#x62F;&#x631; &#x645;&#x646; &#x623;&#x62C;&#x644; &#x645;&#x631;&#x627;&#x642;&#x628;&#x629; &#x646;&#x638;&#x627;&#x645; &#x644;&#x64A;&#x646;&#x643;&#x633;</title><link>https://academy.hsoub.com/devops/linux/4-%D8%A3%D8%AF%D9%88%D8%A7%D8%AA-%D9%85%D9%81%D8%AA%D9%88%D8%AD%D8%A9-%D8%A7%D9%84%D9%85%D8%B5%D8%AF%D8%B1-%D9%85%D9%86-%D8%A3%D8%AC%D9%84-%D9%85%D8%B1%D8%A7%D9%82%D8%A8%D8%A9-%D9%86%D8%B8%D8%A7%D9%85-%D9%84%D9%8A%D9%86%D9%83%D8%B3-r523/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2021_08/61064c2086cea_4--------.png.12cd0dd4b199fe19e4ff7583a5a745c4.png" /></p>

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

<p>
	تناقش هذه المقالة بعض الأدوات التفاعلية التي تعمل بالأوامر CLI، والتي يمكن تثبيتها بسهولة على توزيعات لينكس ريد هات Red Hat وفيدورا Fedora وسينتوس CentOs وكل التوزيعات المشتقّة منها، حيث تتوفر العديد من الأدوات ذات الواجهات الرسومية التي يمكن استخدامها لنفس الغرض إلا أنها لا تكون قابلةً للاستخدام في جميع الأحيان، نظرًا لعدم امتلاك بعض الخوادم القدرة على العرض رسوميًا.
</p>

<p>
	تقدّم المقالة أربع أدوات أساسية ضمن بيئة نظام لينكس لمراقبة النظام وتشخيص المشاكل فيه وهي top وatop وhtop وglances، حيث تراقب هذه الأدوات نسبة استخدام الذاكرة ووحدة المعالجة المركزية CPU، كما تتيح معظمها معلومات عن العمليات قيد التشغيل، إضافةً إلى العديد من الجوانب الأخرى، وتظهر هذه المعلومات تقريبًا بالزمن الحقيقي لنشاط النظام.
</p>

<h2>
	متوسط الحمل
</h2>

<p>
	يمثّل متوسط الحمل Load average متوسط عدد التعليمات التي تنتظر أن ينفذها المعالج، فهو مقياس حقيقي لأداء وحدة المعالجة المركزية خلافًا لنسبة استهلاك وحدة المعالجة المركزية، والتي تُعَد مقياسًا غير دقيق كونها تتضمّن زمن انتظار متعلّق بعملية الإدخال والإخراج حيث يكون عندها المعالج خاملًا.
</p>

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

<p>
	في نظام أحادي المعالج وعندما يكون متوسط الحمل مساويًا 1.5 فإنّ ثلث التعليمات الواردة تنتظر لفترة زمنية قبل أن يبدأ تنفيذها، أما في حال النظم متعددة المعالجات، فلو فرضنا أنه يوجد نظام متعدد المعالجات يمتلك أربع معالجات، فإن متوسط الحمل المثالي يساوي أربعة. فإذا كان هذا المتوسط مساويًا 3.24 فسيعني ذلك أنّ ثلاثة معالجات منها مستخدمة كليًا وقد بلغت نسبة استخدام المعالج الرابع 76%.
</p>

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

<h2>
	الإشارات
</h2>

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

<p>
	يسمح الأمر <code>Kill</code> بإرسال الإشارات إلى العمليات أيضًا دون الحاجة لاستخدام برامج المراقبة، ويمكن تنفيذ الأمر <code>kill -l</code> لاستعراض جميع الإشارات التي يمكن استخدامها مع العمليات المختلفة، وتُستخدَم ثلاث من هذه الإشارات من أجل إيقاف العمليات والتي تسمى أحيانًا بقتل العملية kill a process.
</p>

<ul>
<li>
		<strong>SIGTERM (15)‎</strong>: ترسَل هذه الإشارة افتراضيًا من قِبل الأداة top وبقية أدوات المراقبة عند الضغط على المحرف k، وتُعَد هذه الإشارة هي الأقل فعاليةً، لأنها تشترط امتلاك البرنامج المستقبل لها على جزء برمجي للتعامل مع هذه الإشارة Signal Handler. يجب أن يعترض الجزء البرمجي المذكور الإشارة الواردة إلى العملية والتصرف بطريقة صحيحة، وعند غياب هذا الجزء البرمجي، فستتجاهل العملية الإشارة الواردة إليها؛ أما الغاية من وجود إشارة SIGTERM، فهي إخبار البرنامج أنّ المستخدم يرغب بإنهاء البرنامج لوجوده، مما يجب أن يدفعه لتحرير الموارد التي استخدمها هذا البرنامج وإغلاق الملفات المفتوحة، وذلك دون اتخاذ أية إجراءات قسرية من قِبل المستخدم.
	</li>
	<li>
		<strong>SIGKILL (9)‎</strong>: تُستخدم هذه الإشارة لقتل أي من العمليات التي يرغب المستخدم بإيقافها، حيث لا تهتم هذه الإشارة لوجود جزء برمجي مخصص ينشط عند استلام الإشارة، إذ تُقتل العملية أولًا، ومن ثم تُقتل جلسة الصدفة shell التي يعمل ضمنها البرنامج. لا تُعد هذه الطريقة لطيفةً عند الحاجة للتخلص من عملية ما ويجب الأخذ بالحسبان أنً قتل العملية قسريًا باستخدام هذه الإشارة يمكن أن يؤثر على العمليات المرتبطة بها.
	</li>
	<li>
		<strong>SIGINT (2)‎</strong>: تُستخدم هذه الإشارة عند فشل الإشارة SIGTERM في التخلّص من العملية المطلوبة، مع عدم رغبة المستخدم بقتل العملية قسريًا، ولسبب ما لا يرغب المستخدم في إيقاف جلسة الصدفة shell الخاصة بالعملية، وإنما يريد قتل العملية فقط ومقاطعة الجلسة فقط دون إزالتها. تكافئ هذه الإشارة إرسال الأمر <code>CTRL-C</code> للبرنامج أو السكريبت وهو قيد العمل مما يسبب توقفه بصورة دائمة.
	</li>
</ul>
<p>
	يمكن تجربة الأوامر السابقة بإنشاء جلسة موجه أوامر جديدة ومن ثم إنشاء ملف ضمن المجلد"‎"/tmp باسم cpuHog، ثم تحويله لبرنامج تنفيذي وإعطائه الأذونات "rwxr<em>xr</em>x" وكتابة المحتوى التالي ضمن الملف:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_8489_10" style="">
<span class="pun">#!</span><span class="str">/bin/</span><span class="pln">bash </span><span class="pun">#</span><span class="pln"> </span><span class="typ">This</span><span class="pln"> </span><span class="typ">Little</span><span class="pln"> program is a cpu hog X</span><span class="pun">=</span><span class="lit">0</span><span class="pun">;</span><span class="pln"> </span><span class="kwd">while</span><span class="pun">[</span><span class="lit">1</span><span class="pun">];</span><span class="pln"> </span><span class="kwd">do</span><span class="pln"> echo $X</span><span class="pun">;</span><span class="pln">X</span><span class="pun">=</span><span class="pln">$</span><span class="pun">(</span><span class="pln">X</span><span class="pun">+</span><span class="lit">1</span><span class="pun">);</span><span class="pln">done</span></pre>

<p>
	نفتح موجه أوامر في نافذة مختلفة ونضع النافذتين متجاورتين لكي نشاهد النتائج، ومن ثم نشغل الأمر <code>top</code>، وبعدها نشغل برنامج cpuHog الذي كتبناه باستخدام الأمر التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_8489_12" style="">
<span class="str">/tmp/</span><span class="pln">cpuHog</span></pre>

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

<p>
	يمكن عند الحاجة لقتل العملية ضمن الأداة top بالضغط على الحرف K، وستظهر رسالة تطلب رقم التعريف الخاص بالعملية <abbr title="Process IDentifier | معرّف العملية أو البرنامج">PID</abbr> التي يريد المستخدم قتلها. وبعد إدخال هذا الرقم نضغط على "Enter"، وعندها ستسأل الأداة المستخدِم عن الإشارة التي يرغب بإرسالها، والتي تكون افتراضيًا "15". يمكن في هذه المرحلة تجربة الإشارات المختلفة وملاحظة الاختلافات فيما بينها.
</p>

<h2>
	أداة top
</h2>

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

<p>
	يظهر الشكل (1) عينةً من نتائج عمل الأداة top، ويقسم هذا الخرج إلى جزأين أساسيين وهما جزء الملخص "Summary" وجزء العملية "Process" بالترتيب. حيث يمكن الاستفادة من الأوامر التفاعلية الخاصة بالأداة من قِبل المستخدِم لتغيير طريقة العرض الخاصة بالأداة لتناسب المستخدِم، إضافةً إلى التحكم بالعمليات كليًا، إذ تعرض الأداة كل الأوامر المتاحة بالضغط على h لاستعراض المساعدة الخاصة بالأداة والتي تكون موزّعةً على صفحتين، بحيث يحدث الانتقال إلى الصفحة الثانية بالضغط على h مرتين، ويمكن الخروج من الصفحة بالضغط على q.
</p>

<h3>
	جزء الملخص
</h3>

<p>
	يقدم هذا الجزء ملخّصًا عامًا عن النظام، حيث يُظهر السطر الأول منه زمن عمل النظام منذ آخر عملية إقلاع له، ومن ثم متوسط الحمل محسوبًا على مدة زمنية تعادل 1، 5، 15 دقيقة على الترتيب، بينما السطر الثاني يظهر عدد العمليات النّشطة في الحاسوب وحالة كل من هذه العمليات. تظهر في السطر الثالث إحصائيات خاصة بالمعالج، بحيث قد تكون هذه الإحصائيات مقتصِرةً على سطر واحد يتضمن الإحصائيات عن جميع المعالجات الموجودة في الحاسوب، ويمكن أن نجد سطرًا لكل معالج على حدة، كما يمكن تبديل طريقة الإظهار بين المعلومات المجمّعة عن المعالج، والمعلومات عن المعالجات إفراديًا بالضغط على الرقم 1، بحيث ستظهر القيم بشكل نسبة مئوية من وقت المعالج المتاح للتنفيذ.
</p>

<p>
	نجد في النتائج القيم التالية:
</p>

<ul>
<li>
		<strong>us:userspace</strong>: تشير إلى وقت المعالج المخصص للتطبيقات والبرامج الي تعمل ضمن مجال المستخدم وليس ضمن نواة نظام التشغيل.
	</li>
	<li>
		<strong>sy:system calls</strong>: تشير إلى وقت المعالج المخصص لاستدعاءات النظام، وهي الوظائف التي تنفَّذ ضمن نواة نظام التشغيل. تجدر الإشارة إلى أنّ هذه النسبة لا تتضمن الزمن الخاص بعمل النواة نفسها.
	</li>
	<li>
		<strong>ni:nice</strong>: تشير إلى وقت المعالج المخصص للعمليات التي تعمل بمستوى لطافة إيجابي (*)، ويمكن النظر إلى رقم اللطافة الخاص بالعمليات وكأنه أولوية، لكن توجد اختلافات دقيقة بين المصطلحين ليست من موضوع هذه المقالة.
	</li>
	<li>
		<strong>id:idle</strong>: تشير إلى وقت المعالج الذي يكون فيها خاملًا.
	</li>
	<li>
		<strong>wa:wait</strong>: تشير إلى الوقت الذي يكون فيه المعالج بحالة انتظار لإتمام عمليات الإدخال والإخراج، وبالطبع يمثل هذا الوقت هدرًا في عمل المعالج.
	</li>
	<li>
		<strong>hi:hardware interrupts</strong>: تشير إلى الوقت الذي يصرفه المعالج في معالجة المقاطعات العتادية الواردة إليه.
	</li>
	<li>
		<strong>si:software interrupts</strong>: تشير إلى الوقت الذي يصرفه المعالج في معالجة المقاطعات البرمجية الوارد إليه.
	</li>
	<li>
		<strong>st:steal time</strong>: تشير إلى الوقت الذي يقضيه المعالج المنطقي حتى ينهي المعالج الفيزيائي تخديم معالج منطقي آخر والانتقال إليه.
	</li>
</ul>
<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		اقتباس
	</div>

	<p>
		(*) مستوى اللطافة هو تعبير عن الأولوية للعمليات الخاصة بالمستخدِم، والتي تربطها علاقة بأولوية العملية الحقيقية، حيث أن قيمة الأولوية = قيمة اللطافة + 20، وتأخذ قيم اللطافة قيمًا موجبةً وقيمًا أخرى سالبة تتراوح بين المجال -20 (الأعلى) و+19 (الأدنى)، <a href="https://medium.com/@chetaniam/a-brief-guide-to-priority-and-nice-values-in-the-linux-ecosystem-fb39e49815e0" rel="external nofollow">الدليل الموجز إلى القيم الأولوية اللطيفة في النظام البيئي لينكس</a>
	</p>
</blockquote>

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

<p style="text-align: center;">
	<img alt="linuxsys_image1-520x395.jpg" class="ipsImage ipsImage_thumbnailed" data-fileid="73170" data-unique="usjl3g367" src="https://academy.hsoub.com/uploads/monthly_2021_08/linuxsys_image1-520x395.jpg.583d4646c6c6e1dc8aaff18aa681c112.jpg"></p>

<p style="text-align: center;">
	الشكل (1): يُظهر الأمر top المعلومات الكاملة عن معالج رباعي النوى مستخدم كليًا.
</p>

<p>
	يمكن الضغط على l لإيقاف عرض متوسط الحمل أو تشغيله، كما يمكن الضغط على t وm من أجل تغيير طرق العرض الخاصة بمعلومات العمليات والذاكرة.
</p>

<h3>
	جزء العمليات
</h3>

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

<ul>
<li>
		<strong><abbr title="Process IDentifier | معرّف العملية أو البرنامج">PID</abbr></strong>: يعبر عن رقم التعريف الخاص بالعملية، وهو رقم فريد خاص بالعملية يميزها عن كل العمليات الأخرى.
	</li>
	<li>
		<strong>USER</strong>: يعبر عن اسم المستخدم الذي يملك العملية.
	</li>
	<li>
		<strong>PR</strong>: يعبر عن أولوية العملية.
	</li>
	<li>
		<strong>NI</strong>: يعبر عن رقم اللطافة الخاص بالعملية.
	</li>
	<li>
		<strong>VIRT</strong>: يعبر عن إجمالي الذاكرة الافتراضية المخصصة للعملية.
	</li>
	<li>
		<strong>RES</strong>: يعبر عن الذاكرة الفيزيائية غير القابلة للتبادل المخصصة للعملية، وهي مقاسة بالكيلوبت ما لم يذكر خلاف ذلك.
	</li>
	<li>
		<strong>SHR</strong>: يعبر عن كمية الذاكرة المشتركة المخصصة للعملية.
	</li>
	<li>
		<strong>S</strong>: يعبر عن حالة العملية، وقد يكون R إذا كانت العملية قيد التشغيل، أو S إذا دخلت العملية في حالة النوم أو Z إذا تحولت العملية إلى عملية ميتة-حية (زومبي). كما توجد بعض الحالات الأقل شيوعًا مثل T للمتوقفة، أو D لحالة النوم غير القابل للمقاطعة.
	</li>
	<li>
		<strong>‎% CPU</strong>: يعبر عن وقت المعالج الذي استهلكته العملية خلال فترة القياس.
	</li>
	<li>
		<strong>‎% MEM</strong>: يعبر عن نسبة الذاكرة الفيزيائية المستهلكة من قبل العملية.
	</li>
	<li>
		<strong>Time +</strong>: يعبر عن وقت المعالج الكلي المخصص للعملية منذ بدء عملها لأول مرة.
	</li>
	<li>
		<strong>COMMAND</strong>: يعبر عن الأمر الذي استُخِدم لتشغيل العملية.
	</li>
</ul>
<p>
	يمكن الضغط على Page Up وPage Down للتنقل بين قائمة العمليات قيد التنفيذ، ويمكن ضبط المدة الزمنية لأخذ القراءات باستخدام d وs، وتكون هذه المدة افتراضيًا ثلاث ثواني، بحيث يمكن تعديلها لتصبح جزءًا من الثانية، لكن ذلك يزيد من استهلاك الأداة لموارد الحاسوب ومن المفضل ضبط هذه القيمة بحيث تعادل ثانيةً واحدةً كي لا تؤثر سلبًا على أداء الحاسب وتعطي معلومات وافرة عن هذا الأداء.
</p>

<p>
	يفيد الضغط على &lt; و &gt; في التنقل بين الأعمدة إلى اليمين أو اليسار، كما يمكن الضغط على k من أجل قتل العملية أو الضغط على r من أجل تعديل مستوى لطافتها، وفي كلتا الحالتين يجب تحديد رقم التعريف الخاص بالعملية، حيث يجب أن نحدد رقم الإشارة عند قتل العملية. عادةً ما تبدأ المحاولات بالإشارة 15 وفي حال عدم نجاحها يمكن استخدام الإشارة 9 لقتل العملية قتلًا مؤكدًا.
</p>

<h3>
	الضبط
</h3>

<p>
	يمكن للمستخدِم الذي يعدّل معلومات العرض الخاصة بالأداة، استخدام الأمر W (يجب استخدام الحرف الكبير Uppercase)، وذلك لكتابة التغييرات إلى ملف الضبط، والذي يوجد عادةً في المسار"‎"~/.toprc في المساحة المخصصة للمستخدِم.
</p>

<h2>
	أداة atop
</h2>

<p>
	تتيح هذه الأداة معلومات أكثر تفصيلًا موازنةً بالأداة top. ومن أهم المعلومات الإضافية التي يمكن الحصول عليها باستخدام هذه الأداة، هي نشاط الإدخال والإخراج، حيث تتحدث القيم الظاهرة على الشاشة بعد انقضاء عشرة ثواني، ويمكن تغيير هذه المدة بالضغط على i واستخدام قيمة تناسب حاجة المستخدم. لا تستطيع هذه الأداة استخدام أجزاء الثانية مثل سابقتها، لكن يمكن استخدام الأمر h للحصول على المساعدة، وتوجد عدة صفحات ضمن دليل المساعدة يمكن التنقل بينها بالضغط على المسطرة Space.
</p>

<p>
	تتميز هذه الأداة بقدرتها على تخزين معلومات الأداء الخام ضمن ملف واستعراض محتوياته لاحقًا من أجل الدراسة المعمقة، مما يفيد في كشف بعض المشاكل الخفية وخصيصًا تلك التي تظهر في الوقت الذي لا يكون فيه النظام خاضعًا للمراقبة. يستخدم البرنامج atopsar لاستعراض محتويات الملفات المخزّنة حسب حاجة المستخدم.
</p>

<p style="text-align: center;">
	<img alt="linuxsys_image2-520x314.jpg" class="ipsImage ipsImage_thumbnailed" data-fileid="73171" data-unique="w513k9n4h" src="https://academy.hsoub.com/uploads/monthly_2021_08/linuxsys_image2-520x314.jpg.d28ac4261e8125352a3b0e52aa2f1036.jpg"></p>

<p style="text-align: center;">
	الشكل (2): يقدم نظام المراقبة atop المعلومات حول نشاط الأقراص والشبكة إضافة إلى نشاط المعالج.
</p>

<h3>
	جزء الملخص
</h3>

<p>
	تقدّم الأداة atop نفس المعلومات التي تقدّمها الأداة top، إلا أنّها تعرض بعض المعلومات الإضافية مثل المعلومات المتعلقة بنشاط الشبكة والأقراص والحجوم المنطقية ضمن الأقراص. يبين الشكل (2) أعلاه بعضًا من هذه المعلومات، تجدر الإشارة إلى أنّ عدد الأعمدة الذي يظهر هو مرتبط بأبعاد الشاشة، بحيث إذا كانت كافيةً فستعرض الأداة كافة الأعمدة بما تتضمنه من معلومات، وإلا فإنها تهمل بعضًا منها. تتميز هذه الأداة موانةً بجميع أنظمة المراقبة الأخرى بنها تعرض تردد المعالج الحالي، إضافةً إلى تبيان معامل توسيع التردد scaling factor، وتظهر هاتين القيمتين في أقصى اليمين ضمن السطر الثاني.
</p>

<h3>
	جزء العملية
</h3>

<p>
	تعرض الأداة atop بعضًا من الأعمدة التي تعرضها الأداة top، ولكنها تضيف بعض المعلومات مثل معلومات الإدخال والإخراج الخاصة بالقرص وعدد النياسب (الخيوط threads)، إضافةً إلى إحصائيات عن تغير كل من الذاكرتين الافتراضية والحقيقية لكل عملية. كما هو الحال في جزء الملخص، يمكن إظهار كامل الأعمدة إذا سمحت أبعاد الشاشة بذلك، وإلا فلن تظهر بعض الأعمدة مثل العمود المخصص لعرض رقم التعريف الحقيقي للمستخدم RUID الذي يملك العملية، ورقم التعريف الفعلي للمستخدم EUID، وتكون هاتين المعلومتين هامتين عند تشغيل بعض البرامج مع التلاعب بهوية المستخدم الذي ينفذ أمر التشغيل للبرنامج.
</p>

<p>
	تقدّم الأداة معلومات تفصيلية عن القرص والذاكرة والشبكة والجدولة الخاصة بكل عملية. يمكن الضغط على d وm وn وs بالترتيب لمشاهدة أي من التفاصيل السابقة، كما يمكن الضغط على g لإعادة الإظهار إلى وضعه الطبيعي.
</p>

<p>
	يمكن للمستخدم ترتيب العرض وفقًا لمعيار محدد، حيث يمكن الضغط على C للترتيب اعتمادًا على استهلاك وحدة المعالجة المركزية، أو الضغط على M للترتيب اعتمادًا على استهلاك الذاكرة، أو الضغط على D للترتيب اعتمادًا على استهلاك القرص، أو الضغط على N للترتيب اعتمادًا على استهلاك الشبكة، أو الضغط على A للترتيب التلقائي، ويعني ذلك الترتيب وفقًا للمورد الأكثر إشغالًا من قبل العملية. لن تعمل عمليات الترتيب الخاصة بالشبكة إلا بوجود مكتبة netatop إلى جانب الأداة atop، ويمكن الضغط على k لقتل أي عملية ولا تمتلك هذه الأداة القدرة على تعديل مستوى اللطافة مثل سابقتها.
</p>

<p>
	لا تعرِض هذه الأداة أجهزة الشبكة والتخزين التي لا تكون نشطةً ضمن فترة جلب المعلومات، مما قد يعطي انطباعًا خاطئًا عن ضبط الجهاز المستخدَم، فقد يوهم بعض المستخدمين بأن أحد الأجهزة لا يعمل بطريقة صحيحة، ولتجنب ذلك يمكن الضغط على f لعرض جميع الموارد وحتى الخاملة منها.
</p>

<h3>
	الضبط
</h3>

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

<h2>
	أداة htop
</h2>

<p>
	تشبه هذه الأداة إلى حد كبير الأداة top، ولكنها تعرض بعض المعلومات الإضافية التي لا تقدمها تلك الأداة، حيث لا تقدم هذه الأداة المعلومات عن القرص والشبكة والإدخال والإخراج كما في atop.
</p>

<p style="text-align: center;">
	<img alt="linuxsys_image3-520x417.jpg" class="ipsImage ipsImage_thumbnailed" data-fileid="73172" data-unique="yqjei7dvk" src="https://academy.hsoub.com/uploads/monthly_2021_08/linuxsys_image3-520x417.jpg.5a7422a9f019b34a620db0d717b8fc63.jpg"></p>

<p style="text-align: center;">
	الشكل (3): تمتلك الأداة htop طريقة إظهار جذابة للمستخدمين، كما أنها تعرض شجرة العملية كاملةً.
</p>

<h3>
	جزء الملخص
</h3>

<p>
	يتضمن جزء الملخص للأداة htop عمودين أساسيين يتميزان بالمرونة الشديدة وقدرة المستخدم على ضبطهما بالشكل والترتيب الذي يناسبه، حيث يمكن للمستخدم مشاهدة استهلاك المعالج عن طريق الشريط الظاهر أمامه، كما يمكن استخدام شريط واحد لكامل وحدة المعالجة المركزية، إلى جانب إمكانية استعمال شريط لكل معالج موجود، أو تجميع العرض من عدة معالجات معًا ضمن شريط واحد.
</p>

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

<p>
	يمكن تعديل ضبط هذا الجزء بالضغط على F2 حيث تُعرض الخيارات المتاحة ويضيف المستخدم ما يشاء من هذه الخيارات وترتيبها ضمن العرض كما يشاء.
</p>

<h3>
	جزء العملية
</h3>

<p>
	يشبه جزء العملية الخاص بهذه الأداة إلى حد كبير الأدوات السابقة، حيث يمكن ترتيب العمليات اعتمادًا على نسبة استهلاك المعالج، أو الذاكرة، أو المستخدم، أو رقم تعريف العملية، مع ملاحظة أنه لا يمكن استخدام وظيفة الترتيب عندما يختار المستخدم العرض بالشكل الشجري.
</p>

<p>
	يختار المستخدم العمود الذي سيكون الترتيب وفقًا له، وذلك بالضغط على F6 لتُعرض مجموعة الأعمدة التي يمكن الترتيب وفقًا لها، وبعد إقدام المستخدم على الاختيار، فسيضغط على Enter لتنفيذ عملية الترتيب.
</p>

<p>
	يمكن التنقّل بين العمليات باستخدام الأسهم وذلك لاختيار عمليةٍ ما، وبعد الاختيار يمكن قتل العملية بالضغط على k، ومن ثم تظهر قائمة بالإشارات ليختار المستخدِم واحدةً منها، بحيث تُرسل إلى العملية. يمكن أيضًا الضغط على المفتاحين F7 وF8 لتغيير مستوى اللطافة للعملية المختارة.
</p>

<p>
	يمكن الضغط على F5 لأية عملية لتُعرض شجرة العملية كاملةً، وبالتالي يمكن تحديد العملية الأب الذي ولّد هذه العملية، وتُعَد هذه المسألة هامةً جدًا عند تشخيص مشاكل العمليات، وخصيصًا ظهور عمليات "ميتة-حية" في النظام.
</p>

<h3>
	الضبط
</h3>

<p>
	يمتلك كل مستخدم ملف ضبط خاص به مخزنًا في المسار"‎~/.config/htop/htoprc"، وتُحفَظ التغييرات التي يجريها المستخدم في هذا الملف تلقائيًا. لا تمتلك هذه الأداة ضبطًا عامًا وإنما يوجد الضبط فقط ضمن ملفات المستخدم.
</p>

<h2>
	أداة glances
</h2>

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

<p>
	تُعَد السلبية الوحيدة لهذه الأداة أنها تستهلك نسبةً كبيرةً من الموارد موازنةً بسابقاتها، وتتراوح نسبة استهلاكها للمعالج بين 10% و18% من إجمالي استخدام المعالج، وهذه النسبة كبيرة جدًا خصوصًا في الأنظمة المحدودة بالموارد.
</p>

<h3>
	جزء الملخص
</h3>

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

<p style="text-align: center;">
	<img alt="linuxsys_image4-520x441.jpg" class="ipsImage ipsImage_thumbnailed" data-fileid="73173" data-unique="yt3va43kb" src="https://academy.hsoub.com/uploads/monthly_2021_08/linuxsys_image4-520x441.jpg.aa4e9f105a70b6b39aa84c2d0d1625f6.jpg"></p>

<p style="text-align: center;">
	الشكل (4): يُظهر الشكل واجهة الأداة glances متضمنةً معلومات الشبكة والقرص ونظام الملفات ومعلومات الحساسات.
</p>

<p>
	كما في الأدوات السابقة، يمكن الضغط على 1 لتغيير طريقة عرض معلومات المعالج إما لتعرِض المعلومات عن إجمالي استخدام المعالج أو عرض المعلومات الخاصة بكل معالج على حدى.
</p>

<h3>
	جزء العملية
</h3>

<p>
	يعرض هذا الجزء المعلومات الاعتيادية عن كل من العمليات قيد التشغيل، حيث يمكن أن تُرتَّب العمليات تلقائيًا بالضغط على a، أو بالاعتماد على استهلاك المعالج c، أو بالاعتماد على استهلاك الذاكرة m، أو بالاعتماد على اسم العملية p، أو بالاعتماد على اسم المستخدم u، أو بالاعتماد على معدل الإدخال والإخراج i، أو بالاعتماد على الوقت t. يعني أن الترتيب التلقائي في الأداة هو اختيار عرض العمليات بالاعتماد على المورد الأكثر استخدامًا، فإذا كان استهلاك المعالج أكبر من 70%، فسيعتمد ترتيب العمليات على استهلاك كل عملية من وقت المعالج، وإذا كان استهلاك الذاكرة أكبر من 70%، فيعتمد الترتيب على استهلاك كل عملية من الذاكرة.
</p>

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

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

<h3>
	الشريط الجانبي
</h3>

<p>
	تمتلك الأداة glances شريطًا جانبيًا جميلًا والذي يعرِض معلومات غير موجودة في كل من top وhtop. يمكن أن تعرِض atop بعضًا من المعلومات التي تعرضها هذه الأداة، ولكن فقط glances هي القادرة على عرض معلومات حساسات الحرارة من الأدوات السابقة، كما يمكن عرض المعلومات عن الأقراص ونظام الملفات والشبكة والحساسات، بالضغط على d أو f أو n أو s بالترتيب، ويمكن اظهار الشريط الجانبي بالضغط على 2، كما يمكن عرض الإحصائيات في أسفل الشاشة بالضغط على D.
</p>

<h3>
	الضبط
</h3>

<p>
	لا تتطلب الأداة glances ملفًا للضبط لكي تعمل بصورة صحيحة، ولكن في حال رغبة المستخدم بوجوده، فيوجد ملف الضبط العام ضمن المجلد الحامل لهذه التسمية "‎"/etc/glances/glances.conf،  فعندما ينشئ المستخدم ملف الضبط الخاص به ضمن المسار "‎"~/.config/glances/glances.conf، فإنه سيصبح ملف الضبط الفعال، ويتجاوز ملف الضبط العام. يمكن ضمن هذه الملفات تحديد عتبات الإنذارات والتحذيرات فقط، في حين فيجب إعادة ضبط أية تعديلات أخرى على الأداة مثل تعديل الشريط الجانبي أو غيره في كل مرة بعد تشغيل الأداة.
</p>

<p>
	يتضمن توثيق الأداة معلومات كافية عن استخدام الأداة glances، وتكون موجودةً افتراضيًا ضمن المسار التالي:
</p>

<pre class="ipsCode prettyprint lang-javascript prettyprinted" id="ips_uid_7092_6" style="">
<span class="str">"‎/usr/share/doc/glances/glances-doc.html"</span><span class="pln">
</span></pre>

<p>
	 وعلى الرغم من أنه قد ذُكِر في الوثيقة أنه يمكن ضبط الأداة كاملةً عن طريق الملف، إلا أنّه لم تُذكر أية طريقة لتحقيق ذلك ضمن الملف.
</p>

<h2>
	الخلاصة
</h2>

<p>
	يجب على المستخدم قراءة الدليل الخاص بكل أداة من أدوات المراقبة للتعرف على الطريقة التي تناسب المستخدم في ضبطها والتفاعل معها، ويمكن دومًا الاستعانة بالأمر h ضمن الأدوات للاستفادة من المساعدة التفاعلية الموجودة ضمنها، والتي تقدّم الكثير من المعلومات حول تنفيذ عمليات الاختيار والترتيب في الأداة.
</p>

<p>
	يمكن أن تقدّم هذه الأدوات الكثير من المعلومات عن سبب المشاكل التي تصادف المستخدم، كما يمكن أن تحدد أيًا من العمليات هو الأكثر استهلاكًا للمعالج، أو تحديد كمية الذاكرة الحرّة المتاحة، إضافةً إلى معرفة أي من العمليات قد أوقفت مؤقتًا لأنها تنتظر عمليات الإدخال والإخراج، أو لأنها تنتظر الشبكة. يمكن بالمراقبة المستمرة لهذه الأدوات أن يستطيع المستخدِم التمييز بين السلوك الطبيعي للنظام عن السلوك غير الطبيعي الذي يظهر بالنهاية على هيئة مشكلة في الأداء، كما يجب الأخذ بالحسبان أنّ هذه الأدوات تستهلك من موارد الحاسوب الذي تراقبه، حيث تستهلك الأداة glances نسبةً تتراوح بين 10% و20% من وقت المعالج، بينما لا تستهلك الأدوات المتبقية أكثر من 3% من نفس المورد، ويجب التفكير بذلك جيدًا عند اختيار الأداة المناسبة بتقدير نوع المعلومات التي يحتاج المستخدم مراقبته إضافةً إلى معرفة مواصفات الجهاز الذي يُراقَب.
</p>

<p>
	ترجمة -وبتصرف- للمقال "<a href="https://opensource.com/life/16/2/open-source-tools-system-monitoring" rel="external nofollow">‎4 open source tools for Linux system monitoring</a>" لصاحبه David Both.
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
<li>
		<a href="https://academy.hsoub.com/devops/linux/%D9%85%D8%A7-%D9%87%D9%88-%D9%86%D8%B8%D8%A7%D9%85-%D8%A7%D9%84%D8%AA%D8%B4%D8%BA%D9%8A%D9%84-%D9%84%D9%8A%D9%86%D9%83%D8%B3%D8%9F-r451/" rel="">ما هو نظام التشغيل لينكس؟</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/devops/linux/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D9%85%D8%B5%D8%B7%D9%84%D8%AD%D8%A7%D8%AA-%D9%88%D9%85%D9%81%D8%A7%D9%87%D9%8A%D9%85-%D8%A7%D9%84%D8%AA%D8%AE%D8%B2%D9%8A%D9%86-%D9%81%D9%8A-%D9%84%D9%8A%D9%86%D9%83%D8%B3-r301/" rel="">مدخل إلى مصطلحات ومفاهيم التخزين في لينكس</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/devops/linux/%D8%B9%D8%B4%D8%B1%D9%88%D9%86-%D8%A3%D9%85%D8%B1%D8%A7-%D9%81%D9%8A-%D9%84%D9%8A%D9%86%D9%83%D8%B3-%D9%8A%D9%81%D8%AA%D8%B1%D8%B6-%D8%A3%D9%86-%D9%8A%D8%B9%D8%B1%D9%81%D9%87%D8%A7-%D9%83%D9%84-%D9%85%D8%AF%D9%8A%D8%B1-%D9%86%D8%B8%D9%85-r355/" rel="">عشرون أمرا في لينكس يفترض أن يعرفها كل مدير نظم</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/devops/linux/%D8%AF%D9%84%D9%8A%D9%84-%D8%A7%D9%84%D9%85%D8%B3%D8%AA%D8%AE%D8%AF%D9%85-%D9%84%D9%84%D8%B1%D9%88%D8%A7%D8%A8%D8%B7-%D9%81%D9%8A-%D9%86%D8%B8%D8%A7%D9%85-%D9%85%D9%84%D9%81%D8%A7%D8%AA-%D9%84%D9%8A%D9%86%D9%83%D8%B3-r371/" rel="">دليل المستخدم للروابط في نظام ملفات لينكس</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">523</guid><pubDate>Sun, 01 Aug 2021 07:40:15 +0000</pubDate></item><item><title>&#x62A;&#x62B;&#x628;&#x64A;&#x62A; Jenkins &#x639;&#x644;&#x649; &#x623;&#x648;&#x628;&#x646;&#x62A;&#x648; 18.04</title><link>https://academy.hsoub.com/devops/linux/%D8%AA%D8%AB%D8%A8%D9%8A%D8%AA-jenkins-%D8%B9%D9%84%D9%89-%D8%A3%D9%88%D8%A8%D9%86%D8%AA%D9%88-1804-r462/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2020_03/How-To-Install-Jenkins-on-Ubuntu-18_04.jpg.354e866035c01c9c5a70ca10b5fed85c.jpg" /></p>

<p>
	Jenkins هو خادم أتمتة مفتوح المصدر يعمل على أتمتة المهام الفنية المتكررة التي ينطوي عليها التكامل المستمر وتقديم البرامج، Jenkins مكتوبة بلغة Java ويمكن تثبيتها من حزم أوبنتو أو عن طريق تنزيل وتشغيل ملف WAR (وهو عبارة عن مجموعة من الملفات التي تشكل تطبيق ويب كاملًا لتشغيله على خادم).
</p>

<p>
	في هذا المقال ستقوم بتثبيت Jenkins بإضافة مستودع حزمة ديبيان، واستخدام هذا المستودع لتثبيت الحزمة من خلال الأداة apt-get.
</p>

<h2>
	المتطلبات الأساسية
</h2>

<p>
	من أجل متابعة هذا المقال، ستحتاج إلى:
</p>

<ul>
<li>
		<p>
			خادم اوبنتو 18.04 فيه مستخدم يحمل صلاحيات sudo وغير جذري (non-root) ومثبت عليه جدار حماية وذلك باتباع <a href="https://academy.hsoub.com/devops/linux/%D8%A7%D9%84%D8%AA%D9%87%D9%8A%D8%A6%D8%A9-%D8%A7%D9%84%D8%A3%D9%88%D9%84%D9%8A%D8%A9-%D9%84%D8%AE%D8%A7%D8%AF%D9%85-%D8%A3%D9%88%D8%A8%D9%88%D9%86%D8%AA%D9%88-1804-r431/" rel="">دليل الاعداد الاولي لخادم اوبنتو18.04</a> نوصي بالبدء باستخدام 1 غيغابايت على الأقل من الذاكرة RAM، راجع <a href="https://jenkins.io/doc/book/hardware-recommendations/" rel="external nofollow">هذه التوصيات</a> للحصول على متطلبات التثبيت اللازمة.
		</p>
	</li>
	<li>
		<p>
			بتثبيت Java 8، باتباع <a href="https://academy.hsoub.com/devops/linux/%D8%AA%D8%AB%D8%A8%D9%8A%D8%AA-%D8%AC%D8%A7%D9%81%D8%A7-%D8%B9%D9%84%D9%89-%D8%A3%D8%A8%D9%88%D9%86%D8%AA%D9%88-1804-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%A7%D9%84%D8%A3%D8%AF%D8%A7%D8%A9-apt-r418/" rel="">هذا المقال</a>.
		</p>
	</li>
</ul>
<h2>
	الخطوة الأولى: تثبيت Jenkins
</h2>

<p>
	الإصدار المتوفر في متجر أوبنتو الحزم على الأغلب هو اصدار أقدم من الإصدار المتوفر في المشروع نفسه، للحصول على اخر التحديثات والميزات سوف نستخدم الحزم المصانة من قبل مشروع Jenkins نفسه.
</p>

<p>
	علينا أولًا إضافة مفتاح المستودع repository للنظام من خلال الأمر التالي:
</p>

<pre class="ipsCode">
$ wget -q -O - https://pkg.jenkins.io/debian/jenkins.io.key | sudo apt-key add -
</pre>

<p>
	بعد إضافة المفتاح بنجاح سيظهر النظام لك كلمة OK؛ سنضيف بعد ذلك عنوان مستودع لحزمة  ديبيان إلى الملف <code>sources.list</code> الموجود في الخادم:
</p>

<pre class="ipsCode">
$ sudo sh -c 'echo deb http://pkg.jenkins.io/debian-stable binary/ &gt; /etc/apt/sources.list.d/jenkins.list'
</pre>

<p>
	بعد تنفيذ الأمرين السابقين بنجاح سوف نقوم بتحديث الحزم في المستودع repository باستخدام الأمر التالي:
</p>

<pre class="ipsCode">
$ sudo apt update
</pre>

<p>
	اخيرا سنقوم بتثبيت Jenkins وكل ما تعتمد عليه:
</p>

<pre class="ipsCode">
$ sudo apt install jenkins
</pre>

<p>
	الآن Jenkins واعتماديته كلها جاهزة لذا سنقوم بتشغيل الخادم.
</p>

<h2>
	الخطوة الثانية: بدء تشغيل خادم Jenkins
</h2>

<p>
	سنستخدم <code>systemctl</code> لتشغيل خادم Jenkins:
</p>

<pre class="ipsCode">
$ sudo systemctl start jenkins
</pre>

<p>
	و لعدم إظهار الأمر لأي مخرجات سنستخدم الخيار <code>Status</code> لعرض حالة الخدمة للتأكد أنها قد بدأت دون مشاكل:
</p>

<pre class="ipsCode">
$ sudo systemctl status jenkins
</pre>

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

<pre class="ipsCode">
● jenkins.service - LSB: Start Jenkins at boot time
   Loaded: loaded (/etc/init.d/jenkins; generated)
   Active: active (exited) since Mon 2018-07-09 17:22:08 UTC; 6min ago
     Docs: man:systemd-sysv-generator(8)
    Tasks: 0 (limit: 1153)
   CGroup: /system.slice/jenkins.service
</pre>

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

<h2>
	الخطوة الثالثة: اضبط إعدادات جدار الحماية
</h2>

<p>
	بشكل تلقائي Jenkins يعمل على منفذ رقم 8080 لذلك سنعمل على فتح هذا المنفذ داخل <a href="https://academy.hsoub.com/devops/security/firewalls/%D9%83%D9%8A%D9%81-%D8%AA%D8%B6%D8%A8%D8%B7-%D8%AC%D8%AF%D8%A7%D8%B1%D8%A7-%D9%86%D8%A7%D8%B1%D9%8A%D8%A7-%D9%81%D9%8A-%D8%A3%D9%88%D8%A8%D9%86%D8%AA%D9%88-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-ufw-r120/" rel="">جدار الحماية <code>ufw</code></a>:
</p>

<pre class="ipsCode">
$ sudo ufw allow 8080
</pre>

<p>
	من خلال التحقق من حالة الجدار الناري يمكن رؤية القاعدة الجديدة ب <code>ufw</code>:
</p>

<pre class="ipsCode">
$ sudo ufw status
</pre>

<p>
	يمكنك الآن رؤية التراسل الشبكي عبر المنفذ 8080 المتاح من كل الشبكات:
</p>

<pre class="ipsCode">
Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
8080                       ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)
8080 (v6)                  ALLOW       Anywhere (v6)
</pre>

<p>
	<strong>ملاحظة</strong>: اذا كان جدار الحماية غير فعال يجب تنفيذ الأوامر التالية للسماح ب OpenSSH وتفعيل جدار الحماية:
</p>

<pre class="ipsCode">
$ sudo ufw allow OpenSSH
$ sudo ufw enable
</pre>

<p>
	بعد تثبيت Jenkin و ضبط إعدادات جدار الحماية الخاص بنا سنكمل الإعدادات المبدئية له.
</p>

<h2>
	الخطوة الرابعة: ضبط خدمة Jenkins
</h2>

<p>
	من أجل ضبط خدمة Jenkins علينا الدخول لصفحة الإعدادات من خلال المنفذ الافتراضي 8080 باستخدام اسم النطاق للخادم أو عنوان <code>http://your_server_ip_or_domain:8080</code>. ستظهر لك شاشة مقفلة من Jenkins تعرض موقع الذي تخزن فيه كلمة المرور المبدئية وتطلب إدخالها.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2020_03/image1.png.c55cea2d933817fdaa0a0a468d011752.png" data-fileid="34981" rel=""><img class="ipsImage ipsImage_thumbnailed" data-fileid="34981" data-unique="data-unique" src="https://academy.hsoub.com/uploads/monthly_2020_03/image1.thumb.png.a235c3eeab7e5924c539550c3cf85ea2.png" alt="image1.png"></a>
</p>

<p>
	من خلال واجهة سطر الأوامر سوف نستخدم الأمر <code>Cat</code> من أجل اظهار كلمة المرور:
</p>

<pre class="ipsCode">
$ sudo cat /var/lib/jenkins/secrets/initialAdminPassword
</pre>

<p>
	تتألف كلمة المرور من 32 حرف سوف نقوم بنسخها من واجهة سطر الأوامر و لصقها داخل الحقل <strong>Administrator password</strong> ثم الضغط على زر الاستمرار <strong>Continue</strong>. بعد ذلك ستظهر لك صفحة تعرض لك خيارين تثبيت الإضافات المقترحة أو تحديد إضافات معينة.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2020_03/image2.png.6cb9ad1f25f5454f04a812526924ce86.png" data-fileid="34982" rel=""><img class="ipsImage ipsImage_thumbnailed" data-fileid="34982" data-unique="data-unique" src="https://academy.hsoub.com/uploads/monthly_2020_03/image2.thumb.png.e047751b5d57c1eff687230d099d6fed.png" alt="image2.png"></a>
</p>

<p>
	اختر الخيار <strong>Install suggested plugins</strong> الذي سيبدأ عملية التنزيل مباشرة.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2020_03/image3.png.601b0e546a98622c220b79c777553472.png" data-fileid="34983" rel=""><img class="ipsImage ipsImage_thumbnailed" data-fileid="34983" data-unique="data-unique" src="https://academy.hsoub.com/uploads/monthly_2020_03/image3.thumb.png.d3b3cba8abdec9d585358d474b6a73e7.png" alt="image3.png"></a>
</p>

<p>
	عند الانتهاء من التثبيت، سيُطلب منك أولا إعداد المستخدم الإداري (administrative) ومن الممكن تخطي هذه الخطوة والمتابعة كمسؤول باستخدام كلمة المرور الأولية التي استخدمناها في الأعلى لكننا سنقوم بإنشاء مستخدم جديد.
</p>

<p>
	<strong>ملاحظة</strong>: خادم Jenkins الافتراضي غير مشفر، وبالتالي فإن البيانات المقدمة مع هذا النموذج ليست محمية. عندما تكون جاهزًا لاستخدام هذا التثبيت، اتبع هذا المقال <a href="https://www.digitalocean.com/community/tutorials/how-to-configure-jenkins-with-ssl-using-an-nginx-reverse-proxy-on-ubuntu-18-04" rel="external nofollow">التالي</a>؛ سيؤدي ذلك إلى حماية بيانات المستخدم والمعلومات التي يتم إرسالها عبر واجهة الويب.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2020_03/image4.png.7c2e0c3845ce1d966f4034d2aa56f076.png" data-fileid="34984" rel=""><img class="ipsImage ipsImage_thumbnailed" data-fileid="34984" data-unique="data-unique" src="https://academy.hsoub.com/uploads/monthly_2020_03/image4.thumb.png.3c2b9e4f66daac6cbccf72bf4e1e0ab1.png" alt="image4.png"></a>
</p>

<p>
	ادخل اسم و كلمة المرور للمستخدم الخاص بك:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2020_03/image5.png.78995657db31f3a15250dfd6780d557f.png" data-fileid="34985" rel=""><img class="ipsImage ipsImage_thumbnailed" data-fileid="34985" data-unique="data-unique" src="https://academy.hsoub.com/uploads/monthly_2020_03/image5.thumb.png.d4ea6af336e5147a69fc638ff3c950ba.png" alt="image5.png"></a>
</p>

<p>
	ستظهر لك صفحة الضبط <strong>Instance Configuration</strong> وستطلب منك تأكيد عنوان URL المفضل لنسخة Jenkins. قم بتأكيد اسم النطاق لخادمك أو عنوان IP:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2020_03/image6.png.81799492264d4b78a0d94a65c54bd627.png" data-fileid="34986" rel=""><img class="ipsImage ipsImage_thumbnailed" data-fileid="34986" data-unique="data-unique" src="https://academy.hsoub.com/uploads/monthly_2020_03/image6.thumb.png.cd6509148d4010b6ec93c2efea5620ce.png" alt="image6.png"></a>
</p>

<p>
	بعد تأكيد المعلومات المناسبة، انقر فوق حفظ وإنهاء. سترى صفحة <strong>Jenkins is Ready!‎</strong>:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2020_03/image7.png.54b749fde8643a25738cb8d6e71beeea.png" data-fileid="34987" rel=""><img class="ipsImage ipsImage_thumbnailed" data-fileid="34987" data-unique="data-unique" src="https://academy.hsoub.com/uploads/monthly_2020_03/image7.thumb.png.2c9961c1445c56956ececd91dcc34176.png" alt="image7.png"></a>
</p>

<p>
	انقر فوق <strong>Start using Jenkins</strong> للانتقال للوحة التحكم الرئيسية لـخادم Jenkins:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2020_03/image8.png.f8496863046b400228aa3f87e267aeb2.png" data-fileid="34988" rel=""><img class="ipsImage ipsImage_thumbnailed" data-fileid="34988" data-unique="data-unique" src="https://academy.hsoub.com/uploads/monthly_2020_03/image8.thumb.png.4b7e8a76f18985765842991e055c834e.png" alt="image8.png"></a>
</p>

<p>
	تهانينا ، لقد تم تثبيت Jenkins بنجاح.
</p>

<h2>
	الخلاصة
</h2>

<p>
	في هذا المقال قد شرحنا آلية تثبيت Jenkins باستخدام الحزم المقدمة من المشروع، وبدء تشغيل الخادم، وفتح جدار الحماية، وإنشاء مستخدم مسؤول. في هذه المرحلة، يمكنك البدء في استكشاف Jenkins.
</p>

<p>
	عند الانتهاء من الاستكشاف، إذا قررت الاستمرار في استخدام Jenkins فاتبع الدليل <a href="https://www.digitalocean.com/community/tutorials/how-to-configure-jenkins-with-ssl-using-an-nginx-reverse-proxy-on-ubuntu-18-04" rel="external nofollow">التالي</a> لحماية كلمات المرور الخاصة بك وأيضًا معلومات النظام أو المنتج الحساسة التي ستكون إرسالها بين جهازك والخادم بنص عادي.
</p>

<p>
	ترجمة –وبتصرف– للمقال <a href="https://www.digitalocean.com/community/tutorials/how-to-install-jenkins-on-ubuntu-18-04" rel="external nofollow">How To Install Jenkins on Ubuntu 18.04</a> لصاحبته Melissa Anderson and Kathleen Juell
</p>
]]></description><guid isPermaLink="false">462</guid><pubDate>Wed, 04 Mar 2020 12:15:41 +0000</pubDate></item><item><title>&#x62A;&#x62B;&#x628;&#x64A;&#x62A; &#x648;&#x625;&#x639;&#x62F;&#x627;&#x62F; &#x646;&#x638;&#x627;&#x645; &#x627;&#x644;&#x648;&#x635;&#x648;&#x644; &#x639;&#x646; &#x628;&#x639;&#x62F; VNC &#x639;&#x644;&#x649; &#x646;&#x638;&#x627;&#x645; &#x62A;&#x648;&#x632;&#x64A;&#x639;&#x629; &#x62F;&#x64A;&#x628;&#x64A;&#x627;&#x646; 10</title><link>https://academy.hsoub.com/devops/linux/%D8%AA%D8%AB%D8%A8%D9%8A%D8%AA-%D9%88%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF-%D9%86%D8%B8%D8%A7%D9%85-%D8%A7%D9%84%D9%88%D8%B5%D9%88%D9%84-%D8%B9%D9%86-%D8%A8%D8%B9%D8%AF-vnc-%D8%B9%D9%84%D9%89-%D9%86%D8%B8%D8%A7%D9%85-%D8%AA%D9%88%D8%B2%D9%8A%D8%B9%D8%A9-%D8%AF%D9%8A%D8%A8%D9%8A%D8%A7%D9%86-10-r461/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2020_03/How-to-Install-and-Configure-VNC-on-Debian-10.jpg.8653d1a77a0335bbc9cf98a6cfe2c175.jpg" /></p>

<p>
	حوسبة الشبكة الافتراضية أو ما يدعى VNC هو عبارة عن نظام اتصال يسمح لك بإستخدام لوحة المفاتيح والفأرة الخاصة بك للتفاعل مع بيئة سطح المكتب رسومية للخادم عن بعد مما يسمح بإدارة الملفات والبرمجيات والإعدادات على الخادم (الخادم المتحكم به عن بعد) بشكل أسهل على المستخدمين الذين لا يفضلون استخدام واجهة الأوامر.
</p>

<p>
	في هذا المقال، ستقوم بإعداد خادم VNC على الخادم Debian 10 والاتصال به بأمان عبر <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr> وتستخدم TightVNC، هي عبارة عن حزمة التحكم عن بعد سريعة وخفيفة يتضمن هذا الخيار أن يكون اتصال VNC سلسًا ومستقرًا حتى في اتصالات الإنترنت البطيئة.
</p>

<h2>
	المتطلبات الأساسية
</h2>

<p>
	لإكمال هذا المقال التعليمي، ستحتاج إلى:
</p>

<ul>
<li>
		<p>
			اتباع دليل <a href="https://www.digitalocean.com/community/tutorials/initial-server-setup-with-debian-10" rel="external nofollow">الإعداد الاولي لخادم Debian 10</a> من اجل اعداد خادم Debian 10، وأن يكون لك مستخدم جذري (non-root) يملك صلاحيات sudo ومثبت عليه جدار حماية.
		</p>
	</li>
	<li>
		<p>
			حاسوب العميل يثبت عليه عميل VNC يدعم اتصالات VNC عبر قناة اتصال <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr>.
		</p>

		<ul>
<li>
				على نظام تشغيل Windows يمكنك استخدام TightVNC أو RealVNC أو UltraVNC.
			</li>
			<li>
				على نظام التشغيل Mac OS يمكنك استخدام برنامج "مشاركة الشاشة" ، أو يمكنك استخدام تطبيق عبر النظام الأساسي مثل RealVNC.
			</li>
			<li>
				على نظام تشغيل Linux، يمكنك الاختيار من بين العديد من الخيارات، بما في ذلك vinagre أو krdc أو RealVNC أو TightVNC.
			</li>
		</ul>
<h2>
			الخطوة الأولى: تثبيت بيئة سطح المكتب وخادم VNC
		</h2>

		<p>
			خادم Debian 10 لا يأتي مع بيئة سطح مكتب رسومية أو خادم VNC مثبت لذلك لابد من تثبيته أولا ثم سنقوم بتثبيت آخر نسخة من حزمة<a href="https://xfce.org/" rel="external nofollow">Xfce</a> لبيئة سطح مكتب وحزمة <code>TightVN</code> المتاحة في متجر Debian الرسمي.
		</p>
	</li>
</ul>
<p>
	قم بتنفيذ الأمر التالي على الخادم من أجل تحديث قائمة الحزم على الخادم:
</p>

<pre class="ipsCode">
$ sudo apt update
</pre>

<p>
	الآن قم بتنزيل بيئة سطح المكتب Xfce على الخادم الخاص بك من خلال الأمر التالي:
</p>

<pre class="ipsCode">
$ sudo apt install xfce4 xfce4-goodies
</pre>

<p>
	أثناء التثبيت سيُطلب منك تحديد لوحة المفاتيح من قائمة الخيارات المتوفرة واختيار اللغة المناسبة للغتك و من ثم اضغط على زر الإدخال (Enter) ليستمر التثبيت.
</p>

<p>
	بمجرد اكتمال التثبيت قم بتثبيت خادم TightVNC عبر الأمر التالي:
</p>

<pre class="ipsCode">
$ sudo apt install tightvncserver
</pre>

<p>
	لإكمال الإعدادات الأولية لخادم VNC بعد التثبيت استخدم الأمر<code>vncserver</code> لإعداد كلمة مرور آمنة وإنشاء ملفات الإعدادات الأولية:
</p>

<pre class="ipsCode">
$ vncserver
</pre>

<p>
	سيُطلب منك إدخال كلمة مرور والتحقق منها للوصول إلى جهازك عن بُعد:
</p>

<pre class="ipsCode">
You will require a password to access your desktops.

Password:
Verify:
</pre>

<p>
	يجب أن يتراوح طول كلمة المرور بين ستة وثمانية أحرف، سيتم تقليص كلمات المرور التي تزيد عن 8 أحرف تلقائيًا؛ بمجرد التحقق من كلمة المرور سيكون لديك خيار إنشاء كلمة مرور للعرض فقط؛ إذ لن يتمكن المستخدمون الذين يقومون بتسجيل الدخول باستخدام كلمة مرور العرض فقط من التحكم في VNC باستخدام الفأرة أو لوحة المفاتيح الخاصة بهم، يعد هذا الخيارًا مفيدًا إذا كنت تريد إظهار شيء لأشخاص آخرين يستخدمون خادم VNC . هذه العملية ستعمل على إنشاء ملفات الإعدادات الافتراضية الضرورية ومعلومات الاتصال بالخادم:
</p>

<pre class="ipsCode">
Would you like to enter a view-only password (y/n)? n
xauth:  file /home/sammy/.Xauthority does not exist

New 'X' desktop is your_hostname:1

Creating default startup script /home/sammy/.vnc/xstartup
Starting applications specified in /home/sammy/.vnc/xstartup
Log file is /home/sammy/.vnc/your_hostname:1.log
</pre>

<p>
	الآن دعنا نقوم بإعداد خادم VNC.
</p>

<h2>
	الخطوة الثانية: إعداد خادم VNC
</h2>

<p>
	يحتاج خادم VNC إلى معرفة الأوامر التي سينفذها عند بدء التشغيل،على وجه التحديد يحتاج VNC إلى معرفة سطح المكتب الرسومي الذي يجب الاتصال به. توجد هذه الأوامر في ملف الإعدادات الذي يسمى <code>xstartup</code> في المجلد <code>vnc.</code>، الموجود بالمجلد الرئيسي (Home directory)، عندما قمت بتشغيل الأمر <code>vncserver</code> في الخطوة السابقة تم إنشاء البرنامج صغير لبدء التشغيل، ولكننا سنقوم بإنشاء برنامجنا الخاص لتشغيل سطح المكتب Xfce.
</p>

<p>
	عند إعداد VNC لأول مرة سيقوم بإطلاق خادم الافتراضي على المنفذ <code>5901</code>والذي يسمى بنفذ العرض، ويشار إليه بواسطة VNC كـ <code>‎:1</code> فيمكن لـ VNC تشغيل عدة خوادم افتراضية على منافذ العرض الأخرى ، مثل <code>‎:2 أو 3:</code>.
</p>

<p>
	لأننا بصدد تغيير كيفية إعداد خادم VNC أولاً أوقف نسخة الخادم VNC الذي يعمل على المنفذ <code>5901</code> باستخدام الأمر التالي:
</p>

<pre class="ipsCode">
$ vncserver -kill :1
</pre>

<p>
	ستظهر المخرجات على هذا الشكل ، ولكنك سترى <abbr title="Process IDentifier | معرّف العملية أو البرنامج">PID</abbr> (رقم المعرف للعملية) مختلف:
</p>

<pre class="ipsCode">
Killing Xtightvnc process ID 17648
</pre>

<p>
	قبل التعديل على الملف <code>xstartup</code> قم بعمل نسخة احتياطية له.
</p>

<pre class="ipsCode">
$ mv ~/.vnc/xstartup ~/.vnc/xstartup.bak
</pre>

<p>
	الآن قم بإنشاء الملف <code>xstartup</code> جديد وافتحه في محرر النصوص الخاص بك:
</p>

<pre class="ipsCode">
$ nano ~/.vnc/xstartup 
</pre>

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

<pre class="ipsCode">
#!/bin/bash
xrdb $HOME/.Xresources
startxfce4 &amp;
</pre>

<p>
	الأمر الأول في الملف <code>xrdb $HOME/.Xresources</code> يخبر واجهة المستخدم الرسومية الـ VNC بقراءة ملف المستخدم <code>Xresources.</code> وهو المكان الذي يمكن للمستخدم فيه إجراء التغييرات على إعدادات معينة لسطح المكتب الرسومي، مثل ألوان واجهة الأوامر، وسمات المؤشر، وعرض الخط، أما الأمر الثاني يطلب من الخادم تشغيل Xfce، حيث ستجد كل البرامج الرسومية التي تحتاجها لإدارة خادمك بشكل مريح.
</p>

<p>
	لضمان أن خادم VNC سيكون قادرًا على استخدام ملف بدء التشغيل الجديد هذا بشكل صحيح؛ سنحتاج إلى جعله قابلاً للتنفيذ.
</p>

<pre class="ipsCode">
$ sudo chmod +x ~/.vnc/xstartup
</pre>

<p>
	الآن أعد تشغيل خادم VNC.
</p>

<pre class="ipsCode">
$ vncserver
</pre>

<p>
	سترى المخرجات على هذا النحو:
</p>

<pre class="ipsCode">
New 'X' desktop is your_hostname:1

Starting applications specified in /home/sammy/.vnc/xstartup
Log file is /home/sammy/.vnc/your_hostname:1.log
</pre>

<p>
	من خلال الإعدادات الموجود دعنا نتصل بالخادم من أجهزتنا المحلية.
</p>

<h2>
	الخطوة الثالثة: توصيل VNC Desktop بأمان
</h2>

<p>
	لا يستخدم VNC بروتوكولات آمنة عند الاتصال؛ لذلك سوف نستخدم اتصال عبر <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr> لتحقيق اتصال آمن بخادمنا وسنطلب من عميل VNC استخدامه بدلاً من إجراء اتصال مباشر.
</p>

<p>
	قم بإنشاء قناة اتصال <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr> على الحاسوب المحلي الخاص بك والذي يقوم بإعادة توجيه اتصال الجهاز المحلي (localhost) لـ VNC بشكل آمن، يمكنك القيام بذلك من خلال واجهة الأوامر على Linux أو macOS باستخدام الأمر التالي:
</p>

<pre class="ipsCode">
$ <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">ssh</abbr> -L 5901:127.0.0.1:5901 -C -N -l sammy  your server_ip
</pre>

<p>
	يحدد المتغير <code>L-</code> رقم المنفذ في هذه الحالة تم بناء المنفذ <code>5901</code> للاتصال عن بُعد بالمنفذ <code>5901</code> على جهازك المحلي، تتيح الراية <code>C-</code> الضغط، بينما يخبر الراية <code>N-</code> الSSH أننا لا نريد تنفيذ أمر عن بعد، وتحدد الراية <code>l-</code> اسم المستخدم لتسجيل الدخول عن بُعد. استبدل اسم المستخدم <code>sammy</code> و <code>your server ip</code> باسم المستخدم العادي وعنوان IP الخاص بخادمك.
</p>

<p>
	إذا كنت تستخدم عميل <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr> بواجهة رسومية مثل PuTTY فاستخدم "your_server_ip" كعنوان IP للاتصال، وقم بتعيينه إلى <code>localhost: 5901</code> كمنفذ جديد لإعادة التوجيه في إعدادات <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr> بالبرنامج.
</p>

<p>
	بمجرد تشغيل قناة الإتصال استخدم عميل VNC للاتصال بـ <code>localhost: 5901</code>؛ سيُطلب منك المصادقة باستخدام كلمة المرور التي قمت بتعيينها في الخطوة 1.
</p>

<p>
	بمجرد الاتصال سترى سطح مكتب Xfce الافتراضي:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2020_03/5e5f878b2977a_2.png.ac269e1a65dc65c51ca1945349593777.png" data-fileid="34979" rel=""><img class="ipsImage ipsImage_thumbnailed" data-fileid="34979" data-unique="data-unique" src="https://academy.hsoub.com/uploads/monthly_2020_03/5e5f879188f46_2.thumb.png.ff455f9bc969f5965886a657cd7c2d7d.png" alt="الصورة2.png"></a>
</p>

<p>
	اختر استخدام الإعدادات الافتراضية (Use default config)لإعداد سطح المكتب بسرعة.
</p>

<p>
	يمكنك الوصول إلى الملفات في مجلد المنزل (Home Directory) الخاص بك باستخدام مدير الملفات أو من سطر الأوامر، كما هو موضح هنا:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2020_03/5e5f87954c6c1_3.png.fad687020ef7c046254394bab7eaf391.png" data-fileid="34980" rel=""><img class="ipsImage ipsImage_thumbnailed" data-fileid="34980" data-unique="data-unique" src="https://academy.hsoub.com/uploads/monthly_2020_03/5e5f879752735_3.thumb.png.8527eeb3730c36b9253a7855f6045208.png" alt="الصورة3.png"></a>
</p>

<p>
	على جهازك المحلي اضغط CTRL + C في واجهة الأوامر من أجل إيقاف قناة الاتصال <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr> والعودة لواجهة الأوامر؛ سيؤدي ذلك إلى قطع جلسة اتصال VNC أيضًا.
</p>

<p>
	الآن دعنا نقوم بإعداد خادم VNC كنظام خدمة.
</p>

<h2>
	الخطوة الرابعة: تشغيل VNC كنظام خدمة
</h2>

<p>
	سنقوم بإعداد خادم VNC كنظام خدمة service حتى يمكننا تشغيله وإيقافه وإعادة تشغيله حسب الحاجة مثل أي خدمة أخرى، ذلك يضمن بدء تشغيل VNC عند إعادة تشغيل الخادم.
</p>

<p>
	أولاً قم بإنشاء ملف وحدة جديد يسمى <code>etc/systemd/system/vncserver@.service/</code> باستخدام محرر النصوص المفضل لديك:
</p>

<pre class="ipsCode">
$sudo nano /etc/systemd/system/vncserver@.service
</pre>

<p>
	يسمح لنا الرمز@ في نهاية الاسم بتمرير إعداد الخدمة، سنستخدم هذا لتحديد منفذ عرض VNC الذي نريد استخدامه عندما ندير الخدمة.
</p>

<p>
	أضف الأسطر التالية إلى الملف وتأكد من تغيير قيمة User (المستخدم) وGroup (المجموعة) و Working Directory (مجلد العمل) وUsername (اسم المستخدم) في قيمة المتغير PIDFILE لمطابقة مع اسم المستخدم الخاص بك:
</p>

<pre class="ipsCode">
[Unit]
Description=Start TightVNC server at startup
After=syslog.target network.target
[Service]
Type=forking
User=sammy
Group=sammy
WorkingDirectory=/home/sammy

PIDFile=/home/sammy/.vnc/%H:%i.pid
ExecStartPre=-/usr/bin/vncserver -kill :%i &gt; /dev/null 2&gt;&amp;1
ExecStart=/usr/bin/vncserver -depth 24 -geometry 1280x800 :%i
ExecStop=/usr/bin/vncserver -kill :%i

[Install]
WantedBy=multi-user.target
</pre>

<p>
	يوقف أمر <code>ExecStartPre</code> ال VNC إذا كان يعمل بالفعل بينما أمر <code>ExecStart</code> يعمل على تشغيل VNC وتعيين عمق الألوان على لون 24 بت ودقة الوضوح 1280 × 800، يمكنك تعديل خيارات بدء التشغيل هذه أيضًا لتلبية احتياجاتك.
</p>

<p>
	احفظ وأغلق الملف. بعد ذلك، اجعل النظام على علم بملف الوحدة الجديد (unit file).
</p>

<pre class="ipsCode">
$ sudo systemctl daemon-reload
</pre>

<p>
	تفعيل ملف الوحدة.
</p>

<pre class="ipsCode">
$ sudo systemctl enable vncserver@1.service
</pre>

<p>
	يشير الرقم <code>1</code> الذي يلي العلامة <code>@</code> إلى رقم العرض الذي يجب أن تظهر عليه الخدمة، وفي هذه الحالة يكون الرقم الافتراضي <code>‎:1</code> كما تمت مناقشته في الخطوة الثانية.
</p>

<p>
	أوقف الممثل الحالي لخادم VNC إذا كان لا يزال قيد التشغيل.
</p>

<pre class="ipsCode">
$ vncserver -kill :1
</pre>

<p>
	ثم قم ببدء تشغيله كما تفعل أي خدمة أخرى.
</p>

<pre class="ipsCode">
$ sudo systemctl start vncserver@1
</pre>

<p>
	يمكنك التحقق من أن الأمر قد بدأ:
</p>

<pre class="ipsCode">
$ sudo systemctl status vncserver@1
</pre>

<p>
	إذا بدأ بشكل صحيح يجب أن يعرض المخرجات كما يلي:
</p>

<pre class="ipsCode">
● vncserver@1.service - Start TightVNC server at startup
   Loaded: loaded (/etc/systemd/system/vncserver@.service; enabled; vendor preset: enabled)
   Active: active (running) since Thu 2019-10-10 17:56:17 UTC; 5s ago
  Process: 935 ExecStartPre=/usr/bin/vncserver -kill :1 &gt; /dev/null 2&gt;&amp;1 (code=exited, status=2)
  Process: 940 ExecStart=/usr/bin/vncserver -depth 24 -geometry 1280x800 :1 (code=exited, status=0/SUCCESS)
 Main <abbr title="Process IDentifier | معرّف العملية أو البرنامج">PID</abbr>: 948 (Xtightvnc)
. . .
</pre>

<p>
	سيكون خادم VNC متاحًا الآن عند إعادة تشغيل الجهاز.
</p>

<p>
	ابدأ تشغيل قناة اتصال <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr> مرة أخرى:
</p>

<pre class="ipsCode">
$ <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">ssh</abbr> -L 5901:127.0.0.1:5901 -C -N -l sammy  your_server_ip
</pre>

<p>
	ثم قم بإجراء اتصال جديد باستخدام برنامج عميل VNC الخاص بك إلى<code>localhost : 5901</code>للاتصال بجهازك.
</p>

<h2>
	الخلاصة
</h2>

<p>
	لديك الآن خادم VNC آمن يعمل على خادم Debian 10 الخاص بك؛ستتمكن الآن من إدارة الملفات والبرامج والإعدادات باستخدام واجهة رسومية سهلة الاستخدام ومألوفة وستتمكن عليها من تشغيل برامج رسومية مثل متصفحات الويب عن بُعد.
</p>

<p>
	ترجمة –وبتصرّف– للمقال <a href="https://www.digitalocean.com/community/tutorials/how-to-install-and-configure-vnc-on-debian-10" rel="external nofollow">How to Install and Configure VNC on Debian 10</a> لصاحبيه finid و Brian Hogan
</p>
]]></description><guid isPermaLink="false">461</guid><pubDate>Wed, 04 Mar 2020 10:53:17 +0000</pubDate></item><item><title>&#x62A;&#x62B;&#x628;&#x64A;&#x62A; &#x648;&#x625;&#x639;&#x62F;&#x627;&#x62F; Postfix &#x639;&#x644;&#x649; &#x623;&#x648;&#x628;&#x646;&#x62A;&#x648; 18.04</title><link>https://academy.hsoub.com/devops/linux/%D8%AA%D8%AB%D8%A8%D9%8A%D8%AA-%D9%88%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF-postfix-%D8%B9%D9%84%D9%89-%D8%A3%D9%88%D8%A8%D9%86%D8%AA%D9%88-1804-r460/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2020_03/How-To-Install-and-Configure-Postfix.jpg.1fe33d6ee5e88543e8590239702c533c.jpg" /></p>

<p>
	Postfix هو وكيل نقل البريد مفتوح المصدر (MTA) الذي يمكن استخدامه لتوجيه وتسليم البريد الإلكتروني على نظام Linux، وتشير التقديرات إلى أن حوالي 25 ٪ من خوادم البريد العام على الإنترنت تعمل على تشغيل Postfix.
</p>

<p>
	في هذا المقال، سنعلمك كيفية تثبيت Postfix وتشغيله بسرعة على خادم يعمل بنظام تشغيل أوبنتو 18.04.
</p>

<h2>
	المتطلبات الأساسية
</h2>

<p>
	من أجل تطبيق هذا المقال، يجب أن يكون لديك حق الوصول كمستخدم غير جذري (non-root) يملك صلاحيات sudo، للتعرف على كيفية إعداد ذلك يمكنك اتباع دليل <a href="https://www.digitalocean.com/community/tutorials/initial-server-setup-with-ubuntu-18-04" rel="external nofollow">الإعداد الأولي لخادم اوبنتو18.04</a> لإنشاء المستخدم.
</p>

<p>
	لإعداد Postfix بشكل صحيح، ستحتاج إلى اسم نطاق (Domain Name) مؤهل بالكامل يتم توجيهه إلى خادم اوبنتو 18.04، يمكنك العثور على مساعدة في إعداد اسم النطاق (Domain Name) الخاص بك باستخدام DigitalOcean باتباع <a href="https://www.digitalocean.com/community/tutorials/how-to-set-up-a-host-name-with-digitalocean" rel="external nofollow">هذا المقال</a>، إذا كنت تخطط لقبول البريد، فستحتاج إلى التأكد من أن لديك سجل MX يشير إلى خادم البريد الخاص بك.
</p>

<p>
	لأغراض هذا المقال التعليمي، سنفترض أنك تقوم بإعداد الحاسوب المضيف له FQDN الخاص بـ mail.example.com.
</p>

<h2>
	الخطوة الأولى: تثبيت Postfix
</h2>

<p>
	يوجد Postfix في متجر أوبنتو الافتراضي، لذلك تثبيته بسيط. ابدأ أولًا تحديث ذاكرة التخزين المؤقت لحزمة apt الخاصة بك ثم قم بتثبيت البرنامج، سنقوم بتمرير DEBIAN_PRIORITY=low كمتغير في أمر التثبيت الخاص بنا للرد على بعض المتطلبات الإضافية:
</p>

<pre class="ipsCode">
$ sudo apt update
$ sudo DEBIAN_PRIORITY=low apt install postfix
</pre>

<p>
	استخدم المعلومات التالية لملء المطلوب بشكل صحيح للبيئة الخاصة بك:
</p>

<ul>
<li>
		<p>
			<strong>النوع العام من إعدادات البريد</strong> (General type of mail configuration): سنختار موقع إنترنت لأن هذا يتناسب مع احتياجات البنية الأساسية لدينا.
		</p>
	</li>
	<li>
		<p>
			<strong>اسم نظام البريد</strong> (System mail name): هذا هو المجال الأساسي للمستخدم من أجل إنشاء عنوان بريد إلكتروني صحيح عند تقديم جزء من عنوان الحساب العنوان الحساب فقط على سبيل المثال، اسم hostname هو mail.example.com لكن ربما نرغب في تعيين اسم بريد النظام إلى example.com يتم إعطاؤه اسم المستخدم user1، سيستخدم Postfix العنوان user1@example.com.
		</p>
	</li>
	<li>
		<p>
			<strong>مستلما البريد root و postmaster</strong>‏ (Root and postmaster mail recipient): هما عبارة عن حسابات Linux يقومان بإعادة ارسال عنوان البريد إلى root@ و postmaster@، استخدم حسابك الأساسي لهذا الغرض في مثالنا هو sammy.
		</p>
	</li>
	<li>
		<p>
			<strong>مستقبلات أخرى لقبول البريد</strong> (Other destinations to accept mail for): وهذا يعرف بمستقبلات البريد التي تقبل Postfix instance، إذا كنت بحاجة لإضافة أي نطاقات أخرى سيكون هذا الخادم مسؤولاً عن تلقيها، فأضف تلك النطاقات هنا وإلا سيطبق الإعداد الافتراضي.
		</p>
	</li>
	<li>
		<p>
			<strong>فرض تحديثات متزامنة على قائمة انتظار البريد؟</strong> (Force synchronous updates on mail queue?‎): نظرًا لأنك تستخدم على الأرجح ملفات النظام ، فقم برد ب "لا" هنا.
		</p>
	</li>
	<li>
		<p>
			<strong>الشبكات المحلية</strong> (Local networks): هذه قائمة من الشبكات التي تم إعدادها بخادم البريد الخاص بك من أجل ترحيل الرسائل، بمعظم الحالات سيعمل الإعداد الافتراضي، ولكن إذا اخترت تعديله ، فتأكد من أن يكون مقيدًا للغاية فيما يتعلق بنطاق الشبكة.
		</p>
	</li>
	<li>
		<p>
			<strong>تحديد الحد الأعلى لحجم صندوق البريد الوارد</strong> (Mailbox size limit): يستخدم هذا الحد للحد من حجم الرسائل الواردة و يتم تعطيل أي قيود على حجم البريد بضبطه على 0.
		</p>
	</li>
	<li>
		<p>
			<strong>الحرف المضاف للعنوان المحلي</strong> (Local address extension character): هذا الحرف يستخدم للفصل بين الجزء العادي من العنوان و الجزء المضاف (يستخدم لإنشاء أسماء مستعارة ديناميكية).
		</p>
	</li>
	<li>
		<p>
			<strong>برتوكولات الانترنت الواجب استخدامها</strong> (Internet protocols to use): اختر اذا ما كنت تريد تقييد اصدار IP الذي سيدعمه Postfix، سنختار كل IP لاغراضنا هنا.
		</p>
	</li>
</ul>
<p>
	هذه هي الإعدادات التي سنستخدمها في هذا الدليل:
</p>

<pre class="ipsCode">
General type of mail configuration?: Internet Site
System mail name: example.com (not mail.example.com)
Root and postmaster mail recipient: sammy
Other destinations to accept mail for: $myhostname, example.com, mail.example.com, localhost.example.com, localhost
Force synchronous updates on mail queue?: No
Local networks: 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
Mailbox size limit: 0
Local address extension character: +
Internet protocols to use: all
</pre>

<p>
	من أجل اعادة ضبط الاعدادات السابقة بأي وقت يمكنك ذلك بتنفيذ الأمر التالي:
</p>

<pre class="ipsCode">
$ sudo dpkg-reconfigure postfix 
</pre>

<p>
	سيتم ملء الطلبات السابقة بالردود السابقة بشكل تلقائي. عند الانتهاء ، يمكننا الآن إجراء المزيد من التهيئة لإعداد نظامنا بالطريقة التي نرغب بها.
</p>

<h2>
	الخطوة الثانية: تحسين إعدادات Postfix
</h2>

<p>
	بعد ذلك، يمكننا ضبط بعض الإعدادات التي لم تطلبها منا الحزمة.
</p>

<p>
	بدايةً، يمكننا ضبط صندوق البريد؛سوف نستخدم تنسيق Maildi الذي يفصل الرسائل إلى ملفات فردية يتم نقلها بين المجلدات بناءً على إجراء المستخدم أما الخيار الآخر فهو تنسيق mbox (الذي لن نغطيه هنا) الذي يخزن جميع الرسائل في ملف واحد.
</p>

<p>
	سنقوم بتعيين المتغير <code>home_mailbox</code> إلى القيمة <code>Maildir/‎</code> أي ننشئ مجلدًا داخل المجلد الرئيسي للمستخدم إن استخدام الامر <code>Postconf</code> سيقوم بضبط الإعدادات اكتب الامر التالي لإعداد <code>home/mailbox</code>:
</p>

<pre class="ipsCode">
$ sudo postconf -e 'home_mailbox= Maildir/'
</pre>

<p>
	بعد ذلك، يمكنك تعيين موقع الجدول <code>virtual_alias_maps</code> الذي يحتوي حسابات البريد الإلكتروني المرتبطة بحسابات نظام Linux، سننشئ هذا الجدول في <code>etc/postfix/virtual/</code> سنستخدم الأمر <code>postconf</code> مرة اخرى:
</p>

<pre class="ipsCode">
$ sudo postconf -e 'virtual_alias_maps= hash:/etc/postfix/virtual'
</pre>

<h2>
	الخطوة الثالثة: خريطة عناوين البريد لحسابات Linux
</h2>

<p>
	الآن سنقوم باعادة إعداد ملف جدول الخرائط الإفتراضي، افتح الملف في محرر النصوص الخاص بك:
</p>

<pre class="ipsCode">
$sudo nano /etc/postfix/virtual
</pre>

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

<p>
	على سبيل المثال إذا كنت ترغب بقبول البريد الإلكتروني contact@example.com والبريد admin@example.com وترغب في تسليم رسائل البريد الإلكتروني هذه إلى المستخدم sammy، فيمكنك إعداد الملف ‎/etc/postfix/virtual كما يلي:
</p>

<pre class="ipsCode">
contact@example.com sammy 
admin@example.com sammy 
</pre>

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

<pre class="ipsCode">
$ sudo postmap /etc/postfix/virtual 
</pre>

<p>
	أعد تشغيل عملية Postfix للتأكد من تطبيق جميع التغييرات:
</p>

<pre class="ipsCode">
$sudo systemctl restart postfix 
</pre>

<p>
	أصبح خادم Postfix الآن مثبت وجاهز؛ سنقوم بإعداد عميل يمكنه التعامل مع البريد الذي يعالجه Postfix.
</p>

<h2>
	الخطوة الرابعة: ضبط جدار الحماية
</h2>

<p>
	إذا كنت تقوم بتشغيل <a href="https://academy.hsoub.com/devops/security/firewalls/%D9%83%D9%8A%D9%81-%D8%AA%D8%B6%D8%A8%D8%B7-%D8%AC%D8%AF%D8%A7%D8%B1%D8%A7-%D9%86%D8%A7%D8%B1%D9%8A%D8%A7-%D9%81%D9%8A-%D8%A3%D9%88%D8%A8%D9%86%D8%AA%D9%88-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-ufw-r120/" rel="">جدار حماية UFW</a> باعدادت الأولية التي تم تهيئة الخادم عليها سوف يتعين علينا السماح باستثناء Postfix. يمكنك السماح بالاتصالات بالخدمة بتنفيذ الأمر التالي:
</p>

<pre class="ipsCode">
$ sudo ufw allow Postfix 
</pre>

<p>
	الآن خادم Postfix مثبت وجاهز سنقوم بإعداد عميل يمكنه التعامل مع البريد الذي يعالجه Postfix.
</p>

<h2>
	الخطوة الخامسة: إعداد البيئة لربطها مع موقع البريد
</h2>

<p>
	قبل أن نثبت العميل يجب أن نتأكد من صحة متغير بيئة MAIL الخاص بنا معدة بشكل صحيح، سيقوم العميل بفحص هذا المتغير لمعرفة مكان الذي أبحث فيه عن بريد المستخدم. من أجل تعيين المتغير بغض النظر عن كيفية وصولك إلى حسابك (من خلال <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">ssh</abbr> ، su ، su - ، sudo ، إلخ) ، نحتاج إلى تعيين المتغير في عدة مواقع مختلفة؛ سنقوم بإضافته إلى داخل ملف<code>etc/bash.bashrc/</code>و ملف<code>etc/profile.d/</code>للتأكد من أن كل مستخدم لديه هذا الإعداد. من أجل إضافة المتغير إلى هذه الملفات نفذ الأمر التالي:
</p>

<pre class="ipsCode">
$echo 'export MAIL=~/Maildir' | sudo tee -a /etc/bash.bashrc | sudo tee -a /etc/profile.d/mail.sh
</pre>

<p>
	لقراءة المتغير في جلستك الحالية يمكنك تنفيذ على الملف <code>etc/profile.d/mail.sh/</code>:
</p>

<pre class="ipsCode">
 $ source /etc/profile.d/mail.sh 
</pre>

<h2>
	الخطوة السادسة: تثبيت وإعداد بريد العميل
</h2>

<p>
	للتفاعل مع البريد الذي يتم تسليمه؛ سنقوم بتثبيت حزمة<code>s-nail</code>وهو البديل عن عميل <code>BSD xmail</code>الغني بالميزات ويمكنه التعامل مع تنسيق Maildir بشكل صحيح، وغالبًا ما يكون متوافقًا مع الإصدارات السابقة، يحتوي إصدار GNU للبريد على بعض القيود مثل حفظ بريد القراءة دائمًا بتنسيق mbox بغض النظر عن التنسيق المصدر. لتنزيل حزمة s-nail نستخدم الأمر:
</p>

<pre class="ipsCode">
$ sudo apt install s-nail
</pre>

<p>
	من أجل ضبط بعض الإعدادات افتح الملف <code>etc/s-nail.rc/</code> باستخدام محرر النصوص الخاص بك:
</p>

<pre class="ipsCode">
$ sudo nano /etc/s-nail.rc 
</pre>

<p>
	أضف الخيارات التالية في أسفل الملف <code>‎/etc/s-nail.rc</code>:
</p>

<pre class="ipsCode">
. . .
set emptystart
set folder=Maildir
set record=+sent
</pre>

<p>
	سيتيح هذا للعميل فتحه حتى مع البريد الوارد الفارغ؛ سيقوم أيضًا بتعيين المجلد Maildir داخل المجلد الداخلي ثم سيستخدم لإنشاء ملف mbox الذي تم ارساله ويخزن البريد المرسل.
</p>

<p>
	احفظ وأغلق الملف عند الانتهاء.
</p>

<h2>
	الخطوة السابعة: تهيئة Maildir واختبار العميل
</h2>

<p>
	الآن، يمكننا اختبار العميل من الخارج:
</p>

<h3>
	تهيئة بنية المجلد
</h3>

<p>
	أسهل طريقة لإنشاء Maildir في مجلدنا الرئيسي هي إرسال بريد إلكتروني إلى أنفسنا يمكننا القيام بذلك باستخدام الأمر <code>s-nail</code> نظرًا لأن الملف المرسل لن يكون متاحًا إلا بعد إنشاء Maildir، سنقوم بتعطيل الكتابة لهذا البريد الإلكتروني الأولي باستخدام الخيار <code>Snorecord-</code>.
</p>

<p>
	أرسل رسالة بريد إلكتروني عن طريق تمرير الجملة String إلى الأمر <code>s-nail</code> وحدد مستخدم Linux المستلم للرسالة:
</p>

<pre class="ipsCode">
$ echo 'init' | s-nail -s 'init' -Snorecord sammy
</pre>

<p>
	سيكون الرد ربما كتالي:
</p>

<pre class="ipsCode">
Can't canonicalize "/home/sammy/Maildir"
</pre>

<p>
	سيظهره هذا الأمر بشكل طبيعي عند ارسال الرسالة أول مرة و يمكننا التحقق من إنشاء المجلد من خلال البحث عن مجلد <code>Maildir/~</code>:
</p>

<pre class="ipsCode">
$ ls -R ~/Maildir
</pre>

<p>
	ستشاهد ما يحتوي عليه المجلد وقد تم إنشاء ملف جديد فيه رسالة جديدة في المجلد <code>Maildir/new/~</code>:
</p>

<pre class="ipsCode">
/home/sammy/Maildir/:
cur  new  tmp

/home/sammy/Maildir/cur:

/home/sammy/Maildir/new:
1463177269.Vfd01I40e4dM691221.mail.example.com

/home/sammy/Maildir/tmp:
</pre>

<p>
	يبدو أن البريد تم تسليمه.
</p>

<h3>
	إدارة البريد مع العميل
</h3>

<p>
	استخدم العميل من أجل التحقق من بريدك:
</p>

<pre class="ipsCode">
$ s-nail 
</pre>

<p>
	ستجد الرسالة التالية تنتظرك:
</p>

<pre class="ipsCode">
s-nail version v14.8.6.  Type ? for help.
"/home/sammy/Maildir": 1 message 1 new
&gt;N  1 sammy@example.com     Wed Dec 31 19:00   14/369   init
</pre>

<p>
	اضغط على زر Enter لعرض رسالتك التالية:
</p>

<pre class="ipsCode">
[-- Message 1 -- 14 lines, 369 bytes --]:
From sammy@example.com Wed Dec 31 19:00:00 1969
Date: Fri, 13 May 2016 18:07:49 -0400
To: sammy@example.com
Subject: init
Message-Id: \&amp;lt;20160513220749.A278F228D9@mail.example.com\&amp;gt;
From: sammy@example.com

init
</pre>

<p>
	يمكنك العودة إلى قائمة الرسائل الخاصة بك بكتابة الرمز h ثم Enter:
</p>

<pre class="ipsCode">
? h
</pre>

<p>
	نظرًا لأن هذه الرسالة ليست مفيدة للغاية يمكننا حذفها باستخدام الرمز d ثم Enter :
</p>

<pre class="ipsCode">
 ? d
</pre>

<p>
	للعودة إلى شاشة الأوامر استخدم الرمز q ثم ENTER:
</p>

<pre class="ipsCode">
? q
</pre>

<h3>
	إرسال البريد مع العميل
</h3>

<p>
	يمكنك اختيار إرسال رسالة عبر كتابة الرسالة بمحرر النصوص :
</p>

<pre class="ipsCode">
 $ nano ~/test_message
</pre>

<p>
	داخل الملف <code>‎</code>~/test_message اكتب النص الذي تود ارساله بالبريد:
</p>

<pre class="ipsCode">
Hello,

This is a test. Please confirm receipt!
</pre>

<p>
	بإمكاننا باستخدام الأمر <code>cat</code> توجيه الرسالة باستخدام <code>s-nail</code> سيؤدي ذلك إلى إرسال الرسالة كمستخدم Linux الافتراضي، يمكنك ضبط الحقل "From" باستخدام الراية <code>r-</code> إذا كنت تريد تعديل هذه القيمة إلى شيء آخر:
</p>

<pre class="ipsCode">
$ cat ~/test_message | s-nail -s 'Test email subject line' -r from_field_account  user@email.com
</pre>

<p>
	<strong>الخيارات بالأمر السابق تعني:</strong>
</p>

<ul>
<li>
		<code>s-</code>: موضوع البريد الإلكتروني
	</li>
	<li>
		<code>r-</code>: حقل اختياري لتغيير الحقل "From" في البريد الإلكتروني بشكل افتراضي هو مستخدم Linux الذي قمت بتسجيل الدخول به سيتم استخدامه لملء هذا الحقل، يسمح لك الخيار <code>r-</code> باعادة تعيينه.
	</li>
	<li>
		user@email.com: الحساب المرسل اليه البريد الإلكتروني قم بتغييره ليكون حسابًا صحيحًا لك حق الوصول إليه.
	</li>
</ul>
<p>
	يمكنك عرض رسائلك المرسلة داخل عميل s-nail الخاص بك اعد تشغيل العميل التفاعلي مرة أخرى بكتابة الأمر التالي:
</p>

<pre class="ipsCode">
$ s-nail
</pre>

<p>
	بإمكانك عرض الرسائل المرسلة عبر الأمر التالي :
</p>

<pre class="ipsCode">
? file +sent
</pre>

<p>
	يمكنك إدارة البريد المرسل باستخدام نفس الأوامر التي تستخدمها للبريد الوارد.
</p>

<h2>
	الخلاصة
</h2>

<p>
	يجب أن يكون لديك الآن القدرة على إعداد Postfix على خادم أوبنتو 18.04 إن إدارة خوادم البريد الإلكتروني مهمة صعبة على مسؤولين النظام ولكن مع هذا الإعداد يجب أن يكون لديك وظيفة البريد الإلكتروني MTA الأساسية لتبدأ.
</p>

<p>
	ترجمة -وبتصرف- للمقال <a href="https://www.digitalocean.com/community/tutorials/how-to-install-and-configure-postfix-on-ubuntu-18-04" rel="external nofollow">How To Install and Configure Postfix on Ubuntu 18.04</a> لصاحبيه Justin Ellingwood و Hanif Jetha
</p>
]]></description><guid isPermaLink="false">460</guid><pubDate>Wed, 04 Mar 2020 10:43:27 +0000</pubDate></item><item><title>&#x645;&#x627; &#x642;&#x62F; &#x644;&#x627; &#x62A;&#x639;&#x631;&#x641;&#x647; &#x639;&#x646; sudo</title><link>https://academy.hsoub.com/devops/linux/%D9%85%D8%A7-%D9%82%D8%AF-%D9%84%D8%A7-%D8%AA%D8%B9%D8%B1%D9%81%D9%87-%D8%B9%D9%86-sudo-r455/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2020_01/5e1cd523e9ea2_-----sudo.jpg.807a247fa118e2006c0289424051c180.jpg" /></p>

<p>
	تعتقد أنّك تعرف كل شيء عن sudo؟ فكّر بذلك مجدّدًا.
</p>

<p>
	يعرف الجميع sudo أليس كذلك؟ تُثبَّت هذه الأداة بشكل افتراضي على معظم أنظمة Linux وهي متوفّرة لمعظم توزيعات BSD (اختصارًا إلى Berkeley Software Distributions) ومختلف توزيعات يونكس التجاريّة. ومع ذلك كانت الإجابة الأكثر شيوعًا التي تلقيتها بعد التحدث إلى مئات مستخدمي sudo هي أنّ sudo أداة لتعقيد الحياة.
</p>

<p>
	يوجد لديك مستخدم جذر root ولديك أمر su، فلماذا يكون لديك أداة أخرى؟ كان sudo بالنسبة للكثيرين مجرّد بادئة للأوامر الإداريّة. ذكرت قلّة قليلة فقط أنّه يمكنك استخدام سجلات sudo لمعرفة من قام بعملٍ ما عندما يكون لديك العديد من المسؤولين في نفس النظام.
</p>

<p>
	ما هو sudo؟ وفقًا <a href="https://www.sudo.ws/" rel="external nofollow">لموقع sudo الإلكتروني</a>:
</p>

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		اقتباس
	</div>

	<p>
		"يسمح Sudo لمسؤول النظام«بتفويض السُلطة» (authority)عن طريق منح بعض المستخدمين القدرة على تشغيل بعض الأوامر كمستخدم root أو كمستخدم آخر مع توفير مسار تدقيق للأوامر «والوسائط» (arguments)الخاصّة بها."
	</p>
</blockquote>

<p>
	يأتي sudo افتراضيًّا بضبط بسيط، حيث أن قاعدة واحدة تسمح للمستخدم أو لمجموعة من المستخدمين بالقيام بأي شيء عمليًا (المزيد حول ملف الضبط لاحقًا ضمن هذه المقالة):
</p>

<pre class="ipsCode">
%wheel ALL=(ALL) ALL
</pre>

<p>
	تعني «المعاملات» (parameters) في هذا المثال ما يلي:
</p>

<ul>
<li>
		يحدّد المعامل الأول أعضاء المجموعة.
	</li>
	<li>
		يحدّد المعامل الثاني المُضيف (المضيفين) الذي يمكن لأعضاء المجموعة تشغيل الأوامر عليه.
	</li>
	<li>
		يحدّد المعامل الثالث أسماء المستخدمين التي يمكن بموجبها تنفيذ الأمر.
	</li>
	<li>
		يحدّد المعامل الأخير التطبيقات التي يمكن تشغيلها.
	</li>
</ul>
<p>
	لذلك يمكن لأعضاء مجموعة Wheel في هذا المثال تشغيل جميع التطبيقات مثل كافة المستخدمين على جميع المضيفين. حتى هذه القاعدة المتسامحة حقًا مفيدة لأنها تؤدي إلى تسجيل من قام بعملٍ ما على جهازك.
</p>

<h2>
	الأسماء المستعارة (Aliases)
</h2>

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

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

<h2>
	تمكين الميزات لمجموعة معيّنة من المستخدمين
</h2>

<p>
	يأتي الأمر sudo مزودًا بمجموعة كبيرة من الإعدادات الافتراضيّة. لا يزال هناك حالات تريد فيها تغيير بعضٍ من هذه الإعدادات. وذلك عند استخدام التعليمة <code>Defaults</code> في الضبط. عادةً ما يتم فرض هذه الإعدادات الافتراضيّة على كل مستخدم، ولكن يمكنك تضييق مجال هذه الإعدادات لتُطبّق فقط على مجموعة فرعيّة من المستخدمين بناءً على المضيف واسم المستخدم وما إلى ذلك.
</p>

<p>
	هنا مثال على أن مسؤول النظام الخاص بي (sysadmins) يُحبّ استخدام "التوبيخ" insults. وهي مجرّد بضع رسائل هزليّة تظهر كَتوبيخ عندما يُخطئ المستخدم في كلمة السرّ عند تنفيذ أوامر في sudo:
</p>

<pre class="ipsCode">
czanik@linux-mewy:~&gt; sudo ls
[sudo] password for root:
Hold it up to the light --- not a brain in sight!
[sudo] password for root:
My pet ferret can type better than you!
[sudo] password for root:
sudo: 3 incorrect password attempts
czanik@linux-mewy:~&gt;
</pre>

<p>
	وبما أنه ليس الجميع معجب بفكاهة مدير النظام، تُعطّل هذه التوبيخات افتراضيًا. يوضّح المثال التالي كيفية تمكين هذا الإعداد فقط لمسؤولي النظام المتمرسين وهم أعضاء في المجموعة wheel:
</p>

<pre class="ipsCode">
Defaults !insults
Defaults:%wheel insults
</pre>

<p>
	ليس لدي ما يكفي من الأصابع لتعداد الأشخاص الذين شكروني على إعداد هذه الرسائل.
</p>

<h2>
	مُصادقة القيم المختصرة المشفرة (Digest verification)
</h2>

<p>
	بالطبع هناك ميزات أكثر أهميّةً في sudo كذلك. إحدى الميزات هي «مُصادقة القيم المختصرة المشفرة» (digest verification). يمكنك تضمين مصادقة القيم المختصرة المشفرة للتطبيقات في الضبط الخاص بك:
</p>

<pre class="ipsCode">
peter ALL = sha244:11925141bb22866afdf257ce7790bd6275feda80b3b241c108b79c88 /usr/bin/passwd
</pre>

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

<h2>
	تسجيل الجلسة
</h2>

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

<p>
	لماذا؟ لأن تسجيل الجلسة لا يتيح لك رؤية اسم الأمر فقط، بل كل ما يحدث في الجهاز الطرفي أيضًا. فبإمكانك معرفة ما يفعله المسؤولون لديك حتى لو كان لديهم وصول إلى الصدفة (shell) والسجلات تُظهر فقط أن bash بدأ العمل.
</p>

<p>
	توجد محدوديّة واحدة حاليًّا وهي أن السجلات تخزّن محليًّا، لذلك يمكن للمستخدمين حذف سجلات التتبع الخاصّة بهم إذا توفرت لهم أذونات كافية. ترقبوا الميزات القادمة.
</p>

<h2>
	الإضافات
</h2>

<p>
	تم تغيير sudo إلى بنية معياريّة قائمة على «الإضافات» (plugins) بدءًا من الإصدار 1.8. حيث أصبح بالإمكان استبدال أو توسيع وظائف sudo بسهولة عن طريق كتابة وظائفك الخاصّة، وذلك اعتمادًا على معظم الميزات التي نُفّذت كإضافات. يتوفر حاليًا كلًّا من الإضافات مفتوحة المصدر والإضافات التجاريّة لـ sudo. عَرضتُ في حديثي الإضافة sudo_pair والتي تتوفر على <a href="https://github.com/square/sudo_pair/" rel="external nofollow">GitHub</a>. طوّرت هذه الإضافة في Rust مما يعني أنه ليس من السهل «ترجمتها» (compile) والأكثر صعوبةً من ذلك هو نشر النتائج.
</p>

<p>
	تُوفّر الإضافات من ناحيةٍ أخرى وظائف مثيرة للاهتمام، مُتطلبةً من مسؤولٍ ثانٍ الموافقة (أو الرفض) لتشغيل الأوامر من خلال sudo. ليس ذلك فحسب، بل يمكن أيضًا تتبع الجلسات على الشاشة وإنهاؤها في حال وجود نشاط مشبوه.
</p>

<p>
	في عرضٍ توضيحيّ قدمته خلال حديثي مؤخرًا في مؤتمر "All Things Open" شعرت كمن يجلب لنفسه السمعة السيئة.
</p>

<pre class="ipsCode">
czanik@linux-mewy:~&gt; sudo  rm -fr /
</pre>

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

<h2>
	السجلات
</h2>

<p>
	يُعدّ التسجيل والتنبيه جزءًا مهمًا من sudo كما ذكرت سابقًا في البداية. إذا لم تقم بفحص سجلات sudo الخاصّة بك بانتظام فليس هناك قيمة كبيرة لاستخدام sudo. تُنبّه هذه الأداة عن طريق البريد الإلكتروني عن الأحداث المحدّدة في الضبط وتُسجل جميع الأحداث في syslog. يمكن تشغيل سجلات التنقيح (Debug) واستخدامها لتصحيح القواعد أو الإبلاغ عن «الأخطاء» (bugs).
</p>

<h2>
	التنبيهات Alerts
</h2>

<p>
	تعد تنبيهات البريد الإلكتروني من النمط القديم الآن، ولكن إذا كنت تستخدم syslog-ng لتَجميع رسائل السجل الخاصّة بك، فستُنقّح رسائل سجل sudo تلقائيًا.
</p>

<p>
	يمكنك بسهولة إنشاء تنبيهات مخصّصة وإرسالها إلى مجموعة واسعة من الوجهات، بما في ذلك Slack أو Telegram أو Splunk أو Elasticsearch.
</p>

<h2>
	الضبط
</h2>

<p>
	تحدثنا كثيرًا عن ميزات sudo وحتى شاهدنا بضعة أسطر من «الضبط» (Configuration). دعنا الآن نلقي نظرة أقرب على كيفيّة ضبط sudo. الضبط نفسه متاح في ‎<code>/etc/sudoers</code> وهو ملف نصيّ بسيط. ومع ذلك ما يزال لا يُنصح بتحرير هذا الملف مباشرة، استخدم بدلاً من ذلك visudo حيث تتحقق هذه الأداة من بناء الجملة النحويّ أيضًا. بإمكانك إذا كنت لا تحب vi تغيير المحرّر المُستخدَم عن طريق ضبط متغير البيئة<code>EDITOR</code> إلى الخيار المفضل لديك.
</p>

<p>
	تأكّد قبل البدء في تحرير ضبط sudo من معرفة كلمة مرور المستخدم root. (نعم، حتى على Ubuntu حيث الـ root ليس لديه كلمة مرور افتراضيًّا.) بما أنّ visudo يتحقّق من البناء النحويّ للجملة فمن السهل إنشاء ضبط صحيح نحويًّا يمنعك من الولوج إلى نظامك.
</p>

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

<p>
	ما تعنيه هذه الحقيقة بالنسبة لك هو أنّه يجب أن تبدأ بالإعدادات العامّة وتضع الاستثناءات في النهاية، وإلا فإنّ الإعدادات العامة ستُلغي الاستثناءات. يمكنك العثور على ملف sudoers بسيط أدناه اعتمادًا على ذلك الموجود في CentOS وإضافة بضعة أسطر كنا قد ناقشناها سابقًا:
</p>

<pre class="ipsCode">
Defaults !visiblepw
Defaults always_set_home
Defaults match_group_by_gid
Defaults always_query_group_plugin
Defaults env_reset
Defaults env_keep = "COLORS DISPLAY HOSTNAME HISTSIZE KDEDIR LS_COLORS"
Defaults env_keep += "MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE"
Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin
root ALL=(ALL) ALL
%wheel ALL=(ALL) ALL
Defaults:%wheel insults
Defaults !insults
Defaults log_output
</pre>

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

<p>
	الضبط أعلاه صحيح نحويًّا، لكن هل يمكنك اكتشاف الخطأ المنطقي؟ نعم، هناك خطأ: تُعطّل insults للجميع عند آخر إعداد عام حيث يُلغي الإعداد السابق الإعداد الأكثر تحديدًا. وبمجرّد تبديل السطرين يعمل الإعداد كما هو متوقع: يتلقى أعضاء مجموعة wheel رسائل هزليّة في حين أنً باقي المستخدمين لن يتلقونها.
</p>

<h2>
	إدارة الضبط
</h2>

<p>
	بمجرد أن تضطر إلى الاحتفاظ بملف sudoers على أجهزة متعدّدة فمن المرجح أنك تريد إدارة الضبط الخاص بك مركزيًا. لدينا هنا احتمالان رئيسيان مَفتوحا المصدر. لكلٍ منهما مزايا وعيوب.
</p>

<p>
	يمكنك استخدام أحد تطبيقات إدارة الضبط التي تستخدمها أيضًا لضبط بقية البنية التحتيّة الخاصّة بك. تحتوي Red Hat Ansible و Puppet و Chef على وحدات لضبط sudo. المشكلة في هذا النهج هي أنّ تحديث الضبط بعيد عن الوقت الحقيقي. كما أنه لا يزال بإمكان المستخدمين تحرير ملف sudoers محليًا وتغيير الإعدادات.
</p>

<p>
	يمكن للأداة sudo أيضًا تخزين ضبطها في خادم LDAP. تكون تغييرات الضبط في هذه الحالة في الوقت الحقيقي ولا يمكن للمستخدمين العبث بملف sudoers. ولكن من ناحية أخرى لهذه الطريقة محدوديّة أيضًا. حيث لا يمكنك على سبيل المثال استخدام الأسماء المستعارة aliases أو استخدام sudo عندما يكون خادم LDAP غير متوفر.
</p>

<h2>
	ميزات جديدة
</h2>

<p>
	هناك نسخة جديدة من sudo قاب قوسين أو أدنى. سيتضمن الإصدار 1.9 العديد من الميزات الجديدة المثيرة للاهتمام. فيما يلي أهم الميزات المُخطط لها:
</p>

<ol>
<li>
		خدمة تسجيل لجمع تسجيلات الجلسة مركزيًا والتي توفر العديد من المزايا مقارنة بالتخزين المحلي:
		<ol>
<li>
				أكثر ملاءمة للبحث حيث يتم ذلك في مكان واحد.
			</li>
			<li>
				تتوفر التسجيلات حتى ولو كان جهاز المرسل متوقفا.
			</li>
			<li>
				لا يمكن حذف التسجيلات بواسطة شخص يريد حذف سجلات التتبع الخاصّة به.
			</li>
		</ol>
</li>
	<li>
		لا تضيف الإضافة "Audit" ميزات جديدة إلى sudoers، ولكنها توفّر واجهة برمجة تطبيقات <abbr title="Application Programming Interface | واجهة برمجية">API</abbr> للإضافات للوصول بسهولة إلى أي نوع من سجلات sudo. تمكّن هذه الإضافة إنشاء سجلات مخصّصة من أحداث sudo باستخدام الإضافات.
	</li>
	<li>
		تُمكّن إضافة approval موافقات الجلسة دون استخدام إضافات خارجية (third-party plugins).
	</li>
	<li>
		والميزة المفضّلة لدي شخصيًا: دعم Python للمكونات الإضافيّة والتي تمكّنك من توسيع sudo بسهولة باستخدام شيفرة Python بدلاً من كتابة شيفرة أصليّة في C.
	</li>
</ol>
<h2>
	الخلاصة
</h2>

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

<p>
	إذا كنت ترغب بمعرفة المزيد عن sudo فإليك بعض الموارد:
</p>

<ul>
<li>
		<a href="https://www.sudo.ws/" rel="external nofollow">موقع sudo الإلكتروني</a>
	</li>
	<li>
		<a href="https://blog.sudo.ws/" rel="external nofollow">مدونة sudo</a>
	</li>
</ul>
<p>
	ترجمة وبتصرف للمقال <a href="https://opensource.com/article/19/10/know-about-sudo" rel="external nofollow">What you probably didn’t know about sudo</a> لصاحبه <a href="https://opensource.com/users/czanik" rel="external nofollow">Peter Czanik</a>
</p>
]]></description><guid isPermaLink="false">455</guid><pubDate>Mon, 13 Jan 2020 20:39:33 +0000</pubDate></item><item><title>&#x643;&#x64A;&#x641;&#x64A;&#x651;&#x629; &#x625;&#x639;&#x62F;&#x627;&#x62F; &#x645;&#x646;&#x635;&#x651;&#x629; code-server Cloud IDE &#x639;&#x644;&#x649; &#x646;&#x638;&#x627;&#x645; &#x62A;&#x634;&#x63A;&#x64A;&#x644; &#x623;&#x648;&#x628;&#x646;&#x62A;&#x648; 18.04</title><link>https://academy.hsoub.com/devops/linux/%D9%83%D9%8A%D9%81%D9%8A%D9%91%D8%A9-%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF-%D9%85%D9%86%D8%B5%D9%91%D8%A9-code-server-cloud-ide-%D8%B9%D9%84%D9%89-%D9%86%D8%B8%D8%A7%D9%85-%D8%AA%D8%B4%D8%BA%D9%8A%D9%84-%D8%A3%D9%88%D8%A8%D9%86%D8%AA%D9%88-1804-r454/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2020_01/5e1ccdf288958_---code-server-Cloud-IDE-----18_04.jpg.693d762feb964a6da37b12940d82b165.jpg" /></p>

<p>
	مع انتقال أدوات المطوّرين إلى «السحابة» (cloud)، يتزايد إنشاء واعتماد منصّات بيئة التطوير المتكاملة (IDE) السحابية. تتيح منصّات Cloud IDE التعاون في الوقت الحقيقي بين فرق المطوّرين من أجل العمل في بيئة تطوير موحّدة ما من شأنه التقليل من حالات عدم التوافق وتحسين الإنتاجية. حيث يمكن الوصول إليها من خلال متصفحات الويب، وتتوفر Cloud IDEs من كل أنواع الأجهزة الحديثة.
</p>

<p>
	إن <a href="https://github.com/cdr/code-server" rel="external nofollow">code-server</a> هو نسخة <a href="https://code.visualstudio.com/" rel="external nofollow">Microsoft Visual Studio Code</a> تعمل على خادم بعيد ويمكن الوصول إليها مباشرة من متصفحك. المحرر Visual Studio Code هو محرّر تعليمات برمجيّة حديث مع دعم متكامل لـ Git ومنقّح شيفرة وإكمال تلقائي ذكي وميزات أخرى قابلة للتخصيص والتوسيع. يعني هذا أنه سيتوفر لديك دائمًا بيئة تطوير متناسقة حتى مع استخدامك لأجهزة متنوعة تعمل بأنظمة تشغيل مختلفة.
</p>

<p>
	ستقوم في هذه الدليل بإعداد منصّة code-server cloud IDE على جهاز يعمل بنظام تشغيل أبونتو 18.04 وإتاحتها على «اسم النطاق» (domain) خاصتك، وسيكون محميّ بشهادات <abbr title="Transport Layer Security | بروتوكول أمن طبقة النقل">TLS</abbr> <a href="https://letsencrypt.org/" rel="external nofollow">Let's Encrypt</a> المجانيّة. وسيكون لديك في النهاية نسخة Microsoft Visual Studio Code تعمل على خادم Ubuntu 18.04 الخاص بك ومتاحةً على اسم نطاقك ومحميّة بكلمة مرور.
</p>

<h2>
	المتطلبات المُسبقة
</h2>

<ol>
<li>
		خادم يعمل بنظام تشغيل Ubuntu 18.04 على الأقل مع ذاكرة وصول عشوائي (RAM) سعة 2 جيجا بايت، وامتيازات «وصول المستخدم الجذر» (root access)، وحساب sudo «عادي» (non-root). يمكنك إعداد ذلك باتباع <a href="https://academy.hsoub.com/devops/linux/%D8%A7%D9%84%D8%AA%D9%87%D9%8A%D8%A6%D8%A9-%D8%A7%D9%84%D8%A3%D9%88%D9%84%D9%8A%D8%A9-%D9%84%D8%AE%D8%A7%D8%AF%D9%85-%D8%A3%D9%88%D8%A8%D9%88%D9%86%D8%AA%D9%88-1804-r431/" rel="">هذا الدليل للإعداد الأولي للخادم</a>.
	</li>
	<li>
		نسخة Nginx مُثبتة على خادمك. للحصول على دليل حول كيفيّة القيام بذلك، أكمل الخطوات من 1 إلى 4 حول <a href="https://academy.hsoub.com/devops/servers/web/nginx/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%AA%D8%AB%D8%A8%D9%8A%D8%AA-nginx-%D8%B9%D9%84%D9%89-%D8%A3%D9%88%D8%A8%D9%88%D9%86%D8%AA%D9%88-1804-r434/" rel="">كيفيّة تثبيت Nginx على Ubuntu 18.04</a>.
	</li>
	<li>
		كلًّا من سجلي DNS التاليين المُعدّين لخادمك. يمكنك متابعة <a href="https://www.digitalocean.com/community/tutorials/an-introduction-to-digitalocean-dns" rel="external nofollow">هذه المقدمة إلى DigitalOcean DNS</a> للحصول على تفاصيل حول كيفية إضافتها.
		<ol>
<li>
				سجل لـ<code>your-domain</code> يشير إلى عنوان IP العام للخادم الخاص بك.
			</li>
			<li>
				سجل لـ<code>www.your-domain</code> يشير إلى عنوان IP العام لخادمك.
			</li>
		</ol>
</li>
	<li>
		اسم نطاق domain مسجّل بالكامل لاستضافة code-server يُشير إلى خادمك الخاص. سيَستخدم هذا الدليل <code>code-server.your-domain</code> في كامل المقال. يمكنك شراء اسم نطاق من <a href="https://www.namecheap.com/" rel="external nofollow">Namecheap</a> أو الحصول على واحد مجانًا عبر <a href="https://www.freenom.com/en/index.html?lang=en" rel="external nofollow">Freenom</a> أو استخدام أي موقع تسجيل نطاقات تختاره.
	</li>
</ol>
<h2>
	الخطوة 1: تثبيت code-server
</h2>

<p>
	ستقوم في هذا القسم بإعداد code-server على خادمك الخاص. سيستلزم ذلك تنزيل أحدث إصدار وإنشاء خدمة <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> والتي من شأنها أن تُبقي code-server يعمل دائمًا في الخلفية. ستحدد أيضًا سياسة إعادة التشغيل للخدمة، بحيث يبقى code-server متاحًا بعد الأعطال أو إعادات التشغيل المحتملة. سنُخزن جميع البيانات المتعلقة بـ code-server في مجلد باسم <code>‎~/code-server</code> أنشئه عن طريق تنفيذ الأمر التالي:
</p>

<pre class="ipsCode">
mkdir ~/code-server
</pre>

<p>
	انتقل إليه:
</p>

<pre class="ipsCode">
cd ~/code-server
</pre>

<p>
	ستحتاج إلى الانتقال إلى صفحة <a href="https://github.com/cdr/code-server/releases" rel="external nofollow">إصدارات Github</a> لـ code-server واختيار أحدث إصدار من Linux (سيحتوي اسم الملف على الكلمة "linux"). كان الإصدار الأخير عند كتابة هذا التقرير هو 2.1692. نزّله باستخدام<code>wget</code>عن طريق تشغيل الأمر التالي:
</p>

<pre class="ipsCode">
wget https://github.com/cdr/code-server/releases/download/2.1692-vsc1.39.2/code-server2.1692-vsc1.39.2-linux-x86_64.tar.gz
</pre>

<p>
	فكّ بعد ذلك ضغط الأرشيف من خلال تشغيل الأمر التالي:
</p>

<pre class="ipsCode">
tar -xzvf code-server2.1692-vsc1.39.2-linux-x86_64.tar.gz
</pre>

<p>
	ستحصل على مجلد باسم الملف الأصلي الذي قمت بتنزيله والذي يحتوي على ملف الـ code-server القابل للتنفيذ. انتقل إليه:
</p>

<pre class="ipsCode">
cd code-server2.1692-vsc1.39.2-linux-x86_64
</pre>

<p>
	انسخ ملف code-server التنفيذي إلى المسار <code>/usr/local/bin</code> حتى تتمكن من الوصول إليه عبر كامل نطاق النظام عن طريق تشغيل الأمر التالي:
</p>

<pre class="ipsCode">
sudo cp code-server /usr/local/bin
</pre>

<p>
	أنشئ بعد ذلك مجلد لـ code-server حيث ستُخزين بيانات المستخدم:
</p>

<pre class="ipsCode">
sudo mkdir /var/lib/code-server
</pre>

<p>
	الآن وبعد تنزيلك لـ code-server وجعله متاحًا على مستوى النظام، ستُنشئ خدمة systemd لإبقاء code-server يعمل في الخلفيّة بشكل دائم.
</p>

<p>
	ستخزّن ضبط الخدمة في ملف باسم code-server.service، في المسار<code>‎/lib/systemd/system</code> حيث يخزن systemd خدماته. أنشئه باستخدام محرّر نصوصك الخاص:
</p>

<pre class="ipsCode">
sudo nano /lib/systemd/system/code-server.service
</pre>

<p>
	أضف الأسطر التالية في الملف <code>‎/lib/systemd/system/code-server.service</code>:
</p>

<pre class="ipsCode">
[Unit]
Description=code-server
After=nginx.service

[Service]
Type=simple
Environment=PASSWORD=your_password
ExecStart=/usr/local/bin/code-server --host 127.0.0.1 --user-data-dir /var/lib/code-server --auth password
Restart=always

[Install]
WantedBy=multi-user.target
</pre>

<p>
	يتوجب عليك هنا أولًا تحديد وصفٍ للخدمة. تذكر بعد ذلك أنّ خدمة nginx يجب أن تُشغّل قبل هذه الخدمة. يمكنك بعد القسم [Unit] تحديد نوع الخدمة (تعني <code>simple</code> أنه يجب تشغيل العملية ببساطة) وتجهيز الأمر الذي سيُنفّذ.
</p>

<p>
	يمكنك أيضًا تحديد أنّه يجب تشغيل code-server العموميّ القابل للتنفيذ مع إضافة بعض «الوسائط» (arguments) لـ code-server. الوسيط <code>‎--host 127.0.0.1</code> يربطه مع <code>localhost</code>، وبذلك يمكن الوصول إليه مباشرة فقط من داخل خادمك الخاص. يعين الوسيط <code>‎--user-data-dir /var/lib/code-server</code> مسار بيانات المستخدم الخاص به، - يُحدّد <code>‎--auth password</code> أنّه يجب مصادقة الزائرين باستخدام كلمة مرور، كما هو محدّد في متغير البيئة <code>PASSWORD</code> المصرّح عنه في السطر الذي يسبقه.
</p>

<p>
	لا تنسَ استبدال <code>your_password</code> بكلمة مرورك الخاصّة ثم احفظ وأغلق الملف.
</p>

<p>
	يطلب السطر التالي من systemd إعادة تشغيل code-server عند حصول أي خلل (على سبيل المثال عند تعطله أو إنهاء العملية قسريًّا). يطلب القسم <code>[Install]</code> من systemd بدء هذه الخدمة عندما يصبح بالإمكان تسجيل الدخول إلى الخادم الخاص بك.
</p>

<p>
	ابدأ خدمة code-server عن طريق تشغيل الأمر التالي:
</p>

<pre class="ipsCode">
sudo systemctl start code-server
</pre>

<p>
	تحقّق من أنها بدأت بشكل صحيح من خلال مراقبة حالاتها:
</p>

<pre class="ipsCode">
sudo systemctl status code-server
</pre>

<p>
	سترى خرجًا مشابهًا لما يلي:
</p>

<pre class="ipsCode">
 code-server.service - code-server
   Loaded: loaded (/lib/systemd/system/code-server.service; disabled; vendor preset: enabled)
   Active: active (running) since Mon 2019-12-09 20:07:28 UTC; 4s ago
 Main <abbr title="Process IDentifier | معرّف العملية أو البرنامج">PID</abbr>: 5216 (code-server)
    Tasks: 23 (limit: 2362)
   CGroup: /system.slice/code-server.service
           ├─5216 /usr/local/bin/code-server --host 127.0.0.1 --user-data-dir /var/lib/code-server --auth password
           └─5240 /usr/local/bin/code-server --host 127.0.0.1 --user-data-dir /var/lib/code-server --auth password

Dec 09 20:07:28 code-server-ubuntu-1804 systemd[1]: Started code-server.
Dec 09 20:07:29 code-server-ubuntu-1804 code-server[5216]: info  Server listening on http://127.0.0.1:8080
Dec 09 20:07:29 code-server-ubuntu-1804 code-server[5216]: info    - Using custom password for authentication
Dec 09 20:07:29 code-server-ubuntu-1804 code-server[5216]: info    - Not serving HTTPS
</pre>

<p>
	مكّن خدمة code-server لجعله يعمل تلقائيًا بعد إعادة تشغيل الخادم من خلال تشغيل الأمر التالي:
</p>

<pre class="ipsCode">
sudo systemctl enable code-server
</pre>

<p>
	قمتَ في هذه الخطوة بتنزيل code-server وجعله متاحًا على نحوٍ عمومي. وقمت بعدها بإنشاء خدمة systemd له وتمكينها، لذلك سيبدأ code-server بالعمل عند كل إقلاع للخادم. بعد ذلك، ستعرضه في نطاقك الخاص من خلال ضبط Nginx ليكون بمثابة وكيل عكسيّ بين الزائر و code-server.
</p>

<h2>
	الخطوة 2: عرض code-server على نطاقك الخاص
</h2>

<p>
	ستقوم في هذا القسم بضبط Nginx كوكيل عكسي لـ code-server.
</p>

<p>
	كما تعلمت في خطوة المتطلبات المُسبقة لـ Nginx، تُخزّن ملفات ضبط الموقع الخاصة به ضمن <code>‎/etc/nginx/sites-available</code>، ويجب ربطها لاحقًا بـ <code>‎/etc/nginx/sites-enabled</code> لتصبح نشطة.
</p>

<p>
	سنُخزين الضبط لعرض خادم الشفرة في نطاقك في ملف باسم code-server.conf تحت المسار <code>‎/etc/nginx/sites-available</code>. ابدأ بإنشائه باستخدام المحرّر الخاص بك:
</p>

<pre class="ipsCode">
sudo nano /etc/nginx/sites-available/code-server.conf
</pre>

<p>
	أضف الأسطر التالية في الملف <code>‎/etc/nginx/sites-available/code-server.conf</code>:
</p>

<pre class="ipsCode">
server {
    listen 80;
    listen [::]:80;

    server_name code-server.your-domain;

    location / {
        proxy_pass http://localhost:8080/;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection upgrade;
        proxy_set_header Accept-Encoding gzip;
    }
}
</pre>

<p>
	استبدل <code>code-server.your-domain</code> باسم لنطاق المطلوب ثم احفظ وأغلق الملف.
</p>

<p>
	تحدّد في هذا الملف أنه على Nginx أن يتنصت إلى منفذ HTTP رقم <code>80</code>. ثم يمكنك تحديد <code>server_name</code> والذي يُخبر Nginx عن النطاق الذي يقبل الطلبات ويطبّق هذا الضبط المحدّد. في الكتلة التالية بالنسبة، لموقع الجذر (<code>/</code>) يمكنك تحديد أنّ الطلبات يجب تمريرها ذهابًا وإيابًا إلى code-server يعمل على <code>localhost:8080</code>. تطلب الأسطر الثلاثة التالية (بدءًا من <code>proxy_set_header</code>) من Nginx نقل بعض ترويسات طلبات HTTP اللازمة من أجل التشغيل الصحيح لـ WebSockets، والذي يستخدمه code-server على نطاق واسع.
</p>

<p>
	ستحتاج إلى إنشاء رابط له في المجلد <code>‎/etc/nginx/sites-enable</code>من أجل تنشيط ضبط هذا الموقع وذلك من خلال تشغيل الأمر الآتي:
</p>

<pre class="ipsCode">
sudo ln -s /etc/nginx/sites-available/code-server.conf /etc/nginx/sites-enabled/code-server.conf
</pre>

<p>
	شغّل الأمر التالي لاختبار صحّة الضبط:
</p>

<pre class="ipsCode">
sudo nginx -t
</pre>

<p>
	سترى الخرج التالي:
</p>

<pre class="ipsCode">
Output
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
</pre>

<p>
	ستحتاج إلى إعادة تشغيل Nginx لكي يُطّبق الضبط:
</p>

<pre class="ipsCode">
sudo systemctl restart nginx
</pre>

<p>
	لديك الآن تثبيت code-server قابل للوصول على نطاقك. ستقوم في الخطوة التالية بتأمينه من خلال تطبيق شهادة Let's Encrypt <abbr title="Transport Layer Security | بروتوكول أمن طبقة النقل">TLS</abbr> المجانيّة.
</p>

<h2>
	الخطوة 3: تأمين النطاق
</h2>

<p>
	ستقوم في هذا القسم بتأمين نطاقك الخاص باستخدام شهادة Let’s Encrypt <abbr title="Transport Layer Security | بروتوكول أمن طبقة النقل">TLS</abbr>، والتي ستوفرها باستخدام Certbot.
</p>

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

<pre class="ipsCode">
 sudo add-apt-repository ppa:certbot/certbot
</pre>

<p>
	ستحتاج إلى الضغط علىENTER للموافقة.
</p>

<p>
	ثبّت بعد ذلك Certbot وإضافة Nginx الخاص به:
</p>

<pre class="ipsCode">
sudo apt install python-certbot-nginx
</pre>

<p>
	كنت قد مكّنت <code>ufw</code> (جدار حماية غير معقّد) كجزء من المتطلبات المُسبقة وقمت بضبطه للسماح بحركة مرور HTTP غير المشفّرة. وستحتاج إلى ضبطه لقبول حركة المرور المشفّرة حتى تتمكن من الوصول إلى الموقع الآمن عن طريق تشغيل الأمر التالي:
</p>

<pre class="ipsCode">
sudo ufw allow https
</pre>

<p>
	سيكون الخرج:
</p>

<pre class="ipsCode">
Output
Rule added
Rule added (v6)
</pre>

<p>
	ستحتاج كما في Nginx إلى إعادة تحميله حتى يصبح الضبط ساري المفعول:
</p>

<pre class="ipsCode">
sudo ufw reload
</pre>

<p>
	سيُظهر الخرج ما يلي:
</p>

<pre class="ipsCode">
Firewall reloaded
</pre>

<p>
	انتقل بعد ذلك في متصفحك إلى النطاق الذي استخدمته لـ code-server. حيث سيظهر محّث تسجيل الدخول لـ code-server.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="33337" href="https://academy.hsoub.com/uploads/monthly_2020_01/01-step2a.png.056675e01fa6daa99195cfe29e80619e.png" rel=""><img alt="01-step2a.png" class="ipsImage ipsImage_thumbnailed" data-fileid="33337" data-unique="data-unique" src="https://academy.hsoub.com/uploads/monthly_2020_01/01-step2a.png.056675e01fa6daa99195cfe29e80619e.png"></a>
</p>

<p>
	سيطلب code-server كلمة المرور الخاصّة بك. أدخل الكلمة التي اخترتها في الخطوة السابقة واضغط على** Enter IDE**. ستدخل الآن إلى code-server وسترى محرّر واجهة المستخدم الرسومية GUI مباشرةً.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="33338" href="https://academy.hsoub.com/uploads/monthly_2020_01/02-step2b.png.59afc0c0afc2f2912eff7dd7f0285756.png" rel=""><img alt="02-step2b.png" class="ipsImage ipsImage_thumbnailed" data-fileid="33338" data-unique="data-unique" src="https://academy.hsoub.com/uploads/monthly_2020_01/02-step2b.thumb.png.b742fd1d1f38e51bbc7125317c8d08ef.png"></a>
</p>

<p>
	الآن وبعد تأكّدك من أن خادم الشيفرة قد عُرض بشكل صحيح في نطاقك، سنُثبّت شهادات Let’s Encrypt <abbr title="Transport Layer Security | بروتوكول أمن طبقة النقل">TLS</abbr> لتأمينه، باستخدام Certbot.
</p>

<p>
	شغّل الأمر التالي لطلب شهادات لنطاقك:
</p>

<pre class="ipsCode">
sudo certbot --nginx -d code-server.your-domain
</pre>

<p>
	تقوم في هذا الأمر بتشغيل <code>certbot</code> لطلب شهادات لنطاقك — يمكنك تمرير اسم النطاق باستخدام الراية <code>‎-d</code> تخبر الراية <code>‎--nginx</code> بتغيير ضبط موقع Nginx تلقائيًا لدعم HTTPS. تذكر استبدال <code>code-server.your-domain</code> باسم نطاقك الخاص.
</p>

<p>
	إذا كانت هذه هي المرة الأولى التي تُشغّل فيها Certbot فسيُطلب منك تقديم عنوان بريد إلكتروني للإشعارات العاجلة وقبول شروط خدمة EFF. سيطلب Certbot بعد ذلك شهادات لنطاقك من Let’s Encrypt. كما سيسألك بعدها فيما إذا كنت ترغب في إعادة توجيه جميع زيارات HTTP إلى HTTPS:
</p>

<pre class="ipsCode">
Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: No redirect - Make no further changes to the webserver configuration.
2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for
new sites, or if you're confident your site works on HTTPS. You can undo this
change by editing your web server's configuration.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate number [1-2] then [enter] (press 'c' to cancel):
</pre>

<p>
	يُوصى بتحديد الخيار الثاني من أجل زيادة الأمان. اضغط<code>ENTER</code>بعد إدخال اختيارك. سيكون الخرج مشابهًا لهذا:
</p>

<pre class="ipsCode">
IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/code-server.your-domain/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/code-server.your-domain/privkey.pem
   Your cert will expire on ... To obtain a new or tweaked
   version of this certificate in the future, simply run certbot again
   with the "certonly" option. To non-interactively renew *all* of
   your certificates, run "certbot renew"
 - Your account credentials have been saved in your Certbot
   configuration directory at /etc/letsencrypt. You should make a
   secure backup of this folder now. This configuration directory will
   also contain certificates and private keys obtained by Certbot so
   making regular backups of this folder is ideal.
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le
</pre>

<p>
	هذا يعني أن Certbot أنشئ شهادات <abbr title="Transport Layer Security | بروتوكول أمن طبقة النقل">TLS</abbr> بنجاح وطبّقها على ضبط Nginx لنطاقك. يمكنك الآن القيام بإعادة تحميل اسم نطاق code-server الخاص بك في متصفحك ورؤية رمز القفل على يسار عنوان الموقع مما يعني أن اتصالك أصبح آمنًا.
</p>

<p>
	الآن وبعد أن أصبح لديك code-server يمكن الوصول إليه في نطاقك من خلال وكيل Nginx عكسي آمن، أصبحت على استعداد لاستعراض واجهة المستخدم لـ code-server.
</p>

<h2>
	الخطوة 4: استخدام واجهة code-server
</h2>

<p>
	ستستخدم في هذا القسم بعضًا من ميزات واجهة code-server. ولأنّ code-server هو عبارة عن Visual Studio Code يعمل على السحابة، فإنّه يحتوي على نفس واجهة إصدار سطح المكتب المستقلة.
</p>

<p>
	يوجد على الجانب الأيسر من الـ IDE صف عمودي مكوّن من ستة أزرار يُتيح استعمال أكثر الميزات استخدامًا في لوحة جانبية تُعرف باسم Activity Bar.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="33339" href="https://academy.hsoub.com/uploads/monthly_2020_01/03-step4a.png.7cef6c7940518b2be4976ac258f4ac66.png" rel=""><img alt="03-step4a.png" class="ipsImage ipsImage_thumbnailed" data-fileid="33339" data-unique="data-unique" src="https://academy.hsoub.com/uploads/monthly_2020_01/03-step4a.thumb.png.cc2bbf7daa3f0530cc828673288f47f0.png"></a>
</p>

<p>
	هذا الشريط قابل للتخصيص بحيث يمكنك نقل هذه الأزرار إلى ترتيب مختلف أو إزالتها من الشريط. افتراضيًا يفتح الزر الأول القائمة العامة في قائمة منسدلة، بينما يفتح الزر الثاني لوحة Explorer التي توفر التنقل الهرمي الشبيه ببنية المشروع. يمكنك إدارة المجلدات والملفات هنا – من إنشاء وحذف ونقل وإعادة تسمية حسب الضرورة. يُوفّر الزر التالي التالية إمكانية الوصول إلى وظيفة البحث والاستبدال. بعد ذلك، وبالترتيب الافتراضي (أي الزر الرابع) يُتيح معاينة لأنظمة التحكم في المصدر مثل <a href="https://git-scm.com/download" rel="external nofollow">Git</a>. يدعم Visual Studio code أيضًا موفري التحكم بالمصدر الآخرين ويمكنك العثور على مزيد من الإرشادات لتدفقات عمل التحكم بالمصدر مع المحرّر في <a href="https://code.visualstudio.com/docs/editor/versioncontrol" rel="external nofollow">هذه الوثائق</a>.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="33340" href="https://academy.hsoub.com/uploads/monthly_2020_01/04-step4b.png.8b745e47491a73155f00d0c2b484cda9.png" rel=""><img alt="04-step4b.png" class="ipsImage ipsImage_thumbnailed" data-fileid="33340" data-unique="data-unique" src="https://academy.hsoub.com/uploads/monthly_2020_01/04-step4b.thumb.png.bee57d38f195619094d75eb9a4ffd7be.png"></a>
</p>

<p>
	يوفر خيار المنقّح debugger في Activity Bar جميع الأدوات الشائعة للتنقيح في اللوحة. يأتي Visual Studio Code مع دعم مضمّن لمنقّح وقت التشغيل <a href="https://nodejs.org/" rel="external nofollow">Node.js</a> وأي لغة تنتمي إلى <a href="https://academy.hsoub.com/programming/javascript/" rel="">Javascript</a>. وبالنسبة للغات أخرى يمكنك تثبيت إضافات<a href="https://code.visualstudio.com/docs/editor/debugging#_debugger-extensions" rel="external nofollow">extensions</a> للمنقح المطلوب. كما يمكنك حفظ ضبط التنقيح في ملف<code>launch.json</code>.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="33341" href="https://academy.hsoub.com/uploads/monthly_2020_01/05-step4c.png.cd4ffef0fe0ec116abce89ef0e75d6b4.png" rel=""><img alt="05-step4c.png" class="ipsImage ipsImage_thumbnailed" data-fileid="33341" data-unique="data-unique" src="https://academy.hsoub.com/uploads/monthly_2020_01/05-step4c.thumb.png.ec45aa35ec7b927713163331db925e3c.png"></a>
</p>

<p>
	يوفر الزر الأخير في Activity Bar قائمة للوصول إلى الملحقات المُتاحة في <a href="https://marketplace.visualstudio.com/VSCode" rel="external nofollow">Marketplace</a>.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="33342" href="https://academy.hsoub.com/uploads/monthly_2020_01/06-step4d.png.0f1500020343ed5d5d58e81625529fb2.png" rel=""><img alt="06-step4d.png" class="ipsImage ipsImage_thumbnailed" data-fileid="33342" data-unique="data-unique" src="https://academy.hsoub.com/uploads/monthly_2020_01/06-step4d.thumb.png.303f4e8234c9720cb27fabe5c7fc65b0.png"></a>
</p>

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

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="33343" href="https://academy.hsoub.com/uploads/monthly_2020_01/07_step4e.png.f74a27b8ca9c9f72ececc4da7ed8b7c8.png" rel=""><img alt="07_step4e.png" class="ipsImage ipsImage_thumbnailed" data-fileid="33343" data-unique="gbi2xtjif" src="https://academy.hsoub.com/uploads/monthly_2020_01/07_step4e.thumb.png.0b8cde8e176ec51e7a9824e4f5dd9123.png"></a>
</p>

<p>
	بعد إنشاء ملف جديد من خلال قائمة <strong>File</strong>، سيُفتح ملف فارغ في علامة تبويب جديدة، وبعد حفظه، سيكون اسم الملف معروضًا في اللوحة الجانبيّة لـ Explorer. يمكن إنشاء المجلدات عن طريق النقر بزر الفأرة الأيمن على الشريط الجانبي لـ Explorer والنقر فوق <strong>New Folder</strong>. يمكنك توسيع أحد المجلدات بالنقر فوق اسمه وكذلك سحب الملفات والمجلدات وإسقاطها في الأجزاء العليا من التسلسل الهرمي لنقلها إلى موقع جديد.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="33344" href="https://academy.hsoub.com/uploads/monthly_2020_01/08-step4f.png.ebff0cab256dd3f25ada340efc966c90.png" rel=""><img alt="08-step4f.png" class="ipsImage ipsImage_thumbnailed" data-fileid="33344" data-unique="i7zfp81mn" src="https://academy.hsoub.com/uploads/monthly_2020_01/08-step4f.thumb.png.cb358ce0117410b55b193b411e3840e1.png"></a>
</p>

<p>
	بالإمكان الوصول إلى محطة طرفية عن طريق إدخال <code>CTRL ‎+ SHIFT +‎</code>، أو عن طريق النقر على <strong>Terminal</strong> في القائمة المنسدلة العليا واختيار <strong>New Terminal</strong>. سيُفتح الجهاز في لوحة أصغر وسيُوضع مجلد العمل الخاص به في مساحة عمل المشروع، والذي يحتوي على الملفات والمجلدات المعروضة في لوحة Explorer الجانبيّة.
</p>

<p>
	 
</p>

<p>
	لقد أخذت نظرةً عامة عالية المستوى على واجهة code-server وراجعت بعضًا من الميزات الأكثر استخدامًا.
</p>

<h2>
	الخلاصة
</h2>

<p>
	لديك الآن بيئة التطوير المتكاملة code-server السحابية متعددة الاستخدامات مُثبّتة على خادم Ubuntu 18.04 ومعروضة في نطاقك المؤّمن باستخدام شهادات Let’s Encrypt. يمكنك الآن العمل على المشاريع بشكل فردي، وكذلك في إطار التعاون الجماعي. يحرّر تشغيل Cloud IDE الموارد على جهازك المحلي ويسمح لك بتوسيع نطاق الموارد عند الحاجة. راجع لمزيد من المعلومات <a href="https://code.visualstudio.com/docs" rel="external nofollow">توثيق Visual Studio Code</a> للحصول على ميزات إضافيّة وإرشادات مفصّلة حول المكونات الأخرى لـ code-server.
</p>

<p>
	ترجمة وبتصرف للمقال <a href="https://www.digitalocean.com/community/tutorials/how-to-set-up-the-code-server-cloud-ide-platform-on-ubuntu-18-04" rel="external nofollow">How To Set Up the code-server Cloud IDE Platform on Ubuntu 18.04</a> لصاحبه <a href="https://www.digitalocean.com/community/users/duskosavic" rel="external nofollow">Savic</a>
</p>
]]></description><guid isPermaLink="false">454</guid><pubDate>Mon, 13 Jan 2020 20:07:15 +0000</pubDate></item><item><title>&#x645;&#x627; &#x647;&#x648; &#x646;&#x638;&#x627;&#x645; &#x627;&#x644;&#x62A;&#x634;&#x63A;&#x64A;&#x644; &#x644;&#x64A;&#x646;&#x643;&#x633;&#x61F;</title><link>https://academy.hsoub.com/devops/linux/%D9%85%D8%A7-%D9%87%D9%88-%D9%86%D8%B8%D8%A7%D9%85-%D8%A7%D9%84%D8%AA%D8%B4%D8%BA%D9%8A%D9%84-%D9%84%D9%8A%D9%86%D9%83%D8%B3%D8%9F-r451/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2020_09/5f50b5419ec0f_whatisLinux.png.3d22be92c434813a99e2b3a679ce776b.png" /></p>

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

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

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

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

<h2>
	ما هو نظام التشغيل لينكس أصلًا؟
</h2>

<p>
	”وندوز“ و”آي‌أو‌إس“ و”ماك أو‌إس“ هي أنظمة تشغيل، ولينكس أيضًا نظام تشغيل. وفي هذا السياق، أتعلم أنّ أكثر منصّة رائجة في كوكبنا الأرض ”أندرويد“ تعمل بنظام التشغيل لينكس؟ نظام التشغيل (ويُختصر بِـ OS) هو البرمجية التي تُدير كلّ ما يتعلّق بالعتاد في حاسوبك المكتبي أو المحمول. لنبسّطها أكثر، نظام التشغيل يُدير الاتصالات بين البرمجيّات (Software) والعتاد (Hardware) على جهازك. ودون نظام التشغيل فلن تعمل أيًا من البرامج.
</p>

<p>
	يعتمد أساس نظام التشغيل لينكس على هذه الأجزاء المختلفة:
</p>

<ol>
<li>
		<strong>محمِّل الإقلاع</strong> (<em>Bootloader</em>): أي البرمجية التي تُدير عمليّة إقلاع/تشغيل حاسوبك. حين يرى أغلب المستخدمين شاشة البداية التي تظهر أمامهم وتختفي بعد فترة لتفتح نظام التشغيل، تعرف أنّهم قد رأوا هذا المحمِّل.
	</li>
	<li>
		<strong>النواة</strong> (<em>Kernel</em>): في الواقع فَإن نظام التشغيل لينكس مكوّن من أجزاء عديدة، النواة هذه واحدة منها. كما يدلّ اسمها، فهي نواة النظام والتي تُدير المعالج والذاكرة والأجهزة الداخليّة والخارجيّة. تعد النواة المستوى الأدنى من مستويات نظام التشغيل وهي حلقة الوصل الفعليّة بين البرمجيّات والعتاد.
	</li>
	<li>
		<strong>نظام التمهيد</strong> (<em>Init System</em>): هذا أحد الأنظمة الفرعيّة التي ”تُمهّد“ المساحة المخصّصة للمستخدم، إضافةً إلى إدارة العفاريت. أكثر هذه الأنظمة استعمالًا هو systemd ويتصادف أنّه أيضًا أكثرها جدلًا بين المستخدمين. تقع على عاتق هذا النظام إدارةَ عمليّة الإقلاع ما إن يُسلِّم محمّل الإقلاع (مثل GRUB أي ”محمِّل الإقلاع الموحّد الأعظم“ [<strong>GR</strong>and <strong>U</strong>nified <strong>B</strong>ootloader]) عمليّة الإقلاع الأولي.
	</li>
	<li>
		<strong>العفاريت</strong> (<em>Daemons</em>): الخدمات التي تجري في الخلفيّة (مثل الطباعة والصوت وترتيب مهام النظام وغيرها) تُسمّى بالعفاريت، ويمكن أن تبدأ إمّا أثناء الإقلاع أو بعد الدخول إلى سطح المكتب. تعمل هذه الخدمات بمنأًى عن تحكّم المستخدم المباشر، ويمكن أن تنفّذ مختلف الوظائف والعمليات والأوامر.
	</li>
	<li>
		<strong>خادوم الرسوميّات</strong> (<em>Graphical Server</em>): هذا أحد الأنظمة الفرعيّة الأخرى التي تعرض أيّ رسوم ورسوميّات على الشاشة لديك. النسخة الأولية منه كانت ”خادوم X“ (أو إكس/X اختصارًا)، أما الآن فالتوجه نحو Wayland وهو أفضل من نواحٍ عدّة عن سلفه ”خادوم X“.
	</li>
	<li>
		<strong>بيئة سطح المكتب</strong> (<em>Desktop Environment</em>): هذه هي ما يتفاعل المستخدمين معه حقًا. توجد أعداد كبيرة من بيئات سطح المكتب ليختار المستخدم ما يُريحه منها (جنوم أو القرفة أو متّة أو بانيثون أو إنلايتمنت أو كدي أو إكسفسي أو غيرها). وفي كلّ بيئة سطح مكتب عدد من التطبيقات المثبّتة مبدئيًا (مثل مدراء الملفات وأدوات الضبط ومتصفّحات الوِب والألعاب).
	</li>
	<li>
		<strong>التطبيقات</strong>: بالطبع، لا تقدّم بيئات سطح المكتب كلّ ما تحتاج من تطبيقات. فكما نظامي وندوز وماك أو‌إس، يقدّم نظام التشغيل لينكس أيضًا آلافًا مؤلّفة من البرمجيات الموثوقة عالية الكفاءة وسهلة الوصول والتثبيت. أصبحت تحتوي أغلب توزيعات لينكس الحديثة (نتطرّق إليها أسفله) أدوات تشبه ”أسواق البرامج“ تحاول تبسيط تثبيت البرمجيات وتوحيدها في مكان واحد. فمثلًا تحتوي توزيعة أوبنتو لينكس على ”مركز برمجيات أوبونتو“ (نسخة من «برمجيّات جنوم») وهو يقدّم لك آليّة سهلة للبحث بسرعة بين آلاف التطبيقات وتثبيتها، كلّه في مكان واحد.
	</li>
</ol>
<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="32640" href="https://academy.hsoub.com/uploads/monthly_2019_11/5dda4bed38582_---.png.60aa2a4615c34259964920a8c74caa28.png" rel=""><img alt="تطبيقات-نظام-التشغيل-لينكس.png" class="ipsImage ipsImage_thumbnailed" data-fileid="32640" data-unique="data-unique" src="https://academy.hsoub.com/uploads/monthly_2019_11/5dda4bf2a5991_---.thumb.png.2375758de4fa6cc361652515aa9ca3d0.png"></a>
</p>

<h2>
	ما هي مزايا نظام التشغيل لينكس؟
</h2>

<p>
	يطرح أغلب الأشخاص هذا السؤال بالذات. لماذا أُتعب نفسي وأتعلّم بيئة حاسوبيّة مختلفة تمامًا عمّا أعرف، طالما نظام التشغيل -المثبّت في أغلب الأجهزة المكتبية والمحولة والخواديم- يعمل دون مشاكل تُذكر؟
</p>

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

<h3>
	نظام تشغيل مجاني
</h3>

<p>
	كما قلتُ تمامًا، صفر قرش… أي مجانًا. يمكنك تثبيت نظام التشغيل لينكس على الحواسيب التي تريد (مهما كان العدد) دون أن تدفع ولو قرشًا لتراخيص البرمجيّات أو الخواديم.
</p>

<p>
	تعال نرى تكلفة خادوم لينكس موازنةً بخادوم وندوز 2016. تكلفة Standard edition من Windows Server 2016 هي 882 دولارًا (نشتريها من مايكروسوفت مباشرةً). هذا لا يشمل ترخيص الوصول للعميل (CAL) ورُخص البرمجيات الأخرى التي سيشّغلها الخادوم (مثل قاعدة البيانات وخادوم الوِب وخادوم البريد وغيرها). فمثلًا يُكلّف ترخيص CAL لمستخدم واحد لِـ Windows Server 2016 38 دولارًا. لو اضطررت إلى إضافة 10 مستخدمين فتزيد عليها 388 أخرى فقط لترخيص برمجيات الخادوم. لو كنت على خادوم لينكس فسيكون كلّ هذا مجانيًا وسهل التثبيت. بل أنّ تثبيت خادوم وِب كامل متكامل (ويشمل خادوم قواعد بيانات) عمليّة قوامها بعض النقرات أو الأوامر (لتعرف مدى بساطة ذلك طالع ”<a href="https://academy.hsoub.com/devops/servers/%D9%83%D9%8A%D9%81-%D8%AA%D8%AB%D8%A8%D8%AA-%D8%AD%D8%B2%D9%85-mysql-%D8%8Capache-%D8%8Clinux-lamp-%D9%88-php-%D8%B9%D9%84%D9%89-%D8%A3%D9%88%D8%A8%D9%86%D8%AA%D9%88-1404-r27/" rel="">كيفية تثبيت حزم LAMP</a>“).
</p>

<p>
	ألم تقتنع بعد بالصفر قرش؟ إذًا لو أخبرتك بنظام تشغيل سيعمل دون أيّة مشكلة تُذكر مهما طال استخدامك له، ما تقول؟ استعملت شخصيًا نظام التشغيل لينكس طوال 20 سنة أو يزيد (أكان لجهاز المكتب أم لمنصّة الخادوم) ولم أواجه قط أيّ مشكلة مع برامج الفِدية أو البرامج الضارة أو الفيروسات أو غيرها. فلينكس (وبصفة عامة) أقلّ تعرضًا لهذه الأخطار والاعتداءات من غيره. وحين نتحدّث عن إعادة إقلاع الخادوم، فهي مطلوبة فقط <strong>وفقط</strong> عند تحديث النواة. ولو سمعت بأنّ خواديم لينكس تعمل لسنوات وسنوات دون إعادة إقلاعها فلا تستغرب، هذا طبيعي. لو أخذت بالتحديثات المستحسن تثبيتها دوريًا، فتأكّد من ثبات النظام واستقلاليّته، وليس هذا حبرًا على ورق، بل كلام عمليّ مُثبت. بل أنّ منهجيّة ”اضبطه مرّة وانساه كل مرّة“ (Set it and forget it) هي المتّبعة في أوساط خواديم لينكس.
</p>

<h3>
	مفتوح المصدر
</h3>

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

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

<h2>
	ما هي توزيعات نظام التشغيل لينكس؟
</h2>

<p>
	توجد عديد من الإصدارات المختلفة من نظام التشغيل لينكس الهادفة إلى تقديم الخيار لجميع الناس مهمًا كانوا، أكانوا مستخدمين جدد أو معمّرين. أيًا كنت فستجد ”نكهة“ من لينكس تناسب متطلباتك واحتياجاتك. هذه الإصدارات هي ما نسمّيه التوزيعات (Distribution). يمكن تنزيل كلّ توزيعة من توزيعات لينكس مجانًا (إلى حدّ ما)، وحرقها على اسطوانة (أو جهاز USB) وتثبيتها (على أيّ جهاز أردت، بل وأجهزة أيضًا).
</p>

<p>
	من التوزيعات الشائعة للينكس:
</p>

<ul>
<li>
		<a href="http://www.linuxmint.com" rel="external nofollow">لينكس مِنت</a> (Linux Mint)
	</li>
	<li>
		<a href="https://manjaro.org" rel="external nofollow">مانجارو</a> (Manjaro)
	</li>
	<li>
		<a href="https://www.debian.org" rel="external nofollow">دِبيان</a> (Debian)
	</li>
	<li>
		<a href="http://www.ubuntu.com" rel="external nofollow">أوبونتو</a> (Ubuntu)
	</li>
	<li>
		<a href="https://antergos.com" rel="external nofollow">أنتيرغوس</a> (Antergos)
	</li>
	<li>
		<a href="https://getsol.us/home" rel="external nofollow">سولوس</a> (Solus)
	</li>
	<li>
		<a href="http://fedoraproject.org" rel="external nofollow">فيدورا</a> (Fedora)
	</li>
	<li>
		<a href="https://elementary.io" rel="external nofollow">إليمنتري أو‌ إس</a> (elementary OS)
	</li>
	<li>
		<a href="https://www.opensuse.org" rel="external nofollow">أوبن سوزة</a> (openSUSE)
	</li>
</ul>
<p>
	لكلّ توزيعة منها توجّه مختلف على ماهيّة سطح المكتب. بعضها تفضّل واجهات المستخدم الحديثة (مثل جنوم وبانيثون في ”نظام تشغيل إليمنتري“)، والأخرى تفضّل البقاء مع بيئات سطح المكتب التقليدية (مثل أوبن سوزة التي تستخدم كدي).
</p>

<p>
	يمكنك أيضًا مطالعة موقع <a href="http://distrowatch.com/" rel="external nofollow">Distrowatch</a> لتعرف أفضل 100 توزيعة لينكس من جهة نظر المجتمع.
</p>

<p>
	ولو فكّرت للحظة بأنّ الخواديم ليس لها نصيب من هذا، فأنت مخطئ! انظر:
</p>

<ul>
<li>
		<a href="http://www.redhat.com/" rel="external nofollow">Red Hat Enterprise Linux</a>
	</li>
	<li>
		<a href="http://www.ubuntu.com/download/server" rel="external nofollow">Ubuntu Server</a>
	</li>
	<li>
		<a href="https://www.centos.org/" rel="external nofollow">CentOS</a>
	</li>
	<li>
		<a href="https://www.suse.com/products/server/" rel="external nofollow">SUSE Enterprise Linux</a>
	</li>
</ul>
<p>
	بعض هذه التوزيعات المخصّصة للخواديم مجّاني (مثل Ubuntu Server وCentOS)، وأخرى تطلب ثمنًا لقائها (مثل Red Hat Enterprise Linux وSUSE Enterprise Linux). هذه التي تطلب الثمن تقدّم الدعم الفنّي أيضًا.
</p>

<h2>
	ما هي توزيعة لينكس التي تناسبني؟
</h2>

<p>
	إجابتك على هذه الأسئلة الثلاثة تحدّد <a href="https://itwadi.com/node/2128" rel="external nofollow">التوزيعة الأنسب لك</a>:
</p>

<ul>
<li>
		مدى خبرتك بالأمور التقنية والحاسوبية.
	</li>
	<li>
		أكنت تريد واجهة مستخدم حديثة أم قياسية عادية.
	</li>
	<li>
		أكنت تريده للخادوم أو للأجهزة المكتبية.
	</li>
</ul>
<p>
	لو كانت خبرتك ومهاراتك بالحاسوب بسيطة، فالأفضل أن تتّجه نحو توزيعة تناسب المبتدئين مثل Linux Mint أو Ubuntu أو Elementary OS أو Deepin. ولو كانت مهاراتك فوق المتوسّط، فستكون التوزيعات أمثال Debian وFedora أفضل لك. أمّا لو كنت ”احترفت مِهنة الحاسوب“ وإدارة الأنظمة، فتوزيعة جنتو وأمثالها طُوّرت لك خصّيصًا. لكن، لو أردت تحدّيًا لمهاراتك الفذّة أخي الخبير، فاصنع توزيعة لينكس خاصّة بك أنت، طبعًا مستعينًا بِـ Linux From Scratch.
</p>

<p>
	في حال كنت تبحث عن توزيعة للخواديم فقط، فالسؤال الرابع هو لو أردت واجهة سطح مكتب أم أنّك ستُدير الخادوم عبر سطر الأوامر دون واجهة. فمثلًا Ubuntu Server لا تحتوي واجهة رسوميّة، وهذا يعطيك ميزتين. الأولى هي إزاحة ثقل تحميل الرسوميات عن الخادوم، والثانية هي تعلّم سطر أوامر لينكس تعلّمًا عميقًا. يمكنك مع ذلك تثبيت حزمة واجهة رسوميّة في Ubuntu Server بأمر بسيط مثل <code>sudo apt-get install ubuntu-desktop</code>. غالبًا ما يختار مدراء الأنظمة التوزيعات حسب الميزات التي تقدّمها. فهل تريد توزيعة متخصّصة للخواديم تقدّم لك كل ما تحتاجه لخادومك على طبق من فضّة؟ لو أردت فستكون CentOS فضل الخيارات. أو ربما تريد توزيعة لسطح المكتب تُضيف ما تريد من برامج وحزم فيها؟ لو كان كذلك فستقدّم لك Debian أو Ubuntu Linux ما تحتاج. ننصحك بالرجوع إلى مقالة <a href="https://academy.hsoub.com/devops/linux/%D8%A7%D9%84%D8%AF%D9%84%D9%8A%D9%84-%D8%A7%D9%84%D9%86%D9%87%D8%A7%D8%A6%D9%8A-%D9%84%D8%A7%D8%AE%D8%AA%D9%8A%D8%A7%D8%B1-%D8%AA%D9%88%D8%B2%D9%8A%D8%B9%D8%A9-%D9%84%D9%8A%D9%86%D9%83%D8%B3-r48/" rel="">الدليل النهائي لاختيار توزيعة لينكس</a> لمزيد من التفاصيل حول التوزيعات واختيارها.
</p>

<h2>
	تثبيت لينكس
</h2>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="32639" href="https://academy.hsoub.com/uploads/monthly_2019_11/5dda4bea774ff_---.png.dd5a4f7af338ca2cdb5589444971bf21.png" rel=""><img alt="تثبيت-نظام-التشغيل-لينكس.png" class="ipsImage ipsImage_thumbnailed" data-fileid="32639" data-unique="data-unique" src="https://academy.hsoub.com/uploads/monthly_2019_11/5dda4bebec899_---.thumb.png.81302ec49e688739bf2529329ad6599c.png"></a>
</p>

<p>
	لسان حال أغلب الناس عن تثبيت نظام التشغيل هو ”ماذا؟ صعب! مستحيل! محال!“. بينما الواقع (صدّقته أم لا) هو أنّ تثبيت نظام التشغيل لينكس هو الأسهل من بين كلّ أنظمة التشغيل. بل أنّ أغلب نُسخ لينكس تقدّم لك ما نسمّيه ”التوزيعة الحيّة“ (Live Distribution)، أي التي تشغّل منها نظام التشغيل وهو على اسطوانة CD/DVD أو على إصبع USB (فلاش ميموري) دون أن تُعدّل أيّ بايت في القرص الصلب. هكذا تعرف بمزايا التوزيعة كاملةً دون تثبتيها حتّى، وما إن تجرّبها وترتاح لها، وتقرّر وتقول ”هذه هي توزيعة أحلامي“، تنقر مرّتين أيقونة ”ثبِّت“ وسيأخذك مُرشد التثبيت في رحلة التثبيت البسيطة (فقط!).
</p>

<p>
	غالبًا ما تكون رحلة مُرشد التثبيت هي هذه الخطوات (نوضّح هنا عملية تثبيت Ubuntu Linux):
</p>

<ul>
<li>
		التحضير: التأكّد من استيفاء الجهاز لمتطلّبات التثبيت. يمكن أن يسألك هذا لو أردت تثبيت برمجيّات من الأطراف الثالثة (مثل ملحقات تشغيل MP3 ومرمزات الفيديوهات وغيرها).
	</li>
	<li>
		إعداد الاتصال اللاسلكي (لو أردته): في حال كنت تستعمل حاسوبًا محمولًا (أو جهازًا يدعم الاتصال لاسلكيًا) فقد يُطلب منك الاتصال بالشبكة لتثبيت برمجيات الأطراف الثالثة والتحديثات.
	</li>
	<li>
		تخصيص المساحة للقرص الصلب: تُتيح لك هذه الخطوة اختيار المكان الذي سيُثبّت فيه نظام التشغيل، وهل تريد تثبيت لينكس مع نظام تشغيل آخر (أي ”الإقلاع المزدوج“) أو استعمال القرص الصلب كلّه أو ترقية نسخة لينكس المثبّتة أو تثبيت لينكس عوض النسخة التي لديك.
	</li>
	<li>
		المكان: أي، مكانك على الخريطة.
	</li>
	<li>
		تخطيط لوحة المفاتيح: لغات الكتابة التي تريدها في النظام.
	</li>
	<li>
		إعداد المستخدم: أي اسم المستخدم وكلمة السر.
	</li>
</ul>
<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="32642" href="https://academy.hsoub.com/uploads/monthly_2019_11/5dda4bf77498b_----.png.ce937a9cc64d9b3f04ddb3f31842b2b0.png" rel=""><img alt="كيفية-تثبيت-نظام-التشغيل-لينكس.png" class="ipsImage ipsImage_thumbnailed" data-fileid="32642" data-unique="data-unique" src="https://academy.hsoub.com/uploads/monthly_2019_11/5dda4bf8eab27_----.thumb.png.7ac6c7efb19da4bc93e64c043ea6a481.png"></a>
</p>

<p>
	طبعًا، يمكنك ألّا تحذف كامل القرص بما فيه (مثلما ترى في الصورة أعلاه ”تحذير“)، بل تعديل بعضه وإبقاء الآخر عبر الخيار الآخر Something else (ويفضّل طبعًا تحديد مساحة لقرص التبديل/Swap تتناسب وحجم الذاكرة). وعلى سبيل الطرفة، كثير من مستعملي لينكس يواجهون هذه المشكلة أول مرة ويمسحون جميع بياناتهم المخزنة على القرص، حتّى أنا مترجم المقال فكن حذرًا إني لك من الناصحين :-). لكن هذا ليس سببًا بأنّ لينكس نظام سيئ (وبالعامية ”قمامة“)، لكنه سببٌ ”لأقرأ كامل السؤال قبل الإجابة“ :). يمكنك أيضًا تعمية القرص لتكون آمنًا من أيّ هجمات محتملة.
</p>

<p>
	فقط. هذا فقط. وما إن ينتهي تثبيت النظام، أعِد التشغيل واشرع العمل! لو أردت دليلًا لتثبيت لينكس معمّقًا أكثر، فطالع ” <a href="https://www.linux.com/learn/tutorials/770346-how-to-install-and-try-linux-the-absolutely-easiest-and-safest-way" rel="external nofollow">أسهل وأأمن طريقة لتثبيت لينكس وتجربته</a>“ أو نزّل <a href="https://training.linuxfoundation.org/images/pdfs/Preparing_Your_Computer_for_LFS101x.pdf" rel="external nofollow">كتيّب PDF</a> عن تثبيت لينكس من مؤسّسة لينكس نفسها.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="32641" href="https://academy.hsoub.com/uploads/monthly_2019_11/5dda4bf564e5c_-----.png.051cf1a77a2b42d4e89b7c23328f85b2.png" rel=""><img alt="سطح-مكتب-نظام-التشغيل-لينكس-أبنتو.png" class="ipsImage ipsImage_thumbnailed" data-fileid="32641" data-unique="data-unique" src="https://academy.hsoub.com/uploads/monthly_2019_11/5dda4bf689d2a_-----.thumb.png.9dd7e40655a9395561cd5e8526cb2b48.png"></a>
</p>

<h2>
	تثبيت البرمجيات في لينكس
</h2>

<p>
	كما كان تثبيت نظام التشغيل سهلًا، فتثبيت التطبيقات سهل أيضًا. تحتوي أغلب توزيعات لينكس على ما يمكن تسميته بسوق للبرمجيات، وهو مكان موحّد يمكنك البحث فيه عن ما تريد من برامج وتثبيتها. تعتمد Ubuntu Linux (وغيرها الكثير) على «برمجيّات جنوم»، وتستعمل Elementary OS مركز AppCenter، أمّا Deepin فَـ Deepin Software Center، و openSUS أداة AppStore، وثمّة توزيعات تعتمد على Synaptic.
</p>

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

<p>
	ولهذا سنأخذ نظرة سريعة على أداتين مختلفين لنوضّح سهولة التثبيت من سطر الأوامر، أسهل من شرب الماء ربما. تُستعمل هاتين الأداتين في التوزيعات المبنيّة على Debian، والمبنيّة على Fedora تستعمل الأولى (توزيعات دبيان) أداة <code>apt-get</code> لتثبيت البرمجيات، أمّا توزيعات فيدورا تستعمل أداة <code>yum</code>، ولكلتا الأداتين آلية عمل متشابهة سنوضّحها باستعمال أمر <code>apt-get</code>. فلنقل فرضًا أنّك تريد تثبيت أداة wget (أداة مفيدة جدًا لتنزيل الملفات عبر سطر الأوامر). لتثبيت هذه الأداة باستعمال apt-get، ستُدخل هذا الأمر:
</p>

<pre class="ipsCode">
sudo apt-get install wget
</pre>

<p>
	نُضيف أمر <code>sudo</code> لأنّ تثبيت البرمجيات يطلب امتيازات المستخدم الفائقة (مدير الجهاز). وكما دبيان، فتثبيت البرامج في توزيعات فيدورا على خطوتين: أولا <code>su</code> للامتيازات تلك (أي أن تكتب الأمر <code>su</code> وتُدخل كلمة سرّ الجذر)، بعدها:
</p>

<pre class="ipsCode">
yum install wget
</pre>

<p>
	هذا كل ما تحتاجه لتثبيت البرامج في جهاز لينكس. أكان صعبًا ومحالًا كما تخيّلته؟ لا تقل لي أنّك متردّد بعد؟! أتذكر ”كيفيّة تثبيت حزم LAMP“ التي تكلمنا عنها؟ بأمر واحد:
</p>

<pre class="ipsCode">
sudo taskel
</pre>

<p>
	بأمر واحد تُثبّت خادوم LAMP (اختصار <strong>L</strong>inux <strong>A</strong>pache <strong>M</strong>ySQL <strong>P</strong>HP أي ”حزمة لينكس و<a href="https://academy.hsoub.com/devops/servers/web/apache/" rel="">أباتشي</a> و<a href="https://academy.hsoub.com/devops/servers/databases/mysql/" rel="">MySQL</a> و<a href="https://wiki.hsoub.com/PHP" rel="external">PHP</a>“) متكامل على توزيعتك كانت للخواديم أم للأجهزة المكتبية. أجل، بأمر واحد فقط. سهل صحيح؟
</p>

<h2>
	مصادر أخرى للاستزادة
</h2>

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

<ul>
<li>
		<a href="https://www.linux.com" rel="external nofollow">Linux.com</a>: كل ما تحتاج لتعرف لينكس حقّ المعرفة (أخبار ودروس وغيرها).
	</li>
	<li>
		<a href="https://www.howtoforge.com" rel="external nofollow">Howtoforge</a>: دروس عن لينكس.
	</li>
	<li>
		<a href="http://www.tldp.org" rel="external nofollow">مشروع توثيق لينكس</a>: أدلّة تعليميّة وأسئلة شائعة وإجابات ”كيف أستطيع كذا“.
	</li>
	<li>
		<a href="http://www.linux-tutorial.info" rel="external nofollow">قاعدة معلومات لينكس ودروس عنه</a>: دروس وأدلّة عديدة وتدخل في الصميم.
	</li>
	<li>
		<a href="https://lwn.net" rel="external nofollow">LWN.net</a>: أخبار عن نواة لينكس وأكثر.
	</li>
	<li>
		<a href="https://academy.hsoub.com/devops/linux/" rel="">قسم لينكس في الأكاديمية</a>: مقالات متنوعة عن نظام التشغيل لينكس وكيفية تثبيت العديد من الخدمات والتطبيقات.
	</li>
	<li>
		<a href="https://linuxac.org/" rel="external nofollow">مجتمع لينكس العربي</a>
	</li>
	<li>
		<a href="https://itwadi.com/node/2765" rel="external nofollow">كتاب سطر أوامر لينكس</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/files/10-%D8%AF%D9%84%D9%8A%D9%84-%D8%A5%D8%AF%D8%A7%D8%B1%D8%A9-%D8%AE%D9%88%D8%A7%D8%AF%D9%8A%D9%85-%D8%A3%D9%88%D8%A8%D9%86%D8%AA%D9%88/" rel="">كتاب دليل إدارة خوادم أوبنتو</a>
	</li>
	<li>
		<a href="http://ar.debian-handbook.info/" rel="external nofollow">كتاب دفتر مدير ديبيان</a>
	</li>
	<li>
		<a href="https://librebooks.org/gnu-linux-advanced-administration" rel="external nofollow">كتاب الإدارة المتقدمة لجنو/لينكس</a>
	</li>
	<li>
		<a href="https://www.simplyubuntu.com/" rel="external nofollow">كتاب أوبنتو ببساطة</a> (تنويه: إصدار أوبنتو الذي يشرحه الكتاب قديم ولكن يمكن أخذ الفكرة العامة عنه وعن لينكس عمومًا)
	</li>
</ul>
<p>
	ترجمة -وبتصرف- للمقال <a href="https://www.linux.com/what-is-linux" rel="external nofollow">What is linux?‎</a> من موقع <a href="https://www.linux.com/" rel="external nofollow">linux.com</a>
</p>
]]></description><guid isPermaLink="false">451</guid><pubDate>Sun, 24 Nov 2019 18:07:00 +0000</pubDate></item><item><title>&#x623;&#x62A;&#x645;&#x62A;&#x629; &#x625;&#x639;&#x62F;&#x627;&#x62F; &#x62E;&#x627;&#x62F;&#x645; &#x623;&#x648;&#x644;&#x64A; &#x623;&#x648;&#x628;&#x648;&#x646;&#x62A;&#x648; &#x628;&#x625;&#x635;&#x62F;&#x627;&#x631; 18.04</title><link>https://academy.hsoub.com/devops/linux/%D8%A3%D8%AA%D9%85%D8%AA%D8%A9-%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF-%D8%AE%D8%A7%D8%AF%D9%85-%D8%A3%D9%88%D9%84%D9%8A-%D8%A3%D9%88%D8%A8%D9%88%D9%86%D8%AA%D9%88-%D8%A8%D8%A5%D8%B5%D8%AF%D8%A7%D8%B1-1804-r443/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2019_09/5d6e88c96c9cf_.jpg.8c04726b51aed90ca8450cbd15bd0491.jpg" /></p>

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

<p>
	رغم أنه يمكنك <a href="https://academy.hsoub.com/devops/linux/%D8%A7%D9%84%D8%AA%D9%87%D9%8A%D8%A6%D8%A9-%D8%A7%D9%84%D8%A3%D9%88%D9%84%D9%8A%D8%A9-%D9%84%D8%AE%D8%A7%D8%AF%D9%85-%D8%A3%D9%88%D8%A8%D9%88%D9%86%D8%AA%D9%88-1804-r431/" rel="">إكمال هذه الخطوات يدويًا</a>، إلا أنه في بعض الأحيان يكون من الأسهل برمجة العمليات عبر سكربت لتوفير الوقت وتفادي الأخطاء البشرية. يشرح هذا الدليل كيفية أتمتة الخطوات الموجودة في دليل إعداد الخادم الأولي في سكربت.
</p>

<p>
	<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2019_09/5d6e88cd3b35d_.jpg.45ae730e800b3c23071035cea85088e4.jpg" data-fileid="31263" rel=""><img class="ipsImage ipsImage_thumbnailed" data-fileid="31263" data-unique="6crlbslc1" src="https://academy.hsoub.com/uploads/monthly_2019_09/5d6e88cd4ffab_.thumb.jpg.a86b63a90afbee44618f2747d9081541.jpg" alt="أتمة مهمة الإعداد الأولية.jpg"></a>
</p>

<h2 id="-">
	ماذا يفعل السكربت؟
</h2>

<p>
	يعدّ هذا السكربت بديلًا للتشغيل اليدوي من خلال الطريقة الموضحة في <a href="https://academy.hsoub.com/devops/linux/%D8%A7%D9%84%D8%AA%D9%87%D9%8A%D8%A6%D8%A9-%D8%A7%D9%84%D8%A3%D9%88%D9%84%D9%8A%D8%A9-%D9%84%D8%AE%D8%A7%D8%AF%D9%85-%D8%A3%D9%88%D8%A8%D9%88%D9%86%D8%AA%D9%88-1804-r431/" rel="">دليل إعداد خادم أوبونتو 18.04 الأولي</a> و<a href="https://www.digitalocean.com/community/tutorials/how-to-set-up-ssh-keys-on-ubuntu-1804" rel="external nofollow">دليل إعداد مفاتيح <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr> على أوبونتو 18.04</a>.
</p>

<p>
	تؤثر المتغيرات التالية على كيفية عمل السكربت:
</p>

<ul>
<li>
		<code>USERNAME</code>: اسم حساب المستخدم العادي الذي ستُنشأ وتمنح له صلاحيات <code>sudo</code>.
	</li>
	<li>
		<code>COPY_AUTHORIZED_KEYS_FROM_ROOT</code>: تحدّد ما إذا كنت تريد نسخ أصول مفتاح <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr> من الحساب الجذري <code>root</code> إلى حساب <code>sudo</code> الجديد.
	</li>
	<li>
		<code>OTHER_PUBLIC_KEYS_TO_ADD</code>: مجموعة من السلاسل النصية التي تمثل مفاتيح عامة أخرى تُضاف إلى الحساب <code>sudo</code>. يمكن استخدام هذه بالاختيار بين إضافتها أو جعلها بديلًا لنسخ المفاتيح من الحساب الجذري <strong>root</strong>.
	</li>
</ul>
<p>
	يجب عليك تحديث هذه المتغيرات حسب الحاجة قبل تشغيل السكربت. عند تنفيذ السكربت، تُنفّذ الإجراءات التالية:
</p>

<ul>
<li>
		إنشاء حساب مستخدم عادي مع امتيازات <code>sudo</code> باستخدام الاسم الذي يحدده المتغير <code>USERNAME</code> .
	</li>
	<li>
		إعداد إطار لكلمة المرور الأولية للحساب الجديد:
		<ul>
<li>
				إذا كان الخادم معدًّا لمصادقة الهوية بكلمة المرور، فستُنقل كلمة المرور الإدارية الأصلية التي وُلِّدت لحساب <strong>root</strong> إلى حساب <code>sudo</code> الجديد. حينها تكون كلمة المرور للحساب الجذري مقفلة.
			</li>
			<li>
				إذا كان الخادم معدًّا لمصادقة الهوية بمفتاح <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr>، فستُعيّن كلمة مرور فارغة لحساب <code>sudo</code>.
			</li>
		</ul>
</li>
	<li>
		تُعلّم كلمة مرور المستخدم <code>sudo</code> بعلامة "منتهي الصلاحية" مما يوجب تغييرها عند أول تسجيل للدخول.
	</li>
	<li>
		يُنسخ ملف <code>Authorized_keys</code> من الحساب الجذري إلى مستخدم <code>sudo</code> إذا عُيِّن المتغير <code>COPY_AUTHORIZED_KEYS_FROM_ROOT</code> على "صحيح".
	</li>
	<li>
		تُضاف أي مفاتيح معرّفة في <code>OTHER_PUBLIC_KEYS_TO_ADD</code> إلى ملف <code>Authorized_keys</code> للمستخدم <code>sudo</code>.
	</li>
	<li>
		يُعطّل التصديق <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr> المستند إلى كلمة المرور في الحساب الجذري root.
	</li>
	<li>
		يُفعّل جدار الحماية UFW مع السماح باتصالات <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr>.
	</li>
</ul>
<h2 id="-">
	كيف يُستخدَم السكربت؟
</h2>

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

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

<p>
	عند إنشاء Droplet على DigitalOcean، يمكنك تحديد بيانات المستخدم، وهو سكربت يُنفّذ أثناء تشغيل الخادم الأولي من أجل إجراء إعدادٍ إضافي.
</p>

<p>
	إذا كنت تُنشئ Droplet من لوحة التحكم، فيمكنك تحديد خانة الاختيار "بيانات المستخدم" في قسم تحديد خيارات إضافية. سيظهر لك مربع نصي حيث يمكنك لصق السكربت:
</p>

<p>
	<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2019_09/user_data_field.png.9dd09501f4df42f0f5403b884955a72d.png" data-fileid="31264" rel=""><img class="ipsImage ipsImage_thumbnailed" data-fileid="31264" data-unique="i92ab6qf6" src="https://academy.hsoub.com/uploads/monthly_2019_09/user_data_field.thumb.png.ef15cbe28a15f5087cca8c45ff45bfe4.png" alt="user_data_field.png"></a>
</p>

<p>
	إذا كنت تُنشئ Droplet باستخدام واجهة برمجة تطبيقات DigitalOcean، فيمكنك تمرير السكربت باستخدام سمة <code>user_data</code> بدلاً من ذلك.
</p>

<p>
	إذا كنت تُنشئ Droplet باستخدام أداة سطر الأوامر <code>doctl</code>، فيمكنك تمرير السكربت باستخدام خيار ‎--<code>user-data-file</code>:
</p>

<pre class="ipsCode">
$ doctl compute droplet create ... --user-data-<span class="hljs-keyword">file</span> /path/<span class="hljs-keyword">to</span>/script
</pre>

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

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

<h3 id="-">
	تنفيذ السكربت بعد التشغيل
</h3>

<p>
	إذا كنت لا ترغب في استخدام بيانات المستخدم، يمكنك أيضًا تشغيل السكربت يدويًا عبر <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr> بمجرد تشغيل الخادم.
</p>

<p>
	إذا نزّلت السكربت على جهاز الكمبيوتر المحلي الخاص بك، يمكنك تمرير السكربت مباشرةً إلى <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr> بكتابة ما يلي:
</p>

<pre class="ipsCode">
<span class="hljs-variable">$ </span><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">ssh</abbr> root<span class="hljs-variable">@servers_public_IP</span> <span class="hljs-string">"bash -s"</span> -- &lt; <span class="hljs-regexp">/path/to</span><span class="hljs-regexp">/script/file</span>
</pre>

<p>
	ينبغي أن تكون الآن قادرًا على تسجيل الدخول باستخدام حساب <code>sudo</code> الخاص بك من أجل أي إعداد إضافي.
</p>

<p>
	إذا لم تُنزّل السكربت على جهاز الحاسوب المحلي، فابدأ بتسجيل الدخول إلى الحساب root على الخادم الخاص بك:
</p>

<pre class="ipsCode">
<span class="hljs-variable">$ </span><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">ssh</abbr> root<span class="hljs-variable">@servers_public_IP</span>
</pre>

<p>
	بعد ذلك، نزِّل السكربت الأولي على الخادم:
</p>

<pre class="ipsCode">
$ curl -L http<span class="hljs-variable">s:</span>//raw.githubusercontent.<span class="hljs-keyword">com</span>/<span class="hljs-keyword">do</span>-community/automated-setups/master/Ubuntu-<span class="hljs-number">18.04</span>/initial_server_setup.<span class="hljs-keyword">sh</span> -<span class="hljs-keyword">o</span> /tmp/initial_setup.<span class="hljs-keyword">sh</span>
</pre>

<p>
	افحص السكربت للتأكد من تنزيله بشكل صحيح و حدِّث أي متغيرات ترغب في تغييرها:
</p>

<pre class="ipsCode">
$ nano <span class="hljs-regexp">/tmp/i</span>nitial_setup.sh
</pre>

<p>
	عندما تكون راضيًا عن المعطيات، شغّل السكربت يدويًا باستخدام <code>bash</code>:
</p>

<pre class="ipsCode">
$ <span class="hljs-keyword">bash </span>/tmp/initial_setup.sh
</pre>

<p>
	ينبغي أن تكون الآن قادرًا على تسجيل الدخول باستخدام الحساب ذي الصلاحيات <code>sudo</code> لإتمام أي إعدادٍ إضافي.
</p>

<h2 id="-">
	محتويات السكربت
</h2>

<p>
	يمكنك العثور على السكربت لإعداد الخادم الأولي في مخزن <a href="https://github.com/do-community/automated-setups/blob/master/Ubuntu-18.04/initial_server_setup.sh" rel="external nofollow">الإعداد التلقائي</a> لمؤسسة DigitalOcean Community GitHub. لنسخ محتويات السكربت أو تنزيلها مباشرةً، انقر فوق الزر (Raw) أعلى النص، أو انقر <a href="https://raw.githubusercontent.com/do-community/automated-setups/master/Ubuntu-18.04/initial_server_setup.sh" rel="external nofollow">هنا</a> لعرض المحتويات الأولية مباشرة.
</p>

<p>
	لقد أدرجت المحتويات كاملة أيضًا هنا لتسهيل العملية:
</p>

<pre class="ipsCode">
<span class="hljs-meta">#!/bin/bash</span>
<span class="hljs-built_in">set</span> -euo pipefail

<span class="hljs-comment">########################</span>
<span class="hljs-comment">### SCRIPT VARIABLES ###</span>
<span class="hljs-comment">########################</span>
<span class="hljs-comment"># اسم حساب المستخدم العادي الذي ستُنشأ وتمنح له صلاحيات</span>
<span class="hljs-comment"># Name of the user to create and grant sudo privileges</span>
USERNAME=sammy
<span class="hljs-comment"># الجديد sudo إلى حساب root من الحساب الجذري <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr> تحدّد ما إذا كنت تريد نسخ أصول مفتاح </span>
<span class="hljs-comment"># Whether to copy over the root user's `authorized_keys` file to the new sudo</span>
<span class="hljs-comment"># user.</span>
COPY_AUTHORIZED_KEYS_FROM_ROOT=<span class="hljs-literal">true</span>
<span class="hljs-comment"># sudo مجموعة من السلاسل النصية التي تمثل مفاتيح عامة أخرى تُضاف إلى الحساب </span>
<span class="hljs-comment"># Additional public keys to add to the new sudo user</span>
<span class="hljs-comment"># OTHER_PUBLIC_KEYS_TO_ADD=(</span>
<span class="hljs-comment">#     "<abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">ssh</abbr>-rsa AAAAB..."</span>
<span class="hljs-comment">#     "<abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">ssh</abbr>-rsa AAAAB..."</span>
<span class="hljs-comment"># )</span>
OTHER_PUBLIC_KEYS_TO_ADD=(
)

<span class="hljs-comment">####################</span>
<span class="hljs-comment">### SCRIPT LOGIC ###</span>
<span class="hljs-comment">####################</span>

<span class="hljs-comment"># ومنحه الصلاحيات sudo إنشاء حساب المستخدم </span>
<span class="hljs-comment"># Add sudo user and grant privileges</span>
useradd --create-home --shell <span class="hljs-string">"/bin/bash"</span> --groups sudo <span class="hljs-string">"<span class="hljs-variable">${USERNAME}</span>"</span>
<span class="hljs-comment"># تحقق من توفّر الحساب الجذري على كلمة مرور</span>
<span class="hljs-comment"># Check whether the root account has a real password set</span>
encrypted_root_pw=<span class="hljs-string">"<span class="hljs-variable">$(grep root /etc/shadow | cut --delimiter=: --fields=2)</span>"</span>

    <span class="hljs-keyword">if</span> [ <span class="hljs-string">"<span class="hljs-variable">${encrypted_root_pw}</span>"</span> != <span class="hljs-string">"*"</span> ]; <span class="hljs-keyword">then</span>
<span class="hljs-comment"># تُنقل كلمة المرور الإدارية الأصلية التي وُلِّدت لحساب الجذري إلى الحساب الجديد. حينها تُقفل كلمة المرور للحساب الجذري </span>
<span class="hljs-comment"># Transfer auto-generated root password to user if present</span>
<span class="hljs-comment"># and lock the root account to password-based access</span>
<span class="hljs-built_in">echo</span> <span class="hljs-string">"<span class="hljs-variable">${USERNAME}</span>:<span class="hljs-variable">${encrypted_root_pw}</span>"</span> | chpasswd --encrypted
   passwd --lock root
    <span class="hljs-keyword">else</span>
    <span class="hljs-comment"># حذف كلمة مرور غير صالحة للمستخدم في حالة استخدام المفاتيح بحيث يمكن تعيين كلمة مرور جديدة دون تقديم قيمة سابقة</span>
<span class="hljs-comment"># Delete invalid password for user if using keys so that a new password</span>
    <span class="hljs-comment"># can be set without providing a previous value</span>
    passwd --delete <span class="hljs-string">"<span class="hljs-variable">${USERNAME}</span>"</span>
<span class="hljs-keyword">fi</span>
<span class="hljs-comment"># إنهاء صلاحيات المستخدم العادي لإجباره على تغييرها</span>
<span class="hljs-comment"># Expire the sudo user's password immediately to force a change</span>
change --lastday 0 <span class="hljs-string">"<span class="hljs-variable">${USERNAME}</span>"</span>

<span class="hljs-comment"># sudo للمستخدم <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr> إنشاء مجلد </span>
<span class="hljs-comment"># Create <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr> directory for sudo user</span>
home_directory=<span class="hljs-string">"<span class="hljs-variable">$(eval echo ~${USERNAME})</span>"</span>
mkdir --parents <span class="hljs-string">"<span class="hljs-variable">${home_directory}</span>/.<abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">ssh</abbr>"</span>
<span class="hljs-comment"># نسخ ملف المفاتيح من الحساب الجذري إذا كان ضروريًا</span>
<span class="hljs-comment"># Copy `authorized_keys` file from root if requested</span>
<span class="hljs-keyword">if</span> [ <span class="hljs-string">"<span class="hljs-variable">${COPY_AUTHORIZED_KEYS_FROM_ROOT}</span>"</span> = <span class="hljs-literal">true</span> ]; <span class="hljs-keyword">then</span>
    cp /root/.<abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">ssh</abbr>/authorized_keys <span class="hljs-string">"<span class="hljs-variable">${home_directory}</span>/.<abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">ssh</abbr>"</span>
    <span class="hljs-keyword">fi</span>

<span class="hljs-comment"># إضافة المفاتيح الإضافية المتوفرة</span>
<span class="hljs-comment"># Add additional provided public keys</span>
<span class="hljs-keyword">for</span> pub_key <span class="hljs-keyword">in</span> <span class="hljs-string">"<span class="hljs-variable">${OTHER_PUBLIC_KEYS_TO_ADD[@]}</span>"</span>; <span class="hljs-keyword">do</span>
    <span class="hljs-built_in">echo</span> <span class="hljs-string">"<span class="hljs-variable">${pub_key}</span>"</span> &gt;&gt; <span class="hljs-string">"<span class="hljs-variable">${home_directory}</span>/.<abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">ssh</abbr>/authorized_keys"</span>
<span class="hljs-keyword">done</span>
<span class="hljs-comment"># <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr> ضبط تكوينات ملكية وصلاحيات </span>
<span class="hljs-comment"># Adjust <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr> configuration ownership and permissions</span>
chmod 0700 <span class="hljs-string">"<span class="hljs-variable">${home_directory}</span>/.<abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">ssh</abbr>"</span>
chmod 0600 <span class="hljs-string">"<span class="hljs-variable">${home_directory}</span>/.<abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">ssh</abbr>/authorized_keys"</span>
chown --recursive <span class="hljs-string">"<span class="hljs-variable">${USERNAME}</span>"</span>:<span class="hljs-string">"<span class="hljs-variable">${USERNAME}</span>"</span> <span class="hljs-string">"<span class="hljs-variable">${home_directory}</span>/.<abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">ssh</abbr>"</span>
<span class="hljs-comment"># إيقاف تسجيل الدخول للحساب الجذري باستعمال كلمة المرور</span>
<span class="hljs-comment"># Disable root <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr> login with password</span>
sed --in-place <span class="hljs-string">'s/^PermitRootLogin.*/PermitRootLogin prohibit-password/g'</span> /etc/<abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">ssh</abbr>/sshd_config
<span class="hljs-keyword">if</span> sshd -t -q; <span class="hljs-keyword">then</span>
    systemctl restart sshd
<span class="hljs-keyword">fi</span>

<span class="hljs-comment"># <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr> بعد إضافة استثناءات UFW تفعيل جدار الحماية </span>
<span class="hljs-comment"># Add exception for <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr> and then enable UFW firewall</span>
ufw allow OpenSSH
ufw --force <span class="hljs-built_in">enable</span>
</pre>

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

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

<p>
	ترجمة -وبتصرف- للمقال <a href="https://www.digitalocean.com/community/tutorials/automating-initial-server-setup-with-ubuntu-18-04" rel="external nofollow">Automating Initial Server Setup with Ubuntu 18.04</a> لصاحبه Justin Ellingwood
</p>
]]></description><guid isPermaLink="false">443</guid><pubDate>Tue, 03 Sep 2019 15:51:46 +0000</pubDate></item><item><title>&#x643;&#x64A;&#x641;&#x64A;&#x629; &#x62A;&#x62B;&#x628;&#x64A;&#x62A; (&#x62D;&#x632;&#x645;&#x629; LEMP) &#x639;&#x644;&#x649; &#x623;&#x648;&#x628;&#x648;&#x646;&#x62A;&#x648; 18.04</title><link>https://academy.hsoub.com/devops/linux/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%AA%D8%AB%D8%A8%D9%8A%D8%AA-%D8%AD%D8%B2%D9%85%D8%A9-lemp-%D8%B9%D9%84%D9%89-%D8%A3%D9%88%D8%A8%D9%88%D9%86%D8%AA%D9%88-1804-r436/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2019_08/5d46c077a91da_LEMP.jpg.03486ddf670146f406a81fb918c5f27f.jpg" /></p>

<p>
	حزمة LEMP هي مجموعة من البرامج التي يمكن استخدامها لتٌقدّم صفحات الويب الديناميكية وتطبيقات الويب. وهو عبارة عن اختصار يصف نظام تشغيل لينكس مع خادم Nginx (يُنطق "Engine-X"). البيانات الخلفية تكون مخزنة في قاعدة بيانات MySQL وتقوم PHP بالمعالجة الديناميكية.
</p>

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

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

<p>
	قبل البدء، تحتاج لمستخدم عادي غير مسؤول بصلاحيات <code>sudo</code>. يمكنك إعداد ذلك باتباع مقال <a href="https://academy.hsoub.com/devops/linux/%D8%A7%D9%84%D8%AA%D9%87%D9%8A%D8%A6%D8%A9-%D8%A7%D9%84%D8%A3%D9%88%D9%84%D9%8A%D8%A9-%D9%84%D8%AE%D8%A7%D8%AF%D9%85-%D8%A3%D9%88%D8%A8%D9%88%D9%86%D8%AA%D9%88-1804-r431/" rel="">الإعداد الأولي لخادم أوبونتو 18.04</a>.
</p>

<p>
	عندما تنتهي من تجهيز المستخدم، يمكنك بدء الخطوات التالية.
</p>

<p>
	<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2019_08/5d46c07a09a5c_LEMP.jpg.0d1b26efecad5d249633cc9a91ad27f6.jpg" data-fileid="30950" rel=""><img class="ipsImage ipsImage_thumbnailed" data-fileid="30950" data-unique="wno10bga3" src="https://academy.hsoub.com/uploads/monthly_2019_08/5d46c07a1ecb4_LEMP.thumb.jpg.6467a3cac6541f6ffd50695ff8526f05.jpg" alt="كيفية تثبيت حزمة LEMP.jpg"></a>
</p>

<h2 id="-1-nginx">
	خطوة 1 - تثبيت خادم الويب Nginx
</h2>

<p>
	كي نتمكن من عرض صفحات الويب لزوار الموقع، سنثبِّت خادم الويب الحديث والفعال Nginx.
</p>

<p>
	جميع البرامج المستخدمة في هذا المقال متوفرة في مخزن حزم أوبونتو الافتراضي. ما يعني أنه يمكننا استخدام نظام إدارة الحزم <code>apt</code> لإنهاء التثبيتات الهامة.
</p>

<p>
	في أول مرة نَستخدم فيها <code>apt</code> في أي جلسة، نبدأ بتحديث محتوى الحزمة ثم نثبت الخادم:
</p>

<pre class="ipsCode">
<span class="hljs-variable">$ </span>sudo apt update
<span class="hljs-variable">$ </span>sudo apt install nginx
</pre>

<p>
	Nginx مُعد كي يعمل تلقائيا بعد التثبيت على أوبونتو 18.04.
</p>

<p>
	إن كان جدار <a href="https://academy.hsoub.com/devops/security/firewalls/%D9%83%D9%8A%D9%81-%D8%AA%D8%B6%D8%A8%D8%B7-%D8%AC%D8%AF%D8%A7%D8%B1%D8%A7-%D9%86%D8%A7%D8%B1%D9%8A%D8%A7-%D9%81%D9%8A-%D8%A3%D9%88%D8%A8%D9%86%D8%AA%D9%88-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-ufw-r120/" rel="">حماية <code>ufw</code></a> يعمل لديك كما تم الشرح في مقال الإعداد الأولي، فستحتاج للسماح باتصالات Nginx. يُسجل Nginx في <code>ufw</code> تلقائيا خلال التثبيت ما يجعل العملية أسهل.
</p>

<p>
	يُستحسن السماح للمنفذ الذي سيتيح لحركة المرور بالوصول مع أعلى قيود ممكنة. لأننا لم نقم <a href="https://academy.hsoub.com/devops/servers/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%AA%D8%AB%D8%A8%D9%8A%D8%AA-%D8%B4%D9%87%D8%A7%D8%AF%D8%A9-ssl-%D9%85%D9%86-%D8%B3%D9%84%D8%B7%D8%A9-%D8%B4%D9%87%D8%A7%D8%AF%D8%A7%D8%AA-%D8%AA%D8%AC%D8%A7%D8%B1%D9%8A%D8%A9-%D8%A7%D9%84%D8%AD%D8%B5%D9%88%D9%84-%D8%B9%D9%84%D9%89-%D8%A7%D9%84%D8%B4%D9%87%D8%A7%D8%AF%D8%A9-%D9%88%D8%AA%D8%AB%D8%A8%D9%8A%D8%AA%D9%87%D8%A7-r148/" rel="">بإعداد <abbr title="Secure Socket Layer | طبقة المنافذ الآمنة">SSL</abbr></a> بعد، فستحتاج لإتاحة حركة المرور في المنفذ 80 فقط.
</p>

<p>
	لتفعيل ذلك:
</p>

<pre class="ipsCode">
 <span class="hljs-variable">$ </span>sudo ufw allow <span class="hljs-string">'Nginx HTTP'</span>
</pre>

<p>
	للتأكد من التغييرات:
</p>

<pre class="ipsCode">
 <span class="hljs-variable">$ </span>sudo ufw status
</pre>

<p>
	سَتعرض مخرجات هذا الأمر أن حركة المرور خلال HTTP متاحة:
</p>

<p>
	المخرجات:
</p>

<pre class="ipsCode">
<span class="hljs-attribute">Status</span>: active

<span class="lisp">To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
Nginx HTTP                 ALLOW       Anywhere
OpenSSH (<span class="hljs-name">v6</span>)               ALLOW       Anywhere (<span class="hljs-name">v6</span>)
Nginx HTTP (<span class="hljs-name">v6</span>)            ALLOW       Anywhere (<span class="hljs-name">v6</span>)</span>
</pre>

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

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

<pre class="ipsCode">
  $ ip addr <span class="hljs-literal">show</span> eth0 | grep inet | awk <span class="hljs-string">'{ print <span class="hljs-variable">$2</span>; }'</span> | sed <span class="hljs-string">'s/\/.*$//'</span>
</pre>

<p>
	هذا الأمر سيزودك بمجموعة من عناوين بروتوكول الإنترنت، يمكنك تجريبها على متصفحك.
</p>

<p>
	كطريقة بديلة، يمكنك التحقق إن كان عنوان بروتوكول الإنترنت متاح من مكان آخر على الإنترنت:
</p>

<pre class="ipsCode">
 <span class="hljs-variable">$ </span>curl -<span class="hljs-number">4</span> icanhazip.com
</pre>

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

<pre class="ipsCode">
<span class="hljs-symbol">http:</span><span class="hljs-comment">//server_domain_or_IP</span>
</pre>

<p>
	(صورة)
</p>

<p>
	إن رأيت الصفحة التي في الأعلى، فإن Nginx مُثبّت بنجاح.
</p>

<h2 id="-2-mysql-">
	خطوة 2 - تثبيت MySQL لإدارة بيانات الموقع
</h2>

<p>
	الآن وبما أنه أصبح لديك خادم ويب، ستحتاج لِتثبيت MySQL (نظام إدارة قواعد بيانات) وإدارة بيانات الموقع.
</p>

<p>
	ثبّت MySQL باستخدام الأمر:
</p>

<pre class="ipsCode">
 $ sudo apt <span class="hljs-keyword">install</span> mysql-<span class="hljs-keyword">server</span>
</pre>

<p>
	تم تثبيت قاعدة بيانات MySQL لكن إعدادها لم يكتمل بعد.
</p>

<p>
	لتأمين التثبيت، تُرفق MySQL بسكربت يسألك إن كنت تريد تغيير الإعدادات الافتراضية الغير آمنة. لبدء السكربت:
</p>

<pre class="ipsCode">
 <span class="hljs-variable">$ </span>sudo mysql_secure_installation
</pre>

<p>
	سيسألك السكربت إن كنت تريد إعداد <code>VALIDATE PASSWORD PLUGIN</code>.
</p>

<p>
	<strong>تحذير:</strong> يجب أن تفهم هذه الميزة قبل تفعيلها. فعند تفعيل هذه الميزة، سيرفض MySQL أي كلمة مرور لا تطابق معاييره المحددة وسيظهر خطأ. مما يتسبب في بعض المشاكل في حال كنت تستخدم كلمة مرور ضعيفة بالإضافة إلى برنامج يُعِد بيانات مستخدمي MySQL تلقائيا مثل حزمة phpMyAdmin. يُفضل عدم تفعيل هذا الأمر لتفادي مثل هذه الأخطاء. لكن، يُفضَّل أن تستخدم كلمات مرور قوية وفريدة لمستخدمي قواعد البيانات دائما.
</p>

<p>
	أجب <code>Y</code> للتفعيل أو أي حرف آخر للاستمرار بدون تفعيل الإضافة.
</p>

<pre class="ipsCode">
VALIDATE PASSWORD PLUGIN can be used to test passwords
and improve security. It checks the strength of password
and allows the users to <span class="hljs-keyword">set</span> <span class="hljs-keyword">only</span> those passwords which <span class="hljs-keyword">are</span>
secure enough. Would you <span class="hljs-keyword">like</span> <span class="hljs-keyword">to</span> setup <span class="hljs-keyword">VALIDATE</span> <span class="hljs-keyword">PASSWORD</span> <span class="hljs-keyword">plugin</span>?

Press y|Y <span class="hljs-keyword">for</span> Yes, <span class="hljs-keyword">any</span> other <span class="hljs-keyword">key</span> <span class="hljs-keyword">for</span> <span class="hljs-keyword">No</span>:
</pre>

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

<pre class="ipsCode">
There are <span class="hljs-literal">three</span> levels <span class="hljs-keyword">of</span> password validation policy:

LOW    Length &gt;= <span class="hljs-number">8</span>
MEDIUM Length &gt;= <span class="hljs-number">8</span>, <span class="hljs-keyword">numeric</span>, mixed <span class="hljs-keyword">case</span>, <span class="hljs-keyword">and</span> special <span class="hljs-keyword">characters</span>
STRONG Length &gt;= <span class="hljs-number">8</span>, <span class="hljs-keyword">numeric</span>, mixed <span class="hljs-keyword">case</span>, special <span class="hljs-keyword">characters</span> <span class="hljs-keyword">and</span> dictionary                  <span class="hljs-built_in">file</span>

Please enter <span class="hljs-number">0</span> = LOW, <span class="hljs-number">1</span> = MEDIUM <span class="hljs-keyword">and</span> <span class="hljs-number">2</span> = STRONG: <span class="hljs-number">1</span>
</pre>

<p>
	ثم سيُطلب منك إدخال وتأكيد كلمة مرور مستخدم مسؤول:
</p>

<pre class="ipsCode">
Please <span class="hljs-keyword">set</span> the <span class="hljs-keyword">password</span> <span class="hljs-keyword">for</span> root here.

<span class="hljs-keyword">New</span> <span class="hljs-keyword">password</span>:

Re-enter <span class="hljs-keyword">new</span> <span class="hljs-keyword">password</span>:
</pre>

<p>
	لباقي الأسئلة قم بالضغط على <code>Y</code> ثم <code>ENTER</code> في كل شاشة. بهذه الطريقة، سيتم حذف بعض المستخدمين المجهولين، وفحص قاعدة البيانات، وتعطيل تسجيل دخول المستخدمين المسؤولين عن بعد، ويعيد تحميل الإعدادات الجديدة كي يقوم MySQL بتطبيقها مبشرة.
</p>

<p>
	لاحظ أنه في اصدارات MySQL 5.7 وما يليها على أوبونتو يُعد المستخدم المسؤول للمصادقة باستخدام إضافة <code>auth_socket</code> افتراضيا بدلا من التصديق باستخدام كلمة مرور. هذه الميزة توفر أمانًا أكبر وسهولة استخدام في حالات متعددة، لكنها قد تكون معقدة عندما تريد السماح لبرامج خارجية مثل (phpMyAdmin) بالوصول للمستخدم.
</p>

<p>
	إن كان استخدام إضافة <code>auth_socket</code> للوصول إلى MySQL يتناسب مع طبيعة عملك يمكنك الاستمرار بالخطوة 3. لكن إن كنت تفضل استخدام كلمة المرور للاتصال ب MySQL كمستخدم مسؤول فستحتاج لتغيير طريقة مصادقته من <code>auth_socket</code> إلى <code>mysql_native_password</code>. للقيام بذلك، افتح شاشة اوامر MySQL:
</p>

<pre class="ipsCode">
 <span class="hljs-variable">$ </span>sudo mysql
</pre>

<p>
	ثم قم بالتحقق من طريقة المصادقة التي يستخدمها كل حساب من مستخدمي MySQL باستخدام الأمر:
</p>

<pre class="ipsCode">
mysql&gt; SELECT <span class="hljs-keyword">user</span>,authentication_string,plugin,host <span class="hljs-keyword">FROM</span> mysql.<span class="hljs-keyword">user</span>;
</pre>

<p>
	المخرجات:
</p>

<pre class="ipsCode">
+------------------+-------------------------------------------+-----------------------+-----------+
|<span class="hljs-string"> user             </span>|<span class="hljs-string"> authentication_string                     </span>|<span class="hljs-string"> plugin                </span>|<span class="hljs-string"> host      </span>|
+------------------+-------------------------------------------+-----------------------+-----------+
|<span class="hljs-string"> root             </span>|<span class="hljs-string">                                           </span>|<span class="hljs-string"> auth_socket           </span>|<span class="hljs-string"> localhost </span>|
|<span class="hljs-string"> mysql.session    </span>|<span class="hljs-string"> *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE </span>|<span class="hljs-string"> mysql_native_password </span>|<span class="hljs-string"> localhost </span>|
|<span class="hljs-string"> mysql.sys        </span>|<span class="hljs-string"> *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE </span>|<span class="hljs-string"> mysql_native_password </span>|<span class="hljs-string"> localhost </span>|
|<span class="hljs-string"> debian-sys-maint </span>|<span class="hljs-string"> *CC744277A401A7D25BE1CA89AFF17BF607F876FF </span>|<span class="hljs-string"> mysql_native_password </span>|<span class="hljs-string"> localhost </span>|
+------------------+-------------------------------------------+-----------------------+-----------+
4 rows in set (0.00 sec)
</pre>

<p>
	يمكنك ملاحظة أن المستخدم المسؤول يستخدم التصديق بإضافة <code>auth_socket</code>. لإعداد حساب المستخدم المسؤول للمصادقة بكلمة مرور، نفّذ أمر <code>ALTER USER</code> التالي. تأكد من استخدامك كلمة مرور قوية من اختيارك:
</p>

<pre class="ipsCode">
 mysql&gt; ALTER USER <span class="hljs-string">'root'</span>@<span class="hljs-string">'localhost'</span> IDENTIFIED <span class="hljs-keyword">WITH</span> mysql_native_password <span class="hljs-keyword">BY</span> <span class="hljs-string">'password'</span>;
</pre>

<p>
	ثم نفّذ الأمر <code>FLUSH PRIVILEGES</code> والذي سيجعل الخادم يعيد جداوِل الصلاحيات حتى تعمل التغييرات التي أجريتها:
</p>

<pre class="ipsCode">
 mysql&gt; FLUSH PRIVILEGES<span class="hljs-comment">;</span>
</pre>

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

<pre class="ipsCode">
 mysql&gt; SELECT <span class="hljs-keyword">user</span>,authentication_string,plugin,host <span class="hljs-keyword">FROM</span> mysql.<span class="hljs-keyword">user</span>;
</pre>

<p>
	المخرجات:
</p>

<pre class="ipsCode">
+------------------+-------------------------------------------+-----------------------+-----------+
|<span class="hljs-string"> user             </span>|<span class="hljs-string"> authentication_string                     </span>|<span class="hljs-string"> plugin                </span>|<span class="hljs-string"> host      </span>|
+------------------+-------------------------------------------+-----------------------+-----------+
|<span class="hljs-string"> root             </span>|<span class="hljs-string"> *3636DACC8616D997782ADD0839F92C1571D6D78F </span>|<span class="hljs-string"> mysql_native_password </span>|<span class="hljs-string"> localhost </span>|
|<span class="hljs-string"> mysql.session    </span>|<span class="hljs-string"> *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE </span>|<span class="hljs-string"> mysql_native_password </span>|<span class="hljs-string"> localhost </span>|
|<span class="hljs-string"> mysql.sys        </span>|<span class="hljs-string"> *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE </span>|<span class="hljs-string"> mysql_native_password </span>|<span class="hljs-string"> localhost </span>|
|<span class="hljs-string"> debian-sys-maint </span>|<span class="hljs-string"> *CC744277A401A7D25BE1CA89AFF17BF607F876FF </span>|<span class="hljs-string"> mysql_native_password </span>|<span class="hljs-string"> localhost </span>|
+------------------+-------------------------------------------+-----------------------+-----------+
4 rows in set (0.00 sec)
</pre>

<p>
	يمكنك رؤية أن مستخدم MySQL المسؤول أصبح يستخدم المصادقة بكلمة المرور. بعد تأكدك من هذا على الخادم الخاص بك أغلق شاشة اوامر MySQL:
</p>

<pre class="ipsCode">
 mysql&gt; <span class="hljs-keyword">exit</span>
</pre>

<p>
	<strong>ملاحظة: </strong>
</p>

<p>
	بعد تغييرك لطريقة مصادقة المستخدم المسؤول إلى كلمة مرور، فلن تستطيع الوصول إلى MySQL باستخدام الأمر <code>sudo mysql</code> المُستخدم سابقا، بدلا عن ذلك يجب أن تنفذ الأمر التالي:
</p>

<pre class="ipsCode">
 <span class="hljs-variable">$ </span>mysql -u root -p
</pre>

<p>
	بعد ادخال كلمة المرور التي أعددتها قبل قليل، ستُفتح لك شاشة اوامر MySQL.
</p>

<p>
	هكذا يكون نظام قواعد البيانات جاهزًا ويمكنك الانتقال إلى خطوة تثبيت PHP.
</p>

<h2 id="-3-php-nginx-php">
	خطوة 3 - تثبيت PHP وإعداد Nginx لاستخدام معالج PHP
</h2>

<p>
	أصبح لديك الآن Nginx لعرض صفحات الويب، و MySQL لتخزين وإدارة البيانات. لكن ليس لديك شيء يقوم بتوليد صفحات ويب ديناميكية. هنا يأتي دور <a href="http://wiki.hsoub.com/PHP" rel="external">PHP</a>.
</p>

<p>
	لأن Nginx لا يحتوي على وحدة معالجة PHP مثل باقي خوادم الويب، ستحتاج لتثبيت <code>php-fpm</code> والتي تعني "fastCGI process manager". سنجعل Nginx يُمرر طلبات PHP إلى هذا البرنامج للمعالجة.
</p>

<p>
	<strong>ملاحظة:</strong>
</p>

<p>
	اعتمادًا على مزود الخدمة السحابية لديك، قد تحتاج لإضافة مخزن أوبونتو <code>universe</code> الذي يتضمن برامج مجانية ومفتوحة المصدر أنشئت بواسطة مجتمع أوبونتو؛ يمكنك القيام بذلك قبل تثبيت <code>php-fp</code>:
</p>

<pre class="ipsCode">
 $ sudo<span class="hljs-built_in"> add-apt-repository </span>universe
</pre>

<p>
	ثبّت <code>php-fpm</code> مع الحزمة المساعدة <code>php-mysql</code> التي تسمح ل PHP بالتواصل مع قاعدة البيانات. سيجلب التثبيت ملفات PHP الرئيسية:
</p>

<pre class="ipsCode">
 $ sudo apt <span class="hljs-keyword">install</span> php-fpm php-mysql
</pre>

<p>
	الآن أصبح لديك جميع مكونات حزمة LEMP، لكن ما زلت تحتاج لتعديل بعض إعدادت التكوين حتى تجعل Nginx بتعامل مع معالج PHP لعرض المحتوى الديناميكي.
</p>

<p>
	يتم ذلك على مستوى أجزاء الخادم (أجزاء الخادم تشبه مُستضيفوا Apache الوهميون). للقيام بذلك، افتح ملف تكوين جزء خادم جديد في مجلد <code>/etc/nginx/sites-available/</code>. في هذا المثال، سنُسمي ملف جزء السيرفر <code>example.com</code>. يمكنك اختيار الاسم الذي تريده:
</p>

<pre class="ipsCode">
 $ sudo nano <span class="hljs-regexp">/etc/</span>nginx<span class="hljs-regexp">/sites-available/</span>example.com
</pre>

<p>
	ستتمكن بتعديل ملف تكوين جزء خادم جديد بدلا من تعديل الجزء الافتراضي من استعادة الاعدادات الافتراضية في حال احتجتها.
</p>

<p>
	أضف المحتوى التالي المأخوذ من ملف تكوين جزء الخادم الرئيسي مع بعض التعديلات الطفيفة إلى ملف تكوين جزء الخادم الجديد:
</p>

<pre class="ipsCode">
             /etc/nginx/sites-available/example.com
server {
        listen <span class="hljs-number">80</span>;
        root /var/www/html;
        index index.php index.html index.htm index.nginx-debian.html;
        server_name example.com;

        <span class="hljs-keyword">location</span> <span class="hljs-title">/ {
                try_files</span> $uri $uri/ =<span class="hljs-number">404</span>;
        }

        <span class="hljs-keyword">location</span> <span class="hljs-title">~ \.php</span>$ {
                include snippets/fastcgi-php.conf;
                fastcgi_pass unix:/var/run/php/php7.<span class="hljs-number">2</span>-fpm.sock;
        }

        <span class="hljs-keyword">location</span> <span class="hljs-title">~ /\.ht</span> {
                <span class="hljs-keyword">deny</span> all;
        }
}
</pre>

<p>
	هذا ما تقوم به التوجيهات وأجزاء التحديد:
</p>

<ul>
<li>
		<code>listen</code> - تُعرف المنفذ الذي يستمع له Nginx، في هذه الحالة يستمع Nginx إلى المنفذ 80، المنفذ الافتراضي ل HTTP.
	</li>
	<li>
		<code>root</code> - يُعرّف المجلد الرئيسي حيث تُخزن ملفات الموقع.
	</li>
	<li>
		<code>index</code> - يقوم بإعداد Nginx كي يجعل الأولوية لعرض الملفات المسماه <code>index.php</code> - إن كانت متاحة عند طلب ملف index.
	</li>
	<li>
		<code>server_name</code> - تعرّف الجزء الذي يجب أن يُستخدم لطلب ما للخادم. حدد هذه التوجيهة إلى اسم نطاق الخادم أو عنوان بروتوكول الإنترنت للخادم.
	</li>
	<li>
		<code>location /‎</code> - أول جزء تحديد يحتوي توجيهة <code>try_files</code> والتي تتحقق من وجود ملفات تطابق طلب عنوان URI. إن لم يجد Nginx الملف المناسب، يقوم بإرجاع خطأ 404.
	</li>
	<li>
		"<code>location ~ \.php$‎</code>" - جزء التحديد هذا يهتم بالمعالجة الفعلية ل PHP عبر توجيه Nginx إلى ملف تكوين <code>fastcgi-php.conf</code> وملف <code>php7.2-fpm.sock</code> الذي يُعرّف الحزمة المرتبطة ب <code>php-fpm</code>.
	</li>
	<li>
		<code>location ~ /\.ht</code> - آخر جزء تحديد والذي يتعامل مع ملف <code>.htaccess</code> الذي لا يقوم Nginx بمعالجته. بإضافة توجيهة <code>deny all</code> فإن ملفات "<code>‎.htaccess</code>" التي قد تتواجد في المجلد الرئيسي لن تُعرض للزائر.
	</li>
</ul>
<p>
	بعد إضافة هذا المحتوى، احفظ الملف واغلقه. فعّل جزء الخادم الجديد بإنشاء رابط رمزي من ملف تكوين جزء الخادم الجديد في المجلد <code>/etc/nginx/sites-available/</code> إلى المجلد <code>/etc/nginx/sites-enabled/</code>:
</p>

<pre class="ipsCode">
 $ sudo ln -s <span class="hljs-regexp">/etc/</span>nginx<span class="hljs-regexp">/sites-available/</span>example.com <span class="hljs-regexp">/etc/</span>nginx<span class="hljs-regexp">/sites-enabled/</span>
</pre>

<p>
	ثم ألغِ ربط ملف التكوين الرئيسي من مجلد <code>/sites-enabled/</code>:
</p>

<pre class="ipsCode">
 $ sudo unlink <span class="hljs-regexp">/etc/</span>nginx<span class="hljs-regexp">/sites-enabled/</span><span class="hljs-keyword">default</span>
</pre>

<p>
	<strong>ملاحظة:</strong>
</p>

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

<pre class="ipsCode">
 $ sudo ln -s <span class="hljs-regexp">/etc/</span>nginx<span class="hljs-regexp">/sites-available/</span><span class="hljs-keyword">default</span> <span class="hljs-regexp">/etc/</span>nginx<span class="hljs-regexp">/sites-enabled/</span>
</pre>

<p>
	افحص ملف التكوين الجديد من الأخطاء الإملائية :
</p>

<pre class="ipsCode">
 <span class="hljs-variable">$ </span>sudo nginx -t
</pre>

<p>
	إن ظهرت أي أخطاء عد وتحقق من الملف قبل الاستمرار.
</p>

<p>
	عند انتهائك أعد تشغيل Nginx كي تُطبّق التغييرات:
</p>

<pre class="ipsCode">
 <span class="hljs-variable">$ </span>sudo systemctl reload nginx
</pre>

<p>
	وبهذا ننتهي من تثبيت وإعداد حزمة LEMP. لكن ما زلنا لم نتأكد ما إن كانت جميع المكونات تتواصل ببعضها البعض.
</p>

<h2 id="-4-php-">
	خطوة 4 - انشاء ملف PHP للتحقق من الاعدادات
</h2>

<p>
	الآن، يجب أن تكون حزمة LEMP مُعدة بشكل تام. يمكنك اختبار ذلك للتحقق من أن Nginx يعالج ملفات "<code>‎.php</code>" من معالج PHP بطريقة صحيحة.
</p>

<p>
	للقيام بذلك استخدم محرر النصوص لإنشاء ملف PHP تجريبي وسمّه <code>info.php</code> في المجلد الرئيسي.
</p>

<pre class="ipsCode">
 $ sudo nano <span class="hljs-regexp">/var/</span>www<span class="hljs-regexp">/html/i</span>nfo.php
</pre>

<p>
	أدخل الأسطر التالية إلى الملف. هذا الكود هو كود PHP صحيح والذي سيعرض معلومات عن الخادم:
</p>

<ul>
<li>
		الملف ‎/var/www/html/info.php:
	</li>
</ul>
<pre class="ipsCode prettyprint lang-php prettyprinted" id="ips_uid_7322_7" style="">
<span class="pun">&lt;?</span><span class="pln">php
phpinfo</span><span class="pun">();</span></pre>

<p>
	عند انتهائك احفظ الملف واغلقه.
</p>

<p>
	يمكن الآن زيارة هذه الصفحة من متصفحك بزيارة اسم نطاق الخادم أو عنوان بروتوكول الإنترنت العام للخادم متبوعا ب <code>/info.php</code>:
</p>

<pre class="ipsCode">
<span class="hljs-symbol">http:</span><span class="hljs-comment">//your_server_domain_or_IP/info.php</span>
</pre>

<p>
	يجب أن ترى صفحة ويب تم توليدها باستخدام PHP تحتوي معلومات الخادم:
</p>

<p>
	(صورة)
</p>

<p>
	إن رأيت صفحة تشبه الصورة السابقة، فإن إعدادك لمعالج PHP مع Nginx صحيح.
</p>

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

<p>
	قم بحذف الملف:
</p>

<pre class="ipsCode">
 $ sudo rm <span class="hljs-regexp">/var/</span>www<span class="hljs-regexp">/html/i</span>nfo.php
</pre>

<p>
	وبهذا تكون قد أعددت وشغّلت حزمة LEMP على خادم أوبونتو 18.04.
</p>

<h2 id="-">
	الخلاصة
</h2>

<p>
	تعد حزمة LEMP هيكل قوي يمكنك من بناء وتشغيل أي موقع أو تطبيق ويب تقريبا من الخادم الخاص بك.
</p>

<p>
	يوجد العديد من الخطوات التي يمكنك القيام بها بعد هذه الخطوة. مثلا، يجب أن تتأكد من أن الاتصالات إلى الخادم آمنة. ختاما، يمكنك ت<a href="https://www.digitalocean.com/community/tutorials/how-to-secure-nginx-with-let-s-encrypt-on-ubuntu-18-04" rel="external nofollow">أمين تثبيت Nginx باستخدام تشفير Let's</a>. باتباع هذا المقال، سوف تحصل على شهادة <code><abbr title="Transport Layer Security | بروتوكول أمن طبقة النقل">TLS</abbr>/<abbr title="Secure Socket Layer | طبقة المنافذ الآمنة">SSL</abbr></code> للخادم الخاص بك كي يخدم المحتوى عبر HTTPS.
</p>

<p>
	ترجمة -وبتصرف- للمقال <a href="https://www.digitalocean.com/community/tutorials/how-to-install-linux-nginx-mysql-php-lemp-stack-ubuntu-18-04" rel="external nofollow">How To Install Linux, Nginx, MySQL, PHP (LEMP stack) on Ubuntu 18.04</a> لأصحابه الكتاب Mark Drake و Justin Ellingwood.
</p>
]]></description><guid isPermaLink="false">436</guid><pubDate>Sun, 04 Aug 2019 11:25:10 +0000</pubDate></item><item><title>&#x643;&#x64A;&#x641;&#x64A;&#x629; &#x62A;&#x62B;&#x628;&#x64A;&#x62A; Redis &#x648;&#x62A;&#x623;&#x645;&#x64A;&#x646;&#x647; &#x639;&#x644;&#x649; &#x623;&#x648;&#x628;&#x648;&#x646;&#x62A;&#x648; 18.04</title><link>https://academy.hsoub.com/devops/linux/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%AA%D8%AB%D8%A8%D9%8A%D8%AA-redis-%D9%88%D8%AA%D8%A3%D9%85%D9%8A%D9%86%D9%87-%D8%B9%D9%84%D9%89-%D8%A3%D9%88%D8%A8%D9%88%D9%86%D8%AA%D9%88-1804-r432/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2019_07/5d3db1fc72d0e_Redis.jpg.9c93d470fd6f1518eafafa843ecbe431.jpg" /></p>

<p>
	<a href="https://redis.io/" rel="external nofollow">Redis</a> عبارة عن مخزن يعتمد على مفتاح وقيمته ويُعرف بمرونته، وأدائه، ودعمه العديد من اللغات. يوضح هذا المقال كيفية تثبيت وإعداد وتأمين Redis على خادم أوبونتو 18.04.
</p>

<p>
	<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2019_07/5d3db2004f63a_Redis.jpg.be7b7128121ac4a91184f17b89065cfa.jpg" data-fileid="30851" rel=""><img class="ipsImage ipsImage_thumbnailed" data-fileid="30851" data-unique="co1lnynwr" src="https://academy.hsoub.com/uploads/monthly_2019_07/5d3db2006a85f_Redis.thumb.jpg.4200cddab67baefbef97e4e0cfe873b4.jpg" alt="كيفية تثبيت Redis.jpg"></a>
</p>

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

<p>
	ستحتاج إلى الدخول إلى خادم أوبونتو 18.04 والذي لا يملك صلاحيات مستخدم مسؤول ويملك صلاحيات <code>sudo</code>. بالإضافة إلى جدار حماية معد. يمكنك إعداد ذلك من خلال مقال <a href="https://academy.hsoub.com/devops/linux/%D8%A7%D9%84%D8%AA%D9%87%D9%8A%D8%A6%D8%A9-%D8%A7%D9%84%D8%A3%D9%88%D9%84%D9%8A%D8%A9-%D9%84%D8%AE%D8%A7%D8%AF%D9%85-%D8%A3%D9%88%D8%A8%D9%88%D9%86%D8%AA%D9%88-1804-r431/" rel="">التهيئة الأولية لِخادم أوبونتو</a>.
</p>

<p>
	للبدء سجل دخولك إلى خادم أوبونتو 18.04 باستخدام مستخدم <code>sudo</code> وليس مستخدم مسؤول.
</p>

<h2 id="-1-redis">
	خطوة 1 - تثبيت وإعداد Redis
</h2>

<p>
	للحصول على أحدث إصدار من Redis، سنستخدم الأمر <code>apt</code> لتثبيته من متجر أوبونتو الرسمي.
</p>

<p>
	حدِّث ذاكرة التخزين المؤقتة لحزمة <code>apt</code> وثبت Redis باستخدام الأمرين التاليين:
</p>

<pre class="ipsCode">
<span class="hljs-variable">$ </span>sudo apt update
</pre>

<pre class="ipsCode">
$ sudo apt <span class="hljs-keyword">install</span> redis-<span class="hljs-keyword">server</span>
</pre>

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

<pre class="ipsCode">
$ sudo nano <span class="hljs-regexp">/etc/</span>redis<span class="hljs-regexp">/redis.conf</span>
</pre>

<p>
	ابحث عن <code>supervised</code> في الملف. تتيح لك هذه التعليمة تعريف <code>init</code> في النظام لإضافة Redis كخدمة، مما يتيح لك تحكمًا أفضل بعملياته. تعليمة <code>supervised</code> تكون معطلة <code>no</code> بشكل افتراضي. غيِّر قيمة <code>no</code> إلى <code>systemd</code>؛ ذلك لأنك تستخدم أوبونتو المعتمد على نظام "systemd init".
</p>

<ul>
<li>
		الملف ‎/etc/redis/redis.conf:
	</li>
</ul>
<pre class="ipsCode" id="ips_uid_9072_17">
. . .

# If you run Redis from upstart or systemd, Redis can interact with your
# supervision tree. Options:
#   supervised no      - no supervision interaction
#   supervised upstart - signal upstart by putting Redis into SIGSTOP mode
#   supervised systemd - signal systemd by writing READY=1 to $NOTIFY_SOCKET
#   supervised auto    - detect upstart or systemd method based on
#                        UPSTART_JOB or NOTIFY_SOCKET environment variables
# Note: these supervision methods only signal "process is ready."
#       They do not enable continuous liveness pings back to your supervisor.
supervised systemd

. . .
</pre>

<p>
	حتى الآن هذا هو التعديل الوحيد الذي نحتاج القيام به في ملف إعداد Redis. احفظ الملف واغلقه بعد تعديله. ثم أعد تشغيل خدمة Redis لتصبح التغييرات التي أجريتها على الملف سارية المفعول.
</p>

<pre class="ipsCode">
<span class="hljs-variable">$ </span>sudo systemctl restart redis.service
</pre>

<p>
	وبهذا تكون قد أعددت Redis، لكن قبل استخدامة يجب التأكد من أنه يعمل بالطريقة الصحيحة.
</p>

<h2 id="-2-redis">
	خطوة 2 - اختبار Redis
</h2>

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

<p>
	نبدأ بالتأكد من أن خدمة Redis تعمل:
</p>

<pre class="ipsCode">
<span class="hljs-variable">$ </span>sudo systemctl status redis
</pre>

<p>
	ستظهر مخرجات مشابهة لما يلي في حال كان Redis يعمل بدون أي أخطاء:
</p>

<p>
	المخرجات:
</p>

<pre class="ipsCode">
● redis-server.service - Advanced key-value store
<span class="hljs-symbol">   Loaded:</span> loaded (<span class="hljs-meta-keyword">/lib/</span>systemd<span class="hljs-meta-keyword">/system/</span>redis-server.service; enabled; vendor preset: enabled)
<span class="hljs-symbol">   Active:</span> active (running) since Wed <span class="hljs-number">2018</span><span class="hljs-number">-06</span><span class="hljs-number">-27</span> <span class="hljs-number">18</span>:<span class="hljs-number">48</span>:<span class="hljs-number">52</span> UTC; <span class="hljs-number">12</span>s ago
<span class="hljs-symbol">     Docs:</span> http:<span class="hljs-comment">//redis.io/documentation,</span>
<span class="hljs-symbol">           man:</span>redis-server(<span class="hljs-number">1</span>)
<span class="hljs-symbol">  Process:</span> <span class="hljs-number">2421</span> ExecStop=<span class="hljs-meta-keyword">/bin/</span>kill -s TERM $MAINPID (code=exited, status=<span class="hljs-number">0</span>/SUCCESS)
<span class="hljs-symbol">  Process:</span> <span class="hljs-number">2424</span> ExecStart=<span class="hljs-meta-keyword">/usr/</span>bin/redis-server <span class="hljs-meta-keyword">/etc/</span>redis/redis.conf (code=exited, status=<span class="hljs-number">0</span>/SUCCESS)
 Main <abbr title="Process IDentifier | معرّف العملية أو البرنامج">PID</abbr>: <span class="hljs-number">2445</span> (redis-server)
<span class="hljs-symbol">    Tasks:</span> <span class="hljs-number">4</span> (limit: <span class="hljs-number">4704</span>)
<span class="hljs-symbol">   CGroup:</span> /system.slice/redis-server.service
           └─<span class="hljs-number">2445</span> <span class="hljs-meta-keyword">/usr/</span>bin/redis-server <span class="hljs-number">127.0</span><span class="hljs-number">.0</span><span class="hljs-number">.1</span>:<span class="hljs-number">6379</span>
. . .
</pre>

<p>
	يمكنك رؤية أن Redis مُفعَّل وقيد التشغيل، ما يعني أنه معد كي يبدأ التشغيل مع بدء تشغيل الخادم.
</p>

<p>
	<strong>ملاحظة: </strong> هذا الإعداد مستحسن في أغلب حالات استخدام Redis. إن كنت تفضل تشغيل Redis يدويا في كل مرة تحتاج إليه. يمكنك القيام بذلك باستخدام الأمر:
</p>

<pre class="ipsCode">
 $ sudo systemctl <span class="hljs-built_in">disable</span> redis
</pre>

<p>
	لاختبار صحة أداء Redis، اتصل بالخادم باستخدام سطر أوامر العميل:
</p>

<pre class="ipsCode">
 $ redis-<span class="hljs-keyword">cli</span>
</pre>

<p>
	في الشاشة التالية، اختبر الاتصال باستخدام أمر ping:
</p>

<pre class="ipsCode">
 127<span class="hljs-selector-class">.0</span><span class="hljs-selector-class">.0</span><span class="hljs-selector-class">.1</span><span class="hljs-selector-pseudo">:6379</span>&gt; <span class="hljs-selector-tag">ping</span>
</pre>

<p>
	المخرجات:
</p>

<pre class="ipsCode">
<span class="hljs-attribute">PONG</span>
</pre>

<p>
	تأكد هذه المخرجات أن اتصال الخادم مفعل. بعد ذلك، تأكد من إمكانية إعداد المفاتيح باستخدام الأمر:
</p>

<pre class="ipsCode">
 <span class="hljs-number">127.0</span><span class="hljs-meta">.0</span><span class="hljs-meta">.1</span>:<span class="hljs-number">6379</span>&gt; set <span class="hljs-keyword">test</span> <span class="hljs-string">"It's working!"</span>
</pre>

<p>
	المخرجات:
</p>

<pre class="ipsCode">
<span class="hljs-attribute">OK</span>
</pre>

<p>
	استرجِع القيمة باستخدام الأمر:
</p>

<pre class="ipsCode">
 127<span class="hljs-selector-class">.0</span><span class="hljs-selector-class">.0</span><span class="hljs-selector-class">.1</span><span class="hljs-selector-pseudo">:6379</span>&gt; <span class="hljs-selector-tag">get</span> <span class="hljs-selector-tag">test</span>
</pre>

<p>
	ستتمكن من استرجاع القيمة التي أدخلتها في حال كان كل شيء يعمل بشكل صحيح:
</p>

<p>
	المخرجات:
</p>

<pre class="ipsCode">
<span class="hljs-string">"It's working!"</span>
</pre>

<p>
	بعد تأكدك من إمكانية استرجاع القيمة، أغلق شاشة تنفيذ أوامر Redis:
</p>

<pre class="ipsCode">
 <span class="hljs-number">127.0</span>.<span class="hljs-number">0.1</span>:<span class="hljs-number">6379</span>&gt; <span class="hljs-keyword">exit</span>
</pre>

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

<pre class="ipsCode">
<span class="hljs-variable">$ </span>sudo systemctl restart redis
</pre>

<p>
	اتصل بشاشة أوامر عميل Redis مرة أخرى وتأكد من بقاء القيمة التي خزنتها:
</p>

<pre class="ipsCode">
$ redis-<span class="hljs-keyword">cli</span>
 <span class="hljs-number">127.0</span><span class="hljs-meta">.0</span><span class="hljs-meta">.1</span>:<span class="hljs-number">6379</span>&gt; get <span class="hljs-keyword">test</span>
</pre>

<p>
	يجب أن تظل القيمة المخزنة متاحة:
</p>

<p>
	المخرجات:
</p>

<pre class="ipsCode">
<span class="hljs-string">"It's working!"</span>
</pre>

<p>
	أخرج مجددَا بعد انتهائك:
</p>

<pre class="ipsCode">
 <span class="hljs-number">127.0</span>.<span class="hljs-number">0.1</span>:<span class="hljs-number">6379</span>&gt; <span class="hljs-keyword">exit</span>
</pre>

<p>
	وبذلك، يكون Redis مثبتَا ويعمل بشكل صحيح وجاهز للاستخدام. بالرغم من ذلك، ما تزال بعض إعداداته الافتراضية غير آمنة وتوفر بعض الفرص للأشخاص المخترقون للهجوم على الخادم وبياناته. تشرح باقي الخطوات في هذا المقال بعض الطرق لتقليل هذه الثغرات الأمنية كما <a href="https://redis.io/" rel="external nofollow">ذكر في موقع Redis الرسمي</a>. هذه الخطوات اختيارية وسيستمر Redis بالعمل حتى لو لم تنفذها، لكن يفضل أن تكمل هذه الخطوات لتقوية أمن نظامك.
</p>

<h2 id="-3-localhost-">
	خطوة 3 - الربط مع المضيف المحلي (localhost)
</h2>

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

<p>
	لتصحيح الأمر، افتح ملف تكوين Redis لتعديله:
</p>

<pre class="ipsCode">
sudo nano <span class="hljs-regexp">/etc/</span>redis<span class="hljs-regexp">/redis.conf</span>
</pre>

<p>
	إذهب إلى السطر التالي وتأكد من إلغاء تعليقه (احذِف # إن وجدت):
</p>

<ul>
<li>
		الملف /etc/redis/redis.conf:
	</li>
</ul>
<pre class="ipsCode">
<span class="hljs-selector-tag">bind</span> 127<span class="hljs-selector-class">.0</span><span class="hljs-selector-class">.0</span><span class="hljs-selector-class">.1</span> <span class="hljs-selector-pseudo">::1</span>
</pre>

<p>
	احفظ الملف واغلقه عند الانتهاء (اضغط على <code>CTRL + X</code>, <code>Y</code>, ثم <code>ENTER</code>). أعد تشغيل الخدمة للتأكد من قراءة النظام للتغييرات:
</p>

<pre class="ipsCode">
<span class="hljs-variable">$ </span>sudo systemctl restart redis
</pre>

<p>
	للتأكد من تأثير هذه التغييرات، نفِّذ أمر <code>netstat</code> التالي:
</p>

<pre class="ipsCode">
$ sudo netstat -lnp <span class="hljs-string">| grep redis</span>
</pre>

<p>
	المخرجات:
</p>

<pre class="ipsCode">
tcp       <span class="hljs-number"> 0 </span>    <span class="hljs-number"> 0 </span>127.0.0.1:6379          0.0.0.0:*               LISTEN      14222/redis-server
tcp       <span class="hljs-number"> 0 </span>    <span class="hljs-number"> 0 </span>::1:6379                :::*                    LISTEN      14222/redis-server
</pre>

<p>
	توضح هذه المخرجات أن برنامج خادم Redis مرتبط بالمضيف المحلي (127.0.0.1). مما يدل على انعكاس التغيير الذي أجريته على ملف التكوين. إن رأيت عنوان بروتوكول إنترنت آخر (مثل 0.0.0.0) فتأكد من إلغاء تعليق السطر المطلوب وأعد تشغيل خدمة Redis مجددَا.
</p>

<p>
	الآن وبعد أن أصبح Redis مربوطا بالمضيف المحلي فقط سيصبح من الصعب على جهات الاختراق تقديم الطلبات أو الوصول إلى الخادم. مع ذلك لا يزال Redis غير معد لِطلب المصادقة من المستخدمين قبل القيام بأي تغيير على إعداداته أو البيانات التي يحتفظ بها. لمعالجة هذا، يتيح لك Redis طلب تأكيد هوية من المستخدمين باستخدام كلمة مرور قبل إحداث ي تغيير وذلك باستخدام الأمر (<code>redis-cli</code>).
</p>

<h2 id="-4-redis">
	خطوة 4 - إعداد كلمة مرور Redis
</h2>

<p>
	يتيح لك إعداد كلمة مرور Redis تفعيل إحدى ميزات الحماية المدمجة فيه — الأمر <code>auth</code> يطلب من المستخدمين إثبات الهوية للوصول إلى قاعدة البيانات. يتم تكوين كلمة المرور مباشرة في ملف تكوين Redis "<code>/etc/redis/redis.conf</code>", لذلك؛ افتح الملف مجددا باستخدام محرِّرك المفضل:
</p>

<pre class="ipsCode">
$ sudo nano <span class="hljs-regexp">/etc/</span>redis<span class="hljs-regexp">/redis.conf</span>
</pre>

<p>
	انتقل إلى جزء "<code>SECURITY</code>" وابحث عن السطر التالي:
</p>

<ul>
<li>
		الملف ‎/etc/redis/redis.conf:
	</li>
</ul>
<pre class="ipsCode">
 <span class="hljs-meta"># requirepass foobared</span>
</pre>

<p>
	ألغِ تعليق هذا السطر بِإزالة "<code>#</code>" وغير "<code>foobared</code>" إلى كلمة مرور أكثر أمانًا.
</p>

<p>
	<strong>ملاحظة:</strong> يوجد تحذير معلق فوق الموجه "<code>requirepass</code>" في ملف "<code>redis.conf</code>":
</p>

<pre class="ipsCode">
<span class="hljs-comment"># Warning: since Redis is pretty fast an outside user can try up to</span>
<span class="hljs-comment"># 150k passwords per second against a good box. This means that you should</span>
<span class="hljs-comment"># use a very strong password otherwise it will be very easy to break.</span>
<span class="hljs-comment">#</span>
</pre>

<p>
	لذلك، من المهم تحديد كلمة مرور طويلة. يمكنك استخدام الأمر "<code>openssl</code>" ِلتوليد كلمة مرور تلقائيا بدلا من القيام بذلك يدويا كما في المثال التالي. وذلك بتمرير مخرجات الأمر الأول إلى أمر "<code>openssl</code>" الثاني. سيزيل الأمر أي أسطر فارغة تم توليدها من الأمر الأول:
</p>

<pre class="ipsCode">
$ openssl rand <span class="hljs-number">60</span> <span class="hljs-string">| openssl base64 -A</span>
</pre>

<p>
	ستكون المخرجات مشابهة لما يلي:
</p>

<pre class="ipsCode">
RBOJ<span class="hljs-number">9</span>cC<span class="hljs-symbol">NoGCKhlEBwQLHri1</span>g+atWg<span class="hljs-symbol">n4</span>X<span class="hljs-symbol">n4</span>Hw<span class="hljs-symbol">NUbtzoVxAYxkiYBi7</span>aufl<span class="hljs-number">4</span>MILv<span class="hljs-number">1</span><span class="hljs-symbol">nxBqR4</span>L<span class="hljs-number">6</span><span class="hljs-symbol">NNzI0</span>X<span class="hljs-number">6</span>cE
</pre>

<p>
	بعد نسخ ولصق المخرجات لتكون هي القيمة الجديدة ل "<code>requirepass</code>":
</p>

<pre class="ipsCode">
<span class="hljs-regexp">/etc/</span>redis<span class="hljs-regexp">/redis.conf</span>
</pre>

<pre class="ipsCode">
requirepass RBOJ<span class="hljs-number">9</span>cC<span class="hljs-symbol">NoGCKhlEBwQLHri1</span>g+atWg<span class="hljs-symbol">n4</span>X<span class="hljs-symbol">n4</span>Hw<span class="hljs-symbol">NUbtzoVxAYxkiYBi7</span>aufl<span class="hljs-number">4</span>MILv<span class="hljs-number">1</span><span class="hljs-symbol">nxBqR4</span>L<span class="hljs-number">6</span><span class="hljs-symbol">NNzI0</span>X<span class="hljs-number">6</span>cE
</pre>

<p>
	بعد إضافة كلمة المرور، احفظ وأغلق الملف ثم أعد تشغيل Redis:
</p>

<pre class="ipsCode">
<span class="hljs-variable">$ </span>sudo systemctl restart redis.service
</pre>

<p>
	لِاختبار من عمل كلمة المرور، أدخل إلى سطر أوامر Redis:
</p>

<pre class="ipsCode">
$ redis-<span class="hljs-keyword">cli</span>
</pre>

<p>
	الأوامر التالية تستخدم لاختبار ما إن كانت كلمة المرور تعمل أم لا. يحاول الأمر الأول إضافة مفتاح إلى قيمة قبل المصادقة:
</p>

<pre class="ipsCode">
 127<span class="hljs-selector-class">.0</span><span class="hljs-selector-class">.0</span><span class="hljs-selector-class">.1</span><span class="hljs-selector-pseudo">:6379</span>&gt; <span class="hljs-selector-tag">set</span> <span class="hljs-selector-tag">key1</span> 10
</pre>

<p>
	لن يتنفذ الأمر لعدم المصادقة وسيرجع Redis خطأ:
</p>

<p>
	المخرجات:
</p>

<pre class="ipsCode">
(<span class="hljs-keyword">error</span>) NOAUTH Authentication required.
</pre>

<p>
	يقوم الأمر التالي بالمصادقة باستخدام كلمة المرور المحددة في ملف التكوين:
</p>

<pre class="ipsCode">
 127<span class="hljs-selector-class">.0</span><span class="hljs-selector-class">.0</span><span class="hljs-selector-class">.1</span><span class="hljs-selector-pseudo">:6379</span>&gt; <span class="hljs-selector-tag">auth</span> <span class="hljs-selector-tag">your_redis_password</span>
</pre>

<p>
	يُأكد Redis المصادقة:
</p>

<p>
	المخرجات:
</p>

<pre class="ipsCode">
<span class="hljs-attribute">ok</span>
</pre>

<p>
	بعد ذلك، سينجح الأمر السابق:
</p>

<pre class="ipsCode">
 127<span class="hljs-selector-class">.0</span><span class="hljs-selector-class">.0</span><span class="hljs-selector-class">.1</span><span class="hljs-selector-pseudo">:6379</span>&gt; <span class="hljs-selector-tag">set</span> <span class="hljs-selector-tag">key1</span> 10
</pre>

<p>
	المخرجات:
</p>

<pre class="ipsCode">
<span class="hljs-attribute">ok</span>
</pre>

<p>
	الأمر "<code>get key1</code>" يطلب من Redis قيمة المفتاح الجديدة.
</p>

<pre class="ipsCode">
 127<span class="hljs-selector-class">.0</span><span class="hljs-selector-class">.0</span><span class="hljs-selector-class">.1</span><span class="hljs-selector-pseudo">:6379</span>&gt; <span class="hljs-selector-tag">get</span> <span class="hljs-selector-tag">key1</span>
</pre>

<p>
	المخرجات:
</p>

<pre class="ipsCode">
<span class="hljs-attribute">ok</span>
</pre>

<p>
	يمكنك إغلاق "<code>redis-cli</code>" بعد تأكدك من أنه يمكنك تنفيذ أوامر عميل Redis:
</p>

<pre class="ipsCode">
 127<span class="hljs-selector-class">.0</span><span class="hljs-selector-class">.0</span><span class="hljs-selector-class">.1</span><span class="hljs-selector-pseudo">:6379</span>&gt; <span class="hljs-selector-tag">quit</span>
</pre>

<p>
	لاحقا، ستتعلم كيفية إعادة تسمية أوامر Redis والتي إن تم إدخالها بالخطأ أو من خلال جهة غير مُخَوًّلًة سيسبب الكثير من الأضرار لجهازك.
</p>

<h2 id="-5-">
	خطوة 5 - إعادة تسمية الأوامر المهمة
</h2>

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

<p>
	يمكن أن تستخدم بعض هذه الأوامر بواسطة مستخدمون غير مخولين بالدخول لإعادة إعداد، أو تدمير أو حذف بياناتك. سيتم إعادة تسمية الأوامر بنفس الجزء الذي تم تعديل كلمة المرور منه "<code>SECURITY</code>" من ملف "<code>/etc/redis/redis.conf</code>"
</p>

<p>
	بعض الأوامر المهمة والتي قد تكون ذات خطورة هي:
</p>

<pre class="ipsCode">
FLUSHDB
FLUSHALL
 KEYS
 PEXPIRE
 DEL
<span class="hljs-built_in">CONFIG</span>
 <span class="hljs-keyword">SHUTDOWN
</span><span class="hljs-keyword">BGREWRITEAOF
</span> <span class="hljs-keyword">BGSAVE
</span>SAVE
SPOP
SREM
RENAME
<span class="hljs-built_in">DEBUG</span>
</pre>

<p>
	هذه القائمة ليست شاملة، لكن إعادة تسمية أو تعطيل هذه القائمة يعتبر بداية جيدة لتعزيز أمان خادم Redis.
</p>

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

<p>
	افتح ملف تكوين Redis لتفعيل أو تعطيل أي أمر:
</p>

<pre class="ipsCode">
$ sudo nano  <span class="hljs-regexp">/etc/</span>redis<span class="hljs-regexp">/redis.conf</span>
</pre>

<p>
	<strong>تحذير</strong>: توضح الخطوات التالية كيفية تعطيل أو إعادة تسمية كأمثلة. يجب أن تختار تعطيل أو إعادة تسمية الأوامر التي تريدها فقط. يمكنك مراجعة قائمة الأوامر كاملة ومعرفة كيف يمكن أن تستخدم بطريقة ضارة على <a href="http://redis.io/commands" rel="external nofollow">redis.io/commands</a>.
</p>

<p>
	لِتعطيل أمر ما، أعد تسميته إلى نص فارغ (يشار إلى النص الفارغ بِعلامتي تنصيص "") كما في الأسفل:
</p>

<ul>
<li>
		الملف ‎/etc/redis/redis.conf:
	</li>
</ul>
<pre class="ipsCode">
. . .
 <span class="hljs-comment"># It is also possible to completely kill a command by renaming it into</span>
 <span class="hljs-comment"># an empty string:</span>
 <span class="hljs-comment">#</span>
 <span class="hljs-built_in">rename</span>-<span class="hljs-keyword">command</span> <span class="hljs-title">FLUSHDB</span> <span class="hljs-string">""</span>
<span class="hljs-built_in">rename</span>-<span class="hljs-keyword">command</span> <span class="hljs-title">FLUSHALL</span> <span class="hljs-string">""</span>
<span class="hljs-built_in">rename</span>-<span class="hljs-keyword">command</span> <span class="hljs-title">DEBUG</span> <span class="hljs-string">""</span>
. . .
</pre>

<p>
	لإعادة تسمية أمر ما، اعطه اسما آخر كما في المثال بالأسفل. يجب أن تكون الأسماء صعبة التخمين للآخرين ولكن سهلة بالنسبة لك كي تتذكرها لاحقًا:
</p>

<ul>
<li>
		الملف ‎/etc/redis/redis.conf:
	</li>
</ul>
<pre class="ipsCode">
. . .
<span class="hljs-comment"># rename-command CONFIG ""</span>
<span class="hljs-built_in">rename</span>-<span class="hljs-keyword">command</span> <span class="hljs-title">SHUTDOWN</span> <span class="hljs-title">SHUTDOWN_MENOT</span>
<span class="hljs-built_in">rename</span>-<span class="hljs-keyword">command</span> <span class="hljs-title">CONFIG</span> <span class="hljs-title">ASC12_CONFIG</span>
. . .
</pre>

<p>
	احفظ التغييرات وأغلق الملف. أعد تشغيل Redis بعد إعادة تسمية الأمر لتطبيق التغييرات:
</p>

<pre class="ipsCode">
<span class="hljs-variable">$ </span>sudo systemctl restart redis.service
</pre>

<p>
	أدخل إلى سطر أوامر Redis لاختبار الأمر الجديد:
</p>

<pre class="ipsCode">
$ redis-<span class="hljs-keyword">cli</span>
</pre>

<p>
	قم بالمصادقة:
</p>

<pre class="ipsCode">
 127<span class="hljs-selector-class">.0</span><span class="hljs-selector-class">.0</span><span class="hljs-selector-class">.1</span><span class="hljs-selector-pseudo">:6379</span>&gt; <span class="hljs-selector-tag">auth</span> <span class="hljs-selector-tag">your_redis_password</span>
</pre>

<p>
	المخرجات:
</p>

<pre class="ipsCode">
<span class="hljs-attribute">OK</span>
</pre>

<p>
	لنفترض أنك أعدت تسمية الأمر "<code>CONFIG</code>" إلى "<code>ASC12_CONFIG</code>" كما في المثال السابق. أولا حاول استخدام الأمر الأصلي "<code>CONFIG</code>". يجب أن يفشل تنفيذ الأمر لأنك أعدت تسميته:
</p>

<pre class="ipsCode">
 127<span class="hljs-selector-class">.0</span><span class="hljs-selector-class">.0</span><span class="hljs-selector-class">.1</span><span class="hljs-selector-pseudo">:6379</span>&gt; <span class="hljs-selector-tag">config</span> <span class="hljs-selector-tag">get</span> <span class="hljs-selector-tag">requirepass</span>
</pre>

<p>
	المخرجات:
</p>

<pre class="ipsCode">
(error) ERR unknown <span class="hljs-keyword">command</span> <span class="hljs-string">'config'</span>
</pre>

<p>
	سينجح الأمر عند استخدام الاسم الجديد. لا يهم حالة الأحرف.
</p>

<pre class="ipsCode">
 127<span class="hljs-selector-class">.0</span><span class="hljs-selector-class">.0</span><span class="hljs-selector-class">.1</span><span class="hljs-selector-pseudo">:6379</span>&gt; <span class="hljs-selector-tag">asc12_config</span> <span class="hljs-selector-tag">get</span> <span class="hljs-selector-tag">requirepass</span>
</pre>

<p>
	المخرجات:
</p>

<pre class="ipsCode">
<span class="hljs-number">1</span>) <span class="hljs-string">"requirepass"</span>
<span class="hljs-number">2</span>) <span class="hljs-string">"your_redis_password"</span>
</pre>

<p>
	وأخيرا يمكنك الخروج من "<code>redis-cli</code>".
</p>

<pre class="ipsCode">
 <span class="hljs-number">127.0</span>.<span class="hljs-number">0.1</span>:<span class="hljs-number">6379</span>&gt; <span class="hljs-keyword">exit</span>
</pre>

<p>
	<strong>ملاحظة:</strong> عندما تُعيد تشغيل سطر أوامر Redis، سيطلب منك إعادة المصادقة أو سيظهر لك الخطأ التالي عند محاولتك لتنفيذ أمر ما:
</p>

<p>
	المخرجات:
</p>

<pre class="ipsCode">
NOAUTH Authentication required.
</pre>

<p>
	<strong>ملاحظة:</strong> بالنسبة لإعادة تسمية الأوامر؛ يوجد جملة تحذيرية في نهاية جزء <code>SECURITY</code> في الملف "<code>‎/etc/redis/redis.conf</code>" والتي تنص على:
</p>

<pre class="ipsCode">
Please note <span class="hljs-keyword">that</span> changing <span class="hljs-keyword">the</span> <span class="hljs-built_in">name</span> <span class="hljs-keyword">of</span> commands <span class="hljs-keyword">that</span> are logged <span class="hljs-keyword">into</span> <span class="hljs-keyword">the</span> AOF <span class="hljs-built_in">file</span> <span class="hljs-keyword">or</span> transmitted <span class="hljs-keyword">to</span> slaves may cause problems.
</pre>

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

<p>
	<strong>ملاحظة:</strong> يستخدم Redis المصطلحات “<code>master</code>” و “<code>slave</code>” بينما يفضل DigitalOcean استخدام البدائل “<code>primary</code>” و “<code>secondary</code>”. ولتجنب الخلط بين المصطلحات فإننا نستخدم المصطلحات التي يستخدمها Redis في ملفات التوثيق الخاصة به.
</p>

<p>
	يعني ذلك أنه إن كانت الأوامر التي تمت إعادة تسميتها ليست في ملف AOF أو إن كانت فيه لكن لم يتم نقلها إلى مجلد فرعي فلن يكون هناك أية مشاكل.
</p>

<p>
	لذلك يجب أن تتذكر هذا عند قيامك بإعادة تسمية أمر ما. أفضل وقت لإعادة تسمية الأوامر هو عند عدم استخدامك ل AOF أو بعد التثبيت مباشرة قبل استخدام Redis.
</p>

<p>
	عند استخدامك ل AOF وتعاملك مع التثبيت بنوع master-slave، خذ بعين الاعتبار <a href="https://github.com/antirez/redis/issues/2783" rel="external nofollow">هذه الإجابة من صفحة المشروع على GitHub</a>:
</p>

<p>
	الإجابة:
</p>

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

<p>
	لذلك فإن أفضل طريقة لإعادة تسمية لأوامر في مثل هذه الحالة هي عبر التأكد من أن الأوامر التي تمت إعادة تسميتها مطبقة على جميع النسخ في طريقة التثبيت باستخدام master-slave.
</p>

<h2 id="-">
	الخلاصة
</h2>

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

<p>
	تذكر أنه بمجرد تسجيل أحدهم الدخول إلى الخادم، فمن السهل عليه التحايل على إعدادت حماية Redis التي قمنا بها. لذلك فإن أهم ميزة أمان على الخادم هي جدار الحماية (الذي أعددته إن كنت تابعت المقال السابق حول التهيئة الأولية لخادم أوبونتو 18.04) الذي يجعل الاختراق صعبًا جدًا.
</p>

<p>
	ترجمة -وبتصرف- للمقال <a href="https://www.digitalocean.com/community/tutorials/how-to-install-and-secure-redis-on-ubuntu-18-04" rel="external nofollow">How To Install and Secure Redis on Ubuntu 18.04</a> لصاحبه الكاتب Mark Drake.
</p>
]]></description><guid isPermaLink="false">432</guid><pubDate>Sun, 28 Jul 2019 14:32:55 +0000</pubDate></item></channel></rss>
