Điểm:1

Hiển thị thông báo cho người dùng trong khi cài đặt Debian chèn sẵn không giám sát

lá cờ tr

trong thời gian trễ_command bước cài đặt không giám sát, tôi đang chạy tập lệnh shell:

d-i preseed/late_command chuỗi trong mục tiêu /bin/sh -c './execute-script.sh'

Khi đến bước late_command, giao diện người dùng (nền xanh lam, cửa sổ xám) hiển thị thông báo "Đang chèn sẵn...":

nhập mô tả hình ảnh ở đây

Tôi tự hỏi liệu có cách nào để hiển thị sống động các thông báo khác dựa trên những gì thực thi-script.sh đang làm.

Tôi ngây thơ nghĩ rằng sử dụng STDOUT thông thường với tiếng vang sẽ thực hiện thủ thuật nhưng có vẻ phức tạp hơn.

Các tìm kiếm của tôi cho đến nay đã thu hút sự chú ý của tôi về khả năng sử dụng gỡ lỗi nhưng tôi đã không thể tìm thấy bất kỳ cách nào.

Phiên bản hiện tại của tập lệnh của tôi được định hình lại theo câu trả lời của @Andrew:

#!/bin/sh

. /usr/share/debconf/confmodule
. "./variables.sh"

logFile="/target${INSTALLATION_LOG_LOCATION}"
templatePath="/target/tmp/deployment_progress_tracker.templates"

con mèo > "${templatePath}" << 'EOF'
Bản mẫu: triển khai_progress_tracker/tiến trình/dự phòng
Loại: văn bản
Mô tả: ${STEP}...
EOF

debconf-loadtemplate Deploy_progress_tracker "${templatePath}"
db_progress START 0 1 Deploy_progress_tracker/progress

nhật ký đồng hồ () {
  triển khaiDone=false
  trong khi ! $triển khaiXong
  làm
    nếu [ -f "${logFile}" ]; sau đó
      step=$(grep -E -o -a -h "Progress-step: .*" "${logFile}" | tail -1 | sed 's/Progress-step://')
      nếu [ -z "${bước##*$DEPLOYMENT_FINISHED*}" ]; sau đó
        triển khaiDone=true
      yêu tinh [ -n "${bước}" ]; sau đó
        db_subst Deploy_progress_tracker/progress/fallback BƯỚC "${step}"
        db_progress THÔNG TIN triển khai_progress_tracker/progress/dự phòng
      fi
    fi
    ngủ 3
  xong
}



(
  nhật ký xem;
  rm -f "${templatePath}";
  db_progress BỘ 1;
  ngủ 1;
  db_progress DỪNG LẠI;
  db_unregister Deploy_progress_tracker/progress;
) &

Kịch bản trước đó sẽ dẫn đến kết quả như sau:

nhập mô tả hình ảnh ở đây

Và dẫn trở lại menu trình cài đặt (chọn Kết thúc cài đặt sẽ thực sự chạy lại phần được chèn sẵn và không thành công, việc chọn Hủy bỏ sẽ không ngắt kết nối ISO và khởi động lại, dù sao đi nữa, tôi đang cố gắng để cả quá trình ngắt kết nối và khởi động lại được thực hiện tự động):

nhập mô tả hình ảnh ở đây

Điểm:2
lá cờ es

Bạn sẽ bị giới hạn bởi gỡ lỗi và nó có thể không đáng để nỗ lực. Tôi không nghĩ rằng bạn sẽ có thể làm điều đó với một tập lệnh chạy trong mục tiêu. Tôi đã thành công khi sử dụng đoạn mã và đoạn mã chèn sẵn sau đây với Debian Buster. Nó thay đổi văn bản nơi Chạy Preseed... được hiển thị ba lần. Nó sẽ hiển thị

  1. Bước A
  2. Bước B
  3. Đang chạy c... (tùy chọn "dự phòng")

Tệp được chèn sẵn một phần để tải xuống và chạy tập lệnh.

d-i preseed/late_command chuỗi \
  wget -P /run http://REDACTED/my_script.sh ; \
  chmod 755 /run/my_script.sh; \
  /run/my_script.sh

nội dung của my_script.sh.

#!/bin/sh

. /usr/share/debconf/confmodule

đặt -e

# tạo một tệp mẫu với các chuỗi để debconf hiển thị
con mèo > /run/my_script.templates << 'EOF'
Bản mẫu: my_script/progress/a
Loại: văn bản
Mô tả: Bước A

Bản mẫu: my_script/progress/b
Loại: văn bản
Mô tả: Bước B

Bản mẫu: my_script/progress/fallback
Loại: văn bản
Mô tả: Đang chạy ${STEP}...
EOF

# sử dụng tiện ích để tải tệp mẫu đã tạo
debconf-loadtemplate my_script /run/my_script.templates

# tạm dừng chỉ để hiển thị "Chạy Preseed..."
ngủ 2

# foreach 3 bước cho debconf biết chuỗi mẫu nào sẽ hiển thị
cho bước trong a b c; làm

    nếu ! db_progress THÔNG TIN my_script/progress/$step; sau đó
        db_subst my_script/progress/fallback BƯỚC "$step"
        db_progress THÔNG TIN my_script/progress/dự phòng
    fi

    trường hợp $bước vào
        "một")
            # chạy các lệnh hoặc tập lệnh trong môi trường trình cài đặt (điều này sử dụng lệnh ngủ trong môi trường trình cài đặt)
            ngủ 10
            ;;
        "b")
            # chạy các lệnh hoặc tập lệnh trong môi trường chroot (điều này sử dụng lệnh ngủ từ hệ thống đã cài đặt)
            giấc ngủ đúng mục tiêu 10
            ;;
        "c")
            # chỉ là một bước mẫu khác
            ngủ 10
            ;;
    thoát hiểm
xong

Tập lệnh và tệp mẫu được tạo dựa trên kết thúc cài đặt (trình cài đặt debian bưu kiện) kịch bảnmẫu.

Bil5 avatar
lá cờ tr
Cảm ơn vì ý tưởng tuyệt vời, dựa trên ý tưởng đó, tại sao những điều sau đây không hoạt động? `d-i preseed/late_command string /bin/sh logs-observer.sh &; trong mục tiêu --pass-stdout /bin/sh -c './my-target-script.sh > outputlog'` - `myscript.sh` sẽ lặp lại các bước khác nhau a, b, c... chúng sẽ được lưu vào `outputlog` - `logs-observer.sh` sẽ chạy một vòng lặp vô hạn (cho đến khi anh ấy đọc "DONE") và đọc bước cuối cùng được viết trong `outputlog` "được chia sẻ" và cập nhật thông báo tương ứng. Tất nhiên, các bước sẽ được xác định trước trong `logs-observer.sh`, tương tự như bạn đã làm trong tệp `my-script.sh` của mình.
Andrew Lowther avatar
lá cờ es
@Bil5 có thể hoạt động nhưng nghe có vẻ rất phức tạp. Tôi sẽ có lệnh gọi tập lệnh `logs-observer.sh` `in-target ./my-target-script.sh` bên trong nó. `in-target` chỉ đơn giản là một tập lệnh trong môi trường trình cài đặt bao bọc một lệnh bên trong một số thiết lập chroot. Nó có thể được gọi từ tập lệnh của bạn và không nhất thiết phải được gọi là thư mục từ `late_command`
Bil5 avatar
lá cờ tr
đề xuất của bạn hoạt động hoàn hảo, cảm ơn rất nhiều, tuy nhiên, làm theo cách bạn đã nói (`in-target ./my-target-script.sh` và từ đó gọi `/bin/sh logs-observer.sh`), tôi không thể để làm cho bất kỳ lệnh `db_progress INFO` nào hoạt động khi gọi nó trực tiếp từ `logs-observer.sh` (tất nhiên là có nguồn `confmodule` & đã tạo mẫu trước đó). Cách duy nhất tôi tìm thấy là thực hiện trực tiếp từ `my-target-script.sh`, và do đó, cả hai tập lệnh phải giao tiếp với nhau và tệp nhật ký là cách duy nhất tôi tìm thấy. Bất cứ suy nghĩ nào?
Andrew Lowther avatar
lá cờ es
Tôi đoán nó phụ thuộc vào mức độ cụ thể mà bạn muốn cập nhật giao diện người dùng. Tôi đã thêm vào tập lệnh mẫu để cho biết cách tập lệnh có thể cập nhật giao diện người dùng và sau đó chạy lệnh hoặc tập lệnh. Điều này bao gồm khả năng chạy lệnh hoặc tập lệnh `trong-mục tiêu`. Giao diện người dùng chỉ có thể được cập nhật lại sau khi lệnh hoặc tập lệnh kết thúc.
Bil5 avatar
lá cờ tr
Tôi có thể xác nhận rằng cách này hoạt động tốt và tôi đã tìm ra cách gọi mọi lệnh debconf từ tập lệnh trình cài đặt. Bây giờ tôi đang đối mặt với một vấn đề khó khăn khác, sau khi tôi hoàn thành tập lệnh, thay vì tự động thoát khỏi trình cài đặt, đẩy đĩa cdrom ra và khởi động lại (như được định cấu hình trong phần chèn sẵn và được kiểm tra thành công trước công cụ gỡ lỗi), nó quay lại trình cài đặt menu và không cho phép khởi động lại đơn giản mà không khởi chạy lại cài đặt. Tôi nhận thấy thông báo này trong nhật ký hệ thống: `Mục menu 'cài đặt xong' đã thành công nhưng yêu cầu không được định cấu hình`
Bil5 avatar
lá cờ tr
Tôi đã thêm phiên bản hiện tại của tập lệnh mà tôi đang dùng thử trong nhận xét đầu tiên của mình để chúng ta có thể thảo luận về nó.
Bil5 avatar
lá cờ tr
Sau khi phản ánh, nó có thể nằm ngoài phạm vi câu hỏi ban đầu của tôi, ở đây tôi muốn xem một số thông báo trong trình cài đặt và nhờ câu trả lời của bạn, nó hoạt động. Tạo một chủ đề khác cho mối quan tâm mới của tôi nghe có vẻ sạch hơn. Cám ơn bạn một lần nữa. https://serverfault.com/questions/1074794/debian-installer-wont-exit-after-preseeded-installation

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.