SSD Nodes Learn 🎉 VPS từ $5.50/tháng
Hướng dẫn Matt ConnorBởi Matt Connor

Ollama pull vs run: Model nằm ở đâu, chuyển thế nào?

ollama pull tải model rồi dừng, còn ollama run tải và mở chat. Xem vị trí file, lỗi đầy disk root trên VPS và cách chuyển model sang disk khác.

so sánh ollama pull với ollama run

ollama pull tải model xuống rồi dừng. ollama run chỉ tải model nếu model chưa tồn tại, sau đó nạp model vào memory và mở phiên chat tương tác. Quá trình tải là giống nhau và các file được lưu vào cùng một vị trí. 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 trong script và lệnh nào phù hợp khi thao tác trực tiếp tại terminal.

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

Dòng đầu tiên tải model xuống rồi thoát, nên an toàn khi dùng trong quá trình provision và trong 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. Tên model thay đổi nhanh, nên xem gemma4 trong phần này là placeholder: đây là ví dụ được tài liệu Ollama chính thức sử dụng tính đến tháng 8 năm 2026, và mọi tag trong thư viện đều hoạt động theo cách tương tự.

Vì sao lần chạy ollama đầu tiên có vẻ 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ưa thể xuất hiện cho đến khi model được tải xuống disk và nạp vào memory, vì vậy run đang tải xuống một file có kích thước vài GB trước khi có thể hiển thị bất kỳ thông tin nào.

Có hai nguyên nhân khiến quá trình này không hiển thị. Ollama chỉ vẽ progress bar khi output là một terminal, nên run bên trong shell script, cron job, bước CI hoặc một ssh host ollama run ... thông thường sẽ không in gì trong suốt quá trình tải xuống. Sau khi các byte đã được ghi xuống disk, 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ỏ, thao tác đọc này chậm. Nếu máy không đủ memory cho model, kernel sẽ bắt đầu swap và thời gian chờ sẽ dài hơn nhiều.

Hãy theo dõi từ một session thứ hai thay vì phỏng đ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 ngừng giảm trong khi command vẫn đang bận, nghĩa là quá trình tải xuống đã hoàn tất và việc nạp model vào memory đã bắt đầu.

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

Pull model trước khi có người yêu cầu

Trên một máy mới, hãy pull model bằng chính script đã cài server:

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

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

Chạy lệnh bên trong tmux, hoặc giao cho systemd dưới dạng one-shot unit chạy lúc boot. Ghi nội dung sau vào /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 qua /bin/sh -c có chủ đích. ExecStart= không kèm đường dẫn tuyệt đối sẽ không chạy được, còn installer không phải lúc nào cũng đặt binary vào 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ách xác định đáng tin cậy duy nhất. Chạy qua shell sẽ dùng PATH của service thay vì một đường dẫn sao chép từ hướng dẫn. ExecStart đầu tiên cũng quan trọng: After=ollama.service chỉ cho biết server unit đã được khởi động, không có nghĩa là server đã sẵn sàng. Vì vậy, vòng lặp sẽ chờ đến khi ollama list phản hồ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 pull hoàn tất mà không có lỗi, sau đó ollama list phải hiển thị model. Để giữ một tag thay đổi luôn được cập nhật, hãy thêm systemd timer hoặc 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 dẹp 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 toàn bộ phần đã tải: chạy lại cùng ollama pull, các layer đã tải xong sẽ được nhận diện và bỏ qua, nên quá trình tải 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 mà không có model manifest nào tham chiếu đến. Partial layer do một pull bị dừng đột ngột để lại chính là loại layer đó. Vì vậy, nếu restart service trước khi thử lại, bạn sẽ mất phần đã tải xuống. 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 biến này đi, vì bước cleanup khi khởi động là cơ chế 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 thử lại. Nếu df báo disk đầy nhưng du trên 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 không khớp nhau trước khi xóa bất kỳ thứ gì.

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

Hãy kiểm tra trực tiếp trên 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, đồng thời thay đổi nếu có ai đó đã thiết lập 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 thiết lập 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, kho lưu trữ nằm trong home directory của account mà service chạy dưới quyền account đó, và getent passwd in home directory này trong trường thứ sáu, được phân tách bằng dấu hai chấm. find tìm trên một filesystem thư mục blobs, 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 trên chính máy của bạn:

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

Kho lưu trữ có 2 phần. manifests chứa một file nhỏ cho mỗi model tag; file này liệt kê các layer mà tag đó được tạo từ. blobs chứa các layer, mỗi layer được đặt tên theo hash của nội dung, và gần như toàn bộ dung lượng nằm ở đây. Vì các layer được dùng chung giữa các tag, 2 model được tạo từ cùng một bộ weight vẫn báo dung lượng riêng trong ollama list, nhưng trên disk phần dung lượng đó chỉ được sử dụng một lần. Vì vậy, tổng các dung lượng được liệt kê có thể lớn hơn dung lượng mà du báo cho directory.

File model làm đầy root filesystem của một VPS nhanh hơn hầu hết mọi thứ khác mà bạn có thể cài đặt, và 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 vài gigabyte cho mỗi model.

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

Nếu kế hoạch có thêm disk hoặc một data volume lớn hơn, hãy di chuyển kho lưu trữ trước khi filesystem root đầy. Trước tiên hãy dừng server để không copy một 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 mở editor cho file drop-in, vì vậy unit do package cung cấp vẫn không bị thay đổi 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 directory mới. Service chạy dưới user ollama, nên user này cần quyền đọc và ghi vào đí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ó chứa path mới. Chỉ xóa bản copy cũ sau khi danh sách đã chính xác, vì nếu move 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 cho biết bind đã hoạt động. Bind mount phù hợp khi trên máy đã có thành phần khác đang chờ location 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 disk root và bị mount che khuất, nên dung lượng chưa được trả lại cho đến khi unmount rồi xóa chúng. Trong 2 cách, 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ơ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 bất kỳ thư mục nào trên host thuộc về người dùng 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 trên các đường dẫn ở phần trước sẽ không tìm thấy gì, vì dữ liệu không nằm ở đó. In vị trí và dung lượng 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, rồi chạy sudo du -sh trên 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 với quyền 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 người dùng, nên quyền sở hữu trên host sẽ lại khác: chạy Ollama với rootless Podman giải thích cách ánh xạ này.

Lưu ý 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 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 bạn đã tải xuống và không thể khôi phục, trừ việc tải lại. Đọc cách dọn dung lượng 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 mà 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 lập tức. 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 dung lượng 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 thất bại.

Xóa file thủ công sẽ phá vỡ 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 sử dụng model đều thất bại khi hệ thống đọc layer bị thiếu. Xóa manifest thủ công thì các layer 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 sẽ xóa entry còn sót lại, còn việc khởi động lại server sẽ 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 nói rõ 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 nào. 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 sau mỗi request sẽ giải thích phần này.

FAQ

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 ghi cùng các file vào cùng một thư mục. Dùng pull khi provision và trong script, còn 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.

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

Ollama đang tải model xuống. Prompt chat không thể xuất hiện trước khi model được lưu trên disk và nạp vào memory. Một model có thể chiếm vài gigabyte. Ollama chỉ hiển thị progress bar khi output là terminal, nên run chạy trong script, cron job hoặc ssh host ollama run ... sẽ hoàn toàn không hiển thị gì trong lúc đang chạy. Mở một 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ì model đang được tải xuống. Pull model trước sẽ loại bỏ thời gian chờ nà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ì đoán. Chạy systemctl cat ollama.service để kiểm tra OLLAMA_MODELS có được đặt trong unit hoặc drop-in hay không. Nếu không được đặt, store nằm dưới home directory của account chạy service; dùng getent passwd ollama để in ra đường dẫn này. sudo find / -xdev -type d -name blobs 2>/dev/null định vị trực tiếp layer directory. Với container image, store nằm trong volume được mount, còn docker volume inspect ollama in ra Mountpoint trên host.

Làm thế nào để chuyển model 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 service. Xác nhận bằng systemctl show ollama --property=Environmentollama 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ẽ hiển thị đường dẫn gây lỗi.

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. Nếu xóa một blob, manifest vẫn liệt kê model đó, nên model vẫn xuất hiện trong ollama list và sẽ lỗi khi sử dụng. Nếu xóa manifest, các layer của model vẫn nằm trên disk nhưng không còn tham chiếu đến chúng. Hãy dùng ollama rm <model>. Lệnh này xóa manifest, sau đó xóa các layer mà không 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, rồi restart server. Server sẽ xóa các layer không còn được manifest nào tham chiếu.