Your code has serial accesses, not simultaneous ones. (Data races are always UB.)
Not if you do it right. But under the stacked borrows model, your code is UB because when you made &i to create v2, you invalidated v. (Miri will tell you this[1] by the way.) Instead you should create v2 from v. In general if you're starting from a reference, you should create one raw pointer from a reference with with sufficient permission for everything, and then create all other raw pointers from that one (transitively).
No.
It doesn't compile with that change. But if the *v1 is sound, the *(v1 as *const u8) is sound. (If the type of v1 was different, that might not be true.)
Nit: raw reference syntax was recently stabilized, and references are best avoided entirely when working with pointers. So the best way to write this example would be
Since Rust has introduced & raw to acquire raw pointer after 1.82 version, I wonder whether the following example makes the previously acquired pointer invalid?