<?xml version="1.0"?>
<rss version="2.0"><channel><title>DevOps: &#x62E;&#x648;&#x627;&#x62F;&#x64A;&#x645;</title><link>https://academy.hsoub.com/devops/servers/page/2/?d=4</link><description>DevOps: &#x62E;&#x648;&#x627;&#x62F;&#x64A;&#x645;</description><language>ar</language><item><title>[&#x641;&#x64A;&#x62F;&#x64A;&#x648;] &#x646;&#x634;&#x631; &#x62A;&#x637;&#x628;&#x64A;&#x642; &#x631;&#x648;&#x628;&#x64A; &#x639;&#x644;&#x649; &#x62E;&#x627;&#x62F;&#x645; &#x644;&#x64A;&#x646;&#x643;&#x633;</title><link>https://academy.hsoub.com/devops/servers/%D9%81%D9%8A%D8%AF%D9%8A%D9%88-%D9%86%D8%B4%D8%B1-%D8%AA%D8%B7%D8%A8%D9%8A%D9%82-%D8%B1%D9%88%D8%A8%D9%8A-%D8%B9%D9%84%D9%89-%D8%AE%D8%A7%D8%AF%D9%85-%D9%84%D9%8A%D9%86%D9%83%D8%B3-r398/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2019_03/rails.png.280265319ac7d011f7faff8db72a6527.png" /></p>

<p>
	<iframe allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen="" frameborder="0" height="400" src="https://www.youtube.com/embed/rlufpi6o2xI" width="700"></iframe>
</p>

<p>
	بعد برمجتك لموقعك باستخدام روبي وإطار ريلز، حان الوقت الآن لنشر التطبيق على خادم (server) ليستطيع زوارك الوصول إليه.
</p>

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

<p>
	<a href="https://academy.hsoub.com/learn/ruby-web-application-development/" ipsnoembed="true" rel="">https://academy.hsoub.com/learn/ruby-web-application-development/</a>
</p>

<p>
	مستودع التطبيق: <a href="https://github.com/HsoubAcademy/rails-twitter-web-app" ipsnoembed="true" rel="external nofollow">https://github.com/HsoubAcademy/rails-twitter-web-app</a>
</p>

<p>
	نوفر في موسوعة حسوب توثيقًا كاملًا للغة روبي وإطار العمل ريلز باللغة العربية: <a href="https://wiki.hsoub.com/Ruby" ipsnoembed="true" rel="external">https://wiki.hsoub.com/Ruby</a>
</p>

<p>
	<a href="https://wiki.hsoub.com/Rails" ipsnoembed="true" rel="external">https://wiki.hsoub.com/Rails</a>
</p>
]]></description><guid isPermaLink="false">398</guid><pubDate>Tue, 12 Mar 2019 10:40:51 +0000</pubDate></item><item><title>&#x643;&#x64A;&#x641;&#x64A;&#x629; &#x625;&#x639;&#x62F;&#x627;&#x62F; &#x62A;&#x637;&#x628;&#x64A;&#x642;&#x627;&#x62A; Node.js &#x644;&#x62A;&#x639;&#x645;&#x644; &#x639;&#x644;&#x649; Debian 8</title><link>https://academy.hsoub.com/devops/servers/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF-%D8%AA%D8%B7%D8%A8%D9%8A%D9%82%D8%A7%D8%AA-nodejs-%D9%84%D8%AA%D8%B9%D9%85%D9%84-%D8%B9%D9%84%D9%89-debian-8-r382/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2018_02/5a730a04ea855_08(4).png.7d2aac4b91847e88a2b3225b5a833c78.png" /></p>

<h2>
	<a id="_2" rel=""></a>مقدمة
</h2>

<p>
	Node.js هو بيئة عمل مفتوحة المصدر لجافا سكريبت تعمل وقت التشغيل لبناء تطبيقات الخادم والشبكات بسهولة. تعمل المنصة على لينكس, OS X, FreeBSD وويندوز. يمكن تشغيل تطبيقات Node.js من سطر الأوامر، ولكن سنركز على تشغيلها كخدمة، بحيث سيتم إعادة تشغيلها تلقائيًا في حال حدوث فشل أو في حال إعادة تشغيل الحاسوب، كما يمكن استخدامها بأمان في بيئة الإنتاج.<br>
	في هذا الدرس، سوف نغطّي موضوع إنشاء بيئة عمل Node.js جاهزة للإنتاج على خادم Debian 8. هذا الخادم سيشغّل تطبيقًا لـ Node.js سيكون مُدارًا بواسطة PM2، ويوفر للمستخدمين وصولًا آمنًا إلى التطبيق عبر Nginx reverse proxy.
</p>

<h2>
	<a id="__5" rel=""></a>المتطلبات الأساسية
</h2>

<p>
	يفترض هذا الدليل أن لديك خادم Debian 8، بصلاحيات مستخدم غير جذري non-root user ومع امتيازات sudo. ونفترض كذلك أن لديك اسم نطاق يشير إلى عنوان IP العام للخادم.<br>
	دعونا نبدأ بتثبيت بيئة العمل Node.js على خادمك.
</p>

<h2>
	<a id="_Nodejs_8" rel=""></a>تثبيت Node.js
</h2>

<p>
	سوف نقوم بتثبيت أحدث إصدارات Node.js المدعومة على المدى الطويل، وذلك باستخدام أرشيف الحزمة NodeSource.<br>
	أولًا، تحتاج إلى تثبيت NodeSource PPA لأجل الوصول إلى محتوياته. تأكد من أنك في المجلد الأساسي home directory، وقم باستخدام<code>curl</code> للحصول على برنامج التثبيت النصي من مستودعات 6.X Node.js:
</p>

<pre class="ipsCode" id="ips_uid_1795_8">
cd ~

curl -sL https://deb.nodesource.com/setup_6.x -o nodesource_setup.sh</pre>

<p>
	يمكنك فحص محتويات هذا النص البرمجي بواسطة<code>nano</code> (أو محرر النصوص المفضل لديك):
</p>

<pre class="ipsCode" id="ips_uid_1795_8">
<code>nano nodesource_setup.sh
</code></pre>

<p>
	وقم بتشغيل النص البرمجي عقب <code>sudo</code>:
</p>

<pre class="ipsCode" id="ips_uid_1795_8">
<code>sudo bash nodesource_setup.sh
</code></pre>

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

<pre class="ipsCode" id="ips_uid_1795_8">
<code>sudo apt-get install nodejs
</code></pre>

<p>
	الحزمة nodejs تحتوي رُقامة nodejs (nodejs binary ) إضافة إلى <code>npm</code>، لذلك لا تحتاج إلى تثبيت <code>npm</code> بشكل منفصل. ولكن لكي تعمل بعض حُزم <code>npm</code> (مثل تلك التي تتطلب ترجمة التعليمات البرمجية من المصدر)، فستحتاج إلى تثبيت الحزمة <code>build-essential</code>:
</p>

<pre class="ipsCode" id="ips_uid_1795_8">
<code>sudo apt-get install build-essential
</code></pre>

<p>
	لقد تم تثبيت بيئة العمل Node.js، وصارت جاهزة لتشغيل تطبيقاتنا! لذلك دعونا الآن نكتب تطبيقًا بـ Node.js
</p>

<h2>
	<a id="__Nodejs_35" rel=""></a>إنشاء تطبيق Node.js
</h2>

<p>
	سنكتب تطبيق Hello World والذي سيُرجع ببساطة الجملة “Hello World” لكل طلبات HTTP. هذا تطبيق تعليمي بسيط من شأنه أن يساعدك على التعامل مع Node.js، يمكنك بعد ذلك استبداله بتطبيقاتك الخاصة. فقط تذكر أن تعدّل تطبيقك لكي يُصغي إلى منافذ وعناوين IP المناسبة.
</p>

<h3>
	<a id="___Hello_World_37" rel=""></a>الشيفرة البرمجية لـ Hello World
</h3>

<p>
	أولًا، قم بإنشاء وفتح تطبيق Node.js لأجل التحرير. في هذا الدرس، سوف نستخدم <code>nano</code> لتحرير تطبيق تعليمي يُسمّى <code>hello.js</code>:
</p>

<pre class="ipsCode" id="ips_uid_1795_8">
<code>cd ~
nano hello.js
</code></pre>

<p>
	أدرج التعليمات البرمجية التالي في الملف. يمكنك استبدال المنفذ 8080، في كلا الموقعين (تأكد من استخدام منفذ غير أساسي non-admin، أي 1024 أو أكبر):
</p>

<p style="text-align: left;">
	hello.js
</p>

<pre class="ipsCode" id="ips_uid_6610_8">
#!/usr/bin/env nodejs
var http = require('http');
http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello World\n');
}).listen(8080, 'localhost');
console.log('Server running at http://localhost:8080/');</pre>

<p>
	الآن احفظ واخرج.<br>
	هذا التطبيق سيُصغي إلى العنوان المحدد(<code>localhost</code>) والمنفذ (8080)، ويُرجع “Hello World” مع كود النجاح (HTTP success) يساوي200 . وبما أننا نُصغي على localhost، فإن العملاء البعيدين remote clients لن يكونوا قادرين على ربط الاتصال بتطبيقنا.
</p>

<h3>
	<a id="__58" rel=""></a>اختبار التطبيق
</h3>

<p>
	لتتمكن من اختبار التطبيق، اجعل <code>hello.js</code> ملفًّا تنفيذيًا:
</p>

<pre class="ipsCode" id="ips_uid_1795_8">
<code>chmod +x ./hello.js
</code></pre>

<p>
	وقم بتشغيله هكذا:
</p>

<pre class="ipsCode" id="ips_uid_1795_8">
<code>./hello.js
</code></pre>

<p style="text-align: left;">
	Output
</p>

<pre class="ipsCode" id="ips_uid_1795_8">
<code>Server running at http://localhost:8080/
</code></pre>

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

	<div class="ipsQuote_contents ipsClearfix">
		<p>
			<strong>ملاحظة:</strong> تشغيل تطبيق Node.js بهذه الطريقة سيعطل عدة أوامر إضافية إلى حين إيقاف التطبيق بالضغط على <code>Ctrl-C</code>
		</p>
	</div>
</blockquote>

<p>
	لاختبار التطبيق، قم بفتح جلسة على المطراف terminal على الخادم الخاص بك، ثم اربط االاتصال بـlocalhost بواسطة <code>curl</code>:
</p>

<pre class="ipsCode" id="ips_uid_1795_8">
<code>curl http://localhost:8080
</code></pre>

<p>
	إن رأيت المخرجات التالية، فهذا يعني أن التطبيق يعمل بشكل صحيح ويُصغي للعنوان والمنفذ الصحيحين:
</p>

<p style="text-align: left;">
	Output
</p>

<pre class="ipsCode" id="ips_uid_1795_8">
<code>Hello World
</code></pre>

<p>
	إن لم ترى المخرجات المناسبة، تأكد من أن تطبيق Node.js قيد التشغيل، وأنه يٌصغي للعنوان والمنفذ الصحيح.<br>
	بمجرد أن تتيقن بأنه يعمل، أوقف التطبيق (إذا لم تكن قد فعلت من قبل) عن طريق الضغط على Ctrl + C.
</p>

<h2>
	<a id="_PM2_87" rel=""></a>تثبيت PM2
</h2>

<p>
	سنقوم الآن بتثبيتPM2 ، والذي هو مدير العمليات process manager لتطبيقات Node.js. يوفر PM2 وسيلة سهلة لإدارة وإخفاء daemonize التطبيقات (أي تشغيلها كخدمة في الخلفية.(<br>
	سوف نستخدم npm، وهي حزمة لإدارة وحدات Nodeالتي تُثبّت مع Node.js، لتثبيت PM2 على الخادم استخدم هذا الأمر:
</p>

<pre class="ipsCode" id="ips_uid_1795_8">
<code>sudo npm install -g pm2
</code></pre>

<p>
	الخيار <code>-g</code> يقول لـ<code>npm</code> أنّ عليه تثبيت الوحدة بشكل كلي globally، بحيث تكون متاحة على نطاق النظام كله.
</p>

<h2>
	<a id="____PM2_94" rel=""></a>إدارة التطبيق عبر PM2
</h2>

<p>
	PM2 بسيط وسهل الاستخدام. سوف نغطي فيما يلي بعض استخداماته الأساسية.
</p>

<h3>
	<a id="__96" rel=""></a>بدء التطبيق
</h3>

<p>
	أول شيء سنفعله هو استخدام التعليمة <code>pm2 start</code> لبدء تشغيل التطبيق <code>hello.js</code> في الخلفية:
</p>

<pre class="ipsCode" id="ips_uid_1795_8">
<code>pm2 start hello.js
</code></pre>

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

<p style="text-align: left;">
	Output
</p>

<pre class="ipsCode" id="ips_uid_6610_6">
[PM2] Spawning PM2 daemon
[PM2] PM2 Successfully daemonized
[PM2] Starting hello.js in fork_mode (1 instance)
[PM2] Done.
┌──────────┬────┬──────┬──────┬────────┬─────────┬────────┬─────────────┬──────────┐
│ App name │ id │ mode │ pid  │ status │ restart │ uptime │ memory      │ watching │
├──────────┼────┼──────┼──────┼────────┼─────────┼────────┼─────────────┼──────────┤
│ hello    │ 0  │ fork │ 3524 │ online │ 0       │ 0s     │ 21.566 MB   │ disabled │
└──────────┴────┴──────┴──────┴────────┴─────────┴────────┴─────────────┴──────────┘
 Use `pm2 show &lt;id|name&gt;` to get more details about an app</pre>

<p>
	كما ترى، يُعيّن PM2 تلقائيا اسم التطبيق (بناءً على اسم الملف دون الامتداد <code>.js</code>). ورقم تعريفPM2 . كما يحفظ PM2 معلومات أخرى، من قبيل معرّف العمليةPID ، وحالته الراهنة، واستخدام الذاكرة.<br>
	سيتم إعادة تشغيل التطبيقات التي تعمل تحت PM2 تلقائيا إذا تعطل التطبيق أو أُوقف، لكي نجعل التطبيق يشتغل تلقائيًا عند بدء أو إعادة التشغيل ينبغي اتخاذ خطوة إضافية. ولحسن الحظ، يوفّرPM2 وسيلةً سهلةً للقيام بذلك، وهي التعليمة الفرعية <code>startup</code>.<br>
	تقوم التعليمة الفرعية <code>startup</code> بإنشاء وإعداد برنامج نصي لإطلاق PM2 والعمليات المُدارة من قبله عند بدء تشغيل الخادم. يجب عليك أيضًا تحديد المنصة الذي تعمل عليها، والتي هي <code>Ubuntu</code>، في حالتنا:
</p>

<pre class="ipsCode" id="ips_uid_1795_8">
<code>pm2 startup system
</code></pre>

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

<p style="text-align: left;">
	Output
</p>

<pre class="ipsCode" id="ips_uid_1795_8">
<code>[PM2] You have to run this command as root. Execute the following command:
sudo env PATH=$PATH:/usr/bin /usr/local/lib/node_modules/pm2/bin/pm2 startup systemd -u sammy --hp /home/Sammy
</code></pre>

<p>
	قم بتشغيل التعليمة التي تم إنشاؤها (مماثلة للمخرجات الملوّنة أعلاه، ولكن استخدم اسم المستخدم الخاص بك بدلًا من sammy) لجعل PM2 يبدأ مع بداية التشغيل (استخدم التعليمة من المخرجات التي لديك):
</p>

<pre class="ipsCode" id="ips_uid_1795_8">
<code>sudo env PATH=$PATH:/usr/bin /usr/local/lib/node_modules/pm2/bin/pm2 startup systemd -u sammy --hp /home/sammy
</code></pre>

<p>
	هذا سوف يُنشئ systemd unit والتي ستُشغّل PM2 للمستخدم خاصتك عند بدء التشغيل. عينة <code>pm2</code> هذه ستشغّل بدورها<code>hello.js</code> . يمكنك التحقق من حالة الوحدة systemd بواسطة <code>systemctl</code>:
</p>

<pre class="ipsCode" id="ips_uid_1795_8">
<code>systemctl status pm2
</code></pre>

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

<h2>
	<a id="___PM2__138" rel=""></a>استخدامات أخرى لـ PM2 (اختياري)
</h2>

<p>
	يوفرPM2 العديد من التعليمات الفرعية التي تسمح لك بإدارة أو البحث عن معلومات حول تطبيقاتك. لاحظ أن تشغيل PM2 دون أي معاملات arguments سيؤدي إلى عرض صفحة مساعدة تتضمن أمثلة على الاستخدام والتي تغطي استخدامات PM2 بتفاصيل أكثر مما هو موجود في هذا الدرس.<br>
	يمكنك إيقاف التطبيق بهذه التعليمة (حدّد App name أو id الخاص بـPM2 ):
</p>

<pre class="ipsCode" id="ips_uid_1795_8">
<code>pm2 stop app_name_or_id
</code></pre>

<p>
	يمكنك إعادة تشغيل التطبيق بهذه التعليمة (حدّد App name أو id الخاص بـPM2 ):
</p>

<pre class="ipsCode" id="ips_uid_1795_8">
<code>pm2 restart app_name_or_id
</code></pre>

<p>
	ويمكن أيضًا مطالعة قائمة من التطبيقات المُدارة حاليًا من قبل PM2 بالتعليمة الفرعيةlist .
</p>

<pre class="ipsCode" id="ips_uid_1795_8">
<code>pm2 list
</code></pre>

<p>
	يمكنك الحصول على مزيد من المعلومات حول تطبيق معين باستخدام التعليمة الفرعية <code>info</code> (حدّد App name أو id الخاص بـPM2 ):
</p>

<pre class="ipsCode" id="ips_uid_1795_8">
<code>pm2 info example
</code></pre>

<p>
	يمكن الوصول إلى مراقب عمليات PM2 بالتعليمة الفرعية <code>monit</code>. سيتم عرض حالة التطبيق ووحدة المعالجة المركزية CPU واستخدام الذاكرة:
</p>

<pre class="ipsCode" id="ips_uid_1003_7">
pm2 monit</pre>

<p>
	الآن وبعد أن قمنا بتشغيل Node.js وإدارته بواسطة PM2، دعونا نبدأ إعداد الوكيل العكسيreverse proxy .
</p>

<h2>
	<a id="_Nginx_____Reverse_Proxy_Server_159" rel=""></a>إعداد Nginx ليكون الوكيل العكسي للخادم Reverse Proxy Server
</h2>

<p>
	الآن وبعد أن بدأ تطبيقك يشتغل ويُصغي إلى المضيف المحلي localhost، تحتاج إلى إعداد وسيلة ليتمكن المستخدمون من الوصول إليه. سوف نقوم بإنشاء خادم Nginx كوكيل عكسي لهذا الغرض. في هذا الدرس ستتعلم كيفية إعداد خادم Nginx من الصفر. إن سبق وقمت بإعداد خادم Nginx، فيمكنك الاكتفاء بنسخ <code>location</code> في server block من اختيارك (تأكد من أن المحل location لا يتداخل مع المحتوى الموجود على الخادم).<br>
	أولًا، قم بتثبيت Nginx باستخدام apt-get:
</p>

<pre class="ipsCode" id="ips_uid_1795_8">
<code>sudo apt-get install nginx
</code></pre>

<p>
	الآن افتح ملف الإعدادات الافتراضي لـ server block لأجل تحريره:
</p>

<pre class="ipsCode" id="ips_uid_1795_8">
<code>sudo nano /etc/nginx/sites-available/default
</code></pre>

<p>
	احذف كل ما هو موجود في الملف وقم بإدراج الإعدادات التالية. تأكد من استبدال اسم النطاق خاصتك في الموجّه <code>server_name</code>. بالإضافة إلى ذلك، قم بتغيير المنفذ (8080) إن كان تطبيقك مُعدًّا للإصغاء إلى منفذ آخر:
</p>

<p style="text-align: left;">
	/etc/nginx/sites-available/default
</p>

<pre class="ipsCode" id="ips_uid_1795_8">
<code>server {
    listen 80;

    server_name example.com;

    location / {
        proxy_pass http://localhost:8080;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
    }
}
</code></pre>

<p>
	هذا سيقوم بإعداد الخادم بحيث يرد على الطلبات requests على مستوى الجذر root. إن افترضنا مثلًا أن خادمنا مُتوفر <a href="http://xn--example-yvj0f.com" rel="external nofollow">فيexample.com</a> ، فإن الدخول إلى <a href="http://example.com/" rel="external nofollow">http://example.com/</a> عبر متصفح الإنترنت سيبعث الطلب إلى <code>hello.js</code> الذي يُصغي إلى المنفذ 8080 في المضيف المحلي. يمكنك إضافة كتل محل <code>location blocks</code> إضافية لنفس كتلة الخادم <code>server block</code> لإتاحة إمكانية الوصول إلى التطبيقات الأخرى على نفس الخادم. على سبيل المثال، إن كنت تُشغّل تطبيقًا آخرًا لـ Node.js على المنفذ 8081، يمكنك إضافة كتلة المحل <code>location block </code>التالية للسماح بالوصول إليها عبر <a href="http://example.com/app2" ipsnoembed="true" rel="external nofollow">http://example.com/app2</a> :
</p>

<p style="text-align: left;">
	Nginx Configuration — Additional Locations
</p>

<pre class="ipsCode" id="ips_uid_1795_8">
<code>    location /app2 {
        proxy_pass http://localhost:8081;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
    }
</code></pre>

<p>
	بمجرد الانتهاء من إضافة كتل المحل لتطبيقاتك، قم بالحفظ واخرج. تأكد من أنك لم ترتكب أي أخطاء نحوية syntax errors أثناء الكتابة:
</p>

<pre class="ipsCode" id="ips_uid_1795_8">
<code>sudo nginx –t
</code></pre>

<p>
	بعد ذلك، قم بإعادة تشغيل Nginx:
</p>

<pre class="ipsCode" id="ips_uid_1795_8">
<code>sudo systemctl restart nginx
</code></pre>

<p>
	بعد ذلك، قم بترخيص المرور لـ Nginx عبر جدار حماية، إن كان متاحًا. إذا كنت تستخدم <code>ufw</code> ، يمكنك استخدام التعليمة التالية:
</p>

<pre class="ipsCode" id="ips_uid_1795_8">
<code>sudo ufw allow 'Nginx Full'
</code></pre>

<p>
	يمكنك بواسطة<code>ufw</code> التحقق من الحالة باستخدام التعليمة التالية:
</p>

<pre class="ipsCode" id="ips_uid_1795_8">
<code>sudo ufw status
</code></pre>

<p>
	إذا كنت تستخدم IPTables بدلًا من ذلك، يمكنك ترخيص المرور لـ Nginx باستخدام التعليمة التالية:
</p>

<pre class="ipsCode" id="ips_uid_1795_8">
<code>sudo iptables -I INPUT -p tcp -m tcp --dport 80 -j ACCEPT
</code></pre>

<p>
	يمكنك دائمًا التحقق من حالة IPTables باستخدام التعليمة التالية:
</p>

<pre class="ipsCode" id="ips_uid_1795_8">
<code>sudo iptables –S
</code></pre>

<p>
	على افتراض أن تطبيق Node.js الخاص بك قيد التشغيل، وأن إعدادات Nginx وتطبيقاتك صحيحة، فسيكون بإمكانك الآن الوصول إلى تطبيقك عبر وكيل عكسي لـ Nginx. جرّب ذلك بنفسك عن طريق الدخول إلى عنوان الخادم الخاص بك (الـ IP أو اسم النطاق)
</p>

<h2>
	<a id="_236" rel=""></a>الخلاصة
</h2>

<p>
	تهانينا! لقد نجحت في جعل تطبيق Node.js الخاص بك يعمل في خلفية وكيل عكسي لـ Nginx على خادم Debian 8. إعدادات الوكيل العكسي هاته مرنة بما فيه الكفاية لتمكين المستخدمين من الوصول إلى التطبيقات الأخرى أو محتويات صفحات الأنترنت الثابتة التي تريد مشاركتها. حظًا سعيدًا في عملك على Node.js.<br>
	ترجمة -وبتصرّف- للمقال <a href="https://www.digitalocean.com/community/tutorials/how-to-set-up-a-node-js-application-for-production-on-debian-8" rel="external nofollow">How To Set Up a Node.js Application for Production on Debian 8</a> لصاحبته Lisa Tagliaferri
</p>
]]></description><guid isPermaLink="false">382</guid><pubDate>Thu, 08 Feb 2018 06:06:00 +0000</pubDate></item><item><title>&#x643;&#x64A;&#x641;&#x64A;&#x629; &#x62A;&#x62B;&#x628;&#x64A;&#x62A; &#x628;&#x631;&#x645;&#x62C;&#x64A;&#x629; Jenkins &#x639;&#x644;&#x649; &#x62E;&#x627;&#x62F;&#x648;&#x645; &#x623;&#x648;&#x628;&#x646;&#x62A;&#x648; 16.04</title><link>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%A8%D8%B1%D9%85%D8%AC%D9%8A%D8%A9-jenkins-%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-1604-r360/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2017_10/31.png.0af3a473aa56fabf334ea2061fd2cf12.png" /></p>

<p>
	برمجية Jenkins هي خدمة أتمتة مفتوحة المصدر الغرض منها هو أتمتة المهام التقنية المتكررة التي تتعلق بدمج وتوفير البرمجيات.<br>
	برمجية Jenkins مكتوبة بلغة Java ويمكن تثبيتها من حزم أوبنتو أو بتنزيل وتشغيل ملف WAR (الذي هو مجموعة من الملفات التي تُنشِئ تطبيق ويب كامل ليعمل على خادومك).<br>
	سنُثبِّت Jenkins في هذا الدرس بإضافة مستودع حزم دبيان الخاص بها، ثم بتثبيت الحزم اللازمة عبر الأداة <code>apt-get</code> من ذاك المستودع.
</p>

<h2 id="المتطلبات-المسبقة">
	المتطلبات المسبقة
</h2>

<p>
	سنحتاج إلى خادوم أوبنتو 16.04 فيه حساب مستخدم ليس جذرًا وفيه جدار ناري وذلك باتباع التعليمات الواردة في درس «الإعداد الابتدائي لخادوم أوبنتو 14.04](<a href="https://academy.hsoub.com/devops/servers/" rel="">https://academy.hsoub.com/devops/servers/</a>الإعداد-الابتدائي-لخادوم-أوبنتو-1404-r4/)»، ننصح باستعمال 1 غيغابايت من ذاكرة RAM على الأقل؛ راجع صفحة <a href="https://jenkins.io/doc/book/hardware-recommendations/" rel="external nofollow">Choosing the Right Hardware for Masters</a> لمزيدٍ من المعلومات حول العتاد اللازم لتثبيت Jenkins.<br>
	يمكنك المتابعة مع هذا الدرس بعد إعداد الخادوم.
</p>

<h2 id="الخطوة-الأولى-تثبيت-jenkins">
	الخطوة الأولى: تثبيت Jenkins
</h2>

<p>
	الإصدار المتوافر في مستودعات أوبنتو الرسمية يكون قديمًا ومتأخرًا عن الإصدار الحالي لمشروع Jenkins؛ وللاستفادة من آخر التحديثات والميزات فسنستخدم الحزم المُصانة من قِبل مشروع Jenkins نفسه.<br>
	علينا أولًا إضافة مفتاح المستودع إلى النظام:
</p>

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

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

<pre class="ipsCode" id="ips_uid_3996_7">
<code class="hljs avrasm"><span class="pln">echo deb http</span><span class="pun">:</span><span class="com">//pkg</span><span class="hljs-preprocessor"><span class="com">.jenkins</span></span><span class="hljs-preprocessor"><span class="com">.io</span></span><span class="com">/debian-stable binary/ | sudo tee /etc/apt/sources</span><span class="hljs-preprocessor"><span class="com">.list</span></span><span class="hljs-preprocessor"><span class="com">.d</span></span><span class="com">/jenkins</span><span class="hljs-preprocessor"><span class="com">.list</span></span></code></pre>

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

<pre class="ipsCode" id="ips_uid_3996_7">
<code class="hljs bash"><span class="hljs-built_in"><span class="pln">sudo</span></span><span class="pln"> apt</span><span class="pun">-</span><span class="kwd">get</span><span class="pln"> update</span></code></pre>

<p>
	ثم نثبّت Jenkins مع اعتمادياته كلها، بما فيها بيئة تشغيل Java:
</p>

<pre class="ipsCode" id="ips_uid_3996_7">
<code class="hljs bash"><span class="hljs-built_in"><span class="pln">sudo</span></span><span class="pln"> apt</span><span class="pun">-</span><span class="kwd">get</span><span class="pln"> install jenkins</span></code></pre>

<p>
	يمكننا الآن تشغيل خادوم Jenkins بعد تثبيته مع اعتمادياته.
</p>

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

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

<pre class="ipsCode" id="ips_uid_3996_7">
<code class="hljs bash"><span class="hljs-built_in"><span class="pln">sudo</span></span><span class="pln"> systemctl start jenkins</span></code></pre>

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

<pre class="ipsCode" id="ips_uid_3996_7">
<code class="hljs bash"><span class="hljs-built_in"><span class="pln">sudo</span></span><span class="pln"> systemctl status jenkins</span></code></pre>

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

<pre class="ipsCode" id="ips_uid_3996_7">
<code class="hljs sql"><span class="pun">●</span><span class="pln"> jenkins</span><span class="pun">.</span><span class="pln">service </span><span class="pun">-</span><span class="pln"> LSB</span><span class="pun">:</span><span class="pln"> </span><span class="hljs-operator"><span class="hljs-keyword"><span class="typ">Start</span></span><span class="pln"> </span><span class="typ">Jenkins</span><span class="pln"> </span><span class="hljs-keyword"><span class="pln">at</span></span><span class="pln"> boot </span><span class="hljs-keyword"><span class="pln">time</span></span><span class="pln">
  </span><span class="typ">Loaded</span><span class="pun">:</span><span class="pln"> loaded </span><span class="pun">(</span><span class="str">/etc/</span><span class="pln">init</span><span class="pun">.</span><span class="pln">d</span><span class="pun">/</span><span class="pln">jenkins</span><span class="pun">;</span></span><span class="pln"> bad</span><span class="pun">;</span><span class="pln"> vendor preset</span><span class="pun">:</span><span class="pln"> enabled</span><span class="pun">)</span><span class="pln">
  </span><span class="typ">Active</span><span class="pun">:</span><span class="pln">active </span><span class="pun">(</span><span class="pln">exited</span><span class="pun">)</span><span class="pln"> since </span><span class="typ">Thu</span><span class="pln"> </span><span class="lit">2017</span><span class="pun">-</span><span class="lit">04</span><span class="pun">-</span><span class="lit">20</span><span class="pln"> </span><span class="lit">16</span><span class="pun">:</span><span class="lit">51</span><span class="pun">:</span><span class="lit">13</span><span class="pln"> UTC</span><span class="pun">;</span><span class="pln"> </span><span class="lit">2min</span><span class="pln"> </span><span class="lit">7s</span><span class="pln"> ago
    </span><span class="typ">Docs</span><span class="pun">:</span><span class="pln"> man</span><span class="pun">:</span><span class="pln">systemd</span><span class="pun">-</span><span class="pln">sysv</span><span class="pun">-</span><span class="pln">generator</span><span class="pun">(</span><span class="lit">8</span><span class="pun">)</span></code></pre>

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

<h2 id="الخطوة-الثالثة-فتح-المنفذ-في-الجدار-الناري">
	الخطوة الثالثة: فتح المنفذ في الجدار الناري
</h2>

<p>
	يعمل خادوم Jenkins افتراضيًا على المنفذ 8080، لذا سنفتحه باستخدام <code>ufw</code>:
</p>

<pre class="ipsCode" id="ips_uid_3996_7">
<code class="hljs bash"><span class="hljs-built_in"><span class="pln">sudo</span></span><span class="pln"> ufw allow </span><span class="hljs-number"><span class="lit">8080</span></span></code></pre>

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

<pre class="ipsCode" id="ips_uid_3996_7">
<code class="hljs bash"><span class="hljs-built_in"><span class="pln">sudo</span></span><span class="pln"> ufw status</span></code></pre>

<p>
	يجب أن نلاحظ أنَّ التراسل الشبكي إلى المنفذ 8080 متاحٌ من كل الشبكات:
</p>

<pre class="ipsCode" id="ips_uid_3996_7">
<code class="hljs http"><span class="hljs-attribute"><span class="typ">Status</span></span><span class="pun">:</span><span class="pln"> </span><span class="hljs-string"><span class="pln">active</span></span><span class="pln">

</span><span class="erlang"><span class="hljs-variable"><span class="typ">To</span></span><span class="pln">                         </span><span class="hljs-variable"><span class="typ">Action</span></span><span class="pln">      </span><span class="hljs-variable"><span class="typ">From</span></span><span class="pln">
</span><span class="hljs-pp"><span class="pun">--</span><span class="pln">                         </span><span class="pun">------</span><span class="pln">      </span><span class="pun">----</span><span class="pln">
</span><span class="typ">OpenSSH</span><span class="pln">                    ALLOW       </span><span class="typ">Anywhere</span><span class="pln">
</span><span class="lit">8080</span><span class="pln">                       ALLOW       </span><span class="typ">Anywhere</span><span class="pln">
</span><span class="typ">OpenSSH</span><span class="pln"> </span><span class="hljs-params"><span class="pun">(</span><span class="pln">v6</span><span class="pun">)</span></span><span class="pln">               ALLOW       </span><span class="typ">Anywhere</span><span class="pln"> </span><span class="hljs-params"><span class="pun">(</span><span class="pln">v6</span><span class="pun">)</span></span><span class="pln">
</span><span class="lit">8080</span><span class="pln"> </span><span class="hljs-params"><span class="pun">(</span><span class="pln">v6</span><span class="pun">)</span></span><span class="pln">                  ALLOW       </span><span class="typ">Anywhere</span><span class="pln"> </span><span class="hljs-params"><span class="pun">(</span><span class="pln">v6</span><span class="pun">)</span></span></span></span></code></pre>

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

<h2 id="الخطوة-الرابعة-ضبط-خدمة-jenkins">
	الخطوة الرابعة: ضبط خدمة Jenkins
</h2>

<p>
	علينا لضبط خدمة Jenkins أن نزور صفحته على المنفذ الافتراضي 8080 مستعملين اسم نطاق الخادوم أو عنوان IP الخاص به كما يلي: <code>http://ip_address_or_domain_name:8080</code>.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="25322" href="https://academy.hsoub.com/uploads/monthly_2017_10/1-unlock-jenkins.png.518383ba48a8b1cff1712b29e44c75f4.png" rel=""><img alt="1-unlock-jenkins.png" class="ipsImage ipsImage_thumbnailed" data-fileid="25322" data-unique="nhreqrc3g" src="https://academy.hsoub.com/uploads/monthly_2017_10/1-unlock-jenkins.thumb.png.da879cc046aa6dbcadba53080a4c3648.png"></a>
</p>

<p>
	سنستعمل الأمر <code>cat</code> في نافذة الطرفية لعرض كلمة المرور:
</p>

<pre class="ipsCode" id="ips_uid_3996_7">
<code class="hljs bash"><span class="hljs-built_in"><span class="pln">sudo</span></span><span class="pln"> cat </span><span class="pun">/</span><span class="kwd">var</span><span class="pun">/</span><span class="pln">lib</span><span class="pun">/</span><span class="pln">jenkins</span><span class="pun">/</span><span class="pln">secrets</span><span class="pun">/</span><span class="pln">initialAdminPassword</span></code></pre>

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

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="25323" href="https://academy.hsoub.com/uploads/monthly_2017_10/2-jenkins-customize.png.a5fb4463b4e45aa1a2f94d348503274f.png" rel=""><img alt="2-jenkins-customize.png" class="ipsImage ipsImage_thumbnailed" data-fileid="25323" data-unique="cfx9vac71" src="https://academy.hsoub.com/uploads/monthly_2017_10/2-jenkins-customize.thumb.png.baa87340f34dca34eba119770fb3463b.png"></a>
</p>

<p>
	اضغط على خيار «Install suggested plugins» الذي سيبدأ عملية التنزيل مباشرةً:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="25324" href="https://academy.hsoub.com/uploads/monthly_2017_10/3-jenkins-plugins.png.6c9bd77df148e3aa9dfc5e706b964dca.png" rel=""><img alt="3-jenkins-plugins.png" class="ipsImage ipsImage_thumbnailed" data-fileid="25324" data-unique="zunke6a1z" src="https://academy.hsoub.com/uploads/monthly_2017_10/3-jenkins-plugins.thumb.png.d82f925b59a3f3868bf51ca3877f0801.png"></a>
</p>

<p>
	بعد إكمال التثبيت سيُطلَب منك ضبط أوّل حساب مستخدم، وصحيح أنَّ من الممكن تخطي هذه الخطوة والإكمال باستعمال المستخدم <code>admin</code> مع كملة المرور المبدئية التي استعملناها أعلاه، لكن من الأفضل إنشاء مستخدم جديد.<br>
	ملاحظة: الاتصالات المنشأة إلى خادوم Jenkins غير مشفرة، لذا ستُرسَل البيانات النصية كما هي دون أي تشفير، لذا أنصحك باتباع ما ورد في <a href="https://www.digitalocean.com/community/tutorials/how-to-configure-jenkins-with-ssl-using-an-nginx-reverse-proxy" rel="external nofollow">هذا الدرس</a> لإعداد تشفير <abbr title="Secure Socket Layer | طبقة المنافذ الآمنة">SSL</abbr> مع خادوم Jenkins، مما يحمي بيانات المستخدم والمعلومات التي ترسَل عبر واجهة الويب.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="25325" href="https://academy.hsoub.com/uploads/monthly_2017_10/4-jenkins-first-admin.png.696494cc2bd4c506684937fc88539d9f.png" rel=""><img alt="4-jenkins-first-admin.png" class="ipsImage ipsImage_thumbnailed" data-fileid="25325" data-unique="gsxrhqiyv" src="https://academy.hsoub.com/uploads/monthly_2017_10/4-jenkins-first-admin.thumb.png.56299faa1cfad5f57449a5155f26be4a.png"></a>
</p>

<p>
	بعد ضبط أوّل حساب للمدير فستُعرَض لك صفحة فيها «Jenkins is ready!‎»:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="25326" href="https://academy.hsoub.com/uploads/monthly_2017_10/5-jenkins-ready.png.c346d5602dba66e568b4760ff9aec5a9.png" rel=""><img alt="5-jenkins-ready.png" class="ipsImage ipsImage_thumbnailed" data-fileid="25326" data-unique="pgftc5jtj" src="https://academy.hsoub.com/uploads/monthly_2017_10/5-jenkins-ready.thumb.png.4598e8ad9d0f0f2c6075732b7f0320ab.png"></a>
</p>

<p>
	اضغط على زر «Start using Jenkins» للانتقال إلى لوحة التحكم الرئيسية لخادوم Jenkins:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="25321" href="https://academy.hsoub.com/uploads/monthly_2017_10/6-jenkins-using.png.47eaa66386989b131f5ec94e7b5c2e5d.png" rel=""><img alt="6-jenkins-using.png" class="ipsImage ipsImage_thumbnailed" data-fileid="25321" data-unique="neerl021d" src="https://academy.hsoub.com/uploads/monthly_2017_10/6-jenkins-using.thumb.png.a2faaf098187cf6e5b5a9f21f1301f74.png"></a>
</p>

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

<h2 id="الخلاصة">
	الخلاصة
</h2>

<p>
	ثبتنا في هذا الدرس برمجية Jenkins من الحزم التي يوفرها المشروع، ثم بدأنا الخدمة وفتحنا منفذًا في الجدار الناري، وأنشأنا حسابًا جديدًا للمدير؛ وتستطيع الآن أن تستكشف Jenkins.
</p>

<p>
	ترجمة –وبتصرّف– للمقال <a href="https://www.digitalocean.com/community/tutorials/how-to-install-jenkins-on-ubuntu-16-04" rel="external nofollow">How To Install Jenkins on Ubuntu 16.04</a>لصاحبته Melissa Anderson
</p>
]]></description><guid isPermaLink="false">360</guid><pubDate>Mon, 30 Oct 2017 11:27:43 +0000</pubDate></item><item><title>&#x643;&#x644; &#x645;&#x627; &#x62A;&#x648;&#x62F; &#x645;&#x639;&#x631;&#x641;&#x62A;&#x647; &#x639;&#x646; &#x627;&#x644;&#x633;&#x62D;&#x627;&#x628;&#x629; &#x627;&#x644;&#x647;&#x62C;&#x64A;&#x646;&#x629; Hybrid Cloud</title><link>https://academy.hsoub.com/devops/servers/%D9%83%D9%84-%D9%85%D8%A7-%D8%AA%D9%88%D8%AF-%D9%85%D8%B9%D8%B1%D9%81%D8%AA%D9%87-%D8%B9%D9%86-%D8%A7%D9%84%D8%B3%D8%AD%D8%A7%D8%A8%D8%A9-%D8%A7%D9%84%D9%87%D8%AC%D9%8A%D9%86%D8%A9-hybrid-cloud-r358/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2017_10/24-2.png.f633f672568ea9e06f287a0607cd795a.png" /></p>

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

<h2>
	ما هي السحابة الهجينة؟
</h2>

<p>
	السحابة الهجينة هي أحد أنواع الحوسبة السحابيَّة وهي مزيجٌ من البنية التحتيَّة المتواجدة في موقع العمل (on-premise infrastructure)، والسحابة الخاصَّة (private cloud)، والسحابة العامَّة (public cloud). تجمع السحابة الهجينة الخدمات والمزايا التي يمكن أن تقدمها خدمات السحابة العامة والخاصة وتُنسِّق بينها رغم أنَّ كلَّ نوعٍ منهما له كيانه المنفصل والمختلف عن الآخر؛ يعتمد اختيار الخدمات السحابيَّة العامَّة والخاصَّة على عوامل عدَّة منها الأمن، والتكلفة، والمرونة.
</p>

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

<p>
	تُشكِّل البرمجيات مفتوحة المصدر الجزء الرئيسي من الحلول التي تستخدم السحابة الهجينة، مثل تطبيق «OpenStack» الذي صدر أوّل مرة في تشرين الأول من عام 2010 والذي ذاع صيته عالميًا؛ بعضٌ من الأدوات المُضمَّنة فيه توفِّر الخدمات الرئيسيَّة والأساسيَّة للحوسبة السحابيَّة مثل توفير خدمات الحوسبة والشبكات والتخزين وخدمات الاستيثاق (المكوِّن identity)؛ وبذلك تستطيع باستخدام هذا التطبيق إنشاء وإدارة ونشر سحابة هجينة مميزة وذات كفاءة عالية.
</p>

<h2>
	مكونات السحابة الهجينة
</h2>

<p>
	تتألف السحابة الهجينة من سحابة خاصَّة، وسحابة عامَّة، وشبكة داخلية تكون جميعها مُتصلة ومُدارة باستخدام أدوات النشر المؤتمتة(orchestration) وأدوات أتمتة المهام الأخرى وإدارة النظام (system management).
</p>

<p style="text-align: center;">
	<img alt="hybridcloud.png" class="ipsImage ipsImage_thumbnailed" data-fileid="25309" data-unique="4bed69a7z" src="https://academy.hsoub.com/uploads/monthly_2017_10/hybridcloud.png.28eaa3e0f0c7b3d71ab56141a9f93a1c.png"></p>

<h2>
	مكونات السحابة العامَّة
</h2>

<p>
	تتكون البنية التحتيَّة للسحابة العامة من:
</p>

<ul>
<li>
		البينة التحتيَّة كخدمة (Infrastructure as a Service) اختصارًا (IaaS): هي توفير مصادر الحوسبة مثل التخزين، والشبكات، والجدر النارية، وخدمات منع التطفل (IPS) وغيرها من الموارد؛ تُدار هذه الخدمات عبر واجهة المستخدم الرسومية (GUI) أو واجهة سطر الأوامر (CLI). يستفيد المستخدمون من هذه الخدمات بالدفع حسب استخدامهم وبذلك يوفرون شراء ودفع كامل تكاليف إنشاء وإعداد بنية تحتيَّة مخصَّصة بهم.
	</li>
	<li>
		منصة عمل كخدمة (Platform as a Service) اختصارًا (PaaS): تسمح هذه الخدمة للمستخدمين بتشغيل التطبيقات والخوادم وفحصها وتطويرها وهذا يتضمن أنظمة التشغيل والتطبيقات الوسيطة (middleware) وخواديم الويب وقواعد البيانات وغيرها. تُعرَّف هذه الخدمات على شكل نماذج مُعدَّة مسبقًا وجاهزة للعمل والاستخدام من قبل المستخدمين وقابلة للنسخ والتكرار بسهولة ويسر بدلًا من ضبطها وتهيئتها للعمل على البنية التحتيَّة يدويًا.
	</li>
	<li>
		البرمجيات كخدمة (Software as a Service) اختصارًا (SaaS): وهي خدمةٌ تتيح توفير تطبيقات عبر الإنترنت التي يمكن أن يستفيد منها المستخدمون عبر دفع رسوم اشتراك أو إنشاء حساب يتضمن مستويات متعدِّدة يدفع عبره المستخدمون بقدر حاجتهم، أو تحت رخصة ما. المزايا التي توفِّرها البرمجيات كخدمة كثيرة منها الكلفة المنخفضة، تقليل عمليات صيانة وتحديث التطبيقات، عدم الحاجة لشراء عتاد أو تطبيقات جديدة أو ترقيته لاستمرار الدعم في ظل التطور التقني المتسارع.
	</li>
</ul>
<h2>
	مكونات السحابة الخاصَّة
</h2>

<p>
	تتكون بنيتها التحتيَّة من:
</p>

<ul>
<li>
		بنية تحتيَّة كخدمة (IaaS) ومنصة عمل كخدمة (PaaS) خاصَّة: يتواجد هذان المكونان ضمن مراكز بيانات (data centers) منعزلة كما يدمجان مع سحابة عامَّة مما يتيح لهما استخدام البنية التحتية التي توفرها مراكز البيانات البعيدة؛ ويمكِّن ذلك أيضًا مالك السحابة الخاصَّة الاستفادة من البنية التحتيَّة للسحابة العامة لتوسيع التطبيقات واستخدام مواردها وشبكاتها ومساحات تخزينها ...إلخ. على نطاق عالمي.
	</li>
	<li>
		البرمجيات كخدمة (SaaS): يديرها ويتحكم بها مزودو السحابة العامة بشكل كامل؛ تبقى هذه الخدمة محصورة غالبًا ضمن السحابة العامة ولا تتشاركها مع السحابة الخاصة.
	</li>
</ul>
<h2>
	أدوات النشر المؤتمتة وأدوات أتمتة المهام الأخرى
</h2>

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

<h2>
	أدوات إدارة النظام والإعدادات
</h2>

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

<h2>
	مزايا السحابة الهجينة
</h2>

<p>
	تشكِّل السحابة الهجينة خيارًا ممتازًا لأغلبية المنظمات لما تحمله من مزايا رئيسية ومنها:
</p>

<ul>
<li>
		قابلية التوسع: تتشارك نسخ السحابة العامَّة والسحابة الخاصَّة المدمجة في السحابة الهجينة مجموعةٌ من موارد الحوسبة لكل جهاز افتراضي موجود، أي أنَّ كلَّ نسخة (instance) قادرة على التوسع رأسيًا أو أفقيًا في أي وقت عند الحاجة لذلك.
	</li>
	<li>
		سرعة في الاستجابة: تكمن مرونة السحابة الهجينة في دعمها سرعة استجابة كبيرة للأجهزة الافتراضيَّة في السحابة العامَّة عندما تتجاوز موارد السحابة الخاصَّة حدَّها المسموح، ولهذه الخاصيَّة فائدة كبيرة عندما يصل الطلب على تطبيق ما إلى أعلى مستوياته مما يؤدي إلى ازدياد الحمل عليه بدرجات متفاوتة؛ من الأمثلة على ذلك زيادة الطلب على المتاجر الإلكترونيَّة للتسوق خلال مواسم العطل.
	</li>
	<li>
		الوثوقيَّة: يمكن للمنظَّمات اختيار مزوِّد السحابة العامَّة بما يناسب احتياجاتهم اعتمادًا على السعر، والكفاءة، والأمان، وسرعة نقل البيانات ...إلخ؛ أضف إلى ذلك أنَّ بإمكان المنظَّمات في السحابة الهجينة اختيار مكان تخزين البيانات الحسَّاسة إما ضمن نسخ السحابة الخاصَّة وإما عبر توسعة البنية التحتيَّة العامَّة الخاصة بها؛ يمكن أيضًا تخزين البيانات والخدمات بتوزيعها على مواقع متعدِّدة (كنسخٍ احتياطيَّةٍ) وذلك للتأكد من توافرها دومًا والقدرة على استعادتها عند حدوث كارثة ما.
	</li>
	<li>
		الإدارة: إنَّ إدارة الشبكات والتخزين والأجهزة الافتراضيَّة والبيانات قد يكون مضجرًا في بيئات السحابة غير المدمجة. أدوات النشر المؤتمتة التقليدية بسيطةٌ جدًا، بالموازنة مع الأدوات في السحابة الهجينة، وبالتالي فهي محدودة القدرة على اتخاذ القرار وأتمتة كامل المهام والعمليات؛ تطبيقات الإدارة الفعَّالة في السحابة الهجينة تستطيع أن تتتبع المكونات والمهام كلها وتحسينها بانتظام مهما زاد حجمها وعددها وهذا قد يقلل من التكاليف السنويَّة.
	</li>
	<li>
		الأمن: يعتبر الأمن والخصوصيَّة من أهمِّ الأمور الحرجة التي تشغل بال الجميع عند اختيار موقع تخزين البيانات والتطبيقات في السحابة. يجب على قسم تكنولوجيا المعلومات (IT) التحقق دومًا من مطابقة الشروط المطلوبة وسياسات النشر. يمكن في السحابة الهجينة تخزين البيانات المهمَّة في سحابة خاصَّة بينما تخزن البيانات الاعتياديَّة أو الأقل أهمية في السحابة العامَّة ويجدر بالذكر أنَّ الأمان فيها آخذٌ في التحسن والتطور بشكل دائم.
	</li>
	<li>
		السعر: يعتمد السعر في السحابة عادةً على حجم البنية التحتيَّة والخدمات المطلوبة؛ يستطيع المستخدمون في السحابة الهجينة الموازنة بين الكلفة المدفوعة والموارد الحاسوبيَّة (المعالج والذاكرة) والسعة التخزينيَّة وسرعة نقل البيانات والشبكات وعنوان IP العام ...إلخ. بما يحتاجون له. تُدفع الكلفة شهريًا أو سنويًا أو ساعيًّا ويمكن أن تحسب بالثانية وقد تكون قيمة ثابتة أو متغيرة (السعر حسب الاستخدام) وهكذا يمكن للمستخدمين اختيار مزود السحاب الذي يقدم أفضل سعر.
	</li>
</ul>
<h2>
	ما هو موقع السحابة الهجينة هذه الأيام من بين الأنواع الأخرى
</h2>

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

<h2>
	أين سيكون موقع السحابة الهجينة بعد خمس سنوات من الآن؟
</h2>

<p>
	أتوقع أن تنتشر السحابة على المستوى العالمي في غضون بضع سنواتٍ، وستندر الحالات التي لا يعتمد فيها على خدمات السحاب؛ سأورد بعض النقاط التي أظن أننا سنراها مستقبلًا وهي:
</p>

<ul>
<li>
		سيكون هنالك تعاونٌ متزايدٌ بين الشركات ومزودي السحابة العامَّة لتحسين درجة الأمن للحد من هجمات الاختراق والتطبيقات الخبيثة وتسرُّب البيانات وسرقتها ...إلخ.
	</li>
	<li>
		سنشاهد ازديادًا كبيرًا في أداء وسرعة النُسخ السحابيَّة.
	</li>
	<li>
		سيزداد ذكاء وتطور أدوات النشر المؤتمتة وأدوات أتمتة المهام الأخرى (مثل الأداة Ansible) وستعلب دورًا مهمًا في حل المشاكل المعقدة.
	</li>
	<li>
		سينتشر المفهوم "الدفع بحسب الاستخدام" بين جميع المستخدمين ويكون أكثر وضوحًا، وستتوفر أدواتٍ تمكِّن المستخدم من اختيار النُسخ بأفضل سعر أو تساعدهم على اختيار نسخة جديدة وحذف النسخة الحالية بشكل آمن حتى يحصل المستخدم على أرخص سعر متوافر.
	</li>
</ul>
<p>
	مالذي تتوقعه حول السحابة الهجينة خصوصًا والحوسبة السحابيَّة عمومًا خلال السنوات الخمس القادمة؟ شاركنا رأيك في التعليقات.
</p>

<p>
	ترجمة -وبتصرف- للمقال <a href="https://opensource.com/article/17/7/what-is-hybrid-cloud" rel="external nofollow">What you need to know about hybrid cloud</a> لصاحبه Amit Das.
</p>

<p>
	حقوق الصورة البارزة محفوظة لـ <a href="http://www.freepik.com/free-vector/clouds-background_891714.htm" rel="external nofollow">Freepik</a>
</p>
]]></description><guid isPermaLink="false">358</guid><pubDate>Mon, 23 Oct 2017 21:02:23 +0000</pubDate></item><item><title>&#x643;&#x64A;&#x641;&#x64A;&#x629; &#x636;&#x628;&#x637; vsftpd &#x641;&#x64A; &#x623;&#x648;&#x628;&#x646;&#x62A;&#x648; 16.04</title><link>https://academy.hsoub.com/devops/servers/%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%B6%D8%A8%D8%B7-vsftpd-%D9%81%D9%8A-%D8%A3%D9%88%D8%A8%D9%86%D8%AA%D9%88-1604-r354/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2017_10/59dccfd6dac9d_main(77).png.0df17d315a74d9a77e317a043cd40a18.png" /></p>

<p>
	بروتوكول نقل الملفات FTP (اختصار للعبارة File Transfer Protocol) هو بروتوكول شبكي كان شائعًا جدًا فيما قد سلف لنقل الملفات بين الخادوم والعميل، لكن استبدلته الطرائق الأكثر أمانًا وسرعةً لنقل الملفات، فكثيرٌ من مستخدمي الإنترنت يتوقعون تنزيل الملفات مباشرةً من متصفح الويب عبر بروتوكول http (أو https)، أما مستخدمي سطر الأوامر فيستعملون بروتوكولات أكثر أمانًا مثل <code>scp</code> أو <a href="https://www.digitalocean.com/community/tutorials/how-to-use-sftp-to-securely-transfer-files-with-a-remote-server" rel="external nofollow">sFTP</a>.<br>
	لكن ما يزال بروتوكول FTP مستخدمًا في التطبيقات القديمة أو للحالات التي لها متطلبات خاصة، فلو كنتَ تستطيع اختيار ما هو البروتوكول الذي ستستخدمه، فأنصحك بالنظر في بقية الخيارات الحديثة؛ لكن إذا كنت تحتاج إلى استخدام FTP فخادوم vsftpd هو خيارٌ ممتازٌ إذ إنَّ أداءه ممتاز وآمن ومستقر، ويوفِّر قدرًا كبيرًا من الحماية ضد كثيرٍ من المشاكل الأمنية الموجودة في خودايم FTP الأخرى، إضافةً إلى أنه الخادوم الافتراضي لخدمة FTP للعديد من توزيعات لينكس.<br>
	سنتعلم في هذا الدرس كيفية ضبط خادوم vsftpd للسماح للمستخدمين برفع ملفاتهم إلى مجلد المنزل الخاص بهم باستخدام بروتوكول FTP مع تأمين معلومات الدخول عبر تشفير <abbr title="Secure Socket Layer | طبقة المنافذ الآمنة">SSL</abbr>/<abbr title="Transport Layer Security | بروتوكول أمن طبقة النقل">TLS</abbr>.
</p>

<h2 id="المتطلبات-المسبقة">
	المتطلبات المسبقة
</h2>

<ul>
<li>
		خادوم أوبنتو 16.04 مع وصول إلى مستخدم يملك امتيازات الجذر عبر الأمر <code>sudo</code>: إذ سنُطبِّق الأوامر المذكورة في هذا الدرس عبر مستخدمٍ ليس جذرًا لكنه يمتلك امتيازات الجذر عبر الأمر <code>sudo</code>. يمكنك إنشاء مستخدم له امتيازات الجذر باستخدام الأمر <code>sudo</code> باتباع درس «الإعداد الابتدائي لخادوم أوبنتو 14.04](<a href="https://academy.hsoub.com/devops/servers/" rel="">https://academy.hsoub.com/devops/servers/</a>الإعداد-الابتدائي-لخادوم-أوبنتو-1404-r4/)».<br>
		يمكننا أن نبدأ بتطبيق هذا الدرس بعد أن يكون الخادوم جاهزًا.
	</li>
</ul>
<h2 id="الخطوة-الأولى-تثبيت-vsftpd">
	الخطوة الأولى: تثبيت vsftpd
</h2>

<p>
	سنبدأ بتحديث فهرس الحزم في خادومنا ثم تثبيت خادوم vsftpd:
</p>

<pre class="ipsCode" id="ips_uid_1168_7">
sudo apt-get update
sudo apt-get install vsftpd</pre>

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

<pre class="ipsCode" id="ips_uid_1168_7">
<code class="hljs avrasm"><span class="pln">sudo </span><span class="hljs-keyword"><span class="pln">cp</span></span><span class="pln"> </span><span class="pun">/</span><span class="pln">etc</span><span class="pun">/</span><span class="pln">vsftpd</span><span class="hljs-preprocessor"><span class="pun">.</span><span class="pln">conf</span></span><span class="pun">{,</span><span class="hljs-preprocessor"><span class="pun">.</span><span class="pln">orig</span></span><span class="pun">}</span></code></pre>

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

<h2 id="الخطوة-الثانية-فتح-المنافذ-الضرورية-في-الجدار-الناري">
	الخطوة الثانية: فتح المنافذ الضرورية في الجدار الناري
</h2>

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

<pre class="ipsCode" id="ips_uid_1168_7">
<code class="hljs bash"><span class="hljs-built_in"><span class="pln">sudo</span></span><span class="pln"> ufw status</span></code></pre>

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

<pre class="ipsCode" id="ips_uid_1168_7">
<code class="hljs http"><span class="hljs-attribute"><span class="typ">Status</span></span><span class="pun">:</span><span class="pln"> </span><span class="hljs-string"><span class="pln">active</span></span><span class="pln">

</span><span class="brainfuck"><span class="hljs-comment"><span class="typ">To</span></span><span class="pln"> </span><span class="hljs-comment"><span class="typ">Action</span></span><span class="pln">  </span><span class="hljs-comment"><span class="typ">From</span></span><span class="pln">
</span><span class="hljs-literal"><span class="pun">-</span></span><span class="hljs-literal"><span class="pun">-</span></span><span class="pln"> </span><span class="hljs-literal"><span class="pun">-</span></span><span class="hljs-literal"><span class="pun">-</span></span><span class="hljs-literal"><span class="pun">-</span></span><span class="hljs-literal"><span class="pun">-</span></span><span class="hljs-literal"><span class="pun">-</span></span><span class="hljs-literal"><span class="pun">-</span></span><span class="pln">  </span><span class="hljs-literal"><span class="pun">-</span></span><span class="hljs-literal"><span class="pun">-</span></span><span class="hljs-literal"><span class="pun">-</span></span><span class="hljs-literal"><span class="pun">-</span></span><span class="pln">
</span><span class="hljs-comment"><span class="typ">OpenSSH</span></span><span class="pln"> </span><span class="hljs-comment"><span class="pln">ALLOW</span></span><span class="pln">   </span><span class="hljs-comment"><span class="typ">Anywhere</span></span><span class="pln">
</span><span class="hljs-comment"><span class="typ">OpenSSH</span></span><span class="pln"> </span><span class="hljs-comment"><span class="pun">(</span><span class="pln">v6</span><span class="pun">)</span></span><span class="pln">   </span><span class="hljs-comment"><span class="pln">ALLOW</span></span><span class="pln">   </span><span class="hljs-comment"><span class="typ">Anywhere</span></span><span class="pln"> </span><span class="hljs-comment"><span class="pun">(</span><span class="pln">v6</span><span class="pun">)</span></span></span></code></pre>

<p>
	لاحظ أنَّ الناتج قد يكون مختلفًا عندك، فقد لا توجد أيّة قواعد لجدارك الناري أو لديك قواعد إضافية.<br>
	ولمّا كان الجدار الناري لا يسمح إلا لاتصالات <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr> فعلينا إضافة قواعد للسماح لاتصالات FTP، وسنحتاج إلى فتح المنفذين 20 و 21 لخدمة FTP، والمنفذ 990 لنستعمله لاحقًا عندما نضبط تشفير <abbr title="Transport Layer Security | بروتوكول أمن طبقة النقل">TLS</abbr>، والمنافذ من 40000 إلى 50000 كمنافذ غير المباشرة (passive ports) التي نخطط لضبطها لاحقًا في ملف الضبط:
</p>

<pre class="ipsCode" id="ips_uid_1168_7">
<code class="hljs bash"><span class="hljs-built_in"><span class="pln">sudo</span></span><span class="pln"> ufw allow </span><span class="hljs-number"><span class="lit">20</span></span><span class="pun">/</span><span class="pln">tcp
</span><span class="hljs-built_in"><span class="pln">sudo</span></span><span class="pln"> ufw allow </span><span class="hljs-number"><span class="lit">21</span></span><span class="pun">/</span><span class="pln">tcp
</span><span class="hljs-built_in"><span class="pln">sudo</span></span><span class="pln"> ufw allow </span><span class="hljs-number"><span class="lit">990</span></span><span class="pun">/</span><span class="pln">tcp
</span><span class="hljs-built_in"><span class="pln">sudo</span></span><span class="pln"> ufw allow </span><span class="hljs-number"><span class="lit">40000</span></span><span class="pun">:</span><span class="hljs-number"><span class="lit">50000</span></span><span class="pun">/</span><span class="pln">tcp
</span><span class="hljs-built_in"><span class="pln">sudo</span></span><span class="pln"> ufw status</span></code></pre>

<p>
	يجب أن تبدو قواعد الجدار الناري كما يلي:
</p>

<pre class="ipsCode" id="ips_uid_1168_7">
<code class="hljs http"><span class="hljs-attribute"><span class="typ">Status</span></span><span class="pun">:</span><span class="pln"> </span><span class="hljs-string"><span class="pln">active</span></span><span class="pln">

</span><span class="erlang"><span class="hljs-variable"><span class="typ">To</span></span><span class="pln">                         </span><span class="hljs-variable"><span class="typ">Action</span></span><span class="pln">      </span><span class="hljs-variable"><span class="typ">From</span></span><span class="pln">
</span><span class="hljs-pp"><span class="pun">--</span><span class="pln">                         </span><span class="pun">------</span><span class="pln">      </span><span class="pun">----</span><span class="pln">
</span><span class="typ">OpenSSH</span><span class="pln">                    ALLOW       </span><span class="typ">Anywhere</span><span class="pln">
</span><span class="lit">990</span><span class="pun">/</span><span class="pln">tcp                    ALLOW       </span><span class="typ">Anywhere</span><span class="pln">
</span><span class="lit">20</span><span class="pun">/</span><span class="pln">tcp                     ALLOW       </span><span class="typ">Anywhere</span><span class="pln">
</span><span class="lit">21</span><span class="pun">/</span><span class="pln">tcp                     ALLOW       </span><span class="typ">Anywhere</span><span class="pln">
</span><span class="lit">40000</span><span class="pun">:</span><span class="lit">50000</span><span class="pun">/</span><span class="pln">tcp            ALLOW       </span><span class="typ">Anywhere</span><span class="pln">
</span><span class="typ">OpenSSH</span><span class="pln"> </span><span class="hljs-params"><span class="pun">(</span><span class="pln">v6</span><span class="pun">)</span></span><span class="pln">               ALLOW       </span><span class="typ">Anywhere</span><span class="pln"> </span><span class="hljs-params"><span class="pun">(</span><span class="pln">v6</span><span class="pun">)</span></span><span class="pln">
</span><span class="lit">20</span><span class="pun">/</span><span class="pln">tcp </span><span class="hljs-params"><span class="pun">(</span><span class="pln">v6</span><span class="pun">)</span></span><span class="pln">                ALLOW       </span><span class="typ">Anywhere</span><span class="pln"> </span><span class="hljs-params"><span class="pun">(</span><span class="pln">v6</span><span class="pun">)</span></span><span class="pln">
</span><span class="lit">21</span><span class="pun">/</span><span class="pln">tcp </span><span class="hljs-params"><span class="pun">(</span><span class="pln">v6</span><span class="pun">)</span></span><span class="pln">                ALLOW       </span><span class="typ">Anywhere</span><span class="pln"> </span><span class="hljs-params"><span class="pun">(</span><span class="pln">v6</span><span class="pun">)</span></span><span class="pln">
</span><span class="lit">990</span><span class="pun">/</span><span class="pln">tcp </span><span class="hljs-params"><span class="pun">(</span><span class="pln">v6</span><span class="pun">)</span></span><span class="pln">               ALLOW       </span><span class="typ">Anywhere</span><span class="pln"> </span><span class="hljs-params"><span class="pun">(</span><span class="pln">v6</span><span class="pun">)</span></span><span class="pln">
</span><span class="lit">40000</span><span class="pun">:</span><span class="lit">50000</span><span class="pun">/</span><span class="pln">tcp </span><span class="hljs-params"><span class="pun">(</span><span class="pln">v6</span><span class="pun">)</span></span><span class="pln">       ALLOW       </span><span class="typ">Anywhere</span><span class="pln"> </span><span class="hljs-params"><span class="pun">(</span><span class="pln">v6</span><span class="pun">)</span></span></span></span></code></pre>

<p>
	يمكننا الانتقال إلى الخطوة التالية بعد تثبيتنا لخادوم vsftpd وفتح المنافذ الضرورية.
</p>

<h2 id="الخطوة-الثالثة-تهيئة-مجلد-المنزل-للمستخدم">
	الخطوة الثالثة: تهيئة مجلد المنزل للمستخدم
</h2>

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

<pre class="ipsCode" id="ips_uid_1168_7">
<code class="hljs bash"><span class="hljs-built_in"><span class="pln">sudo</span></span><span class="pln"> adduser sammy</span></code></pre>

<p>
	أسنِد كلمة المرور إلى الحساب عند طلبها، ويمكنك تجاهل بقية الأسئلة بالضغط على زر Enter.<br>
	تكون خدمة FTP أكثر أمانًا إذا كان المستخدمون محدودين بمجلدٍ معيّن، ويمكن لخادوم vsftpd فعل ذلك باستخدام <code>chroot</code>، فعند تفعيل <code>chroot</code> للمستخدمين المحليين، فلن يسمح لهم بالوصول إلى شيءٍ خارج مجلد المنزل الخاص بهم افتراضيًا، لكن خادوم vsftpd يحاول تأمين المجلد بعدم السماح بالكتابة عليه من قبل المستخدم (عبر سطر الأوامر)، ولا بأس بذلك للمستخدمين الجدد الذين يجب أن يتصلوا عبر FTP فقط، لكن إذا كان لدينا مستخدم موجود مسبقًا ويجب أن يستطيع الكتابة إلى مجلد المنزل الخاص به عبر سطر الأوامر فهذا لن يكون مناسبًا أبدًا.<br>
	وبدلًا من إزالة إذن الكتابة من مجلد المنزل، فسنُنشِئ مجلد <code>ftp</code> لكي يكون <code>chroot</code> وسنُنشِئ داخله مجلد <code>files</code> يمكن الكتابة عليه ليحتوي على الملفات.<br>
	لنُنشِئ مجلد <code>ftp</code> ونضبط ملكيته ونحذف إذن الكتابة منه بالأوامر الآتية:
</p>

<pre class="ipsCode" id="ips_uid_1168_7">
<code class="hljs livecodeserver"><span class="pln">sudo mkdir </span><span class="pun">/</span><span class="pln">home</span><span class="pun">/</span><span class="pln">sammy</span><span class="pun">/</span><span class="hljs-keyword"><span class="pln">ftp</span></span><span class="pln">
sudo chown nobody</span><span class="pun">:</span><span class="pln">nogroup </span><span class="pun">/</span><span class="pln">home</span><span class="pun">/</span><span class="pln">sammy</span><span class="pun">/</span><span class="hljs-keyword"><span class="pln">ftp</span></span><span class="pln">
sudo chmod </span><span class="hljs-operator"><span class="pln">a</span></span><span class="pun">-</span><span class="pln">w </span><span class="pun">/</span><span class="pln">home</span><span class="pun">/</span><span class="pln">sammy</span><span class="pun">/</span><span class="hljs-keyword"><span class="pln">ftp</span></span></code></pre>

<p>
	لنتأكد من الأذونات:
</p>

<pre class="ipsCode" id="ips_uid_1168_7">
<code class="hljs bash"><span class="hljs-built_in"><span class="pln">sudo</span></span><span class="pln"> ls </span><span class="pun">-</span><span class="pln">la </span><span class="pun">/</span><span class="pln">home</span><span class="pun">/</span><span class="pln">sammy</span><span class="pun">/</span><span class="pln">ftp</span></code></pre>

<p>
	الناتج:
</p>

<pre class="ipsCode" id="ips_uid_1168_7">
<code class="hljs lasso"><span class="pln">total </span><span class="hljs-number"><span class="lit">8</span></span><span class="pln">
</span><span class="hljs-number"><span class="lit">4</span></span><span class="pln"> dr</span><span class="hljs-attribute"><span class="pun">-</span><span class="pln">xr</span></span><span class="hljs-attribute"><span class="pun">-</span><span class="pln">xr</span></span><span class="hljs-attribute"><span class="pun">-</span><span class="pln">x</span></span><span class="pln">  </span><span class="hljs-number"><span class="lit">2</span></span><span class="pln"> nobody nogroup </span><span class="hljs-number"><span class="lit">4096</span></span><span class="pln"> </span><span class="typ">Aug</span><span class="pln"> </span><span class="hljs-number"><span class="lit">24</span></span><span class="pln"> </span><span class="hljs-number"><span class="lit">21</span></span><span class="pun">:</span><span class="hljs-number"><span class="lit">29</span></span><span class="pln"> </span><span class="hljs-built_in"><span class="pun">.</span></span><span class="pln">
</span><span class="hljs-number"><span class="lit">4</span></span><span class="pln"> drwxr</span><span class="hljs-attribute"><span class="pun">-</span><span class="pln">xr</span></span><span class="hljs-attribute"><span class="pun">-</span><span class="pln">x</span></span><span class="pln"> </span><span class="hljs-number"><span class="lit">3</span></span><span class="pln"> sammy  sammy   </span><span class="hljs-number"><span class="lit">4096</span></span><span class="pln"> </span><span class="typ">Aug</span><span class="pln"> </span><span class="hljs-number"><span class="lit">24</span></span><span class="pln"> </span><span class="hljs-number"><span class="lit">21</span></span><span class="pun">:</span><span class="hljs-number"><span class="lit">29</span></span><span class="pln"> </span><span class="hljs-built_in"><span class="pun">..</span></span></code></pre>

<p>
	لنُنشِئ الآن المجلد الذي يحتوي على الملفات التي ستُرفَع ونضبط ملكيته إلى المستخدم:
</p>

<pre class="ipsCode" id="ips_uid_1168_7">
<code class="hljs livecodeserver"><span class="pln">sudo mkdir </span><span class="pun">/</span><span class="pln">home</span><span class="pun">/</span><span class="pln">sammy</span><span class="pun">/</span><span class="hljs-keyword"><span class="pln">ftp</span></span><span class="pun">/</span><span class="hljs-built_in"><span class="pln">files</span></span><span class="pln">
sudo chown sammy</span><span class="pun">:</span><span class="pln">sammy </span><span class="pun">/</span><span class="pln">home</span><span class="pun">/</span><span class="pln">sammy</span><span class="pun">/</span><span class="hljs-keyword"><span class="pln">ftp</span></span><span class="pun">/</span><span class="hljs-built_in"><span class="pln">files</span></span></code></pre>

<p>
	لنتحقق أيضًا من أذونات المجلد <code>files</code>:
</p>

<pre class="ipsCode" id="ips_uid_1168_7">
<code class="hljs bash"><span class="hljs-built_in"><span class="pln">sudo</span></span><span class="pln"> ls </span><span class="pun">-</span><span class="pln">la </span><span class="pun">/</span><span class="pln">home</span><span class="pun">/</span><span class="pln">sammy</span><span class="pun">/</span><span class="pln">ftp</span></code></pre>

<p>
	الناتج:
</p>

<pre class="ipsCode" id="ips_uid_1168_7">
<code class="hljs lasso"><span class="pln">total </span><span class="hljs-number"><span class="lit">12</span></span><span class="pln">
dr</span><span class="hljs-attribute"><span class="pun">-</span><span class="pln">xr</span></span><span class="hljs-attribute"><span class="pun">-</span><span class="pln">xr</span></span><span class="hljs-attribute"><span class="pun">-</span><span class="pln">x</span></span><span class="pln"> </span><span class="hljs-number"><span class="lit">3</span></span><span class="pln"> nobody nogroup </span><span class="hljs-number"><span class="lit">4096</span></span><span class="pln"> </span><span class="typ">Aug</span><span class="pln"> </span><span class="hljs-number"><span class="lit">26</span></span><span class="pln"> </span><span class="hljs-number"><span class="lit">14</span></span><span class="pun">:</span><span class="hljs-number"><span class="lit">01</span></span><span class="pln"> </span><span class="hljs-built_in"><span class="pun">.</span></span><span class="pln">
drwxr</span><span class="hljs-attribute"><span class="pun">-</span><span class="pln">xr</span></span><span class="hljs-attribute"><span class="pun">-</span><span class="pln">x</span></span><span class="pln"> </span><span class="hljs-number"><span class="lit">3</span></span><span class="pln"> sammy  sammy   </span><span class="hljs-number"><span class="lit">4096</span></span><span class="pln"> </span><span class="typ">Aug</span><span class="pln"> </span><span class="hljs-number"><span class="lit">26</span></span><span class="pln"> </span><span class="hljs-number"><span class="lit">13</span></span><span class="pun">:</span><span class="hljs-number"><span class="lit">59</span></span><span class="pln"> </span><span class="hljs-built_in"><span class="pun">..</span></span><span class="pln">
drwxr</span><span class="hljs-attribute"><span class="pun">-</span><span class="pln">xr</span></span><span class="hljs-attribute"><span class="pun">-</span><span class="pln">x</span></span><span class="pln"> </span><span class="hljs-number"><span class="lit">2</span></span><span class="pln"> sammy  sammy   </span><span class="hljs-number"><span class="lit">4096</span></span><span class="pln"> </span><span class="typ">Aug</span><span class="pln"> </span><span class="hljs-number"><span class="lit">26</span></span><span class="pln"> </span><span class="hljs-number"><span class="lit">14</span></span><span class="pun">:</span><span class="hljs-number"><span class="lit">01</span></span><span class="pln"> files</span></code></pre>

<p>
	وفي النهاية، لنضف ملفًا باسم <code>test.txt</code> لكي نستخدمه عند التجربة لاحقًا:
</p>

<pre class="ipsCode" id="ips_uid_1168_7">
<code class="hljs bash"><span class="hljs-built_in"><span class="pln">echo</span></span><span class="pln"> </span><span class="hljs-string"><span class="str">"vsftpd test file"</span></span><span class="pln"> </span><span class="pun">|</span><span class="pln"> </span><span class="hljs-built_in"><span class="pln">sudo</span></span><span class="pln"> tee </span><span class="pun">/</span><span class="pln">home</span><span class="pun">/</span><span class="pln">sammy</span><span class="pun">/</span><span class="pln">ftp</span><span class="pun">/</span><span class="pln">files</span><span class="pun">/</span><span class="pln">test</span><span class="pun">.</span><span class="pln">txt</span></code></pre>

<p>
	بعد أن أصبح مجلد <code>ftp</code> آمنًا، وأعطينا المستخدم الأذونات اللازمة على مجلد <code>files</code>، فيمكننا الاهتمام الآن بموضوع الضبط.
</p>

<h2 id="الخطوة-الرابعة-ضبط-وصول-ftp">
	الخطوة الرابعة: ضبط وصول FTP
</h2>

<p>
	خطتنا هي السماح للمستخدم الذي يملك وصولًا محليًا إلى سطر الأوامر بالاتصال عبر FTP، وهنالك خيارا ضبط رئيسيان مضبوطان في ملف <code>vsftpd.conf</code>. لنبدأ أولًا بفتح ملف الضبط للتأكد أنَّ التعليمات المذكورة فيه تُطابِق ما يلي:
</p>

<pre class="ipsCode" id="ips_uid_1168_7">
<code class="hljs bash"><span class="hljs-built_in"><span class="pln">sudo</span></span><span class="pln"> nano </span><span class="pun">/</span><span class="pln">etc</span><span class="pun">/</span><span class="pln">vsftpd</span><span class="pun">.</span><span class="pln">conf</span></code></pre>

<p>
	محتوى الملف:
</p>

<pre class="ipsCode" id="ips_uid_1168_7">
<code class="hljs vala"><span class="pun">.</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> </span><span class="pun">.</span><span class="pln">
</span><span class="hljs-preprocessor"><span class="com"># Allow anonymous FTP? (Disabled by default).</span></span><span class="pln">
anonymous_enable</span><span class="pun">=</span><span class="pln">NO
</span><span class="hljs-preprocessor"><span class="com">#</span></span><span class="pln">
</span><span class="hljs-preprocessor"><span class="com"># Uncomment this to allow local users to log in.</span></span><span class="pln">
local_enable</span><span class="pun">=</span><span class="pln">YES
</span><span class="pun">.</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> </span><span class="pun">.</span></code></pre>

<p>
	علينا الآن تغيير بعض القيم في الملف، ولكي نسمح للمستخدم برفع الملفات فسنزيل رمز التعليق قبل التعليمة <code>write_enable</code> لكي يصبح السطر كما يلي:
</p>

<pre class="ipsCode" id="ips_uid_1168_7">
<code class="hljs fix"><span class="hljs-attribute"><span class="pun">.</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> </span><span class="pun">.</span><span class="pln">
write_enable</span></span><span class="pun">=</span><span class="hljs-string"><span class="pln">YES
</span><span class="pun">.</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> </span><span class="pun">.</span></span></code></pre>

<p>
	سنُزيل رمز التعليق قبل التعليمة <code>chroot_local_user</code> لمنع المستخدم الذي يتصل عبر FTP من الوصول إلى أيّة ملفات خارج المجلد المضبوط:
</p>

<pre class="ipsCode" id="ips_uid_1168_7">
<code class="hljs asciidoc"><span class="hljs-bullet"><span class="pun">.</span><span class="pln"> </span></span><span class="pun">.</span><span class="pln"> </span><span class="pun">.</span><span class="pln">
chroot</span><span class="hljs-emphasis"><span class="pln">_local_</span></span><span class="pln">user</span><span class="pun">=</span><span class="pln">YES
</span><span class="hljs-bullet"><span class="pun">.</span><span class="pln"> </span></span><span class="pun">.</span><span class="pln"> </span><span class="pun">.</span></code></pre>

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

<pre class="ipsCode" id="ips_uid_1168_7">
<code class="hljs ruby"><span class="pln">user_sub_token</span><span class="pun">=</span><span class="hljs-variable"><span class="pln">$USER</span></span><span class="pln">
local_root</span><span class="pun">=</span><span class="hljs-regexp"><span class="str">/home/</span></span><span class="hljs-variable"><span class="pln">$USER</span></span><span class="pun">/</span><span class="pln">ftp</span></code></pre>

<p>
	سنُحدِّد مجال المنافذ المستخدم لاتصالات FTP غير المباشرة (passive FTP) لكي نحرص على توافر اتصالات كافية:
</p>

<pre class="ipsCode" id="ips_uid_1168_7">
<code class="hljs ini"><span class="hljs-setting"><span class="pln">pasv_min_port</span><span class="pun">=</span><span class="hljs-value"><span class="hljs-number"><span class="lit">40000</span></span></span></span><span class="pln">
</span><span class="hljs-setting"><span class="pln">pasv_max_port</span><span class="pun">=</span><span class="hljs-value"><span class="hljs-number"><span class="lit">50000</span></span></span></span></code></pre>

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

<pre class="ipsCode" id="ips_uid_1168_7">
<code class="hljs ini"><span class="hljs-setting"><span class="pln">userlist_enable</span><span class="pun">=</span><span class="hljs-value"><span class="hljs-keyword"><span class="pln">YES</span></span></span></span><span class="pln">
</span><span class="hljs-setting"><span class="pln">userlist_file</span><span class="pun">=</span><span class="hljs-value"><span class="str">/etc/</span><span class="pln">vsftpd</span><span class="pun">.</span><span class="pln">userlist</span></span></span><span class="pln">
</span><span class="hljs-setting"><span class="pln">userlist_deny</span><span class="pun">=</span><span class="hljs-value"><span class="hljs-keyword"><span class="pln">NO</span></span></span></span></code></pre>

<p>
	التعليمة <code>userlist_deny</code> تُحدِّد ما الذي يجب فعله مع المستخدمين المذكورين في القائمة، فلو ضُبِطَت إلى <code>YES</code> فسيمنعون من الوصول إلى FTP، وإذا كانت <code>NO</code> فلن يسمح بالوصول إلى FTP إلا للمستخدمين المذكورين في القائمة. بعد أن تنتهي من إضافة الأسطر السابق فاحفظ الملف واخرج من المحرر النصي.<br>
	علينا الآن إنشاء ملف القائمة وإضافة اسم المستخدم إليه، يمكننا استخدام الخيار <code>‎-a</code> الخاص بالأمر <code>tee</code> لإسناد السطر إلى نهاية الملف:
</p>

<pre class="ipsCode" id="ips_uid_1168_7">
<code class="hljs bash"><span class="hljs-built_in"><span class="pln">echo</span></span><span class="pln"> </span><span class="hljs-string"><span class="str">"sammy"</span></span><span class="pln"> </span><span class="pun">|</span><span class="pln"> </span><span class="hljs-built_in"><span class="pln">sudo</span></span><span class="pln"> tee </span><span class="hljs-operator"><span class="pun">-</span><span class="pln">a</span></span><span class="pln"> </span><span class="pun">/</span><span class="pln">etc</span><span class="pun">/</span><span class="pln">vsftpd</span><span class="pun">.</span><span class="pln">userlist</span></code></pre>

<p>
	لنتأكد من محتوى الملف:
</p>

<pre class="ipsCode" id="ips_uid_1168_7">
<code class="hljs avrasm"><span class="pln">cat </span><span class="pun">/</span><span class="pln">etc</span><span class="pun">/</span><span class="pln">vsftpd</span><span class="hljs-preprocessor"><span class="pun">.</span><span class="pln">userlist</span></span></code></pre>

<p>
	الناتج:
</p>

<pre class="ipsCode" id="ips_uid_1168_7">
<code class="hljs "><span class="pln">sammy</span></code></pre>

<p>
	أعد تشغيل الخادوم لتطبيق التغييرات التي أجريناها في ملف الضبط:
</p>

<pre class="ipsCode" id="ips_uid_1168_7">
<code class="hljs bash"><span class="hljs-built_in"><span class="pln">sudo</span></span><span class="pln"> systemctl restart vsftpd</span></code></pre>

<p>
	نحن جاهزون الآن للتجربة.
</p>

<h2 id="الخطوة-الخامسة-تجربة-الوصول-إلى-ftp">
	الخطوة الخامسة: تجربة الوصول إلى FTP
</h2>

<p>
	ضبطنا الخادوم للسماح للمستخدم <code>sammy</code> فقط بالوصول إلى FTP، لنتأكد من صحة ذلك.<br>
	يجب ألّا يُسمَح للاتصال من المستخدمين المجهولين (anonymous users)، إذ عطلنا ذلك في الضبط، وسنجرِّب ذلك بمحاولة الاتصال بشكل مجهول، فإذا كان ضبطنا صحيحٌ فيجب ألّا يسمح لنا بالوصول إلى الخادوم:
</p>

<pre class="ipsCode" id="ips_uid_1168_7">
<code class="hljs livecodeserver"><span class="hljs-keyword"><span class="pln">ftp</span></span><span class="pln"> </span><span class="pun">-</span><span class="pln">p </span><span class="hljs-number"><span class="lit">203.0</span></span><span class="hljs-number"><span class="pun">.</span><span class="lit">113</span></span><span class="hljs-number"><span class="lit">.0</span></span></code></pre>

<p>
	الناتج:
</p>

<pre class="ipsCode" id="ips_uid_1168_7">
<code class="hljs fsharp"><span class="typ">Connected</span><span class="pln"> </span><span class="hljs-keyword"><span class="pln">to</span></span><span class="pln"> </span><span class="hljs-number"><span class="lit">203.0</span></span><span class="hljs-number"><span class="pun">.</span><span class="lit">113</span></span><span class="hljs-number"><span class="lit">.0</span></span><span class="pun">.</span><span class="pln">
</span><span class="hljs-number"><span class="lit">220</span></span><span class="pln"> </span><span class="pun">(</span><span class="pln">vsFTPd </span><span class="hljs-number"><span class="lit">3.0</span></span><span class="hljs-number"><span class="pun">.</span><span class="lit">3</span></span><span class="pun">)</span><span class="pln">
</span><span class="typ">Name</span><span class="pln"> </span><span class="pun">(</span><span class="hljs-number"><span class="lit">203.0</span></span><span class="hljs-number"><span class="pun">.</span><span class="lit">113</span></span><span class="hljs-number"><span class="lit">.0</span></span><span class="pun">:</span><span class="hljs-keyword"><span class="kwd">default</span></span><span class="pun">):</span><span class="pln"> anonymous
</span><span class="hljs-number"><span class="lit">530</span></span><span class="pln"> </span><span class="typ">Permission</span><span class="pln"> denied</span><span class="pun">.</span><span class="pln">
ftp</span><span class="pun">:</span><span class="pln"> </span><span class="typ">Login</span><span class="pln"> failed</span><span class="pun">.</span><span class="pln">
</span><span class="typ">Ftp</span><span class="pun">&gt;</span></code></pre>

<p>
	أغلِق الاتصال:
</p>

<pre class="ipsCode" id="ips_uid_1168_7">
<code class="hljs "><span class="pln">bye</span></code></pre>

<p>
	يجب ألّا يتمكن أيّ مستخدمٍ عدا <code>sammy</code> من الاتصال: وسنتحقق من ذلك عبر وضع اسم المستخدم الذي يملك امتيازات الجذر، ويجب ألّا يُسمَح له أيضًا قبل أن يُطلَب منه إدخال كلمة المرور:
</p>

<pre class="ipsCode" id="ips_uid_1168_7">
<code class="hljs livecodeserver"><span class="hljs-keyword"><span class="pln">ftp</span></span><span class="pln"> </span><span class="pun">-</span><span class="pln">p </span><span class="hljs-number"><span class="lit">203.0</span></span><span class="hljs-number"><span class="pun">.</span><span class="lit">113</span></span><span class="hljs-number"><span class="lit">.0</span></span></code></pre>

<p>
	الناتج:
</p>

<pre class="ipsCode" id="ips_uid_1168_7">
<code class="hljs fsharp"><span class="typ">Connected</span><span class="pln"> </span><span class="hljs-keyword"><span class="pln">to</span></span><span class="pln"> </span><span class="hljs-number"><span class="lit">203.0</span></span><span class="hljs-number"><span class="pun">.</span><span class="lit">113</span></span><span class="hljs-number"><span class="lit">.0</span></span><span class="pun">.</span><span class="pln">
</span><span class="hljs-number"><span class="lit">220</span></span><span class="pln"> </span><span class="pun">(</span><span class="pln">vsFTPd </span><span class="hljs-number"><span class="lit">3.0</span></span><span class="hljs-number"><span class="pun">.</span><span class="lit">3</span></span><span class="pun">)</span><span class="pln">
</span><span class="typ">Name</span><span class="pln"> </span><span class="pun">(</span><span class="hljs-number"><span class="lit">203.0</span></span><span class="hljs-number"><span class="pun">.</span><span class="lit">113</span></span><span class="hljs-number"><span class="lit">.0</span></span><span class="pun">:</span><span class="hljs-keyword"><span class="kwd">default</span></span><span class="pun">):</span><span class="pln"> sudo_user
</span><span class="hljs-number"><span class="lit">530</span></span><span class="pln"> </span><span class="typ">Permission</span><span class="pln"> denied</span><span class="pun">.</span><span class="pln">
ftp</span><span class="pun">:</span><span class="pln"> </span><span class="typ">Login</span><span class="pln"> failed</span><span class="pun">.</span><span class="pln">
</span><span class="typ">Ftp</span><span class="pun">&gt;</span></code></pre>

<p>
	أغلِق الاتصال:
</p>

<pre class="ipsCode" id="ips_uid_1168_7">
<code class="hljs "><span class="pln">bye</span></code></pre>

<p>
	يجب أن يتمكن المستخدم <code>sammy</code> من الاتصال، ومن قراءة وكتابة الملفات، لذا لنجرِّب ذلك:
</p>

<pre class="ipsCode" id="ips_uid_1168_7">
<code class="hljs livecodeserver"><span class="hljs-keyword"><span class="pln">ftp</span></span><span class="pln"> </span><span class="pun">-</span><span class="pln">p </span><span class="hljs-number"><span class="lit">203.0</span></span><span class="hljs-number"><span class="pun">.</span><span class="lit">113</span></span><span class="hljs-number"><span class="lit">.0</span></span></code></pre>

<p>
	الناتج:
</p>

<pre class="ipsCode" id="ips_uid_1168_7">
<code class="hljs vbnet"><span class="typ">Connected</span><span class="pln"> </span><span class="hljs-keyword"><span class="pln">to</span></span><span class="pln"> </span><span class="hljs-number"><span class="lit">203.0</span></span><span class="hljs-number"><span class="pun">.</span><span class="lit">113</span></span><span class="hljs-number"><span class="lit">.0</span></span><span class="pun">.</span><span class="pln">
</span><span class="hljs-number"><span class="lit">220</span></span><span class="pln"> </span><span class="pun">(</span><span class="pln">vsFTPd </span><span class="hljs-number"><span class="lit">3.0</span></span><span class="hljs-number"><span class="pun">.</span><span class="lit">3</span></span><span class="pun">)</span><span class="pln">
</span><span class="typ">Name</span><span class="pln"> </span><span class="pun">(</span><span class="hljs-number"><span class="lit">203.0</span></span><span class="hljs-number"><span class="pun">.</span><span class="lit">113</span></span><span class="hljs-number"><span class="lit">.0</span></span><span class="pun">:</span><span class="hljs-keyword"><span class="kwd">default</span></span><span class="pun">):</span><span class="pln"> sammy
</span><span class="hljs-number"><span class="lit">331</span></span><span class="pln"> </span><span class="typ">Please</span><span class="pln"> specify the password</span><span class="pun">.</span><span class="pln">
</span><span class="typ">Password</span><span class="pun">:</span><span class="pln"> your_user</span><span class="hljs-comment"><span class="str">'s_password</span></span><span class="str">
</span><span class="hljs-number"><span class="str">230</span></span><span class="str"> Login successful.
Remote system type </span><span class="hljs-keyword"><span class="str">is</span></span><span class="str"> UNIX.
</span><span class="hljs-keyword"><span class="str">Using</span></span><span class="str"> </span><span class="hljs-keyword"><span class="str">binary</span></span><span class="str"> mode </span><span class="hljs-keyword"><span class="str">to</span></span><span class="str"> transfer files.
Ftp&gt;</span></code></pre>

<p>
	سندخل إلى المجلد <code>files</code>، ثم سنستعمل الأمر <code>get</code> لنقل ملف التجربة الذي أنشأناه سابقًا إلى جهازنا المحلي:
</p>

<pre class="ipsCode" id="ips_uid_1168_7">
<code class="hljs livecodeserver"><span class="pln">cd </span><span class="hljs-built_in"><span class="pln">files</span></span><span class="pln">
</span><span class="hljs-built_in"><span class="kwd">get</span></span><span class="pln"> test</span><span class="pun">.</span><span class="pln">txt</span></code></pre>

<p>
	الناتج:
</p>

<pre class="ipsCode" id="ips_uid_1168_7">
<code class="hljs livecodeserver"><span class="hljs-number"><span class="lit">227</span></span><span class="pln"> </span><span class="typ">Entering</span><span class="pln"> </span><span class="typ">Passive</span><span class="pln"> </span><span class="typ">Mode</span><span class="pln"> </span><span class="pun">(</span><span class="hljs-number"><span class="lit">203</span></span><span class="pun">,</span><span class="hljs-number"><span class="lit">0</span></span><span class="pun">,</span><span class="hljs-number"><span class="lit">113</span></span><span class="pun">,</span><span class="hljs-number"><span class="lit">0</span></span><span class="pun">,</span><span class="hljs-number"><span class="lit">169</span></span><span class="pun">,</span><span class="hljs-number"><span class="lit">12</span></span><span class="pun">).</span><span class="pln">
</span><span class="hljs-number"><span class="lit">150</span></span><span class="pln"> </span><span class="typ">Opening</span><span class="pln"> BINARY mode data connection </span><span class="hljs-keyword"><span class="kwd">for</span></span><span class="pln"> test</span><span class="pun">.</span><span class="pln">txt </span><span class="pun">(</span><span class="hljs-number"><span class="lit">16</span></span><span class="pln"> </span><span class="hljs-keyword"><span class="pln">bytes</span></span><span class="pun">).</span><span class="pln">
</span><span class="hljs-number"><span class="lit">226</span></span><span class="pln"> </span><span class="typ">Transfer</span><span class="pln"> complete</span><span class="pun">.</span><span class="pln">
</span><span class="hljs-number"><span class="lit">16</span></span><span class="pln"> </span><span class="hljs-keyword"><span class="pln">bytes</span></span><span class="pln"> received </span><span class="hljs-operator"><span class="kwd">in</span></span><span class="pln"> </span><span class="hljs-number"><span class="lit">0.0101</span></span><span class="pln"> </span><span class="hljs-built_in"><span class="pln">seconds</span></span><span class="pln"> </span><span class="pun">(</span><span class="hljs-number"><span class="lit">1588</span></span><span class="pln"> </span><span class="hljs-keyword"><span class="pln">bytes</span></span><span class="pun">/</span><span class="pln">s</span><span class="pun">)</span><span class="pln">
</span><span class="hljs-keyword"><span class="pln">ftp</span></span><span class="pun">&gt;</span></code></pre>

<p>
	سنحاول الآن إعادة رفع الملف باسمٍ جديد للتأكد من إمكانية الكتابة على المجلد:
</p>

<pre class="ipsCode" id="ips_uid_1168_7">
<code class="hljs avrasm"><span class="pln">put test</span><span class="hljs-preprocessor"><span class="pun">.</span><span class="pln">txt</span></span><span class="pln"> upload</span><span class="hljs-preprocessor"><span class="pun">.</span><span class="pln">txt</span></span></code></pre>

<p>
	الناتج:
</p>

<pre class="ipsCode" id="ips_uid_1168_7">
<code class="hljs livecodeserver"><span class="hljs-number"><span class="lit">227</span></span><span class="pln"> </span><span class="typ">Entering</span><span class="pln"> </span><span class="typ">Passive</span><span class="pln"> </span><span class="typ">Mode</span><span class="pln"> </span><span class="pun">(</span><span class="hljs-number"><span class="lit">203</span></span><span class="pun">,</span><span class="hljs-number"><span class="lit">0</span></span><span class="pun">,</span><span class="hljs-number"><span class="lit">113</span></span><span class="pun">,</span><span class="hljs-number"><span class="lit">0</span></span><span class="pun">,</span><span class="hljs-number"><span class="lit">164</span></span><span class="pun">,</span><span class="hljs-number"><span class="lit">71</span></span><span class="pun">).</span><span class="pln">
</span><span class="hljs-number"><span class="lit">150</span></span><span class="pln"> </span><span class="typ">Ok</span><span class="pln"> </span><span class="hljs-built_in"><span class="pln">to</span></span><span class="pln"> </span><span class="hljs-built_in"><span class="pln">send</span></span><span class="pln"> data</span><span class="pun">.</span><span class="pln">
</span><span class="hljs-number"><span class="lit">226</span></span><span class="pln"> </span><span class="typ">Transfer</span><span class="pln"> complete</span><span class="pun">.</span><span class="pln">
</span><span class="hljs-number"><span class="lit">16</span></span><span class="pln"> </span><span class="hljs-keyword"><span class="pln">bytes</span></span><span class="pln"> sent </span><span class="hljs-operator"><span class="kwd">in</span></span><span class="pln"> </span><span class="hljs-number"><span class="lit">0.000894</span></span><span class="pln"> </span><span class="hljs-built_in"><span class="pln">seconds</span></span><span class="pln"> </span><span class="pun">(</span><span class="hljs-number"><span class="lit">17897</span></span><span class="pln"> </span><span class="hljs-keyword"><span class="pln">bytes</span></span><span class="pun">/</span><span class="pln">s</span><span class="pun">)</span></code></pre>

<p>
	أغلِق الاتصال:
</p>

<pre class="ipsCode" id="ips_uid_1168_7">
<code class="hljs "><span class="pln">bye</span></code></pre>

<p>
	بعد أن تأكدنا أنَّ الخادوم يعمل كما ضبطناه، فيمكننا إتباع إجراءات إضافية لتأمين الخادوم.
</p>

<h2 id="الخطوة-السادسة-جعل-عمليات-النقل-آمنة">
	الخطوة السادسة: جعل عمليات النقل آمنة
</h2>

<p>
	لما كان بروتوكول FTP لا يشفِّر أيّة بيانات عند نقلها، بما في ذلك معلومات المستخدم، فعلينا تفعيل تشفير <abbr title="Secure Socket Layer | طبقة المنافذ الآمنة">SSL</abbr>/<abbr title="Transport Layer Security | بروتوكول أمن طبقة النقل">TLS</abbr> لتأمين تلك البيانات، وأوّل خطوة هي إنشاء شهادات <abbr title="Secure Socket Layer | طبقة المنافذ الآمنة">SSL</abbr> لاستخدامها مع vsftpd.<br>
	سنستخدم <code>openssl</code> لإنشاء شهادة جديدة، ونستخدم الخيار <code>‎-days</code> لجعلها صالحةً لمدة سنة، وسنضيف –في الأمر نفسه– مفتاح ‎2048-bit RSA خاص، ثم بإسناد القيمة ذاتها إلى الخيارين <code>‎-keyout</code> و <code>‎-out</code> فستكون الشهادة والمفتاح الخاص في الملف نفسه.<br>
	هذا هو الأمر الذي سنُطبِّقه:
</p>

<pre class="ipsCode" id="ips_uid_1168_7">
<code class="hljs lasso"><span class="pln">sudo openssl req </span><span class="hljs-attribute"><span class="pun">-</span><span class="pln">x509</span></span><span class="pln"> </span><span class="hljs-attribute"><span class="pun">-</span><span class="pln">nodes</span></span><span class="pln"> </span><span class="hljs-attribute"><span class="pun">-</span><span class="pln">days</span></span><span class="pln"> </span><span class="hljs-number"><span class="lit">365</span></span><span class="pln"> </span><span class="hljs-attribute"><span class="pun">-</span><span class="pln">newkey</span></span><span class="pln"> rsa</span><span class="pun">:</span><span class="hljs-number"><span class="lit">2048</span></span><span class="pln"> </span><span class="hljs-attribute"><span class="pun">-</span><span class="pln">keyout</span></span><span class="pln"> </span><span class="pun">/</span><span class="pln">etc</span><span class="pun">/</span><span class="pln"><abbr title="Secure Socket Layer | طبقة المنافذ الآمنة">ssl</abbr></span><span class="pun">/</span><span class="hljs-keyword"><span class="kwd">private</span></span><span class="pun">/</span><span class="pln">vsftpd</span><span class="hljs-built_in"><span class="pun">.</span></span><span class="pln">pem </span><span class="hljs-attribute"><span class="pun">-</span><span class="kwd">out</span></span><span class="pln"> </span><span class="pun">/</span><span class="pln">etc</span><span class="pun">/</span><span class="pln"><abbr title="Secure Socket Layer | طبقة المنافذ الآمنة">ssl</abbr></span><span class="pun">/</span><span class="hljs-keyword"><span class="kwd">private</span></span><span class="pun">/</span><span class="pln">vsftpd</span><span class="hljs-built_in"><span class="pun">.</span></span><span class="pln">pem</span></code></pre>

<p>
	سيُطلَب منّا توفير معلومات عن الشهادة التي سنُنشِئها، ضع المعلومات الخاصة بك عند الإجابة عن الأسئلة:
</p>

<pre class="ipsCode" id="ips_uid_1168_7">
<code class="hljs lasso"><span class="typ">Generating</span><span class="pln"> a </span><span class="hljs-number"><span class="lit">2048</span></span><span class="pln"> bit RSA </span><span class="hljs-keyword"><span class="kwd">private</span></span><span class="pln"> key
</span><span class="hljs-attribute"><span class="pun">...</span></span><span class="hljs-attribute"><span class="pun">...</span></span><span class="hljs-attribute"><span class="pun">...</span></span><span class="hljs-attribute"><span class="pun">...</span></span><span class="hljs-attribute"><span class="pun">...</span></span><span class="hljs-attribute"><span class="pun">...</span></span><span class="hljs-attribute"><span class="pun">...</span></span><span class="hljs-attribute"><span class="pun">...</span></span><span class="hljs-attribute"><span class="pun">...</span></span><span class="hljs-attribute"><span class="pun">...</span></span><span class="hljs-attribute"><span class="pun">...</span></span><span class="hljs-attribute"><span class="pun">...</span></span><span class="hljs-attribute"><span class="pun">...</span></span><span class="hljs-attribute"><span class="pun">...</span></span><span class="hljs-attribute"><span class="pun">...</span></span><span class="hljs-attribute"><span class="pun">...</span></span><span class="hljs-attribute"><span class="pun">...</span></span><span class="hljs-attribute"><span class="pun">...</span></span><span class="hljs-attribute"><span class="pun">...</span></span><span class="hljs-attribute"><span class="pun">...</span></span><span class="hljs-attribute"><span class="pun">...</span></span><span class="hljs-attribute"><span class="pun">...</span></span><span class="hljs-attribute"><span class="pun">...</span></span><span class="hljs-attribute"><span class="pun">...</span></span><span class="hljs-attribute"><span class="pun">...</span></span><span class="hljs-built_in"><span class="pun">.</span></span><span class="hljs-subst"><span class="pun">+++</span></span><span class="pln">
</span><span class="hljs-attribute"><span class="pun">...</span></span><span class="hljs-attribute"><span class="pun">...</span></span><span class="hljs-attribute"><span class="pun">...</span></span><span class="hljs-built_in"><span class="pun">..</span></span><span class="hljs-subst"><span class="pun">+++</span></span><span class="pln">
writing </span><span class="hljs-literal"><span class="kwd">new</span></span><span class="pln"> </span><span class="hljs-keyword"><span class="kwd">private</span></span><span class="pln"> key </span><span class="hljs-keyword"><span class="pln">to</span></span><span class="pln"> </span><span class="hljs-string"><span class="str">'/etc/<abbr title="Secure Socket Layer | طبقة المنافذ الآمنة">ssl</abbr>/private/vsftpd.pem'</span></span><span class="pln">
</span><span class="hljs-subst"><span class="pun">-----</span></span><span class="pln">
</span><span class="typ">You</span><span class="pln"> are about </span><span class="hljs-keyword"><span class="pln">to</span></span><span class="pln"> be asked </span><span class="hljs-keyword"><span class="pln">to</span></span><span class="pln"> enter information that will be incorporated
</span><span class="hljs-keyword"><span class="kwd">into</span></span><span class="pln"> your certificate request</span><span class="hljs-built_in"><span class="pun">.</span></span><span class="pln">
</span><span class="typ">What</span><span class="pln"> you are about </span><span class="hljs-keyword"><span class="pln">to</span></span><span class="pln"> enter </span><span class="kwd">is</span><span class="pln"> what </span><span class="kwd">is</span><span class="pln"> called a </span><span class="typ">Distinguished</span><span class="pln"> </span><span class="typ">Name</span><span class="pln"> </span><span class="hljs-literal"><span class="kwd">or</span></span><span class="pln"> a DN</span><span class="hljs-built_in"><span class="pun">.</span></span><span class="pln">
</span><span class="typ">There</span><span class="pln"> are quite a few fields but you can leave some blank
</span><span class="typ">For</span><span class="pln"> some fields there will be a </span><span class="kwd">default</span><span class="pln"> value</span><span class="pun">,</span><span class="pln">
</span><span class="hljs-keyword"><span class="typ">If</span></span><span class="pln"> you enter </span><span class="hljs-string"><span class="str">'.'</span></span><span class="pun">,</span><span class="pln"> the field will be left blank</span><span class="hljs-built_in"><span class="pun">.</span></span><span class="pln">
</span><span class="hljs-subst"><span class="pun">-----</span></span><span class="pln">
</span><span class="typ">Country</span><span class="pln"> </span><span class="typ">Name</span><span class="pln"> </span><span class="pun">(</span><span class="hljs-number"><span class="lit">2</span></span><span class="pln"> letter code</span><span class="pun">)</span><span class="pln"> </span><span class="hljs-preprocessor"><span class="pun">[</span></span><span class="pln">AU</span><span class="hljs-preprocessor"><span class="pun">]</span></span><span class="hljs-markup"><span class="pun">:</span><span class="pln">US
</span><span class="typ">State</span><span class="pln"> </span><span class="kwd">or</span><span class="pln"> </span><span class="typ">Province</span><span class="pln"> </span><span class="typ">Name</span><span class="pln"> </span><span class="pun">(</span><span class="pln">full name</span><span class="pun">)</span><span class="pln"> </span></span><span class="hljs-preprocessor"><span class="pun">[</span></span><span class="typ">Some</span><span class="hljs-attribute"><span class="pun">-</span><span class="typ">State</span></span><span class="hljs-preprocessor"><span class="pun">]</span></span><span class="hljs-markup"><span class="pun">:</span><span class="pln">NY
</span><span class="typ">Locality</span><span class="pln"> </span><span class="typ">Name</span><span class="pln"> </span><span class="pun">(</span><span class="pln">eg</span><span class="pun">,</span><span class="pln"> city</span><span class="pun">)</span><span class="pln"> </span></span><span class="hljs-preprocessor"><span class="pun">[</span></span><span class="hljs-preprocessor"><span class="pun">]</span></span><span class="hljs-markup"><span class="pun">:</span><span class="typ">New</span><span class="pln"> </span><span class="typ">York</span><span class="pln"> </span><span class="typ">City</span><span class="pln">
</span><span class="typ">Organization</span><span class="pln"> </span><span class="typ">Name</span><span class="pln"> </span><span class="pun">(</span><span class="pln">eg</span><span class="pun">,</span><span class="pln"> company</span><span class="pun">)</span><span class="pln"> </span></span><span class="hljs-preprocessor"><span class="pun">[</span></span><span class="typ">Internet</span><span class="pln"> </span><span class="typ">Widgits</span><span class="pln"> </span><span class="typ">Pty</span><span class="pln"> </span><span class="typ">Ltd</span><span class="hljs-preprocessor"><span class="pun">]</span></span><span class="hljs-markup"><span class="pun">:</span><span class="typ">Hsoub</span><span class="pln">
</span><span class="typ">Organizational</span><span class="pln"> </span><span class="typ">Unit</span><span class="pln"> </span><span class="typ">Name</span><span class="pln"> </span><span class="pun">(</span><span class="pln">eg</span><span class="pun">,</span><span class="pln"> section</span><span class="pun">)</span><span class="pln"> </span></span><span class="hljs-preprocessor"><span class="pun">[</span></span><span class="hljs-preprocessor"><span class="pun">]</span></span><span class="hljs-markup"><span class="pun">:</span><span class="pln">
</span><span class="typ">Common</span><span class="pln"> </span><span class="typ">Name</span><span class="pln"> </span><span class="pun">(</span><span class="pln">e</span><span class="pun">.</span><span class="pln">g</span><span class="pun">.</span><span class="pln"> server FQDN </span><span class="kwd">or</span><span class="pln"> YOUR name</span><span class="pun">)</span><span class="pln"> </span></span><span class="hljs-preprocessor"><span class="pun">[</span></span><span class="hljs-preprocessor"><span class="pun">]</span></span><span class="hljs-markup"><span class="pun">:</span><span class="pln">
</span><span class="typ">Email</span><span class="pln"> </span><span class="typ">Address</span><span class="pln"> </span></span><span class="hljs-preprocessor"><span class="pun">[</span></span><span class="hljs-preprocessor"><span class="pun">]</span></span><span class="hljs-markup"><span class="pun">:</span></span></code></pre>

<p>
	بعد أن أنشأنا الشهادات، فعلينا الآن تعديل ضبط <code>vsftpd</code> مجددًا:
</p>

<pre class="ipsCode" id="ips_uid_1168_7">
<code class="hljs bash"><span class="hljs-built_in"><span class="pln">sudo</span></span><span class="pln"> nano </span><span class="pun">/</span><span class="pln">etc</span><span class="pun">/</span><span class="pln">vsftpd</span><span class="pun">.</span><span class="pln">conf</span></code></pre>

<p>
	ستجد قرب نهاية الملف سطرين يبدآن بالسابقة <code>rsa_‎</code>، أضف قبلهما رمز التعليق ليصبحا كما يلي:
</p>

<pre class="ipsCode" id="ips_uid_1168_7">
<code class="hljs vala"><span class="hljs-preprocessor"><span class="com"># rsa_cert_file=/etc/<abbr title="Secure Socket Layer | طبقة المنافذ الآمنة">ssl</abbr>/certs/<abbr title="Secure Socket Layer | طبقة المنافذ الآمنة">ssl</abbr>-cert-snakeoil.pem</span></span><span class="pln">
</span><span class="hljs-preprocessor"><span class="com"># rsa_private_key_file=/etc/<abbr title="Secure Socket Layer | طبقة المنافذ الآمنة">ssl</abbr>/private/<abbr title="Secure Socket Layer | طبقة المنافذ الآمنة">ssl</abbr>-cert-snakeoil.key</span></span></code></pre>

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

<pre class="ipsCode" id="ips_uid_1168_7">
<code class="hljs ruby"><span class="pln">rsa_cert_file</span><span class="pun">=</span><span class="hljs-regexp"><span class="str">/etc/</span><span class="pln"><abbr title="Secure Socket Layer | طبقة المنافذ الآمنة">ssl</abbr></span></span><span class="hljs-regexp"><span class="pun">/</span><span class="kwd">private</span><span class="pun">/</span><span class="pln">vsftpd</span></span><span class="pun">.</span><span class="pln">pem
rsa_private_key_file</span><span class="pun">=</span><span class="hljs-regexp"><span class="str">/etc/</span><span class="pln"><abbr title="Secure Socket Layer | طبقة المنافذ الآمنة">ssl</abbr></span></span><span class="hljs-regexp"><span class="pun">/</span><span class="kwd">private</span><span class="pun">/</span><span class="pln">vsftpd</span></span><span class="pun">.</span><span class="pln">pem</span></code></pre>

<p>
	علينا الآن جعل استخدام <abbr title="Secure Socket Layer | طبقة المنافذ الآمنة">SSL</abbr> إجباريًا، مما يمنع العملاء غير القادرين على التعامل مع تشفير <abbr title="Transport Layer Security | بروتوكول أمن طبقة النقل">TLS</abbr> من الاتصال بخادومنا، وهذا ضروري للحرص على تشفير جميع المعلومات المنقولة لكن قد يجبر المستخدم على تغيير عميل الاتصال.<br>
	عدِّل قيمة التعليمة <code>ssl_enable</code> إلى <code>YES</code>:
</p>

<pre class="ipsCode" id="ips_uid_1168_7">
<code class="hljs ini"><span class="hljs-setting"><span class="pln">ssl_enable</span><span class="pun">=</span><span class="hljs-value"><span class="hljs-keyword"><span class="pln">YES</span></span></span></span></code></pre>

<p>
	أضف بعد ذلك الأسطر الآتية لمنع الاتصالات المجهولة عبر <abbr title="Secure Socket Layer | طبقة المنافذ الآمنة">SSL</abbr>، ولإجبار استخدام <abbr title="Secure Socket Layer | طبقة المنافذ الآمنة">SSL</abbr> لتسجيل الدخول ولنقل البيانات:
</p>

<pre class="ipsCode" id="ips_uid_1168_7">
<code class="hljs ini"><span class="hljs-setting"><span class="pln">allow_anon_ssl</span><span class="pun">=</span><span class="hljs-value"><span class="hljs-keyword"><span class="pln">NO</span></span></span></span><span class="pln">
</span><span class="hljs-setting"><span class="pln">force_local_data_ssl</span><span class="pun">=</span><span class="hljs-value"><span class="hljs-keyword"><span class="pln">YES</span></span></span></span><span class="pln">
</span><span class="hljs-setting"><span class="pln">force_local_logins_ssl</span><span class="pun">=</span><span class="hljs-value"><span class="hljs-keyword"><span class="pln">YES</span></span></span></span></code></pre>

<p>
	علينا ضبط الخادوم استخدام <abbr title="Transport Layer Security | بروتوكول أمن طبقة النقل">TLS</abbr> بدلًا من <abbr title="Secure Socket Layer | طبقة المنافذ الآمنة">SSL</abbr> عبر إضافة الأسطر الآتية:
</p>

<pre class="ipsCode" id="ips_uid_1168_7">
<code class="hljs ini"><span class="hljs-setting"><span class="pln">ssl_tlsv1</span><span class="pun">=</span><span class="hljs-value"><span class="hljs-keyword"><span class="pln">YES</span></span></span></span><span class="pln">
</span><span class="hljs-setting"><span class="pln">ssl_sslv2</span><span class="pun">=</span><span class="hljs-value"><span class="hljs-keyword"><span class="pln">NO</span></span></span></span><span class="pln">
</span><span class="hljs-setting"><span class="pln">ssl_sslv3</span><span class="pun">=</span><span class="hljs-value"><span class="hljs-keyword"><span class="pln">NO</span></span></span></span></code></pre>

<p>
	علينا بعد ذلك إضافة تعليمتين إضافيتين، الأولى تسمح بعدم استخدام <abbr title="Secure Socket Layer | طبقة المنافذ الآمنة">SSL</abbr> عند إعادة استخدام الجلسة (session reuse) لأنها لا تعمل مع أغلبية عملاء FTP، وسنطلب استخدام حزم عالية التشفير، وهذا يعني أنَّ طول المفتاح أكبر أو يساوي 128 بت:
</p>

<pre class="ipsCode" id="ips_uid_1168_7">
<code class="hljs ini"><span class="hljs-setting"><span class="pln">require_ssl_reuse</span><span class="pun">=</span><span class="hljs-value"><span class="hljs-keyword"><span class="pln">NO</span></span></span></span><span class="pln">
</span><span class="hljs-setting"><span class="pln">ssl_ciphers</span><span class="pun">=</span><span class="hljs-value"><span class="pln">HIGH</span></span></span></code></pre>

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

<pre class="ipsCode" id="ips_uid_1168_7">
<code class="hljs bash"><span class="hljs-built_in"><span class="pln">sudo</span></span><span class="pln"> systemctl restart vsftpd</span></code></pre>

<p>
	لم نعد نتمكن الآن من استخدام عميل FTP غير الآمن الذي يعمل من سطر الأوامر، فلو جربناه فسنشاهد الناتج الآتي:
</p>

<pre class="ipsCode" id="ips_uid_1168_7">
<code class="hljs livecodeserver"><span class="hljs-keyword"><span class="pln">ftp</span></span><span class="pln"> </span><span class="pun">-</span><span class="pln">p </span><span class="hljs-number"><span class="lit">203.0</span></span><span class="hljs-number"><span class="pun">.</span><span class="lit">113</span></span><span class="hljs-number"><span class="lit">.0</span></span><span class="pln">
</span><span class="typ">Connected</span><span class="pln"> </span><span class="hljs-built_in"><span class="pln">to</span></span><span class="pln"> </span><span class="hljs-number"><span class="lit">203.0</span></span><span class="hljs-number"><span class="pun">.</span><span class="lit">113</span></span><span class="hljs-number"><span class="lit">.0</span></span><span class="pun">.</span><span class="pln">
</span><span class="hljs-number"><span class="lit">220</span></span><span class="pln"> </span><span class="pun">(</span><span class="pln">vsFTPd </span><span class="hljs-number"><span class="lit">3.0</span></span><span class="hljs-number"><span class="pun">.</span><span class="lit">3</span></span><span class="pun">)</span><span class="pln">
</span><span class="typ">Name</span><span class="pln"> </span><span class="pun">(</span><span class="hljs-number"><span class="lit">203.0</span></span><span class="hljs-number"><span class="pun">.</span><span class="lit">113</span></span><span class="hljs-number"><span class="lit">.0</span></span><span class="pun">:</span><span class="kwd">default</span><span class="pun">):</span><span class="pln"> sammy
</span><span class="hljs-number"><span class="lit">530</span></span><span class="pln"> </span><span class="typ">Non</span><span class="pun">-</span><span class="pln">anonymous sessions must </span><span class="kwd">use</span><span class="pln"> encryption</span><span class="pun">.</span><span class="pln">
</span><span class="hljs-keyword"><span class="pln">ftp</span></span><span class="pun">:</span><span class="pln"> </span><span class="typ">Login</span><span class="pln"> failed</span><span class="pun">.</span><span class="pln">
</span><span class="hljs-number"><span class="lit">421</span></span><span class="pln"> </span><span class="typ">Service</span><span class="pln"> </span><span class="hljs-operator"><span class="kwd">not</span></span><span class="pln"> available</span><span class="pun">,</span><span class="pln"> remote server has closed connection
</span><span class="hljs-keyword"><span class="pln">ftp</span></span><span class="pun">&gt;</span></code></pre>

<p>
	سنتحقق من الاتصال في الخطوة القادمة باستخدام عميل يدعم تشفير <abbr title="Transport Layer Security | بروتوكول أمن طبقة النقل">TLS</abbr>.
</p>

<h2 id="الخطوة-السابعة-تجربة-الاتصال-عبر-tls-باستخدام-filezilla">
	الخطوة السابعة: تجربة الاتصال عبر <abbr title="Transport Layer Security | بروتوكول أمن طبقة النقل">TLS</abbr> باستخدام FileZilla
</h2>

<p>
	أغلبية عملاء FTP الحديثين يدعمون تشفير <abbr title="Transport Layer Security | بروتوكول أمن طبقة النقل">TLS</abbr>، وسنشرح كيفية الاتصال عبر عميل FileZilla لأنه يعمل على جميع أنظمة التشغيل؛ راجع توثيق عميلك المفضل لتعرف كيف يمكن الاتصال عبر <abbr title="Transport Layer Security | بروتوكول أمن طبقة النقل">TLS</abbr> فيه.<br>
	عندما تفتح برنامج FileZilla فسنجد أيقونة Site Manager تحت قائمة File مباشرةً، أي أنَّها أوّل أيقونة في الشريط العلوي. اضغط عليها:
</p>

<p style="text-align: center;">
	<img alt="1-site-manager.png" class="ipsImage ipsImage_thumbnailed" data-fileid="25138" data-unique="hw3pnyblc" src="https://academy.hsoub.com/uploads/monthly_2017_10/1-site-manager.png.81125f0ea9e029034f37eec0a0b07a2f.png"></p>

<p>
	ستُفتَح نافذة جديدة، اضغط فيها على زر «New Site» في الركن السفلي الأيسر:
</p>

<p style="text-align: center;">
	<img alt="2-new-site.png" class="ipsImage ipsImage_thumbnailed" data-fileid="25139" data-unique="cyd9kuqvv" src="https://academy.hsoub.com/uploads/monthly_2017_10/2-new-site.png.1107151fcf0d738a380d0c550dac406f.png"></p>

<p>
	ستجد ظهور «New site» تحت أيقونة «My Sites»، يمكنك تسمية الموقع الآن أو إعادة تسميته لاحقًا بالضغط على زر «Rename».<br>
	عليك أن تملأ حقل «Host» بعنوان IP أو اسم نطاق الموقع، وعليك أن تختار «Require explicit FTP over <abbr title="Transport Layer Security | بروتوكول أمن طبقة النقل">TLS</abbr>» في قائمة «Encryption»<br>
	أما لخيار «Logon Type» فاختر «Ask for password»، ثم أدخِل اسم المستخدم في حقل «User»:
</p>

<p style="text-align: center;">
	<img alt="3-site-config2.png" class="ipsImage ipsImage_thumbnailed" data-fileid="25133" data-unique="2js24dxyt" src="https://academy.hsoub.com/uploads/monthly_2017_10/3-site-config2.png.0f4d02fa3a1e62ff841917828d0aac7a.png"></p>

<p>
	اضغط على زر «Connect» في أسفل النافذة، وستُسأل عن كلمة مرور المستخدم:
</p>

<p style="text-align: center;">
	<img alt="4-user-pass.png" class="ipsImage ipsImage_thumbnailed" data-fileid="25134" data-unique="36byinxv4" src="https://academy.hsoub.com/uploads/monthly_2017_10/4-user-pass.png.c226a8b285d8d184f1a5c54bdbbe58f2.png"></p>

<p>
	اضغط على «OK» لتتصل، يجب أن يكون اتصالك مع الخادوم مشفرًا بتشفير <abbr title="Transport Layer Security | بروتوكول أمن طبقة النقل">TLS</abbr>/<abbr title="Secure Socket Layer | طبقة المنافذ الآمنة">SSL</abbr>.
</p>

<p style="text-align: center;">
	<img alt="5-site-cert.png" class="ipsImage ipsImage_thumbnailed" data-fileid="25135" data-unique="tafb1dj59" src="https://academy.hsoub.com/uploads/monthly_2017_10/5-site-cert.png.c8fd559bd081eb778a7455033bd8cd07.png"></p>

<p>
	بعد أن تقبل الشهادة، فانقر نقرًا مزدوجًا على مجلد <code>files</code> واسحب الملف <code>upload.txt</code> وأفلته في القسم اليساري من البرنامج لكي تبدأ بتنزيله:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="25136" href="https://academy.hsoub.com/uploads/monthly_2017_10/6-file-test.png.0b28097cca038adb101caefc9c9ce484.png" rel=""><img alt="6-file-test.png" class="ipsImage ipsImage_thumbnailed" data-fileid="25136" data-unique="n2zmbzygt" src="https://academy.hsoub.com/uploads/monthly_2017_10/6-file-test.thumb.png.b8c613405b9f1974dc4561945c89f93e.png"></a>
</p>

<p>
	بعد ذلك، يمكنك أن تنقر بالزر الأيمن على الملف المحلي وتعيد تسميته إلى <code>upload-<abbr title="Transport Layer Security | بروتوكول أمن طبقة النقل">tls</abbr>.txt</code> وتسحبه مجددًا إلى الخادوم لكي ترفعه عليه.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="25137" href="https://academy.hsoub.com/uploads/monthly_2017_10/7-file-upload.png.2e2c5c86838bc81d4366b75229926bc9.png" rel=""><img alt="7-file-upload.png" class="ipsImage ipsImage_thumbnailed" data-fileid="25137" data-unique="mjguvryo9" src="https://academy.hsoub.com/uploads/monthly_2017_10/7-file-upload.thumb.png.c057d3b194b4bb436e7e424078d619e1.png"></a>
</p>

<p>
	لقد تمكنا من تنزيل الملفات ورفعها بأمان مع تفعيل تشفير <abbr title="Secure Socket Layer | طبقة المنافذ الآمنة">SSL</abbr>/<abbr title="Transport Layer Security | بروتوكول أمن طبقة النقل">TLS</abbr>.
</p>

<h2 id="الخطوة-الثامنة-تعديل-الوصول-إلى-سطر-الأوامر-خطوة-اختيارية">
	الخطوة الثامنة: تعديل الوصول إلى سطر الأوامر (خطوة اختيارية)
</h2>

<p>
	إن لم تتمكن من استخدام تشفير <abbr title="Transport Layer Security | بروتوكول أمن طبقة النقل">TLS</abbr> بسبب محدوديات العميل، فيمكنك تأمين الخادوم قليلًا بمنع مستخدم FTP من تسجيل الدخول إلى سطر الأوامر، إحدى الطرائق البسيطة لفعل ذلك هي إنشاء صدفة (shell) خاصة.<br>
	أكرِّر أنَّ الخطوة السابقة لا توفِّر أيّ تشفير، وإنما الغرض منها هو تقليل الوصول إلى حسابات المستخدمين المسموح لهم بالاتصال عبر FTP فقط.<br>
	علينا أولًا إنشاء ملف باسم <code>ftponly</code> في مجلد <code>‎/bin</code>:
</p>

<pre class="ipsCode" id="ips_uid_1168_7">
<code class="hljs bash"><span class="hljs-built_in"><span class="pln">sudo</span></span><span class="pln"> nano </span><span class="pun">/</span><span class="pln">bin</span><span class="pun">/</span><span class="pln">ftponly</span></code></pre>

<p>
	سنضيف الآن رسالةً تخبر المستخدم أنَّه ليس قادرًا على تسجيل الدخول، أضف ما يلي يلي إلى الملف:
</p>

<pre class="ipsCode" id="ips_uid_1168_7">
<code class="hljs bash"><span class="hljs-shebang"><span class="com">#!/bin/sh</span></span><span class="pln">
</span><span class="hljs-built_in"><span class="pln">echo</span></span><span class="pln"> </span><span class="hljs-string"><span class="str">"This account is limited to FTP access only."</span></span></code></pre>

<p>
	عدِّل الأذونات لجعل الملف قابلًا للتنفيذ:
</p>

<pre class="ipsCode" id="ips_uid_1168_7">
<code class="hljs bash"><span class="hljs-built_in"><span class="pln">sudo</span></span><span class="pln"> chmod a</span><span class="pun">+</span><span class="pln">x </span><span class="pun">/</span><span class="pln">bin</span><span class="pun">/</span><span class="pln">ftponly</span></code></pre>

<p>
	افتح الملف الذي يضم قائمةً بالصدفات (shells) الصالحة للاستخدام في النظام:
</p>

<pre class="ipsCode" id="ips_uid_1168_7">
<code class="hljs bash"><span class="hljs-built_in"><span class="pln">sudo</span></span><span class="pln"> nano </span><span class="pun">/</span><span class="pln">etc</span><span class="pun">/</span><span class="pln">shells</span></code></pre>

<p>
	وأضف في نهاية الملف:
</p>

<pre class="ipsCode" id="ips_uid_1168_7">
<code class="hljs asciidoc"><span class="hljs-bullet"><span class="pun">.</span><span class="pln"> </span></span><span class="pun">.</span><span class="pln"> </span><span class="pun">.</span><span class="pln">
</span><span class="pun">/</span><span class="pln">bin</span><span class="pun">/</span><span class="pln">ftponly</span></code></pre>

<p>
	عدِّل الصدفة الافتراضية للمستخدم عبر الآمر الآتي:
</p>

<pre class="ipsCode" id="ips_uid_1168_7">
<code class="hljs bash"><span class="hljs-built_in"><span class="pln">sudo</span></span><span class="pln"> usermod sammy </span><span class="hljs-operator"><span class="pun">-</span><span class="pln">s</span></span><span class="pln"> </span><span class="pun">/</span><span class="pln">bin</span><span class="pun">/</span><span class="pln">ftponly</span></code></pre>

<p>
	جرِّب الآن تسجيل الدخول بحساب المستخدم sammy:
</p>

<pre class="ipsCode" id="ips_uid_1168_7">
<code class="hljs ruby"><span class="pln"><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">ssh</abbr> sammy</span><span class="hljs-variable"><span class="pln">@203</span></span><span class="pun">.</span><span class="hljs-number"><span class="lit">0</span></span><span class="lit">.</span><span class="hljs-number"><span class="lit">113</span><span class="pun">.</span><span class="lit">0</span></span></code></pre>

<p>
	ستجد رسالةً شبيهةً بالرسالة الآتية:
</p>

<pre class="ipsCode" id="ips_uid_1168_7">
<code class="hljs vhdl"><span class="typ">This</span><span class="pln"> account </span><span class="hljs-keyword"><span class="kwd">is</span></span><span class="pln"> limited </span><span class="hljs-keyword"><span class="pln">to</span></span><span class="pln"> FTP </span><span class="hljs-keyword"><span class="pln">access</span></span><span class="pln"> only</span><span class="pun">.</span><span class="pln">
</span><span class="typ">Connection</span><span class="pln"> </span><span class="hljs-keyword"><span class="pln">to</span></span><span class="pln"> </span><span class="hljs-number"><span class="lit">203.0</span></span><span class="hljs-number"><span class="pun">.</span><span class="lit">113</span></span><span class="hljs-number"><span class="lit">.0</span></span><span class="pln"> closed</span><span class="pun">.</span></code></pre>

<p>
	هذا يؤكد أنَّ المستخدم غير قادر على تسجيل الدخول إلى الخادوم عبر الأمر <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">ssh</abbr>، ويُسمَح له بالوصول إلى FTP فقط.
</p>

<h2 id="الخلاصة">
	الخلاصة
</h2>

<p>
	لقد شرحنا في هذا الدرس كيفية ضبط خادوم FTP للمستخدمين الذين يملكون حسابًا محليًا على النظام، أما إذا أردتَ استخدام مصدر خارجي للاستيثاق، فيمكنك إلقاء نظرة على دعم خادوم vsftpd للمستخدمين الوهميين (virtual users). هنالك خياراتٌ واسعة لدعم استخدام PAM مما يجعلك قادرًا على إدارة المستخدمين في نظام استيثاق مختلف مثل LDAP أو Kerberos.<br>
	ترجمة –وبتصرّف– للمقال <a href="https://www.digitalocean.com/community/tutorials/how-to-set-up-vsftpd-for-a-user-s-directory-on-ubuntu-16-04" rel="external nofollow">How To Set Up vsftpd for a User’s Directory on Ubuntu 16.04</a>لصاحبته Melissa Anderson
</p>
]]></description><guid isPermaLink="false">354</guid><pubDate>Tue, 10 Oct 2017 13:45:00 +0000</pubDate></item><item><title>&#x645;&#x627; &#x647;&#x648; &#x633;&#x637;&#x631; &#x627;&#x644;&#x623;&#x648;&#x627;&#x645;&#x631; &#x61F;</title><link>https://academy.hsoub.com/devops/servers/%D9%85%D8%A7-%D9%87%D9%88-%D8%B3%D8%B7%D8%B1-%D8%A7%D9%84%D8%A3%D9%88%D8%A7%D9%85%D8%B1-%D8%9F-r353/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2017_10/59d7f0b7a3cfa_main(68).png.4fbd86ede46ae6ca336d55c33b8e7da2.png" /></p>

<p>
	سيأتي حينٌ يحس فيه كل مطوِّر وب جديد بأنَّ شيئًا ما ينقصه عندما يطلب منه أحد الخبراء أن يفتح سطر الأوامر، لكن لا بأس في ذلك، فلكنا مرّ بذلك عندما ذهب إلى منتدى أو اجتماع محلي للقاء مطوري وب الآخرين.<br>
	هذا الدرس مناسب لكل شخص لا يعرف ما هو سطر الأوامر، وهو ملائمٌ أيضًا لمن له دراية بسطر الأوامر إذ سيتضمّن بعض التفاصيل والملاحظات والتي ستجدها مفيدة وستتعلم منها.<br>
	لن يشرح هذا الدرس ماذا عليك أن تكتب في الطرفية (terminal، وهي نافذة البرنامج التي تصل إلى سطر الأوامر عبرها) للقيام بأمور معينة، وإنما الهدف هنا هو شرح المفاهيم الأساسية لجعل واجهة سطر الأوامر (command line interface) مألوفةً لك، وبعد أن تتمكّن من الأساسيات فستجد أن فهم أحد الأوامر سهلٌ جدًا وليس عسيرًا كما تظن.
</p>

<h2 id="ظهرت-واجهة-سطر-الأوامر-قبل-الواجهات-الرسومية">
	ظهرت واجهة سطر الأوامر قبل الواجهات الرسومية
</h2>

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

<ol>
<li>
		البرامج السطرية هي تطبيقات بسيطة تعمل مرة واحدة.
	</li>
	<li>
		على النقيض من أغلبية التطبيقات الرسومية التي تنتظر منك التفاعل معها، فإنَّ أغلبية التطبيقات السطرية تعمل بسرعة ثم تتوقف.
	</li>
	<li>
		تكون عادة الأوامر قصيرة لأن المستخدمين يريدون أن يكتبوا أقل ما يمكن لتنفيذ ما يشاؤون.
	</li>
	<li>
		لا تُستخدَم الفأرة (عادةً) في سطر الأوامر.
	</li>
</ol>
<h2 id="الاختلافات-بين-أنظمة-التشغيل">
	الاختلافات بين أنظمة التشغيل
</h2>

<p>
	يمكننا أن نعد سطر الأوامر على أنه طريقة مباشرة للتواصل مع الحاسوب، وهذا يتيح له قدرات أكثر، مما يجعله فعّالًا، لكن في المقابل هذا يعني أنَّ عليك معروفة المزيد من المعلومات حول طريقة عمل حاسوبك.<br>
	أغلبية مستخدمي الحاسوب أولي المعرفة المتوسطة يعلمون أنَّ نظام ويندوز يختلف عن ماك ويختلف عن لينكس، لكنها يعلمون أنَّ بإمكانهم تشغيل متصفح Firefox أو برنامج ليبرأوفيس على تلك الأنظمة، لكن هذا ليس صحيحًا بالنسبة إلى سطر الأوامر.<br>
	هنالك نوعان رئيسيان لسطر الأوامر عليك معرفتهما، النوع الأول هو سطر الأوامر للأنظمة الشبيهة بيونكس (Unix-like)، والنوع الثاني هو سطر أوامر نظام ويندوز.<br>
	يُصنَّف نظام لينكس وماك على أنهما نظامان شبيهان بيونكس، وبالتي ستتعامل مع سطر الأوامر عبر ما يسمى «صدفة» (shell) باسم Bash (سنتحدث عن ذلك لاحقًا). صحيحٌ أنَّ هنالك اختلافات في طريقة التعامل مع مختلف أنظمة يونكس، لكنها ليست مهمة لمطوري الويب المحترفين، فهذه الاختلافات صغيرة ويمكنك تجاهلها إذا كنتَ مبتدئًا (لكن الحق يقال: ستواجه هذه الاختلاف في وقتٍ ما عندما تجد نفسك مرتاحًا في استخدام سطر الأوامر، وستجد أنَّ تلك الاختلافات لها أثرها).<br>
	أما نظام ويندوز فهو خارج المنافسة في مجال سطر الأوامر، وهذا هو أحد الأسباب الرئيسية التي تجعل من مطوري الويب يهاجرون من ويندوز إلى لينكس أو ماك، إذ يختلف سطر الأوامر الموجود في نظام ويندوز عن بقية الأنظمة والأوامر ليست متشابهة، وسطر الأوامر فيه قديم وتراثي أضف إلى أنَّ مستخدمي ويندوز يخافون استخدامه.
</p>

<h3 id="سطر-الأوامر-في-ويندوز">
	سطر الأوامر في ويندوز
</h3>

<p>
	لا يمكني الجزم بواقع سطر أوامر ويندوز أو المنافع الآتية من استخدامه في أنظمة ويندوز (ويندوز 10 وما قبله) للقيام بمهام تطوير الويب من سطر الأوامر لأنني أستخدم لينكس منذ فترةٍ طويلة، لكنني سمعتُ شكوى ممن يستعملونه وصحيحٌ أنَّ أغلبية البرمجيات تعمل «نظريًا» في سطر أوامر ويندوز، لكنني سمعتُ أنها ليست عملية.<br>
	أنا لا أقول لك أن تشتري جهاز ماك أو تثبِّت لينكس على جهازك (لكنني أحثّك على تجربة لينكس على أيّ حال) لتصبح مطوِّر ويب، لكنني أحب أن أشير إلى توافر ما يسمى «Bash on Ubuntu on Windows» في ويندوز 10 وبالتالي ستحصل على سطر أوامر شبيه بيونكس داخل نظام ويندوز، لذا جرِّبه وانظر إن كان مناسبًا لك.<br>
	ولأغلبية أعمال تطوير الويب، خصوصًا في عالم البرمجيات مفتوحة المصدر الذي تقطنه ووردبريس، ستجد أنَّ الخواديم تُشغِّل إحدى توزيعات لينكس، وهذا يعني أنَّ عليك الاتصال مع الخواديم عبر سطر الأوامر، وهذا سهلٌ جدًا في ويندوز (عبر برمجية <a href="http://www.putty.org/" rel="external nofollow">PuTTY</a>) لكن هذه البرمجية غير مضمّنة افتراضيًا في ويندوز، وليست كمثيلاتها في بقية الأنظمة.
</p>

<h2 id="العثور-على-الطرفية">
	العثور على الطرفية
</h2>

<p>
	ذكرنا سابقًا أنَّك تستطيع الوصول إلى سطر الأوامر عبر الطرفية، والتي يمكنك تشغيلها في نظام ماك وأغلبية توزيعات لينكس التي توفِّر واجهةً رسوميةً عبر البحث عن تطبيقٍ باسم Terminal وتشغيله، ثم ستجد نافذة تتيح لك التفاعل مع حاسوبك بطريقة تختلف كثيرًا عمّا اعتدت عليه.<br>
	أما في ويندوز فيسمى محاكي الطرفية باسم «موجِّه الأوامر» (Command Prompt)، الذي يسمح لك بتنفيذ البرامج بكتابة أمرٍ معيّن.<br>
	يجدر بالذكر أنَّ هنالك أنواع مختلفة من محاكيات الطرفيات، فهنالك طرفية غنوم وطرفية كدي (Konsole) للينكس، وطرفية <a href="https://iterm2.com/" rel="external nofollow">iTerm </a> لنظام ماك، وهذه الطرفيات تختلف عن بعضها لكنها تؤدي الغرض نفسه ألا وهو الوصول إلى سطر الأوامر.
</p>

<h2 id="أنواع-الصدفات">
	أنواع الصدفات
</h2>

<p>
	ملاحظة سريعة: هنالك أنواع مختلفة من الصدفات (وهي البرمجيات التي تتواصل عبرها مع سطر الأوامر)، فأغلبية الأشخاص يستخدمون صدفة باش (bash) (وإذا لم تكن تعرف ما هي الصدفة التي تعمل عليها فمن المرجح أنها باش).<br>
	الاختلافات بين الصدفات هو موضوع معقد وخارج عن نطاق هذا الدرس، لكن كل ما أردتُ تنبيهك إليه هو أنَّك تشغِّل صدفة باش في نظامك (وليس ZSH أو FISH أو غيرها).
</p>

<h2 id="كيف-تصل-إلى-سطر-أوامر-خادومك">
	كيف تصل إلى سطر أوامر خادومك
</h2>

<p>
	آخر موضوع أريد أن أتحدث عنه في هذا الدرس هو أنَّك تستطيع أن تصل إلى سطر أوامر الخادوم نفسه (إلا إذا كان موقعك مستضافًا على استضافة مشتركة).<br>
	لا تُشغِّل الخواديم واجهةً رسوميةً (السبب الرئيسي هو الأداء والحماية)، هذا يختلف عن حاسوبك الشخصي الذي يتيح لك التفاعل مع سطر الأوامر ومع الواجهات الرسومية في الوقت نفسه.<br>
	في الحالات التي ترغب بالوصول فيها إلى سطر الأوامر في خادومك، فيمكنك فعل ذلك عبر <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr> (اختصار للعبارة Secure Shell)، وهذه البرمجية تسمح لك بالوصول إلى سطر الأوامر في حاسوبٍ بعيد بأمان؛ وموضوع ضبط <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr> خارج عن نطاق هذه المقالة، والغرض من ذكري له هو معرفة وجود طريقة للوصول إلى سطر الأوامر لحاسوبٍ بعيد بأمان. وأذكِّر أنَّ برمجية PuTTY التي ذكرناها سابقًا هي أشهر طريقة ليتصل عبرها مستخدمو ويندوز إلى <abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">SSH</abbr>. أما مستخدمو ماك أو لينكس أو غيرهما فكل ما عليهم فعله للاتصال إلى حاسوبٍ بعيد هو استخدام الأمر <code><abbr title="Secure Shell | القشرة (أو الصَدَفة) الآمنة">ssh</abbr></code> في سطر الأوامر.
</p>

<h2 id="الخلاصة">
	الخلاصة
</h2>

<p>
	قد يبدو سطر الأوامر شيئًا غريبًا خصوصًا لمستخدمي الحاسوب الذين بدؤوا في استعماله بعد ظهور الواجهات الرسومية التي جعلت منه شيئًا غريبًا، لكن قد نضطر أحيانًا إلى استخدام سطر الأوامر لإنجاز بعض الأمور.<br>
	أرجو أن تكون قد فهمتَ من المقالة أنَّ سطر الأوامر هو طريقة أخرى للتعامل مع الحاسوب، وقد تكون هي الطريقة الوحيدة للتعامل مع الحاسوب في بعض الحالات مثل الخواديم التي لا تُثبَّت عليها واجهة رسومية للحفاظ على مواردها.<br>
	تذكّر أنَّنا سنتعامل مع نظام التشغيل في النهاية سواءً استعملنا الواجهة الرسومية أو السطرية، وهذا هو السبب وراء امتلاك نظام ويندوز لسطر أوامر مختلف تمامًا عن ماك أو لينكس؛ إذ يُصنَّف ماك ولينكس على أنهما شبيهان بنظام يونكس، وهذا هو السبب وراء تشابه سطر الأوامر فيهما.<br>
	سطر الأوامر معقد ومتشابك وواسع، لذا لا تقلق إذا لم تجد نفسك مرتاحًا معه في البداية، إذ تستطيع استخدام أمر ما يوميًا ثم تكتشف أشياءً جديدةً كل فترة (مثل أوامر أخرى أو خيارات للأوامر التي تستعملها أو مفاهيم جديدة في سطر الأوامر).<br>
	هنالك بعض الأوامر البسيطة التي تساعدك في الاعتياد على سطر الأوامر وفهمه، لذا أنصحك بتعلمها حتى لو لم تكن تستعملها كثيرًا.<br>
	أعلم أنَّ بإمكانك فعل الكثير مع ووردبريس دون الحاجة إلى استخدام سطر الأوامر، لكنني أعتقد أنَّ من الضروري تعلّم سطر الأوامر لزيادة خبرتك في إدارة مواقع ووردبريس. أرجو أن تكون هذه المقالة قد وضحت لك بعض المفاهيم الغريبة، وإذا كنتَ مهتمًا بمزيدٍ من المعلومات حول سطر الأوامر فأنصحك بقراءة كتاب «<a href="http://sourceforge.net/projects/omlx/files/open%20books/TLCL/The_Linux_Command_Line-arabic-14.07.pdf/download" rel="external nofollow">سطر أوامر لينكس</a>».<br>
	ترجمة –وبتصرّف– للمقال <a href="https://wpshout.com/command-line-clis/" rel="external nofollow">What is the Command Line? CLIs from First Principles</a> لصاحبه David Hayes
</p>
]]></description><guid isPermaLink="false">353</guid><pubDate>Fri, 06 Oct 2017 21:09:09 +0000</pubDate></item><item><title>&#x645;&#x642;&#x62F;&#x645;&#x629; &#x625;&#x644;&#x649; &#x62E;&#x62F;&#x645;&#x629; Let&#x2019;s Encrypt</title><link>https://academy.hsoub.com/devops/servers/%D9%85%D9%82%D8%AF%D9%85%D8%A9-%D8%A5%D9%84%D9%89-%D8%AE%D8%AF%D9%85%D8%A9-let%E2%80%99s-encrypt-r352/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2017_10/59d2739f1f772_main(62).png.7035af73ed7c7c1c21a4a3c0e8327678.png" /></p>

<p>
	<a href="https://letsencrypt.org/" rel="external nofollow">Let’s Encrypt</a> هي سلطة شهادات مفتوحة ومؤتمتة تستعمل بروتوكول <a href="https://ietf-wg-acme.github.io/acme/draft-ietf-acme-acme.html" rel="external nofollow">ACME ‏(Automatic Certificate Management Environment)</a> لتوفير شهادات <abbr title="Transport Layer Security | بروتوكول أمن طبقة النقل">TLS</abbr>/<abbr title="Secure Socket Layer | طبقة المنافذ الآمنة">SSL</abbr> مجانية لأي عميل يحقق الشروط المطلوبة، وتلك الشهادات يمكن أن تستعمل لتشفير الاتصالات بين خادوم الويب وزوار موقعك. هنالك الكثير من العملاء المتاحة لبروتوكول ACME المكتوبة بمختلف لغات البرمجة، مع قدرة على الدمج مع أدوات الإدارة والخدمات والخواديم الشهيرة.<br>
	أشهر عميل ACME باسم <a href="https://certbot.eff.org/" rel="external nofollow">Certbot</a> يُطوَّر حاليًا من <a href="https://www.eff.org/" rel="external nofollow">Electronic Frontier Foundation</a>. ويمكن لعميل Certbot ضبط تشفير <abbr title="Transport Layer Security | بروتوكول أمن طبقة النقل">TLS</abbr>/<abbr title="Secure Socket Layer | طبقة المنافذ الآمنة">SSL</abbr> في خودايم أباتشي و Nginx إضافةً إلى التحقق من ملكية النطاق والحصول على الشهادات.<br>
	سيشرح هذا الدرس سلطات الشهادات باختصار وكيف تعمل خدمة Let’s Encrypt، ثم سنتحدث عن بعض عملاء ACME.
</p>

<h2 id="ما-هي-سلطة-الشهادات">
	ما هي سلطة الشهادات؟
</h2>

<p>
	سلطات الشهادات (certificate authorities اختصارًا CAs) هي الجهات التي توقِّع شهادات <abbr title="Transport Layer Security | بروتوكول أمن طبقة النقل">TLS</abbr>/<abbr title="Secure Socket Layer | طبقة المنافذ الآمنة">SSL</abbr> رقميًا لضمان وكفالة موثوقيتها. إذ تملك المتصفحات وأنظمة التشغيل قائمةً بسلطات الشهادات الموثوقة التي يمكن استعمالها للتحقق من شهادات أحد المواقع.<br>
	حتى وقتٍ قريب، كانت أغلبية سلطات الشهادات خاضعة لشركات تجارية والتي تتقاضى أموالًا للحصول على خدمات توقيع الشهادات، لكن أتت خدمة Let’s Encrypt وجعلت هذه العملية مجانية للمستخدمين عبر أتمتة العملية كليًّا، وبالاعتماد على نظام الرعاية والمساهمات المالية لتمويل البنية التحتية اللازمة لتشغيل مثل هذه الخدمة.<br>
	لمزيدٍ من المعلومات حول الشهادات والأنواع المختلفة من سلطات الشهادات، فاقرأ مقالة <a href="https://www.digitalocean.com/community/tutorials/a-comparison-of-let-s-encrypt-commercial-and-private-certificate-authorities-and-self-signed-ssl-certificates" rel="external nofollow">A Comparison of Let’s Encrypt, Commercial and Private Certificate Authorities, and Self-Signed <abbr title="Secure Socket Layer | طبقة المنافذ الآمنة">SSL</abbr> Certificates</a>.
</p>

<h2 id="كيف-تعمل-خدمة-lets-encrypt">
	كيف تعمل خدمة Let’s Encrypt
</h2>

<p>
	بروتوكول ACME يُعرِّف كيفية تواصل العملاء مع الخواديم لطلب الشهادات والتحقق من ملكية النطاقات وتنزيل الشهادات، وهذا البروتوكول في صدد تحويله إلى معيار <a href="https://www.ietf.org/" rel="external nofollow">IETF</a> رسمي.<br>
	توفِّر خدمة Let’s Encrypt شهادات لنطاقات موثوقة، وهذا يعني أنَّها ستتحقق أنَّ الشهادة تأتي من شخصٍ يتحكم فعليًا بالنطاق، وذلك عبر إرسال العميل لرمز فريد (unique token) ثم إجراء طلبية ويب أو DNS للحصول على مفتاح مأخوذ من ذاك الرمز.<br>
	على سبيل المثال، لو كنا سنجري تحقق عبر HTTP، فسيحسب العميل المفتاح من الرمز الفريد (unique token) ورمز الحساب (account token)، ثم يضع الناتج في ملف مُخدَّم من خادوم الويب، ثم يمكن لخواديم Let’s Encrypt أن تنزِّل الملف الموجود في المسار <code><a href="http://example.com/.well-known/acme-challenge/token" ipsnoembed="false" rel="external nofollow">http://example.com/.well-known/acme-challenge/token</a></code> فإذا كان المفتاح صحيحًا، فهذا يعني أن العميل قادرٌ على التحكم بالموارد الموجودة في النطاق <code>example.com</code> وبالتالي سيوقِّع الخادوم الشهادة ويتيحها للعميل.<br>
	يُعرِّف بروتوكول ACME عدِّة طرائق للتحقق أنَّ العميل يملك النطاق، فاختبار HTTPS شبيه باختبار HTTP، لكن بدلًا من استخدام ملف نصي فسيوفِّر العميل شهادة موقعة ذاتيًا وفيها مفتاح التحقق. أما التحقق عبر DNS فيتم عبر وضع المفتاح في سجل DNS TXT.
</p>

<h2 id="عميل-certbot">
	عميل Certbot
</h2>

<p>
	Certbot هو أشهر عميل Let’s Encrypt، وهو متوافر في أغلبية توزيعات لينكس ويتضمن القدرة على الضبط التلقائي لخادومَي أباتشي و Nginx.<br>
	يمكنك الحصول على الشهادة وتحديث ضبط أباتشي بتنفيذ الأمر الآتي بعد تثبيت عميل Certbot:
</p>

<pre class="ipsCode" id="ips_uid_3537_7">
sudo certbot --apache -d www.example.com</pre>

<p>
	سيسألك Certbot بعض الأسئلة ثم يجري عملية التحقق وينزِّل الشهادات ويُحدِّث ضبط أباتشي ويعيد تحميل الخادوم، ويمكنك بعد ذلك أن تنتقل إلى <code><a href="https://www.example.com" ipsnoembed="false" rel="external nofollow">https://www.example.com</a></code> في متصفح الويب الخاص بك وستشاهد القفل الأخضر مشيرًا إلى أنَّ الشهادة صحيحة والاتصال مشفّر.<br>
	ولأن شهادات Let’s Encrypt صالحة لتسعين يومًا فقط، فمن المهم ضبط عملية تجديد مؤتمة.<br>
	الأمر الآتي سيُجدِّد كل الشهادات الموجودة على الحاسوب:
</p>

<pre class="ipsCode" id="ips_uid_3537_7">
<code class="hljs bash"><span class="hljs-built_in"><span class="pln">sudo</span></span><span class="pln"> certbot renew</span></code></pre>

<p>
	ضع الأمر السابق في جدول cron وشغِّله يوميًا، وستُجدَّد الشهادات تلقائيًا قبل ثلاثين يومًا من انتهاء صلاحيتها، وإذا أُنشِئَت الشهادة بادئ الأمر مع أحد الخيارين <code>‎--apache</code> أو <code>‎--nginx</code> فسيعيد Certbot تحميل الخادوم بعد نجاح عملية التجديد.<br>
	إذا أردتَ معرفة المزيد من المعلومات حول جداول cron فأحيلك إلى درس <a href="https://academy.hsoub.com/devops/linux/%D9%83%D9%8A%D9%81-%D9%86%D8%B3%D8%AA%D8%AE%D8%AF%D9%85-%D8%A7%D9%84%D9%85%D9%87%D8%A7%D9%85-%D8%A7%D9%84%D9%85%D8%AC%D8%AF%D9%88%D9%84%D8%A9-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-cron-%D9%81%D9%8A-%D8%A3%D9%86%D8%B8%D9%85%D8%A9-%D9%84%D9%8A%D9%86%D9%83%D8%B3-%D9%88%D9%8A%D9%88%D9%86%D9%83%D8%B3-r277/" rel="">كيف نستخدم المهام المجدولة باستخدامCron في أنظمة لينكس ويونكس</a>.
</p>

<h2 id="عملاء-آخرين">
	عملاء آخرين
</h2>

<p>
	لأن بروتوكول ACME مفتوح وموثّق جيدًا، فقد طوِّرَ الكثير من العملاء البديلين، وهنالك <a href="https://letsencrypt.org/docs/client-options/" rel="external nofollow">قائمة بعملاء ACME</a> في موقع Let’s Encrypt، وأغلبية العملاء لا يملكون ميزة ضبط خادوم الويب تلقائيًا التي يملكها Certbot لكن هنالك ميزات أخرى لها قد تجذبك:<br>
	- هنالك عميل مكتوب بكل لغات البرمجة تقريبًا، بما في ذلك سكربتات الصدفة (shell scripts) ولغة Go و Node.js، وقد تستفيد من ذلك إن كنتَ تُنشِئ شهادات في بيئة مغلقة لا يمكن تضمين بايثون فيها ولا بقية اعتماديات Certbot.<br>
	- بعض العملاء يمكن أن يعملوا دون امتيازات الجذر، فمن المستحسن تقليل كمية الشيفرات التي تعمل بامتيازات الجذر إلى أقل قدر ممكن.<br>
	- الكثير من العملاء يمكنها أتمتة عملية التحقق عبر DNS عبر استخدام الواجهة البرمجية المناسبة لموفِّر خدمة DNS لإنشاء سجلات TXT تلقائيًا، والتحقق عبر DNS يسمح بتوليد شهادات لحالات الاستخدام الغريبة مثل تشفير خواديم الويب التي لا يمكن للعموم الوصول إليها.<br>
	- بعض العملاء يمكن أن يندمج مع خودايم الويب أو الخواديم الوسيطة (proxy) العكسية، أو موزّعات الحِمل (load balancers) مما يسهِّل عملية الضبط والتشغيل.<br>
	بعض أشهر تلك العملاء:<br>
	- <a href="https://github.com/xenolf/lego" rel="external nofollow">lego</a> المكتوب بلغة Go، والذي يُثبَّت عبر ملفٍ ثنائيٍ وحيد، والذي يدعم عدد من مزودي خدمة DNS لتسهيل التحقق عبر DNS.<br>
	- <a href="https://github.com/Neilpang/acme.sh" rel="external nofollow">acme.sh</a> وهو سكربت صدفة بسيط يمكن أن يعمل دون امتيازات الجذر، ويستطيع أن يتواصل مع أكثر من 30 مزودًا لخدمة DNS.<br>
	- <a href="https://caddyserver.com/" rel="external nofollow">Caddy</a> وهو خادوم ويب كامل مكتوب بلغة Go والذي يملك دعمًا مدمجًا فيه لخدمة Let’s Encrypt.<br>
	يتوافر الكثير من العملاء، وأصبحت العديد من الخدمات والخواديم تؤتمت عملية إعداد <abbr title="Transport Layer Security | بروتوكول أمن طبقة النقل">TLS</abbr>/<abbr title="Secure Socket Layer | طبقة المنافذ الآمنة">SSL</abbr> بدعم خدمة Let’s Encrypt فيها.
</p>

<h2 id="الخلاصة">
	الخلاصة
</h2>

<p>
	لقد شرحنا أساسيات عمل خدمة Let’s Encrypt، وناقشنا أشهر العملاء المتوافرين، وإذا أردتَ معرفة كيفية إعداد هذه الخدمة مع بقية البرمجيات فأنصحك بالاطلاع على درس <a href="https://academy.hsoub.com/devops/servers/%D8%AA%D9%86%D8%B5%D9%8A%D8%A8-%D8%B4%D9%87%D8%A7%D8%AF%D8%A9-ssl-%D9%85%D8%AC%D8%A7%D9%86%D9%8A%D8%A9-%D8%B9%D8%A8%D8%B1-%D8%AE%D8%AF%D9%85%D8%A9-lets-encrypt-%D8%B9%D9%84%D9%89-%D8%AE%D8%A7%D8%AF%D9%88%D9%85-%D9%84%D9%8A%D9%86%D9%83%D8%B3-r151/" rel="">تنصيب شهادة <abbr title="Secure Socket Layer | طبقة المنافذ الآمنة">SSL</abbr> مجانية عبر خدمة Let’s encrypt على خادوم لينكس</a>.<br>
	ترجمة –وبتصرّف– للمقال <a href="https://www.digitalocean.com/community/tutorials/an-introduction-to-let-s-encrypt" rel="external nofollow">An Introduction to Let’s Encrypt</a> لصاحبه Brian Boucheron
</p>
]]></description><guid isPermaLink="false">352</guid><pubDate>Mon, 02 Oct 2017 17:14:00 +0000</pubDate></item><item><title>&#x643;&#x64A;&#x641;&#x64A;&#x629; &#x62A;&#x62B;&#x628;&#x64A;&#x62A; &#x648;&#x648;&#x631;&#x62F;&#x628;&#x631;&#x64A;&#x633; &#x639;&#x644;&#x649; &#x62E;&#x627;&#x62F;&#x648;&#x645; LAMP &#x641;&#x64A; &#x623;&#x648;&#x628;&#x646;&#x62A;&#x648; 16.04</title><link>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-%D9%88%D9%88%D8%B1%D8%AF%D8%A8%D8%B1%D9%8A%D8%B3-%D8%B9%D9%84%D9%89-%D8%AE%D8%A7%D8%AF%D9%88%D9%85-lamp-%D9%81%D9%8A-%D8%A3%D9%88%D8%A8%D9%86%D8%AA%D9%88-1604-r342/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2017_08/59a830a2e1b74_main(9).png.e2d0b3d8f6d1e653161e38897a49578f.png" /></p>

<h2 id="تمهيد">
	تمهيد
</h2>

<p>
	يعدّ <a href="https://academy.hsoub.com/apps/web/wordpress/" rel="">ووردبريس</a> أشهر نظام إدارة محتوى (CMS) موجود على الإنترنت، حيث تسمح بإنشاء مدونات ومواقع مرنة بسهولة، بالاعتماد على قواعد بيانات <a href="https://academy.hsoub.com/devops/servers/databases/mysql/" rel="">MySQL</a> مع لغة <a href="https://academy.hsoub.com/programming/php/" rel="">PHP</a>.<br>
	أصبح ووردبريس منتشرًا انتشارًا واسعًا وهي خيارٌ ممتازٌ لإنشاء موقع إلكتروني بسرعة؛ إذ نستطيع إجراء أغلبية عمليات إدارة الموقع من لوحة التحكم الخاصة به.<br>
	سنُركِّز في هذا الدرس على ضبط نسخة ووردبريس على خادوم LAMP (أي خادوم يستعمل نظام لينكس، مع خادوم وب <a href="https://academy.hsoub.com/devops/servers/web/apache/" rel="">Apache</a>، قاعدة بيانات MySQL و لغة البرمجة PHP) على أوبنتو 16.04.
</p>

<h2 id="المتطلبات-المسبقة">
	المتطلبات المسبقة
</h2>

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

<ul>
<li>
		إنشاء مستخدم بصلاحيات <code>sudo</code> على الخادوم: إذ سنُطبِّق الأوامر المذكورة في هذا الدرس عبر مستخدمٍ ليس جذرًا لكن لديه امتيازات الجذر عبر الأمر <code>sudo</code>. يمكنك إنشاء مستخدم له امتيازات الجذر باستخدام الأمر <code>sudo</code> باتباع درس <a href="https://academy.hsoub.com/devops/servers/%D8%A7%D9%84%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF-%D8%A7%D9%84%D8%A7%D8%A8%D8%AA%D8%AF%D8%A7%D8%A6%D9%8A-%D9%84%D8%AE%D8%A7%D8%AF%D9%88%D9%85-%D8%A3%D9%88%D8%A8%D9%86%D8%AA%D9%88-1404-r4/" rel="">الإعداد الابتدائي لخادوم أوبنتو 14.04</a>.
	</li>
	<li>
		تثبيت برمجيات LAMP: تحتاج ووردبريس إلى خادوم ويب وقاعدة بيانات ومُفسِّر PHP لكي تعمل عملًا سليمًا؛ وبالتالي إذا ثبَّتتَ برمجيات LAMP فستُحقق هذا المتطلب. اتبع التعليمات الموجودة في درس <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="">كيف تثبت حزم MySQL ،Apache ،Linux :LAMP و PHP على أوبنتو</a> لتعلّم طريقة تثبيت وضبط تلك البرمجيات.
	</li>
	<li>
		تأمين الموقع باستخدام شهادة <abbr title="Secure Socket Layer | طبقة المنافذ الآمنة">SSL</abbr>: تقدّم ووردبريس محتوى ديناميكي وفيها خاصيات للاستيثاق من المستخدمين وتسجيل دخولهم.<br>
		تسمح لنا تقنية <abbr title="Transport Layer Security | بروتوكول أمن طبقة النقل">TLS</abbr>/<abbr title="Secure Socket Layer | طبقة المنافذ الآمنة">SSL</abbr> بتشفير المحتوى المقدَّم من موقعنا مما يعني أنَّ الاتصال أصبح آمنًا. إلا أنَّ الطريقة التي ستتبعها لضبط <abbr title="Secure Socket Layer | طبقة المنافذ الآمنة">SSL</abbr> تختلف فيما إذا كان لديك اسم نطاق لموقعك أم لا:
		<ul>
<li>
				إذا كان لديك اسم نطاق خاص بالموقع: أسهل طريقة لتشفير موقعك هي بالاستعانة بخدمة Let’s Encrypt والتي توفِّر شهادات مجانية وموثوقة. راجع الدرس <a href="https://academy.hsoub.com/devops/servers/%D8%AA%D9%86%D8%B5%D9%8A%D8%A8-%D8%B4%D9%87%D8%A7%D8%AF%D8%A9-ssl-%D9%85%D8%AC%D8%A7%D9%86%D9%8A%D8%A9-%D8%B9%D8%A8%D8%B1-%D8%AE%D8%AF%D9%85%D8%A9-lets-encrypt-%D8%B9%D9%84%D9%89-%D8%AE%D8%A7%D8%AF%D9%88%D9%85-%D9%84%D9%8A%D9%86%D9%83%D8%B3-r151/" rel="">تنصيب شهادة <abbr title="Secure Socket Layer | طبقة المنافذ الآمنة">SSL</abbr> مجانية عبر خدمة Let’sencrypt على خادوم لينكس</a> لمزيدٍ من المعلومات.
			</li>
			<li>
				إذا لم يكن لديك اسم نطاق خاص بالموقع: وكنتَ تجرب ضبط ووردبريس للتعلّم أو لاستخدامك الشخصي، فيمكنك استخدام شهادة موقعة ذاتيًا. وهذا يوفِّر نوع التشفير نفسه، لكن دون التحقق من النطاق الخاص بك. راجع <a href="https://academy.hsoub.com/devops/servers/%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D8%A7%D9%84%D8%A3%D9%85%D9%86-%D9%88%D8%A7%D9%84%D8%AD%D9%85%D8%A7%D9%8A%D8%A9-%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-%D8%A7%D9%84%D8%B4%D9%87%D8%A7%D8%AF%D8%A7%D8%AA-certificates-r187/" rel="">هذا الدرس</a> لمزيدٍ من المعلومات حول ضبط الشهادات الموقعة ذاتيًا.
			</li>
		</ul>
</li>
</ul>
<p>
	إذا كانت المتطلبات المسبقة جاهزةً، فسجِّل دخولك إلى الخادوم عبر المستخدم الذي يملك امتيازات الجذر عبر الأمر <code>sudo</code> وتابع بقية هذا الدرس.
</p>

<h2 id="الخطوة-الأولى-إنشاء-مستخدم-وقاعدة-بيانات-mysql-لووردبريس">
	الخطوة الأولى: إنشاء مستخدم وقاعدة بيانات MySQL لووردبريس
</h2>

<p>
	أوّل خطوةٍ هي خطوةٌ تحضيريةٌ، إذ تستعمل ووردبريس قواعد MySQL لتخزين وإدارة معلومات الموقع والمستخدمين.<br>
	ثبتنا مسبقًا قواعد بيانات MySQL على خادومنا، لكننا نحتاج إلى إنشاء قاعدة بيانات ومستخدم لكي تستعمله ووردبريس؛ وذلك بتسجيل الدخول بحساب <code>root</code> (حساب المدير) إلى خادوم MySQL بتنفيذ الأمر الآتي:
</p>

<pre class="ipsCode prettyprint lang-sql prettyprinted" id="ips_uid_5482_10" style="">
<span class="pln">mysql </span><span class="pun">-</span><span class="pln">u root </span><span class="pun">-</span><span class="pln">p</span></pre>

<p>
	ستُسأل عن كلمة المرور التي أدخلتها لحساب <code>root</code> عندما ثبّتتَ برمجية MySQL.
</p>

<p>
	علينا أولًا إنشاء قاعدة بيانات منفصلة لكي تستطيع ووردبريس التحكم بها كيفما تشاء؛ ويمكننا تسميتها بأيِّ اسمٍ يحلو لنا، لكننا سنستخدم الاسم <code>wordpress</code> في درسنا للسهولة.
</p>

<p>
	يمكنك إنشاء قاعدة بيانات في ووردبريس بكتابة تعليمة SQL الآتية:
</p>

<pre class="ipsCode prettyprint lang-sql prettyprinted" id="ips_uid_5482_8" style="">
<span class="pln">CREATE DATABASE wordpress DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci</span><span class="pun">;</span></pre>

<p>
	<strong>ملاحظة:</strong> يجب أن تنتهي كل تعليمات MySQL بفاصلة منقوطة <code>;</code>، لذا تأكد من وجودها إن واجهتَ أيّة مشكلات.
</p>

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

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

<pre class="ipsCode prettyprint lang-sql prettyprinted" id="ips_uid_5482_10" style="">
<code class="hljs sql"><span class="hljs-operator"><span class="hljs-keyword"><span class="pln">GRANT</span></span><span class="pln"> </span><span class="hljs-keyword"><span class="pln">ALL</span></span><span class="pln"> </span><span class="hljs-keyword"><span class="pln">ON</span></span><span class="pln"> wordpress</span><span class="pun">.*</span><span class="pln"> </span><span class="hljs-keyword"><span class="pln">TO</span></span><span class="pln"> </span><span class="hljs-string"><span class="str">'wordpressuser'</span></span><span class="pun">@</span><span class="hljs-string"><span class="str">'localhost'</span></span><span class="pln"> IDENTIFIED </span><span class="hljs-keyword"><span class="pln">BY</span></span><span class="pln"> </span><span class="hljs-string"><span class="str">'password'</span></span><span class="pun">;</span></span></code></pre>

<p>
	أصبح لدينا مستخدم وقاعدة بيانات خاصَين بووردبريس، علينا الآن تحديث جدول الامتيازات لكي يعتمد MySQL التغييرات الأخيرة التي أجريناها:
</p>

<pre class="ipsCode prettyprint lang-sql prettyprinted" id="ips_uid_5482_10" style="">
<code class="hljs "><span class="pln">FLUSH PRIVILEGES</span><span class="pun">;</span></code></pre>

<p>
	يمكننا الخروج من سطر أوامر MySQL بكتابة:
</p>

<pre class="ipsCode prettyprint lang-sql prettyprinted" id="ips_uid_5482_10" style="">
<code class="hljs php"><span class="hljs-keyword"><span class="pln">EXIT</span></span><span class="pun">;</span></code></pre>

<h2 id="الخطوة-الثانية-تثبيت-إضافات-php">
	الخطوة الثانية: تثبيت إضافات PHP
</h2>

<p>
	عندما ضبطنا برمجيات LAMP ثبّتنا الحد الأدنى اللازم من وِحْدات PHP لكي تتواصل مع MySQL تواصلًا سليمًا؛ لكن ووردبريس والإضافات التابعة لها تستعمل وحدات PHP أخرى.<br>
	يمكننا تنزيل وتثبيت أشهر وحدات PHP لاستعمالها مع ووردبريس بتنفيذ الأمرين الآتيين:
</p>

<pre class="ipsCode prettyprint lang-sql prettyprinted" id="ips_uid_5482_10" style="">
<code class="hljs lasso"><span class="pln">sudo apt</span><span class="hljs-attribute"><span class="pun">-</span><span class="kwd">get</span></span><span class="pln"> update
sudo apt</span><span class="hljs-attribute"><span class="pun">-</span><span class="kwd">get</span></span><span class="pln"> install php</span><span class="hljs-attribute"><span class="pun">-</span><span class="pln">curl</span></span><span class="pln"> php</span><span class="hljs-attribute"><span class="pun">-</span><span class="pln">gd</span></span><span class="pln"> php</span><span class="hljs-attribute"><span class="pun">-</span><span class="pln">mbstring</span></span><span class="pln"> php</span><span class="hljs-attribute"><span class="pun">-</span><span class="pln">mcrypt</span></span><span class="pln"> php</span><span class="hljs-attribute"><span class="pun">-</span><span class="pln">xml</span></span><span class="pln"> php</span><span class="hljs-attribute"><span class="pun">-</span><span class="pln">xmlrpc</span></span></code></pre>

<p>
	<strong>ملاحظة:</strong> لكل إضافة من إضافات ووردبريس متطلبات خاصة بها، وبعضها يستدعي تثبيت حزم PHP إضافية. راجع توثيق الإضافة لتعرف ما هي المتطلبات المسبقة التي تحتاج لها؛ والتي يمكن تثبيتها عبر <code>apt-get</code> (أو <code>apt</code>) إذا كانت متوافرة في المستودعات.
</p>

<p>
	علينا الآن إعادة تشغيل خادوم أباتشي لكي نستطيع استخدام الوحدات التي ثبتناها، يمكننا فعل ذلك بتنفيذ الأمر الآتي:
</p>

<pre class="ipsCode prettyprint lang-sql prettyprinted" id="ips_uid_5482_10" style="">
<code class="hljs bash"><span class="hljs-built_in"><span class="pln">sudo</span></span><span class="pln"> systemctl restart apache2</span></code></pre>

<h2 id="الخطوة-الثالثة-تعديل-ضبط-أباتشي-للسماح-باستعمال-ملفات-htaccess-ولتفعيل-وحدة-rewrite">
	الخطوة الثالثة: تعديل ضبط أباتشي للسماح باستعمال ملفات ‎.htaccess ولتفعيل وحدة Rewrite
</h2>

<p>
	علينا الآن إجراء تعديلات بسيطة على ضبط أباتشي؛ فاستعمال ملفات <code>‎.htaccess</code> مُعطّلٌ حاليًا، لكن ووردبريس (وبعض إضافاتها) تستعمل هذه الملفات لإجراء تعديلات على سلوك خادوم الويب في بعض المجلدات.<br>
	علينا أيضًا تفعيل وحدة <code>mod_rewrite</code> في أباتشي والتي سنحتاج لها لكي تعمل ميزة الروابط الدائمة (permalinks) في ووردبريس عملًا سليمًا.
</p>

<h3 id="تفعيل-ملفات-htaccess">
	تفعيل ملفات ‎.htaccess
</h3>

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

<pre class="ipsCode prettyprint lang-sql prettyprinted" id="ips_uid_5482_10" style="">
<code class="hljs bash"><span class="hljs-built_in"><span class="pln">sudo</span></span><span class="pln"> nano </span><span class="pun">/</span><span class="pln">etc</span><span class="pun">/</span><span class="pln">apache2</span><span class="pun">/</span><span class="pln">apache2</span><span class="pun">.</span><span class="pln">conf</span></code></pre>

<p>
	للسماح باستخدام ملفات <code>‎.htaccess</code> فعلينا ضبط التعليمة <code>AllowOverride</code> ضمن كتلة <code>Directory</code> التي تُشير إلى جذر الموقع. أضف الأسطر الآتية في أسفل الملف:
</p>

<pre class="ipsCode prettyprint lang-sql prettyprinted" id="ips_uid_5482_10" style="">
<code class="hljs mathematica"><span class="tag">&lt;</span><span class="hljs-keyword"><span class="tag">Directory</span></span><span class="pln"> </span><span class="pun">/</span><span class="atn">var</span><span class="pun">/</span><span class="atn">www</span><span class="pun">/</span><span class="atn">html</span><span class="tag">/&gt;</span><span class="pln">
    AllowOverride </span><span class="hljs-keyword"><span class="pln">All</span></span><span class="pln">
</span><span class="tag">&lt;/</span><span class="hljs-keyword"><span class="tag">Directory</span></span><span class="tag">&gt;</span></code></pre>

<p>
	أنهينا تعديل هذا الملف، لذا احفظه وأغلقه.
</p>

<h3 id="تفعيل-وحدة-rewrite">
	تفعيل وحدة Rewrite
</h3>

<p>
	علينا الآن تفعيل وحدة <code>mod_rewrite</code> لكي نستطيع الاستفادة من ميزة الروابط الدائمة في ووردبريس:
</p>

<pre class="ipsCode prettyprint lang-sql prettyprinted" id="ips_uid_5482_10" style="">
<code class="hljs bash"><span class="hljs-built_in"><span class="pln">sudo</span></span><span class="pln"> a2enmod rewrite</span></code></pre>

<h3 id="تفعيل-التعديلات-التي-أجريناها">
	تفعيل التعديلات التي أجريناها
</h3>

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

<pre class="ipsCode prettyprint lang-sql prettyprinted" id="ips_uid_5482_10" style="">
<code class="hljs bash"><span class="hljs-built_in"><span class="pln">sudo</span></span><span class="pln"> apache2ctl configtest</span></code></pre>

<p>
	من المفترض أن يكون الناتج شبيهًا بالرسالة الآتية:
</p>

<pre class="ipsCode prettyprint lang-sql prettyprinted" id="ips_uid_5482_10" style="">
<code class="hljs applescript"><span class="pln">AH00558</span><span class="pun">:</span><span class="pln"> apache2</span><span class="pun">:</span><span class="pln"> </span><span class="typ">Could</span><span class="pln"> </span><span class="hljs-keyword"><span class="kwd">not</span></span><span class="pln"> reliably determine </span><span class="hljs-keyword"><span class="pln">the</span></span><span class="pln"> server</span><span class="str">'s fully qualified domain </span><span class="hljs-property"><span class="str">name</span></span><span class="str">, using </span><span class="hljs-number"><span class="str">127.0</span></span><span class="hljs-number"><span class="str">.1</span></span><span class="hljs-number"><span class="str">.1</span></span><span class="str">. Set </span><span class="hljs-keyword"><span class="str">the</span></span><span class="str"> '</span><span class="typ">ServerName</span><span class="str">' directive globally </span><span class="hljs-keyword"><span class="str">to</span></span><span class="str"> suppress this message
Syntax OK</span></code></pre>

<p>
	إذا أردت التخلص من أوّل سطر، فأضف التعليمة <code>SeverName</code> إلى ملف <code>‎/etc/apache2/apache2.conf</code> التي تشير إلى اسم نطاق الخادوم أو إلى عنوان IP الخاص به، لكن اعلم أنَّ هذه الرسالة لا تؤثر على عمل موقعنا، فلطالما كان الناتج يحتوي على السطر <code>Syntax OK</code> سنستطيع أن نكمل عملية تفعيل التعديلات بإعادة تشغيل خادوم أباتشي:
</p>

<pre class="ipsCode prettyprint lang-sql prettyprinted" id="ips_uid_5482_10" style="">
<code class="hljs bash"><span class="hljs-built_in"><span class="pln">sudo</span></span><span class="pln"> systemctl restart apache2</span></code></pre>

<h2 id="الخطوة-الرابعة-تنزيل-ووردبريس">
	الخطوة الرابعة: تنزيل ووردبريس
</h2>

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

<p>
	انتقل إلى مجلد تستطيع الكتابة عليه، ثم نزِّل الملف المضغوط من الإنترنت عبر كتابة الأمرين الآتيين:
</p>

<pre class="ipsCode prettyprint lang-sql prettyprinted" id="ips_uid_5482_10" style="">
<code class="hljs avrasm"><span class="pln">cd </span><span class="pun">/</span><span class="pln">tmp
curl </span><span class="pun">-</span><span class="pln">O https</span><span class="pun">:</span><span class="com">//wordpress</span><span class="hljs-preprocessor"><span class="com">.org</span></span><span class="com">/latest</span><span class="hljs-preprocessor"><span class="com">.tar</span></span><span class="hljs-preprocessor"><span class="com">.gz</span></span></code></pre>

<p>
	استخرج محتويات الملف المضغوط:
</p>

<pre class="ipsCode prettyprint lang-sql prettyprinted" id="ips_uid_5482_10" style="">
<code class="hljs avrasm"><span class="pln">tar xzvf latest</span><span class="hljs-preprocessor"><span class="pun">.</span><span class="pln">tar</span></span><span class="hljs-preprocessor"><span class="pun">.</span><span class="pln">gz</span></span></code></pre>

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

<pre class="ipsCode prettyprint lang-sql prettyprinted" id="ips_uid_5482_10" style="">
<code class="hljs avrasm"><span class="pln">touch </span><span class="pun">/</span><span class="pln">tmp</span><span class="pun">/</span><span class="pln">wordpress</span><span class="pun">/</span><span class="hljs-preprocessor"><span class="pun">.</span><span class="pln">htaccess</span></span><span class="pln">
chmod </span><span class="hljs-number"><span class="lit">660</span></span><span class="pln"> </span><span class="pun">/</span><span class="pln">tmp</span><span class="pun">/</span><span class="pln">wordpress</span><span class="pun">/</span><span class="hljs-preprocessor"><span class="pun">.</span><span class="pln">htaccess</span></span></code></pre>

<p>
	سننسخ أيضًا الملف التي يحتوي على مثال عن ضبط ووردبريس إلى الملف الذي ستقرأه ووردبريس:
</p>

<pre class="ipsCode prettyprint lang-sql prettyprinted" id="ips_uid_5482_10" style="">
<code class="hljs avrasm"><span class="hljs-keyword"><span class="pln">cp</span></span><span class="pln"> </span><span class="pun">/</span><span class="pln">tmp</span><span class="pun">/</span><span class="pln">wordpress</span><span class="pun">/</span><span class="pln">wp</span><span class="pun">-</span><span class="pln">config</span><span class="pun">-</span><span class="pln">sample</span><span class="hljs-preprocessor"><span class="pun">.</span><span class="pln">php</span></span><span class="pln"> </span><span class="pun">/</span><span class="pln">tmp</span><span class="pun">/</span><span class="pln">wordpress</span><span class="pun">/</span><span class="pln">wp</span><span class="pun">-</span><span class="pln">config</span><span class="hljs-preprocessor"><span class="pun">.</span><span class="pln">php</span></span></code></pre>

<p>
	سنُنشِئ أيضًا مجلدًا باسم <code>upgrade</code> لكي لا تواجه ووردبريس مشاكل في الأذونات عندما تحاول تنزيل التحديثات من الإنترنت:
</p>

<pre class="ipsCode prettyprint lang-sql prettyprinted" id="ips_uid_5482_10" style="">
<code class="hljs perl"><span class="hljs-keyword"><span class="pln">mkdir</span></span><span class="pln"> </span><span class="pun">/</span><span class="pln">tmp</span><span class="pun">/</span><span class="pln">wordpress</span><span class="pun">/</span><span class="pln">wp</span><span class="pun">-</span><span class="pln">content</span><span class="pun">/</span><span class="pln">upgrade</span></code></pre>

<p>
	يمكننا الآن نسخ كامل محتويات المجلد إلى المجلد الجذر لموقعنا، وسنستخدم الخيار <code>‎-a</code> لإبقاء الأذونات كما هي؛ وسنستخدم نقطة في نهاية مسار المجلد الذي سننسخه للإشارة إلى أننا نريد نسخ كل شيء في ذاك المجلد بما في ذلك المجلدات المخفية (مثل الملف <code>‎.htaccess</code> الذي أنشأناها منذ قليل):
</p>

<pre class="ipsCode prettyprint lang-sql prettyprinted" id="ips_uid_5482_10" style="">
<code class="hljs bash"><span class="hljs-built_in"><span class="pln">sudo</span></span><span class="pln"> cp </span><span class="hljs-operator"><span class="pun">-</span><span class="pln">a</span></span><span class="pln"> </span><span class="pun">/</span><span class="pln">tmp</span><span class="pun">/</span><span class="pln">wordpress</span><span class="pun">/.</span><span class="pln"> </span><span class="pun">/</span><span class="kwd">var</span><span class="pun">/</span><span class="pln">www</span><span class="pun">/</span><span class="pln">html</span></code></pre>

<h2 id="الخطوة-الخامسة-ضبط-مجلد-ووردبريس">
	الخطوة الخامسة: ضبط مجلد ووردبريس
</h2>

<p>
	قبل أن نُشغِّل معالج التثبيت الخاص بووردبريس من المتصفح، علينا تعديل بعض الأشياء في مجلد ووردبريس.
</p>

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

<p>
	أحد أهم الأمور التي علينا فعلها هو ضبط ملكية الملفات وأذوناتها، فسنحتاج إلى الكتابة إلى تلك الملفات كمستخدمٍ عادي، وعلينا السماح لخادوم الويب بالوصول إليها وتعديل ملفات ومجلدات معيّنة لكي تعمل ووردبريس كما ينبغي.<br>
	سنبدأ بضبط ملكية كل الملفات الموجودة في جذر الموقع إلى المستخدم الحالي (الذي سنسميه <code>sammy</code> في هذا الدرس، لكن عليك تعديله ليُطابِق اسم المستخدم الذي تستعمله للوصول إلى امتيازات الجذر)، وسنضبط المجموعة المالكة إلى <code>www-data</code>:
</p>

<pre class="ipsCode prettyprint lang-sql prettyprinted" id="ips_uid_5482_10" style="">
<code class="hljs lasso"><span class="pln">sudo chown </span><span class="hljs-attribute"><span class="pun">-</span><span class="pln">R</span></span><span class="pln"> sammy</span><span class="pun">:</span><span class="pln">www</span><span class="hljs-attribute"><span class="pun">-</span><span class="pln">data</span></span><span class="pln"> </span><span class="pun">/</span><span class="hljs-built_in"><span class="kwd">var</span></span><span class="pun">/</span><span class="pln">www</span><span class="pun">/</span><span class="pln">html</span></code></pre>

<p>
	علينا الآن ضبط الأذن الخاص <code>setgid</code> على كل مجلد موجود ضمن مجلد الجذر للموقع، وهذا يؤدي إلى وراثة الملفات المُنشأة ضمن تلك المجلدات لمجموعة المجلد الأب (والتي ضبطناها إلى <code>www-data</code>) بدلًا من جعلها مملوكةً لمجموعة المستخدم المُنشِئ لها؛ وهذا يعني أننا لو أنشأنا ملفًا ضمن أحد تلك المجلدات باستخدام سطر الأوامر فسيملكه خادوم الويب (عبر المجموعة <code>www-data</code>).<br>
	يمكننا ضبط الإذن <code>setgid</code> على كل مجلد من مجلدات ووردبريس بتنفيذ الأمر الآتي:
</p>

<pre class="ipsCode prettyprint lang-sql prettyprinted" id="ips_uid_5482_10" style="">
<code class="hljs haskell"><span class="hljs-title"><span class="pln">sudo</span></span><span class="pln"> find </span><span class="pun">/</span><span class="kwd">var</span><span class="pun">/</span><span class="pln">www</span><span class="pun">/</span><span class="pln">html </span><span class="pun">-</span><span class="hljs-typedef"><span class="hljs-keyword"><span class="pln">type</span></span><span class="pln"> d </span><span class="pun">-</span><span class="kwd">exec</span><span class="pln"> chmod g</span><span class="pun">+</span><span class="pln">s </span><span class="hljs-container"><span class="pun">{}</span></span><span class="pln"> \;</span></span></code></pre>

<p>
	هنالك أذونات أخرى علينا تعديلها؛ فعلينا إعطاء المجموعة المالكة إذن الكتابة إلى مجلد <code>wp-content</code> لكي نتمكن من تعديل القوالب والإضافات من واجهة الويب:
</p>

<pre class="ipsCode prettyprint lang-sql prettyprinted" id="ips_uid_5482_10" style="">
<code class="hljs lasso"><span class="pln">sudo chmod g</span><span class="hljs-subst"><span class="pun">+</span></span><span class="pln">w </span><span class="pun">/</span><span class="hljs-built_in"><span class="kwd">var</span></span><span class="pun">/</span><span class="pln">www</span><span class="pun">/</span><span class="pln">html</span><span class="pun">/</span><span class="pln">wp</span><span class="hljs-attribute"><span class="pun">-</span><span class="pln">content</span></span></code></pre>

<p>
	وعلينا إعطاء خادوم الويب إذن الكتابة على جميع محتويات المجلدين <code>themes</code> و <code>plugins</code> كما يلي:
</p>

<pre class="ipsCode prettyprint lang-sql prettyprinted" id="ips_uid_5482_10" style="">
<code class="hljs lasso"><span class="pln">sudo chmod </span><span class="hljs-attribute"><span class="pun">-</span><span class="pln">R</span></span><span class="pln"> g</span><span class="hljs-subst"><span class="pun">+</span></span><span class="pln">w </span><span class="pun">/</span><span class="hljs-built_in"><span class="kwd">var</span></span><span class="pun">/</span><span class="pln">www</span><span class="pun">/</span><span class="pln">html</span><span class="pun">/</span><span class="pln">wp</span><span class="hljs-attribute"><span class="pun">-</span><span class="pln">content</span></span><span class="pun">/</span><span class="pln">themes
sudo chmod </span><span class="hljs-attribute"><span class="pun">-</span><span class="pln">R</span></span><span class="pln"> g</span><span class="hljs-subst"><span class="pun">+</span></span><span class="pln">w </span><span class="pun">/</span><span class="hljs-built_in"><span class="kwd">var</span></span><span class="pun">/</span><span class="pln">www</span><span class="pun">/</span><span class="pln">html</span><span class="pun">/</span><span class="pln">wp</span><span class="hljs-attribute"><span class="pun">-</span><span class="pln">content</span></span><span class="pun">/</span><span class="pln">plugins</span></code></pre>

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

<h3 id="إعداد-ملف-ضبط-ووردبريس">
	إعداد ملف ضبط ووردبريس
</h3>

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

<pre class="ipsCode prettyprint lang-sql prettyprinted" id="ips_uid_5482_10" style="">
<code class="hljs avrasm"><span class="pln">curl </span><span class="pun">-</span><span class="pln">s https</span><span class="pun">:</span><span class="com">//<abbr title="Application Programming Interface | واجهة برمجية">api</abbr></span><span class="hljs-preprocessor"><span class="com">.wordpress</span></span><span class="hljs-preprocessor"><span class="com">.org</span></span><span class="com">/secret-key/</span><span class="hljs-number"><span class="com">1.1</span></span><span class="com">/salt/</span></code></pre>

<p>
	ستحصل على قيمٍ فريدةٍ كما هو ظاهر في المثال الآتي:<br><strong>تحذير:</strong> من المهم جدًا طلب قيم فريدة في كل مرة. لا تنسخ القيم الآتية!
</p>

<pre class="ipsCode prettyprint lang-sql prettyprinted" id="ips_uid_5482_10" style="">
<code class="hljs lasso"><span class="hljs-class"><span class="hljs-keyword"><span class="pln">define</span></span></span><span class="pun">(</span><span class="hljs-string"><span class="str">'AUTH_KEY'</span></span><span class="pun">,</span><span class="pln">         </span><span class="hljs-string"><span class="str">'1jl/vqfs&lt;XhdXoAPz9 DO NOT COPY THESE VALUES c_j{iwqD^&lt;+c9.k&lt;J@4H'</span></span><span class="pun">);</span><span class="pln">
</span><span class="hljs-class"><span class="hljs-keyword"><span class="pln">define</span></span></span><span class="pun">(</span><span class="hljs-string"><span class="str">'SECURE_AUTH_KEY'</span></span><span class="pun">,</span><span class="pln">  </span><span class="hljs-string"><span class="str">'E2N-h2]Dcvp+aS/p7X DO NOT COPY THESE VALUES {Ka(f;rv?Pxf})CgLi-3'</span></span><span class="pun">);</span><span class="pln">
</span><span class="hljs-class"><span class="hljs-keyword"><span class="pln">define</span></span></span><span class="pun">(</span><span class="hljs-string"><span class="str">'LOGGED_IN_KEY'</span></span><span class="pun">,</span><span class="pln">    </span><span class="hljs-string"><span class="str">'W(50,{W^,OPB%PB&lt;JF DO NOT COPY THESE VALUES 2;y&amp;,2m%3]R6DUth[;88'</span></span><span class="pun">);</span><span class="pln">
</span><span class="hljs-class"><span class="hljs-keyword"><span class="pln">define</span></span></span><span class="pun">(</span><span class="hljs-string"><span class="str">'NONCE_KEY'</span></span><span class="pun">,</span><span class="pln">        </span><span class="hljs-string"><span class="str">'ll,4UC)7ua+8&lt;!4VM+ DO NOT COPY THESE VALUES #`DXF+[$atzM7 o^-C7g'</span></span><span class="pun">);</span><span class="pln">
</span><span class="hljs-class"><span class="hljs-keyword"><span class="pln">define</span></span></span><span class="pun">(</span><span class="hljs-string"><span class="str">'AUTH_SALT'</span></span><span class="pun">,</span><span class="pln">        </span><span class="hljs-string"><span class="str">'koMrurzOA+|L_lG}kf DO NOT COPY THESE VALUES  07VC*Lj*lD&amp;?3w!BT#-'</span></span><span class="pun">);</span><span class="pln">
</span><span class="hljs-class"><span class="hljs-keyword"><span class="pln">define</span></span></span><span class="pun">(</span><span class="hljs-string"><span class="str">'SECURE_AUTH_SALT'</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">'p32*p,]z%LZ+pAu:VY DO NOT COPY THESE VALUES C-?y+K0DK_+F|0h{!_xY'</span></span><span class="pun">);</span><span class="pln">
</span><span class="hljs-class"><span class="hljs-keyword"><span class="pln">define</span></span></span><span class="pun">(</span><span class="hljs-string"><span class="str">'LOGGED_IN_SALT'</span></span><span class="pun">,</span><span class="pln">   </span><span class="hljs-string"><span class="str">'i^/G2W7!-1H2OQ+t$3 DO NOT COPY THESE VALUES t6**bRVFSD[Hi])-qS`|'</span></span><span class="pun">);</span><span class="pln">
</span><span class="hljs-class"><span class="hljs-keyword"><span class="pln">define</span></span></span><span class="pun">(</span><span class="hljs-string"><span class="str">'NONCE_SALT'</span></span><span class="pun">,</span><span class="pln">       </span><span class="hljs-string"><span class="str">'Q6]U:K?j4L%Z]}h^q7 DO NOT COPY THESE VALUES 1% ^qUswWgn+6&amp;xqHN&amp;%'</span></span><span class="pun">);</span></code></pre>

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

<pre class="ipsCode prettyprint lang-sql prettyprinted" id="ips_uid_5482_10" style="">
<code class="hljs lasso"><span class="pln">nano </span><span class="pun">/</span><span class="hljs-built_in"><span class="kwd">var</span></span><span class="pun">/</span><span class="pln">www</span><span class="pun">/</span><span class="pln">html</span><span class="pun">/</span><span class="pln">wp</span><span class="hljs-attribute"><span class="pun">-</span><span class="pln">config</span></span><span class="hljs-built_in"><span class="pun">.</span></span><span class="pln">php</span></code></pre>

<p>
	ابحث عن القسم الذي يحتوي على القيم المبدئية لهذه المفاتيح؛ إذ سيبدو كما يلي:
</p>

<pre class="ipsCode prettyprint lang-sql prettyprinted" id="ips_uid_5482_12" style="">
<span class="pun">.</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> </span><span class="pun">.</span><span class="pln">

define</span><span class="pun">(</span><span class="str">'AUTH_KEY'</span><span class="pun">,</span><span class="pln">         </span><span class="str">'put your unique phrase here'</span><span class="pun">);</span><span class="pln">
define</span><span class="pun">(</span><span class="str">'SECURE_AUTH_KEY'</span><span class="pun">,</span><span class="pln">  </span><span class="str">'put your unique phrase here'</span><span class="pun">);</span><span class="pln">
define</span><span class="pun">(</span><span class="str">'LOGGED_IN_KEY'</span><span class="pun">,</span><span class="pln">    </span><span class="str">'put your unique phrase here'</span><span class="pun">);</span><span class="pln">
define</span><span class="pun">(</span><span class="str">'NONCE_KEY'</span><span class="pun">,</span><span class="pln">        </span><span class="str">'put your unique phrase here'</span><span class="pun">);</span><span class="pln">
define</span><span class="pun">(</span><span class="str">'AUTH_SALT'</span><span class="pun">,</span><span class="pln">        </span><span class="str">'put your unique phrase here'</span><span class="pun">);</span><span class="pln">
define</span><span class="pun">(</span><span class="str">'SECURE_AUTH_SALT'</span><span class="pun">,</span><span class="pln"> </span><span class="str">'put your unique phrase here'</span><span class="pun">);</span><span class="pln">
define</span><span class="pun">(</span><span class="str">'LOGGED_IN_SALT'</span><span class="pun">,</span><span class="pln">   </span><span class="str">'put your unique phrase here'</span><span class="pun">);</span><span class="pln">
define</span><span class="pun">(</span><span class="str">'NONCE_SALT'</span><span class="pun">,</span><span class="pln">       </span><span class="str">'put your unique phrase here'</span><span class="pun">);</span><span class="pln">

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

<p>
	امسح الأسطر أعلاه وألصق الأسطر التي نسختها من الأمر السابق:
</p>

<pre class="ipsCode prettyprint lang-sql prettyprinted" id="ips_uid_5482_10" style="">
<code class="hljs lasso"><span class="hljs-built_in"><span class="pun">.</span></span><span class="pln"> </span><span class="hljs-built_in"><span class="pun">.</span></span><span class="pln"> </span><span class="hljs-built_in"><span class="pun">.</span></span><span class="pln">

</span><span class="hljs-class"><span class="hljs-keyword"><span class="pln">define</span></span></span><span class="pun">(</span><span class="hljs-string"><span class="str">'AUTH_KEY'</span></span><span class="pun">,</span><span class="pln">         </span><span class="hljs-string"><span class="str">'VALUES COPIED FROM THE COMMAND LINE'</span></span><span class="pun">);</span><span class="pln">
</span><span class="hljs-class"><span class="hljs-keyword"><span class="pln">define</span></span></span><span class="pun">(</span><span class="hljs-string"><span class="str">'SECURE_AUTH_KEY'</span></span><span class="pun">,</span><span class="pln">  </span><span class="hljs-string"><span class="str">'VALUES COPIED FROM THE COMMAND LINE'</span></span><span class="pun">);</span><span class="pln">
</span><span class="hljs-class"><span class="hljs-keyword"><span class="pln">define</span></span></span><span class="pun">(</span><span class="hljs-string"><span class="str">'LOGGED_IN_KEY'</span></span><span class="pun">,</span><span class="pln">    </span><span class="hljs-string"><span class="str">'VALUES COPIED FROM THE COMMAND LINE'</span></span><span class="pun">);</span><span class="pln">
</span><span class="hljs-class"><span class="hljs-keyword"><span class="pln">define</span></span></span><span class="pun">(</span><span class="hljs-string"><span class="str">'NONCE_KEY'</span></span><span class="pun">,</span><span class="pln">        </span><span class="hljs-string"><span class="str">'VALUES COPIED FROM THE COMMAND LINE'</span></span><span class="pun">);</span><span class="pln">
</span><span class="hljs-class"><span class="hljs-keyword"><span class="pln">define</span></span></span><span class="pun">(</span><span class="hljs-string"><span class="str">'AUTH_SALT'</span></span><span class="pun">,</span><span class="pln">        </span><span class="hljs-string"><span class="str">'VALUES COPIED FROM THE COMMAND LINE'</span></span><span class="pun">);</span><span class="pln">
</span><span class="hljs-class"><span class="hljs-keyword"><span class="pln">define</span></span></span><span class="pun">(</span><span class="hljs-string"><span class="str">'SECURE_AUTH_SALT'</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">'VALUES COPIED FROM THE COMMAND LINE'</span></span><span class="pun">);</span><span class="pln">
</span><span class="hljs-class"><span class="hljs-keyword"><span class="pln">define</span></span></span><span class="pun">(</span><span class="hljs-string"><span class="str">'LOGGED_IN_SALT'</span></span><span class="pun">,</span><span class="pln">   </span><span class="hljs-string"><span class="str">'VALUES COPIED FROM THE COMMAND LINE'</span></span><span class="pun">);</span><span class="pln">
</span><span class="hljs-class"><span class="hljs-keyword"><span class="pln">define</span></span></span><span class="pun">(</span><span class="hljs-string"><span class="str">'NONCE_SALT'</span></span><span class="pun">,</span><span class="pln">       </span><span class="hljs-string"><span class="str">'VALUES COPIED FROM THE COMMAND LINE'</span></span><span class="pun">);</span><span class="pln">

</span><span class="hljs-built_in"><span class="pun">.</span></span><span class="pln"> </span><span class="hljs-built_in"><span class="pun">.</span></span><span class="pln"> </span><span class="hljs-built_in"><span class="pun">.</span></span></code></pre>

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

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

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

<pre class="ipsCode prettyprint lang-sql prettyprinted" id="ips_uid_5482_10" style="">
<code class="hljs java"><span class="pun">.</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> </span><span class="pun">.</span><span class="pln">

define</span><span class="pun">(</span><span class="hljs-string"><span class="str">'DB_NAME'</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">'wordpress'</span></span><span class="pun">);</span><span class="pln">

</span><span class="hljs-javadoc"><span class="com">/** MySQL database username */</span></span><span class="pln">
define</span><span class="pun">(</span><span class="hljs-string"><span class="str">'DB_USER'</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">'wordpressuser'</span></span><span class="pun">);</span><span class="pln">

</span><span class="hljs-javadoc"><span class="com">/** MySQL database password */</span></span><span class="pln">
define</span><span class="pun">(</span><span class="hljs-string"><span class="str">'DB_PASSWORD'</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">'password'</span></span><span class="pun">);</span><span class="pln">

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

define</span><span class="pun">(</span><span class="hljs-string"><span class="str">'FS_METHOD'</span></span><span class="pun">,</span><span class="pln"> </span><span class="hljs-string"><span class="str">'direct'</span></span><span class="pun">);</span></code></pre>

<p>
	احفظ الملف وأغلقه عندما تنتهي من العمل عليه.
</p>

<h2 id="الخطوة-السادسة-إكمال-التثبيت-عبر-واجهة-الويب">
	الخطوة السادسة: إكمال التثبيت عبر واجهة الويب
</h2>

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

<pre class="ipsCode prettyprint lang-sql prettyprinted" id="ips_uid_5482_10" style="">
<code class="hljs cs"><span class="pln">http</span><span class="pun">:</span><span class="hljs-comment"><span class="com">//server_domain_or_IP</span></span></code></pre>

<p>
	اختر اللغة التي تشاء استخدامها:
</p>

<p style="text-align: center;">
	<img alt="1-language_selection.png" class="ipsImage ipsImage_thumbnailed" data-fileid="24875" data-unique="zej74rdpd" src="https://academy.hsoub.com/uploads/monthly_2017_08/1-language_selection.png.55f17353607aba4772a62a8973f8f8d2.png"></p>

<p>
	ثم ننتقل إلى صفحة الإعداد الرئيسية.
</p>

<p>
	اختر اسمًا لموقع ووردبريس واختر اسم المستخدم (من المستحسن عدم استعمال اسم مثل «admin» لأسباب أمنية). ستولَّد كلمة مرور قوية تلقائيًا، يمكنك حفظ هذه الكلمة أو اختيار أخرى قوية.
</p>

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

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="24876" href="https://academy.hsoub.com/uploads/monthly_2017_08/2-setup_installation.png.c0729e865b714839836d2625599df176.png" rel=""><img alt="2-setup_installation.png" class="ipsImage ipsImage_thumbnailed" data-fileid="24876" data-unique="6maki79ws" src="https://academy.hsoub.com/uploads/monthly_2017_08/2-setup_installation.thumb.png.2ce6b3788489ce3e35aacef7507efdf9.png"></a>
</p>

<p>
	بعد أن تنتهي من التثبيت ستؤخذ إلى صفحة تطلب منك تسجيل الدخول:
</p>

<p style="text-align: center;">
	<img alt="3-login_prompt.png" class="ipsImage ipsImage_thumbnailed" data-fileid="24877" data-unique="ywoxea4c0" src="https://academy.hsoub.com/uploads/monthly_2017_08/3-login_prompt.png.4bfa066961c0db500be60bd81f7f9c03.png"></p>

<p>
	بعد أن تسجِّل دخولك، فستؤخذ إلى لوحة تحكم ووردبريس.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="24878" href="https://academy.hsoub.com/uploads/monthly_2017_08/4-admin_screen.png.66a32199cec61d44dd0cd82a4911a049.png" rel=""><img alt="4-admin_screen.png" class="ipsImage ipsImage_thumbnailed" data-fileid="24878" data-unique="krxcf9ihn" src="https://academy.hsoub.com/uploads/monthly_2017_08/4-admin_screen.thumb.png.57756d3c40691fe6defb78203af01a00.png"></a>
</p>

<h2 id="ترقية-ووردبريس">
	ترقية ووردبريس
</h2>

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

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

<pre class="ipsCode prettyprint lang-sql prettyprinted" id="ips_uid_5482_10" style="">
<code class="hljs lasso"><span class="pln">sudo chown </span><span class="hljs-attribute"><span class="pun">-</span><span class="pln">R</span></span><span class="pln"> www</span><span class="hljs-attribute"><span class="pun">-</span><span class="pln">data</span></span><span class="pln"> </span><span class="pun">/</span><span class="hljs-built_in"><span class="kwd">var</span></span><span class="pun">/</span><span class="pln">www</span><span class="pun">/</span><span class="pln">html</span></code></pre>

<p>
	افتح لوحة تحكم ووردبريس وحدثها كالمعتاد.
</p>

<p>
	بعد أن تنتهي من الترقية، فأعد الأذونات كما كانت سابقًا:
</p>

<pre class="ipsCode prettyprint lang-sql prettyprinted" id="ips_uid_5482_10" style="">
<code class="hljs lasso"><span class="pln">sudo chown </span><span class="hljs-attribute"><span class="pun">-</span><span class="pln">R</span></span><span class="pln"> sammy </span><span class="pun">/</span><span class="hljs-built_in"><span class="kwd">var</span></span><span class="pun">/</span><span class="pln">www</span><span class="pun">/</span><span class="pln">html</span></code></pre>

<p>
	الطريقة السابقة ضرورية عند ترقية برمجية ووردبريس نفسها.
</p>

<h2 id="الخلاصة">
	الخلاصة
</h2>

<p>
	يجب أن تكون ووردبريس مثبتةً على خادومك وجاهزةً للاستخدام. هنالك بعض الأمور التي عليك ضبطها مثل بنية الروابط الدائمة لمنشوراتك (في صفحة Settings &gt; Permalinks أو الخيارات &gt; الروابط الدائمة) واختيار قالب جديد (في صفحة Appearance &gt; Themes أو المظهر &gt; قوالب).
</p>

<p>
	إذا كانت هذه أوّل مرة تستعمل فيها ووردبريس فخذ وقتًا في تعلم طريقة التعامل معها.<br>
	ترجمة – بتصرّف – للمقال <a href="https://www.digitalocean.com/community/tutorials/how-to-install-wordpress-with-lamp-on-ubuntu-16-04" rel="external nofollow">How To Install WordPress with LAMP on Ubuntu 16.04</a> لصاحبه Justin Ellingwood.
</p>
]]></description><guid isPermaLink="false">342</guid><pubDate>Thu, 31 Aug 2017 15:52:00 +0000</pubDate></item><item><title>&#x625;&#x62F;&#x627;&#x631;&#x629; &#x623;&#x62C;&#x647;&#x632;&#x629; &#x627;&#x644;&#x62A;&#x62E;&#x632;&#x64A;&#x646; &#x628;&#x622;&#x644;&#x64A;&#x651;&#x629; LVM &#x639;&#x644;&#x649; &#x623;&#x648;&#x628;&#x648;&#x646;&#x62A;&#x648;: &#x625;&#x632;&#x627;&#x644;&#x629; &#x623;&#x648; &#x62A;&#x642;&#x644;&#x64A;&#x635; &#x627;&#x644;&#x645;&#x643;&#x648;&#x646;&#x627;&#x62A;</title><link>https://academy.hsoub.com/devops/servers/%D8%A5%D8%AF%D8%A7%D8%B1%D8%A9-%D8%A3%D8%AC%D9%87%D8%B2%D8%A9-%D8%A7%D9%84%D8%AA%D8%AE%D8%B2%D9%8A%D9%86-%D8%A8%D8%A2%D9%84%D9%8A%D9%91%D8%A9-lvm-%D8%B9%D9%84%D9%89-%D8%A3%D9%88%D8%A8%D9%88%D9%86%D8%AA%D9%88-%D8%A5%D8%B2%D8%A7%D9%84%D8%A9-%D8%A3%D9%88-%D8%AA%D9%82%D9%84%D9%8A%D8%B5-%D8%A7%D9%84%D9%85%D9%83%D9%88%D9%86%D8%A7%D8%AA-r336/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2017_08/main.png.cf6d9a92f55de5ab033f5222bd17cb64.png" /></p>

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

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

<h2 id="إزالة-أو-تقليص-مكونات-lvm">
	إزالة أو تقليص مُكوّنات LVM
</h2>

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

<h3 id="تخفيض-حجم-وحدة-تخزين-منطقية">
	تخفيض حجم وحدة تخزين منطقيّة
</h3>

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

<p>
	إذا كنت جاهزا، تأكّد من حجم المساحة المُستخدمة حاليّا:
</p>

<pre class="ipsCode prettyprint lang-sql prettyprinted" id="ips_uid_7817_8" style="">
<code class="hljs lasso"><span class="pln">df </span><span class="hljs-attribute"><span class="pun">-</span><span class="pln">h</span></span></code></pre>

<p>
	المُخرج:
</p>

<pre class="ipsCode prettyprint lang-sql prettyprinted" id="ips_uid_7817_8" style="">
<span class="typ">Filesystem</span><span class="pln">                         </span><span class="typ">Size</span><span class="pln">  </span><span class="typ">Used</span><span class="pln"> </span><span class="typ">Avail</span><span class="pln"> </span><span class="typ">Use</span><span class="pun">%</span><span class="pln"> </span><span class="typ">Mounted</span><span class="pln"> on
</span><span class="pun">.</span><span class="pln"> </span><span class="pun">.</span><span class="pln"> </span><span class="pun">.</span><span class="pln">
</span><span class="pun">/</span><span class="pln">dev</span><span class="pun">/</span><span class="pln">mapper</span><span class="pun">/</span><span class="typ">LVMVolGroup</span><span class="pun">-</span><span class="pln">test       </span><span class="lit">4.8G</span><span class="pln">  </span><span class="lit">521M</span><span class="pln">  </span><span class="lit">4.1G</span><span class="pln">  </span><span class="lit">12</span><span class="pun">%</span><span class="pln"> </span><span class="str">/mnt/</span><span class="pln">test</span></pre>

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

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

<pre class="ipsCode prettyprint lang-sql prettyprinted" id="ips_uid_7817_8" style="">
<code class="hljs bash"><span class="hljs-built_in"><span class="pln">cd</span></span><span class="pln"> </span><span class="pun">~</span><span class="pln">
</span><span class="hljs-built_in"><span class="pln">sudo</span></span><span class="pln"> umount </span><span class="pun">/</span><span class="pln">dev</span><span class="pun">/</span><span class="typ">LVMVolGroup</span><span class="pun">/</span><span class="pln">test</span></code></pre>

<p>
	بعد إزالة التركيب، تأكّد من أن نظام الملفّات في حالة جيّدة. مرّر نوع نظام الملفّات عبر الخيار <code>-t</code>. سنستعمل الخيار <code>-f</code> للتّحقّق من أن كل شيء على ما يرام حتى ولو بدا كذلك:
</p>

<pre class="ipsCode prettyprint lang-sql prettyprinted" id="ips_uid_7817_8" style="">
<code class="hljs bash"><span class="hljs-built_in"><span class="pln">sudo</span></span><span class="pln"> fsck </span><span class="pun">-</span><span class="pln">t ext4 </span><span class="hljs-operator"><span class="pun">-</span><span class="pln">f</span></span><span class="pln"> </span><span class="pun">/</span><span class="pln">dev</span><span class="pun">/</span><span class="typ">LVMVolGroup</span><span class="pun">/</span><span class="pln">test</span></code></pre>

<p>
	بعد التّحقّق من سلامة نظام الملفّات، يُمكنك تقليص مساحته باستخدام الأدوات الخاصّة، في حالة Ext4، فالأمر سيكون <code>resize2fs</code>. مرّر الحجم النّهائي لنظام الملفّات.<br><strong>تنبيه:</strong> أكثر خيار أمانا هو تمرير حجم نهائي أكبر بكثير من الحجم المُستخدم حاليا. أعط نفسك مساحة أمان لتجنّب فقدان البيانات وتأكّد من إنشاء نسخ احتياطيّة.
</p>

<pre class="ipsCode prettyprint lang-sql prettyprinted" id="ips_uid_7817_8" style="">
<code class="hljs bash"><span class="hljs-built_in"><span class="pln">sudo</span></span><span class="pln"> resize2fs </span><span class="pun">-</span><span class="pln">p </span><span class="pun">/</span><span class="pln">dev</span><span class="pun">/</span><span class="typ">LVMVolGroup</span><span class="pun">/</span><span class="pln">test </span><span class="hljs-number"><span class="lit">3</span></span><span class="lit">G</span></code></pre>

<p>
	حالما تنتهي العمليّة، قلّص حجم وحدة التّخزين المنطقيّة عبر تمرير نفس الحجم (3G في هذه الحالة) إلى الأمر <code>lvresize</code> عبر الخيار <code>-L</code>.
</p>

<pre class="ipsCode prettyprint lang-sql prettyprinted" id="ips_uid_7817_8" style="">
<code class="hljs bash"><span class="hljs-built_in"><span class="pln">sudo</span></span><span class="pln"> lvresize </span><span class="pun">-</span><span class="pln">L </span><span class="hljs-number"><span class="lit">3</span></span><span class="lit">G</span><span class="pln"> </span><span class="typ">LVMVolGroup</span><span class="pun">/</span><span class="pln">test</span></code></pre>

<p>
	ستستقبل تنبيها حول فقدان البيانات، إن كنت جاهزا، فاكتب <code>y</code> للاستمرار.
</p>

<p>
	بعد تقليص حجم وحدة التّخزين المنطقيّة، تحقّق من سلامة نظام الملفّات مُجدّدا:
</p>

<pre class="ipsCode prettyprint lang-sql prettyprinted" id="ips_uid_7817_8" style="">
<code class="hljs bash"><span class="hljs-built_in"><span class="pln">sudo</span></span><span class="pln"> fsck </span><span class="pun">-</span><span class="pln">t ext4 </span><span class="hljs-operator"><span class="pun">-</span><span class="pln">f</span></span><span class="pln"> </span><span class="pun">/</span><span class="pln">dev</span><span class="pun">/</span><span class="typ">LVMVolGroup</span><span class="pun">/</span><span class="pln">test</span></code></pre>

<p>
	إن سار كلّ شيء على ما يرام، فستستطيع إعادة وصل نظام الملفّات بالأمر المُعتاد:
</p>

<pre class="ipsCode prettyprint lang-sql prettyprinted" id="ips_uid_7817_8" style="">
<code class="hljs bash"><span class="hljs-built_in"><span class="pln">sudo</span></span><span class="pln"> mount </span><span class="pun">/</span><span class="pln">dev</span><span class="pun">/</span><span class="typ">LVMVolGroup</span><span class="pun">/</span><span class="pln">test </span><span class="pun">/</span><span class="pln">mnt</span><span class="pun">/</span><span class="pln">test</span></code></pre>

<p>
	ينبغي الآن على وحدة التّخزين المنطقيّة أن تُقلّص إلى الحجم المُحدّد.
</p>

<h3 id="حذف-وحدة-تخزين-منطقية">
	حذف وحدة تخزين منطقيّة
</h3>

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

<p>
	أولا، أزل تركيب وحدة التخزين:
</p>

<pre class="ipsCode prettyprint lang-sql prettyprinted" id="ips_uid_7817_8" style="">
<code class="hljs bash"><span class="hljs-built_in"><span class="pln">cd</span></span><span class="pln"> </span><span class="pun">~</span><span class="pln">
</span><span class="hljs-built_in"><span class="pln">sudo</span></span><span class="pln"> umount </span><span class="pun">/</span><span class="pln">dev</span><span class="pun">/</span><span class="typ">LVMVolGroup</span><span class="pun">/</span><span class="pln">test</span></code></pre>

<p>
	بعدها، احذف وحدة التخزين بالأمر التّالي:
</p>

<pre class="ipsCode prettyprint lang-sql prettyprinted" id="ips_uid_7817_8" style="">
<code class="hljs bash"><span class="hljs-built_in"><span class="pln">sudo</span></span><span class="pln"> lvremove </span><span class="typ">LVMVolGroup</span><span class="pun">/</span><span class="pln">test</span></code></pre>

<p>
	سيُطلب منك تأكيد العمليّة، إن كنت متأكّدا من رغبتك في حذف وحدة التّخزين، فاكتب <code>y</code>.
</p>

<h3 id="حذف-مجموعة-تخزين">
	حذف مجموعة تخزين
</h3>

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

<pre class="ipsCode prettyprint lang-sql prettyprinted" id="ips_uid_7817_8" style="">
<code class="hljs bash"><span class="hljs-built_in"><span class="pln">sudo</span></span><span class="pln"> umount </span><span class="pun">/</span><span class="pln">dev</span><span class="pun">/</span><span class="typ">LVMVolGroup</span><span class="pun">/</span><span class="pln">www
</span><span class="hljs-built_in"><span class="pln">sudo</span></span><span class="pln"> umount </span><span class="pun">/</span><span class="pln">dev</span><span class="pun">/</span><span class="typ">LVMVolGroup</span><span class="pun">/</span><span class="pln">projects
</span><span class="hljs-built_in"><span class="pln">sudo</span></span><span class="pln"> umount </span><span class="pun">/</span><span class="pln">dev</span><span class="pun">/</span><span class="typ">LVMVolGroup</span><span class="pun">/</span><span class="pln">db</span></code></pre>

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

<pre class="ipsCode prettyprint lang-sql prettyprinted" id="ips_uid_7817_8" style="">
<code class="hljs bash"><span class="hljs-built_in"><span class="pln">sudo</span></span><span class="pln"> vgremove </span><span class="typ">LVMVolGroup</span></code></pre>

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

<h3 id="حذف-وحدة-تخزين-مادية">
	حذف وحدة تخزين ماديّة
</h3>

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

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

<p>
	إن كان لديك عدد كاف من وحدات التّخزين الماديّة في مجموعة التّخزين لاحتضان المداءات الماديّة، فانقلها إلى خارج وحدة التّخزين الماديّة التي ترغب في إزالتها عبر كتابة ما يلي:
</p>

<pre class="ipsCode prettyprint lang-sql prettyprinted" id="ips_uid_7817_8" style="">
<code class="hljs bash"><span class="hljs-built_in"><span class="pln">sudo</span></span><span class="pln"> pvmove </span><span class="pun">/</span><span class="pln">dev</span><span class="pun">/</span><span class="pln">sda</span></code></pre>

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

<p>
	حالما تنتقل المداءات إلى وحدات تخزين أخرى، يُمكنك حذف وحدة التّخزين الماديّة من مجموعة التّخزين عبر الأمر التّالي:
</p>

<pre class="ipsCode prettyprint lang-sql prettyprinted" id="ips_uid_7817_8" style="">
<code class="hljs bash"><span class="hljs-built_in"><span class="pln">sudo</span></span><span class="pln"> vgreduce </span><span class="typ">LVMVolGroup</span><span class="pln"> </span><span class="pun">/</span><span class="pln">dev</span><span class="pun">/</span><span class="pln">sda</span></code></pre>

<p>
	هذه العمليّة كفيلة بإزالة وحدات التّخزين التي أُخلِيت من مجموعة التّخزين. بعد انتهاء العمليّة، يُمكنك حذف علامة وحدة التّخزين الماديّة من جهاز التّخزين عبر الأمر:
</p>

<pre class="ipsCode prettyprint lang-sql prettyprinted" id="ips_uid_7817_8" style="">
<code class="hljs bash"><span class="hljs-built_in"><span class="pln">sudo</span></span><span class="pln"> pvremove </span><span class="pun">/</span><span class="pln">dev</span><span class="pun">/</span><span class="pln">sda</span></code></pre>

<p>
	ينبغي الآن أن تتمكّن من استعمال جهاز التّخزين المُزال لأغراض أخرى أو إزالته من النّظام بالكامل.
</p>

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

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

<p>
	ترجمة – بتصرّف - للمقال <a href="https://www.digitalocean.com/community/tutorials/how-to-use-lvm-to-manage-storage-devices-on-ubuntu-16-04" rel="external nofollow">How To Use LVM To Manage Storage Devices on Ubuntu 16.04</a> لكاتبه Justin Ellingwood.<br>
	 
</p>
]]></description><guid isPermaLink="false">336</guid><pubDate>Thu, 10 Aug 2017 10:45:27 +0000</pubDate></item><item><title>&#x625;&#x62F;&#x627;&#x631;&#x629; &#x623;&#x62C;&#x647;&#x632;&#x629; &#x627;&#x644;&#x62A;&#x62E;&#x632;&#x64A;&#x646; &#x628;&#x622;&#x644;&#x64A;&#x651;&#x629; LVM &#x639;&#x644;&#x649; &#x623;&#x648;&#x628;&#x648;&#x646;&#x62A;&#x648;: &#x625;&#x646;&#x634;&#x627;&#x621; &#x648;&#x625;&#x639;&#x627;&#x62F;&#x629; &#x62A;&#x62D;&#x62C;&#x64A;&#x645; &#x645;&#x633;&#x627;&#x62D;&#x629; &#x627;&#x644;&#x62A;&#x62E;&#x632;&#x64A;&#x646;</title><link>https://academy.hsoub.com/devops/servers/%D8%A5%D8%AF%D8%A7%D8%B1%D8%A9-%D8%A3%D8%AC%D9%87%D8%B2%D8%A9-%D8%A7%D9%84%D8%AA%D8%AE%D8%B2%D9%8A%D9%86-%D8%A8%D8%A2%D9%84%D9%8A%D9%91%D8%A9-lvm-%D8%B9%D9%84%D9%89-%D8%A3%D9%88%D8%A8%D9%88%D9%86%D8%AA%D9%88-%D8%A5%D9%86%D8%B4%D8%A7%D8%A1-%D9%88%D8%A5%D8%B9%D8%A7%D8%AF%D8%A9-%D8%AA%D8%AD%D8%AC%D9%8A%D9%85-%D9%85%D8%B3%D8%A7%D8%AD%D8%A9-%D8%A7%D9%84%D8%AA%D8%AE%D8%B2%D9%8A%D9%86-r335/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2017_08/59822795b7125_main(5).png.553efcc105da817644c1f29f1dcfb34c.png" /></p>

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

<h2 id="إنشاء-أو-توسيع-مكونات-lvm">
	إنشاء أو توسيع مكوّنات LVM
</h2>

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

<h3 id="إنشاء-وحدات-تخزين-مادية-من-أجهزة-تخزين-خام">
	إنشاء وحدات تخزين ماديّة من أجهزة تخزين خام
</h3>

<p>
	لاستعمال أجهزة التّخزين مع LVM، يجب عليها أولا أن تُعلّم على أنها وحدات تخزين ماديّة. ما يُحدّد إمكانيّة استخدام الجهاز داخل مجموعة تخزين.
</p>

<p>
	أولا، استعمل الأمر <code>lvmdiskscan</code> لإيجاد جميع أجهزة التّخزين التي يُمكن لـLVM رؤيتها واستخدامها:
</p>

<pre class="ipsCode" id="ips_uid_1266_7">
sudo lvmdiskscan</pre>

<p>
	المُخرج:
</p>

<pre class="ipsCode" id="ips_uid_1266_7">
<code class="hljs rsl"><span class="pln">  </span><span class="pun">/</span><span class="pln">dev</span><span class="pun">/</span><span class="pln">ram0  </span><span class="pun">[</span><span class="pln">      </span><span class="hljs-number"><span class="lit">64.00</span></span><span class="pln"> </span><span class="typ">MiB</span><span class="pun">]</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">     </span><span class="hljs-number"><span class="lit">200.00</span></span><span class="pln"> </span><span class="typ">GiB</span><span class="pun">]</span><span class="pln"> 
  </span><span class="pun">/</span><span class="pln">dev</span><span class="pun">/</span><span class="pln">ram1  </span><span class="pun">[</span><span class="pln">      </span><span class="hljs-number"><span class="lit">64.00</span></span><span class="pln"> </span><span class="typ">MiB</span><span class="pun">]</span><span class="pln"> 

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

  </span><span class="pun">/</span><span class="pln">dev</span><span class="pun">/</span><span class="pln">ram15 </span><span class="pun">[</span><span class="pln">      </span><span class="hljs-number"><span class="lit">64.00</span></span><span class="pln"> </span><span class="typ">MiB</span><span class="pun">]</span><span class="pln"> 
  </span><span class="pun">/</span><span class="pln">dev</span><span class="pun">/</span><span class="pln">sdb   </span><span class="pun">[</span><span class="pln">     </span><span class="hljs-number"><span class="lit">100.00</span></span><span class="pln"> </span><span class="typ">GiB</span><span class="pun">]</span><span class="pln"> 
  </span><span class="hljs-number"><span class="lit">2</span></span><span class="pln"> disks
  </span><span class="hljs-number"><span class="lit">17</span></span><span class="pln"> partitions
  </span><span class="hljs-number"><span class="lit">0</span></span><span class="pln"> LVM physical </span><span class="hljs-shader"><span class="hljs-keyword"><span class="pln">volume</span></span><span class="pln"> whole disks
  </span><span class="lit">0</span><span class="pln"> LVM physical volumes</span></span></code></pre>

<p>
	في المُخرج أعلاه، بتجاهل أجهزة <code>/dev/ram*</code>، يُمكننا رؤية الأجهزة التّي يُمكن تحويلها إلى وحدات تخزين ماديّة لـLVM.
</p>

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

<p>
	لجعل أجهزة التّخزين وحدات تخزين ماديّة خاصّة بـLVM، استعمل الأمر <code>pvcreate</code>. يُمكنك تمرير عدّة أجهزة في نفس الوقت:
</p>

<pre class="ipsCode" id="ips_uid_1266_7">
<code class="hljs bash"><span class="hljs-built_in"><span class="pln">sudo</span></span><span class="pln"> pvcreate </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">sdb</span></code></pre>

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

<h3 id="إنشاء-مجموعة-تخزين-من-وحدات-التخزين-المادية">
	إنشاء مجموعة تخزين من وحدات التّخزين الماديّة
</h3>

<p>
	لإنشاء مجموعة تخزين جديدة من وحدات التّخزين الماديّة، استعمل الأمر <code>vgcreate</code>. سيتوجّب عليك تمرير اسم للمجموعة متبوعا بوحدة تخزين ماديّة واحدة على الأقل:
</p>

<pre class="ipsCode" id="ips_uid_1266_7">
<code class="hljs bash"><span class="hljs-built_in"><span class="pln">sudo</span></span><span class="pln"> vgcreate volume_group_name </span><span class="pun">/</span><span class="pln">dev</span><span class="pun">/</span><span class="pln">sda</span></code></pre>

<p>
	استبدل <code>volume_group_name</code> باسم من اختيارك لمجموعة التّخزين.
</p>

<p>
	سينشئ المثال أعلاه مجموعة تخزين انطلاقا من وحدة تخزين ماديّة واحدة فقط.
</p>

<p>
	يُمكنك تمرير أكثر من وحدة تخزين ماديّة عند إنشاء المجموعة إن أردت ذلك:
</p>

<pre class="ipsCode" id="ips_uid_1266_7">
<code class="hljs bash"><span class="hljs-built_in"><span class="pln">sudo</span></span><span class="pln"> vgcreate volume_group_name </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">sdb </span><span class="pun">/</span><span class="pln">dev</span><span class="pun">/</span><span class="pln">sdc</span></code></pre>

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

<p>
	الحاجة إلى استخدام أحجام مداءات مُختلفة من الأسباب التّي قد تدفعك إلى إنشاء أكثر من مجموعة تخزين واحدة. في العادة، لن يتوجّب عليك تحديد حجم المدى (الحجم المبدئي هو 4M ويُعدّ كافيّا لمُعظم الاستخدامات)، لكنّ إن أردت، يُمكنك تحديد حجم المداءات عند إنشاء مجموعة التّخزين باستعمال الخيار <code>-s</code>:
</p>

<pre class="ipsCode" id="ips_uid_1266_7">
<code class="hljs bash"><span class="hljs-built_in"><span class="pln">sudo</span></span><span class="pln"> vgcreate </span><span class="hljs-operator"><span class="pun">-</span><span class="pln">s</span></span><span class="pln"> </span><span class="hljs-number"><span class="lit">8</span></span><span class="lit">M</span><span class="pln"> volume_group_name </span><span class="pun">/</span><span class="pln">dev</span><span class="pun">/</span><span class="pln">sda</span></code></pre>

<p>
	سينشئ هذا الأمر مجموعة تخزين مع حجم مداءات يُساوي 8M.
</p>

<h3 id="إضافة-وحدة-تخزين-مادية-إلى-مجموعة-تخزين-موجودة-مسبقا">
	إضافة وحدة تخزين ماديّة إلى مجموعة تخزين موجودة مُسبقا
</h3>

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

<pre class="ipsCode" id="ips_uid_1266_7">
<code class="hljs bash"><span class="hljs-built_in"><span class="pln">sudo</span></span><span class="pln"> vgextend volume_group_name </span><span class="pun">/</span><span class="pln">dev</span><span class="pun">/</span><span class="pln">sdb</span></code></pre>

<p>
	ستُضاف وحدة التّخزين الماديّة إلى مجموعة التّخزين موسّعة بذلك مساحة التّخزين المُتوفّرة على المجموعة.
</p>

<h3 id="إنشاء-وحدة-تخزين-منطقية-بحجم-محدد">
	إنشاء وحدة تخزين منطقيّة بحجم مُحدّد
</h3>

<p>
	لإنشاء وحدة تخزين منطقيّة من مجموعة تخزين، استعمل الأمر <code>lvcreate</code>. حدّد حجم وحدة التّخزين المنطقيّة باستخدام الخيار <code>-L</code>، وحدّد اسما عبر الخيار <code>-n</code>، ومرّر مجموعة التّخزين الأم.
</p>

<p>
	على سبيل المثال، لإنشاء وحدة تخزين منطقيّة تُسمّى <code>test</code> من مجموعة تخزين تُسمّى <code>LVMVolGroup</code>، اكتب:
</p>

<pre class="ipsCode" id="ips_uid_1266_7">
<code class="hljs lasso"><span class="pln">sudo lvcreate </span><span class="hljs-attribute"><span class="pun">-</span><span class="pln">L</span></span><span class="pln"> </span><span class="hljs-number"><span class="lit">10</span></span><span class="lit">G</span><span class="pln"> </span><span class="hljs-attribute"><span class="pun">-</span><span class="pln">n</span></span><span class="pln"> test </span><span class="typ">LVMVolGroup</span></code></pre>

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

<h3 id="إنشاء-وحدة-تخزين-منطقية-من-كامل-باقي-المساحة-الفارغة">
	إنشاء وحدة تخزين منطقيّة من كامل باقي المساحة الفارغة
</h3>

<p>
	إن أردت إنشاء وحدة تخزين من باقي المساحة الفارغة على مجموعة تخزين، استعمل الأمر <code>vgcreate</code> مع الخيار <code>-n</code> لتحديد اسم لها ثمّ مرّر مجموعة التّخزين كما في السّابق. عوضا عن تمرير حجم مُعيّن، استعمل الخيار <code>-l 100%FREE</code> لتحديد بقيّة المساحة الفارغة في المجموعة:
</p>

<pre class="ipsCode" id="ips_uid_1266_7">
<code class="hljs bash"><span class="hljs-built_in"><span class="pln">sudo</span></span><span class="pln"> lvcreate </span><span class="hljs-operator"><span class="pun">-</span><span class="pln">l</span></span><span class="pln"> </span><span class="hljs-number"><span class="lit">100</span></span><span class="pun">%</span><span class="pln">FREE </span><span class="pun">-</span><span class="pln">n test2 </span><span class="typ">LVMVolGroup</span></code></pre>

<h3 id="إنشاء-وحدات-تخزين-منطقية-مع-خيارات-متقدمة">
	إنشاء وحدات تخزين منطقيّة مع خيارات مُتقدّمة
</h3>

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

<ul>
<li>
		<p>
			<code>--type</code>: يقوم هذا الخيار بتحديد نوع وحدة التّخزين المنطقيّة ما يُحدّد كيفيّة تخصيص مساحة له. بعض من هذه الأنواع لن تكون مُتوفّرة إن لم يكن لديك الحدّ الأدنى من وحدات التّخزين الماديّة التي يتطلّبها النّوع. بعض من أكثر هذه الأنواع شيوعا هي كما يلي:
		</p>

		<ul>
<li>
				<code>linear</code>: النّوع المبدئي. أجهزة التّخزين المُستخدمة ستُضاف بعضها على بعض واحدا تلو الآخر.
			</li>
			<li>
				<code>striped</code>: مُشابه لـ<a href="https://academy.hsoub.com/devops/linux/%D9%85%D9%82%D8%AF%D9%85%D8%A9-%D8%A5%D9%84%D9%89-%D9%85%D8%B3%D8%AA%D9%88%D9%8A%D8%A7%D8%AA-raid-r298/" rel="">RAID 0</a>، تُقسّم البيانات إلى قطع صغيرة وتُنشر على شكل قوس على وحدات التّخزين الماديّة المُستعملة. ما يؤدّي إلى تحسينات في الأداء، لكن يُمكن أن يؤدي إلى زيادة في قابليّة إصابة البيانات. لتحديد هذا النّوع، يجب عليك تمرير الخيار <code>-i</code> ويتطلّب وحدتي تخزين ماديّتين على الأقل.
			</li>
			<li>
				<code>raid1</code>: إنشاء وحدة تخزين RAID 1 مُنعكسة Mirrored. مبدئيًّا، سيكون للانعكاس نُسختان، لكن يُمكنك تحديد عدد أكبر عبر الخيار <code>-m</code> المشروح أسفله. هذا الخيار يتطلّب وحدتي تخزين ماديّتين على الأقل.
			</li>
			<li>
				<code>raid5</code>: إنشاء وحدة تخزين RAID 5. يتطلّب ثلاثة وحدات تخزين ماديّة على الأقل.
			</li>
			<li>
				<code>raid6</code>: إنشاء وحدة تخزين RAID 6. يتطلّب أربعة وحدات تخزين ماديّة على الأقل.
			</li>
		</ul>
</li>
	<li>
		<p>
			<code>-m</code>: يحدّد عدد نُسخ البيانات الإضافيّة. إن مرّرت القيمة <code>1</code> فهذا يعني بأنّ نُسخة واحدة إضافيّة من البيانات ستُصان، بحيث يكون لديك مجموعتان من نفس البيانات.
		</p>
	</li>
	<li>
		<code>-i</code>: يُحدّد عدد الشّرائط Stripes. هذا الخيار مطلوب للنوع <code>striped</code>، ويُمكن أن يُؤثّر على بعض خيارات RAID الأخرى.
	</li>
	<li>
		<code>-s</code>: يُحدّد بأنّ أخذ لقطة يجب أن يتمّ على مُستوى وحدة التّخزين المنطقيّة الحاليّة عوضا عن إنشاء وحدة تخزين منطقيّة جديدة ومُستقلّة.
	</li>
</ul>
<p>
	سنلقي نظرة على بضعة أمثلة لهذه الخيارات لنرى حالات الاستخدام الشّائعة.<br>
	لإنشاء وحدة تخزين شريطيّة Striped volume، يجب عليك تحديد شريطين على الأقل. هذه العمليّة تحتاج إلى وحدتي تخزين ماديّتين على الأقل مع مساحة تخزين متوافقة مع الحجم المُراد:
</p>

<pre class="ipsCode" id="ips_uid_1266_7">
<code class="hljs lasso"><span class="pln">sudo lvcreate </span><span class="hljs-subst"><span class="pun">--</span></span><span class="hljs-keyword"><span class="pln">type</span></span><span class="pln"> striped </span><span class="hljs-attribute"><span class="pun">-</span><span class="pln">i</span></span><span class="pln"> </span><span class="hljs-number"><span class="lit">2</span></span><span class="pln"> </span><span class="hljs-attribute"><span class="pun">-</span><span class="pln">L</span></span><span class="pln"> </span><span class="hljs-number"><span class="lit">10</span></span><span class="lit">G</span><span class="pln"> </span><span class="hljs-attribute"><span class="pun">-</span><span class="pln">n</span></span><span class="pln"> striped_vol </span><span class="typ">LVMVolGroup</span></code></pre>

<p>
	لإنشاء مساحة تخزين مُنعكسة Mirrored volume، استخدم النّوع <code>raid1</code>. إن أردت أكثر من مجموعتي بيانات، استعمل الخيار <code>-m</code>. المثال التّالي يستعمل <code>-m 2</code> لإنشاء ثلاث مجموعات من البيانات (يعتبر LVM بأنّها مجموعة واحدة من البيانات مع انعكاسين). ستحتاج إلى ثلاثة وحدات تخزين ماديّة على الأقل لنجاح العمليّة:
</p>

<pre class="ipsCode" id="ips_uid_1266_7">
<code class="hljs lasso"><span class="pln">sudo lvcreate </span><span class="hljs-subst"><span class="pun">--</span></span><span class="hljs-keyword"><span class="pln">type</span></span><span class="pln"> raid1 </span><span class="hljs-attribute"><span class="pun">-</span><span class="pln">m</span></span><span class="pln"> </span><span class="hljs-number"><span class="lit">2</span></span><span class="pln"> </span><span class="hljs-attribute"><span class="pun">-</span><span class="pln">L</span></span><span class="pln"> </span><span class="hljs-number"><span class="lit">20</span></span><span class="lit">G</span><span class="pln"> </span><span class="hljs-attribute"><span class="pun">-</span><span class="pln">n</span></span><span class="pln"> mirrored_vol </span><span class="typ">LVMVolGroup</span></code></pre>

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

<pre class="ipsCode" id="ips_uid_1266_7">
<code class="hljs lasso"><span class="pln">sudo lvcreate </span><span class="hljs-attribute"><span class="pun">-</span><span class="pln">s</span></span><span class="pln"> </span><span class="hljs-attribute"><span class="pun">-</span><span class="pln">L</span></span><span class="pln"> </span><span class="hljs-number"><span class="lit">10</span></span><span class="lit">G</span><span class="pln"> </span><span class="hljs-attribute"><span class="pun">-</span><span class="pln">n</span></span><span class="pln"> snap_test </span><span class="typ">LVMVolGroup</span><span class="pun">/</span><span class="pln">test</span></code></pre>

<p>
	<strong>تنبيه:</strong> لإعادة وحدة تخزين إلى الحالة التي تتواجد بها اللقطة، استخدم الأمر <code>lvconvert --merge</code>:
</p>

<pre class="ipsCode" id="ips_uid_1266_7">
<code class="hljs bash"><span class="hljs-built_in"><span class="pln">sudo</span></span><span class="pln"> lvconvert </span><span class="pun">--</span><span class="pln">merge </span><span class="typ">LVMVolGroup</span><span class="pun">/</span><span class="pln">snap_test</span></code></pre>

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

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

<h3 id="زيادة-حجم-وحدة-تخزين-منطقية">
	زيادة حجم وحدة تخزين منطقيّة
</h3>

<p>
	المرونة في التّعامل مع وحدات التّخزين المنطقيّة من أكثر المميّزات المتوفّرة في LVM. إذ يُمكنك بسهولة تعديل عدد أو حجم وحدات التّخزين المنطقيّة دون إيقاف النّظام.<br>
	لزيادة حجم وحدة تخزين منطقيّة أنشئت مُسبقا، استعمل الأمر <code>lvresize</code>. مرّر قيمة إلى الخيار <code>-L</code> لتحديد حجم جديد. يُمكنك كذلك استخدام أحجام نسبيّة عبر الرّمز <code>+</code>. في هذه الحالة سيقوم LVM بإضافة الكميّة المُحدّدة إلى الحجم الكلي لوحدة التّخزين. لتعديل حجم نظام الملفّات المُستخدم على وحدة التّخزين بشكل آلي، استعمل الخيار <code>--resizefs</code>.<br>
	لتحديد اسم صحيح لوحدة التّخزين التي ترغب بتوسيعها، سيتوجّب عليك تحديد مجموعة التّخزين، ثمّ رمز <code>/</code> متبوعا باسم وحدة التّخزين المنطقيّة:
</p>

<pre class="ipsCode" id="ips_uid_1266_7">
<code class="hljs bash"><span class="hljs-built_in"><span class="pln">sudo</span></span><span class="pln"> lvresize </span><span class="pun">-</span><span class="pln">L </span><span class="pun">+</span><span class="hljs-number"><span class="lit">5</span></span><span class="lit">G</span><span class="pln"> </span><span class="pun">--</span><span class="pln">resizefs </span><span class="typ">LVMVolGroup</span><span class="pun">/</span><span class="pln">test</span></code></pre>

<p>
	في هذا المثال، سيتمّ زيادة 5G لكل من وحدة التّخزين <code>test</code> ونظام الملفّات المُستخدم.
</p>

<p>
	إن أردت توسيع نظام الملفّات يدويًّا، يُمكنك حذف الخيار <code>--resizefs</code> واستعمال أداة توسيع نظام الملفّات الخاصّة. مثلا، لو كان نظام الملفّات هو <code>Ext4</code> فيُمكن أن تكتب:
</p>

<pre class="ipsCode" id="ips_uid_1266_7">
<code class="hljs bash"><span class="hljs-built_in"><span class="pln">sudo</span></span><span class="pln"> lvresize </span><span class="pun">-</span><span class="pln">L </span><span class="pun">+</span><span class="hljs-number"><span class="lit">5</span></span><span class="lit">G</span><span class="pln"> </span><span class="typ">LVMVolGroup</span><span class="pun">/</span><span class="pln">test
</span><span class="hljs-built_in"><span class="pln">sudo</span></span><span class="pln"> resize2fs </span><span class="pun">/</span><span class="pln">dev</span><span class="pun">/</span><span class="typ">LVMVolGroup</span><span class="pun">/</span><span class="pln">test</span></code></pre>

<p>
	سيكون لهذه العمليّة نفس تأثير ما سبق.
</p>

<p>
	ترجمة – بتصرّف - للمقال <a href="https://www.digitalocean.com/community/tutorials/how-to-use-lvm-to-manage-storage-devices-on-ubuntu-16-04" rel="external nofollow">How To Use LVM To Manage Storage Devices on Ubuntu 16.04</a> لكاتبه Justin Ellingwood. 
</p>
]]></description><guid isPermaLink="false">335</guid><pubDate>Mon, 07 Aug 2017 14:09:00 +0000</pubDate></item><item><title>&#x625;&#x62F;&#x627;&#x631;&#x629; &#x623;&#x62C;&#x647;&#x632;&#x629; &#x627;&#x644;&#x62A;&#x62E;&#x632;&#x64A;&#x646; &#x628;&#x622;&#x644;&#x64A;&#x651;&#x629; LVM &#x639;&#x644;&#x649; &#x623;&#x648;&#x628;&#x648;&#x646;&#x62A;&#x648;: &#x639;&#x631;&#x636; &#x627;&#x644;&#x645;&#x643;&#x648;&#x651;&#x646;&#x627;&#x62A;</title><link>https://academy.hsoub.com/devops/servers/%D8%A5%D8%AF%D8%A7%D8%B1%D8%A9-%D8%A3%D8%AC%D9%87%D8%B2%D8%A9-%D8%A7%D9%84%D8%AA%D8%AE%D8%B2%D9%8A%D9%86-%D8%A8%D8%A2%D9%84%D9%8A%D9%91%D8%A9-lvm-%D8%B9%D9%84%D9%89-%D8%A3%D9%88%D8%A8%D9%88%D9%86%D8%AA%D9%88-%D8%B9%D8%B1%D8%B6-%D8%A7%D9%84%D9%85%D9%83%D9%88%D9%91%D9%86%D8%A7%D8%AA-r334/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2017_08/59822841bdd0b_main2(2).png.7dd969d813ae0c442298b7807e01cb65.png" /></p>

<h2>
	مُقدّمة
</h2>

<p>
	LVM اختصار لعبارة Logical Volume Management، عبارة عن تقنيّة لإدارة أجهزة التّخزين تُمكّن المُستخدمين من توحيد وتجريد التّخطيط الماديّ لمكونات أجهزة التّخزين، لإدارتها بسهولة ومرونة. يُمكن استعمال النّسخة الحاليّة LVM2 بالاعتماد على إطار العمل الخاصّ بربط الأجهزة في نواة <a href="https://academy.hsoub.com/devops/linux/" rel="">لينكس</a> لجمع أجهزة التّخزين المُتوفّرة في مجموعات وتخصيص وحدات منطقيّة Logical units من المساحة المُركّبة حسب الطّلب.<br>
	سنتعرّف في هذا الدليل على كيفية استخدام LVM لإدارة أجهزة التّخزين الخاصّة بك. سنرى كيفيّة عرض معلومات حول وحدات التّخزين وأهداف مُحتملة، كيفيّة إنشاء ومحو مُختلف أنواع وحدات التّخزين، وكيفيّة تعديل وحدات تخزينيّة متواجدة عبر إعادة تخصيص حجم لها وتحويلها. سنعتمد على Ubuntu 16.04 لأمثلة على تنفيذ هذه العمليّات.
</p>

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

<p>
	لمُتابعة الدّرس، يجب أن تكون قادرا على الوصول إلى خادوم Ubuntu 16.04. ستحتاج إلى مُستخدم ذي صلاحيّات <code>sudo</code> مع ضبط مُسبق لتمكينه من تنفيذ مهام إداريّة، غير المستخدم الجذر <code>root</code>.
</p>

<p>
	لأخذ فكرة حول مكوّنات LVM ومبادئه ولاختبار إعداد بسيط باستخدام LVM، اتّبع <a href="https://academy.hsoub.com/devops/servers/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D9%85%D8%AF%D9%8A%D8%B1-%D9%88%D8%AD%D8%AF%D8%A7%D8%AA-%D8%A7%D9%84%D8%AA%D9%91%D8%AE%D8%B2%D9%8A%D9%86-%D8%A7%D9%84%D9%85%D9%86%D8%B7%D9%82%D9%8A%D9%91%D8%A9-%D9%81%D9%8A-%D9%86%D8%B8%D8%A7%D9%85-%D9%84%D9%8A%D9%86%D9%83%D8%B3-lvm-r333/" rel="">درس مدخل إلى LVM</a> قبل الشّروع في هذا الدّرس.<br>
	إن كنت جاهزا، ادخل إلى خادومك باستخدام حساب المُستخدم ذي صلاحيّات <code>sudo</code>.
</p>

<p>
	<strong>ملحوظة:</strong> يُفضَّل إن كانت هذه أول مرة تتعامل فيها مع LVM أو إن لم تكن متأكّدا من ما تريد فعله أن تختبر الخطوات المعروضة في هذا الدليل في آلة افتراضية أو على خادوم خاصّ بأغراض التجربة والاختبار. قد يؤدّي تنفيذ أوامر بطريقة غير صحيحة إلى ضياع البيانات.
</p>

<h2 id="عرض-معلومات-حول-وحدات-التخزين-المادية-مجموعات-التخزين-ووحدات-التخزين-المنطقية">
	عرض معلومات حول وحدات التّخزين الماديّة، مجموعات التّخزين، ووحدات التّخزين المنطقيّة
</h2>

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

<h3 id="عرض-معلومات-حول-جميع-أجهزة-التخزين-الكتلية-المتوافقة-مع-lvm">
	عرض معلومات حول جميع أجهزة التّخزين الكتليّة المتوافقة مع LVM
</h3>

<p>
	لعرض جميع أجهزة التّخزين الكتليّة التي يُمكن لـLVM إدارتها، استخدم الأمر <code>lvmdiskscan</code>:
</p>

<pre class="ipsCode" id="ips_uid_5844_7">
sudo lvmdiskscan</pre>

<p>
	المُخرَج:
</p>

<pre class="ipsCode" id="ips_uid_5844_7">
<code class="hljs rsl"><span class="pln">  </span><span class="pun">/</span><span class="pln">dev</span><span class="pun">/</span><span class="pln">ram0  </span><span class="pun">[</span><span class="pln">      </span><span class="hljs-number"><span class="lit">64.00</span></span><span class="pln"> </span><span class="typ">MiB</span><span class="pun">]</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">     </span><span class="hljs-number"><span class="lit">200.00</span></span><span class="pln"> </span><span class="typ">GiB</span><span class="pun">]</span><span class="pln"> 
  </span><span class="pun">/</span><span class="pln">dev</span><span class="pun">/</span><span class="pln">ram1  </span><span class="pun">[</span><span class="pln">      </span><span class="hljs-number"><span class="lit">64.00</span></span><span class="pln"> </span><span class="typ">MiB</span><span class="pun">]</span><span class="pln"> 

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

  </span><span class="pun">/</span><span class="pln">dev</span><span class="pun">/</span><span class="pln">ram15 </span><span class="pun">[</span><span class="pln">      </span><span class="hljs-number"><span class="lit">64.00</span></span><span class="pln"> </span><span class="typ">MiB</span><span class="pun">]</span><span class="pln"> 
  </span><span class="pun">/</span><span class="pln">dev</span><span class="pun">/</span><span class="pln">sdb   </span><span class="pun">[</span><span class="pln">     </span><span class="hljs-number"><span class="lit">100.00</span></span><span class="pln"> </span><span class="typ">GiB</span><span class="pun">]</span><span class="pln"> 
  </span><span class="hljs-number"><span class="lit">2</span></span><span class="pln"> disks
  </span><span class="hljs-number"><span class="lit">17</span></span><span class="pln"> partitions
  </span><span class="hljs-number"><span class="lit">0</span></span><span class="pln"> LVM physical </span><span class="hljs-shader"><span class="hljs-keyword"><span class="pln">volume</span></span><span class="pln"> whole disks
  </span><span class="lit">0</span><span class="pln"> LVM physical volumes</span></span></code></pre>

<p>
	بتجاهل أجهزة <code>/dev/ram*</code> (التي تُعتبر جزءا من قرص الذاكرة العشوائيّة في لينكس)، يُمكننا مُلاحظة الأجهزة التي يُمكن استخدامها لتشكيل وحدات تخزين ماديّة لـLVM.<br>
	ستكون هذه الخطوة في الغالب أول خطوة لتحديد أجهزة تخزين لاستعمالها مع LVM.
</p>

<h3 id="عرض-معلومات-عن-وحدات-التخزين-المادية">
	عرض معلومات عن وحدات التّخزين الماديّة
</h3>

<p>
	تُكتَب ترويسة Header على أجهزة التّخزين لتعليمها على أنها مكوّنات يُمكن لـLVM استخدامها. الأجهزة التي تحمل ترويسة تُسمّى بوحدات التّخزين الماديّة Physical Volumes.
</p>

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

<pre class="ipsCode" id="ips_uid_5844_7">
<code class="hljs bash"><span class="hljs-built_in"><span class="pln">sudo</span></span><span class="pln"> lvmdiskscan </span><span class="hljs-operator"><span class="pun">-</span><span class="pln">l</span></span></code></pre>

<p>
	المُخرج:
</p>

<pre class="ipsCode" id="ips_uid_5844_7">
<code class="hljs rsl"><span class="pln">  WARNING</span><span class="pun">:</span><span class="pln"> only considering LVM devices
  </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">     </span><span class="hljs-number"><span class="lit">200.00</span></span><span class="pln"> </span><span class="typ">GiB</span><span class="pun">]</span><span class="pln"> LVM physical </span><span class="hljs-shader"><span class="hljs-keyword"><span class="pln">volume</span></span><span class="pln">
  </span><span class="pun">/</span><span class="pln">dev</span><span class="pun">/</span><span class="pln">sdb                   </span><span class="pun">[</span><span class="pln">     </span><span class="lit">100.00</span><span class="pln"> </span><span class="typ">GiB</span><span class="pun">]</span><span class="pln"> LVM physical </span><span class="hljs-keyword"><span class="pln">volume</span></span><span class="pln">
  </span><span class="lit">2</span><span class="pln"> LVM physical </span><span class="hljs-keyword"><span class="pln">volume</span></span><span class="pln"> whole disks
  </span><span class="lit">0</span><span class="pln"> LVM physical volumes</span></span></code></pre>

<p>
	الأمر <code>pvscan</code> مُشابه لما سبق، إذ يبحث عن جميع وحدات التّخزين الماديّة الخاصّة بـLVM. إلّا أنّ تنسيق المُخرج مُختلف نوعا ما، إذ يعرض معلومات إضافيّة:
</p>

<pre class="ipsCode" id="ips_uid_5844_7">
<code class="hljs bash"><span class="hljs-built_in"><span class="pln">sudo</span></span><span class="pln"> pvscan</span></code></pre>

<p>
	المُخرج:
</p>

<pre class="ipsCode" id="ips_uid_5844_7">
<code class="hljs coffeescript"><span class="pln">  PV </span><span class="hljs-regexp"><span class="pun">/</span><span class="pln">dev</span><span class="pun">/</span><span class="pln">sda   VG </span><span class="typ">LVMVolGroup</span><span class="pln">     lvm2 </span><span class="pun">[</span><span class="lit">200.00</span><span class="pln"> </span><span class="typ">GiB</span><span class="pln"> </span><span class="pun">/</span></span><span class="pln"> </span><span class="hljs-number"><span class="lit">0</span></span><span class="pln">    free</span><span class="pun">]</span><span class="pln">
  PV </span><span class="hljs-regexp"><span class="pun">/</span><span class="pln">dev</span><span class="pun">/</span><span class="pln">sdb   VG </span><span class="typ">LVMVolGroup</span><span class="pln">     lvm2 </span><span class="pun">[</span><span class="lit">100.00</span><span class="pln"> </span><span class="typ">GiB</span><span class="pln"> </span><span class="pun">/</span></span><span class="pln"> </span><span class="hljs-number"><span class="lit">10.00</span></span><span class="pln"> </span><span class="typ">GiB</span><span class="pln"> free</span><span class="pun">]</span><span class="pln">
  </span><span class="hljs-attribute"><span class="typ">Total</span></span><span class="pun">:</span><span class="pln"> </span><span class="hljs-number"><span class="lit">2</span></span><span class="pln"> </span><span class="pun">[</span><span class="hljs-number"><span class="lit">299.99</span></span><span class="pln"> </span><span class="typ">GiB</span><span class="pun">]</span><span class="pln"> </span><span class="pun">/</span><span class="pln"> </span><span class="hljs-keyword"><span class="kwd">in</span></span><span class="pln"> </span><span class="hljs-attribute"><span class="kwd">use</span></span><span class="pun">:</span><span class="pln"> </span><span class="hljs-number"><span class="lit">2</span></span><span class="pln"> </span><span class="pun">[</span><span class="hljs-number"><span class="lit">299.99</span></span><span class="pln"> </span><span class="typ">GiB</span><span class="pun">]</span><span class="pln"> </span><span class="pun">/</span><span class="pln"> </span><span class="hljs-keyword"><span class="kwd">in</span></span><span class="pln"> </span><span class="hljs-literal"><span class="kwd">no</span></span><span class="pln"> </span><span class="hljs-attribute"><span class="pln">VG</span></span><span class="pun">:</span><span class="pln"> </span><span class="hljs-number"><span class="lit">0</span></span><span class="pln"> </span><span class="pun">[</span><span class="hljs-number"><span class="lit">0</span></span><span class="pln">   </span><span class="pun">]</span></code></pre>

<p>
	إن كنت ترغب بالحصول على المزيد من المعلومات، فاستعمال الأمرين <code>pvs</code> و<code>pvdisplay</code> خيار أفضل.
</p>

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

<pre class="ipsCode" id="ips_uid_5844_7">
<code class="hljs bash"><span class="hljs-built_in"><span class="pln">sudo</span></span><span class="pln"> pvs</span></code></pre>

<p>
	المُخرج:
</p>

<pre class="ipsCode" id="ips_uid_5844_7">
<code class="hljs livecodeserver"><span class="pln">  PV         VG          </span><span class="typ">Fmt</span><span class="pln">  </span><span class="typ">Attr</span><span class="pln"> </span><span class="typ">PSize</span><span class="pln">   </span><span class="typ">PFree</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="typ">LVMVolGroup</span><span class="pln"> lvm2 </span><span class="hljs-operator"><span class="pln">a</span></span><span class="hljs-comment"><span class="pun">--</span><span class="pln">  </span><span class="lit">200.00g</span><span class="pln">     </span><span class="lit">0</span><span class="pln"> </span></span><span class="pln">
  </span><span class="pun">/</span><span class="pln">dev</span><span class="pun">/</span><span class="pln">sdb   </span><span class="typ">LVMVolGroup</span><span class="pln"> lvm2 </span><span class="hljs-operator"><span class="pln">a</span></span><span class="hljs-comment"><span class="pun">--</span><span class="pln">  </span><span class="lit">100.00g</span><span class="pln"> </span><span class="lit">10.00g</span></span></code></pre>

<p>
	لمعلومات أكثر إسهابا وقابليّة للقراءة، فالأمر <code>pvdisplay</code> عادة ما يكون خيارا أفضل:
</p>

<pre class="ipsCode" id="ips_uid_5844_7">
<code class="hljs bash"><span class="hljs-built_in"><span class="pln">sudo</span></span><span class="pln"> pvdisplay</span></code></pre>

<p>
	المُخرج:
</p>

<pre class="ipsCode" id="ips_uid_5844_7">
<code class="hljs lasso"><span class="pln">  </span><span class="hljs-subst"><span class="pun">---</span></span><span class="pln"> </span><span class="typ">Physical</span><span class="pln"> volume </span><span class="hljs-subst"><span class="pun">---</span></span><span class="pln">
  PV </span><span class="typ">Name</span><span class="pln">               </span><span class="pun">/</span><span class="pln">dev</span><span class="pun">/</span><span class="pln">sda
  VG </span><span class="typ">Name</span><span class="pln">               </span><span class="typ">LVMVolGroup</span><span class="pln">
  PV </span><span class="typ">Size</span><span class="pln">               </span><span class="hljs-number"><span class="lit">200.00</span></span><span class="pln"> </span><span class="typ">GiB</span><span class="pln"> </span><span class="hljs-subst"><span class="pun">/</span></span><span class="pln"> </span><span class="hljs-literal"><span class="kwd">not</span></span><span class="pln"> usable </span><span class="hljs-number"><span class="lit">4.00</span></span><span class="pln"> </span><span class="typ">MiB</span><span class="pln">
  </span><span class="typ">Allocatable</span><span class="pln">           yes </span><span class="pun">(</span><span class="pln">but </span><span class="hljs-literal"><span class="pln">full</span></span><span class="pun">)</span><span class="pln">
  PE </span><span class="typ">Size</span><span class="pln">               </span><span class="hljs-number"><span class="lit">4.00</span></span><span class="pln"> </span><span class="typ">MiB</span><span class="pln">
  </span><span class="typ">Total</span><span class="pln"> PE              </span><span class="hljs-number"><span class="lit">51199</span></span><span class="pln">
  </span><span class="typ">Free</span><span class="pln"> PE               </span><span class="hljs-number"><span class="lit">0</span></span><span class="pln">
  </span><span class="typ">Allocated</span><span class="pln"> PE          </span><span class="hljs-number"><span class="lit">51199</span></span><span class="pln">
  PV UUID               kRUOyU</span><span class="hljs-subst"><span class="pun">-</span></span><span class="hljs-number"><span class="lit">0</span></span><span class="lit">ib4</span><span class="hljs-attribute"><span class="pun">-</span><span class="pln">ujPh</span></span><span class="hljs-attribute"><span class="pun">-</span><span class="pln">kAJP</span></span><span class="hljs-attribute"><span class="pun">-</span><span class="pln">eeQv</span></span><span class="hljs-attribute"><span class="pun">-</span><span class="pln">ztRL</span></span><span class="hljs-subst"><span class="pun">-</span></span><span class="hljs-number"><span class="lit">4</span></span><span class="lit">EkaDQ</span><span class="pln">

  </span><span class="hljs-subst"><span class="pun">---</span></span><span class="pln"> </span><span class="typ">Physical</span><span class="pln"> volume </span><span class="hljs-subst"><span class="pun">---</span></span><span class="pln">
  PV </span><span class="typ">Name</span><span class="pln">               </span><span class="pun">/</span><span class="pln">dev</span><span class="pun">/</span><span class="pln">sdb
  VG </span><span class="typ">Name</span><span class="pln">               </span><span class="typ">LVMVolGroup</span><span class="pln">
  PV </span><span class="typ">Size</span><span class="pln">               </span><span class="hljs-number"><span class="lit">100.00</span></span><span class="pln"> </span><span class="typ">GiB</span><span class="pln"> </span><span class="hljs-subst"><span class="pun">/</span></span><span class="pln"> </span><span class="hljs-literal"><span class="kwd">not</span></span><span class="pln"> usable </span><span class="hljs-number"><span class="lit">4.00</span></span><span class="pln"> </span><span class="typ">MiB</span><span class="pln">
  </span><span class="typ">Allocatable</span><span class="pln">           yes 
  PE </span><span class="typ">Size</span><span class="pln">               </span><span class="hljs-number"><span class="lit">4.00</span></span><span class="pln"> </span><span class="typ">MiB</span><span class="pln">
  </span><span class="typ">Total</span><span class="pln"> PE              </span><span class="hljs-number"><span class="lit">25599</span></span><span class="pln">
  </span><span class="typ">Free</span><span class="pln"> PE               </span><span class="hljs-number"><span class="lit">2560</span></span><span class="pln">
  </span><span class="typ">Allocated</span><span class="pln"> PE          </span><span class="hljs-number"><span class="lit">23039</span></span><span class="pln">
  PV UUID               udcuRJ</span><span class="hljs-attribute"><span class="pun">-</span><span class="pln">jCDC</span></span><span class="hljs-subst"><span class="pun">-</span></span><span class="hljs-number"><span class="lit">26</span></span><span class="lit">nD</span><span class="hljs-attribute"><span class="pun">-</span><span class="pln">ro9u</span></span><span class="hljs-attribute"><span class="pun">-</span><span class="typ">QQNd</span></span><span class="hljs-attribute"><span class="pun">-</span><span class="pln">D6VL</span></span><span class="hljs-attribute"><span class="pun">-</span><span class="typ">GEIlD7</span></span></code></pre>

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

<pre class="ipsCode" id="ips_uid_5844_7">
<code class="hljs bash"><span class="hljs-built_in"><span class="pln">sudo</span></span><span class="pln"> pvdisplay </span><span class="pun">-</span><span class="pln">m</span></code></pre>

<p>
	المُخرج:
</p>

<pre class="ipsCode" id="ips_uid_5844_7">
<code class="hljs livecodeserver"><span class="pln">  </span><span class="hljs-comment"><span class="pun">---</span><span class="pln"> </span><span class="typ">Physical</span><span class="pln"> volume </span><span class="pun">---</span></span><span class="pln">
  PV </span><span class="typ">Name</span><span class="pln">               </span><span class="pun">/</span><span class="pln">dev</span><span class="pun">/</span><span class="pln">sda
  VG </span><span class="typ">Name</span><span class="pln">               </span><span class="typ">LVMVolGroup</span><span class="pln">
  PV </span><span class="typ">Size</span><span class="pln">               </span><span class="hljs-number"><span class="lit">200.00</span></span><span class="pln"> </span><span class="typ">GiB</span><span class="pln"> </span><span class="pun">/</span><span class="pln"> </span><span class="hljs-operator"><span class="kwd">not</span></span><span class="pln"> usable </span><span class="hljs-number"><span class="lit">4.00</span></span><span class="pln"> </span><span class="typ">MiB</span><span class="pln">
  </span><span class="typ">Allocatable</span><span class="pln">           yes 
  PE </span><span class="typ">Size</span><span class="pln">               </span><span class="hljs-number"><span class="lit">4.00</span></span><span class="pln"> </span><span class="typ">MiB</span><span class="pln">
  </span><span class="typ">Total</span><span class="pln"> PE              </span><span class="hljs-number"><span class="lit">51199</span></span><span class="pln">
  </span><span class="typ">Free</span><span class="pln"> PE               </span><span class="hljs-number"><span class="lit">38395</span></span><span class="pln">
  </span><span class="typ">Allocated</span><span class="pln"> PE          </span><span class="hljs-number"><span class="lit">12804</span></span><span class="pln">
  PV UUID               kRUOyU</span><span class="pun">-</span><span class="hljs-number"><span class="lit">0</span></span><span class="lit">ib4</span><span class="pun">-</span><span class="pln">ujPh</span><span class="pun">-</span><span class="pln">kAJP</span><span class="pun">-</span><span class="pln">eeQv</span><span class="pun">-</span><span class="pln">ztRL</span><span class="pun">-</span><span class="hljs-number"><span class="lit">4</span></span><span class="lit">EkaDQ</span><span class="pln">

  </span><span class="hljs-comment"><span class="pun">---</span><span class="pln"> </span><span class="typ">Physical</span><span class="pln"> </span><span class="typ">Segments</span><span class="pln"> </span><span class="pun">---</span></span><span class="pln">
  </span><span class="typ">Physical</span><span class="pln"> extent </span><span class="hljs-number"><span class="lit">0</span></span><span class="pln"> </span><span class="hljs-built_in"><span class="pln">to</span></span><span class="pln"> </span><span class="hljs-number"><span class="lit">0</span></span><span class="pun">:</span><span class="pln">
    </span><span class="typ">Logical</span><span class="pln"> volume  </span><span class="pun">/</span><span class="pln">dev</span><span class="pun">/</span><span class="typ">LVMVolGroup</span><span class="pun">/</span><span class="pln">db_rmeta_0
    </span><span class="typ">Logical</span><span class="pln"> </span><span class="hljs-built_in"><span class="pln">extents</span></span><span class="pln"> </span><span class="hljs-number"><span class="lit">0</span></span><span class="pln"> </span><span class="hljs-built_in"><span class="pln">to</span></span><span class="pln"> </span><span class="hljs-number"><span class="lit">0</span></span><span class="pln">
  </span><span class="typ">Physical</span><span class="pln"> extent </span><span class="hljs-number"><span class="lit">1</span></span><span class="pln"> </span><span class="hljs-built_in"><span class="pln">to</span></span><span class="pln"> </span><span class="hljs-number"><span class="lit">5120</span></span><span class="pun">:</span><span class="pln">
    </span><span class="typ">Logical</span><span class="pln"> volume  </span><span class="pun">/</span><span class="pln">dev</span><span class="pun">/</span><span class="typ">LVMVolGroup</span><span class="pun">/</span><span class="pln">db_rimage_0
    </span><span class="typ">Logical</span><span class="pln"> </span><span class="hljs-built_in"><span class="pln">extents</span></span><span class="pln"> </span><span class="hljs-number"><span class="lit">0</span></span><span class="pln"> </span><span class="hljs-built_in"><span class="pln">to</span></span><span class="pln"> </span><span class="hljs-number"><span class="lit">5119</span></span><span class="pln">

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

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

<h3 id="عرض-معلومات-عن-مجموعات-التخزين-volume-groups">
	عرض معلومات عن مجموعات التّخزين Volume Groups
</h3>

<p>
	يحتوي LVM على العديد من الأدوات التّي يُمكن بها عرض معلومات حول مجموعات التّخزين.
</p>

<p>
	يُستعملُ الأمر <code>vgscan</code> لفحص النّظام عن مجموعات التّخزين المتوفّرة. بالإضافة إلى إعادة بناء ملفّ التّخبئة Cache عند الحاجة. ويُعدّ أمرا جيّدا للاستخدام عند استيراد مجموعة تخزين إلى نظام جديد:
</p>

<pre class="ipsCode" id="ips_uid_5844_7">
<code class="hljs bash"><span class="hljs-built_in"><span class="pln">sudo</span></span><span class="pln"> vgscan</span></code></pre>

<p>
	المُخرج:
</p>

<pre class="ipsCode" id="ips_uid_5844_7">
<code class="hljs lasso"><span class="typ">Reading</span><span class="pln"> </span><span class="hljs-literal"><span class="pln">all</span></span><span class="pln"> physical volumes</span><span class="hljs-built_in"><span class="pun">.</span></span><span class="pln">  </span><span class="typ">This</span><span class="pln"> may </span><span class="hljs-keyword"><span class="pln">take</span></span><span class="pln"> a </span><span class="hljs-keyword"><span class="kwd">while</span></span><span class="hljs-attribute"><span class="pun">...</span></span><span class="pln">
</span><span class="typ">Found</span><span class="pln"> volume </span><span class="hljs-keyword"><span class="kwd">group</span></span><span class="pln"> </span><span class="hljs-string"><span class="str">"LVMVolGroup"</span></span><span class="pln"> </span><span class="kwd">using</span><span class="pln"> metadata </span><span class="hljs-keyword"><span class="pln">type</span></span><span class="pln"> lvm2</span></code></pre>

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

<pre class="ipsCode" id="ips_uid_5844_7">
<code class="hljs bash"><span class="hljs-built_in"><span class="pln">sudo</span></span><span class="pln"> vgs </span><span class="pun">-</span><span class="pln">o </span><span class="pun">+</span><span class="pln">devices</span><span class="pun">,</span><span class="pln">lv_path</span></code></pre>

<p>
	المُخرج:
</p>

<pre class="ipsCode" id="ips_uid_5844_7">
<code class="hljs livecodeserver"><span class="pln">  VG          </span><span class="hljs-comment"><span class="com">#PV #LV #SN Attr   VSize   VFree  Devices        Path                      </span></span><span class="pln">
  </span><span class="typ">LVMVolGroup</span><span class="pln">   </span><span class="hljs-number"><span class="lit">2</span></span><span class="pln">   </span><span class="hljs-number"><span class="lit">4</span></span><span class="pln">   </span><span class="hljs-number"><span class="lit">0</span></span><span class="pln"> wz</span><span class="hljs-comment"><span class="pun">--</span><span class="pln">n</span><span class="pun">-</span><span class="pln"> </span><span class="lit">299.99g</span><span class="pln"> </span><span class="lit">10.00g</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="lit">0</span><span class="pun">)</span><span class="pln">    </span><span class="pun">/</span><span class="pln">dev</span><span class="pun">/</span><span class="typ">LVMVolGroup</span><span class="pun">/</span><span class="pln">projects </span></span><span class="pln">
  </span><span class="typ">LVMVolGroup</span><span class="pln">   </span><span class="hljs-number"><span class="lit">2</span></span><span class="pln">   </span><span class="hljs-number"><span class="lit">4</span></span><span class="pln">   </span><span class="hljs-number"><span class="lit">0</span></span><span class="pln"> wz</span><span class="hljs-comment"><span class="pun">--</span><span class="pln">n</span><span class="pun">-</span><span class="pln"> </span><span class="lit">299.99g</span><span class="pln"> </span><span class="lit">10.00g</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="lit">2560</span><span class="pun">)</span><span class="pln"> </span><span class="pun">/</span><span class="pln">dev</span><span class="pun">/</span><span class="typ">LVMVolGroup</span><span class="pun">/</span><span class="pln">www      </span></span><span class="pln">
  </span><span class="typ">LVMVolGroup</span><span class="pln">   </span><span class="hljs-number"><span class="lit">2</span></span><span class="pln">   </span><span class="hljs-number"><span class="lit">4</span></span><span class="pln">   </span><span class="hljs-number"><span class="lit">0</span></span><span class="pln"> wz</span><span class="hljs-comment"><span class="pun">--</span><span class="pln">n</span><span class="pun">-</span><span class="pln"> </span><span class="lit">299.99g</span><span class="pln"> </span><span class="lit">10.00g</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="lit">3840</span><span class="pun">)</span><span class="pln"> </span><span class="pun">/</span><span class="pln">dev</span><span class="pun">/</span><span class="typ">LVMVolGroup</span><span class="pun">/</span><span class="pln">db       </span></span><span class="pln">
  </span><span class="typ">LVMVolGroup</span><span class="pln">   </span><span class="hljs-number"><span class="lit">2</span></span><span class="pln">   </span><span class="hljs-number"><span class="lit">4</span></span><span class="pln">   </span><span class="hljs-number"><span class="lit">0</span></span><span class="pln"> wz</span><span class="hljs-comment"><span class="pun">--</span><span class="pln">n</span><span class="pun">-</span><span class="pln"> </span><span class="lit">299.99g</span><span class="pln"> </span><span class="lit">10.00g</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="lit">8960</span><span class="pun">)</span><span class="pln"> </span><span class="pun">/</span><span class="pln">dev</span><span class="pun">/</span><span class="typ">LVMVolGroup</span><span class="pun">/</span><span class="pln">workspace</span></span><span class="pln">
  </span><span class="typ">LVMVolGroup</span><span class="pln">   </span><span class="hljs-number"><span class="lit">2</span></span><span class="pln">   </span><span class="hljs-number"><span class="lit">4</span></span><span class="pln">   </span><span class="hljs-number"><span class="lit">0</span></span><span class="pln"> wz</span><span class="hljs-comment"><span class="pun">--</span><span class="pln">n</span><span class="pun">-</span><span class="pln"> </span><span class="lit">299.99g</span><span class="pln"> </span><span class="lit">10.00g</span><span class="pln"> </span><span class="pun">/</span><span class="pln">dev</span><span class="pun">/</span><span class="pln">sdb</span><span class="pun">(</span><span class="lit">0</span><span class="pun">)</span><span class="pln">    </span><span class="pun">/</span><span class="pln">dev</span><span class="pun">/</span><span class="typ">LVMVolGroup</span><span class="pun">/</span><span class="pln">workspace</span></span></code></pre>

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

<pre class="ipsCode" id="ips_uid_5844_7">
<code class="hljs bash"><span class="hljs-built_in"><span class="pln">sudo</span></span><span class="pln"> vgdisplay </span><span class="pun">-</span><span class="pln">v</span></code></pre>

<p>
	المُخرج:
</p>

<pre class="ipsCode" id="ips_uid_5844_7">
<code class="hljs brainfuck"><span class="pln">    </span><span class="hljs-comment"><span class="typ">Using</span></span><span class="pln"> </span><span class="hljs-comment"><span class="pln">volume</span></span><span class="pln"> </span><span class="hljs-comment"><span class="kwd">group</span><span class="pun">(</span><span class="pln">s</span><span class="pun">)</span></span><span class="pln"> </span><span class="hljs-comment"><span class="pln">on</span></span><span class="pln"> </span><span class="hljs-comment"><span class="pln">command</span></span><span class="pln"> </span><span class="hljs-comment"><span class="pln">line</span></span><span class="hljs-string"><span class="pun">.</span></span><span class="pln">
  </span><span class="hljs-literal"><span class="pun">-</span></span><span class="hljs-literal"><span class="pun">-</span></span><span class="hljs-literal"><span class="pun">-</span></span><span class="pln"> </span><span class="hljs-comment"><span class="typ">Volume</span></span><span class="pln"> </span><span class="hljs-comment"><span class="kwd">group</span></span><span class="pln"> </span><span class="hljs-literal"><span class="pun">-</span></span><span class="hljs-literal"><span class="pun">-</span></span><span class="hljs-literal"><span class="pun">-</span></span><span class="pln">
  </span><span class="hljs-comment"><span class="pln">VG</span></span><span class="pln"> </span><span class="hljs-comment"><span class="typ">Name</span></span><span class="pln">               </span><span class="hljs-comment"><span class="typ">LVMVolGroup</span></span><span class="pln">
  </span><span class="hljs-string"><span class="pun">.</span></span><span class="pln"> </span><span class="hljs-string"><span class="pun">.</span></span><span class="pln"> </span><span class="hljs-string"><span class="pun">.</span></span><span class="pln">

  </span><span class="hljs-literal"><span class="pun">-</span></span><span class="hljs-literal"><span class="pun">-</span></span><span class="hljs-literal"><span class="pun">-</span></span><span class="pln"> </span><span class="hljs-comment"><span class="typ">Logical</span></span><span class="pln"> </span><span class="hljs-comment"><span class="pln">volume</span></span><span class="pln"> </span><span class="hljs-literal"><span class="pun">-</span></span><span class="hljs-literal"><span class="pun">-</span></span><span class="hljs-literal"><span class="pun">-</span></span><span class="pln">
  </span><span class="hljs-comment"><span class="pln">LV</span></span><span class="pln"> </span><span class="hljs-comment"><span class="typ">Path</span></span><span class="pln">                </span><span class="hljs-comment"><span class="pun">/</span><span class="pln">dev</span><span class="pun">/</span><span class="typ">LVMVolGroup</span><span class="pun">/</span><span class="pln">projects</span></span><span class="pln">
  </span><span class="hljs-string"><span class="pun">.</span></span><span class="pln"> </span><span class="hljs-string"><span class="pun">.</span></span><span class="pln"> </span><span class="hljs-string"><span class="pun">.</span></span><span class="pln">

  </span><span class="hljs-literal"><span class="pun">-</span></span><span class="hljs-literal"><span class="pun">-</span></span><span class="hljs-literal"><span class="pun">-</span></span><span class="pln"> </span><span class="hljs-comment"><span class="typ">Logical</span></span><span class="pln"> </span><span class="hljs-comment"><span class="pln">volume</span></span><span class="pln"> </span><span class="hljs-literal"><span class="pun">-</span></span><span class="hljs-literal"><span class="pun">-</span></span><span class="hljs-literal"><span class="pun">-</span></span><span class="pln">
  </span><span class="hljs-comment"><span class="pln">LV</span></span><span class="pln"> </span><span class="hljs-comment"><span class="typ">Path</span></span><span class="pln">                </span><span class="hljs-comment"><span class="pun">/</span><span class="pln">dev</span><span class="pun">/</span><span class="typ">LVMVolGroup</span><span class="pun">/</span><span class="pln">www</span></span><span class="pln">
  </span><span class="hljs-string"><span class="pun">.</span></span><span class="pln"> </span><span class="hljs-string"><span class="pun">.</span></span><span class="pln"> </span><span class="hljs-string"><span class="pun">.</span></span><span class="pln">

  </span><span class="hljs-literal"><span class="pun">-</span></span><span class="hljs-literal"><span class="pun">-</span></span><span class="hljs-literal"><span class="pun">-</span></span><span class="pln"> </span><span class="hljs-comment"><span class="typ">Logical</span></span><span class="pln"> </span><span class="hljs-comment"><span class="pln">volume</span></span><span class="pln"> </span><span class="hljs-literal"><span class="pun">-</span></span><span class="hljs-literal"><span class="pun">-</span></span><span class="hljs-literal"><span class="pun">-</span></span><span class="pln">
  </span><span class="hljs-comment"><span class="pln">LV</span></span><span class="pln"> </span><span class="hljs-comment"><span class="typ">Path</span></span><span class="pln">                </span><span class="hljs-comment"><span class="pun">/</span><span class="pln">dev</span><span class="pun">/</span><span class="typ">LVMVolGroup</span><span class="pun">/</span><span class="pln">db</span></span><span class="pln">
  </span><span class="hljs-string"><span class="pun">.</span></span><span class="pln"> </span><span class="hljs-string"><span class="pun">.</span></span><span class="pln"> </span><span class="hljs-string"><span class="pun">.</span></span><span class="pln">

  </span><span class="hljs-literal"><span class="pun">-</span></span><span class="hljs-literal"><span class="pun">-</span></span><span class="hljs-literal"><span class="pun">-</span></span><span class="pln"> </span><span class="hljs-comment"><span class="typ">Logical</span></span><span class="pln"> </span><span class="hljs-comment"><span class="pln">volume</span></span><span class="pln"> </span><span class="hljs-literal"><span class="pun">-</span></span><span class="hljs-literal"><span class="pun">-</span></span><span class="hljs-literal"><span class="pun">-</span></span><span class="pln">
  </span><span class="hljs-comment"><span class="pln">LV</span></span><span class="pln"> </span><span class="hljs-comment"><span class="typ">Path</span></span><span class="pln">                </span><span class="hljs-comment"><span class="pun">/</span><span class="pln">dev</span><span class="pun">/</span><span class="typ">LVMVolGroup</span><span class="pun">/</span><span class="pln">workspace</span></span><span class="pln">
  </span><span class="hljs-string"><span class="pun">.</span></span><span class="pln"> </span><span class="hljs-string"><span class="pun">.</span></span><span class="pln"> </span><span class="hljs-string"><span class="pun">.</span></span><span class="pln">

  </span><span class="hljs-literal"><span class="pun">-</span></span><span class="hljs-literal"><span class="pun">-</span></span><span class="hljs-literal"><span class="pun">-</span></span><span class="pln"> </span><span class="hljs-comment"><span class="typ">Physical</span></span><span class="pln"> </span><span class="hljs-comment"><span class="pln">volumes</span></span><span class="pln"> </span><span class="hljs-literal"><span class="pun">-</span></span><span class="hljs-literal"><span class="pun">-</span></span><span class="hljs-literal"><span class="pun">-</span></span><span class="pln">
  </span><span class="hljs-comment"><span class="pln">PV</span></span><span class="pln"> </span><span class="hljs-comment"><span class="typ">Name</span></span><span class="pln">               </span><span class="hljs-comment"><span class="pun">/</span><span class="pln">dev</span><span class="pun">/</span><span class="pln">sda</span></span><span class="pln">     
  </span><span class="hljs-string"><span class="pun">.</span></span><span class="pln"> </span><span class="hljs-string"><span class="pun">.</span></span><span class="pln"> </span><span class="hljs-string"><span class="pun">.</span></span><span class="pln">

  </span><span class="hljs-comment"><span class="pln">PV</span></span><span class="pln"> </span><span class="hljs-comment"><span class="typ">Name</span></span><span class="pln">               </span><span class="hljs-comment"><span class="pun">/</span><span class="pln">dev</span><span class="pun">/</span><span class="pln">sdb</span></span><span class="pln">     
  </span><span class="hljs-string"><span class="pun">.</span></span><span class="pln"> </span><span class="hljs-string"><span class="pun">.</span></span><span class="pln"> </span><span class="hljs-string"><span class="pun">.</span></span></code></pre>

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

<h3 id="عرض-معلومات-حول-وحدات-التخزين-المنطقية">
	عرض معلومات حول وحدات التّخزين المنطقيّة
</h3>

<p>
	يمتلك LVM مجموعة من الأدوات لعرض معلومات عن وحدات التّخزين المنطقيّة كذلك.<br>
	كما الحال مع مُكوّنات LVM الأخرى، يُمكن استعمال الأمر <code>lvscan</code> لفحص النّظام وعرض معلومات وجيزة حول وحدات التّخزين المنطقيّة التي يجدها:
</p>

<pre class="ipsCode" id="ips_uid_5844_7">
<code class="hljs bash"><span class="hljs-built_in"><span class="pln">sudo</span></span><span class="pln"> lvscan</span></code></pre>

<p>
	المُخرج:
</p>

<pre class="ipsCode" id="ips_uid_5844_7">
<code class="hljs ocaml"><span class="pln">  ACTIVE            </span><span class="hljs-string"><span class="str">'/dev/LVMVolGroup/projects'</span></span><span class="pln"> </span><span class="pun">[</span><span class="hljs-number"><span class="lit">10.00</span></span><span class="pln"> </span><span class="typ">GiB</span><span class="pun">]</span><span class="pln"> </span><span class="hljs-keyword"><span class="pln">inherit</span></span><span class="pln">
  ACTIVE            </span><span class="hljs-string"><span class="str">'/dev/LVMVolGroup/www'</span></span><span class="pln"> </span><span class="pun">[</span><span class="hljs-number"><span class="lit">5.00</span></span><span class="pln"> </span><span class="typ">GiB</span><span class="pun">]</span><span class="pln"> </span><span class="hljs-keyword"><span class="pln">inherit</span></span><span class="pln">
  ACTIVE            </span><span class="hljs-string"><span class="str">'/dev/LVMVolGroup/db'</span></span><span class="pln"> </span><span class="pun">[</span><span class="hljs-number"><span class="lit">20.00</span></span><span class="pln"> </span><span class="typ">GiB</span><span class="pun">]</span><span class="pln"> </span><span class="hljs-keyword"><span class="pln">inherit</span></span><span class="pln">
  ACTIVE            </span><span class="hljs-string"><span class="str">'/dev/LVMVolGroup/workspace'</span></span><span class="pln"> </span><span class="pun">[</span><span class="hljs-number"><span class="lit">254.99</span></span><span class="pln"> </span><span class="typ">GiB</span><span class="pun">]</span><span class="pln"> </span><span class="hljs-keyword"><span class="pln">inherit</span></span></code></pre>

<p>
	لمعلومات أكثر كمالا، يُمكنك استخدام الأمر <code>lvs</code> الذي يتمتّع بمرونة وقوّة بالإضافة إلى سهولة استخدامه في السكربتات:
</p>

<pre class="ipsCode" id="ips_uid_5844_7">
<code class="hljs bash"><span class="hljs-built_in"><span class="pln">sudo</span></span><span class="pln"> lvs</span></code></pre>

<p>
	المُخرج:
</p>

<pre class="ipsCode" id="ips_uid_5844_7">
<code class="hljs lasso"><span class="pln">  LV        VG          </span><span class="typ">Attr</span><span class="pln">       </span><span class="typ">LSize</span><span class="pln">   </span><span class="typ">Pool</span><span class="pln"> </span><span class="typ">Origin</span><span class="pln"> </span><span class="hljs-built_in"><span class="typ">Data</span></span><span class="hljs-subst"><span class="pun">%</span></span><span class="pln">  </span><span class="typ">Meta</span><span class="hljs-subst"><span class="pun">%</span></span><span class="pln">  </span><span class="typ">Move</span><span class="pln"> </span><span class="hljs-keyword"><span class="typ">Log</span></span><span class="pln"> </span><span class="typ">Cpy</span><span class="hljs-subst"><span class="pun">%</span></span><span class="typ">Sync</span><span class="pln"> </span><span class="typ">Convert</span><span class="pln">
  db        </span><span class="typ">LVMVolGroup</span><span class="pln"> </span><span class="hljs-attribute"><span class="pun">-</span><span class="pln">wi</span></span><span class="hljs-attribute"><span class="pun">-</span><span class="pln">ao</span></span><span class="hljs-subst"><span class="pun">----</span></span><span class="pln">  </span><span class="hljs-number"><span class="lit">20.00</span></span><span class="lit">g</span><span class="pln">                                                    
  projects  </span><span class="typ">LVMVolGroup</span><span class="pln"> </span><span class="hljs-attribute"><span class="pun">-</span><span class="pln">wi</span></span><span class="hljs-attribute"><span class="pun">-</span><span class="pln">ao</span></span><span class="hljs-subst"><span class="pun">----</span></span><span class="pln">  </span><span class="hljs-number"><span class="lit">10.00</span></span><span class="lit">g</span><span class="pln">                                                    
  workspace </span><span class="typ">LVMVolGroup</span><span class="pln"> </span><span class="hljs-attribute"><span class="pun">-</span><span class="pln">wi</span></span><span class="hljs-attribute"><span class="pun">-</span><span class="pln">ao</span></span><span class="hljs-subst"><span class="pun">----</span></span><span class="pln"> </span><span class="hljs-number"><span class="lit">254.99</span></span><span class="lit">g</span><span class="pln">                                                    
  www       </span><span class="typ">LVMVolGroup</span><span class="pln"> </span><span class="hljs-attribute"><span class="pun">-</span><span class="pln">wi</span></span><span class="hljs-attribute"><span class="pun">-</span><span class="pln">ao</span></span><span class="hljs-subst"><span class="pun">----</span></span><span class="pln">   </span><span class="hljs-number"><span class="lit">5.00</span></span><span class="lit">g</span></code></pre>

<p>
	لإيجاد عدد شرائط Stripes وحدة التّخزين المنطقيّة ونوعها، استعمل الخيار <code>--segments</code>:
</p>

<pre class="ipsCode" id="ips_uid_5844_7">
<code class="hljs bash"><span class="hljs-built_in"><span class="pln">sudo</span></span><span class="pln"> lvs </span><span class="pun">--</span><span class="pln">segments</span></code></pre>

<p>
	المُخرج:
</p>

<pre class="ipsCode" id="ips_uid_5844_7">
<code class="hljs lasso"><span class="pln">  LV           VG          </span><span class="typ">Attr</span><span class="pln">       </span><span class="hljs-variable"><span class="com">#Str</span></span><span class="com"> </span><span class="hljs-keyword"><span class="com">Type</span></span><span class="com">    SSize </span><span class="pln">
  db           </span><span class="typ">LVMVolGroup</span><span class="pln"> rwi</span><span class="hljs-attribute"><span class="pun">-</span><span class="pln">a</span></span><span class="hljs-attribute"><span class="pun">-</span><span class="pln">r</span></span><span class="hljs-subst"><span class="pun">---</span></span><span class="pln">    </span><span class="hljs-number"><span class="lit">2</span></span><span class="pln"> raid1   </span><span class="hljs-number"><span class="lit">20.00</span></span><span class="lit">g</span><span class="pln">
  mirrored_vol </span><span class="typ">LVMVolGroup</span><span class="pln"> rwi</span><span class="hljs-attribute"><span class="pun">-</span><span class="pln">a</span></span><span class="hljs-attribute"><span class="pun">-</span><span class="pln">r</span></span><span class="hljs-subst"><span class="pun">---</span></span><span class="pln">    </span><span class="hljs-number"><span class="lit">3</span></span><span class="pln"> raid1   </span><span class="hljs-number"><span class="lit">10.00</span></span><span class="lit">g</span><span class="pln">
  test         </span><span class="typ">LVMVolGroup</span><span class="pln"> rwi</span><span class="hljs-attribute"><span class="pun">-</span><span class="pln">a</span></span><span class="hljs-attribute"><span class="pun">-</span><span class="pln">r</span></span><span class="hljs-subst"><span class="pun">---</span></span><span class="pln">    </span><span class="hljs-number"><span class="lit">3</span></span><span class="pln"> raid5   </span><span class="hljs-number"><span class="lit">10.00</span></span><span class="lit">g</span><span class="pln">
  test2        </span><span class="typ">LVMVolGroup</span><span class="pln"> </span><span class="hljs-attribute"><span class="pun">-</span><span class="pln">wi</span></span><span class="hljs-attribute"><span class="pun">-</span><span class="pln">a</span></span><span class="hljs-subst"><span class="pun">-----</span></span><span class="pln">    </span><span class="hljs-number"><span class="lit">2</span></span><span class="pln"> striped </span><span class="hljs-number"><span class="lit">10.00</span></span><span class="lit">g</span><span class="pln">
  test3        </span><span class="typ">LVMVolGroup</span><span class="pln"> rwi</span><span class="hljs-attribute"><span class="pun">-</span><span class="pln">a</span></span><span class="hljs-attribute"><span class="pun">-</span><span class="pln">r</span></span><span class="hljs-subst"><span class="pun">---</span></span><span class="pln">    </span><span class="hljs-number"><span class="lit">2</span></span><span class="pln"> raid1   </span><span class="hljs-number"><span class="lit">10.00</span></span><span class="lit">g</span></code></pre>

<p>
	يُمكن الحصول على أكثر مُخرج قابل للقراءة عبر الأمر <code>lvdisplay</code>.
</p>

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

<pre class="ipsCode" id="ips_uid_5844_7">
<code class="hljs bash"><span class="hljs-built_in"><span class="pln">sudo</span></span><span class="pln"> lvdisplay </span><span class="pun">-</span><span class="pln">m</span></code></pre>

<p>
	المُخرج:
</p>

<pre class="ipsCode" id="ips_uid_5844_7">
<code class="hljs livecodeserver"><span class="pln">  </span><span class="hljs-comment"><span class="pun">---</span><span class="pln"> </span><span class="typ">Logical</span><span class="pln"> volume </span><span class="pun">---</span></span><span class="pln">
  LV </span><span class="typ">Path</span><span class="pln">                </span><span class="pun">/</span><span class="pln">dev</span><span class="pun">/</span><span class="typ">LVMVolGroup</span><span class="pun">/</span><span class="pln">projects
  LV </span><span class="typ">Name</span><span class="pln">                projects
  VG </span><span class="typ">Name</span><span class="pln">                </span><span class="typ">LVMVolGroup</span><span class="pln">
  LV UUID                IN4GZm</span><span class="pun">-</span><span class="pln">ePJU</span><span class="pun">-</span><span class="pln">zAAn</span><span class="pun">-</span><span class="pln">DRO3</span><span class="pun">-</span><span class="hljs-number"><span class="lit">1</span></span><span class="lit">f2w</span><span class="pun">-</span><span class="pln">qSN8</span><span class="pun">-</span><span class="pln">ahisNK
  LV </span><span class="typ">Write</span><span class="pln"> </span><span class="typ">Access</span><span class="pln">        </span><span class="hljs-built_in"><span class="pln">read</span></span><span class="pun">/</span><span class="hljs-built_in"><span class="pln">write</span></span><span class="pln">
  LV </span><span class="typ">Creation</span><span class="pln"> host</span><span class="pun">,</span><span class="pln"> </span><span class="hljs-built_in"><span class="pln">time</span></span><span class="pln"> lvmtest</span><span class="pun">,</span><span class="pln"> </span><span class="hljs-number"><span class="lit">2016</span></span><span class="pun">-</span><span class="hljs-number"><span class="lit">09</span></span><span class="pun">-</span><span class="hljs-number"><span class="lit">09</span></span><span class="pln"> </span><span class="hljs-number"><span class="lit">21</span></span><span class="pun">:</span><span class="hljs-number"><span class="lit">00</span></span><span class="pun">:</span><span class="hljs-number"><span class="lit">03</span></span><span class="pln"> </span><span class="pun">+</span><span class="hljs-number"><span class="lit">0000</span></span><span class="pln">
  LV </span><span class="typ">Status</span><span class="pln">              available
  </span><span class="hljs-comment"><span class="com"># open                 1</span></span><span class="pln">
  LV </span><span class="typ">Size</span><span class="pln">                </span><span class="hljs-number"><span class="lit">10.00</span></span><span class="pln"> </span><span class="typ">GiB</span><span class="pln">
  </span><span class="typ">Current</span><span class="pln"> LE             </span><span class="hljs-number"><span class="lit">2560</span></span><span class="pln">
  </span><span class="typ">Segments</span><span class="pln">               </span><span class="hljs-number"><span class="lit">1</span></span><span class="pln">
  </span><span class="typ">Allocation</span><span class="pln">             inherit
  </span><span class="typ">Read</span><span class="pln"> ahead sectors     </span><span class="kwd">auto</span><span class="pln">
  </span><span class="pun">-</span><span class="pln"> currently </span><span class="hljs-built_in"><span class="kwd">set</span></span><span class="pln"> </span><span class="hljs-built_in"><span class="pln">to</span></span><span class="pln">     </span><span class="hljs-number"><span class="lit">256</span></span><span class="pln">
  </span><span class="typ">Block</span><span class="pln"> device           </span><span class="hljs-number"><span class="lit">252</span></span><span class="pun">:</span><span class="hljs-number"><span class="lit">0</span></span><span class="pln">

  </span><span class="hljs-comment"><span class="pun">---</span><span class="pln"> </span><span class="typ">Segments</span><span class="pln"> </span><span class="pun">---</span></span><span class="pln">
  </span><span class="typ">Logical</span><span class="pln"> </span><span class="hljs-built_in"><span class="pln">extents</span></span><span class="pln"> </span><span class="hljs-number"><span class="lit">0</span></span><span class="pln"> </span><span class="hljs-built_in"><span class="pln">to</span></span><span class="pln"> </span><span class="hljs-number"><span class="lit">2559</span></span><span class="pun">:</span><span class="pln">
    </span><span class="typ">Type</span><span class="pln">        linear
    </span><span class="typ">Physical</span><span class="pln"> volume </span><span class="pun">/</span><span class="pln">dev</span><span class="pun">/</span><span class="pln">sda
    </span><span class="typ">Physical</span><span class="pln"> </span><span class="hljs-built_in"><span class="pln">extents</span></span><span class="pln">    </span><span class="hljs-number"><span class="lit">0</span></span><span class="pln"> </span><span class="hljs-built_in"><span class="pln">to</span></span><span class="pln"> </span><span class="hljs-number"><span class="lit">2559</span></span><span class="pln">


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

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

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

<p>
	ترجمة – بتصرّف - للمقال <a href="https://www.digitalocean.com/community/tutorials/how-to-use-lvm-to-manage-storage-devices-on-ubuntu-16-04" rel="external nofollow">How To Use LVM To Manage Storage Devices on Ubuntu 16.04</a> لكاتبه Justin Ellingwood.
</p>
]]></description><guid isPermaLink="false">334</guid><pubDate>Fri, 04 Aug 2017 13:33:00 +0000</pubDate></item><item><title>&#x645;&#x62F;&#x62E;&#x644; &#x625;&#x644;&#x649; &#x645;&#x62F;&#x64A;&#x631; &#x648;&#x62D;&#x62F;&#x627;&#x62A; &#x627;&#x644;&#x62A;&#x651;&#x62E;&#x632;&#x64A;&#x646; &#x627;&#x644;&#x645;&#x646;&#x637;&#x642;&#x64A;&#x651;&#x629; &#x641;&#x64A; &#x646;&#x638;&#x627;&#x645; &#x644;&#x64A;&#x646;&#x643;&#x633; LVM</title><link>https://academy.hsoub.com/devops/servers/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D9%85%D8%AF%D9%8A%D8%B1-%D9%88%D8%AD%D8%AF%D8%A7%D8%AA-%D8%A7%D9%84%D8%AA%D9%91%D8%AE%D8%B2%D9%8A%D9%86-%D8%A7%D9%84%D9%85%D9%86%D8%B7%D9%82%D9%8A%D9%91%D8%A9-%D9%81%D9%8A-%D9%86%D8%B8%D8%A7%D9%85-%D9%84%D9%8A%D9%86%D9%83%D8%B3-lvm-r333/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2017_07/597c30532d67f_main(2).png.ccd6476198340d1e6069c0f31815e40c.png" /></p>

<h2 id="مدخل-إلى-مدير-وحدات-التخزين-المنطقية-في-نظام-لينكس-lvm">
	تمهيد
</h2>

<p>
	LVM اختصار لعبارة Logical Volume Management، عبارة عن تقنيّة لإدارة أجهزة التّخزين تُمكّن المُستخدمين من توحيد وتجريد التّخطيط الماديّ (الفعلي) لمكونات أجهزة التّخزين، لإدارتها بسهولة ومرونة. يُمكن استعمال النّسخة الحاليّة LVM2 بالاعتماد على إطار العمل الخاصّ بربط الأجهزة Device mapper في نواة لينكس لجمع أجهزة التّخزين المُتوفّرة في مجموعات وتخصيص وحدات منطقيّة Logical units من المساحة المُركّبة حسب الطّلب.
</p>

<p>
	التّجريد، المرونة والتّحكم من الميزات الرّئيسيّة لاستخدام LVM. يُمكن لوحدات التّخزين Volumes أن تحمل أسماء ذات معنى واضح مثل “database” أو “root-backup”. يُمكن إعادة ضبط حجم وحدات التّخزين ديناميكيًّا حسب تغيّر متطلّبات المساحة، يُمكن كذلك تهجيرها بين الأجهزة الماديّة داخل مجمع التخزين Storage pool أو على نظام قيد التّنفيذ. يُوفّر LVM كذلك ميزات مُتقدّمة مثل أخذ اللقطات Snapshotting، الدّمج Striping والمُطابقة Mirroring.<br>
	في هذا الدّرس، سنتحدّث باختصار عن آليّة عمل LVM وبعدها سنستعرض بعضا من الأوامر التي ستحتاج إليها في البداية.
</p>

<h2 id="مبادئ-ومصطلحات-lvm">
	مبادئ ومُصطلحات LVM
</h2>

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

<h3 id="بنيات-مدير-التخزين-في-lvm">
	بنيات مُدير التّخزين في LVM
</h3>

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

<ul>
<li>
		<p>
			<strong>وحدات التّخزين الماديّة Physical Volumes:</strong>
		</p>

		<ul>
<li>
				<strong>السابقة في أداة LVM:</strong> المقطع <code>pv...</code>
			</li>
			<li>
				<strong>الوصف:</strong> الأجهزة الماديّة أو الأجهزة التي تشبه الأقراص (مثلا، أجهزة تخزين أنشِئت باستعمال رابط الأجهزة Device Mapper مثل مصفوفات RAID)، وتعدّ المّادة الأساسيّة التي يستعملها LVM للطبقات العليا من التّجريد. وحدات التّخزين الماديّة عبارة عن أجهزة تخزين عاديّة. يكتب LVM ترويسة Header على الجهاز لتخصيصه ليكون قابلا للإدارة.
			</li>
		</ul>
</li>
	<li>
		<p>
			<strong>مجموعات وحدات التّخزين Volume Groups:</strong>
		</p>

		<ul>
<li>
				<strong>السابقة في أداة LVM:</strong> المقطع <code>vg...</code>
			</li>
			<li>
				<strong>الوصف:</strong> يجمع LVM وحدات التّخزين الماديّة في مساحات تخزينيّة موحّدة تُسمى “مجموعات وحدات التّخزين”. تجرّد مجموعات التّخزين هذه أجهزة التّخزين التّابعة لها من مواصفاتها لتعمل على شكل جهاز تخزين منطقيّ واحد مع جمع المساحات التّخزينيّة الخاصّة بوحدات التّخزين التي تُكوّن المجموعة.
			</li>
		</ul>
</li>
	<li>
		<p>
			<strong>وحدات التّخزين المنطقيّة Logical Volumes:</strong>
		</p>

		<ul>
<li>
				<strong>السابقة في أداة LVM:</strong> المقطع <code>lv...</code> (أدوات LVM العامّة تبدأ عادة بالمقطع <code>lvm...</code>)
			</li>
			<li>
				<strong>الوصف:</strong> يُمكن تقسيم مجموعة تخزين إلى أي عدد من وحدات التّخزين المنطقيّة. وحدات التّخزين المنطقيّة تُعادل وظيفيّا التجزئات Partitions في قرص ماديّ، لكنّها تتمتّع بمرونة أكثر. تعدّ وحدات التّخزين المنطقيّة المكوّن الأساسيّ الذي يتعامل معه المستخدمون والتّطبيقات.
			</li>
		</ul>
</li>
</ul>
<p>
	باختصار، يُمكن استعمال LVM لجمع وحدات التّخزين الماديّة في مجموعات تخزين لتوحيد مساحة التّخزين المتواجدة على نظام ما. بعدها، يُمكن للمدراء تقسيم مجموعة التّخزين إلى وحدات تخزين منطقيّة تعمل على شكل تجزئات مرنة.
</p>

<h3 id="ما-هي-المداءات-extents">
	ما هي المداءات Extents؟
</h3>

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

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

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

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

<p>
	<strong>تنبيه:</strong> تأكّد من أنّ الأجهزة التّي ترغب باستعمالها مع LVM لا تحتوي على أيّة بيانات مُهمّة. استخدام هذه الأجهزة مع LVM سيؤدّي إلى الكتابة فوق المحتويات الحاليّة. إذا كانت لديك بيانات مهمّة على خادومك فأنشئ نسخا احتياطية قبل الاستمرار في تطبيق الدّرس. إن كنت تريد استكشاف آلية العمل بأمان فالأفضل أن تستخدم <a href="https://academy.hsoub.com/tags/virtualbox/#elSearch_main" rel="">آلة افتراضية</a> للتطبيق عليها.
</p>

<h2 id="تحديد-الأجهزة-المادية-physical-devices-لتشكل-وحدات-تخزين-مادية-physical-volumes">
	تحديد الأجهزة الماديّة Physical Devices لتُشكّل وحدات تخزين ماديّة Physical Volumes
</h2>

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

<pre class="ipsCode prettyprint lang-sql prettyprinted" id="ips_uid_4424_7" style="">
<span class="pln">sudo lvmdiskscan</span></pre>

<p>
	المُخرَج سيكون عبارة عن قائمة بجميع الأجهزة التّي يُمكن لـLVM التّعامل معها:
</p>

<pre class="ipsCode prettyprint lang-sql prettyprinted" id="ips_uid_4424_7" style="">
<code class="hljs rsl"><span class="pln">  </span><span class="pun">/</span><span class="pln">dev</span><span class="pun">/</span><span class="pln">ram0  </span><span class="pun">[</span><span class="pln">      </span><span class="hljs-number"><span class="lit">64.00</span></span><span class="pln"> </span><span class="typ">MiB</span><span class="pun">]</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">     </span><span class="hljs-number"><span class="lit">200.00</span></span><span class="pln"> </span><span class="typ">GiB</span><span class="pun">]</span><span class="pln"> 
  </span><span class="pun">/</span><span class="pln">dev</span><span class="pun">/</span><span class="pln">ram1  </span><span class="pun">[</span><span class="pln">      </span><span class="hljs-number"><span class="lit">64.00</span></span><span class="pln"> </span><span class="typ">MiB</span><span class="pun">]</span><span class="pln"> 

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

  </span><span class="pun">/</span><span class="pln">dev</span><span class="pun">/</span><span class="pln">ram15 </span><span class="pun">[</span><span class="pln">      </span><span class="hljs-number"><span class="lit">64.00</span></span><span class="pln"> </span><span class="typ">MiB</span><span class="pun">]</span><span class="pln"> 
  </span><span class="pun">/</span><span class="pln">dev</span><span class="pun">/</span><span class="pln">sdb   </span><span class="pun">[</span><span class="pln">     </span><span class="hljs-number"><span class="lit">100.00</span></span><span class="pln"> </span><span class="typ">GiB</span><span class="pun">]</span><span class="pln"> 
  </span><span class="hljs-number"><span class="lit">2</span></span><span class="pln"> disks
  </span><span class="hljs-number"><span class="lit">17</span></span><span class="pln"> partitions
  </span><span class="hljs-number"><span class="lit">0</span></span><span class="pln"> LVM physical </span><span class="hljs-shader"><span class="hljs-keyword"><span class="pln">volume</span></span><span class="pln"> whole disks
  </span><span class="lit">0</span><span class="pln"> LVM physical volumes</span></span></code></pre>

<p>
	من المُخرج أعلاه، يُمكننا أن نرى بأنّنا نتوفّر على قرصين و17 تجزئة. مُعظم التجزئات عبارة عن <a href="https://en.wikipedia.org/wiki/RAM_drive" rel="external nofollow">قرص ذاكرة عشوائيّة</a> <code>/dev/ram*</code> لزيادة الأداء. الأقراص في هذا المثال هي <code>/dev/sda</code> الذي يحتوي على 200G من المساحة، و <code>/dev/sdb</code> ذي المساحة 100G.
</p>

<p>
	بعد تحديد الأجهزة الماديّة التي نريد استخدامها، يُمكننا الآن تخصيصها لتكون وحدات تخزين ماديّة داخل LVM باستخدام الأمر <code>pvcreate</code>:
</p>

<pre class="ipsCode prettyprint lang-sql prettyprinted" id="ips_uid_4424_7" style="">
<code class="hljs bash"><span class="hljs-built_in"><span class="pln">sudo</span></span><span class="pln"> pvcreate </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">sdb</span></code></pre>

<p>
	المُخرَج:
</p>

<pre class="ipsCode prettyprint lang-sql prettyprinted" id="ips_uid_4424_7" style="">
<code class="hljs bash"><span class="typ">Physical</span><span class="pln"> volume </span><span class="hljs-string"><span class="str">"/dev/sda"</span></span><span class="pln"> successfully created
</span><span class="typ">Physical</span><span class="pln"> volume </span><span class="hljs-string"><span class="str">"/dev/sdb"</span></span><span class="pln"> successfully created</span></code></pre>

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

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

<pre class="ipsCode prettyprint lang-sql prettyprinted" id="ips_uid_4424_7" style="">
<code class="hljs bash"><span class="hljs-built_in"><span class="pln">sudo</span></span><span class="pln"> pvs</span></code></pre>

<p>
	المُخرج:
</p>

<pre class="ipsCode prettyprint lang-sql prettyprinted" id="ips_uid_4424_7" style="">
<code class="hljs brainfuck"><span class="hljs-comment"><span class="pln">PV</span></span><span class="pln">         </span><span class="hljs-comment"><span class="pln">VG</span></span><span class="pln">   </span><span class="hljs-comment"><span class="typ">Fmt</span></span><span class="pln">  </span><span class="hljs-comment"><span class="typ">Attr</span></span><span class="pln"> </span><span class="hljs-comment"><span class="typ">PSize</span></span><span class="pln">   </span><span class="hljs-comment"><span class="typ">PFree</span></span><span class="pln">  
</span><span class="hljs-comment"><span class="pun">/</span><span class="pln">dev</span><span class="pun">/</span><span class="pln">sda</span></span><span class="pln">        </span><span class="hljs-comment"><span class="pln">lvm2</span></span><span class="pln"> </span><span class="hljs-literal"><span class="pun">-</span></span><span class="hljs-literal"><span class="pun">-</span></span><span class="hljs-literal"><span class="pun">-</span></span><span class="pln">  </span><span class="hljs-comment"><span class="lit">200</span></span><span class="hljs-string"><span class="lit">.</span></span><span class="hljs-comment"><span class="lit">00g</span></span><span class="pln"> </span><span class="hljs-comment"><span class="lit">200</span></span><span class="hljs-string"><span class="lit">.</span></span><span class="hljs-comment"><span class="lit">00g</span></span><span class="pln">
</span><span class="hljs-comment"><span class="pun">/</span><span class="pln">dev</span><span class="pun">/</span><span class="pln">sdb</span></span><span class="pln">        </span><span class="hljs-comment"><span class="pln">lvm2</span></span><span class="pln"> </span><span class="hljs-literal"><span class="pun">-</span></span><span class="hljs-literal"><span class="pun">-</span></span><span class="hljs-literal"><span class="pun">-</span></span><span class="pln">  </span><span class="hljs-comment"><span class="lit">100</span></span><span class="hljs-string"><span class="lit">.</span></span><span class="hljs-comment"><span class="lit">00g</span></span><span class="pln"> </span><span class="hljs-comment"><span class="lit">100</span></span><span class="hljs-string"><span class="lit">.</span></span><span class="hljs-comment"><span class="lit">00g</span></span></code></pre>

<p>
	كما ترى، كلا الجهازان مُتواجدان تحت عمود<code>PV</code> (اختصار لـPhysical Volume).
</p>

<h1 id="إضافة-وحدات-التخزين-المادية-إلى-مجموعة-تخزين">
	إضافة وحدات التّخزين الماديّة إلى مجموعة تخزين
</h1>

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

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

<pre class="ipsCode prettyprint lang-sql prettyprinted" id="ips_uid_4424_7" style="">
<code class="hljs bash"><span class="hljs-built_in"><span class="pln">sudo</span></span><span class="pln"> vgcreate </span><span class="typ">LVMVolGroup</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">sdb</span></code></pre>

<p>
	المُخرج:
</p>

<pre class="ipsCode prettyprint lang-sql prettyprinted" id="ips_uid_4424_7" style="">
<code class="hljs cs"><span class="typ">Volume</span><span class="pln"> </span><span class="hljs-keyword"><span class="kwd">group</span></span><span class="pln"> </span><span class="hljs-string"><span class="str">"LVMVolGroup"</span></span><span class="pln"> successfully created</span></code></pre>

<p>
	إن اطّلعنا على مُخرج الأمر <code>pvs</code> مُجدّدا، يُمكننا أن نرى بأنّ وحدتي التّخزين الماديّتين أصبحتا مرتبطتين بمجموعة التّخزين الجديدة:
</p>

<pre class="ipsCode prettyprint lang-sql prettyprinted" id="ips_uid_4424_7" style="">
<code class="hljs bash"><span class="hljs-built_in"><span class="pln">sudo</span></span><span class="pln"> pvs</span></code></pre>

<p>
	المُخرَج:
</p>

<pre class="ipsCode prettyprint lang-sql prettyprinted" id="ips_uid_4424_7" style="">
<code class="hljs livecodeserver"><span class="pln">PV         VG          </span><span class="typ">Fmt</span><span class="pln">  </span><span class="typ">Attr</span><span class="pln"> </span><span class="typ">PSize</span><span class="pln">   </span><span class="typ">PFree</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="typ">LVMVolGroup</span><span class="pln"> lvm2 </span><span class="hljs-operator"><span class="pln">a</span></span><span class="hljs-comment"><span class="pun">--</span><span class="pln">  </span><span class="lit">200.00g</span><span class="pln"> </span><span class="lit">200.00g</span></span><span class="pln">
</span><span class="pun">/</span><span class="pln">dev</span><span class="pun">/</span><span class="pln">sdb   </span><span class="typ">LVMVolGroup</span><span class="pln"> lvm2 </span><span class="hljs-operator"><span class="pln">a</span></span><span class="hljs-comment"><span class="pun">--</span><span class="pln">  </span><span class="lit">100.00g</span><span class="pln"> </span><span class="lit">100.00g</span></span></code></pre>

<p>
	يُمكننا الحصول على خلاصة موجزة لمجموعة التّخزين عبر الأمر التّالي:
</p>

<pre class="ipsCode prettyprint lang-sql prettyprinted" id="ips_uid_4424_7" style="">
<code class="hljs bash"><span class="hljs-built_in"><span class="pln">sudo</span></span><span class="pln"> vgs</span></code></pre>

<p>
	المُخرَج:
</p>

<pre class="ipsCode prettyprint lang-sql prettyprinted" id="ips_uid_4424_7" style="">
<code class="hljs ruleslanguage"><span class="pln">VG          </span><span class="hljs-array"><span class="com">#PV </span></span><span class="hljs-array"><span class="com">#LV </span></span><span class="hljs-array"><span class="com">#SN Attr   VSize   VFree  </span></span><span class="pln">
</span><span class="typ">LVMVolGroup</span><span class="pln">   </span><span class="hljs-number"><span class="lit">2</span></span><span class="pln">   </span><span class="hljs-number"><span class="lit">0</span></span><span class="pln">   </span><span class="hljs-number"><span class="lit">0</span></span><span class="pln"> wz</span><span class="pun">--</span><span class="pln">n</span><span class="pun">-</span><span class="pln"> </span><span class="hljs-number"><span class="lit">299.99</span></span><span class="lit">g</span><span class="pln"> </span><span class="hljs-number"><span class="lit">299.99</span></span><span class="lit">g</span></code></pre>

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

<h2 id="إنشاء-وحدات-تخزين-منطقية-من-مجموعة-التخزين-الموحدة">
	إنشاء وحدات تخزين منطقيّة من مجموعة التّخزين المُوحّدة
</h2>

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

<p>
	سننشئ أربعة وحدات تخزين منطقيّة من مجموعة التّخزين الخاصّة بنا:
</p>

<ul>
<li>
		وحدة تخزين باسم <code>projects</code> بمساحة 10G،
	</li>
	<li>
		وحدة تخزين <code>www</code> بمساحة 5G لمحتوى الوِب،
	</li>
	<li>
		وحدة تخزين <code>db</code> بمساحة 20G لقاعدة البيانات،
	</li>
	<li>
		وحدة تخزين <code>workspace</code> للاستفادة من باقي المساحة.
	</li>
</ul>
<p>
	لإنشاء وحدات تخزين منطقيّة، نستعمل الأمر <code>lvcreate</code>. سيتوجّب علينا تمرير اسم مجموعة التّخزين، ويُمكننا تسميّة وحدة التّخزين المنطقيّة باستخدام الخيار <code>n-</code>. ولتحديد حجم المساحة مُباشرة، يُمكنك استخدام الخيار <code>L-</code>. إن أردت تحديد الحجم حسب عدد النّطاقات، يُمكنك استعمال الخيار <code>l-</code>.
</p>

<p>
	يُمكننا إنشاء أول ثلاثة وحدات تخزين منطقيّة باستخدام الخيار <code>L-</code> كالتّالي:
</p>

<pre class="ipsCode prettyprint lang-sql prettyprinted" id="ips_uid_4424_7" style="">
<code class="hljs lasso"><span class="pln">sudo lvcreate </span><span class="hljs-attribute"><span class="pun">-</span><span class="pln">L</span></span><span class="pln"> </span><span class="hljs-number"><span class="lit">10</span></span><span class="lit">G</span><span class="pln"> </span><span class="hljs-attribute"><span class="pun">-</span><span class="pln">n</span></span><span class="pln"> projects </span><span class="typ">LVMVolGroup</span><span class="pln">
sudo lvcreate </span><span class="hljs-attribute"><span class="pun">-</span><span class="pln">L</span></span><span class="pln"> </span><span class="hljs-number"><span class="lit">5</span></span><span class="lit">G</span><span class="pln"> </span><span class="hljs-attribute"><span class="pun">-</span><span class="pln">n</span></span><span class="pln"> www </span><span class="typ">LVMVolGroup</span><span class="pln">
sudo lvcreate </span><span class="hljs-attribute"><span class="pun">-</span><span class="pln">L</span></span><span class="pln"> </span><span class="hljs-number"><span class="lit">20</span></span><span class="lit">G</span><span class="pln"> </span><span class="hljs-attribute"><span class="pun">-</span><span class="pln">n</span></span><span class="pln"> db </span><span class="typ">LVMVolGroup</span></code></pre>

<p>
	المُخرَج:
</p>

<pre class="ipsCode prettyprint lang-sql prettyprinted" id="ips_uid_4424_7" style="">
<code class="hljs bash"><span class="typ">Logical</span><span class="pln"> volume </span><span class="hljs-string"><span class="str">"projects"</span></span><span class="pln"> created</span><span class="pun">.</span><span class="pln">
</span><span class="typ">Logical</span><span class="pln"> volume </span><span class="hljs-string"><span class="str">"www"</span></span><span class="pln"> created</span><span class="pun">.</span><span class="pln">
</span><span class="typ">Logical</span><span class="pln"> volume </span><span class="hljs-string"><span class="str">"db"</span></span><span class="pln"> created</span><span class="pun">.</span></code></pre>

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

<pre class="ipsCode prettyprint lang-sql prettyprinted" id="ips_uid_4424_7" style="">
<code class="hljs bash"><span class="hljs-built_in"><span class="pln">sudo</span></span><span class="pln"> vgs </span><span class="pun">-</span><span class="pln">o </span><span class="pun">+</span><span class="pln">lv_size</span><span class="pun">,</span><span class="pln">lv_name</span></code></pre>

<p>
	المُخرج:
</p>

<pre class="ipsCode prettyprint lang-sql prettyprinted" id="ips_uid_4424_7" style="">
<code class="hljs livecodeserver"><span class="pln">  VG          </span><span class="hljs-comment"><span class="com">#PV #LV #SN Attr   VSize   VFree   LSize  LV      </span></span><span class="pln">
  </span><span class="typ">LVMVolGroup</span><span class="pln">   </span><span class="hljs-number"><span class="lit">2</span></span><span class="pln">   </span><span class="hljs-number"><span class="lit">3</span></span><span class="pln">   </span><span class="hljs-number"><span class="lit">0</span></span><span class="pln"> wz</span><span class="hljs-comment"><span class="pun">--</span><span class="pln">n</span><span class="pun">-</span><span class="pln"> </span><span class="lit">299.99g</span><span class="pln"> </span><span class="lit">264.99g</span><span class="pln"> </span><span class="lit">10.00g</span><span class="pln"> projects</span></span><span class="pln">
  </span><span class="typ">LVMVolGroup</span><span class="pln">   </span><span class="hljs-number"><span class="lit">2</span></span><span class="pln">   </span><span class="hljs-number"><span class="lit">3</span></span><span class="pln">   </span><span class="hljs-number"><span class="lit">0</span></span><span class="pln"> wz</span><span class="hljs-comment"><span class="pun">--</span><span class="pln">n</span><span class="pun">-</span><span class="pln"> </span><span class="lit">299.99g</span><span class="pln"> </span><span class="lit">264.99g</span><span class="pln">  </span><span class="lit">5.00g</span><span class="pln"> www     </span></span><span class="pln">
  </span><span class="typ">LVMVolGroup</span><span class="pln">   </span><span class="hljs-number"><span class="lit">2</span></span><span class="pln">   </span><span class="hljs-number"><span class="lit">3</span></span><span class="pln">   </span><span class="hljs-number"><span class="lit">0</span></span><span class="pln"> wz</span><span class="hljs-comment"><span class="pun">--</span><span class="pln">n</span><span class="pun">-</span><span class="pln"> </span><span class="lit">299.99g</span><span class="pln"> </span><span class="lit">264.99g</span><span class="pln"> </span><span class="lit">20.00g</span><span class="pln"> db</span></span></code></pre>

<p>
	أضفنا آخر عمودين لنرى الحجم المُخصّص لكلّ وحدة تخزين منطقيّة.
</p>

<p>
	الآن، يُمكننا إسناد بقيّة المساحة في مجموعة التّخزين إلى وحدة التّخزين <code>workspace</code> باستعمال الخيار <code>-l</code>، التي تعمل حسب مبدأ المداءات. يُمكننا أيضا توفير نسبة مئويّة ووحدة قياس لإيصال الفكرة على نحو أوضح. في حالتنا، نريد أن نُخصّص باقي المساحة الفارغة، لذا سنُمرّر القيمة <code>100%FREE</code>:
</p>

<pre class="ipsCode prettyprint lang-sql prettyprinted" id="ips_uid_4424_7" style="">
<code class="hljs bash"><span class="hljs-built_in"><span class="pln">sudo</span></span><span class="pln"> lvcreate </span><span class="hljs-operator"><span class="pun">-</span><span class="pln">l</span></span><span class="pln"> </span><span class="hljs-number"><span class="lit">100</span></span><span class="pun">%</span><span class="pln">FREE </span><span class="pun">-</span><span class="pln">n workspace </span><span class="typ">LVMVolGroup</span></code></pre>

<p>
	المُخرج:
</p>

<pre class="ipsCode prettyprint lang-sql prettyprinted" id="ips_uid_4424_7" style="">
<code class="hljs bash"><span class="pln">  </span><span class="typ">Logical</span><span class="pln"> volume </span><span class="hljs-string"><span class="str">"workspace"</span></span><span class="pln"> created</span><span class="pun">.</span></code></pre>

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

<pre class="ipsCode prettyprint lang-sql prettyprinted" id="ips_uid_4424_7" style="">
<code class="hljs bash"><span class="hljs-built_in"><span class="pln">sudo</span></span><span class="pln"> vgs </span><span class="pun">-</span><span class="pln">o </span><span class="pun">+</span><span class="pln">lv_size</span><span class="pun">,</span><span class="pln">lv_name</span></code></pre>

<p>
	المُخرَج:
</p>

<pre class="ipsCode prettyprint lang-sql prettyprinted" id="ips_uid_4424_7" style="">
<code class="hljs livecodeserver"><span class="pln">  VG          </span><span class="hljs-comment"><span class="com">#PV #LV #SN Attr   VSize   VFree LSize   LV       </span></span><span class="pln">
  </span><span class="typ">LVMVolGroup</span><span class="pln">   </span><span class="hljs-number"><span class="lit">2</span></span><span class="pln">   </span><span class="hljs-number"><span class="lit">4</span></span><span class="pln">   </span><span class="hljs-number"><span class="lit">0</span></span><span class="pln"> wz</span><span class="hljs-comment"><span class="pun">--</span><span class="pln">n</span><span class="pun">-</span><span class="pln"> </span><span class="lit">299.99g</span><span class="pln">    </span><span class="lit">0</span><span class="pln">   </span><span class="lit">10.00g</span><span class="pln"> projects </span></span><span class="pln">
  </span><span class="typ">LVMVolGroup</span><span class="pln">   </span><span class="hljs-number"><span class="lit">2</span></span><span class="pln">   </span><span class="hljs-number"><span class="lit">4</span></span><span class="pln">   </span><span class="hljs-number"><span class="lit">0</span></span><span class="pln"> wz</span><span class="hljs-comment"><span class="pun">--</span><span class="pln">n</span><span class="pun">-</span><span class="pln"> </span><span class="lit">299.99g</span><span class="pln">    </span><span class="lit">0</span><span class="pln">    </span><span class="lit">5.00g</span><span class="pln"> www      </span></span><span class="pln">
  </span><span class="typ">LVMVolGroup</span><span class="pln">   </span><span class="hljs-number"><span class="lit">2</span></span><span class="pln">   </span><span class="hljs-number"><span class="lit">4</span></span><span class="pln">   </span><span class="hljs-number"><span class="lit">0</span></span><span class="pln"> wz</span><span class="hljs-comment"><span class="pun">--</span><span class="pln">n</span><span class="pun">-</span><span class="pln"> </span><span class="lit">299.99g</span><span class="pln">    </span><span class="lit">0</span><span class="pln">   </span><span class="lit">20.00g</span><span class="pln"> db       </span></span><span class="pln">
  </span><span class="typ">LVMVolGroup</span><span class="pln">   </span><span class="hljs-number"><span class="lit">2</span></span><span class="pln">   </span><span class="hljs-number"><span class="lit">4</span></span><span class="pln">   </span><span class="hljs-number"><span class="lit">0</span></span><span class="pln"> wz</span><span class="hljs-comment"><span class="pun">--</span><span class="pln">n</span><span class="pun">-</span><span class="pln"> </span><span class="lit">299.99g</span><span class="pln">    </span><span class="lit">0</span><span class="pln">  </span><span class="lit">264.99g</span><span class="pln"> workspace</span></span></code></pre>

<p>
	كما ترى، فقد أُنشِئت وحدة التّخزين <code>workspace</code> ومجموعة التّخزين <code>LVMVolGroup</code> وقد خُصِّصتا بالكامل.
</p>

<h2 id="تهيئة-وتركيب-وحدات-التخزين-المنطقية">
	تهيئة وتركيب وحدات التّخزين المنطقيّة
</h2>

<p>
	أصبحت لدينا الآن وحدات تخزين منطقيّة جاهزة للاستعمال، يُمكننا استخدامها كما تُستَخدَم أجهزة التخزين العاديّة.
</p>

<p>
	الأجهزة المنطقيّة متواجدة داخل المُجلّد <code>/dev/</code> كأي جهاز تخزين آخر. يُمكنك الوصول إليها بطريقتين:
</p>

<pre class="ipsCode prettyprint lang-sql prettyprinted" id="ips_uid_4424_7" style="">
<code class="hljs lasso"><span class="str">/dev/</span><span class="pln">volume_group_name</span><span class="pun">/</span><span class="pln">logical_volume_name
</span><span class="pun">/</span><span class="pln">dev</span><span class="pun">/</span><span class="pln">mapper</span><span class="pun">/</span><span class="pln">volume_group_name</span><span class="hljs-attribute"><span class="pun">-</span><span class="pln">logical_volume_name</span></span></code></pre>

<p>
	مع تغيير قيمة <code>volume_group_name</code> باسم مجموعة التّخزين، وتغيير قيمة <code>logical_volume_name</code> باسم وحدة التّخزين المنطقيّة.
</p>

<p>
	لذا لتهيئة وحدات التّخزين المنطقيّة الخاصّة بنا باستخدام نظام الملفّات Ext4، يُمكن أن نكتب ما يلي:
</p>

<pre class="ipsCode prettyprint lang-sql prettyprinted" id="ips_uid_4424_7" style="">
<code class="hljs bash"><span class="hljs-built_in"><span class="pln">sudo</span></span><span class="pln"> mkfs</span><span class="pun">.</span><span class="pln">ext4 </span><span class="pun">/</span><span class="pln">dev</span><span class="pun">/</span><span class="typ">LVMVolGroup</span><span class="pun">/</span><span class="pln">projects
</span><span class="hljs-built_in"><span class="pln">sudo</span></span><span class="pln"> mkfs</span><span class="pun">.</span><span class="pln">ext4 </span><span class="pun">/</span><span class="pln">dev</span><span class="pun">/</span><span class="typ">LVMVolGroup</span><span class="pun">/</span><span class="pln">www
</span><span class="hljs-built_in"><span class="pln">sudo</span></span><span class="pln"> mkfs</span><span class="pun">.</span><span class="pln">ext4 </span><span class="pun">/</span><span class="pln">dev</span><span class="pun">/</span><span class="typ">LVMVolGroup</span><span class="pun">/</span><span class="pln">db
</span><span class="hljs-built_in"><span class="pln">sudo</span></span><span class="pln"> mkfs</span><span class="pun">.</span><span class="pln">ext4 </span><span class="pun">/</span><span class="pln">dev</span><span class="pun">/</span><span class="typ">LVMVolGroup</span><span class="pun">/</span><span class="pln">workspace</span></code></pre>

<p>
	أو كما يلي:
</p>

<pre class="ipsCode prettyprint lang-sql prettyprinted" id="ips_uid_4424_7" style="">
<code class="hljs bash"><span class="hljs-built_in"><span class="pln">sudo</span></span><span class="pln"> mkfs</span><span class="pun">.</span><span class="pln">ext4 </span><span class="pun">/</span><span class="pln">dev</span><span class="pun">/</span><span class="pln">mapper</span><span class="pun">/</span><span class="typ">LVMVolGroup</span><span class="pun">-</span><span class="pln">projects
</span><span class="hljs-built_in"><span class="pln">sudo</span></span><span class="pln"> mkfs</span><span class="pun">.</span><span class="pln">ext4 </span><span class="pun">/</span><span class="pln">dev</span><span class="pun">/</span><span class="pln">mapper</span><span class="pun">/</span><span class="typ">LVMVolGroup</span><span class="pun">-</span><span class="pln">www
</span><span class="hljs-built_in"><span class="pln">sudo</span></span><span class="pln"> mkfs</span><span class="pun">.</span><span class="pln">ext4 </span><span class="pun">/</span><span class="pln">dev</span><span class="pun">/</span><span class="pln">mapper</span><span class="pun">/</span><span class="typ">LVMVolGroup</span><span class="pun">-</span><span class="pln">db
</span><span class="hljs-built_in"><span class="pln">sudo</span></span><span class="pln"> mkfs</span><span class="pun">.</span><span class="pln">ext4 </span><span class="pun">/</span><span class="pln">dev</span><span class="pun">/</span><span class="pln">mapper</span><span class="pun">/</span><span class="typ">LVMVolGroup</span><span class="pun">-</span><span class="pln">workspace</span></code></pre>

<p>
	بعد التّهيئة، يُمكننا إنشاء نقاط تركيب Mount points كما يلي:
</p>

<pre class="ipsCode prettyprint lang-sql prettyprinted" id="ips_uid_4424_7" style="">
<code class="hljs bash"><span class="hljs-built_in"><span class="pln">sudo</span></span><span class="pln"> mkdir </span><span class="pun">-</span><span class="pln">p </span><span class="pun">/</span><span class="pln">mnt</span><span class="pun">/{</span><span class="pln">projects</span><span class="pun">,</span><span class="pln">www</span><span class="pun">,</span><span class="pln">db</span><span class="pun">,</span><span class="pln">workspace</span><span class="pun">}</span></code></pre>

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

<pre class="ipsCode prettyprint lang-sql prettyprinted" id="ips_uid_4424_7" style="">
<code class="hljs bash"><span class="hljs-built_in"><span class="pln">sudo</span></span><span class="pln"> mount </span><span class="pun">/</span><span class="pln">dev</span><span class="pun">/</span><span class="typ">LVMVolGroup</span><span class="pun">/</span><span class="pln">projects </span><span class="pun">/</span><span class="pln">mnt</span><span class="pun">/</span><span class="pln">projects
</span><span class="hljs-built_in"><span class="pln">sudo</span></span><span class="pln"> mount </span><span class="pun">/</span><span class="pln">dev</span><span class="pun">/</span><span class="typ">LVMVolGroup</span><span class="pun">/</span><span class="pln">www </span><span class="pun">/</span><span class="pln">mnt</span><span class="pun">/</span><span class="pln">www
</span><span class="hljs-built_in"><span class="pln">sudo</span></span><span class="pln"> mount </span><span class="pun">/</span><span class="pln">dev</span><span class="pun">/</span><span class="typ">LVMVolGroup</span><span class="pun">/</span><span class="pln">db </span><span class="pun">/</span><span class="pln">mnt</span><span class="pun">/</span><span class="pln">db
</span><span class="hljs-built_in"><span class="pln">sudo</span></span><span class="pln"> mount </span><span class="pun">/</span><span class="pln">dev</span><span class="pun">/</span><span class="typ">LVMVolGroup</span><span class="pun">/</span><span class="pln">workspace </span><span class="pun">/</span><span class="pln">mnt</span><span class="pun">/</span><span class="pln">workspace</span></code></pre>

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

<pre class="ipsCode prettyprint lang-sql prettyprinted" id="ips_uid_4424_7" style="">
<code class="hljs bash"><span class="hljs-built_in"><span class="pln">sudo</span></span><span class="pln"> nano </span><span class="pun">/</span><span class="pln">etc</span><span class="pun">/</span><span class="pln">fstab</span></code></pre>

<p>
	نضيف ما يلي إلى نهاية الملفّ:
</p>

<pre class="ipsCode prettyprint lang-sql prettyprinted" id="ips_uid_4424_7" style="">
<code class="hljs mel"><span class="str">/dev/</span><span class="typ">LVMVolGroup</span><span class="pun">/</span><span class="pln">projects </span><span class="pun">/</span><span class="pln">mnt</span><span class="pun">/</span><span class="pln">projects ext4 defaults</span><span class="pun">,</span><span class="pln">nofail </span><span class="hljs-number"><span class="lit">0</span></span><span class="pln"> </span><span class="hljs-number"><span class="lit">0</span></span><span class="pln">
</span><span class="pun">/</span><span class="pln">dev</span><span class="pun">/</span><span class="typ">LVMVolGroup</span><span class="pun">/</span><span class="pln">www </span><span class="pun">/</span><span class="pln">mnt</span><span class="pun">/</span><span class="pln">www ext4 defaults</span><span class="pun">,</span><span class="pln">nofail </span><span class="hljs-number"><span class="lit">0</span></span><span class="pln"> </span><span class="hljs-number"><span class="lit">0</span></span><span class="pln">
</span><span class="pun">/</span><span class="pln">dev</span><span class="pun">/</span><span class="typ">LVMVolGroup</span><span class="pun">/</span><span class="pln">db </span><span class="pun">/</span><span class="pln">mnt</span><span class="pun">/</span><span class="pln">db ext4 defaults</span><span class="pun">,</span><span class="pln">nofail </span><span class="hljs-number"><span class="lit">0</span></span><span class="pln"> </span><span class="hljs-number"><span class="lit">0</span></span><span class="pln">
</span><span class="pun">/</span><span class="pln">dev</span><span class="pun">/</span><span class="typ">LVMVolGroup</span><span class="pun">/</span><span class="hljs-keyword"><span class="pln">workspace</span></span><span class="pln"> </span><span class="pun">/</span><span class="pln">mnt</span><span class="pun">/</span><span class="hljs-keyword"><span class="pln">workspace</span></span><span class="pln"> ext4 defaults</span><span class="pun">,</span><span class="pln">nofail </span><span class="hljs-number"><span class="lit">0</span></span><span class="pln"> </span><span class="hljs-number"><span class="lit">0</span></span></code></pre>

<p>
	يجب على نظام التّشغيل الآن أن يركّب وحدات التّخزين المنطقيّة الخاصّة بـLVM آليًّا عند التشغيل.
</p>

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

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

<p>
	هذا الدّرس مجرّد مُقدّمة وجيزة لما يُمكن لـLVM توفيره لمُدراء أنظمة Linux. للاستزادة حول كيفيّة العمل مع LVM، ألق نظرة على درس كيفيّة استخدام LVM مع Ubuntu 16.04.
</p>

<p>
	ترجمة - بتصرّف - للمقال <a href="https://www.digitalocean.com/community/tutorials/an-introduction-to-lvm-concepts-terminology-and-operations" rel="external nofollow">An Introduction to LVM Concepts, Terminology, and Operations</a> لكاتبه Justin Ellingwood.
</p>
]]></description><guid isPermaLink="false">333</guid><pubDate>Mon, 31 Jul 2017 14:07:00 +0000</pubDate></item><item><title>&#x645;&#x627; &#x627;&#x644;&#x645;&#x642;&#x635;&#x648;&#x62F; &#x628;&#x62A;&#x648;&#x632;&#x64A;&#x639; &#x627;&#x644;&#x62D;&#x650;&#x645;&#x644; Load balancing</title><link>https://academy.hsoub.com/devops/servers/%D9%85%D8%A7-%D8%A7%D9%84%D9%85%D9%82%D8%B5%D9%88%D8%AF-%D8%A8%D8%AA%D9%88%D8%B2%D9%8A%D8%B9-%D8%A7%D9%84%D8%AD%D9%90%D9%85%D9%84-load-balancing-r319/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2020_06/5eeaf54457611_----Load-balancing.jpg.191836d0a400c4770a1033af99562059.jpg" /></p>

<h2 id="مقدمة">
	مقدمة
</h2>

<p>
	يعدّ توزيع الحِمل Load balancing مكوِّنا أساسيًّا في البنى التحتية <a href="https://academy.hsoub.com/devops/cloud-computing/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D9%85%D9%81%D9%87%D9%88%D9%85-%D8%A7%D9%84%D9%88%D9%81%D8%B1%D8%A9-%D8%A7%D9%84%D8%B9%D8%A7%D9%84%D9%8A%D8%A9-high-availability-r270/" rel="">عالية التوفر</a> Highly-available، إذ يكثر استخدامه لتحسين الأداء والثبات في مختلف الخدمات على الشبكة؛ بما في ذلك مواقع الوِب، التطبيقات، قواعد البيانات وغيرها. يقوم مبدأ توزيع الحِمل على الاعتماد على أكثر من خادوم وتوزيع العمل المطلوب إنجازه بينها.
</p>

<p>
	يوضّح المخطّط التالي بنية تحتية لموقع وِب بدون توزيع حِمل.
</p>

<p style="text-align: center;">
	<img alt="01_web_server.png" class="ipsImage ipsImage_thumbnailed" data-fileid="23480" data-unique="1s9jgxet7" src="https://academy.hsoub.com/uploads/monthly_2017_06/01_web_server.png.5fd41a226e6b39d8b1cceb0aee6e4009.png"></p>

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

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

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="23481" href="https://academy.hsoub.com/uploads/monthly_2017_06/02_top_to_bottom_balancers.png.1b5ea9aaa45f89e272ac566f95abb556.png" rel=""><img alt="02_top_to_bottom_balancers.png" class="ipsImage ipsImage_thumbnailed" data-fileid="23481" data-unique="tnkpfb0s8" src="https://academy.hsoub.com/uploads/monthly_2017_06/02_top_to_bottom_balancers.thumb.png.4d7123866ca33f787d280ca66471ce23.png"></a>
</p>

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

<h2 id="ما-نوع-حركة-البيانات-التي-يمكن-لموزع-الحمل-التعامل-معها">
	ما نوع حركة البيانات التي يمكن لموزع الحمل التعامل معها؟
</h2>

<p>
	يستخدم مديرو الأنظمة موزّعات الحمل لإنشاء قواعد توجيه تتعامل أساسا مع أنواع البيانات الأربعة التالية:
</p>

<ul>
<li>
		HTTP: تُوجَّه حركة البيانات في هذه الحالة اعتمادًا على الآليات المعيارية لميثاق HTTP. يعيّن موزّع الحِمل قيم الترويسات <code>X-Forwarded-For</code>، <code>X-Forwarded-Proto</code> و<code>X-Forwarded-Port</code> من أجل تمرير المعلومات الأصلية عن الطلب، أي تلك القادمة من الزائر، إلى الخادوم الذي سيردّ على الطلب .
	</li>
	<li>
		HTTPS: يشبه هذا النوع النوعَ السابق، مع فرق أنه يستخدم <a href="https://academy.hsoub.com/programming/general/%D9%85%D8%A7%D9%84%D9%81%D8%B1%D9%82-%D8%A8%D9%8A%D9%86-%D8%A7%D9%84%D8%AA%D8%B1%D9%85%D9%8A%D8%B2-encoding%D8%8C-%D8%A7%D9%84%D8%AA%D8%B9%D9%85%D9%8A%D8%A9-encryption%D8%8C-%D8%A7%D9%84%D8%AA%D8%AC%D8%B2%D8%A6%D8%A9-hashing-%D9%88%D8%A7%D9%84%D8%AA%D8%B4%D9%88%D9%8A%D8%B4-obfuscation%D8%9F-r308/#%D8%A7%D9%84%D8%AA%D8%B9%D9%85%D9%8A%D8%A9" rel="">التعميّة</a> Encryption. تُعالَج البيانات المعمّاة بإحدى طريقتيْن: تمرير <abbr title="Secure Socket Layer | طبقة المنافذ الآمنة">SSL</abbr> +(أو <abbr title="Secure Socket Layer | طبقة المنافذ الآمنة">SSL</abbr> Passthrough)وتعتمد هذه الطريقة على الاحتفاظ بالتعميّة إلى أن تصل البيانات للخادوم الذي سيجيب على الطلب؛ أما الثانيّة فتُدعى إنهاء <abbr title="Secure Socket Layer | طبقة المنافذ الآمنة">SSL</abbr> (أو <abbr title="Secure Socket Layer | طبقة المنافذ الآمنة">SSL</abbr> Termination) ويوضَع عبء التعميّة وفكّها على موزّع الحمل، غير أن البيانات بين موزّع الحمل وخادوم الوِب تُنقَل دون تعميّة، عكس الطريقة الأولى.
	</li>
	<li>
		TCP: يمكن استخدام ميثاق TCP لتوزيع حركة البيانات بين تطبيقات لا تستخدم HTTP أو HTTPS؛ مثلا بين عنقود Cluster من خواديم قواعد البيانات.
	</li>
	<li>
		UDP: تدعم بعض موزعات الحمل الحديثة توجيه البيانات الخاصّة بمواثيق الإنترنت التي تستخدم حزم UDP مثل <a href="https://academy.hsoub.com/devops/servers/%D9%85%D9%82%D8%AF%D9%91%D9%85%D8%A9-%D8%A5%D9%84%D9%89-%D9%85%D9%8F%D8%B5%D8%B7%D9%8E%D9%84%D8%AD%D8%A7%D8%AA-%D9%88%D8%B9%D9%86%D8%A7%D8%B5%D8%B1-%D9%88%D9%85%D9%81%D8%A7%D9%87%D9%8A%D9%85-%D9%86%D8%B8%D8%A7%D9%85-%D8%A3%D8%B3%D9%85%D8%A7%D8%A1-%D8%A7%D9%84%D9%86%D8%B7%D8%A7%D9%82%D8%A7%D8%AA-r5/" rel="">نظام أسماء النطاقات</a> DNS و<code>syslogd</code>.
	</li>
</ul>
<p>
	تعرّف قواعدُ التوجيه الميثاقَ والمنفَذ Port على موزّع الحمل وتربطهما بميثاق ومنفَذ موجودين على الخادوم الذي يختاره موزّع الحِمل للإجابة على طلب الزائر.
</p>

<h2 id="كيف-يختار-موزع-الحمل-خادوما-في-السند-الخلفي">
	كيف يختار موزّع الحمل خادوما في السند الخلفي؟
</h2>

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

<h3 id="التحقق-من-قدرة-الخادوم">
	التحقق من قدرة الخادوم
</h3>

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

<h3 id="خوارزميات-توزيع-الحمل">
	خوارزميّات توزيع الحِمل
</h3>

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

<ul>
<li>
		الاختيار الدوري Round robin: تُختار الخواديم في هذه الخوارزميّة بالتتالي. يوجّه موزع الحمل عند استخدام هذه الخوارزمية أول طلب إلى أول خادوم في قائمته، ثم عند وصول الطلب الثاني يوجّهه إلى الخادوم الموالي، وهكذا إلى أن يصل لآخر خادوم في القائمة فيعود للأول.
	</li>
	<li>
		الأقل اتصالات Least connections: يُنصَح بهذه الخوارزميّة عندما تأخذ جلسات الاتصال Sessions آمادا طويلة. يختار الموزّع في هذه الحالة الخادوم ذا الاتصالات النشطة اﻷقل عددا.
	</li>
	<li>
		حسب المصدر Source: يختار موزّع الحمل عند استخدام هذه الخوارزميّة الخادومَ الذي سيجيب على الطلب بناءً على عنوان IP المصدَر، مثلا؛ عنوان IP الزائر. يعني استخدامُ هذه الخوارزميّة أن طلبات زائر معيَّن ستُوجَّه دوما إلى نفس الخادوم.
	</li>
</ul>
<p>
	تختلف الخوارزميّات المتاحة للاختيار بينها، حسب التقنيات المستخدمة في موزّع الحمل.
</p>

<h3 id="كيف-تتعامل-موزعات-الحمل-مع-الحالة-state">
	كيف تتعامل موزّعات الحِمل مع الحالة State؟
</h3>

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

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

<h2 id="تكرار-موزعات-الحمل">
	تكرار موزّعات الحمل
</h2>

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

<p>
	يمكن لكلٍّ من الخادوميْن في هذه الحالة اكتشاف إخفاق الآخر وعودته إلى العمل.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="23482" href="https://academy.hsoub.com/uploads/monthly_2017_06/03_redundant_balancers.png.c7691237d55b972d6294aa87020c62df.png" rel=""><img alt="03_redundant_balancers.png" class="ipsImage ipsImage_thumbnailed" data-fileid="23482" data-unique="s40oht1eb" src="https://academy.hsoub.com/uploads/monthly_2017_06/03_redundant_balancers.thumb.png.6a1230c0cf58ee3d597941bd3dc3a1eb.png"></a>
</p>

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

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

<p>
	ترجمة - بتصرف - لمقال <a href="https://www.digitalocean.com/community/tutorials/what-is-load-balancing" rel="external nofollow">What is Load Balancing?</a> لصاحبته Melissa Anderson.
</p>
]]></description><guid isPermaLink="false">319</guid><pubDate>Sun, 04 Jun 2017 21:07:00 +0000</pubDate></item><item><title>&#x62A;&#x62B;&#x628;&#x64A;&#x62A; &#x646;&#x638;&#x627;&#x645; &#x627;&#x644;&#x645;&#x644;&#x641;&#x627;&#x62A; &#x627;&#x644;&#x634;&#x628;&#x643;&#x64A; NFS &#x648;&#x62A;&#x631;&#x643;&#x64A;&#x628;&#x647; &#x639;&#x644;&#x649; &#x623;&#x648;&#x628;&#x648;&#x646;&#x62A;&#x648;</title><link>https://academy.hsoub.com/devops/servers/%D8%AA%D8%AB%D8%A8%D9%8A%D8%AA-%D9%86%D8%B8%D8%A7%D9%85-%D8%A7%D9%84%D9%85%D9%84%D9%81%D8%A7%D8%AA-%D8%A7%D9%84%D8%B4%D8%A8%D9%83%D9%8A-nfs-%D9%88%D8%AA%D8%B1%D9%83%D9%8A%D8%A8%D9%87-%D8%B9%D9%84%D9%89-%D8%A3%D9%88%D8%A8%D9%88%D9%86%D8%AA%D9%88-r272/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2016_08/ubuntu-network-file-system-nfs.png.885f3b483c83e1758c815a9decd3c575.png" /></p>

<p>
	طوّرت شركة Sun Microsystems نظام الملفّات الشبكي Network file system, NFS سنة 1980 من أجل السماح بتشارك الملفّات والمجلّدات بين الأنظمة الشبيهة بيونكس (لينكس ويونكس). يتيح نظام NFS للملفّات تركيب Mounting ملفّات عبر الشّبكة والتعامل معها كما لو كانت مركَّبة محليًّا على نفس النظام.
</p>

<p style="text-align: center;">
	<img class="ipsImage ipsImage_thumbnailed" data-fileid="18804" data-unique="cvrif5ib2" src="https://academy.hsoub.com/uploads/monthly_2016_08/ubuntu-network-file-system-nfs.png.de6d6aacf249724ef16d7ff573591269.png" alt="ubuntu-network-file-system-nfs.png"></p>

<h2 id="فوائد-نظام-nfs">
	فوائد نظام NFS
</h2>

<ul>
<li>
		يسمح نظام NFS بالوصول إلى الملفّات عن بعد.
	</li>
	<li>
		يستخدم بنية عميل-خادوم Client/Server معيارية لتشارك الملفّات بين جميع الأجهزة العاملة بالأنظمة الشبيهة بيونكس.
	</li>
	<li>
		ليس ضروريًّا عند استخدام NFS أن تكون الأجهزة تعمل على نفس نظام التّشغيل.
	</li>
	<li>
		يمكن ضبط حلول للتخزين المركزيّ بمساعدة نظام NFS.
	</li>
	<li>
		يعثُر المستخدمون على بياناتهم مهما كان تواجدها الفعلي.
	</li>
	<li>
		لا توجد حاجة للتحيين Refresh اليدوي للحصول على الملفّات الجديدة.
	</li>
	<li>
		تدعم الإصدارات الحديثة من NFS قوائم التحكّم في الوصول ACL.
	</li>
	<li>
		يمكن تأمينه عبر الجدران الناريّة Firewalls وKerberos (ميثاق للاستيثاق عبر الشبكة).
	</li>
</ul>
<p>
	تدخلّ الملفّات التاليّة في إعداد NFS:
</p>

<ul>
<li>
		ملفّ <code>etc/exports/</code>: وهو ملفّ الإعداد الرئيس؛ تعرّف فيه - على الخادوم - جميع الملفّات والمجلّدات المشاركة.
	</li>
	<li>
		ملفّ <code>etc/fstab/</code>: يجب إدراج سطر لكلّ نظام ملفّات مُركَّب ضمن هذا الملفّ حتى يكون التركيب دائما (يبقى بعد إعادة التشغيل).
	</li>
	<li>
		ملفّ <code>etc/sysconfig/nfs/</code>: يعرّف المنافذ التي تنصت الخدمات للاتّصالات الواردة عبرها.
	</li>
</ul>
<h2 id="إعداد-nfs-على-خادوم-أوبونتو">
	إعداد NFS على خادوم أوبونتو
</h2>

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

<ul>
<li>
		خادوم NFS على العنوان <code>192.168.2.200</code>.
	</li>
	<li>
		عميل NFS على العنوان <code>192.168.2.150</code>.
	</li>
</ul>
<p>
	يمكنك <a href="https://academy.hsoub.com/devops/servers/%D8%A5%D9%86%D8%B4%D8%A7%D8%A1-%D8%B4%D8%A8%D9%83%D8%A9-%D8%AF%D8%A7%D8%AE%D9%84%D9%8A%D9%91%D8%A9-%D8%A7%D9%81%D8%AA%D8%B1%D8%A7%D8%B6%D9%8A%D8%A9-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-oracle-virtualbox-r263/" rel="">استخدام VirtualBox لإعداد بيئة عمل</a> بالمواصفات أعلاه.
</p>

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

<p>
	سنحتاج لتثبيت حزم NFS على الخادوم والعميل:
</p>

<pre class="ipsCode" id="ips_uid_5435_7">
# apt-get update
# apt-get install nfs-kernel-server nfs-common</pre>

<p>
	<strong>ملحوظة:</strong> يمكن الاكتفاء بالحزمة <code>nfs-common</code> على العميل. تشير العلامة <code>#</code> إلى أن الأمر ينفَّذ بصلاحيّات الجذر.
</p>

<h3 id="إعداد-خادوم-nfs">
	إعداد خادوم NFS
</h3>

<p>
	الخطوة الأولى هي تحديد المجلّد الذي نريد مشاركته؛ سننشئ واحدا لهذا الغرض (يمكنك اختيّار مجلّد موجود مسبقا):
</p>

<pre class="ipsCode" id="ips_uid_5435_9">
# mkdir /nfsshare
</pre>

<p>
	ثم نغيّر ملكيّته إلى <code>nobody:nogroup:</code> 
</p>

<pre class="ipsCode" id="ips_uid_5435_13">
# chown nobody:nogroup /nfsshare
</pre>

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

<p>
	ليمكن تشاركُ المجلّد يجب أن نضيفه إلى ملفّ الإعداد <code>etc/exports/</code>؛ نفتح هذا الملفّ (بصلاحيّات الجذر) ثم نضيف إليه السّطر التالي: 
</p>

<pre class="ipsCode" id="ips_uid_5435_15">
/nfsshare 192.168.2.150(rw,sync)
</pre>

<p>
	يسمح السّطر أعلاه بتشارك المجلّد <code>nfsshare</code> مع العميل على العنوان <code>192.168.2.150</code> مع تحديد خيارات التشارك. يمكن أن تكون الخيارات على النحو التالي:
</p>

<ul>
<li>
		<code>ro</code>: الوصول عبر وضع القراءة فقط؛ أي أن العميل يمكنه الوصول إلى الملفات المتشاركة فقط دون أن يكون قادرا على التعديل عليها أو إنشاء ملفات جديدة.
	</li>
	<li>
		<code>rw</code>: يمنح العميل القدرة على الوصول إلى الملفّات والتعديل عليها.
	</li>
	<li>
		<code>sync</code>: مزامنة التعديلات. يعني هذا أن أي تعديل سيُحفَظ فورا على نظام الملفّات؛ قد يؤثّر هذا الخيار على الأداء في حالة وجود الكثير من التغييرات المتزامنة على ملفّات كبيرة.
	</li>
	<li>
		<code>no_subtree_check</code>: يفحص نظام NFS مبدئيّا جميع المجلدات التي يتفرّع منها المجلّد المتشارَك من أجل التحقّق من الأذون وتفاصيل أخرى. يؤدّي تفعيل هذه الخاصيّة إلى تعطيل الفحص ممّا يحسّن من الأداء ولكنّه يؤدّي التقليل من الأمان.
	</li>
	<li>
		<code>no_root_squash</code>: تسمح هذه الخاصيّة للمستخدم الجذر على الجهاز العميل بالوصول إلى الملفّات المتشاركة على الخادوم بصلاحيّات الجذر على الخادوم. لا يُنصَح لأسباب أمنيّة باستخدام هذا الخيار إلا في حالات خاصّة.
	</li>
</ul>
<p>
	نطبّق الأمر <code>exportfs</code> بعد الانتهاء من تحرير الملفّ <code>exports</code> من أجل اعتماد التعديلات:
</p>

<pre class="ipsCode" id="ips_uid_5435_17">
# exportfs -r
</pre>

<p>
	ثم نشغّل خدمة NFS كالتالي:
</p>

<pre class="ipsCode" id="ips_uid_5435_19">
# service nfs-kernel-server start
</pre>

<h2 id="إعداد-عميل-nfs-على-أوبونتو">
	إعداد عميل NFS على أوبونتو
</h2>

<p>
	يمكننا الآن تركيب مجلّد التشارك على العميل. تأكد من أنه يمكن التواصل عبر الشبكة بين الجهاز الخادوم والعميل؛ مثلا باستخدام الأمر ping على العميل (حيثُ <code>192.168.2.200</code> هو عنوان الخادوم):
</p>

<pre class="ipsCode" id="ips_uid_5435_21">
$ ping 192.168.2.200
PING 192.168.2.200 (192.168.2.200) 56(84) bytes of data.
64 bytes from 192.168.2.200: icmp_seq=7 ttl=52 time=363 ms
64 bytes from 192.168.2.200: icmp_seq=8 ttl=52 time=322 ms</pre>

<p>
	نبدأ أولا بالبحث عن الملفّات المتشاركة عبر NFS على الخادوم:
</p>

<pre class="ipsCode" id="ips_uid_5435_23">
$ showmount -e 192.168.2.200
Export list for 192.168.2.200:
/nfsshare   192.168.2.150</pre>

<p>
	يظهر من نتيجة الأمر أعلاه أن المجلّد <code>nfsshare/</code> متاح للتشارك مع العميل ذي العنوان <code>192.168.2.150</code>.
</p>

<h3 id="تركيب-المجلد-على-العميل">
	تركيب المجلد على العميل
</h3>

<p>
	سننشئ على العميل مجلّدًا باسم <code>mnt/nfs/nfsshare_mount/</code> ونستخدمه لتركيب المجلّد <code>nfsshare/</code> على العميل (المجلّد <code>nfsshare/</code> الموجود على الخادوم):
</p>

<pre class="ipsCode" id="ips_uid_5435_25">
# mkdir -p /mnt/nfs/nfsshare_mount
# mount -t nfs 192.168.2.200:/nfsshare /mnt/nfs/nfsshare_mount</pre>

<p>
	يمكننا التأكد من تركيب المجلّد بتنفيذ الأمر <code>mount</code> و<a href="https://academy.hsoub.com/tags/grep/" rel="">البحث</a> عن نوع الملفّات <code>nfs</code>:
</p>

<pre class="ipsCode" id="ips_uid_5435_27">
$ mount | grep nfs
192.168.2.200:/nfsshare on /mnt/nfs/nfsshare_mount type nfs (rw,vers=4,addr=192.168.2.200,clientaddr=192.168.2.150)
</pre>

<p>
	يمكن الآن إضافة ملفّات إلى مجلّد التشارك عبر نقطة التركيب: 
</p>

<pre class="ipsCode" id="ips_uid_5435_33">
# touch /mnt/nfs/nfsshare_mount/testfile.txt
</pre>

<p>
	يمكن التأكد من على الخادوم بسرد محتويات المجلّد <code>nfsshare/</code>.
</p>

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

<pre class="ipsCode" id="ips_uid_5435_36">
192.168.2.200:/nfsshare /mnt/nfs/nfsshare_mount nfs defaults 0 0
</pre>

<p>
	نفّذ الأمر <code>mount -a</code> بعد تعديل ملفّ <code>fstab</code> لاعتماد التغييرات فورا.
</p>

<p>
	<strong>ملحوظة:</strong> تأكد من إدخال القيم الصحيحة في ملفّ <code>etc/fstab/</code>؛ وجود أخطاء في صياغة السّطر يمكن أن يؤدي إلى عدم إقلاع النظام.
</p>

<h3 id="فصل-المجلد-من-العميل">
	فصل المجلد من العميل
</h3>

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

<pre class="ipsCode" id="ips_uid_5435_38">
# umount /mnt/nfs/nfsshare_mount
</pre>

<p>
	نفّذ الأمر <code>mount | grep nfs</code> للتأكد من فصل المجلّد.
</p>

<h2 id="أوامر-أساسية-للتعامل-مع-ملفات-nfs">
	أوامر أساسية للتعامل مع ملفات NFS
</h2>

<p>
	في ما يلي أوامر يكثُر استخدامها أثناء التعامل مع المجلّدات المشارَكة عبر نظام NFS:
</p>

<ul>
<li>
		<code>showmount -e</code>: يعرض جميع المجلّدات المتشاركة المتاحة على الجهاز.
	</li>
	<li>
		<code>showmount -e &lt;server-ip&gt;</code>: يسرد قائمة بالمجلّدات المشاركة المتاحة على الخادوم ذي العنوان <code>server-ip</code>.
	</li>
	<li>
		<code>showmount -d &lt;server-ip&gt;</code>: سرد المجلّدات المشاركة المتاحة على الخادوم والمجلدات المتفرعة منها.
	</li>
	<li>
		<code>exportfs -v</code>: يعرض قائمة بالمجلّدات المتشاركة الموجوة على الخادوم.
	</li>
	<li>
		<code>exportfs -a</code>: يطلب من الخادوم مشاركة الملفّات المحدّدة في الملفّ <code>etc/exports/</code>.
	</li>
	<li>
		<code>exportfs -u</code>: يعمل عكسَ عمل الأمر السابق، إذ يوقف مشاركة المجلدات المحدّدة في <code>etc/exports/</code>.
	</li>
	<li>
		<code>exportfs -r</code>: يحدّث قائمة المشاركات بعد التعديل على الملفّ <code>etc/exports/</code>.
	</li>
</ul>
<p>
	يمكن اعتماد هذا المقال الذي يقدّم أساسيات تشارك الملفّات عبر نظام NFS للانتقال إلى تفاصيل أكثر تقدّما بخصوص NFS والميزات التي يقدّمها.
</p>

<p>
	ترجمة -وبتصرّف- للمقال <a href="http://www.tecmint.com/how-to-setup-nfs-server-in-linux/" rel="external nofollow">How to Setup NFS (Network File System) on RHEL/CentOS/Fedora and Debian/Ubuntu</a> لصاحبه Tarunika Shrivastava.
</p>
]]></description><guid isPermaLink="false">272</guid><pubDate>Mon, 15 Aug 2016 10:32:33 +0000</pubDate></item><item><title>&#x62A;&#x62D;&#x62F;&#x64A;&#x62B;&#xA0;&#x62A;&#x648;&#x632;&#x64A;&#x639;&#x629; &#x623;&#x648;&#x628;&#x648;&#x646;&#x62A;&#x648; &#x645;&#x646; &#x627;&#x644;&#x625;&#x635;&#x62F;&#x627;&#x631; 14.04 LTS &#x625;&#x644;&#x649; 16.04 LTS</title><link>https://academy.hsoub.com/devops/servers/%D8%AA%D8%AD%D8%AF%D9%8A%D8%AB%C2%A0%D8%AA%D9%88%D8%B2%D9%8A%D8%B9%D8%A9-%D8%A3%D9%88%D8%A8%D9%88%D9%86%D8%AA%D9%88-%D9%85%D9%86-%D8%A7%D9%84%D8%A5%D8%B5%D8%AF%D8%A7%D8%B1-1404-lts-%D8%A5%D9%84%D9%89-1604-lts-r280/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2016_08/upgrade-ubuntu-14.04-16.04.png.6dfd0df0be701c8040469145608972b8.png" /></p>

<p>
	تم بشكل رسمي إطلاق الإصدار 16.04 LTS ذو الدعم طويل الأمد (الملقّب بـ Xerial Xerus) من توزيعة أوبونتو منذ عدّة أسابيع، ويتشوق الكثيرون إلى معرفة المزيد عن التغييرات التي طرأت والميزات الجديدة التي أضيفت، ويمكن القيام بذلك من خلال تثبيت نسخة نظيفة clean install أو تحديث نسخة قديمة من توزيعة لينوكس أوبونتو.
</p>

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

<p style="text-align: center;">
	<img class="ipsImage ipsImage_thumbnailed" data-fileid="18803" data-unique="9lgqyb2em" src="https://academy.hsoub.com/uploads/monthly_2016_08/upgrade-ubuntu-14.04-16.04.png.8b17c0c86308cc6cfc33f51fa247764b.png" alt="upgrade-ubuntu-14.04-16.04.png"></p>

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

<h2>
	تحديث توزيعة أوبونتو 14.04 إلى 16.04 على نسخة أوبونتو المكتبية Desktop Edition
</h2>

<p>
	في البداية سنتحقق من أن النظام يملك آخر إصدار من البرمجيات المثبّتة، ونقوم بذلك من خلال فتح مدير تحديثات أوبونتو Ubuntu Update manager الموجود في لوحة القيادة <strong>Dashboard</strong>.
</p>

<p style="text-align: center;">
	<img alt="001-Ubuntu-Software-Updater.png" class="ipsImage ipsImage_thumbnailed" data-fileid="18792" data-unique="nke6d87b8" src="https://academy.hsoub.com/uploads/monthly_2016_08/001-Ubuntu-Software-Updater.png.f7aa16dcfa588ce8ad3b9a5f1ad3b128.png"></p>

<p style="text-align: center;">
	<strong>رسم توضيحي 1 – البحث عن الإصدارات الجديدة لبرمجيات أوبونتو المثبّتة</strong>
</p>

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

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="18793" href="https://academy.hsoub.com/uploads/monthly_2016_08/002-Installing-Ubuntu-Updates.png.a4e41537014d9c4528f770b30747f6eb.png" rel="external"><img alt="002-Installing-Ubuntu-Updates.png" class="ipsImage ipsImage_thumbnailed" data-fileid="18793" data-unique="lm3jyy6tw" src="https://academy.hsoub.com/uploads/monthly_2016_08/002-Installing-Ubuntu-Updates.thumb.png.08be2135a3a384a68fd8de758bee7636.png"></a>
</p>

<p style="text-align: center;">
	<strong>رسم توضيحي 2 - قائمة بالبرمجيات التي يتوفر إصدارات أحدث منها</strong>
</p>

<p>
	نقوم بالضغط على زر <strong>Install Now </strong>لتحميل وتثبيت التحديثات المعروضة.
</p>

<p style="text-align: center;">
	<img alt="003-Downloading-Ubuntu-Updates.png" class="ipsImage ipsImage_thumbnailed" data-fileid="18794" data-unique="eg3qpktys" src="https://academy.hsoub.com/uploads/monthly_2016_08/003-Downloading-Ubuntu-Updates.png.7590882ac03e997eb8c1051de58afb9a.png"></p>

<p style="text-align: center;">
	<strong>رسم توضيحي 3 - تحميل تحديثات برمجيات أوبونتو</strong>
</p>

<p>
	بعد انتهاء التحميل، سيتم البدء بتثبيت الإصدارات الجديدة:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="18795" href="https://academy.hsoub.com/uploads/monthly_2016_08/004-Installing-Ubuntu-Software-Updates.png.99d36bebf840ddb7d653dd6676bc048b.png" rel="external"><img alt="004-Installing-Ubuntu-Software-Updates.png" class="ipsImage ipsImage_thumbnailed" data-fileid="18795" data-unique="4jgh7416f" src="https://academy.hsoub.com/uploads/monthly_2016_08/004-Installing-Ubuntu-Software-Updates.thumb.png.61a8cf1b95bf91fa0f13d9cea1b02e58.png"></a>
</p>

<p style="text-align: center;">
	<strong>رسم توضيحي 4 - تثبيت تحديثات برمجيات أوبونتو</strong>
</p>

<p>
	بعد الانتهاء سيعُرض علينا إعادة التشغيل لإنهاء عملية تثبيت التحديثات، وسنقوم باختيار إعادة التشغيل <strong>Restart Now.</strong>
</p>

<p style="text-align: center;">
	<img alt="005-Restart-to-Finish-Ubuntu-Updates.png" class="ipsImage ipsImage_thumbnailed" data-fileid="18796" data-unique="z9w5vqq6x" src="https://academy.hsoub.com/uploads/monthly_2016_08/005-Restart-to-Finish-Ubuntu-Updates.png.ec44a0c50b2fc03fa058fa0416652cd0.png"></p>

<p style="text-align: center;">
	<strong>رسم توضيحي 5 - إعادة التشغيل لإنهاء عملية تحديث البرمجيات</strong>
</p>

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

<p style="text-align: center;">
	<img alt="006-Ubuntu-Software-Updates-Up-to-date.png" class="ipsImage ipsImage_thumbnailed" data-fileid="18797" data-unique="y6sfnqrx7" src="https://academy.hsoub.com/uploads/monthly_2016_08/006-Ubuntu-Software-Updates-Up-to-date.png.d212eeb74e672ed8b5523e0776ae3cc5.png"></p>

<p style="text-align: center;">
	<strong>رسم توضيحي 6 - جميع البرمجيات مثبتة بآخر إصداراتها</strong>
</p>

<p>
	سنباشر الآن بعملية تحديث التوزيعة، نقوم في البداية بفتح سطر الأوامر وتنفيذ الأمر التالي للبدء بعملية تحديث التوزيعة للإصدار الجديد 16.04 LTS:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_5611_7">
<span class="pln">$ sudo update-manager -d</span></pre>

<p>
	<strong>تنبيه</strong>: انتبه إلى وجود مسافة ما بين <span style="font-family:courier new,courier,monospace;">update-manager </span>و <span style="font-family:courier new,courier,monospace;">d-</span> في الأمر السابق.
</p>

<p>
	بعد تنفيذ الأمر، سيطلب النظام إدخال كلمة مرور المستخدم، قم بإدخالها والضغط على مفتاح <span style="font-family:courier new,courier,monospace;">Enter</span> وسيتم فتح مدير التحديث <span style="font-family:courier new,courier,monospace;">update-manager</span> كما في الصورة:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="18798" href="https://academy.hsoub.com/uploads/monthly_2016_08/007-Upgrade-Ubuntu-14.04.png.dd7312564e0ed9b9e122702b69e56c1f.png" rel="external"><img alt="007-Upgrade-Ubuntu-14.04.png" class="ipsImage ipsImage_thumbnailed" data-fileid="18798" data-unique="mk0vmy46q" src="https://academy.hsoub.com/uploads/monthly_2016_08/007-Upgrade-Ubuntu-14.04.thumb.png.02dd2b21d60cc8d72ce8e74e243e9822.png"></a>
</p>

<p style="text-align: center;">
	<strong>رسم توضيحي 7 - تحديث أوبونتو إلى الإصدار 16.04</strong>
</p>

<p>
	أخيرًا، اضغط على زر <strong>Upgrade</strong> لتحديث نسخة التوزيعة.
</p>

<h2>
	تحديث توزيعة أوبونتو 14.04 إلى 16.04 على نسخة أوبونتو الخاصة بالخوادم Server Edition
</h2>

<p>
	سنقوم بتطبيق ذات الخطوات أيضًا، حيث سنبدأ بتحديث البرمجيات المثبتة من خلال تنفيذ الأمر:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_5611_9">
<span class="pln">$ sudo apt-get update &amp;&amp; sudo apt-get dist-upgrade</span></pre>

<p>
	وبعد الانتهاء قم بإعادة التشغيل لإنهاء تثبيت التحديثات:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_5611_11">
<span class="pln">$ sudo init 6</span></pre>

<p>
	بعد ذلك سنقوم بتثبيت حزمة <span style="font-family:courier new,courier,monospace;">update-manager-core</span> باستخدام الأمر التالي إذا لم تكن مثبتة مسبقًا على الخادوم:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_5611_13">
<span class="pln">$ sudo apt-get install update-manager-core</span></pre>

<p>
	بعد ذلك، سنقوم بفتح الملف<span style="font-family:courier new,courier,monospace;"> etc/update-manager/release-upgrades/</span> باستخدام أي محرر نصوص نُفضّله (نستخدم vi في مثالنا)، وسنضيف عبارة<span style="font-family:courier new,courier,monospace;"> Prompt=lts </span>إلى نهايته كما في الصورة التالية:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_5611_15">
<span class="pln">$ sudo vi /etc/update-manager/release-upgrades</span></pre>

<p style="text-align: center;">
	<img alt="008-Configure-Ubuntu-Upgrade-Manager.png" class="ipsImage ipsImage_thumbnailed" data-fileid="18799" data-unique="ymjuk41ls" src="https://academy.hsoub.com/uploads/monthly_2016_08/008-Configure-Ubuntu-Upgrade-Manager.png.08623895f803956ff10173ba3669edc5.png"></p>

<p style="text-align: center;">
	<strong>رسم توضيحي 8 - إعداد مدير تحديثات أوبونتو</strong>
</p>

<p>
	بعد ذلك، سنبدأ عملية التحديث بتنفيذ الأمر:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_5611_17">
<span class="pln">$ sudo do-release-upgrade -d</span></pre>

<p>
	<strong>تنبيه</strong>: انتبه أيضًا إلى وجود مسافة ما بين <span style="font-family:courier new,courier,monospace;">do-release-upgrade</span> و <span style="font-family:courier new,courier,monospace;">d-</span> في الأمر السابق.
</p>

<p style="text-align: center;">
	<img alt="009-Ubuntu-14.04-Upgrade-Process.png" class="ipsImage ipsImage_thumbnailed" data-fileid="18800" data-unique="nx8qknmii" src="https://academy.hsoub.com/uploads/monthly_2016_08/009-Ubuntu-14.04-Upgrade-Process.png.8e2c2dbf140d1dae83477d2b3e472e31.png"></p>

<p style="text-align: center;">
	<strong>رسم توضيحي 9 - عملية تحديث توزيعة أوبونتو 14.04</strong>
</p>

<p>
	بعد أن يقوم مدير التحديثات بتحديد الحزم التي سيتم تحديثها وأفضل مصادر لها، سيطلب منك تأكيد العملية لذا سنقوم بالنقر على مفتاح<span style="font-family:courier new,courier,monospace;"> y </span>(الذي يشير إلى كلمة <span style="font-family:courier new,courier,monospace;">yes</span>) ومن ثم نضغط على مفتاح <span style="font-family:courier new,courier,monospace;">Enter</span> للبدء بعملية التحديث:
</p>

<p style="text-align: center;">
	<img alt="010-Ubuntu-14.04-Upgrading.png" class="ipsImage ipsImage_thumbnailed" data-fileid="18801" data-unique="ny07svayn" src="https://academy.hsoub.com/uploads/monthly_2016_08/010-Ubuntu-14.04-Upgrading.png.e8861c46e3db6b14a84168dd4f408d21.png"></p>

<p style="text-align: center;">
	<strong>رسم توضيحي 10 - تحديث أوبونتو للإصدار 16.04</strong>
</p>

<p>
	سيُعرض أثناء عملية التحديث إعادة تشغيل بعض الخدمات، لذا نختار الموافقة <span style="font-family:courier new,courier,monospace;">yes</span> حينها:
</p>

<p style="text-align: center;">
	<img alt="011-Configure-Services-During-Ubuntu-Upgrade.png" class="ipsImage ipsImage_thumbnailed" data-fileid="18802" data-unique="6zhpud17v" src="https://academy.hsoub.com/uploads/monthly_2016_08/011-Configure-Services-During-Ubuntu-Upgrade.png.cf8905b8fdee439b1c138c698869a4e9.png"></p>

<p style="text-align: center;">
	<strong>رسم توضيحي 11 - إعداد الخدمات أثناء عملية تحديث توزيعة أوبونتو</strong>
</p>

<p>
	أخيرًا، سيُسأل فيما إذا كنا نرغب بإزالة الحزم القديمة التي تم تحديثها أو استبدالها، وسنقوم بالموافقة بالضغط على مفتاح <span style="font-family:courier new,courier,monospace;">y </span>ومن ثم <span style="font-family:courier new,courier,monospace;">Enter</span>.
</p>

<p>
	بعد انتهاء عملية التحديث نقوم بإعادة تشغيل الخادوم باستخدام الأمر:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_5611_19">
<span class="pln">$ sudo init 6</span></pre>

<p>
	ونكون قد انتهينا من تحديث توزيعة أوبونتو للإصدار 16.04 LTS.
</p>

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

<p>
	ترجمة -وبتصرّف- للمقال <a href="http://www.tecmint.com/upgrade-ubuntu-14-04-to-16-04/" rel="external nofollow">How To Upgrade to Ubuntu 16.04 LTS from Ubuntu 14.04 LTS</a> لصاحبه Aaron Kili.
</p>
]]></description><guid isPermaLink="false">280</guid><pubDate>Mon, 15 Aug 2016 10:16:09 +0000</pubDate></item><item><title>&#x643;&#x64A;&#x641;&#x64A;&#x629; &#x62A;&#x62B;&#x628;&#x64A;&#x62A; &#x648;&#x625;&#x62F;&#x627;&#x631;&#x629; Supervisor &#x639;&#x644;&#x649; &#x62E;&#x648;&#x627;&#x62F;&#x64A;&#x645; &#x623;&#x648;&#x628;&#x646;&#x62A;&#x648; &#x648;&#x62F;&#x628;&#x64A;&#x627;&#x646;</title><link>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-%D9%88%D8%A5%D8%AF%D8%A7%D8%B1%D8%A9-supervisor-%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-%D9%88%D8%AF%D8%A8%D9%8A%D8%A7%D9%86-r279/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2016_08/ubuntu-debian-process-control-supervisor.png.894252979b1be149c8a2a8c1b4d16fdb.png" /></p>

<p>
	يشيع في بيئات الخواديم الوهمية (VPS) تواجد عدد من البرامج الصغيرة التي تريدها أن تعمل عملًا متواصلًا، سواءً كانت سكربتات صدفة (shell scripts) صغيرة، أو تطبيقات Node.js، أو أيّة تطبيقات كبيرة أخرى. 
</p>

<p>
	ستكتب عادةً سكربت <span style="font-family:courier new,courier,monospace;">init</span> لكل برنامج من تلك البرامج، لكن سرعان ما ستستهلك هذه الطريقة وقتًا لإدارتها، ولن يسهل للمستخدمين الجدد استعمالها. <br>
	Supervisor هو مدير للعمليات الذي يجعل إدارة عدد من البرامج التي تعمل عملًا متواصلًا أمرًا هينًا بتوفير واجهة موحدة يمكنك خلالها مراقبة تلك البرامج والتحكم بها. 
</p>

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

<p style="text-align: center;">
	<img class="ipsImage ipsImage_thumbnailed" data-fileid="18791" data-unique="wsyv8je38" src="https://academy.hsoub.com/uploads/monthly_2016_08/ubuntu-debian-process-control-supervisor.png.e07533570f0318bf3a0867c1fc9eb75d.png" alt="ubuntu-debian-process-control-supervisor.png"></p>

<h2>
	التثبيت
</h2>

<p>
	تثبيت Supervisor على توزيعتَي أوبنتو ودبيان سهلٌ للغاية، إذ تتوفر حزمٌ مبنيةٌ مسبقًا في مستودع كلا التوزيعتين. 
</p>

<p>
	نفِّذ الأمر الآتي بحساب الجذر لتثبيت حزمة <span style="font-family:courier new,courier,monospace;">Supervisor</span>:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_8161_7">
<span class="pln">apt-get install supervisor</span></pre>

<p>
	سيُشغّل "عفريت" (daemon) خدمة supervisor مباشرةً بعد إكمال التثبيت، لأنَّ الحزم التي ثبتها تحتوي على سكربت <span style="font-family:courier new,courier,monospace;">init</span> الذي سيُشغِّل <span style="font-family:courier new,courier,monospace;">Supervisor</span> بعد إعادة تشغيل النظام. يمكنك التأكد من ذلك بتنفيذ الأمر:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_8161_9">
<span class="pln">service supervisor restart</span></pre>

<p>
	يمكننا الآن أن نتعلم كيف نستطيع إضافة البرامج بعد أن ثبتنا Supervisor على نظامنا.
</p>

<h2>
	إضافة برنامج
</h2>

<p>
	تضاف البرامج الجديدة إلى Supervisor عبر ملفات الضبط، التي تُعلِم Supervisor ما هو الملف التنفيذي الذي عليه تشغيله، وما هي متغيرات البيئة (environmental variables) التي يجب ضبطها، وآلية التعامل مع المخرجات. 
</p>

<p>
	<strong>ملاحظة</strong>: جميع البرمجيات التي تعمل ضمن Supervisor يجب أن تُشغَّل في الأمامية ("foreground" وأحيانًا تسمى "non-daemonising"). فلو كان البرنامج -افتراضيًا- يشتق العملية fork ويشغل نفسه بالخلفية، فيجب أن تعود إلى دليل ذاك البرنامج لكي تعرف ما هو الخيار المستخدم لتفعيل هذا النمط، وإلا فلن يستطيع Supervisor تحديد حالة البرنامج تحديدًا صحيحًا. 
</p>

<p>
	لغرض هذا الدرس، سنفترض وجود سكربت صَدَفة (shell script) الذي نريد أن نشغله بشكلٍ دائم والمحفوظ في المسار <span style="font-family:courier new,courier,monospace;">‎/usr/local/bin/long.sh </span>ويبدو كالآتي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_8161_11">
<span class="pln">#!/bin/bash 
while true 
do 
	# Echo current date to stdout 
	echo `date` 

	# Echo 'error!' to stderr 
	echo 'error!' &gt;&amp;2 
	sleep 1 
done</span></pre>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_8161_13">
<span class="pln">chmod +x /usr/local/bin/long.sh</span></pre>

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

<p>
	ملفات ضبط البرمجيات في Supervisor موجودةٌ في مجلد ‎<span style="font-family:courier new,courier,monospace;">/etc/supervisor/conf.d</span>، يوضع عمومًا كل برنامج في ملف خاص به ذي اللاحقة<span style="font-family:courier new,courier,monospace;"> ‎.conf</span> مثالٌ عن ملف الضبط للسكربت الخاص بنا الذي سنحفظه في المسار <span style="font-family:courier new,courier,monospace;">‎/etc/supervisor/conf.d/long_script.conf </span>سيبدو كما يلي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_8161_15">
<span class="pln">[program:long_script] 
command=/usr/local/bin/long.sh 
autostart=true 
autorestart=true 
stderr_logfile=/var/log/long.err.log 
stdout_logfile=/var/log/long.out.log</span></pre>

<p>
	سننظر الآن لوظيفة وأهمية كل سطر من الأسطر السابقة، وسأخبرك بالتعديلات التي قد ترغب بإجرائها عند إضافة ملفات ضبط لبرامجك:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_8161_17">
<span class="pln">[program:long_script] 
command=/usr/local/bin/long.sh</span></pre>

<p>
	يبدأ ملف الضبط بتعريف برنامج اسمه "<span style="font-family:courier new,courier,monospace;">long_script</span>" ويُحدِّد المسار الكامل للبرنامج.
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_8161_19">
<span class="pln">autostart=true
autorestart=true</span></pre>

<p>
	السطران السابقان يُحدَّدان السلوك التلقائي الافتراضي للسكربت في مختلف الحالات. 
</p>

<p>
	الخيار <span style="font-family:courier new,courier,monospace;">autostart</span> يخبر Supervisor أنَّ البرنامج يجب أن يُشغَّل عند إقلاع النظام. ضبط هذه القيمة إلى <span style="font-family:courier new,courier,monospace;">false</span> سيستوجب تشغيلًا يدويًا للبرنامج بعد كل إعادة إقلاع للنظام. <br>
	الخيار <span style="font-family:courier new,courier,monospace;">autorestart</span> يُحدِّد كيف على Supervisor أن يتعامل مع البرنامج في حال توقف عن العمل، وهنالك ثلاثة خيارات: 
</p>

<ul>
<li>
		<span style="font-family:courier new,courier,monospace;">false</span>: إخبار Supervisor ألّا يعيد تشغيل البرنامج إطلاقًا بعد توقفه عن العمل 
	</li>
	<li>
		<span style="font-family:courier new,courier,monospace;">true</span>: إخبار Supervisor أن يعيد تشغيل البرنامج دومًا في حال توقف عن العمل 
	</li>
	<li>
		<span style="font-family:courier new,courier,monospace;">unexpected</span>: إخبار Supervisor أن يُعيد التشغيل في حال انتهى تنفيذ البرنامج بعد حدوث خطأ (افتراضيًا: أي قيمة ما عدا 0 و 2، وهذه القيمة هي قيمة حالة الخروج<span style="font-family:courier new,courier,monospace;"> [exit status]</span> التي يرسلها البرنامج بعد انتهاء تنفيذه).
	</li>
</ul>
<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_8161_21">
<span class="pln">stderr_logfile=/var/log/long.err.log 
stdout_logfile=/var/log/long.out.log</span></pre>

<p>
	السطران الأخيران يُعرِّفان المسار الافتراضي لملفَي السجل الخاصَين بالبرنامج. وكما هو واضح من اسمَي الخيارين: سيُعاد توجيه مجرى الخرج القياسي (stdout) ومجرى الخطأ القياسي (stderr) إلى المسارَين الموجودَين في الخيارَين <span style="font-family:courier new,courier,monospace;">stdout_logfile</span> و <span style="font-family:courier new,courier,monospace;">stderr_logfile</span> على التوالي وبالترتيب. يجب أن يكون المجلد المُحدَّد موجودًا قبل تشغيل البرنامج، إذ لن يحاول Supervisor أن يُنشِئ أيّة مجلدات غير موجودة. 
</p>

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

<p>
	بعد إنشاء وحفظ ملف الضبط، سنتمكن من إعلام Supervisor عن برنامجنا الجديد عبر الأمر <span style="font-family:courier new,courier,monospace;">supervisorctl</span>. علينا أولًا أن نطلب من Supervisor أن يعيد قراءة ملفات الضبط الموجودة في مجلد<span style="font-family:courier new,courier,monospace;"> ‎/etc/supervisor/conf.d</span> عبر الأمر:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_8161_23">
<span class="pln">supervisorctl reread</span></pre>

<p>
	ثم نُتبِعُ ذلك بالطلب منه أن يتصرف وفقًا لما تغيّر بالأمر:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_8161_25">
<span class="pln">supervisorctl update</span></pre>

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

<p>
	يجب أن يعمل برنامج الآن، ويمكنك التحقق من ذلك بالنظر إلى ناتج ملف السجل:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_8161_27">
<span class="pln">$ tail /var/log/long.out.log 
Sat Jul 20 22:21:22 UTC 2013 
Sat Jul 20 22:21:23 UTC 2013 
Sat Jul 20 22:21:24 UTC 2013 
Sat Jul 20 22:21:25 UTC 2013 
Sat Jul 20 22:21:26 UTC 2013 
Sat Jul 20 22:21:27 UTC 2013 
Sat Jul 20 22:21:28 UTC 2013 
Sat Jul 20 22:21:29 UTC 2013 
Sat Jul 20 22:21:30 UTC 2013 
Sat Jul 20 22:21:31 UTC 2013</span></pre>

<h2>
	إدارة البرامج
</h2>

<p>
	من المؤكد أنَّه سيحين وقتٌ تريد فيه أن توقف أو تعيد تشغيل أو ترى حالة برامجك المُشغَّلة. لدى برنامج <span style="font-family:courier new,courier,monospace;">supervisorctl</span> -الذي استخدمناه في الأعلى- نمطٌ تفاعليٌ نستطيع عبره إعطاء أوامر للتحكم بالبرامج. 
</p>

<p>
	أدخِل <span style="font-family:courier new,courier,monospace;">supervisorctl</span> دون وسائط للدخول إلى النمط التفاعلي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_8161_31">
<span class="pln">$ supervisorctl 
long_script 		RUNNING 		<abbr title="Process IDentifier | معرّف العملية أو البرنامج"><abbr title="Process IDentifier | معرّف العملية أو البرنامج"><abbr title="Process IDentifier | معرّف العملية أو البرنامج">pid</abbr></abbr></abbr> 12614, 
uptime 1:49:37 
supervisor&gt;</span></pre>

<p>
	سيعرض <span style="font-family:courier new,courier,monospace;">supervisorctl</span> (عند تشغيله) حالة وزمن تشغيل جميع البرامج، وذلك متبوعٌ بإظهار مِحَث (prompt) لإدخال الأوامر. أدخِل الأمر <span style="font-family:courier new,courier,monospace;">help</span> لإظهار جميع الأوامر التي نستطيع استخدامها:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_8161_33">
<span class="pln">supervisor&gt; help 

default commands (type help ): 
===================================== 
add 	clear 	fg 	open 	quit 	remove 	restart 
start 	stop 	update 
avail 	exit 	maintail 	<abbr title="Process IDentifier | معرّف العملية أو البرنامج"><abbr title="Process IDentifier | معرّف العملية أو البرنامج"><abbr title="Process IDentifier | معرّف العملية أو البرنامج">pid</abbr></abbr></abbr> 	reload 	reread 	shutdown 
status 	tail 	version</span></pre>

<p>
	يمكنك استخدام الأوامر <span style="font-family:courier new,courier,monospace;">start</span> و <span style="font-family:courier new,courier,monospace;">stop</span> و <span style="font-family:courier new,courier,monospace;">restart</span> متبوعةً باسم البرنامج الذي تريد تشغيله أو إيقافه أو إعادة تشغيله على التوالي:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_8161_35">
<span class="pln">supervisor&gt; stop long_script 
long_script: stopped 

supervisor&gt; start long_script 
long_script: started 

supervisor&gt; restart long_script 
long_script: stopped long_script: started</span></pre>

<p>
	يمكنك استخدام الأمر <span style="font-family:courier new,courier,monospace;">tail</span> لمشاهدة أحدث التغيرات التي طرأت في سجلات الخرج القياسي والخطأ القياسي في برنامجنا:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_8161_37">
<span class="pln">supervisor&gt; tail long_script 
Sun Jul 21 00:36:10 UTC 2013 
Sun Jul 21 00:36:11 UTC 2013 
Sun Jul 21 00:36:12 UTC 2013 
Sun Jul 21 00:36:13 UTC 2013 
Sun Jul 21 00:36:14 UTC 2013 
Sun Jul 21 00:36:15 UTC 2013 
Sun Jul 21 00:36:17 UTC 2013 

supervisor&gt; tail long_script stderr 
error! 
error! 
error! 
error! 
error! 
error! 
Error!</span></pre>

<p>
	يمكننا عرض حالة البرامج عبر الأمر <span style="font-family:courier new,courier,monospace;">status</span> للتأكد من وضعها بعد إجراء أيّة تعديلات على إحداها:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_8161_39">
<span class="pln">supervisor&gt; status long_script 
STOPPED Jul 21 01:07 AM</span></pre>

<p>
	وفي النهاية، يمكنك الخروج من النمط التفاعلي بالضغط على <span style="font-family:courier new,courier,monospace;">Ctrl-C</span> أو بكتابة <span style="font-family:courier new,courier,monospace;">quit</span> في المِحَث:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_8161_41">
<span class="pln">supervisor&gt; quit</span></pre>

<p>
	هذا كل ما في الأمر! لقد تعلمتَ أساسيات إدارة البرامج دائمة التشغيل عبر Supervisor، ولن يصعب عليك فعل المِثل لبقية برامجك. إذا كانت لديك أيّة استفسارات، فاسألها في التعليقات. 
</p>

<p>
	ترجمة -وبتصرّف- للمقال <a href="https://www.digitalocean.com/community/tutorials/how-to-install-and-manage-supervisor-on-ubuntu-and-debian-vps" rel="external nofollow">How To Install and Manage Supervisor on Ubuntu and Debian VPS</a>.
</p>
]]></description><guid isPermaLink="false">279</guid><pubDate>Sun, 14 Aug 2016 20:31:45 +0000</pubDate></item><item><title>&#x645;&#x642;&#x62F;&#x645;&#x629; &#x644;&#x62A;&#x62A;&#x628;&#x639; &#x627;&#x644;&#x625;&#x62D;&#x635;&#x627;&#x626;&#x64A;&#x627;&#x62A; &#x639;&#x644;&#x649; &#x627;&#x644;&#x62E;&#x648;&#x627;&#x62F;&#x64A;&#x645; &#x628;&#x627;&#x633;&#x62A;&#x62E;&#x62F;&#x627;&#x645; Graphite &#x648;&#xA0;StatsD &#x648; CollectD</title><link>https://academy.hsoub.com/devops/servers/%D9%85%D9%82%D8%AF%D9%85%D8%A9-%D9%84%D8%AA%D8%AA%D8%A8%D8%B9-%D8%A7%D9%84%D8%A5%D8%AD%D8%B5%D8%A7%D8%A6%D9%8A%D8%A7%D8%AA-%D8%B9%D9%84%D9%89-%D8%A7%D9%84%D8%AE%D9%88%D8%A7%D8%AF%D9%8A%D9%85-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-graphite-%D9%88%C2%A0statsd-%D9%88-collectd-r278/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2016_08/server-monitoring-graphite-statsd-collectd.png.dad4f1acbc2932242c0eb6063d9c1620.png" /></p>

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

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

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

<p style="text-align: center;">
	<img class="ipsImage ipsImage_thumbnailed" data-fileid="18790" data-unique="jdxojw5xa" src="https://academy.hsoub.com/uploads/monthly_2016_08/server-monitoring-graphite-statsd-collectd.png.0e7c60cf1c666482b0e215baee093eec.png" alt="server-monitoring-graphite-statsd-collectd.png"></p>

<p>
	سنتحدّث عن Graphite وهي مكتبة رسوم بيانيّة مصنوعة من عدّة مكوّنات يُمكِن استخدامها لتصيير render التمثيلات المرئيّة لبياناتنا عبر الزمن، سنقوم بإلقاء نظرة أيضًا على collectd، وهو عفريت (بالإنجليزية Daemon وهو برنامج يعمل في خلفيّة النظام) لإحصائيات النظام بإمكانه جمع معلومات في الزمن الفوري تقريبًا حول خادوم قيد التشغيل. وأخيرًا سنتحدّث عن StatsD وهو مُجمِّع إحصائيّات مرن يمكن استخدامه لجمع وتنظيم البيانات الكيفيّة arbitrary data.
</p>

<h2>
	لماذا نتتبع البيانات؟
</h2>

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

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

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

<p>
	بإمكاننا أن نتخيّل للحظة أنه لدينا حالة توقّف فيها خادوم قاعدة البيانات عن العمل، فأثناء قراءة السجلّات logs قد نلاحظ أنّه في تمام الساعة 15:35:28 UTC تمّ إنهاء خدمة MySQL لدينا بخطأ نفاذ الذاكرة (OOM (out of memory، نحن نعرف الآن أنّ استخدام الذاكرة هو المشكلة ولكن ليست لدينا أي فكرة عن السبب الذي أدى لارتفاع استهلاك الذاكرة في خادوم مستقر سابقًا.
</p>

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

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

<p>
	وبالجمع الذكي للبيانات نتمكّن من مشاهدة نظامنا كنظام بدلًا من مجموعة من المكوّنات غير المرتبطة.
</p>

<h2>
	مكونات Graphite
</h2>

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

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

<p>
	مشروع Graphite بحد ذاته مكوّن من بعض المكوّنات المختلفة، وكل من هذه المكونات لديها غرض مُحدّد ومُركّز.
</p>

<h3>
	تطبيق ويب Graphite
</h3>

<p>
	المُكوّن الأكثر مرئية وديناميكية من تثبيت Graphite هو تطبيق ويب Graphite.
</p>

<p>
	وهو المكان الذي نستطيع فيه تصميم الرسوم البيانيّة التي تمثّل بياناتنا:
</p>

<p style="text-align: center;">
	<img alt="graph_example.png" class="ipsImage ipsImage_thumbnailed" data-fileid="18789" data-unique="p0ts2av43" src="https://academy.hsoub.com/uploads/monthly_2016_08/graph_example.png.55f8212bb078bb4f5d582590e0f1d37e.png"></p>

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

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

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

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

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

<h2>
	Carbon
</h2>

<p>
	إنّ Carbon هو مخزن المنتهى الخلفي Backend لإعدادات Graphite، حيث يمتلك إعداد Graphite المفرد عفريت Carbon أو أكثر مسؤول عن التعامل مع البيانات التي يتم إرسالها بواسطة العمليات الأخرى التي تجمع وتنقل الإحصائيّات (أدوات الجمع Collectors هي ليست جزءًا من Graphite).
</p>

<p>
	هنالك العديد من أنواع عفاريت Carbon المختلفة، كل منها يتعامل مع البيانات بطريقة مختلفة، الأساسي منها يُدعى <span style="font-family:courier new,courier,monospace;">carbon-cache.py</span>، هذا العفريت بسيط حيث يستمع إلى البيانات على منفذ port ويكتبها إلى القرص كما وصلت بطريقة فعّالة.
</p>

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

<p>
	يتم إخبار العفريت <span style="font-family:courier new,courier,monospace;">carbon-cache.py</span> بالتنسيقات formats، الموافيق protocols، والمنافذ التي يعمل عليها، يتم أيضًا إخباره بسياسات الاحتفاظ بالبيانات لاستخدامها من أجل تخزين البيانات، والتي يتم إعطاؤها للمكوّن whisper، بالنسبة لمعظم الإعدادات الأساسيّة فإنّ نسخة واحدة من carbon-cache.py يكفي للتعامل مع استقبال البيانات.
</p>

<p>
	يمكن تشغيل عدّة نسخ منه في وقت واحد عندما يكبر حجم النظام لدينا، ويمكن موازنتها بواسطة عفريت carbon-relay.py أو carbon-aggregator.py في المقدمة.
</p>

<p>
	بإمكاننا استخدام العفريت <span style="font-family:courier new,courier,monospace;">carbon-relay.py</span> لإرسال الطلبات لكافة عفاريت المنتهى الخلفي من أجل بعض التوفير، ويمكن أيضًا استخدامه لمشاركة البيانات عبر أمثال<span style="font-family:courier new,courier,monospace;"> carbon-cache.py</span> المختلفة لنشر أحمال القراءة عبر مواقع التخزين المتعددة.
</p>

<p>
	يمكن للعفريت<span style="font-family:courier new,courier,monospace;"> carbon-aggregator.py </span>أن يحتفظ بالبيانات مؤقتًا ومن ثمّ يلقيها إلى <span style="font-family:courier new,courier,monospace;">carbon-cache.py</span> بعد فترة من الزمن، قد يساعد هذا في تخفيف تأثير معالجة الإحصائيات على النظام على حساب التفاصيل.
</p>

<h2>
	Whisper
</h2>

<p>
	إنّ Whisper هي عبارة عن مكتبة قواعد بيانات تستخدمها Graphite لتخزين المعلومات التي يتم إرسالها.
</p>

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

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

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

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

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

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

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

<h2>
	تجميع وتسليم الإحصائيات
</h2>

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

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

<h2>
	الموافيق Protocols
</h2>

<p>
	توجد ثلاث موافيق مختلفة نستطيع استخدامها لإرسال البيانات إلى Graphite.
</p>

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

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

<p>
	ولأنّه تم إنشاء Graphite باستخدام لغة بايثون فهي تقبل أيضًا تنسيق البيانات التسلسلي "pickle"، يسمح لنا هذا التنسيق المعياري لبايثون بالاحتفاظ مؤقّتًا بقيم زمنية متعدّدة وإرسالها في تعامل واحد.
</p>

<p>
	تستطيع Graphite أيضًا أن تقبل البيانات باستخدام رسائل AMQP، تسمح لنا هذه بالتعامل مع أحمال كبيرة للبيانات بشكل أفضل، نستطيع مع هذا الإعداد إعطاء عدد كبير من الإحصائيات والتعامل مع انقطاعات اتصالات الشبكة بين المضيفين عن بُعد remote hosts بدون خسارة البيانات.
</p>

<h2>
	Collectd
</h2>

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

<p>
	بإمكان collectd تجميع إحصائيّات حول العديد من المكونات المختلفة لبيئة الخادوم، فهي تسمح لنا بسهولة بتتبّع المقاييس الشائعة مثل استخدام الذاكرة، حمل المعالج CPU load، حركة مرور البيانات عبر الشبكة network traffic، إلخ..، يسمح لنا هذا بسهولة بربط الأحداث مع حالة أنظمتنا.
</p>

<p>
	وبغض النظر عن جمع معلومات النظام المعياريّة تمتلك collectd نظام إضافات يوسّع من وظيفتها، يعني هذا أنّه يمكننا بسهولة تتبّع البرمجيّات الشائعة مثل Apache ،Nginx ،iptables ،memcache ،MySQL ،PostgreSQL ،OpenVPN، وغيرها.
</p>

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

<h2>
	StatsD
</h2>

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

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

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

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

<p>
	تكون StatsD مثاليّة لهذا لأنّها عفريت ذو غرض عام يقبل حركة مرور بيانات UDP، هناك العديد من المكتبات المختلفة التي تعمل من جهة العميل client-side في العديد من لغات البرمجة والتي بإمكانها إرسال البيانات إلى StatsD، يعني هذا أنّه يمكن للتطبيقات التي نبنيها إرسال البيانات بسهولة من أجل تتبّعها.
</p>

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

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

<p>
	ترجمة -وبتصرف- للمقال <a href="https://www.digitalocean.com/community/tutorials/an-introduction-to-tracking-statistics-with-graphite-statsd-and-collectd" rel="external nofollow">An Introduction to Tracking Statistics with Graphite, StatsD, and CollectD</a> لصاحبه Justin Ellingwood.
</p>
]]></description><guid isPermaLink="false">278</guid><pubDate>Sun, 14 Aug 2016 19:48:00 +0000</pubDate></item><item><title>&#x625;&#x646;&#x634;&#x627;&#x621; &#x634;&#x628;&#x643;&#x629; &#x62F;&#x627;&#x62E;&#x644;&#x64A;&#x629; &#x627;&#x641;&#x62A;&#x631;&#x627;&#x636;&#x64A;&#x629; &#x628;&#x627;&#x633;&#x62A;&#x62E;&#x62F;&#x627;&#x645; Oracle VirtualBox</title><link>https://academy.hsoub.com/devops/servers/%D8%A5%D9%86%D8%B4%D8%A7%D8%A1-%D8%B4%D8%A8%D9%83%D8%A9-%D8%AF%D8%A7%D8%AE%D9%84%D9%8A%D8%A9-%D8%A7%D9%81%D8%AA%D8%B1%D8%A7%D8%B6%D9%8A%D8%A9-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-oracle-virtualbox-r263/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2016_06/redhat-virtualbox.png.a684c1de1f31f7376cd9646b30a88bc4.png" /></p>

<p>
	يتيح برنامج Oracle VirtualBox الكثير من الإمكانيّات لبناء أنظمة افتراضية للاستخدام الشخصيّ وهو ما يوفّر عليك عناء إعداد أمور كانت ستكلفك الكثير من الوقت والجهد. شرحنا في درس سابق <a href="https://academy.hsoub.com/devops/linux/%D8%AA%D8%AB%D8%A8%D9%8A%D8%AA-red-hat-enterprise-linux-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-virtualbox-r249/" rel="">كيفية تثبيت توزيعة RedHat</a> باستخدام هذا البرنامج.
</p>

<p>
	سنشرح في هذا المقال كيف يمكننا بناء شبكة داخليّة افتراضيّة يمكن استخدامها لمحاكاة شبكة داخليّة محليّة Local area network ,LAN.
</p>

<p style="text-align: center;">
	<img class="ipsImage ipsImage_thumbnailed" data-fileid="17885" data-unique="hbco0toad" src="https://academy.hsoub.com/uploads/monthly_2016_06/redhat-virtualbox.png.8e4fb3e57fcef8091eee8f1725234205.png" alt="redhat-virtualbox.png"></p>

<p>
	يوضح الرسم التالي الهدف النهائي الذي نريد الوصول إليه:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="17171" href="https://academy.hsoub.com/uploads/monthly_2016_06/01_schema.png.5633c171ccbe4462d88e72b62343ccb8.png" rel="external"><img alt="01_schema.png" class="ipsImage ipsImage_thumbnailed" data-fileid="17171" data-unique="gc7xto9j7" src="https://academy.hsoub.com/uploads/monthly_2016_06/01_schema.thumb.png.0ab4fad2014eaf8868c33f747225ae0a.png"></a>
</p>

<ul>
<li>
		توجد آلتان افتراضيتان، لكلّ منهما <a href="https://academy.hsoub.com/devops/servers/%D9%88%D8%A7%D8%AC%D9%87%D8%A7%D8%AA-%D8%B4%D8%A8%D9%83%D8%A9-%D8%A7%D9%84%D8%A5%D9%86%D8%AA%D8%B1%D9%86%D8%AA-%D9%88%D8%A8%D8%B1%D9%88%D8%AA%D9%88%D9%83%D9%88%D9%84%D8%A7%D8%AA%D9%87%D8%A7-%D8%A7%D9%84%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D9%91%D8%A9-r64/#%D8%A7%D9%84%D9%88%D8%A7%D8%AC%D9%87%D8%A7%D8%AA" rel="">واجهتا شبكة</a>.
	</li>
	<li>
		نستخدم الواجهة الأولى لكلّ آلة افتراضيّة للاتصال بشبكة الإنترنت عبرالمرور بواجهة شبكة خاصّة ببرنامج VirtualBox تسمّى <code>virbr0</code>.
	</li>
	<li>
		تنشئ الواجهة الثانيّة على الآلة الافتراضية شبكة داخليّة مع الواجهة الثانيّة على الآلة الافتراضية الأخرى.
	</li>
</ul>
<p>
	إن أردت الاكتفاء بإنشاء شبكة داخليّة بين الآلات الافتراضيّة فيمكنك تجاوز الخطوة الثانيّة من الخطوات أعلاه وتنفيذ الخطوتين الأولى والثالثة؛ ولكن لن يكون بمقدور أي من النظامين في هذه الحالة الاتصال بالإنترنت وما يعنيه ذلك من عدم القدرة على تحديث الحزم أو تثبيت حزم جديدة.
</p>

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

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

<h2 id="تهيئة-virtualbox-لإنشاء-شبكة-محلية">
	تهيئة VirtualBox لإنشاء شبكة محلية
</h2>

<p>
	سنحتاج أولا إلى إنشاء نظام افتراضي ثان بعد النظام الافتراضي الذي أنشأناه في درس تثبيت RHEL. يتيح VirtualBox آليّة سريعة لإنشاء الأنظمة الافتراضيّة انطلاقا من أنظمة موجودة، تُسمّى هذه الآلية بالاستنساخ Cloning.
</p>

<p>
	تظهر بالنقر بالجانب الفأرة الأيمن على النظام الافتراضي الذي نريد استنساخه قائمة ظرفيّة نختار منها استنسخ Clone.
</p>

<p style="text-align: center;">
	<img alt="02_clone.png" class="ipsImage ipsImage_thumbnailed" data-fileid="17172" data-unique="mn1xl34nx" src="https://academy.hsoub.com/uploads/monthly_2016_06/02_clone.png.bdc2c81e8802158d4471300f61494c9b.png"></p>

<p>
	تظهر نافذة جديدة، أدخل فيها اسما تختاره للنظام الذي نريد إنشاءه.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="17173" href="https://academy.hsoub.com/uploads/monthly_2016_06/03_clone.png.404f1439347bdec1f2e313aa8d5f2b41.png" rel="external"><img alt="03_clone.png" class="ipsImage ipsImage_thumbnailed" data-fileid="17173" data-unique="eqb784105" src="https://academy.hsoub.com/uploads/monthly_2016_06/03_clone.thumb.png.6caedbebaee009b2a5e7948d557abfce.png"></a>
</p>

<p>
	تأكد من تحديد خيّار أعد تهيئة عناوين MAC لجميع البطاقات Reinitialize the MAC address for all network cards.
</p>

<p>
	يوجد خياران للاستنساخ؛ استنساخ كامل Full أو استنساخ رمزي Linked. يُنشأ في الحالة الأولى نظام جديد بالكامل (أقرص افتراضية منفصلة) في حين ينشئ الخيار الثاني آلة افتراضية جديدة ولكنها مجرد وصلة للنظام المستنسَخ.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="17174" href="https://academy.hsoub.com/uploads/monthly_2016_06/04_clone.png.a182d2f86691290d6bf2791d32ee481b.png" rel="external"><img alt="04_clone.png" class="ipsImage ipsImage_thumbnailed" data-fileid="17174" data-unique="kvtm59rh4" src="https://academy.hsoub.com/uploads/monthly_2016_06/04_clone.thumb.png.84b96248e6f4e42221887ddb4b936eb4.png"></a>
</p>

<p>
	نختار الاستنساخ الكامل ثم ننقر على زر Clone.
</p>

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

<h2 id="إعداد-بطاقات-الشبكة-على-virtualbox">
	إعداد بطاقات الشبكة على VirtualBox
</h2>

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

<p>
	حدّد النظام الافتراضي ثمّ زرّ الإعدادات Settings، تظهر نافذة جديدة اختر منها قسم الشبكة Network. توجد في هذا القسم أربع بطاقات شبكة (يُشار إليها بـ Adapter). حدّد خيار Enable network adapter (فعِّل بطاقة الشبكة) لتفعيل البطاقة وتأكد من أن خيار وصل الكابل (Cable connected) محدّد.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="17175" href="https://academy.hsoub.com/uploads/monthly_2016_06/05_network.png.fcce911f5ea3a89800dce065c237c188.png" rel="external"><img alt="05_network.png" class="ipsImage ipsImage_thumbnailed" data-fileid="17175" data-unique="c19ryb94z" src="https://academy.hsoub.com/uploads/monthly_2016_06/05_network.thumb.png.ba7b7ceda83162c1a0356b7f8092f076.png"></a>
</p>

<p>
	يعدّ VirtualBox مبدئيا بطاقات الشبكة للعمل وفق وضع ترجمة عناوين الشبكة Network address translation, NAT. يعني هذا أن البطاقة سيكون لديها عنوان IP خاصّ غير مرئيّ من الخارج ولكنها تستطيع التواصل مع الخارج عبر VirtualBox الذي يعمل وسيطا بين الاثنين. هذه هي نفس الآلية التي يعمل بها الموجّه الموجود في المنزل عادة (يُترجم العناوين بين حاسوبك ومزوّد خدمة الإنترنت). يمكّنك هذا الإعداد من الاتصال بالإنترنت إذا كان حاسوبك متصلا بها. لاحظ عنوان MAC الخاصّ بالبطاقة؛ فربما تحتاجه للتعرف عليها من داخل نظام التشغيل في ما بعد.
</p>

<p>
	ننتقل للبطاقة الثانيّة (Adapter 2). الأمر المختلف هنا مقارنة بالبطاقة السابقة هو أننا اخترنا وضع Internal network (شبكة داخليّة) مع السماح بتنقل البيانات بين الآلات الافتراضية عبر هذه البطاقة (Allow VMs).
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="17176" href="https://academy.hsoub.com/uploads/monthly_2016_06/06_network.png.a8e3da8d6707b05faf3264ff427ad893.png" rel="external"><img alt="06_network.png" class="ipsImage ipsImage_thumbnailed" data-fileid="17176" data-unique="h4ud3jk4f" src="https://academy.hsoub.com/uploads/monthly_2016_06/06_network.thumb.png.2c72cf5e9b5b49cd91b92e47f16da61c.png"></a>
</p>

<p>
	كرّر نفس الإعدادات على النظام الافتراضي الآخر.
</p>

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

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

<p>
	اختر قائمة التطبيقات Applications، ثم أدوات النظام System tools ثم الإعدادات Settings ثم الشبكة Network. ستجد أن النظام اكتشف وجود بطاقتين كما يظهر في يسار الصورة (قد تختلف أسماء البطاقات لديك).
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="17177" href="https://academy.hsoub.com/uploads/monthly_2016_06/07_network.png.ba64575375ba6597d98ca334a6b7f1d7.png" rel="external"><img alt="07_network.png" class="ipsImage ipsImage_thumbnailed" data-fileid="17177" data-unique="mhih6e3vc" src="https://academy.hsoub.com/uploads/monthly_2016_06/07_network.thumb.png.6b42f57d93820889a30c52e9080a12be.png"></a>
</p>

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

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

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileid="17178" href="https://academy.hsoub.com/uploads/monthly_2016_06/08_network.png.f5d163853bf309861f3850cf6c9c449d.png" rel="external"><img alt="08_network.png" class="ipsImage ipsImage_thumbnailed" data-fileid="17178" data-unique="3eu6y7c6i" src="https://academy.hsoub.com/uploads/monthly_2016_06/08_network.thumb.png.2ed20f470a75f97047706b6e78cae1f7.png"></a>
</p>

<p>
	اخترتُ العنوان <code>192.168.2.100</code> بالنسبة للجهاز الافتراضي الأول، و<code>192.168.2.200</code> بالنسبة للجهاز الثاني. قناع الشبكة في الحالتين هو <code>255.255.255.0</code>.
</p>

<p>
	يمكن التأكد من أن البطاقتين توجدان على نفس الشبكة الداخليّة باستخدام <a href="https://academy.hsoub.com/devops/servers/%D8%AF%D9%84%D9%8A%D9%84%D9%83-%D9%84%D9%81%D9%87%D9%85-%D8%A3%D9%85%D8%B1-ping-%D9%88%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85%D9%87-r238/" rel="">أمر ping</a>.
</p>

<p>
	على الجهاز الأول (ذي العنوان <code>192.168.2.100</code> ):
</p>

<pre class="ipsCode" id="ips_uid_2225_8">
ping 192.168.2.200
PING 192.168.2.200 (192.168.2.100) 56(84) bytes of data.
64 bytes from 192.168.2.200: icmp_seq=1 ttl=64 time=0.760 ms
64 bytes from 192.168.2.200: icmp_seq=2 ttl=64 time=0.254 ms
(...)</pre>

<p>
	على الجهاز الثاني (ذي العنوان <code>192.168.2.200</code> ):
</p>

<pre class="ipsCode" id="ips_uid_2225_10">
ping 192.168.2.100
PING 192.168.2.100 (192.168.2.100) 56(84) bytes of data.
64 bytes from 192.168.2.100: icmp_seq=1 ttl=64 time=0.980 ms
64 bytes from 192.168.2.100: icmp_seq=2 ttl=64 time=0.348 ms
(...)</pre>

<p>
	أي أن كلا من البطاقتين يمكنها الاتصال بالأخرى.
</p>
]]></description><guid isPermaLink="false">263</guid><pubDate>Mon, 20 Jun 2016 08:58:27 +0000</pubDate></item><item><title>&#x62F;&#x644;&#x64A;&#x644;&#x643; &#x644;&#x641;&#x647;&#x645; &#x623;&#x645;&#x631; ping &#x648;&#x627;&#x633;&#x62A;&#x62E;&#x62F;&#x627;&#x645;&#x647;</title><link>https://academy.hsoub.com/devops/servers/%D8%AF%D9%84%D9%8A%D9%84%D9%83-%D9%84%D9%81%D9%87%D9%85-%D8%A3%D9%85%D8%B1-ping-%D9%88%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85%D9%87-r238/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2016_04/ping-command.png.5aa223c3824a7bcb20d8a649382bf0f5.png" /></p>

<p>
	يحظى أمر <span style="font-family:courier new,courier,monospace;"><code>ping</code></span> بشعبية كبيرة لدى مديري الشبكات وممتهني التقنية لما يقدمه من خدمات في سبيل فحص الاتصال بين مضيفين Host. يقدّم هذا المقال تفاصيل أكثر عن هذا الأمر شائع الاستخدام.
</p>

<p style="text-align: center;">
	<img class="ipsImage ipsImage_thumbnailed" data-fileid="14960" data-unique="rked4xsz5" src="https://academy.hsoub.com/uploads/monthly_2016_04/ping-command.png.b68edf395a43dd0a458c449df9631718.png" alt="ping-command.png"></p>

<h2 id="ماهو-أمر-ping-وكيف-يعمل">
	ماهو أمر ping وكيف يعمل؟
</h2>

<p>
	يعمل أمر <code>ping</code> على فحص إمكانية الوصول إلى عنوان IP، مضيف أو خادوم انطلاقا من شبكتك. يكثُر استخدام الأمر للتدقيق في أخطاء الشبكة وتحديد مشاكلها. يقوم الأمر على مبدأ عمل سهل ولكنه مفيد؛ إذ يُرسِل حزم بيانات تحوي الرسالة <code>PING</code> إلى عنوان IP (أو المضيف) وينتظر الرد ثم يحسب الفترة الزمنية اللازمة لورود الجواب؛ يُشار لهذه المدّة بـRTT، وهي اختصار Round Trip Time أي زمن الذهاب والإياب؛ تُعرَف هذه المدة أيضا بزمن الوصول Latency.
</p>

<p>
	يعني هذا أن بإمكانك معرفة ما إذا كان يمكن الوصول إلى مضيف من شبكتك وسرعة تلقي الرد منه باستخدام <code>ping</code>. يشير العمل السريع لأمر <code>ping</code> (زمن وصول قصير) إلى أن الاتصال متجاوب أكثر وهي مسألة مهمة في تطبيقات مثل الألعاب على الشبكة. يُقاس زمن الوصول عادة بجزء على ألف من الثانية (ثانية = 1000ms)؛ أزمان وصول أعلى تعني وجود مشاكل في الشبكة.
</p>

<p>
	يتغيّر زمن الوصول حسب عوامل من بينها التوجيه Routing والموقع الجغرافي. ينتج عن تنفيذ أمر <code>ping</code> لتجربة الوصول إلى مضيف في نفس البلد زمن أدنى من مضيف في بلد بقارة أخرى نظرا للموقع الجغرافي والقفزات Hops التي يتضمنها التوجيه.
</p>

<p>
	تأتي أداة <code>ping</code> مثبتة مسبقا على جميع أنظمة التشغيل الحديثة تقريبا ويمكن تنفيذها من سطر الأوامر (الطرفية على الأنظمة الشبيهة بيونكس أو محثّ وندوز Windows prompt).
</p>

<p>
	<strong>ملحوظة:</strong> يمكن إعداد الخواديم أو المضيفات على حظر (عدم الرد) طلبات <code>ping</code> لأسباب أمنية.
</p>

<h2 id="خيارات-ping-الأساسية">
	خيارات ping الأساسية
</h2>

<h3 id="معرفة-إصدار-ping">
	معرفة إصدار ping
</h3>

<p>
	يتيح الخيار <span style="font-family:courier new,courier,monospace;"><code>V-</code></span> معرفة إصدار <code>ping</code> المثبَّت في النظام:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_4935_7">
<span class="pln">ping </span><span class="pun">-</span><span class="pln">V</span></pre>

<p>
	مثال على المخرجات:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_4935_9">
<span class="pln">ping utility, iputils-s20121221</span></pre>

<h3 id="استخدام-أمر-ping">
	استخدام أمر ping
</h3>

<p>
	المعطى الضروري الوحيد لأمر <code>ping</code> هو اسم المضيف أو عنوان IP المراد فحصُه.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_4935_11">
<span class="pln">ping example</span><span class="pun">.</span><span class="pln">com</span></pre>

<p>
	اسم المضيف في المثال أعلاه هو <code>example.com</code>. في ما يلي مثال على مخرجات الأمر:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_4935_13">
<span class="pln">PING example</span><span class="pun">.</span><span class="pln">com </span><span class="pun">(</span><span class="lit">93.184</span><span class="pun">.</span><span class="lit">216.34</span><span class="pun">)</span><span class="pln"> </span><span class="lit">56</span><span class="pun">(</span><span class="lit">84</span><span class="pun">)</span><span class="pln"> bytes of data</span><span class="pun">.</span><span class="pln">
</span><span class="lit">64</span><span class="pln"> bytes from example</span><span class="pun">.</span><span class="pln">com </span><span class="pun">(</span><span class="lit">93.184</span><span class="pun">.</span><span class="lit">216.34</span><span class="pun">):</span><span class="pln"> icmp_seq</span><span class="pun">=</span><span class="lit">1</span><span class="pln"> ttl</span><span class="pun">=</span><span class="lit">42</span><span class="pln"> time</span><span class="pun">=</span><span class="lit">116</span><span class="pln"> ms
</span><span class="lit">64</span><span class="pln"> bytes from example</span><span class="pun">.</span><span class="pln">com </span><span class="pun">(</span><span class="lit">93.184</span><span class="pun">.</span><span class="lit">216.34</span><span class="pun">):</span><span class="pln"> icmp_seq</span><span class="pun">=</span><span class="lit">2</span><span class="pln"> ttl</span><span class="pun">=</span><span class="lit">42</span><span class="pln"> time</span><span class="pun">=</span><span class="lit">154</span><span class="pln"> ms
</span><span class="lit">64</span><span class="pln"> bytes from example</span><span class="pun">.</span><span class="pln">com </span><span class="pun">(</span><span class="lit">93.184</span><span class="pun">.</span><span class="lit">216.34</span><span class="pun">):</span><span class="pln"> icmp_seq</span><span class="pun">=</span><span class="lit">3</span><span class="pln"> ttl</span><span class="pun">=</span><span class="lit">42</span><span class="pln"> time</span><span class="pun">=</span><span class="lit">163</span><span class="pln"> ms
</span><span class="lit">64</span><span class="pln"> bytes from example</span><span class="pun">.</span><span class="pln">com </span><span class="pun">(</span><span class="lit">93.184</span><span class="pun">.</span><span class="lit">216.34</span><span class="pun">):</span><span class="pln"> icmp_seq</span><span class="pun">=</span><span class="lit">4</span><span class="pln"> ttl</span><span class="pun">=</span><span class="lit">42</span><span class="pln"> time</span><span class="pun">=</span><span class="lit">1028</span><span class="pln"> ms
</span><span class="lit">64</span><span class="pln"> bytes from example</span><span class="pun">.</span><span class="pln">com </span><span class="pun">(</span><span class="lit">93.184</span><span class="pun">.</span><span class="lit">216.34</span><span class="pun">):</span><span class="pln"> icmp_seq</span><span class="pun">=</span><span class="lit">5</span><span class="pln"> ttl</span><span class="pun">=</span><span class="lit">42</span><span class="pln"> time</span><span class="pun">=</span><span class="lit">768</span><span class="pln"> ms
</span><span class="lit">64</span><span class="pln"> bytes from example</span><span class="pun">.</span><span class="pln">com </span><span class="pun">(</span><span class="lit">93.184</span><span class="pun">.</span><span class="lit">216.34</span><span class="pun">):</span><span class="pln"> icmp_seq</span><span class="pun">=</span><span class="lit">6</span><span class="pln"> ttl</span><span class="pun">=</span><span class="lit">42</span><span class="pln"> time</span><span class="pun">=</span><span class="lit">128</span><span class="pln"> ms</span></pre>

<p>
	ستحتاج لتوقيف تنفيذ الأمر بالضغط على الزرين <code>CTRL</code> و <code>C</code> وإلا فإن الأمر سيستمر في إرسال الحزم.
</p>

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

<p>
	يظهر ملخّص بالإحصاءات بعد توقف الأمر:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_4935_15">
<span class="pun">^</span><span class="pln">X</span><span class="pun">^</span><span class="pln">C
</span><span class="pun">---</span><span class="pln"> example</span><span class="pun">.</span><span class="pln">com ping statistics </span><span class="pun">---</span><span class="pln">
</span><span class="lit">24</span><span class="pln"> packets transmitted</span><span class="pun">,</span><span class="pln"> </span><span class="lit">23</span><span class="pln"> received</span><span class="pun">,</span><span class="pln"> </span><span class="lit">4</span><span class="pun">%</span><span class="pln"> packet loss</span><span class="pun">,</span><span class="pln"> time </span><span class="lit">23041ms</span><span class="pln">
rtt min</span><span class="pun">/</span><span class="pln">avg</span><span class="pun">/</span><span class="pln">max</span><span class="pun">/</span><span class="pln">mdev </span><span class="pun">=</span><span class="pln"> </span><span class="lit">114.323</span><span class="pun">/</span><span class="lit">307.465</span><span class="pun">/</span><span class="lit">1057.499</span><span class="pun">/</span><span class="lit">296.627</span><span class="pln"> ms</span><span class="pun">,</span><span class="pln"> pipe </span><span class="lit">2</span></pre>

<p>
	يتضمن الملخّص:
</p>

<ul>
<li>
		عدد الحزم المُرسَلة Transmitted
	</li>
	<li>
		عدد الحزم المستلمة Received
	</li>
	<li>
		نسبة فقدان الحزم Packet loss
	</li>
	<li>
		الحد الأدنى للمدة الزمنية لوصول الإجابة <code>min</code>.
	</li>
	<li>
		متوسط وصول الإجابة <code>avg</code>.
	</li>
	<li>
		الحد الأقصى للمدة الزمنية لوصول الإجابة <code>max</code>.
	</li>
</ul>
<p>
	تظهر في كل سطر مدة الإجابة وقيمة أخرى باسم <code>ttl</code>. تحدّد القيمة الأخيرة عمر الحزمة (Time To Live). إن انقضت هذه القيمة دون أن يتمكن <code>ping</code> من الاتصال بالوجهة فسيقرّر أنه لا يمكن الوصول إليها. لا يقتصر استخدام هذا المعطى على <code>ping</code> بل مجالات أخرى مثل بروتوكول HTTP و <a href="https://academy.hsoub.com/devops/servers/%D9%85%D9%82%D8%AF%D9%91%D9%85%D8%A9-%D8%A5%D9%84%D9%89-%D9%85%D9%8F%D8%B5%D8%B7%D9%8E%D9%84%D8%AD%D8%A7%D8%AA-%D9%88%D8%B9%D9%86%D8%A7%D8%B5%D8%B1-%D9%88%D9%85%D9%81%D8%A7%D9%87%D9%8A%D9%85-%D9%86%D8%B8%D8%A7%D9%85-%D8%A3%D8%B3%D9%85%D8%A7%D8%A1-%D8%A7%D9%84%D9%86%D8%B7%D8%A7%D9%82%D8%A7%D8%AA-r5/" rel="">نظام أسماء النطاقات</a>.
</p>

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

<pre>
 </pre>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_4935_17">
<span class="pln">ping </span><span class="lit">192.168</span><span class="pun">.</span><span class="lit">1.5</span><span class="pln"> </span></pre>

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

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

<p>
	استخدم الخيار <code>c-</code> متبوعا بعدد على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_4935_19">
<span class="pln">ping </span><span class="pun">-</span><span class="pln">c </span><span class="lit">10</span><span class="pln"> example</span><span class="pun">.</span><span class="pln">com</span></pre>

<p>
	تظهر المخرجات كالتالي:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_4935_21">
<span class="pln">PING example</span><span class="pun">.</span><span class="pln">com </span><span class="pun">(</span><span class="lit">93.184</span><span class="pun">.</span><span class="lit">216.34</span><span class="pun">)</span><span class="pln"> </span><span class="lit">56</span><span class="pun">(</span><span class="lit">84</span><span class="pun">)</span><span class="pln"> bytes of data</span><span class="pun">.</span><span class="pln">
</span><span class="lit">64</span><span class="pln"> bytes from example</span><span class="pun">.</span><span class="pln">com </span><span class="pun">(</span><span class="lit">93.184</span><span class="pun">.</span><span class="lit">216.34</span><span class="pun">):</span><span class="pln"> icmp_seq</span><span class="pun">=</span><span class="lit">1</span><span class="pln"> ttl</span><span class="pun">=</span><span class="lit">43</span><span class="pln"> time</span><span class="pun">=</span><span class="lit">129</span><span class="pln"> ms
</span><span class="lit">64</span><span class="pln"> bytes from example</span><span class="pun">.</span><span class="pln">com </span><span class="pun">(</span><span class="lit">93.184</span><span class="pun">.</span><span class="lit">216.34</span><span class="pun">):</span><span class="pln"> icmp_seq</span><span class="pun">=</span><span class="lit">2</span><span class="pln"> ttl</span><span class="pun">=</span><span class="lit">43</span><span class="pln"> time</span><span class="pun">=</span><span class="lit">127</span><span class="pln"> ms
</span><span class="lit">64</span><span class="pln"> bytes from example</span><span class="pun">.</span><span class="pln">com </span><span class="pun">(</span><span class="lit">93.184</span><span class="pun">.</span><span class="lit">216.34</span><span class="pun">):</span><span class="pln"> icmp_seq</span><span class="pun">=</span><span class="lit">3</span><span class="pln"> ttl</span><span class="pun">=</span><span class="lit">43</span><span class="pln"> time</span><span class="pun">=</span><span class="lit">126</span><span class="pln"> ms
</span><span class="lit">64</span><span class="pln"> bytes from example</span><span class="pun">.</span><span class="pln">com </span><span class="pun">(</span><span class="lit">93.184</span><span class="pun">.</span><span class="lit">216.34</span><span class="pun">):</span><span class="pln"> icmp_seq</span><span class="pun">=</span><span class="lit">4</span><span class="pln"> ttl</span><span class="pun">=</span><span class="lit">43</span><span class="pln"> time</span><span class="pun">=</span><span class="lit">125</span><span class="pln"> ms
</span><span class="lit">64</span><span class="pln"> bytes from example</span><span class="pun">.</span><span class="pln">com </span><span class="pun">(</span><span class="lit">93.184</span><span class="pun">.</span><span class="lit">216.34</span><span class="pun">):</span><span class="pln"> icmp_seq</span><span class="pun">=</span><span class="lit">5</span><span class="pln"> ttl</span><span class="pun">=</span><span class="lit">43</span><span class="pln"> time</span><span class="pun">=</span><span class="lit">284</span><span class="pln"> ms
</span><span class="lit">64</span><span class="pln"> bytes from example</span><span class="pun">.</span><span class="pln">com </span><span class="pun">(</span><span class="lit">93.184</span><span class="pun">.</span><span class="lit">216.34</span><span class="pun">):</span><span class="pln"> icmp_seq</span><span class="pun">=</span><span class="lit">6</span><span class="pln"> ttl</span><span class="pun">=</span><span class="lit">43</span><span class="pln"> time</span><span class="pun">=</span><span class="lit">132</span><span class="pln"> ms
</span><span class="lit">64</span><span class="pln"> bytes from example</span><span class="pun">.</span><span class="pln">com </span><span class="pun">(</span><span class="lit">93.184</span><span class="pun">.</span><span class="lit">216.34</span><span class="pun">):</span><span class="pln"> icmp_seq</span><span class="pun">=</span><span class="lit">7</span><span class="pln"> ttl</span><span class="pun">=</span><span class="lit">43</span><span class="pln"> time</span><span class="pun">=</span><span class="lit">131</span><span class="pln"> ms
</span><span class="lit">64</span><span class="pln"> bytes from example</span><span class="pun">.</span><span class="pln">com </span><span class="pun">(</span><span class="lit">93.184</span><span class="pun">.</span><span class="lit">216.34</span><span class="pun">):</span><span class="pln"> icmp_seq</span><span class="pun">=</span><span class="lit">8</span><span class="pln"> ttl</span><span class="pun">=</span><span class="lit">43</span><span class="pln"> time</span><span class="pun">=</span><span class="lit">130</span><span class="pln"> ms
</span><span class="lit">64</span><span class="pln"> bytes from example</span><span class="pun">.</span><span class="pln">com </span><span class="pun">(</span><span class="lit">93.184</span><span class="pun">.</span><span class="lit">216.34</span><span class="pun">):</span><span class="pln"> icmp_seq</span><span class="pun">=</span><span class="lit">9</span><span class="pln"> ttl</span><span class="pun">=</span><span class="lit">43</span><span class="pln"> time</span><span class="pun">=</span><span class="lit">178</span><span class="pln"> ms
</span><span class="lit">64</span><span class="pln"> bytes from example</span><span class="pun">.</span><span class="pln">com </span><span class="pun">(</span><span class="lit">93.184</span><span class="pun">.</span><span class="lit">216.34</span><span class="pun">):</span><span class="pln"> icmp_seq</span><span class="pun">=</span><span class="lit">10</span><span class="pln"> ttl</span><span class="pun">=</span><span class="lit">43</span><span class="pln"> time</span><span class="pun">=</span><span class="lit">128</span><span class="pln"> ms

</span><span class="pun">---</span><span class="pln"> example</span><span class="pun">.</span><span class="pln">com ping statistics </span><span class="pun">---</span><span class="pln">
</span><span class="lit">10</span><span class="pln"> packets transmitted</span><span class="pun">,</span><span class="pln"> </span><span class="lit">10</span><span class="pln"> received</span><span class="pun">,</span><span class="pln"> </span><span class="pun">%</span><span class="pln"> packet loss</span><span class="pun">,</span><span class="pln"> time </span><span class="lit">9011ms</span><span class="pln">
rtt min</span><span class="pun">/</span><span class="pln">avg</span><span class="pun">/</span><span class="pln">max</span><span class="pun">/</span><span class="pln">mdev </span><span class="pun">=</span><span class="pln"> </span><span class="lit">125.003</span><span class="pun">/</span><span class="lit">149.335</span><span class="pun">/</span><span class="lit">284.433</span><span class="pun">/</span><span class="lit">47.508</span><span class="pln"> ms</span></pre>

<p>
	ينفَّذ الأمر - كما يظهر - عشر مرات ثم يتوقف ويعطي إحصائيات.
</p>

<p>
	لفعل نفس الشيء على وندوز نضيف الخيار <code>n-</code> بدلا من <code>c-</code>:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_4935_23">
<span class="pln">ping </span><span class="pun">-</span><span class="pln">n </span><span class="lit">10</span><span class="pln"> example</span><span class="pun">.</span><span class="pln">com</span></pre>

<h3 id="تعديل-حجم-حزمة-البيانات">
	تعديل حجم حزمة البيانات
</h3>

<p>
	يُرسِل أمر <code>ping</code> مبدئيا حزمة بحجم <code>64</code> بايت على لينكس، و<code>32</code> بايت على وندوز. إن أردت تغيير الحجم المبدئي للحزمة على لينكس فيمكنك ذلك باستخدام الخيار <code>s-</code> :
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_4935_25">
<span class="pln">ping </span><span class="pun">-</span><span class="pln">s </span><span class="lit">100</span><span class="pln"> </span><span class="pun">-</span><span class="pln">c </span><span class="lit">6</span><span class="pln"> example</span><span class="pun">.</span><span class="pln">com</span></pre>

<p>
	النتيجة:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_4935_27">
<span class="pln">PING example</span><span class="pun">.</span><span class="pln">com </span><span class="pun">(</span><span class="lit">93.184</span><span class="pun">.</span><span class="lit">216.34</span><span class="pun">)</span><span class="pln"> </span><span class="lit">100</span><span class="pun">(</span><span class="lit">128</span><span class="pun">)</span><span class="pln"> bytes of data</span><span class="pun">.</span><span class="pln">
</span><span class="lit">108</span><span class="pln"> bytes from example</span><span class="pun">.</span><span class="pln">com </span><span class="pun">(</span><span class="lit">93.184</span><span class="pun">.</span><span class="lit">216.34</span><span class="pun">):</span><span class="pln"> icmp_seq</span><span class="pun">=</span><span class="lit">2</span><span class="pln"> ttl</span><span class="pun">=</span><span class="lit">51</span><span class="pln"> time</span><span class="pun">=</span><span class="lit">1113</span><span class="pln"> ms
</span><span class="lit">108</span><span class="pln"> bytes from example</span><span class="pun">.</span><span class="pln">com </span><span class="pun">(</span><span class="lit">93.184</span><span class="pun">.</span><span class="lit">216.34</span><span class="pun">):</span><span class="pln"> icmp_seq</span><span class="pun">=</span><span class="lit">3</span><span class="pln"> ttl</span><span class="pun">=</span><span class="lit">51</span><span class="pln"> time</span><span class="pun">=</span><span class="lit">253</span><span class="pln"> ms
</span><span class="lit">108</span><span class="pln"> bytes from example</span><span class="pun">.</span><span class="pln">com </span><span class="pun">(</span><span class="lit">93.184</span><span class="pun">.</span><span class="lit">216.34</span><span class="pun">):</span><span class="pln"> icmp_seq</span><span class="pun">=</span><span class="lit">4</span><span class="pln"> ttl</span><span class="pun">=</span><span class="lit">51</span><span class="pln"> time</span><span class="pun">=</span><span class="lit">263</span><span class="pln"> ms
</span><span class="lit">108</span><span class="pln"> bytes from example</span><span class="pun">.</span><span class="pln">com </span><span class="pun">(</span><span class="lit">93.184</span><span class="pun">.</span><span class="lit">216.34</span><span class="pun">):</span><span class="pln"> icmp_seq</span><span class="pun">=</span><span class="lit">5</span><span class="pln"> ttl</span><span class="pun">=</span><span class="lit">51</span><span class="pln"> time</span><span class="pun">=</span><span class="lit">253</span><span class="pln"> ms
</span><span class="lit">108</span><span class="pln"> bytes from example</span><span class="pun">.</span><span class="pln">com </span><span class="pun">(</span><span class="lit">93.184</span><span class="pun">.</span><span class="lit">216.34</span><span class="pun">):</span><span class="pln"> icmp_seq</span><span class="pun">=</span><span class="lit">6</span><span class="pln"> ttl</span><span class="pun">=</span><span class="lit">51</span><span class="pln"> time</span><span class="pun">=</span><span class="lit">1068</span><span class="pln"> ms

</span><span class="pun">---</span><span class="pln"> example</span><span class="pun">.</span><span class="pln">com ping statistics </span><span class="pun">---</span><span class="pln">
</span><span class="lit">6</span><span class="pln"> packets transmitted</span><span class="pun">,</span><span class="pln"> </span><span class="lit">5</span><span class="pln"> received</span><span class="pun">,</span><span class="pln"> </span><span class="lit">16</span><span class="pun">%</span><span class="pln"> packet loss</span><span class="pun">,</span><span class="pln"> time </span><span class="lit">4999ms</span><span class="pln">
rtt min</span><span class="pun">/</span><span class="pln">avg</span><span class="pun">/</span><span class="pln">max</span><span class="pun">/</span><span class="pln">mdev </span><span class="pun">=</span><span class="pln"> </span><span class="lit">253.093</span><span class="pun">/</span><span class="lit">590.201</span><span class="pun">/</span><span class="lit">1113.044</span><span class="pun">/</span><span class="lit">408.995</span><span class="pln"> ms</span><span class="pun">,</span><span class="pln"> pipe </span><span class="lit">2</span></pre>

<p>
	بالنسبة لوندوز فالخيار المستخدم هو <code>l-</code>:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_4935_29">
<span class="pln">ping </span><span class="pun">-</span><span class="pln">l </span><span class="lit">100</span><span class="pln"> </span><span class="pun">-</span><span class="pln">n </span><span class="lit">6</span><span class="pln"> example</span><span class="pun">.</span><span class="pln">com</span></pre>

<h3 id="زيادة-المدة-الزمنية-أو-تقليصها">
	زيادة المدة الزمنية أو تقليصها
</h3>

<p>
	ينتظر أمر <code>ping</code> مبدئيا ثانية واحدة قبل إرسال الحزمة الموالية إلى الوِجهة. يمكِّن استخدام الخيار <code>i-</code> من زيادة هذا المجال أو تقليصه.
</p>

<p>
	يحدّد الأمر التالي <code>3</code> ثوان مجالا بين إرسال حزمتين:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_4935_31">
<span class="pln">ping </span><span class="pun">-</span><span class="pln">i </span><span class="lit">3</span><span class="pln"> example</span><span class="pun">.</span><span class="pln">com</span></pre>

<p>
	يمكننا بنفس الطريقة التسريع من إرسال الحزم بدل انتظار ثانية في كل مرة:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_4935_33">
<span class="pln">ping </span><span class="pun">-</span><span class="pln">i </span><span class="lit">0.2</span><span class="pln"> example</span><span class="pun">.</span><span class="pln">com</span></pre>

<h3 id="إغراق-الوجهة-بحزم-ping">
	إغراق الوجهة بحزم ping
</h3>

<p>
	تُستخدم هذه الطريقة لاختبار أداء الشبكة. لا ينتظر أمر <code>ping</code> بين إرسال حزمتين إن استخدم الخيار <code>f-</code> بشرط تنفيذه بصلاحيات إدارية:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_4935_35">
<span class="pln">sudo ping </span><span class="pun">-</span><span class="pln">f example</span><span class="pun">.</span><span class="pln">com</span></pre>

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

<p>
	اضغط زرّي <code>CTRL</code> و <code>C</code> لإيقاف الأمر.
</p>

<h3 id="عرض-إحصاءات-ping-فقط">
	عرض إحصاءات ping فقط
</h3>

<p>
	يمكن باستخدام الخيار <code>q-</code> الإبقاء على إحصاءات الأمر فقط دون إظهار معلومات الحزم:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_4935_37">
<span class="pln">ping </span><span class="pun">-</span><span class="pln">c </span><span class="lit">5</span><span class="pln"> </span><span class="pun">-</span><span class="pln">q example</span><span class="pun">.</span><span class="pln">com</span></pre>

<p>
	النتيجة:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_4935_39">
<span class="pln">PING example</span><span class="pun">.</span><span class="pln">com </span><span class="pun">(</span><span class="lit">93.184</span><span class="pun">.</span><span class="lit">216.34</span><span class="pun">)</span><span class="pln"> </span><span class="lit">56</span><span class="pun">(</span><span class="lit">84</span><span class="pun">)</span><span class="pln"> bytes of data</span><span class="pun">.</span><span class="pln">

</span><span class="pun">---</span><span class="pln"> example</span><span class="pun">.</span><span class="pln">com ping statistics </span><span class="pun">---</span><span class="pln">
</span><span class="lit">5</span><span class="pln"> packets transmitted</span><span class="pun">,</span><span class="pln"> </span><span class="lit">4</span><span class="pln"> received</span><span class="pun">,</span><span class="pln"> </span><span class="lit">20</span><span class="pun">%</span><span class="pln"> packet loss</span><span class="pun">,</span><span class="pln"> time </span><span class="lit">6221ms</span><span class="pln">
rtt min</span><span class="pun">/</span><span class="pln">avg</span><span class="pun">/</span><span class="pln">max</span><span class="pun">/</span><span class="pln">mdev </span><span class="pun">=</span><span class="pln"> </span><span class="lit">259.175</span><span class="pun">/</span><span class="lit">723.504</span><span class="pun">/</span><span class="lit">1219.311</span><span class="pun">/</span><span class="lit">460.540</span><span class="pln"> ms</span><span class="pun">,</span><span class="pln"> pipe </span><span class="lit">2</span></pre>

<p>
	يظهر التقرير فقط في مخرجات الأمر أعلاه.
</p>

<h3 id="تحديد-مهلة-لتنفيذ-ping">
	تحديد مهلة لتنفيذ ping
</h3>

<p>
	إذا أردت تحديد مهلة زمنية تظهر بانقضائها إحصاءات أمر <code>ping</code> فيمكنك ذلك بإضافة الخيار <code>w-</code>:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_4935_41">
<span class="pln">ping </span><span class="pun">-</span><span class="pln">w </span><span class="lit">6</span><span class="pln"> example</span><span class="pun">.</span><span class="pln">com</span></pre>

<p>
	يعيّن الخيار <code>w-</code>المدة الزمنية التي يقضيها الأمر في إرسال الحزم. حددنا في المثال أعلاه 6 ثوان سيتوقف بعدها تنفيذ الأمر وتظهر الإحصاءات.
</p>

<h2 id="رسائل-الخطأ-في-أمر-ping">
	رسائل الخطأ في أمر ping
</h2>

<p>
	تظهر عدة رسائل - حسب الحالة - في مخرجات <code>ping</code>، في ما يلي شرح مدلولاتها.
</p>

<h3 id="destination-host-unreachable">
	Destination Host Unreachable
</h3>

<p>
	تشير الرسالة <code>Destination Host Unreachable</code> (لا يمكن الوصول إلى المضيف الوِجهة) إلى أنه لا توجد طريق من الشبكة المحلية إلى المضيف الذي أرسلت إليه الحزم. يعني هذا عادة أنه يوجد خطأ في الاتصال. إن نفذت أمر <code>ping</code> دون أن تكون متصلا فستظهر هذه الرسالة.
</p>

<h3 id="request-timed-out">
	Request timed out
</h3>

<p>
	تعني هذه الرسالة <code>Request timed oud</code> (انتهاء مهلة انتظار الرد) أن الأداة لم تحصُل على أجوبة على الحزم التي أرسلتها ضمن المهلة المحدّدة (1 ثانية مبدئيا). توجد عدّة أسباب ممكنة من أبرزها احتقان Congestion في الشبكة، حجب بعض الحزم في الجدار الناري firewall، مشكل في الموجِّه Router وغيرها.
</p>

<h3 id="unknown-host-ping-request-could-not-find-host">
	Unknown host / Ping Request Could Not Find Host
</h3>

<p>
	تدلّ رسالة الخطأ <code>Unknown host</code> (مضيف غير معروف) أو شبيهتها <code>Ping Request Could Not Find Host</code> (لم يستطع طلب Ping العثور على مضيف) إلى خطأ في اسم المضيف؛ إما لكون اسم المضيف غير موجود أو أنه غير متاح لديك في الشبكة. عند تنفيذ الأمر التالي مثلا (لاحظ الخطأ في كتابة <code>hsoubs</code>):
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_4935_43">
<span class="pln">ping hsoubs</span><span class="pun">.</span><span class="pln">com</span></pre>

<p>
	تظهر الرسالة: 
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_4935_45">
<span class="pln">ping</span><span class="pun">:</span><span class="pln"> unknown host hsoubs</span><span class="pun">.</span><span class="pln">com</span></pre>

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

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

<p>
	ترجمة -وبتصرّف- لمقال <a href="http://www.unixmen.com/all-about-ping-command/" rel="external nofollow">All About PING Command</a> لصاحبه Mohammad Forhad Iftekher.
</p>
]]></description><guid isPermaLink="false">238</guid><pubDate>Mon, 11 Apr 2016 07:25:00 +0000</pubDate></item><item><title>&#x643;&#x64A;&#x641; &#x62A;&#x634;&#x63A;&#x644; Parse Server &#x639;&#x644;&#x649; &#x62E;&#x627;&#x62F;&#x648;&#x645; &#x623;&#x648;&#x628;&#x646;&#x62A;&#x648; 14.04</title><link>https://academy.hsoub.com/devops/servers/%D9%83%D9%8A%D9%81-%D8%AA%D8%B4%D8%BA%D9%84-parse-server-%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-1404-r234/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2016_03/parse-server-ubuntu.png.95af527ac2a2484e7b2a72d8536fc3ff.png" /></p>

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

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

<p style="text-align: center;">
	<img alt="parse-server-ubuntu.png" class="ipsImage ipsImage_thumbnailed" data-fileid="14756" data-unique="nml2fv58e" src="https://academy.hsoub.com/uploads/monthly_2016_03/parse-server-ubuntu.png.0d872f0e41610eda3833c47a9e8a9357.png"></p>

<p>
	أعلنت فيس بوك في شهر يناير 2016 عن إغلاق المنصة مع فتح مصدر النهاية الخلفية ونشرها باسم Parse server ليستمر تطويرها ويمكن تثبيتها في أي بيئة تشغّل Node.js و MongoDB دون الاعتماد على منصة الشركة؛ على أن تتوقف المنصة التابعة للشركة في شهر يناير 2017.
</p>

<p>
	يقدّم هذا الدليل تفاصيل تثبيت Parse server على خادوم أوبنتو 14.04؛ ويتوجّه ليكون مدخلا لتهجير التطبيقات من Parse أو لاستخدام النهاية الخلفية التي يوفرها في تطبيقات جديدة.
</p>

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

<p>
	سنفترض أن لديك خادوم أوبنتو 14.04 وحساب مستخدم بصلاحيات إدارية، غير المستخدم الجذر <code>root</code>. تمكن مراجعة درس <a href="https://academy.hsoub.com/devops/servers/%D8%A7%D9%84%D8%A5%D8%B9%D8%AF%D8%A7%D8%AF-%D8%A7%D9%84%D8%A7%D8%A8%D8%AA%D8%AF%D8%A7%D8%A6%D9%8A-%D9%84%D8%AE%D8%A7%D8%AF%D9%88%D9%85-%D8%A3%D9%88%D8%A8%D9%86%D8%AA%D9%88-1404-r4/" rel="">الإعداد الابتدائي لخادوم أوبنتو 14.04</a> لإعدادات نظام التشغيل. يتطلّب الدرس كذلك تثبيت MongoDB.
</p>

<p>
	تأكد من إعداد المتطلبات ثم عد لهذا الدليل واتّبع الخطوات التالية.
</p>

<h2 id="الخطوة-الأولى-تثبيت-nodejs-وأدوات-التطوير">
	الخطوة الأولى: تثبيت Node.js وأدوات التطوير
</h2>

<p>
	ابدأ بالانتقال إلى مجلد المستخدم الشخصي:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_8544_7">
<span class="pln">cd </span><span class="pun">~</span></pre>

<p>
	سنستخدم مستودع Apt الذي توفره NodeSource عن طريق سكربت تثبيت النسخة المستقرة الأخيرة من Node.js (الإصدار <code>5.5.0</code> أثناء كتابة هذا الدليل). نزّل السكربت بالأمر التالي:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_8544_15">
<span class="pln">curl </span><span class="pun">-</span><span class="pln">sL https</span><span class="pun">:</span><span class="com">//deb.nodesource.com/setup_5.x -o nodesource_setup.sh</span></pre>

<p>
	يمكنك، إن أردت، رؤية محتوى السكربت باستخدام <code>nano</code>أو أي محرّر نصوص آخر:
</p>

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_8544_11">
<span class="pln">nano ./nodesource_setup.sh</span></pre>

<p>
	نفذ السكربت بصلاحيات إدارية مع استخدام خيار <code>E-</code> لإخبار <code>sudo</code> بالحفاظ على متغيرات النظام Environment variables الخاصّة بالمستخدم:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_8544_13">
<span class="pln">sudo </span><span class="pun">-</span><span class="pln">E bash </span><span class="pun">./</span><span class="pln">nodesource_setup</span><span class="pun">.</span><span class="pln">sh</span></pre>

<p>
	تُضاف مستودعات NodeSource إلى النظام بعد انتهاء السكربت، ويمكننا بالتالي استخدام <code>apt-get</code> لتثبيت حزمة <code>nodejs</code>. سنثبت حزمة التعريف <code>build-essential</code> التي تتيح مجموعة من أدوات التطوير التي يمكن أن تكون مفيدة لنا في ما بعد، إضافة إلى نظام التحكّم في النسخ Git لنستخدمه في تنزيل المشروعات من GitHub:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_8544_17">
<span class="pln">sudo apt</span><span class="pun">-</span><span class="pln">get install </span><span class="pun">-</span><span class="pln">y nodejs build</span><span class="pun">-</span><span class="pln">essential git</span></pre>

<h2 id="الخطوة-الثانية-تثبيت-تطبيق-parse-server-تجريبي">
	الخطوة الثانية: تثبيت تطبيق Parse Server تجريبي
</h2>

<p>
	صُمّم Parse Server للعمل بالتزامن مع Express، وهو إطار عمل Node.js شائع الاستخدام لتطبيقات الويب، يسمح بتركيب عناصر البرمجيات الوسيطة Middleware المستجيبة لتعريف واجهة تطبيقات برمجية <abbr title="Application Programming Interface | واجهة برمجية"><abbr title="Application Programming Interface | واجهة برمجية"><abbr title="Application Programming Interface | واجهة برمجية"><abbr title="Application Programming Interface | واجهة برمجية">API</abbr></abbr></abbr></abbr> على مسار محدَّد. يحوي مستودع <code>parse-server-example</code> على GitHub مثالا لتطبيق يتبع هذا النمط في تصميم البرامج.
</p>

<p>
	انسخ المستودع باستخدام <code>git</code> على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_8544_27">
<span class="pln">git clone https</span><span class="pun">:</span><span class="com">//github.com/ParsePlatform/parse-server-example.git</span></pre>

<p>
	ادخل إلى مجلد <code>parse-server-example</code> الذي نسخته للتو:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_8544_25">
<span class="pln">cd </span><span class="pun">~/</span><span class="pln">parse</span><span class="pun">-</span><span class="pln">server</span><span class="pun">-</span><span class="pln">example</span></pre>

<p>
	ثم استخدم <code>npm</code> لتثبيت الاعتماديات بما فيها <code>parse-server</code> في المجلد الحالي:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_8544_23">
<span class="pln">npm install</span></pre>

<p>
	سيعثُر <code>npm</code> على جميع الوحدات Modules المطلوبة لـ <code>parse-server</code> ثم يخزّنها على المسار <span style="font-family:courier new,courier,monospace;"><code>parse-server-example/node_modules/~</code></span>.
</p>

<h2 id="الخطوة-الثالثة-اختبار-التطبيق-التجريبي">
	الخطوة الثالثة: اختبار التطبيق التجريبي
</h2>

<p>
	استخدم أمر <code>npm</code> لبدء تشغيل الخدمة. يُنفَّذ الأمر المعرَّف في خاصية <code>start</code> من ملف <code>package.json</code>؛ أي في هذه الحالة <code>node index.js</code>:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_8544_29">
<span class="pln">npm start</span></pre>

<p>
	مخرجات الأمر:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_8544_31">
<span class="pun">&gt;</span><span class="pln"> parse</span><span class="pun">-</span><span class="pln">server</span><span class="pun">-</span><span class="pln">example@1</span><span class="pun">.</span><span class="lit">0.0</span><span class="pln"> start </span><span class="pun">/</span><span class="pln">home</span><span class="pun">/</span><span class="pln">sammy</span><span class="pun">/</span><span class="pln">parse</span><span class="pun">-</span><span class="pln">server</span><span class="pun">-</span><span class="pln">example
</span><span class="pun">&gt;</span><span class="pln"> node index</span><span class="pun">.</span><span class="pln">js

DATABASE_URI not specified</span><span class="pun">,</span><span class="pln"> falling back to localhost</span><span class="pun">.</span><span class="pln">
parse</span><span class="pun">-</span><span class="pln">server</span><span class="pun">-</span><span class="pln">example running on port </span><span class="lit">1337.</span></pre>

<p>
	يمكن إنهاء تشغيل التطبيق في أي وقت بالضغط على الزرين <code>Ctrl</code> و<code>C</code>.
</p>

<p>
	يمرّر تطبيق Express المعرَّف في <code>index.js</code> طلبات HTTP إلى وحدة <code>parse-server</code> التي تتواصل مع قاعدة بيانات MongoDB وتطلُب تنفيذ الدوال المعرَّفة في الملف <code>parse-server-example/cloud/main.js/~</code>.
</p>

<p>
	نقطة النهاية Endpoint المبدئية لواجهة تطبيقات Parse Server في هذا المثال هي:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_8544_33">
<span class="pln">http</span><span class="pun">:</span><span class="com">//your_server_IP/parse</span></pre>

<p>
	يمكن استخدام أمر <code>curl</code> في سطر أوامر آخر، أثناء عمل التطبيق، لتجربة نقطة النهاية. تأكد أولا من تسجيل دخولك إلى الخادوم إذ أن هذه الأوامر تستدعي المضيف المحلّي <code>localhost</code> بدلا من عنوان IP آخر.
</p>

<p>
	أنشئ تسجيلة Record بإرسال طلب <code>POST</code> مع ترويسة <code>X-Parse-Application-Id</code> لتحديد التطبيق، إضافة لبيانات أخرى بصيغة <code>JSON</code>:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_8544_35">
<span class="pln">curl </span><span class="pun">-</span><span class="pln">X POST \
</span><span class="pun">-</span><span class="pln">H </span><span class="str">"X-Parse-Application-Id: myAppId"</span><span class="pln"> \
</span><span class="pun">-</span><span class="pln">H </span><span class="str">"Content-Type: application/json"</span><span class="pln"> \
</span><span class="pun">-</span><span class="pln">d </span><span class="str">'{"score":1337,"playerName":"Sammy","cheatMode":false}'</span><span class="pln"> \
http</span><span class="pun">:</span><span class="com">//localhost:1337/parse/classes/GameScore</span></pre>

<p>
	مخرجات الأمر:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_8544_37">
<span class="pun">{</span><span class="str">"objectId"</span><span class="pun">:</span><span class="str">"fu7t4oWLuW"</span><span class="pun">,</span><span class="str">"createdAt"</span><span class="pun">:</span><span class="str">"2016-02-02T18:43:00.659Z"</span><span class="pun">}</span></pre>

<p>
	تُخزَّن البيانات المرسَلة في قاعدة بيانات MongoDB ويمكن إيجادها بإرسال طلب <code>GET</code> باستخدام <code>curl</code> مرة أخرى:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_8544_39">
<span class="pln">curl </span><span class="pun">-</span><span class="pln">H </span><span class="str">"X-Parse-Application-Id: myAppId"</span><span class="pln"> http</span><span class="pun">:</span><span class="com">//localhost:1337/parse/classes/GameScore</span></pre>

<p>
	مخرجات الأمر:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_8544_41">
<span class="pun">{</span><span class="str">"results"</span><span class="pun">:[{</span><span class="str">"objectId"</span><span class="pun">:</span><span class="str">"GWuEydYCcd"</span><span class="pun">,</span><span class="str">"score"</span><span class="pun">:</span><span class="lit">1337</span><span class="pun">,</span><span class="str">"playerName"</span><span class="pun">:</span><span class="str">"Sammy"</span><span class="pun">,</span><span class="str">"cheatMode"</span><span class="pun">:</span><span class="kwd">false</span><span class="pun">,</span><span class="str">"updatedAt"</span><span class="pun">:</span><span class="str">"2016-02-02T04:04:29.497Z"</span><span class="pun">,</span><span class="str">"createdAt"</span><span class="pun">:</span><span class="str">"2016-02-02T04:04:29.497Z"</span><span class="pun">}]}</span></pre>

<p>
	استدع الدالة <code>hello</code> المعرَّفة في الملف <code>parse-server-example/cloud/main.js/~</code> باستخدام واجهة التطبيقات البرمجية:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_8544_43">
<span class="pln">curl </span><span class="pun">-</span><span class="pln">X POST \
</span><span class="pun">-</span><span class="pln">H </span><span class="str">"X-Parse-Application-Id: myAppId"</span><span class="pln"> \
</span><span class="pun">-</span><span class="pln">H </span><span class="str">"Content-Type: application/json"</span><span class="pln"> \
</span><span class="pun">-</span><span class="pln">d </span><span class="str">'{}'</span><span class="pln"> \
http</span><span class="pun">:</span><span class="com">//localhost:1337/parse/functions/hello</span></pre>

<p>
	مخرجات الأمر:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_8544_45">
<span class="pun">{</span><span class="str">"result"</span><span class="pun">:</span><span class="str">"Hi"</span><span class="pun">}</span></pre>

<h2 id="الخطوة-الرابعة-إعدادات-التطبيق-التجريبي">
	الخطوة الرابعة: إعدادات التطبيق التجريبي
</h2>

<p>
	اضغط على <code>Ctrl</code> و<code>C</code> في نافذة سطر الأوامر الأولى لإيقاف تطبيق Parse Server. يمكن إعداد التطبيق باستخدام ستة متغيرات نظام يبينها الجدول التالي.
</p>

<table><tbody>
<tr>
<th>
				المتغير                             
			</th>
			<th>
				الوصف
			</th>
		</tr>
<tr>
<td>
				<code>DATABASE_URI</code>
			</td>
			<td>
				مسار الاتصال بقاعدة بيانات MongoDB، مثلا<code>mongodb://localhost:27017/dev</code>
			</td>
		</tr>
<tr>
<td>
				<code>CLOUD_CODE_MAIN</code>
			</td>
			<td>
				مسار إلى ملف يحوي الشفرة المصدرية لدوال Cloud Code الخاصّة بـParse
			</td>
		</tr>
<tr>
<td>
				<code>APP_ID</code>
			</td>
			<td>
				سلسلة محارف لتعريف التطبيق، مثلا myAppId.
			</td>
		</tr>
<tr>
<td>
				<code>MASTER_KEY</code>
			</td>
			<td>
				مفتاح سري رئيس يمكّن من تجاوز جميع آليات الأمان في التطبيق.
			</td>
		</tr>
<tr>
<td>
				<code>PARSE_MOUNT</code>
			</td>
			<td>
				المسار الذي توجد عليه واجهة تطبيقات Parse Server
			</td>
		</tr>
<tr>
<td>
				<code>PORT</code>
			</td>
			<td>
				المنفذ الذي ينصت عليه التطبيق، مثلا <code>1337</code>
			</td>
		</tr>
</tbody></table>
<p>
	ننفذ أمر <code>export</code> قبل تشغيل التطبيق لإعداد متغيرات النظام، مثلا:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_8544_47">
<span class="kwd">export</span><span class="pln"> APP_ID</span><span class="pun">=</span><span class="pln">fooApp</span></pre>

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

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_8544_49">
<span class="pln">nano my_app</span><span class="pun">.</span><span class="pln">js</span></pre>

<p>
	ثم ألصق الشفرة التالية مع تغيير القيم بما يناسب:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7487_7">
<span class="pln">var express </span><span class="pun">=</span><span class="pln"> require</span><span class="pun">(</span><span class="str">'express'</span><span class="pun">);</span><span class="pln">
var </span><span class="typ">ParseServer</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> require</span><span class="pun">(</span><span class="str">'parse-server'</span><span class="pun">).</span><span class="typ">ParseServer</span><span class="pun">;</span><span class="pln">

</span><span class="com">// إعداد واجهة التطبيقات البرمجية</span><span class="pln">
var <abbr title="Application Programming Interface | واجهة برمجية"><abbr title="Application Programming Interface | واجهة برمجية"><abbr title="Application Programming Interface | واجهة برمجية">api</abbr></abbr></abbr> </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">ParseServer</span><span class="pun">({</span><span class="pln">
databaseURI</span><span class="pun">:</span><span class="pln"> </span><span class="str">'mongodb://localhost:27017/dev'</span><span class="pun">,</span><span class="pln">
cloud</span><span class="pun">:</span><span class="pln"> __dirname </span><span class="pun">+</span><span class="pln"> </span><span class="str">'/cloud/main.js'</span><span class="pun">,</span><span class="pln">
appId</span><span class="pun">:</span><span class="pln"> </span><span class="str">'myOtherAppId'</span><span class="pun">,</span><span class="pln">
masterKey</span><span class="pun">:</span><span class="pln"> </span><span class="str">'myMasterKey'</span><span class="pln">
</span><span class="pun">});</span><span class="pln">

var app </span><span class="pun">=</span><span class="pln"> express</span><span class="pun">();</span><span class="pln">

</span><span class="com">// ضبط مسار التطبيق</span><span class="pln">
app</span><span class="pun">.</span><span class="pln">use</span><span class="pun">(</span><span class="str">'/myparseapp'</span><span class="pun">,</span><span class="pln"> <abbr title="Application Programming Interface | واجهة برمجية"><abbr title="Application Programming Interface | واجهة برمجية"><abbr title="Application Programming Interface | واجهة برمجية">api</abbr></abbr></abbr></span><span class="pun">);</span><span class="pln">

</span><span class="com">// الإنصات للاتصالات القادمة على المنفذ 9999</span><span class="pln">
var port </span><span class="pun">=</span><span class="pln"> </span><span class="lit">9999</span><span class="pun">;</span><span class="pln">
app</span><span class="pun">.</span><span class="pln">listen</span><span class="pun">(</span><span class="pln">port</span><span class="pun">,</span><span class="pln"> function</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    console</span><span class="pun">.</span><span class="pln">log</span><span class="pun">(</span><span class="str">'parse-server-example running on port '</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> port </span><span class="pun">+</span><span class="pln"> </span><span class="str">'.'</span><span class="pun">);</span><span class="pln">
</span><span class="pun">});</span></pre>

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

<pre class="ipsCode prettyprint lang-html prettyprinted" id="ips_uid_3408_9">
<span class="pln">node my_app.js</span></pre>

<p>
	مخرجات الأمر:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_3408_11">
<span class="pln">parse</span><span class="pun">-</span><span class="pln">server</span><span class="pun">-</span><span class="pln">example running on port </span><span class="lit">9999.</span></pre>

<p>
	يمكنك في أي وقت إيقاف التطبيق بالضغط على <code>Ctrl</code> و<code>C</code>. يعمل <code>my_app.js</code> بنفس الطريقة التي يعمل بها <code>index.js</code> تقريبا، مع فرق أنه ينصت على المنفذ <code>9999</code> مع تركيب Parse Server على المسار <code>myparseapp/</code> بحيث يصبح مسار نقطة النهاية كما يلي:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_3408_13">
<span class="pln">http</span><span class="pun">:</span><span class="com">//yourserverIP:9999/myparseapp</span></pre>

<p>
	يمكن تجربتها بـاستخدام <code>curl</code> على النحو التالي: 
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_5961_7">
<span class="pln">curl </span><span class="pun">-</span><span class="pln">H </span><span class="str">"X-Parse-Application-Id: myOtherAppId"</span><span class="pln"> http</span><span class="pun">:</span><span class="com">//localhost:9999/myparseapp/classes/GameScore</span></pre>

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

<p>
	قدّمنا في هذا الدرس أساسيات تشغيل تطبيق Node.js مثل Parse Server على أوبنتو. يتطلّب تهجير تطبيق من Parse حذرا أكبر وربما تعديلات على الشفرة البرمجية ويجب أن يُستعدّ له جيدا من ناحية تهيئة البنية التحتية.
</p>

<p>
	ترجمة -وبتصرّف- للمقال <a href="https://www.digitalocean.com/community/tutorials/how-to-run-parse-server-on-ubuntu-14-04" rel="external nofollow">How To Run Parse Server on Ubuntu 14.04</a> لصاحبه Brennen Bearnes.
</p>
]]></description><guid isPermaLink="false">234</guid><pubDate>Thu, 31 Mar 2016 21:45:00 +0000</pubDate></item></channel></rss>
