@@ -293,9 +293,6 @@ log() { echo "[init] $*"; }
293293KATANA_PID=""
294294KATANA_DB_DIR="/mnt/data/katana-db"
295295SHUTTING_DOWN=0
296- KATANA_EXIT_CODE="never"
297- CONTROL_PORT_NAME="org.katana.control.0"
298- CONTROL_PORT_LINK="/dev/virtio-ports/org.katana.control.0"
299296
300297fatal_boot() {
301298 log "ERROR: $*"
@@ -306,90 +303,6 @@ fatal_boot() {
306303 done
307304}
308305
309- refresh_katana_state() {
310- if [ -n "$KATANA_PID" ] && ! kill -0 "$KATANA_PID" 2>/dev/null; then
311- if wait "$KATANA_PID"; then
312- KATANA_EXIT_CODE=0
313- else
314- KATANA_EXIT_CODE=$?
315- fi
316- log "Katana exited with code $KATANA_EXIT_CODE"
317- KATANA_PID=""
318- fi
319- }
320-
321- respond_control() {
322- printf '%s\n' "$1" >&3 2>/dev/null || true
323- }
324-
325- resolve_control_port() {
326- mkdir -p /dev/virtio-ports
327- for name_file in /sys/class/virtio-ports/*/name; do
328- [ -f "$name_file" ] || continue
329-
330- PORT_NAME_VALUE="$(cat "$name_file" 2>/dev/null || true)"
331- if [ "$PORT_NAME_VALUE" != "$CONTROL_PORT_NAME" ]; then
332- continue
333- fi
334-
335- PORT_DIR="${name_file%/name}"
336- PORT_DEV="/dev/${PORT_DIR##*/}"
337- if [ -e "$PORT_DEV" ]; then
338- ln -sf "$PORT_DEV" "$CONTROL_PORT_LINK"
339- echo "$CONTROL_PORT_LINK"
340- return 0
341- fi
342- done
343- return 1
344- }
345-
346- handle_control_command() {
347- RAW_CMD="$1"
348- CMD="${RAW_CMD%% *}"
349- CMD_PAYLOAD=""
350- if [ "$CMD" != "$RAW_CMD" ]; then
351- CMD_PAYLOAD="${RAW_CMD#* }"
352- fi
353-
354- case "$CMD" in
355- start)
356- refresh_katana_state
357- if [ -n "$KATANA_PID" ] && kill -0 "$KATANA_PID" 2>/dev/null; then
358- respond_control "err already-running pid=$KATANA_PID"
359- return 0
360- fi
361-
362- KATANA_ARGS=""
363- if [ -n "$CMD_PAYLOAD" ]; then
364- KATANA_ARGS="$(echo "$CMD_PAYLOAD" | tr ',' ' ')"
365- fi
366-
367- log "Starting katana asynchronously..."
368- # shellcheck disable=SC2086
369- /bin/katana --db-dir="$KATANA_DB_DIR" $KATANA_ARGS &
370- KATANA_PID=$!
371- KATANA_EXIT_CODE="running"
372- respond_control "ok started pid=$KATANA_PID"
373- ;;
374-
375- status)
376- refresh_katana_state
377- if [ -n "$KATANA_PID" ] && kill -0 "$KATANA_PID" 2>/dev/null; then
378- respond_control "running pid=$KATANA_PID"
379- else
380- respond_control "stopped exit=$KATANA_EXIT_CODE"
381- fi
382- ;;
383-
384- "")
385- ;;
386-
387- *)
388- respond_control "err unknown-command"
389- ;;
390- esac
391- }
392-
393306shutdown_handler() {
394307 if [ "$SHUTTING_DOWN" -eq 1 ]; then
395308 return 0
@@ -491,6 +404,15 @@ else
491404 log "WARNING: eth0 interface not found; skipping static network setup"
492405fi
493406
407+ # Parse katana args from cmdline
408+ CMDLINE="$(cat /proc/cmdline 2>/dev/null || true)"
409+ KATANA_ARGS=""
410+ for tok in $CMDLINE; do
411+ case "$tok" in
412+ katana.args=*) KATANA_ARGS="$(echo "${tok#katana.args=}" | tr ',' ' ')" ;;
413+ esac
414+ done
415+
494416# Require persistent storage at /dev/sda
495417if [ ! -b /dev/sda ]; then
496418 fatal_boot "required storage device /dev/sda not found"
504426mkdir -p "$KATANA_DB_DIR"
505427log "Storage mounted at /mnt/data"
506428
507- # Start async control loop for Katana startup/status commands.
508- log "Waiting for control channel ($CONTROL_PORT_NAME)..."
509- CONTROL_PORT=""
510- while [ -z "$CONTROL_PORT" ]; do
511- CONTROL_PORT="$(resolve_control_port || true)"
512- [ -n "$CONTROL_PORT" ] || sleep 1
513- done
514- log "Control channel ready: $CONTROL_PORT"
515-
516- while true; do
517- refresh_katana_state
429+ log "Starting katana..."
430+ # shellcheck disable=SC2086
431+ /bin/katana --db-dir="$KATANA_DB_DIR" $KATANA_ARGS &
432+ KATANA_PID=$!
433+ log "Katana started with PID $KATANA_PID"
518434
519- if ! exec 3<>"$CONTROL_PORT"; then
520- log "WARNING: failed to open control channel, retrying..."
521- sleep 1
522- continue
523- fi
524-
525- while IFS= read -r CONTROL_CMD <&3; do
526- handle_control_command "$CONTROL_CMD"
527- done
435+ if wait "$KATANA_PID"; then
436+ EXIT_CODE=0
437+ else
438+ EXIT_CODE=$?
439+ fi
440+ log "Katana exited with code $EXIT_CODE"
528441
529- exec 3>&- 3<&-
530- sleep 1
442+ # PID 1 must stay alive unless explicitly powered off.
443+ while true; do
444+ sleep 60
531445done
532446INIT_EOF
533447
0 commit comments