RAM drive for compiling - is there such a thing?

后端 未结 18 2078
既然无缘
既然无缘 2020-12-02 08:16

An answer (see below) to one of the questions right here on Stack Overflow gave me an idea for a great little piece of software that could be in

18条回答
  •  隐瞒了意图╮
    2020-12-02 08:34

    Use https://wiki.archlinux.org/index.php/Ramdisk to make the RAM disk.

    Then I wrote these scripts to move directories to and from the RAM disk. Backup is made in a tar file before moving into the RAM disk. The benefit of doing it this way is that the path stays the same, so all your configuration files don't need to change. When you are done, use uramdir to bring back to disk.

    Edit: Added C code that will run any command it is given on an interval in background. I am sending it tar with --update to update the archive if any changes.

    I believe this general-purpose solution beats making a unique solution to something very simple. KISS

    Make sure you change path to rdbackupd

    ramdir

    #!/bin/bash
    
    # May need some error checking for bad input.
    
    # Convert relative path to absolute
    # /bin/pwd gets real path without symbolic link on my system and pwd
    # keeps symbolic link. You may need to change it to suit your needs.
    somedir=`cd $1; /bin/pwd`;
    somedirparent=`dirname $somedir`
    
    # Backup directory
    /bin/tar cf $somedir.tar $somedir
    
    # Copy, tried move like https://wiki.archlinux.org/index.php/Ramdisk
    # suggests, but I got an error.
    mkdir -p /mnt/ramdisk$somedir
    /bin/cp -r  $somedir /mnt/ramdisk$somedirparent
    
    # Remove  directory
    /bin/rm -r $somedir
    
    # Create symbolic link. It needs to be in parent of given folder.
    /bin/ln -s /mnt/ramdisk$somedir $somedirparent
    
    #Run updater
    ~/bin/rdbackupd "/bin/tar -uf $somedir.tar $somedir" &
    

    uramdir

    #!/bin/bash
    
    #Convert relative path to absolute
    #somepath would probably make more sense
    # pwd and not /bin/pwd so we get a symbolic path.
    somedir=`cd $1; pwd`;
    
    # Remove symbolic link
    rm $somedir
    
    # Copy dir back
    /bin/cp -r /mnt/ramdisk$somedir $somedir
    
    # Remove from ramdisk
    /bin/rm -r /mnt/ramdisk$somedir
    
    # Stop
    killall rdbackupd
    

    rdbackupd.cpp

    #include 
    #include 
    #include 
    #include 
    #include 
    
    struct itimerval it;
    char* command;
    
    void update_archive(int sig)
    {
        system(command);
    }
    
    int main(int argc, char**argv)
    {
        it.it_value.tv_sec     = 1;   // Start right now
        it.it_value.tv_usec    = 0;
        it.it_interval.tv_sec  = 60;  // Run every 60 seconds
        it.it_interval.tv_usec = 0;
    
        if (argc < 2)
        {
            printf("rdbackupd: Need command to run\n");
            return 1;
        }
        command = argv[1];
    
        signal(SIGALRM, update_archive);
        setitimer(ITIMER_REAL, &it, NULL); // Start
    
        while(true);
    
        return 0;
    }
    

提交回复
热议问题