@@ -18,6 +18,7 @@ use dstack_types::{
1818 KeyProvider , KeyProviderInfo ,
1919} ;
2020use fs_err as fs;
21+ use fs_err:: os:: unix:: fs:: OpenOptionsExt as _;
2122use luks2:: {
2223 LuksAf , LuksConfig , LuksDigest , LuksHeader , LuksJson , LuksKdf , LuksKeyslot , LuksSegment ,
2324 LuksSegmentSize ,
@@ -621,6 +622,43 @@ impl<'a> Stage0<'a> {
621622 }
622623 }
623624
625+ async fn setup_swap ( & self , swap_size : u64 ) -> Result < ( ) > {
626+ let swap_file = self . args . mount_point . join ( "swapfile" ) ;
627+ let swap_path = swap_file
628+ . to_str ( )
629+ . ok_or_else ( || anyhow ! ( "Invalid swap file path" ) ) ?;
630+
631+ if swap_size == 0 {
632+ if swap_file. exists ( ) {
633+ fs:: remove_file ( & swap_file) . context ( "Failed to remove swap file" ) ?;
634+ }
635+ return Ok ( ( ) ) ;
636+ }
637+
638+ info ! ( "Setting up swap file at {swap_path} (size {swap_size} bytes)" ) ;
639+ {
640+ let file = fs:: OpenOptions :: new ( )
641+ . create ( true )
642+ . write ( true )
643+ . mode ( 0o600 )
644+ . custom_flags ( libc:: O_NOFOLLOW )
645+ . open ( & swap_file)
646+ . context ( "Failed to open swap file" ) ?;
647+ file. set_len ( swap_size)
648+ . context ( "Failed to set swap file size" ) ?;
649+ file. sync_all ( ) . context ( "Failed to sync swap file" ) ?;
650+ }
651+
652+ let _ = cmd ! {
653+ chmod 600 $swap_path;
654+ mkswap -f $swap_path;
655+ swapon $swap_path;
656+ }
657+ . context ( "Failed to enable swap" ) ?;
658+
659+ Ok ( ( ) )
660+ }
661+
624662 async fn mount_data_disk ( & self , initialized : bool , disk_crypt_key : & str ) -> Result < ( ) > {
625663 let name = "dstack_data_disk" ;
626664 let fs_dev = "/dev/mapper/" . to_string ( ) + name;
@@ -805,6 +843,9 @@ impl<'a> Stage0<'a> {
805843 self . vmm . notify_q ( "boot.progress" , "unsealing env" ) . await ;
806844 self . mount_data_disk ( is_initialized, & hex:: encode ( & app_keys. disk_crypt_key ) )
807845 . await ?;
846+
847+ self . setup_swap ( self . shared . app_compose . swap_size ) . await ?;
848+
808849 self . vmm
809850 . notify_q (
810851 "instance.info" ,
0 commit comments