Compare commits

...

2 commits

Author SHA1 Message Date
2c606dbeb4 Merge pull request 'specify sizes of partitions in MB, not in sectors' (#27) from specify-in-mb into main
Reviewed-on: #27
Reviewed-by: Reynir Björnsson <reynir@reynir.dk>
2024-11-21 11:27:40 +00:00
c5e091a294 specify sizes of partitions in MB, not in sectors 2024-11-21 12:11:48 +01:00
2 changed files with 30 additions and 20 deletions

View file

@ -101,7 +101,7 @@ module Make(BLOCK : Mirage_block.S) = struct
and md5s = get_part md5s and sha512s = get_part sha512s in
{ tar ; swap; git_dump ; md5s ; sha512s }
let format block ~sectors_cache ~sectors_git ~sectors_swap =
let format block ~cache_size ~git_size ~swap_size =
let* { size_sectors; sector_size; _ } = BLOCK.get_info block in
let ( let*? ) = Lwt_result.bind in
(* ocaml-gpt uses a fixed size partition entries table. Create an empty GPT
@ -110,6 +110,16 @@ module Make(BLOCK : Mirage_block.S) = struct
Gpt.make ~sector_size ~disk_sectors:size_sectors []
|> Result.get_ok
in
let mb_in_sectors mb =
(* 1 megabyte is 2^20 bytes (1024 * 1024) *)
let mb_in_bytes = Int64.(shift_left (of_int mb) 20) in
let ss = Int64.of_int sector_size in
Int64.(div (add mb_in_bytes (sub ss 1L)) ss)
in
let sectors_cache = mb_in_sectors cache_size
and sectors_git = mb_in_sectors git_size
and sectors_swap = mb_in_sectors swap_size
in
let*? () =
if size_sectors <
(* protective MBR + GPT header + GPT table *)
@ -175,9 +185,9 @@ module Make(BLOCK : Mirage_block.S) = struct
Gpt.make ~sector_size ~disk_sectors:size_sectors partitions
|> Result.get_ok
in
let buf =
Cstruct.create (sector_size * (Int64.to_int gpt.first_usable_lba + 2 * Tar.Header.length))
in
let buf =
Cstruct.create (sector_size * (Int64.to_int gpt.first_usable_lba + 2 * Tar.Header.length))
in
Gptar.marshal_header ~sector_size buf gpt;
Gpt.marshal_partition_table ~sector_size
(Cstruct.shift buf (sector_size * Int64.to_int gpt.partition_entry_lba))

View file

@ -59,20 +59,20 @@ module K = struct
let doc = Arg.info ~doc:"HTTP listen port." ["port"] in
Mirage_runtime.register_arg Arg.(value & opt int 80 doc)
let sectors_cache =
let doc = "Number of sectors reserved for each checksum cache (md5, sha512). Only used with --initialize-disk." in
let doc = Arg.info ~doc ["sectors-cache"] in
Mirage_runtime.register_arg Arg.(value & opt int64 Int64.(mul 4L 2048L) doc)
let cache_size =
let doc = "Number of MB reserved for each checksum cache (md5, sha512). Only used with --initialize-disk." in
let doc = Arg.info ~doc ["cache-size"] in
Mirage_runtime.register_arg Arg.(value & opt int 4 doc)
let sectors_git =
let doc = "Number of sectors reserved for git dump. Only used with --initialize-disk" in
let doc = Arg.info ~doc ["sectors-git"] in
Mirage_runtime.register_arg Arg.(value & opt int64 Int64.(mul 40L (mul 2L 1024L)) doc)
let git_size =
let doc = "Number of MB reserved for git dump. Only used with --initialize-disk" in
let doc = Arg.info ~doc ["git-size"] in
Mirage_runtime.register_arg Arg.(value & opt int 40 doc)
let sectors_swap =
let doc = "Number of sectors reserved for swap. Only used with --initialize-disk" in
let doc = Arg.info ~doc ["sectors-swap"] in
Mirage_runtime.register_arg Arg.(value & opt int64 Int64.(mul 1024L 2048L) doc)
let swap_size =
let doc = "Number of MB reserved for swap. Only used with --initialize-disk" in
let doc = Arg.info ~doc ["swap-size"] in
Mirage_runtime.register_arg Arg.(value & opt int 1024 doc)
let initialize_disk =
let doc = "Initialize the disk with a partition table. THIS IS DESTRUCTIVE!" in
@ -1123,11 +1123,11 @@ stamp: %S
let start block _time _pclock stack git_ctx http_ctx =
let initialize_disk = K.initialize_disk ()
and sectors_cache = K.sectors_cache ()
and sectors_git = K.sectors_git ()
and sectors_swap = K.sectors_swap () in
and cache_size = K.cache_size ()
and git_size = K.git_size ()
and swap_size = K.swap_size () in
if initialize_disk then
Part.format block ~sectors_cache ~sectors_git ~sectors_swap >>= function
Part.format block ~cache_size ~git_size ~swap_size >>= function
| Ok () ->
Logs.app (fun m -> m "Successfully initialized the disk! You may restart now without --initialize-disk.");
Lwt.return_unit