SSD Nodes Learn 🎉 VPS من $5.50/شهر
الأدلة Matt Connorبقلم Matt Connor

ollama pull أم run: أين تُحفظ النماذج؟

يتوقف ollama pull بعد تنزيل النموذج، بينما يفتحه ollama run في محادثة. تعرّف إلى مكان الملفات، وسبب امتلاء قرص VPS، وطريقة نقلها.

ollama pull مقابل ollama run

ollama pull ينزّل نموذجاً ثم يتوقف. أما ollama run فينزّل النموذج فقط إذا لم يكن موجوداً، ثم يحمّله إلى الذاكرة ويفتح محادثة تفاعلية. عملية التنزيل متطابقة، وتُحفظ الملفات في المكان نفسه. وحده run يواصل التنفيذ بعد ذلك.

هذا الفرق وحده يحدد الأمر المناسب للاستخدام في برنامج نصي، والأمر المناسب للاستخدام من سطر الأوامر.

ollama pull gemma4
ollama run gemma4
ollama run gemma4 "Reply with one word: ready"

يجلب السطر الأول النموذج ثم ينتهي، لذلك فهو آمن للاستخدام في إعداد الخوادم وفي وحدة systemd. يفتح السطر الثاني جلسة محادثة؛ اكتب /bye أو اضغط Ctrl+D للخروج منها. يرسل السطر الثالث مطالبة واحدة، ويطبع الإجابة ثم ينتهي. وهذا هو الشكل المناسب للبرنامج النصي عندما يحتاج إلى إجابة لا إلى جلسة. تتغير أسماء النماذج بسرعة، لذلك تعامل مع gemma4 هنا على أنه عنصر نائب: إنه المثال الذي تستخدمه وثائق Ollama الرسمية اعتباراً من August 2026، وتعمل أي وسم من المكتبة بالطريقة نفسها.

لماذا يبدو تشغيل ollama الأول وكأنه تجمّد

قد يبقى أول run على VPS جديد دون أي مخرجات لعدة دقائق. لا يعني ذلك أن شيئاً معطّل. لا يمكن أن يظهر موجه الدردشة قبل حفظ النموذج على القرص وتحميله في الذاكرة، لذلك ينفّذ run عملية تنزيل بحجم عدة غيغابايت قبل أن يعرض أي شيء.

هناك عاملان يخفيان هذه العملية. يعرض Ollama شريط التقدم فقط عندما يكون خرجه متجهاً إلى طرفية، لذلك لا يطبع run داخل shell script أو cron job أو خطوة CI أو ssh host ollama run ... عادي أي شيء أثناء التنزيل. بعد وصول البيانات، يجب أيضاً قراءة الملف من القرص إلى RAM قبل ظهور أول token، وتكون هذه القراءة بطيئة على VPS صغير. وإذا لم يملك الخادم ذاكرة تكفي للنموذج، تبدأ kernel باستخدام swap، وتطول مدة الانتظار كثيراً.

راقب العملية من جلسة ثانية بدلاً من التخمين:

df -h /
watch -n5 df -h /

انخفاض المساحة الحرة على مراحل يعني أن التنزيل ما زال جارياً. أما توقف انخفاض المساحة الحرة مع استمرار انشغال الأمر، فيعني أن التنزيل اكتمل وبدأ تحميل النموذج إلى الذاكرة.

لهذا يُفضّل تنفيذ عملية السحب مسبقاً. يجب ألا يكون الشخص الذي يكتب ollama run هو من يدفع تكلفة التنزيل.

نزّل النموذج قبل أن يطلبه أي شخص

في خادم جديد، نفّذ التنزيل ضمن النص البرمجي نفسه الذي يثبّت الخادم:

curl -fsSL https://ollama.com/install.sh | sh
ollama pull gemma4

إذا كنت تجهّز الخادم للمرة الأولى، يشرح دليل تثبيت Ollama الكامل على VPS الخدمة نفسها والجهات المسموح لها بالوصول إليها. بعد ذلك، من المفيد إعداد عملية تنزيل تستمر بعد إغلاق الطرفية، لأن انقطاع التنزيل في منتصفه قد يترك مخزن النماذج غير مكتمل.

شغّل العملية داخل tmux، أو سلّمها إلى systemd كوحدة one-shot تعمل عند الإقلاع. اكتب /etc/systemd/system/ollama-pull.service:

[Unit]
Description=Pre-pull Ollama models
Wants=ollama.service network-online.target
After=ollama.service network-online.target

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/bin/sh -c 'until ollama list >/dev/null 2>&1; do sleep 2; done'
ExecStart=/bin/sh -c 'ollama pull gemma4'

[Install]
WantedBy=multi-user.target

يُشغَّل الأمران عبر /bin/sh -c عمداً. يحتاج ExecStart= المجرد إلى مسار مطلق، ولا يضع المُثبّت الملف التنفيذي دائماً في الدليل نفسه، لذلك فإن command -v ollama على خادمك هو الإجابة الموثوقة الوحيدة. يؤدي المرور عبر shell إلى استخدام PATH الخاص بالخدمة بدلاً من استخدام مسار منسوخ من دليل. كما أن ExecStart الأول مهم أيضاً: يعني After=ollama.service أن وحدة الخادم بدأت، وهذا لا يعني أنها أصبحت جاهزة. لذلك تنتظر الحلقة حتى يستجيب ollama list قبل بدء التنزيل.

sudo systemctl daemon-reload
sudo systemctl enable --now ollama-pull.service
journalctl -u ollama-pull.service

يجب أن يوضح journal اكتمال التنزيل من دون أخطاء، ثم يجب أن يعرض ollama list النموذج. للحفاظ على وسم متغيّر محدثاً، أضف مؤقت systemd أو إدخال cron أسبوعياً يشغّل عملية التنزيل نفسها. عند إعادة تنزيل وسم تغيّر، تُنزَّل الطبقات الجديدة وتبقى الطبقات القديمة من دون مراجع إليها، ويجري تنظيفها في المرة التالية التي يبدأ فيها الخادم.

ما الذي يحدث عند انقطاع عملية pull

يُخزَّن كل جزء من النموذج تحت تجزئة تستند إلى محتواه الخاص. لذلك لا تضيع الأعمال التي أُنجزت قبل انقطاع pull: شغّل ollama pull نفسه مرة أخرى، وستُكتشف الأجزاء التي اكتمل تنزيلها وتُتخطى، ثم يتابع التنزيل من الجزء الذي انقطع.

هناك إجراء واحد يزيل هذا التقدم. عند بدء خادم Ollama، يزيل الأجزاء المخزنة التي لا يشير إليها أي بيان نموذج. والجزء غير المكتمل الذي خلّفته عملية pull متوقفة يطابق هذه الحالة تماماً. لذلك يؤدي إعادة تشغيل الخدمة قبل إعادة المحاولة إلى حذف الجزء الذي نُزّل بالفعل. أعد محاولة pull أولاً، ثم أعد التشغيل لاحقاً. إذا كان يجب أن يبقى التنزيل غير المكتمل بعد إعادة التشغيل، فاضبط OLLAMA_NOPRUNE=1 في بيئة الخدمة، ثم أزله لاحقاً، لأن عملية التنظيف عند بدء التشغيل هي التي تمنع تراكم الأجزاء اليتيمة على القرص.

إذا توقفت pull مع no space left on device، فحرّر مساحة قبل إعادة المحاولة. إذا أبلغ df عن امتلاء القرص، ولم تفسّر قيمة du في دليل النموذج ذلك، فقد ذهبت المساحة إلى مكان آخر. اقرأ أسباب اختلاف ناتجي df وdu قبل حذف أي شيء.

أين يخزّن Ollama النماذج على VPS؟

اسأل خادمك بنفسك بدلاً من الوثوق بمسار وارد في أي دليل، بما في ذلك هذا الدليل. يختلف الموقع بين التثبيت باستخدام حزمة والتشغيل داخل حاوية، ويتغير مجدداً إذا ضبط أحدهم OLLAMA_MODELS.

systemctl cat ollama.service
getent passwd ollama
sudo find / -xdev -type d -name blobs 2>/dev/null

يطبع systemctl cat ملف الوحدة مع كل ملفات drop-in، لذلك يظهر فيه سطر OLLAMA_MODELS الذي ضبطته بنفسك أو أُدرج في صورتك. في غياب هذا السطر، يوجد مخزن النماذج ضمن الدليل الرئيسي للحساب الذي تعمل الخدمة باسمه، ويطبع getent passwd ذلك الدليل الرئيسي في الحقل السادس المفصول بنقطتين. يبحث find في نظام ملفات واحد عن الدليل blobs، وهو المكان الذي تُكتب فيه الطبقات فعلياً. احذف -xdev إذا كان من المحتمل أن تكون النماذج موجودة مسبقاً على mount منفصل.

قِس الآن، واقرأ الأرقام التي حصلت عليها بنفسك:

ollama list
df -h /
sudo du -sh /the/directory/you/found
sudo du -h -d1 /the/directory/you/found

يتكوّن المخزن من جزأين. يحتوي manifests على ملف صغير واحد لكل وسم نموذج، ويسرد ذلك الملف الطبقات التي بُني منها الوسم. ويحتوي blobs على الطبقات نفسها، وتُسمّى كل طبقة وفق hash محتواها، ويوجد معظم الحجم هناك. وبما أنّ الطبقات مشتركة بين الوسوم، فإن نموذجين مبنيين على الأوزان نفسها يبلّغ كل منهما عن حجمه الخاص في ollama list، مع أنّ هذه المساحة لا تُشغل إلا مرة واحدة على القرص. لذلك قد يتجاوز مجموع الأحجام المدرجة ما يبلّغه du عن الدليل.

تملأ ملفات النماذج نظام ملفات root صغيراً على VPS أسرع من أي شيء آخر يُحتمل أن تثبّته، وأكبر عامل منفرد يؤثر في حجمها هو تنسيق الأوزان. يستحق الاختيار بين q4 وq8 وfp16 عدة غيغابايت لكل نموذج.

نقل النماذج إلى وحدة تخزين بيانات باستخدام OLLAMA_MODELS

إذا كانت الخطة تتضمن قرصاً ثانياً أو وحدة تخزين بيانات أكبر، فانقل مخزن النماذج قبل امتلاء نظام الملفات الجذري. أوقف الخادم أولاً حتى لا تنسخ ملفاً ما يزال قيد الكتابة.

sudo systemctl stop ollama
sudo mkdir -p /mnt/data/ollama-models
sudo rsync -a /the/directory/you/found/ /mnt/data/ollama-models/
sudo chown -R ollama:ollama /mnt/data/ollama-models
sudo systemctl edit ollama.service

يفتح systemctl edit محرراً على ملف drop-in، لذلك تبقى الوحدة المضمّنة في الحزمة دون تعديل، ولا يمكن لترقية الحزمة استبدال تغييراتك. أضف السطرين التاليين:

[Service]
Environment="OLLAMA_MODELS=/mnt/data/ollama-models"
sudo systemctl daemon-reload
sudo systemctl restart ollama
systemctl show ollama --property=Environment
ollama list

يجب أن يطبع systemctl show مسارك الجديد، ويجب أن يعرض ollama list النماذج نفسها التي عرضها قبل النقل. تعني القائمة الفارغة أن الخادم لا يستطيع قراءة الدليل الجديد. تعمل الخدمة كمستخدم ollama، لذلك يحتاج هذا المستخدم إلى صلاحيات القراءة والكتابة على الوجهة. وهذا ما يوفّره السطر chown أعلاه. افحص journalctl -e -u ollama بحثاً عن أخطاء صلاحيات تذكر المسار الجديد. احذف النسخة القديمة فقط بعد التأكد من صحة القائمة، لأن فشل النقل ثم حذف المصدر يعني تنزيل كل شيء مرة أخرى.

الخيار الآخر يبقي على المسار الأصلي ويربط وحدة تخزين البيانات به:

echo '/mnt/data/ollama-models /the/directory/you/found none bind 0 0' | sudo tee -a /etc/fstab
sudo mount -a
findmnt /the/directory/you/found
df -h /

تعني طباعة findmnt لنقطة الربط أن الربط فعال. يفيد الربط mount عندما يتوقع شيء آخر على الخادم الموقع الافتراضي مسبقاً. لكن توجد نقطة مهمة: تبقى الملفات التي نسختها تحت نقطة الربط على القرص الجذري، وتحجبها نقطة الربط، لذلك لا تُستعاد المساحة حتى تلغي الربط وتحذف هذه الملفات. ويكون متغير البيئة أسهل الخيارين شرحاً لمن سيسجّل الدخول بعد ذلك.

بدلاً من ذلك، حيث يحتفظ بها الحاوي

تخزّن الصورة الرسمية النماذج في المسار الذي تربطه، وليس في أي مجلد على المضيف يخص مستخدماً من نوع ollama. أمر التشغيل الموثّق هو:

docker run -d -v ollama:/root/.ollama -p 11434:11434 --name ollama ollama/ollama

يمثّل ollama قبل النقطتين وحدة تخزين Docker مسمّاة، بينما يمثّل /root/.ollama المسار الذي يكتب فيه الخادم داخل الحاوي. لذلك لا يعثر du على شيء عند فحص المسارات المذكورة في القسم السابق، لأن الملفات ليست موجودة هناك. اطبع الموقع والحجم الفعليين:

docker volume inspect ollama
docker system df -v
docker exec -it ollama ollama list

اقرأ الحقل Mountpoint من docker volume inspect، ثم شغّل sudo du -sh عليه. لوضع النماذج على وحدة تخزين في المضيف، استبدل وحدة التخزين المسمّاة بمجلد على المضيف (-v /mnt/data/ollama:/root/.ollama)، ثم أعد إنشاء الحاوي. يكتب الحاوي بصفة root، لذلك يصبح مجلد المضيف مملوكاً لـroot. أما في Podman دون root، فتُربط المعرّفات بنطاق subuid الخاص بمستخدمك، ولذلك ستظهر ملكية المضيف بشكل مختلف أيضاً: يشرح تشغيل Ollama باستخدام Podman دون root عملية الربط هذه.

تنبيه بشأن التنظيف. يحذف docker volume prune كل وحدة تخزين لا يشير إليها أي حاوٍ. إذا حذفت حاوي ollama أو أعدت إنشاءها من دون وحدة التخزين، فسيحذف prune لاحقاً كل نموذج نزّلته، ولن تتمكن من استعادته إلا بإعادة تنزيله. اقرأ كيفية تنظيف استخدام Docker للقرص على VPS قبل تشغيل prune على خادم يستضيف نماذج.

إزالة نموذج باستخدام ollama rm، وليس باستخدام rm

ollama list
ollama rm gemma4
ollama list
df -h /

يحذف ollama rm البيان الخاص بهذه الوسمة، ثم يحذف الطبقات التي لا يشير إليها أي بيان متبقٍّ. تعود المساحة فور إلغاء ربط هذه الملفات، لذلك يتحرك df مباشرة. وبما أنّ الطبقات مشتركة، فقد تؤدي إزالة إحدى وسمتين مترابطتين ارتباطاً وثيقاً إلى تحرير مساحة أقل بكثير من الحجم الذي طبعه ollama list بجانبها. هذا سلوك صحيح، وليس فشلًا في الحذف.

يؤدي حذف الملفات يدوياً إلى كسر العلاقة بين المكوّنين. أزل blob باستخدام rm، فيبقى البيان يسرده، لذلك يستمر ollama list في عرض النموذج، ويفشل أيّ استخدام له عند قراءة الطبقة المفقودة. وإذا أزلت بياناً يدوياً، فتبقى طبقاته على القرص من دون مرجع إليها، وتشغل مساحة لا يعرضها لك أي أمر من أوامر Ollama. إذا كنت قد فعلت ذلك بالفعل، فإن ollama rm على الوسمة يزيل الإدخال المتبقي، كما تؤدي إعادة تشغيل الخادم إلى إزالة الطبقات التي لا يشير إليها شيء.

هناك تمييز أخير، لأن الخلط بين الأمرين شائع جداً. يتعلق ollama rm بالقرص. أما ollama stop gemma4 فيفرغ نموذجاً من الذاكرة ولا يحرر أي مساحة على القرص. وتُعد المدة التي يبقى فيها النموذج مقيماً في RAM بعد اكتمال التنزيل إعداداً منفصلاً، ويتناولها إبقاء النموذج محمّلاً بدلاً من إعادة تحميله مع كل طلب.

FAQ

ما الفرق بين ollama pull وollama run؟

ينزّل ollama pull نموذجاً إلى القرص ثم ينتهي. يتحقق ollama run من وجود النموذج على القرص، وينزّله إذا لم يكن موجوداً، ويحمله في الذاكرة، ثم يفتح جلسة محادثة تفاعلية. يكتب كلا الأمرين الملفات نفسها في الدليل نفسه. استخدم pull عند التجهيز وفي البرامج النصية، واستخدم run عندما يكون شخص أمام لوحة المفاتيح. يرسل ollama run <model> "your prompt" مطالبة واحدة ثم ينتهي، وهو الشكل القابل للبرمجة من run.

لماذا يبدو أن أول تشغيل لـollama run متوقف؟

إنه ينزّل النموذج. لا يمكن أن تظهر مطالبة المحادثة قبل حفظ النموذج على القرص وتحميله في الذاكرة، وحجم النموذج عدة غيغابايت. يعرض Ollama شريط التقدم فقط عندما يكون الإخراج موجهاً إلى طرفية، لذلك لا يعرض run داخل برنامج نصي أو مهمة cron أو ssh host ollama run ... أي شيء أثناء عمله. افتح جلسة ثانية وشغّل watch -n5 df -h /: يعني انخفاض المساحة الحرة على مراحل أن التنزيل قيد التقدم. نزّل النموذج مسبقاً، وبذلك يختفي الانتظار.

أين يخزّن Ollama نماذجه؟

يعتمد الموقع على طريقة التثبيت، لذلك اعرضه بدلاً من افتراضه. شغّل systemctl cat ollama.service لمعرفة ما إذا كان OLLAMA_MODELS مضبوطاً في الوحدة أو في ملف drop-in. إذا لم يكن مضبوطاً، فسيكون المخزن ضمن الدليل الرئيسي للحساب الذي تعمل الخدمة باسمه، ويعرض getent passwd ollama هذا الحساب. يحدد sudo find / -xdev -type d -name blobs 2>/dev/null دليل الطبقات مباشرة. بالنسبة إلى صورة الحاوية، يكون المخزن داخل وحدة التخزين المركّبة، ويعرض docker volume inspect ollama مسار Mountpoint على المضيف.

كيف أنقل نماذج Ollama إلى قرص آخر؟

أوقف الخدمة، وانسخ المخزن إلى الموقع الجديد باستخدام rsync -a، وامنح الدليل إلى حساب الخدمة باستخدام sudo chown -R ollama:ollama <directory>، ثم شغّل sudo systemctl edit ollama.service وأضف Environment="OLLAMA_MODELS=<directory>" تحت سطر [Service]. أعد التحميل باستخدام sudo systemctl daemon-reload ثم أعد التشغيل. تحقّق باستخدام systemctl show ollama --property=Environment وollama list. تعني القائمة الفارغة في معظم الحالات أن المستخدم ollama لا يستطيع قراءة الدليل الجديد؛ وسيعرض journalctl -e -u ollama المسار.

هل يؤدي حذف ملفات النموذج إلى تحرير المساحة؟

يحرر حذف الملفات يدوياً وحدات التخزين، لكنه يترك المخزن في حالة غير متسقة. إذا حذفت blob، فسيظل manifest يسرد ذلك النموذج، لذلك سيستمر ظهوره في ollama list ويفشل عند استخدامه. وإذا حذفت manifest، فستبقى طبقاته على القرص من دون أي مرجع إليها. استخدم ollama rm <model>، إذ يحذف manifest ثم الطبقات التي لا يحتاج إليها أي نموذج آخر. إذا حُذفت الملفات يدوياً من قبل، فشغّل ollama rm على الوسم لإزالة الإدخال، ثم أعد تشغيل الخادم، الذي يزيل الطبقات التي لا يشير إليها أي manifest.