SSD Nodes Learn Hosting plans →
Hướng dẫn Matt ConnorBởi Matt Connor · Cập nhật ngày 2026-08-22

ollama pull và run: model nằm ở đâu, cách di chuyển

ollama pull chỉ tải model rồi dừng, còn ollama run mở chat. Xem file nằm ở đâu, vì sao đầy ổ root VPS và cách chuyển sang disk khác.

ollama pull và ollama run

ollama pull tải model rồi dừng. ollama run chỉ tải model nếu model chưa có, sau đó nạp model vào memory và mở một phiên chat tương tác. Quá trình tải là giống nhau và các file được lưu cùng một nơi. Chỉ run tiếp tục chạy sau đó.

Chỉ một khác biệt này đã quyết định lệnh nào phù hợp để dùng trong script và lệnh nào phù hợp khi thao tác trực tiếp trên terminal.

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

Dòng đầu tiên tải model rồi thoát, nên an toàn khi dùng trong quá trình provisioning và trong một systemd unit. Dòng thứ hai mở một phiên chat; nhập /bye hoặc nhấn Ctrl+D để thoát. Dòng thứ ba gửi một prompt duy nhất, in câu trả lời rồi thoát. Đây là dạng script cần khi chỉ cần câu trả lời thay vì một phiên tương tác. Dạng thứ ba vẫn để model tự quyết định độ dài câu trả lời. Vì vậy, một câu hỏi chỉ có một dòng vẫn có thể trả về ba đoạn văn. Giới hạn câu trả lời bằng num_predict là cách giữ run trong giới hạn kích thước mà tiến trình gọi có thể sử dụng thực tế. Tên model thay đổi nhanh, nên hãy xem gemma4 ở đây là placeholder. Đây là ví dụ được tài liệu Ollama chính thức sử dụng vào tháng 8 năm 2026, và mọi tag trong library đều hoạt động theo cùng cách. Nếu muốn thay bằng một model đã được sizing dựa trên một server thực tế, chạy Nemotron 3.5 Lightning trên VPS sẽ cung cấp tag chính xác cần pull và dung lượng memory model yêu cầu.

Vì sao lần chạy ollama đầu tiên trông như bị treo

Lần run đầu tiên trên một VPS mới có thể không hiển thị gì trong vài phút. Không có gì bị hỏng. Prompt chat chỉ xuất hiện sau khi model đã được tải xuống disk và nạp vào memory, vì vậy run đang tải xuống nhiều gigabyte trước khi có thể hiển thị thông tin cho bạn.

Có 2 yếu tố che khuất quá trình này. Ollama chỉ hiển thị progress bar khi output là một terminal, vì vậy run trong shell script, cron job, CI step hoặc một ssh host ollama run ... thông thường sẽ hoàn toàn không in gì trong lúc tải xuống. Sau khi các byte đã được tải xong, file vẫn phải được đọc từ disk vào RAM trước khi token đầu tiên xuất hiện. Trên VPS nhỏ, quá trình đọc này chậm. Nếu máy không đủ memory cho model, kernel bắt đầu dùng swap và thời gian chờ tăng lên đáng kể.

Hãy theo dõi từ session thứ 2 thay vì đoán:

df -h /
watch -n5 df -h /

Dung lượng trống giảm theo từng bước nghĩa là quá trình tải xuống vẫn đang chạy. Nếu dung lượng trống không giảm nữa trong khi command vẫn đang bận, nghĩa là quá trình tải xuống đã hoàn tất và model đang được nạp vào memory.

Đây là lý do nên pull model từ trước. Người gõ ollama run không nên là người phải chờ tải xuống.

Tải model trước khi có request

Điều này cũng áp dụng cho mọi thứ không phải con người: một coding agent trỏ đến Ollama endpoint của bạn thường sẽ bỏ cuộc ngay ở request đầu tiên thay vì chờ một lượt tải xuống vài GB. Trên một máy mới, hãy pull model trong cùng script cài server:

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

Nếu bạn đang dựng server lần đầu, hướng dẫn cài đặt đầy đủ Ollama trên VPS bao quát chính service và các đối tượng được phép truy cập service đó. Sau đó, việc đáng làm là thiết lập một lượt pull vẫn tiếp tục sau khi terminal bị đóng, vì một lượt tải bị dừng giữa chừng thường khiến model store chỉ được tạo dở dang.

Chạy lệnh trong tmux hoặc giao cho systemd dưới dạng one-shot unit chạy khi boot. Ghi /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

Cả hai lệnh đều chạy thông qua /bin/sh -c một cách có chủ đích. Một ExecStart= độc lập cần absolute path, nhưng installer không phải lúc nào cũng đặt binary trong cùng một thư mục. Vì vậy, command -v ollama trên chính máy của bạn là câu trả lời đáng tin cậy duy nhất. Chạy thông qua shell sẽ dùng PATH của service thay vì một path sao chép từ guide. ExecStart đầu tiên cũng quan trọng: After=ollama.service chỉ có nghĩa là server unit đã được start, không có nghĩa server đã sẵn sàng. Vì vậy, loop sẽ chờ đến khi ollama list trả lời rồi mới bắt đầu pull.

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

Journal phải cho thấy lượt pull đã hoàn tất mà không có lỗi, sau đó ollama list phải hiển thị model. Để giữ một tag luôn cập nhật, hãy thêm systemd timer hoặc một cron entry chạy hằng tuần với cùng lệnh pull. Khi pull lại một tag đã thay đổi, Ollama sẽ tải các layer mới và để lại các layer cũ không còn được tham chiếu. Các layer đó sẽ được dọn vào lần server khởi động tiếp theo.

Điều gì xảy ra khi pull bị gián đoạn

Mỗi layer của model được lưu dưới hash của chính nội dung layer đó. Vì vậy, pull bị gián đoạn không làm mất phần đã tải: chạy lại cùng ollama pull, các layer đã hoàn tất sẽ được nhận diện và bỏ qua, rồi quá trình download tiếp tục từ layer bị gián đoạn.

Có một thao tác sẽ xóa phần tiến trình đó. Khi Ollama server khởi động, nó xóa các layer đã lưu nhưng không được model manifest nào tham chiếu. Layer chưa hoàn tất do một pull bị dừng chính là loại layer này. Vì vậy, nếu restart service trước khi thử lại, bạn sẽ mất phần đã download. Hãy retry pull trước, rồi mới restart. Nếu partial download thực sự phải được giữ lại sau khi restart, hãy đặt OLLAMA_NOPRUNE=1 trong môi trường của service, sau đó xóa thiết lập này đi, vì cơ chế cleanup khi khởi động đó ngăn các layer mồ côi tích tụ trên disk.

Nếu pull dừng với no space left on device, hãy giải phóng dung lượng trước khi retry. Nếu df báo disk đầy nhưng du trong model directory không giải thích được dung lượng đó, phần dung lượng đã được sử dụng ở nơi khác. Hãy đọc các lý do khiến df và du cho kết quả khác nhau trước khi xóa bất kỳ thứ gì.

Ollama lưu model ở đâu trên VPS?

Hãy hỏi chính máy của bạn thay vì tin vào một đường dẫn trong bất kỳ hướng dẫn nào, kể cả hướng dẫn này. Vị trí lưu khác nhau giữa cài đặt bằng package và container. Vị trí này cũng thay đổi nếu ai đó đã đặt OLLAMA_MODELS.

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

systemctl cat in unit file cùng với mọi drop-in. Vì vậy, dòng OLLAMA_MODELS do bạn đặt hoặc được tích hợp sẵn trong image sẽ xuất hiện ở đó. Nếu không có dòng này, store nằm trong home directory của account chạy service. getent passwd in home directory đó tại trường thứ sáu, được phân tách bằng dấu hai chấm. find tìm trong một filesystem directory blobs. Đây là nơi các layer thực sự được ghi. Bỏ -xdev nếu model có thể đã nằm trên một mount riêng.

Bây giờ hãy đo dung lượng và đọc các số liệu của chính bạn:

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

Store có 2 phần. manifests chứa một file nhỏ cho mỗi model tag. File đó liệt kê các layer tạo nên tag. blobs chứa chính các layer. Tên mỗi layer là hash của nội dung và gần như toàn bộ dung lượng nằm ở đây. Các layer được dùng chung giữa nhiều tag. Vì vậy, 2 model dùng chung weight sẽ báo kích thước riêng trong ollama list nhưng chỉ chiếm dung lượng một lần trên disk. Do đó, tổng các kích thước được liệt kê có thể lớn hơn dung lượng thư mục mà du báo.

Các file model có thể làm đầy root filesystem nhỏ của VPS nhanh hơn hầu hết những thứ khác bạn có thể cài đặt. Yếu tố ảnh hưởng lớn nhất đến dung lượng là định dạng weight. Chọn giữa q4, q8 và fp16 có thể tiết kiệm hàng gigabyte cho mỗi model.

Di chuyển model sang data volume bằng OLLAMA_MODELS

Nếu hệ thống có disk thứ hai hoặc data volume lớn hơn, hãy di chuyển thư mục lưu trữ trước khi filesystem root đầy. Trước tiên hãy stop server để không copy file vẫn đang được ghi.

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 sẽ mở editor cho file drop-in, nhờ đó unit do package cung cấp vẫn được giữ nguyên và package upgrade không thể ghi đè thay đổi của bạn. Thêm 2 dòng sau:

[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 phải in ra path mới, còn ollama list phải hiển thị đúng các model như trước khi di chuyển. Danh sách trống nghĩa là server không đọc được thư mục mới. Service chạy dưới user ollama, nên user này cần quyền đọc và ghi vào thư mục đích. Dòng chown ở trên thực hiện việc đó. Kiểm tra journalctl -e -u ollama để tìm các lỗi permission có ghi path mới. Chỉ xóa bản copy cũ sau khi danh sách đã chính xác. Nếu di chuyển thất bại nhưng source đã bị xóa, bạn sẽ phải tải lại toàn bộ.

Cách còn lại giữ nguyên path ban đầu và mount data volume vào path đó:

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 in ra mount nghĩa là bind mount đang hoạt động. Bind mount phù hợp khi có thành phần khác trên máy đã trông chờ vị trí mặc định. Cách này có một điểm cần lưu ý: các file bạn đã copy vẫn nằm dưới mount point trên root disk, nhưng bị mount che khuất. Do đó dung lượng chỉ được trả lại sau khi unmount và xóa các file đó. Biến môi trường là cách dễ giải thích hơn cho người đăng nhập vào máy sau này.

Nơi container lưu chúng

Image chính thức lưu model vào nơi bạn mount, không lưu trong thư mục nào trên host thuộc về user ollama. Lệnh chạy được tài liệu hóa là:

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

ollama ở trước dấu hai chấm là một Docker volume có tên, còn /root/.ollama là nơi server ghi dữ liệu bên trong container. Vì vậy, chạy du với các path ở phần trước sẽ không tìm thấy gì, vì không có dữ liệu nào ở đó. In vị trí và kích thước thực tế:

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

Đọc trường Mountpoint từ docker volume inspect, sau đó chạy sudo du -sh với giá trị đó. Để lưu model trên data volume, thay named volume bằng một thư mục trên host (-v /mnt/data/ollama:/root/.ollama) rồi tạo lại container. Container ghi dữ liệu bằng root, nên thư mục đó trên host sẽ thuộc sở hữu của root. Với rootless Podman, các ID được ánh xạ vào dải subuid của user của bạn, nên ownership trên host lại có biểu hiện khác: chạy Ollama với rootless Podman giải thích cách ánh xạ này.

Có một cảnh báo về việc dọn dẹp. docker volume prune xóa mọi volume không được container nào tham chiếu. Nếu bạn xóa hoặc tạo lại container ollama mà không giữ volume, một lần prune sau đó sẽ xóa toàn bộ model đã tải xuống và không thể khôi phục, trừ việc tải lại chúng. Đọc cách prune dung lượng đĩa Docker trên VPS trước khi chạy prune trên máy đang lưu model.

Xóa model bằng ollama rm, không dùng rm

ollama list
ollama rm gemma4
ollama list
df -h /

ollama rm xóa manifest của tag đó, sau đó xóa các layer không còn manifest nào tham chiếu đến. Dung lượng được giải phóng ngay khi các file đó bị unlink, nên df cập nhật ngay. Vì các layer được dùng chung, xóa một trong hai tag có liên quan chặt chẽ có thể giải phóng ít hơn nhiều so với kích thước ollama list hiển thị bên cạnh tag đó. Đây là hành vi đúng, không phải thao tác xóa bị lỗi.

Xóa file thủ công sẽ làm hỏng cặp này. Xóa một blob bằng rm nhưng manifest vẫn liệt kê blob đó, nên ollama list vẫn hiển thị model và mọi lần cố sử dụng model đều thất bại khi đọc layer bị thiếu. Xóa manifest thủ công khiến các layer của nó vẫn nằm trên disk nhưng không còn gì trỏ đến chúng, tiếp tục chiếm dung lượng mà không lệnh Ollama nào báo cho bạn. Nếu bạn đã làm vậy, ollama rm trên tag đó để xóa entry còn sót lại, sau đó restart server để xóa các layer không còn được tham chiếu.

Còn một điểm khác biệt cần lưu ý vì hai việc này thường bị nhầm lẫn. ollama rm liên quan đến disk. ollama stop gemma4 unload model khỏi memory và không giải phóng dung lượng disk. Thời gian model tiếp tục nằm trong RAM sau khi download xong là một setting riêng; giữ model đã load thay vì load lại ở mỗi request trình bày về setting này.

FAQ

Sự khác nhau giữa ollama pull và ollama run là gì?

ollama pull tải model xuống disk rồi thoát. ollama run kiểm tra model đã có trên disk chưa, tải xuống nếu chưa có, nạp model vào memory rồi mở phiên chat tương tác. Cả hai đều ghi cùng các file vào cùng một thư mục. Dùng pull khi provisioning và trong script, dùng run khi có người đang trực tiếp thao tác trên terminal. ollama run <model> "your prompt" gửi một prompt rồi thoát; đây là dạng có thể dùng trong script của run.

Vì sao lần đầu chạy ollama run có vẻ bị treo?

Ollama đang tải xuống. Prompt chat chỉ xuất hiện sau khi model đã được lưu trên disk và nạp vào memory. Một model có thể có dung lượng vài gigabyte. Ollama chỉ hiển thị progress bar khi output là terminal, nên run trong script, cron job hoặc ssh host ollama run ... sẽ không hiển thị gì trong lúc đang chạy. Mở session thứ hai và chạy watch -n5 df -h /: nếu dung lượng trống giảm theo từng bước thì quá trình tải đang diễn ra. Tải model trước thì không phải chờ lúc chạy.

Ollama lưu model ở đâu?

Vị trí lưu phụ thuộc vào cách cài đặt, vì vậy hãy in ra thay vì tự đoán. Chạy systemctl cat ollama.service để xem OLLAMA_MODELS có được đặt trong unit hoặc drop-in hay không. Nếu chưa được đặt, store nằm trong home directory của account chạy service; getent passwd ollama sẽ in ra account đó. sudo find / -xdev -type d -name blobs 2>/dev/null định vị trực tiếp thư mục layer. Với container image, store nằm trong volume đã mount, và docker volume inspect ollama sẽ in ra Mountpoint trên host.

Làm cách nào để chuyển model của Ollama sang disk khác?

Dừng service, dùng rsync -a để copy store sang vị trí mới, cấp quyền sở hữu thư mục cho service account bằng sudo chown -R ollama:ollama <directory>, sau đó chạy sudo systemctl edit ollama.service và thêm Environment="OLLAMA_MODELS=<directory>" bên dưới dòng [Service]. Reload bằng sudo systemctl daemon-reload rồi restart. Xác nhận bằng systemctl show ollama --property=Environment và ollama list. Danh sách trống gần như luôn có nghĩa là user ollama không thể đọc thư mục mới; journalctl -e -u ollama sẽ cho biết đường dẫn.

Xóa file model có giải phóng dung lượng không?

Xóa file thủ công sẽ giải phóng dung lượng nhưng khiến store không nhất quán. Xóa một blob nhưng manifest vẫn liệt kê model đó, nên model vẫn xuất hiện trong ollama list và bị lỗi khi sử dụng. Xóa một manifest nhưng các layer tương ứng vẫn còn trên disk mà không có gì tham chiếu đến chúng. Hãy dùng ollama rm <model>; lệnh này xóa manifest rồi xóa các layer không còn model nào khác cần. Nếu file đã bị xóa thủ công, chạy ollama rm trên tag để xóa entry, sau đó restart server. Server sẽ xóa các layer không được manifest nào tham chiếu.